Здравствуйте. Впервые столкнулся с программированием ПЛК. Им волею судеб оказался ПЛК-150-И-М. Ситуация следующая: есть некий девайс, который умеет отдавать данные только по Modbus-ASCII. При опросе через конфигурацию ПЛК - все нормально. Но если в ход идет Modbus.lib - в эфире тишина, постоянно получаю ошибку таймаута. Ради интереса подключил ТРМ-202. В режиме RTU ТРМ-ка отдает данные безупречно. При переходе на ASCII - та же ошибка таймаута (255 в Exception на выходе MB_RD_HOLD_REGS). Просвещенные товарищи, подскажите, в чем может быть дело. Код для опроса самый примитивный:
Код:
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
Код работает нормально ровно до тех пор, пока Mode = MB_RTU. Все настройки времени цикла ПЛК - по умолчанию, (1 мс - мин., 1000 мс - макс.).