从从站中读取数据
使用此指令,通过采用MEWTOCOL-COM或Modbus RTU协议的通信端口,如所用端口的系统寄存器中所定义,从从站请求数据。确保对主站和从站设置相同的协议。主站和从站必须具有匹配的内存区。如果无法在主站的用户区域使用从站数据,请使用F146_READ_DATA_TYPE_OFFS或F145F146_MODBUS_MASTER。
对于使用Modbus协议的数据发送,编译器会基于Modbus参考编号生成Modbus命令。输入
根据PLC的类型指定通信端口:
COM端口,例如SYS_COM0_PORT
以太网端口,例如SYS_ETHERNET_USER_CONNECTION_1
MCU/SCU,例如COM01中的16#xx01 (xx = 插槽编号)
从站的站号(MEWTOCOL:1–99,MODBUS:1-255)
如果SYS_ETHERNET_USER_CONNECTION_xx应用到输入Port,则设置为1
请求数据的从站上的源地址。
输出
写入请求数据的主站单元上的字区域或寄存器。
建议使用以下最灵活的指令代替使用F型指令: FP_READ_FROM_SLAVE_AREA_OFFS。
F145或F146指令只有在这两个指令均未激活时才可执行。评估程序中的"F145/F146未激活"标志以检查指令的状态。
评估"F145/F146错误"标志以检查发送是否正常完成或有错误。
如果目标地址是特殊内部寄存器(从R9000开始)、特殊数据寄存器(从DT9000/DT90000开始)或文件寄存器FL,则无法执行F145或F146指令。
在全局变量列表中,定义项目中所有POU都可以访问的变量。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
bBool2: BOOL:=FALSE;
bRead1: BOOL:=FALSE;
bWrite2: BOOL:=FALSE;
END_VAR
VAR_EXTERNAL
Slave2_g_bY38: BOOL:=FALSE;
END_VAR
VAR
END_VAR
如果bRead1和sys_bIsComPort1F145F146NotActive设置为TRUE,则分配到从站2的Y38的全局变量Slave2_g_bY38被读取并存储到bBool2中。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,sys_bIsComPort1F145F146NotActive,8,1,10,3,);
B(B_CONTACT,,bWrite2,18,1,20,3,);
B(B_VARIN,,SYS_COM1_PORT,21,2,23,4,);
B(B_VARIN,,2,21,3,23,5,);
B(B_VARIN,,Slave2_g_bY38,21,4,23,6,);
B(B_VAROUT,,bBool2,33,2,35,4,);
B(B_COIL,,bWrite2,36,1,38,3,E);
B(B_COIL,,bRead1,42,1,44,3,S);
B(B_F,F146_READ_DATA!,Instance,23,0,33,6,,?DEN?DPort?DSlaveAddress?DSlaveData?AENO?CMasterData);
L(1,2,8,2);
L(10,2,18,2);
L(38,2,42,2);
L(33,2,36,2);
L(20,2,23,2);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if (bRead1 and sys_bIsComPort1F145F146NotActive) then
F146_READ_DATA(Port := SYS_COM1_PORT,
SlaveAddress := 2,
SlaveData := Slave2_g_bY38,
MasterData => bBool2);
bRead1 := false;
bWrite1 := true;
end_if;