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

Попробуйте увеличить время ожидания, ну и....электрическое соединение проверить. Про настройки не пишу - очевидно.
Контроллер какой? ПЛК73? Минимальное время цикла сколько?