На столе ПЛК100+расходомер взлет + ОВЕН мк110.8дн.4р
Тестовая программа:
В таком виде программа работает, опрашивается Взлет, ошибок 0. Убираю комментирование в 3м кейсе (подключаю второй модуль ОВЕН) и у Взлета каждая вторая ошибка 255. Что я делаю не так? Через конфигуратор оба работают нормально с редкими ошибками.Код:(*Устанавливаем настройки COM-порта*) IF port_opened=0 THEN Settings.Port:=com_num; (*номер COM-порта*) Settings.dwBaudRate:= 115200; (*скорость*) Settings.byParity:=0; Settings.dwTimeout:=0; Settings.byStopBits:=0; Settings.dwBufferSize:=0; Settings.dwScan:=0; END_IF COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK ); (*Если COM-порт открыт, то переходим к приему и передачи данных *) IF COM_SERVICE1.ready THEN port_opened:=2; END_IF IF port_opened=2 THEN (*Удачно проинициализировали*) CASE master1 OF 0: get1_modbus( Enable:=Enable:= NOT get1_modbus.Complete, (* разрешение работы блока *) Mode:=MB_RTU, (*режим передачи*) DevAddr:=8 , (*адрес*) FirstAddr:=2 , (*номер регистра*) Quantity:=1, (*количество регистров*) ComHandle:=Settings.Port , (*номер COM-порта*) TimeOut:=TimeOut , (*Таймаут T#50ms*) Buffer:=Buffer_out, (* буфер данных *) Complete=>cmpl , (* скопировать признак завершения операции *) Exception=>err , (* скопировать регистр ошибок *) ByteCnt=>DataSize ); (*кол-во считанных байтов *) (*если установлен признак завершения операции, то *) IF cmpl THEN IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*) x:=BYTE_TO_WORD(BUFFER_out[1]) OR SHL(BYTE_TO_WORD(BUFFER_out[0]),8); ELSE errcount:=errcount +1; END_IF master1 := 3; END_IF 2: get1_modbus( Enable:= NOT get1_modbus.Complete , (* разрешение работы блока *) Mode:=MB_RTU, (*режим передачи*) DevAddr:=48 , (*адрес*) FirstAddr:=50 , (*номер регистра*) Quantity:=1, (*количество регистров*) ComHandle:=Settings.Port , (*номер COM-порта*) TimeOut:=TimeOut , (*Таймаут T#50ms*) Buffer:=Buffer_out, (* буфер данных *) Complete=>cmpl , (* скопировать признак завершения операции *) Exception=>err , (* скопировать регистр ошибок *) ByteCnt=>DataSize ); (*кол-во считанных байтов *) (*если установлен признак завершения операции, то *) IF cmpl THEN IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*) x:=BYTE_TO_WORD(BUFFER_out[1]) OR SHL(BYTE_TO_WORD(BUFFER_out[0]),8); ELSE errcount:=errcount +1; END_IF master1 := 3; END_IF 3: TimeOut2(IN :=TRUE,PT:=T#50ms); TimeOut2; IF TimeOut2.Q THEN g:=g+1; master1 := 0; (*IF g/2 = TRUNC(g/2) THEN master1 := 2; END_IF*) TimeOut2.IN := FALSE; TimeOut; END_IF END_CASE END_IF


Ответить с цитированием
