F145_WRITE_DATA

将数据写入从站

使用此指令,通过采用MEWTOCOL-COM或Modbus RTU协议的通信端口,将主站写入从站或站读取数据(如所用端口的系统寄存器中所定义)。确保对主站和从站设置相同的协议。主站和从站必须具有匹配的内存区。如果无法在主站的用户区域使用从站数据,请使用F145_WRITE_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:0–99, MODBUS: 0–2550播送

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

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

要写入从站的数据在主站上的源地址。

输出

SlaveData (BOOL, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, DATE, TOD, DT, STRING)
  • 从站中写入数据的目标地址。

  • MasterDataSlaveData必须为相同的数据类型。

  • 若要建立从主站到从站数据的外部数据访问,必须在全局变量列表中分配固定用户地址(与从站数据相同的地址)。

标注

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

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

  • F145指令仅请求要发送到从站的数据。实际处理发生在扫描结束时。

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

  • 当播送时(SlaveAddress设置为0),确保仅在经过最大扫描时间后才执行发送。

  • 如果目标地址是特殊内部寄存器(从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
		bBool1: BOOL:=FALSE;
		bRead1: BOOL:=FALSE;
		bWrite1: BOOL:=FALSE;
	END_VAR
	VAR_EXTERNAL
		Slave2_g_bY38: BOOL:=FALSE;
	END_VAR

POU本体

系统变量sys_bPulse1s被复制到bBool1。如果bWrite1sys_bIsComPort1F145F146NotActive设置为TRUE,则bBool1被写入从站2的输出Y38

LD本体

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 3 ;
        NETWORK_BODY
B(B_CONTACT,,sys_bPulse1s,3,1,5,3,);
B(B_COIL,,bBool1,24,1,26,3,);
L(5,2,24,2);
L(1,2,3,2);
L(1,0,1,3);
        END_NETWORK_BODY
    END_NET_WORK
    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,,bWrite1,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,,bBool1,21,4,23,6,);
B(B_F,F145_WRITE_DATA!,Instance,23,0,33,6,,?DEN?DPort?DSlaveAddress?DMasterData?AENO?CSlaveData);
B(B_VAROUT,,Slave2_g_bY38,33,2,35,4,);
B(B_COIL,,bWrite1,36,1,38,3,E);
B(B_COIL,,bRead1,42,1,44,3,S);
L(1,2,8,2);
L(10,2,18,2);
L(20,2,23,2);
L(33,2,36,2);
L(38,2,42,2);
L(1,0,1,6);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

ST本体

bBool1 := sys_bPulse1s;
if (bWrite1 and sys_bIsComPort1F145F146NotActive) then
    F145_WRITE_DATA(Port := SYS_COM1_PORT, 
                    SlaveAddress := 2, 
                    MasterData := bBool1, 
                    SlaveData => Slave2_g_bY38);    
    bRead1 := true;
    bWrite1 := false;
end_if;

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