通过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)
传输方法因Destination的数据类型而异。
在Destination |
传输方法 |
传输数据的数量 |
标注 |
---|---|---|---|
16位内存区 WX、WY、WR、WL、DT、LD |
字传输 |
1-960字 |
|
1位内存区 X,Y,R,L,DT,n,LD,n |
位传输 |
1-7168位 |
当传输数据的数量为奇数时,系统将添加4位虚拟代码16#0。 |
输出
写入请求数据的主站单元上的字区域或寄存器。
仅对于FP7:
0:正常完成
1:通信端口用于主站通信
2:通信端口用于从站通信
3:已超过可同时使用的最大主站通信指令数
4:传输超时
5:等待响应时超时
6:收到的数据出错
当接收到异常电报时,例如当标题中出现格式错误时,就会发生此错误。在这种情况下,将丢弃收到的数据。
7:I/O映射中保留的区域不足
当以太网连接数超过16(高级以太网通信)时,会发生此错误。检查为通信控制标志保留的字区域是否足以容纳一定数量的以太网连接。
8:发送当前正在使用的缓冲区
固件版本为4.57或更高版本的FP7 PLC可能会出现此错误。
如果出现通信错误,系统可能会设置MC协议特定的其他错误代码。如需了解详细信息,请参阅所用PLC的文档。
对于其他PLC:设置为0
发送过程中:主站通信发送标志为TRUE
发送完成后:主站通信发送标志为FALSE
正常完成:FALSE
异常完成:TRUE
如果使用索引寄存器指定的区域超出限制。
如果以太网端口不正确或以太网连接已关闭。
如果由Words_Bits指定的发送数据量错误。
如果使用索引寄存器指定的区域超出限制。
如果以太网端口不正确或以太网连接已关闭。
如果由Words_Bits指定的发送数据量错误。
所有用于编程此函数的输入和输出变量已在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;