Сегодня столкнулся точно с такой-же проблемой, при чтении регистров по модбас из сигнализатора загазованности СТМ-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 никогда не записывает значения из буфера. Что только не пробовал уже.