вот "кусок" программы с функциями библиотечными:
(*Номер последнего запроса-вычисляется только при вхождении в границы действующего количества слэйвов*)
IF SlaveNumber<=KolSlave THEN
StopNumber[PN][SlaveNumber]:=StartNumber[PN][SlaveNumber];
ELSE
StartNumber[PN][SlaveNumber]:=0;
StopNumber[PN][SlaveNumber]:=0;
END_IF

(*Опрос устройства*)
IF Number[PN]>=StartNumber[PN][SlaveNumber] AND Number[PN]<=StopNumber[PN][SlaveNumber] THEN
IF FirstScan=0 THEN
FirstScan:= 1;
END_IF
SN:=Number[PN]-StartNumber[PN][SlaveNumber]+1;

(*Формирование послок*)
FOR i:=1 TO 1 DO
(*МADIO*)
MB_SLAVE_SETTING[PN][i+(StartNumber[PN][SlaveNumber]-1)].DevAddr:=Address;
MB_SLAVE_SETTING[PN][i+(StartNumber[PN][SlaveNumber]-1)].FirstAddr:=0;
MB_SLAVE_SETTING[PN][i+(StartNumber[PN][SlaveNumber]-1)].Quantity:=3;
END_FOR

(*МADIO*)
MB_RD_HOLD_REGS[PN](
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=MB_SLAVE_SETTING[PN][Number[PN]].DevAddr ,
FirstAddr:=MB_SLAVE_SETTING[PN][Number[PN]].FirstAddr ,
Quantity:=MB_SLAVE_SETTING[PN][Number[PN]].Quantity ,
ComHandle:=PN ,
TimeOut:=t#1000ms ,
Buffer:=Buffer[PN] ,
Complete=>MB_SLAVE_SETTING[PN][Number[PN]].Complete ,
Exception=>MB_SLAVE_SETTING[PN][Number[PN]].Exception ,
ByteCnt=>MB_SLAVE_SETTING[PN][Number[PN]].ByteCnt );
(*Перевод Byte в Word, переход на следующий Number[PN]*)
IF MB_SLAVE_SETTING[PN][Number[PN]].ByteCnt=MB_RD_HOLD_REGS[PN].Quantity*2 THEN
FOR i:=1 TO MB_SLAVE_SETTING[PN][Number[PN]].Quantity DO
ByteToWord(Byte01:=Buffer[PN][(i-1)*2+1] , Byte02:=Buffer[PN][(i-1)*2] , Word01=>Data_MADIO[i] );
END_FOR
END_IF
(***Преобразование в BOOL***)
FOR i:=1 TO 3 DO
WordToBool(
Word01:=Data_MADIO[i],
BoolArray=>Data_MADIO_BOOL_temp);
FOR j:=1 TO 16 DO
Data_MADIO_BOOL[j+(i-1)*16]:=Data_MADIO_BOOL_temp[j];
END_FOR
END_FOR
END_IF
(*запись*)
IF write_modbus_singl.Complete THEN
value[1]:=DataMADIOWrite[1];
END_IF

write_modbus_singl(
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=100 ,
RegAddr:=5 ,
ComHandle:=2 ,
TimeOut:=t#100ms ,
Value:= value[1],
Complete=>COMPL ,
Exception=>EXCEP);

(*1 группа выходов*)
DataMADIOWrite[1].0:=0;
DataMADIOWrite[1].1:=0;
DataMADIOWrite[1].2:=0;
DataMADIOWrite[1].3:=0;
DataMADIOWrite[1].4:=0;
DataMADIOWrite[1].5:=0;
DataMADIOWrite[1].6:=0;
DataMADIOWrite[1].7:=0;
DataMADIOWrite[1].8:=MADIO_DO[1];
DataMADIOWrite[1].9:=MADIO_DO[2];
DataMADIOWrite[1].10:=MADIO_DO[3];
DataMADIOWrite[1].11:=MADIO_DO[4];
DataMADIOWrite[1].12:=MADIO_DO[5];
DataMADIOWrite[1].13:=MADIO_DO[6];
DataMADIOWrite[1].14:=MADIO_DO[7];
DataMADIOWrite[1].15:=MADIO_DO[8];