Будьте внимательны! Если Вы будете не правильно пользоваться библиотекой, то такое возможно.
Рекомендую прочесть вот этот пост.
Перед каждым вызовом я пишу значение в буфер:
или я неправильно делаю???Код: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: ......
Последний раз редактировалось a_gricaj; 20.09.2016 в 10:28.
правильно???Код: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 секунды.
Если ошибка уйдет тогда ее буду сбрасывать со скады...
Или тут я тоже намудрил???