FP_MC_PROTOCOL_WRITE

通过MC协议将数据写入外部设备

PLC在主站通信中具有传输权。通过向支持MC协议的设备发送命令和接收响应来执行通信。通过在用户程序中指定存储器地址和执行写入指令,PLC将自动根据协议生成消息。

参数

输入

Port (WORD, INT, UINT)

以太网端口,例如SYS_ETHERNET_USER_CONNECTION_1

Source (ANY)

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

Words_Bits (WORD, INT, UINT)
  • 指定接收数据量。对于字传输,接收数据量以字为单位,对于位传输,则以位为单位(具体取决于应用于输入Words_Bits的数据类型)

  • 传输方法和由Words_Bits指定的发送数据量因Source的数据类型而异。

Source中指定内存区

传输方法

发送数据的数量Words_Bits

标注

16位内存区

WXWYWRWLDTLD

字传输

1-960字

1位内存区

X,Y,R,L,DT,n,LD,n

位传输

1-7168位

当发送数据的数量为奇数时,将添加4位虚拟代码16#0

DestMemoryArea (WORD, INT, UINT)

写入数据的从站上的内存区。

单元

内存区类型

系统变量

输入

X

十六进制

SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X

输出

Y

十六进制

SYS_MC_PROTOCOL_MEMORY_AREA_OUTPUT_Y

链接继电器

B

十六进制

SYS_MC_PROTOCOL_MEMORY_AREA_LINK_RELAY_B

内部继电器

M

十进制

SYS_MC_PROTOCOL_MEMORY_AREA_INTERNAL_RELAY_M

闩锁继电器

L

十进制

SYS_MC_PROTOCOL_MEMORY_AREA_LATCH_RELAY_L

数据寄存器

D

十进制

SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D

文件寄存器

R

十进制

SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_R
ZR

十六进制

SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_ZR

链接寄存器

W

十六进制

SYS_MC_PROTOCOL_MEMORY_AREA_LINK_REGISTER_W
DestMemoryOffset (DWORD, DINT, UDINT)

写入数据的从站上内存区的偏移量。

范围16#016#F7FFFF (0–16252927)

输出

Result (WORD, INT, UINT)

指定存储执行结果代码的主站单元的内存区(区域WXWYXRWLDTLD中为1字)

  • 0:正常完成

  • 1:通信端口用于主站通信

  • 2:通信端口用于从站通信

  • 3:已超过可同时使用的最大主站通信指令数

  • 4:发送超时

  • 5:响应接收超时

  • 6:接收数据错误

时间图

  1.  (1) 主站通信清除–发送标志,例如sys_bIsEthernetUserConnection1MasterCommunication
  2.  (2) 确认主站通信清除–发送标志为TRUE且主站通信发送标志为FALSE
  3.  (3) 主站通信发送标志,例如sys_bIsEthernetUserConnection1MasterCommunicationActive

    发送过程中主站通信发送标志TRUE

    发送完成后主站通信发送标志FALSE

  4.  (4) 执行此指令
  5.  (5) 主站通信发送完成标志,例如sys_bIsEthernetUserConnection1CommunicationError

    正常完成FALSE

    异常完成TRUE

  6.  (6) 发送数据
  7.  (7) 响应接收处理

错误标志

sys_bIsOperationErrorHold(变为TRUE并保持为TRUE)
  • 如果使用索引寄存器指定的区域超出限制。

  • 如果为参数指定的值超出允许的范围。

  • 如果以太网端口不正确或以太网端口关闭。

  • 如果由Words_Bits指定的发送数据量错误。

  • 如果Source指定主站单元上的字区域或寄存区不正确或超出允许范围。

  • 如果在其中存储执行结果代码的内存区不正确。

sys_bIsOperationErrorNonHold(对于一次扫描变为TRUE)
  • 如果使用索引寄存器指定的区域超出限制。

  • 如果为参数指定的值超出允许的范围。

  • 如果以太网端口不正确或以太网端口关闭。

  • 如果由Words_Bits指定的发送数据量错误。

  • 如果Source指定主站单元上的字区域或寄存区不正确或超出允许范围。

  • 如果在其中存储执行结果代码的内存区不正确。

示例

POU头

所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。

	VAR
		bEnable: BOOL:=FALSE;
		awValues: ARRAY [0..2] OF WORD:=[3(0)];
		diMemoryOffset: DINT:=0;
		iResult: INT:=0;
		abValues: ARRAY [0..2] OF BOOL:=[3(FALSE)];
		iPort: INT:=0;
	END_VAR

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_COMMENT,,Bit transfer,2,0,10,1,);
B(B_COMMENT,,Memory Areas:	SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X ^SYS_MC_PROTOCOL_MEMORY_AREA_OUTPUT_Y ^SYS_MC_PROTOCOL_MEMORY_AREA_LINK_RELAY_B ^SYS_MC_PROTOCOL_MEMORY_AREA_INTERNAL_RELAY_M ^SYS_MC_PROTOCOL_MEMORY_AREA_LATCH_RELAY_L,13,0,39,6,);
L(1,0,1,6);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 8 ;
        NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VARIN,,abValues,18,3,20,5,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,26,5,28,7,);
B(B_VARIN,,diMemoryOffset,26,6,28,8,);
B(B_VAROUT,,iResult,41,2,43,4,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_WRITE!,,28,0,41,8,,?DEN?DPort?DSource?DWords_Bits?HDestMemoryArea?DDestMemoryOffset?AENO?CResult);
B(B_F,Size_Of_Var!,,21,4,28,6,,?D?C);
L(1,2,5,2);
L(7,2,28,2);
L(20,4,28,4);
L(21,4,21,5);
L(1,0,1,8);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
B(B_COMMENT,,Memory Areas:	 ^SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D ^SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_R ^SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_ZR ^SYS_MC_PROTOCOL_MEMORY_AREA_LINK_REGISTER_W,13,0,39,5,);
B(B_COMMENT,,Word Transfer,2,0,10,1,);
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 8 ;
        NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VARIN,,awValues,18,3,20,5,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,26,5,28,7,);
B(B_VARIN,,diMemoryOffset,26,6,28,8,);
B(B_VAROUT,,iResult,41,2,43,4,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_WRITE!,,28,0,41,8,,?DEN?DPort?DSource?DWords_Bits?HDestMemoryArea?DDestMemoryOffset?AENO?CResult);
B(B_F,Size_Of_Var!,,21,4,28,6,,?D?C);
L(1,2,5,2);
L(7,2,28,2);
L(20,4,28,4);
L(21,4,21,5);
L(1,0,1,8);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
B(B_COMMENT,,only valid for ethernet ports! ^--> Valid Ports:	SYS_ETHERNET_USER_CONNECTION_1 - SYS_ETHERNET_USER_CONNECTION_216,3,1,52,4,);
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

ST本体

(*Bit transfer*)
If (bEnable) then
    FP_MC_PROTOCOL_WRITE(Port := iPort,
                         Source := abValues,
                         Words_Bits := Size_Of_Var(abValues), 
                         DestMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,
                         DestMemoryOffset := diMemoryOffset,
                         Result => iResult);
End_if;
(*Word transfer*)
If (bEnable) then
    FP_MC_PROTOCOL_WRITE(Port := iPort,
                         Source := awValues,
                         Words_Bits := Size_Of_Var(awValues), 
                         DestMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,
                         DestMemoryOffset := diMemoryOffset,
                         Result => iResult);
End_if;

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