Здравствуйте. Впервые столкнулся с программированием ПЛК. Им волею судеб оказался ПЛК-150-И-М. Ситуация следующая: есть некий девайс, который умеет отдавать данные только по Modbus-ASCII. При опросе через конфигурацию ПЛК - все нормально. Но если в ход идет Modbus.lib - в эфире тишина, постоянно получаю ошибку таймаута. Ради интереса подключил ТРМ-202. В режиме RTU ТРМ-ка отдает данные безупречно. При переходе на ASCII - та же ошибка таймаута (255 в Exception на выходе MB_RD_HOLD_REGS). Просвещенные товарищи, подскажите, в чем может быть дело. Код для опроса самый примитивный:
Код работает нормально ровно до тех пор, пока Mode = MB_RTU. Все настройки времени цикла ПЛК - по умолчанию, (1 мс - мин., 1000 мс - макс.).Код:PROGRAM PLC_PRG VAR COM_SERVICE0: COM_SERVICE; ComSettings: COMSETTINGS; ComPort: BYTE := 0; ComReady: BOOL; state: BYTE; mb_get: MB_RD_HOLD_REGS; DevAddr: BYTE := 48; FirstAddr: BYTE := 1; buf: ARRAY [0..255] OF BYTE; rt: R_TRIG; err: BYTE; x: DWORD; timer: TON; PollingTime: TIME := T#200ms; TimeOut: TIME := T#150ms; END_VAR IF COM_SERVICE0.Ready = FALSE THEN ComSettings.Port := ComPort; ComSettings.dwBaudRate := 19200; ComSettings.byParity := 0; ComSettings.byStopBits := 0; ComSettings.dwBufferSize := 0; ComSettings.dwScan := 0; ComSettings.dwTimeout := 0; COM_SERVICE0(Enable := TRUE, Settings := ComSettings, Task := OPEN_TSK); ComReady := FALSE; ELSE COM_SERVICE0.Enable := FALSE; ComReady := TRUE; END_IF IF ComReady = TRUE THEN CASE state OF 0: mb_get( Mode := MB_RTU, Enable := TRUE, ComHandle := ComSettings.Port, DevAddr := DevAddr, FirstAddr := FirstAddr, Buffer := buf, TimeOut := TimeOut ); rt(CLK := mb_get.Complete); IF rt.Q THEN err := mb_get.Exception; IF err = 0 THEN x := buf[0] * 256 + buf[1]; state := 1; END_IF END_IF 1: mb_get( Mode := MB_RTU, Enable := FALSE, ComHandle := ComSettings.Port, DevAddr := DevAddr, FirstAddr := FirstAddr, Buffer := buf, TimeOut := TimeOut ); timer(IN := TRUE, PT := PollingTime); timer; state := 2; 2: timer; IF timer.Q THEN timer(IN := FALSE, PT := PollingTime); state := 0; END_IF END_CASE END_IF




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