УкраїнськаEnglishmRussian
Вхід/Новий
У темі немає нових постів

[BugWrong] Не принемает команды "входной" пользовательский протокол


Автор Повідомлення
Повідомлення створено: 23. 12. 2021 [04:15]
masterzx
Евгений Юрченко
Автор теми
Зареєстрован(а) с: 20.03.2019
Повідомлення: 4
Здравствуйте.
OpenSCADA 1+r2784
raspberrypi pi3 model b+
Linux-5.10.63-v7

Через некоторое время перестаёт работать исполнение команд из входной части скрипта пользовательского протокола.
Выходная работает.
Входной транспорт принимает сообщения. Перезапуском скрипта или(и) транспорта не решается эта проблема.
Помогает, только полный перезапуск программы.
Входная часть:
JAVASCRIPT
ring=SYS.sub_DAQ["mod_LogicLev"]["cntr_nasos"]["prm_nasos"]["a_ring"].get();
 
tel2="+71234567890";
tel3="+71234567890";
tel4="+71234567890";
 
 
if((request.indexOf("RING
 
+CLIP: \"")>0)&&ring){
	if(request.indexOf(tel1+"\"")>0){
		SYS.sub_DAQ["mod_LogicLev"]["cntr_test"]["prm_test"]["a_tel"].set(tel1);
		ring=false;
		answer = "ATA
";
		request = "";
	}else if(request.indexOf(tel2+"\"")>0){
		SYS.sub_DAQ["mod_LogicLev"]["cntr_test"]["prm_test"]["a_tel"].set(tel2);
		ring=false;
		answer = "ATA
";
		request = "";
	}else if(request.indexOf(tel3+"\"")>0){
		SYS.sub_DAQ["mod_LogicLev"]["cntr_test"]["prm_test"]["a_tel"].set(tel3);
		ring=false;
		answer = "ATA
";
		request = "";
	}else if(request.indexOf(tel4+"\"")>0){
		SYS.sub_DAQ["mod_LogicLev"]["cntr_test"]["prm_test"]["a_tel"].set(tel4);
		ring=false;
		answer = "ATA
";
		request = "";
	}else{
		answer="ATH
";
		ring=true;
		request = "";
	}
}else if((request.indexOf("RING")>0)&&ring){
SYS.sub_DAQ["mod_LogicLev"]["cntr_test"]["prm_test"]["a_init"].set(true);
request = "";
}
 
 
 
if(!ring){
	if(request.indexOf("NO CARRIER") > 0){
		equest = "";
		ring=true;
	}else if(request.indexOf("#DTMFEV: #") > 0){
		answer="ATH
";
		ring=true;
		request = "";
	}else if(request.indexOf("#DTMFEV: *") > 0){
		request = "";
	}else if(request.indexOf("#DTMFEV: 0") > 0){
		SYS.sub_DAQ["mod_LogicLev"]["cntr_nasos"]["prm_nasos"]["a_start"].set(true);
		request = "";
	}else if(request.indexOf("#DTMFEV: 1") > 0){
		request = "";
		SYS.sub_DAQ["mod_LogicLev"]["cntr_nasos"]["prm_nasos"]["a_stop"].set(true);
	}else if(request.indexOf("#DTMFEV: 2") > 0){
		request = "";
	}else if(request.indexOf("#DTMFEV: 3") > 0){
		request = "";
	}else if(request.indexOf("#DTMFEV: 4") > 0){
		request = "";
	}else if(request.indexOf("#DTMFEV: 5") > 0){
		request = "";
	}else if(request.indexOf("#DTMFEV: 6") > 0){
		request = "";
	}else if(request.indexOf("#DTMFEV: 7") > 0){
		request = "";
	}else if(request.indexOf("#DTMFEV: 8") > 0){
		request = "";
	}else if(request.indexOf("#DTMFEV: 9") > 0){
		request = "";
	}
request = "";
}
 
 
if(request.indexOf("+CMT:")>0){
	if(request.indexOf(tel1)>0){
		SYS.sub_DAQ["mod_LogicLev"]["cntr_test"]["prm_test"]["a_tel"].set(tel1);
	}else if(request.indexOf(tel2)>0){
		SYS.sub_DAQ["mod_LogicLev"]["cntr_test"]["prm_test"]["a_tel"].set(tel2);
	}else if(request.indexOf(tel3)>0){
		SYS.sub_DAQ["mod_LogicLev"]["cntr_test"]["prm_test"]["a_tel"].set(tel3);
	}else if(request.indexOf(tel4)>0){
	SYS.sub_DAQ["mod_LogicLev"]["cntr_test"]["prm_test"]["a_tel"].set(tel4);
	}
	if(request.indexOf("pusk")>0){
		SYS.sub_DAQ["mod_LogicLev"]["cntr_nasos"]["prm_nasos"]["a_sms"].set(true);
		SYS.sub_DAQ["mod_LogicLev"]["cntr_nasos"]["prm_nasos"]["a_start"].set(true);
	}else if(request.indexOf("stop")>0){
		SYS.sub_DAQ["mod_LogicLev"]["cntr_nasos"]["prm_nasos"]["a_sms"].set(true);
		SYS.sub_DAQ["mod_LogicLev"]["cntr_nasos"]["prm_nasos"]["a_stop"].set(true);
	}else if(request.indexOf("status")>0){
 
	}else if(request.indexOf("reset")>0){
 
	}
	request = "";
}
 
