Вот внутренности блока МВ110-х.8Д:
FUNCTION_BLOCK MV110_8D_inputs
VAR_INPUT
(*идентификатор порта*) Handle:SysCom.RTS_IEC_HANDLE;
(*разрешение на работу*) Enabl:BOOL;
(*режим работы ModBus (MB_RTU, MB_Ascii), по умолчанию RTU*) Modd:MB_MODE:=MB_RTU ;
(*адресс прибора, по умолчанию 16*) Addr:BYTE:=16;
(*таймаут, по умолчанию 100мс*) TimeOut: TIME:=T#100MS;
(*число перезапросов, по умолчанию 3*) ErCL:BYTE:=3;

END_VAR
VAR_OUTPUT
(*состояния 1го входа прибора*) inp1:BOOL;
(*состояния 2го входа прибора*) inp2:BOOL;
(*состояния 3го входа прибора*) inp3:BOOL;
(*состояния 4го входа прибора*) inp4:BOOL;
(*состояния 5го входа прибора*) inp5:BOOL;
(*состояния 6го входа прибора*) inp6:BOOL;
(*состояния 7го входа прибора*) inp7:BOOL;
(*состояния 8го входа прибора*) inp8:BOOL;

(*код ошибки*) wErrCode:WORD;
(*флаг завершения*) done:BOOL;
END_VAR
VAR
rtrig:R_TRIG;
trig:rs;
ErrCount:BYTE:=0;
err:WORD;
cmpl:BOOL;
Exception: BYTE;
DataSize: WORD;
RegAddr:WORD:=16#33;
get_modbus:MB_RD_HOLD_REGS;
BUFFER: ARRAY [0..255] OF BYTE;
x: WORD;
END_VAR


done:=FALSE;
rtrig(clk:=(Enabl));
trig(set:=rtrig.Q,RESET1:=FALSE);
get_modbus(
Enable:=trig.Q1, (* разрешение работы блока *)
Mode:=Modd , (*режим передачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr , (*номер регистра*)
Quantity:=1, (*количество регистров*)
ComHandle:=handle ,(*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)

(*IF SysComRead(handle, ADR(tempBuf), 255, 0, ADR(res)) <> 0 THEN
err:=0;
END_IF*)

IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=0;
x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
inp1:=x.0;
inp2:=x.1;
inp3:=x.2;
inp4:=x.3;
inp5:=x.4;
inp6:=x.5;
inp7:=x.6;
inp8:=x.7;

done:=TRUE;
ErrCount:=0;
wErrCode:=Err;
trig(RESET1:=TRUE);

ELSE
IF (ErrCount >= ErCL) THEN
wErrCode:=Err;
ErrCount:=0;
done:=TRUE;
trig(RESET1:=TRUE);
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF

Мне кажется, что достаточно будет задать начальный регистр и количество регистров опрашиваемого ПЛК? И еще в таком случае необходимо будет использовать два блока: на ввод и вывод или нет? Извините если задаю много глупых вопросов