Вместо Enable:=FALSE; необходимо вызывать соответствующий ФБ в стиле
MV110_8acAdr7(Enable:= FALSE, Buffer:=Buffer);
Вид для печати
Вместо Enable:=FALSE; необходимо вызывать соответствующий ФБ в стиле
MV110_8acAdr7(Enable:= FALSE, Buffer:=Buffer);
Ситуация не изменилась, модуль 2АС зависает...
Код:IF ComServiceCOM2.Ready THEN
CASE Step OF
0: IF MV110_8ABoks1 THEN Step:=1; ELSE Step:=2;END_IF
1: Enable:=TRUE;
MV110_8aAdr5(
Enable:= Enable,
Mode:= MB_RTU,
DevAddr:= 5,
FirstAddr:= 0,
Quantity:= 47,
ComHandle:= ComServiceCOM2.Handle,
TimeOut:= TimeOut,
Buffer:= Buffer,
Complete=> Complete,
Exception=> ErrorMV110_8aAdr5,
ByteCnt=> DataSize);
IF Complete (*если установлен признак завершения операции, то *)
THEN
IF ErrorMV110_8aAdr5=0 THEN BufferDataM1AI:=Buffer;END_IF
IF ErrorMV110_8aAdr5<>0 AND AlarmMV110_8aAdr5=FALSE THEN AmountMV110_8aAdr5:=AmountMV110_8aAdr5+1; ELSE AmountMV110_8aAdr5:=0;END_IF
IF AmountMV110_8aAdr5>SetAmount THEN AlarmMV110_8aAdr5:=TRUE;END_IF
MV110_8aAdr5(Enable:= FALSE, Buffer:=Buffer);
Step:=2; (*переходим к выполнению следующего ФБ*)
END_IF
2: IF MV110_8ABoks2 THEN Step:=3; ELSE Step:=4;END_IF
3: Enable:=TRUE;
MV110_8aAdr6(
Enable:= Enable,
Mode:= MB_RTU,
DevAddr:= 6,
FirstAddr:= 0,
Quantity:= 47,
ComHandle:= ComServiceCOM2.Handle,
TimeOut:= TimeOut,
Buffer:= Buffer,
Complete=> Complete,
Exception=> ErrorMV110_8aAdr6,
ByteCnt=> DataSize);
IF Complete (*если установлен признак завершения операции, то *)
THEN
IF ErrorMV110_8aAdr6=0 THEN BufferDataM2AI:=Buffer;END_IF
IF ErrorMV110_8aAdr6<>0 AND AlarmMV110_8aAdr6=FALSE THEN AmountMV110_8aAdr6:=AmountMV110_8aAdr6+1; ELSE AmountMV110_8aAdr6:=0;END_IF
IF AmountMV110_8aAdr6>SetAmount THEN AlarmMV110_8aAdr6:=TRUE;END_IF
MV110_8aAdr6(Enable:= FALSE, Buffer:=Buffer);
Step:=4; (*переходим к выполнению следующего ФБ*)
END_IF
4: IF MV110_2AC THEN Step:=5; ELSE Step:=6;END_IF
5: Enable:=TRUE;
MV110_8acAdr7(
Enable:= Enable,
Mode:= MB_RTU,
DevAddr:= 100,
FirstAddr:= 264,
Quantity:= 6,
ComHandle:= ComServiceCOM2.Handle,
TimeOut:= TimeOut,
Buffer:= Buffer,
Complete=> Complete,
Exception=> ErrorMV110_2acAdr7,
ByteCnt=> DataSize);
IF Complete (*если установлен признак завершения операции, то *)
THEN
IF ErrorMV110_2acAdr7=0 THEN BufferDataM3AI:=Buffer;END_IF
IF ErrorMV110_2acAdr7<>0 AND AlarmMV110_2acAdr7=FALSE THEN AmountMV110_8acAdr7:=AmountMV110_8acAdr7+1; ELSE AmountMV110_8acAdr7:=0;END_IF
IF AmountMV110_8acAdr7>SetAmount THEN AlarmMV110_2acAdr7:=TRUE;END_IF
MV110_8acAdr7(Enable:= FALSE, Buffer:=Buffer);
Step:=6; (*переходим к выполнению следующего ФБ*)
END_IF
6: Step:=0;
Enable:=FALSE;
END_CASE
END_IF
я бы за кейсом что то подобное написал,а внутри MV110_8aAdr5(Enable:=MV110_8aAdr5.Enable...Цитата:
MV110_8aAdr5(Enable:=Step=0);MV110_8aAdr6(Enable:= Step=2);MV110_8acAdr7(Enable:=Step=4);
Не пойму, что это будет...
А тут еще и это:
Вложение 28383
Да и два модуля 8А - опрашиваются одновременно, все же нормально...
Такое впечатление, что модуль 2АС читает данные которые ему не предназначены.... и зависает...
на всякий случай раздел описания:
Код:FUNCTION_BLOCK Com2
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
ComServiceCOM2: COM_SERVICE;
SettingsCOM2: ComSerice.SysCom.COM_SETTINGS;
SettingsEXCOM2: ComSerice.SysCom.COM_SETTINGSex; // Cтруктура расширенных настроек порта COM3
Complete,Enable: BOOL;
TimeOut: TIME:=T#1000MS; (*таймаут*)
DataSize: WORD;
SetAmount:INT:=2;
Step: INT; // Переменные начала цикла опроса
MV110_8aAdr5,MV110_8aAdr6,MV110_8acAdr7,MV110_16DnAdr9: MB_RD_HOLD_REGS; // ФБ опроса модуля МВ110-16Д
MU110_16R: MB_WR_REGS; // ФБ опроса модуля МУ110-16Р
Buffer: ARRAY [0..255] OF BYTE;
AmountMV110_8aAdr5,AmountMV110_8aAdr6,AmountMV110_8acAdr7,AmountMV110_16DnAdr9:INT;
END_VAR
главное ни когда наступит Complete а когда сбрасываете переменную запуска ФБ Enable. Я обычно такие вещи делаю за пределами диспетчера, либо если есть какое то условие в котором Вы выполняете какой то алгоритм, тогда надо предусмотреть и выполнение некоего алгоритма и после ELSE, чтоб работали различные варианты. А то если комплит не наступает, то как раз и получается ситуация зависания на опросе какого то модуля
сделайте паузу между опросами
начните с 4 мс и добавляйте по одной пока связь не появится. Можно еще вместо паузы записать что нибудь не существенное, потом вернутся к чтению, тоже помогает