SYS.sub_DAQ["mod_LogicLev"]["cntr_nasos"]["prm_nasos"]["a_ring"].set(ring);
return 0;

Выходная часть:
JAVASCRIPT
//Transport's timings check
if(tr.timings() != "5000:100")	tr.timings("5000:100");
io.setAttr("err", "");
if(io.name() == "init") {
//Disable ECHO
	rez = tr.messIO("AT
");
	while(rez.length && (trez=tr.messIO("")).length) rez += trez;
	if(rez.indexOf("OK
") < 0)	{ io.setAttr("err", "101:"+tr("Error disabling at: %1").replace("%1",rez)); return; }
 
rez = tr.messIO("AT#DTMF=1
");
	while(rez.length && (trez=tr.messIO("")).length) rez += trez;
	if(rez.indexOf("OK
") < 0)	{ io.setAttr("err", "102:"+tr("Error disabling DTMF: %1").replace("%1",rez)); return; }
 
rez = tr.messIO("AT+CLIP=1
");
	while(rez.length && (trez=tr.messIO("")).length) rez += trez;
	if(rez.indexOf("OK
") < 0)	{ io.setAttr("err", "103:"+tr("Error disabling clip: %1").replace("%1",rez)); return; }
 
rez = tr.messIO("AT+CMGF=1
");
	while(rez.length && (trez=tr.messIO("")).length) rez += trez;
	if(rez.indexOf("OK
") < 0)	{ io.setAttr("err", "104:"+tr("Error disabling CMGF: %1").replace("%1",rez)); return; }
 
rez = tr.messIO("AT+CNMI=3,2,2,1,0
");
	while(rez.length && (trez=tr.messIO("")).length) rez += trez;
	if(rez.indexOf("OK
") < 0)	{ io.setAttr("err", "105:"+tr("Error disabling CNMI: %1").replace("%1",rez)); return; }
 
}
 
//Request form:
//<{cmd} pin="1111" tel="+380XXXXXXXXX" text="{0|1}" err="1:Error">{SMSText}</cmd>
//  cmd - command, for now only "send" allowed;
//  pin - PIN code to the SIM card access;
//  tel - telephone number for receiver (remote cell phone or GSM modem);
//  text{0,1} - SMS in the text mode, only ASCII
//  SMSText - the message text;
//  err - sets for the request result.
 
 
if(io.name() == "send") {
	tel = io.attr("tel");
	if(!tel.length || tel[0] != "+") { io.setAttr("err", "100:"+tr("Telephone number error.")); return; }
 
		//Switch to Text SMS mode
		rez = tr.messIO("AT+CMGF=1\r");
		while(rez.length && (trez=tr.messIO("")).length) rez += trez;
		if(rez.indexOf("OK\r") < 0)	{ io.setAttr("err", "103:"+tr("Error setting the SMS Text mode: %1").replace("%1",rez)); return; }
 
		//Send the Telephone number
		rez = tr.messIO("AT+CMGS=\""+tel+"\"\r");
		while(rez.length && (trez=tr.messIO("")).length) rez += trez;
		if(rez.indexOf(">") < 0)	{ io.setAttr("err", "104:"+tr("Error sending SMS: %1").replace("%1",rez)); return; }
		rez = tr.messIO(io.text()+"\x1A");
		while(rez.length && (trez=tr.messIO("")).length) rez += trez;
		//for(var iTr = 0; iTr < 100 && rez.indexOf("OK\r") < 0; iTr++) rez += tr.messIO("");	//Up to 10 seconds wait for reply
		if(rez.indexOf("OK\r") < 0)	{ io.setAttr("err", "104:"+tr("Error sending SMS PDU: %1").replace("%1",rez)); return; }
 
	io.setAttr("err", "0");
}

Скрипт логического уровня переключающий модем между входным и выходным траспортами
JAVASCRIPT
function out_mod(){
SYS.sub_DAQ["mod_LogicLev"]["cntr_dog_modem"]["prm_dog"]["a_work"].set(false);
req = SYS.XMLNode("set").setAttr("path","/Transport/Serial/in_modem/%2fprm%2fst%2fst").setText(false);
SYS.cntrReq(req);
req = SYS.XMLNode("set").setAttr("path","/Transport/Serial/out_modem/%2fprm%2fst%2fst").setText(true);
SYS.cntrReq(req);
}
 
function in_mod(){
req = SYS.XMLNode("set").setAttr("path","/Transport/Serial/in_modem/%2fprm%2fst%2fst").setText(true);
SYS.cntrReq(req);
req = SYS.XMLNode("set").setAttr("path","/Transport/Serial/out_modem/%2fprm%2fst%2fst").setText(false);
SYS.cntrReq(req);
SYS.sub_DAQ["mod_LogicLev"]["cntr_dog_modem"]["prm_dog"]["a_work"].set(true);
}
 
if(init){
out_mod();
req = SYS.XMLNode("init").setAttr("ProtIt","sms_call");
SYS.Transport.Serial.out_modem.messIO(req,"UserProtocol");
if(!req.attr("err").length) f_err=req.text();
in_mod();
 
init=false;
}
if(pusk){
out_mod();
req = SYS.XMLNode("send").setAttr("ProtIt","sms_call").setAttr("tel",tel).setText("Pump start");
SYS.Transport.Serial.out_modem.messIO(req,"UserProtocol");
if(!req.attr("err").length) f_err=req.text();
in_mod();
pusk=false;
}
 
if(stop){
out_mod();
req = SYS.XMLNode("send").setAttr("ProtIt","sms_call").setAttr("tel",tel).setText("Pump stop");
SYS.Transport.Serial.out_modem.messIO(req,"UserProtocol");
if(!req.attr("err").length) f_err=req.text();
in_mod();
stop=false;
}
 
if(avaria){
out_mod();
req = SYS.XMLNode("send").setAttr("ProtIt","sms_call").setAttr("tel",tel).setText("Problema s elektrosetyu");
SYS.Transport.Serial.out_modem.messIO(req,"UserProtocol");
if(!req.attr("err").length) f_err=req.text();
in_mod();
avaria=false;
}

Повідомлення створено: 23. 12. 2021 [08:24]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
У меня всё, всегда и везде работает, поэтому НЕ ОШИБКА!

И со спецификой ваших проблем и кода тут никто разбираться не будет, правила читаем!

Learn, learn and learn better than work, work and work.
Повідомлення створено: 26. 12. 2021 [19:38]
masterzx
Евгений Юрченко
Автор теми
Зареєстрован(а) с: 20.03.2019
Повідомлення: 4
"roman" wrote:

У меня всё, всегда и везде работает, поэтому НЕ ОШИБКА!

И со спецификой ваших проблем и кода тут никто разбираться не будет, правила читаем!

То что у вас всё работает это хорошо.
Но когда спрашивают, почему виснет намертво обработчик входного транспорта скрипта пользовательского протокола и вы не пытаетесь в этом разобраться
или оказать содействие в этом, как бы это не красиво. Скорее всего код не оптимизирован под расбери пи нормально. То что зависания происходят из-за занятости sd-карты или от сильной загрузки системы ввода вывода.
Я этот глюк словил когда производил полное копирование сд карты. Но глюк возникает периодически. Если не хотите в этом разбирается, тогда уж напишите, что расбери пи не поддерживаю и ставьте мою программу на свой страх и риск.



10590