通过MC协议从外部设备读取数据
PLC在主站通信中具有传输权。通过向支持MC协议的设备发送命令和接收响应来执行通信。通过在用户程序中指定存储器地址和执行读取指令,PLC将自动根据协议生成消息。
输入
以太网端口,例如SYS_ETHERNET_USER_CONNECTION_1
从其请求数据的从站上的内存区。
单元 |
内存区类型 |
系统变量 |
||
---|---|---|---|---|
位 |
输入 |
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 |
从其请求数据的从站上内存区的偏移量。
范围:16#0–16#F7FFFF (0–16252927)
指定接收数据量。对于字传输,接收数据量以字为单位,对于位传输,则以位为单位(具体取决于应用于输入Words_Bits的数据类型)
传输方法和由Words_Bits指定的发送数据量因Destination的数据类型而异。
在Destination中指定内存区 |
传输方法 |
发送数据的数量Words_Bits |
标注 |
---|---|---|---|
16位内存区 WX、WY、WR、WL、DT、LD |
字传输 |
1-960字 |
|
1位内存区 X,Y,R,L,DT,n,LD,n |
位传输 |
1-7168位 |
当发送数据的数量为奇数时,将添加4位虚拟代码16#0。 |
输出
写入请求数据的主站单元上的字区域或寄存器。
指定存储执行结果代码的主站单元的内存区(区域WX、WY、XR、WL、DT、LD中为1字)
0:正常完成
1:通信端口用于主站通信
2:通信端口用于从站通信
3:已超过可同时使用的最大主站通信指令数
4:发送超时
5:响应接收超时
6:接收数据错误
发送过程中:主站通信发送标志为TRUE
发送完成后:主站通信发送标志为FALSE
正常完成:FALSE
异常完成:TRUE
如果使用索引寄存器指定的区域超出限制。
如果为参数指定的值超出允许的范围。
如果以太网端口不正确或以太网端口关闭。
如果由Words_Bits指定的发送数据量错误。
如果Destination指定主站单元上的字区域或寄存区不正确或超出允许范围。
如果在其中存储执行结果代码的内存区不正确。
如果使用索引寄存器指定的区域超出限制。
如果为参数指定的值超出允许的范围。
如果以太网端口不正确或以太网端口关闭。
如果由Words_Bits指定的发送数据量错误。
如果Destination指定主站单元上的字区域或寄存区不正确或超出允许范围。
如果在其中存储执行结果代码的内存区不正确。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
diMemoryOffset: DINT:=0;
awValues: ARRAY [0..2] OF WORD:=[3(0)];
iResult: INT:=0;
bEnable: BOOL:=FALSE;
abValues: ARRAY [0..2] OF BOOL:=[3(FALSE)];
iPort: INT:=0;
END_VAR
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 := 7 ;
NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VAROUT,,abValues,41,2,43,4,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,26,3,28,5,);
B(B_VARIN,,diMemoryOffset,26,4,28,6,);
B(B_VAROUT,,iResult,41,3,43,5,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_READ!,,28,0,41,7,,?DEN?DPort?HSourceMemoryArea?DSourceMemoryOffset?DWords_Bits?AENO?CDestination?CResult);
B(B_F,Size_Of_Var!,,21,5,28,7,,?D?C);
B(B_VARIN,,abValues,19,5,21,7,);
L(7,2,28,2);
L(1,2,5,2);
L(1,0,1,7);
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 := 7 ;
NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VAROUT,,awValues,41,2,43,4,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,26,3,28,5,);
B(B_VARIN,,diMemoryOffset,26,4,28,6,);
B(B_VAROUT,,iResult,41,3,43,5,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_READ!,,28,0,41,7,,?DEN?DPort?HSourceMemoryArea?DSourceMemoryOffset?DWords_Bits?AENO?CDestination?CResult);
B(B_F,Size_Of_Var!,,21,5,28,7,,?D?C);
B(B_VARIN,,awValues,19,5,21,7,);
L(1,2,5,2);
L(7,2,28,2);
L(1,0,1,7);
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
(*Bit transfer*)
If (bEnable) then
FP_MC_PROTOCOL_READ(Port := iPort,
SourceMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,
SourceMemoryOffset := diMemoryOffset,
Words_Bits := Size_Of_Var(abValues),
Destination => abValues, Result => iResult);
End_if;
(*Word transfer*)
If (bEnable) then
FP_MC_PROTOCOL_READ(Port := iPort,
SourceMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,
SourceMemoryOffset := diMemoryOffset,
Words_Bits := Size_Of_Var(awValues),
Destination => awValues, Result => iResult);
End_if;