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




Ответить с цитированием