PDA

Просмотр полной версии : ПЛК150 - не работает опрос по Modbus-ASCII через Modbus.lib



awel
14.09.2012, 01:51
Здравствуйте. Впервые столкнулся с программированием ПЛК. Им волею судеб оказался ПЛК-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 мс - макс.).

awel
14.09.2012, 07:25
Дело не в том девайсе. С овеновской ТРМ-202 в режиме Modbus-ASCII та же ошибка. Но, если это важно, да, протокол определен жестко - Modbus ASCII. И имени у него нет пока

kgsh82
14.09.2012, 08:59
Попробуйте сделать эмулятор этого устройства из ПК. С помощью какой-нибудь терминальной программы можно будет посмотреть что выдаёт ПЛК.

awel
15.09.2012, 10:02
Спасибо, я попытался запустить этот код из видео, но думаю, что у меня не получилось достоверно воспроизвести блок OpenPort485. Подскажите, что у него внутри? Я так понял, CS это структура типа COM_SERVICE, но каким образом формируются остальные параметры? Прошу прощения за ламерские вопросы, но для меня программирование ПЛК еще непаханное поле :)

awel
18.09.2012, 22:16
Благодарю. Но все равно не работает :) Видимо, придется делать через конфигурацию, хоть это и выйдет неудобно и некрасиво.