Вы хотите сказать, что у меня может включиться дискретный выход который я не включаю????
Вид для печати
Будьте внимательны! Если Вы будете не правильно пользоваться библиотекой, то такое возможно.
Рекомендую прочесть вот этот пост.
Перед каждым вызовом я пишу значение в буфер:
или я неправильно делаю???Код:29:IF OldDOByteAdr67=DOByteAdr67 THEN master1:=30;
ELSE
Buffer[0]:=0;
Buffer[1]:=DOByteAdr67;
ModbusAdrDO67(
Enable:= enabl,
Mode:= MB_RTU,
DevAddr:= 67,
FirstAddr:= 50,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= TimeOut,
Buffer:= Buffer,
Complete=> cmpl,
Exception=> ErrorDO67,
RegCnt=> DataSize);
IF cmpl
THEN
OldDOByteAdr67:=DOByteAdr67;
master1:=30;
END_IF
END_IF
30: ......
правильно???Код:28: Buffer[0]:=0;
Buffer[1]:=DOByteAdr67;
master1:=29;
29:IF OldDOByteAdr67=DOByteAdr67 THEN master1:=30;
ELSE
ModbusAdrDO67(
Enable:= enabl,
Mode:= MB_RTU,
DevAddr:= 67,
FirstAddr:= 50,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= TimeOut,
Buffer:= Buffer,
Complete=> cmpl,
Exception=> ErrorDO67,
RegCnt=> DataSize);
IF cmpl
THEN
OldDOByteAdr67:=DOByteAdr67;
master1:=30;
END_IF
END_IF
30: ......
С точки зрения того, что теперь буфер не изменяется в процессе вызова ФБ modbus правильно.
Но обращаю Ваше внимание, что есть потенциальная ошибка.
Если DOByteAdr67 <> OldDOByteAdr67 мы вызвали блок. Блок послал запрос в линию. Теперь предположим, что пока блок ждет ответ у Вас DOByteAdr67 стало равно OldDOByteAdr67. То Ваш код перейдет на шаг 30 не дождавшись ответа. Что явно не хорошо.
Значит наверное так?
Код:
28: IF OldDOByteAdr67=DOByteAdr67
THEN master1:=31;
ELSE
Buffer[0]:=0;
Buffer[1]:=DOByteAdr67;
master1:=29;
END_IF
29: ModbusAdrDO67(
Enable:= enabl,
Mode:= MB_RTU,
DevAddr:= 67,
FirstAddr:= 50,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= TimeOut,
Buffer:= Buffer,
Complete=> cmpl,
Exception=> ErrorDO67,
RegCnt=> DataSize);
IF cmpl
THEN
OldDOByteAdr67:=DOByteAdr67;
master1:=31;
END_IF
31: ......
Уже лучше.
Но что Ваш код будет делать если модуль не ответил или ответил ошибкой, т.е. если ErrorDO67 <> 0?
Если хотя бы один модуль будет иметь Exception <> 0 тогда сформируется общая ошибка по сети (с задержкой 1 - 2 сек) - и отключение всех исполнительных механизмов на всех модулях, а на самом модуле сетевой там аут 2 секунды.
Если ошибка уйдет тогда ее буду сбрасывать со скады...
Или тут я тоже намудрил???