Добрый вечер )
Мысль переписать по modbus.lib возникла после безуспешной борьбы с панелью СМИ1 через конфигуратор. При передаче по протоколу Modbus-RTU (СМИ1 - slave) на панели иногда гас экран и шла ошибка 81. Через несколько секунд работа панели возобновлялась. Всё происходит случайным образом без какой-либо закономерности. Изменение параметров не помогало. Сейчас переписал всё на modbus.lib. Происходит все тоже самое с небольшим нюансом - в панели при таймауте гаснет экран и включается при остановке программы в ПЛК-100. То есть после нормальной работы в течение 5-30 минут гаснет экран и в цикле идут следующие кейсы с ошибкой 255 до тех пор пока не остановлю программу.
Код:
FUNCTION_BLOCK Modbus
VAR_IN_OUT
VesViklNew1,VesViklNew2,Tara:BOOL;
BigError:BOOL;
END_VAR
VAR_INPUT
Ves_Post2,Ves_Post1:REAL;
END_VAR
VAR_OUTPUT
err:INT;
VesVikl_Post1, VesVikl_Post2,VesTenzo: REAL;
END_VAR
VAR
get1_modbus: MB_RD_HOLD_REGS; (*функция 03 - чтение параметра типа INT*)
send2_modbus: MB_WR_REGS; (*функция 16 - запись параметров*)
com_ready1:BOOL;
Settings1:COMSETTINGS; (* настройки последовательного порта *)
com_num1: PORTS; (*0 - RS-485, 1 - RS-232*)
Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
Buffer_ok: ARRAY[0..255] OF BYTE;
Buffer_error: ARRAY[0..255] OF BYTE;
TimeOut: TIME:=T#50ms; (*таймаут*)
cmpl:BOOL;
rejim, rejimerror :BYTE;
DataSize: WORD;
TimeOut2 : TON;
Send: R_TRIG;
ptr:POINTER TO BYTE;
COM_SERVICE1: COM_SERVICE;
x: REAL;
errorcount,errorcount0,errorcount1,errorcount2,errorcount3,errorcount4,errorcount5,errorcount6: BYTE;
VesTaraNew, VesTaraOld :REAL;
END_VAR
......
1: (* Отправка в СМИ1 значения Ves_Post1*)
Send.CLK := TRUE;
Send;
IF Send.Q = TRUE THEN
ptr:=ADR(Ves_Post1);
buffer[1]:=ptr^;
ptr:=ptr+1;
buffer[0]:=ptr^;
ptr:=ptr+1;
buffer[3]:=ptr^;
ptr:=ptr+1;
buffer[2]:=ptr^;
ptr:=ptr+1;
END_IF
send2_modbus(
Enable:= TRUE, (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=32 , (*адрес*)
FirstAddr:= 0, (*номер регистра*)
Quantity:= 2, (*количество записываемых регистров*)
ComHandle:=Settings1.Port ,(*номер сом-порта*)
TimeOut:=TimeOut , (*таймаут T#50ms*)
Buffer:=buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
RegCnt=> DataSize); (*кол-во записанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err = 0 THEN
rejim:=100;(*переходим к выполнению следующего блока*)
ELSE
rejimerror := rejim;
rejim := 101;
END_IF
END_IF
.......
101:(*При ошибке:*)
TimeOut2(IN :=TRUE,PT:=T#50ms);
TimeOut2;
IF TimeOut2.Q THEN
rejim := rejimerror;
Send.CLK :=FALSE;
Send;
TimeOut2.IN :=FALSE;
TimeOut2;
END_IF
У кого-нибудь мысли есть, что со СМИ1 происходит в этот момент? Может кто то сталкивался с таким?
P.S. Все остальные модули ОВЕН работают без вопросов. Проблема только со СМИ1. Панели 2шт. - обе ведут себя одинаково.