F146_READ_DATA

从从站中读取数据

使用此指令,通过采用MEWTOCOL-COM或Modbus RTU协议的通信端口,如所用端口的系统寄存器中所定义,从从站请求数据。确保对主站和从站设置相同的协议。主站和从站必须具有匹配的内存区。如果无法在主站的用户区域使用从站数据,请使用F146_READ_DATA_TYPE_OFFSF145F146_MODBUS_MASTER

对于使用Modbus协议的数据发送,编译器会基于Modbus参考编号生成Modbus命令。

参数

输入

Port (WORD, INT, UINT)

根据PLC的类型指定通信端口:

  • COM端口,例如SYS_COM0_PORT

  • 以太网端口,例如SYS_ETHERNET_USER_CONNECTION_1

  • MCU/SCU,例如COM01中的16#xx01 (xx = 插槽编号)

SlaveAddress (WORD, INT, UINT)

从站的站号MEWTOCOL:1–99,MODBUS:1-255)

如果SYS_ETHERNET_USER_CONNECTION_xx应用到输入Port,则设置为1

SlaveData (BOOL, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, DATE, TOD, DT, STRING)

请求数据的从站上的源地址。

输出

MasterData (BOOL, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, DATE, TOD, DT, STRING)

写入请求数据的主站单元上的字区域或寄存器。

标注

  • 建议使用以下最灵活的指令代替使用F型指令: FP_READ_FROM_SLAVE_AREA_OFFS

  • F145F146指令只有在这两个指令均未激活时才可执行。评估程序中的"F145/F146未激活"标志以检查指令的状态。

  • 评估"F145/F146错误"标志以检查发送是否正常完成或有错误。

  • 如果目标地址是特殊内部寄存器(从R9000开始)、特殊数据寄存器(从DT9000/DT90000开始)或文件寄存器FL,则无法执行F145F146指令。

错误标志

sys_bIsOperationErrorHold(变为TRUE并保持为TRUE)
  • 如果从站或主站数据超出可用地址范围。
  • 如果通信模式未被设置为MEWTOCOL-COM主站/从站或Modbus RTU主站/从站。
  • 如果所选的COM端口需要尚未安装的通信插件。
sys_bIsOperationErrorNonHold(对于一次扫描变为TRUE)
  • 如果从站或主站数据超出可用地址范围。
  • 如果通信模式未被设置为MEWTOCOL-COM主站/从站或Modbus RTU主站/从站。
  • 如果所选的COM端口需要尚未安装的通信插件。

示例

全局变量

在全局变量列表中,定义项目中所有POU都可以访问的变量。

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

POU本体

如果bRead1sys_bIsComPort1F145F146NotActive设置为TRUE,则分配到从站2的Y38的全局变量Slave2_g_bY38被读取并存储到bBool2中。

LD本体

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

ST本体

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;

最后更新日期: 此页面上的反馈松下热线