从带有偏移量的从站中读取数据
使用此指令,通过采用MEWTOCOL-COM或Modbus RTU协议的通信端口,如所用端口的系统寄存器中所定义,从从站请求数据。 确保对主站和从站设置相同的协议。 主站和从站必须具有匹配的内存区。
对于使用Modbus协议的数据发送,编译器会基于Modbus参考编号生成Modbus命令。
输入
根据PLC的类型指定通信端口:
COM端口,例如SYS_COM0_PORT
以太网端口,例如SYS_ETHERNET_USER_CONNECTION_1
MCU/SCU,例如COM01中的16#xx01 (xx = 插槽编号)
从站的站号(MEWTOCOL:1–99,MODBUS:1-247)
如果SYS_ETHERNET_USER_CONNECTION_xx应用到输入Port,则设置为1
请求数据的从站上的起始地址。
内存区类型 |
系统变量 |
---|---|
内部继电器 |
|
链接继电器 |
|
外部输入 |
|
外部输出 |
|
内部继电器 |
|
定时器/计数器设置值 |
|
定时器/计数器经过值 |
|
数据寄存器 |
|
链接继电器 |
|
链接数据寄存器 |
|
文件寄存器 |
|
输入寄存器 |
|
输出寄存器 |
请求数据的从站中起始地址的偏移量。
要发送的字(位)数。
或:
字数
针对Modbus RTU:16#001–16#07F
针对MEWTOCOL-COM:16#001–16#1FD或16#001–16#1B(FP0, FP-e)
或:
位传输控制字:16#8T0F,T表示向主站传输位,F表示向从站传输位(不适用于FP7)。
输出
写入请求数据的主站单元上的字区域或寄存器。
仅对于FP7: 如需查看所有错误代码的说明,请参阅Modbus/MEWTOCOL通信错误代码表。
对于其他PLC:设置为0
发送过程中:主站通信发送标志为TRUE
发送完成后:主站通信发送标志为FALSE
正常完成:FALSE
异常完成:TRUE
如果使用索引寄存器指定的区域超出限制。
如果由Words_Bits指定的发送数据量错误。
如果使用索引寄存器指定的区域超出限制。
如果由Words_Bits指定的发送数据量错误。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
bReadResult: BOOL:=FALSE;
wReadFromSlaveResult: WORD:=0;
(*result of write to slave instruction*)
iSlaveStationNumber: INT:=0;
(*slave station number*)
arrResults: ARRAY [0..9] OF REAL:=[10(0.0)];
(*Array of results to be read from slave station*)
iSlaveMemoryOffset: INT:=200;
iSlaveMemorySize: INT:=1;
END_VAR
VAR CONSTANT
iSlaveMemoryArea: INT:=5;
(*memory Area in slave station*)
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_VARIN,,SYS_COM1_PORT,15,2,17,4,);
B(B_VARIN,,iSlaveStationNumber,15,3,17,5,);
B(B_CONTACT,,bReadResult,4,1,6,3,);
B(B_VAROUT,,wReadFromSlaveResult,34,3,36,5,);
B(B_VAROUT,,arrResults,34,2,36,4,);
B(B_VARIN,,SYS_MEMORY_AREA_DT,15,4,17,6,);
B(B_VARIN,,iSlaveMemoryOffset,15,5,17,7,);
B(B_VARIN,,iSlaveMemorySize,15,6,17,8,);
B(B_F,FP_READ_FROM_SLAVE_AREA_OFFS!,,17,0,34,8,,?DEN?DnPort?DStationNumber?HSlaveMemoryArea?DSlaveMemoryOffset?DWords_Bits?AENO?CDestination?CResult);
L(1,2,4,2);
L(6,2,17,2);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if (bReadResult) then
FP_READ_FROM_SLAVE_AREA_OFFS(Port := SYS_COM1_PORT,
StationNumber := iSlaveStationNumber,
SlaveMemoryArea := SYS_MEMORY_AREA_DT,
SlaveMemoryOffset := iSlaveMemoryOffset,
Words_Bits := iSlaveMemorySize,
Destination => arrResults[0],
Result => wReadFromSlaveResult);
end_if;