Пример опроса МВ110-8AC:
Код:
VAR
MB_Get : MB_RD_HOLD_REGS;
ComService : COM_SERVICE;
Settings : COMSETTINGS;
ComPortState : BYTE := 0;
ES : BOOL := TRUE;
MBTimeOut : TIME := T#100ms; //например
Buffer : ARRAY[0..255] OF BYTE;
END_VAR
//настраиваем и открываем порт, например так:
IF ComPortState = 0 THEN
Settings.Port := 0;
Settings.dwBaudRate := 19200;
Settings.byParity := 0;
Settings.dwTimeout := 5;
Settings.byStopBits := 1;
Settings.dwBufferSize := 0;
Settings.dwScan := 0;
END_IF
ComService(ENABLE := ComPortState = 0, SETTINGS := Settings, TASK := OPEN_TASK);
IF ComService.Ready THEN
ComPortState := 2;
END_IF
//по готовности порта "работаем" с ним
IF ComPortState = 2 THEN
MB_Get(
Enable := ES,
Mode := MB_RTU,
DevAddr := 1, //например
FirstAddr := 280, //для МВ110-8AC
Quantity := 32, //"выгоднее" читать из МВ110-8AC всю пачку значений регистров сразу, вместе со статусами каналов
ComHandle := Settings.Port,
TimeOut := MBTimeOut,
Buffer := Buffer);
ES := FALSE;
IF MB_Get.Complete THEN
IF MB_Get.Exception = 0 THEN
...//разбираем Buffer
END_IF
ES := TRUE;
END_IF
Для работы нужны Modbus.lib, ComService.lib, SysLibCom.lib. Буфер, надеюсь, сами сможете разобрать.