Подскажите, что делаю не так? Данные читает, но как то нестабильно, большую часть времени чтение завершается ошибкой.
Кусок кода:
(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=9600; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=1;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
(*Открываем COM-порт*)
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 (*Удачно проинициализировали*)
IF cmpl THEN
enabl :=TRUE;
END_IF
tErr(IN:=m, PT := t#100ms);
IF tErr.Q THEN
m := FALSE;
enabl := TRUE;
END_IF
readInputs(
Enable:= enabl,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 51,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= T#100ms,
Buffer:= readBuffer, (*таймаут T#50ms*)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err);
IF enabl AND NOT cmpl THEN
enabl := FALSE;
END_IF
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные типа INT из буфера*)
x:=BYTE_TO_WORD(readBuffer[1]) OR SHL(BYTE_TO_WORD(readBuffer[0]),8);
readQuantity := readQuantity+1;
END_IF
END_IF
IF err <> 0 THEN
enabl := FALSE;
m := TRUE;
END_IF
END_IF