Сегодня столкнулся точно с такой-же проблемой, при чтении регистров по модбас из сигнализатора загазованности СТМ-30М получаю в буфере хаотичные значения.
Код:
get1_modbus: MB_RD_HOLD_REGS;
Buffer: ARRAY[0..255] OF BYTE;
cmpl: BOOL;
port_opened: BYTE := 0;
Init: BOOL;
Settings:COMSETTINGS;
enabl: BOOL;
err: INT;
TimeOut: TIME:=T#50ms;
Exception: BYTE;
DataSize: WORD;
master1: BYTE:= 0;
x1: WORD;
x2: WORD;
x3: WORD;
x4: WORD;
x5: WORD;
COM_SERVICE1: COM_SERVICE;
Код:
IF port_opened=0 THEN
Settings.Port:=0;
Settings.dwBaudRate:=9600;
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 );
IF COM_SERVICE1.ready THEN port_opened:=2; END_IF
IF port_opened=2 THEN
CASE master1 OF
0: (* читаем из прибора с адресом 4 начиная с регистра 0 по протоколу MB-RTU*)
get1_modbus(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=4 ,
FirstAddr:=0 ,
Quantity:=2,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );
IF cmpl THEN
IF err=0 THEN
x1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
x2:=BYTE_TO_WORD(BUFFER[3]) OR SHL(BYTE_TO_WORD(BUFFER[2]),8);
IF ((x1)AND(4096))=4096 THEN AVARIA_DVK_RESERV:=TRUE; END_IF;
END_IF
master1:=0;
END_IF
END_CASE
IF enabl = FALSE THEN enabl := TRUE; END_IF
IF err <> 0 THEN enabl := FALSE; END_IF
END_IF
Как только cmpl становится TRUE - err равен 255, т.о. в x1 никогда не записывает значения из буфера. Что только не пробовал уже.