从MCU端口读取数据
使用此指令可将复合通信单元从外部设备接收的数据复制到CPU的接收缓冲区。在s_Port指定MCU的通信端口。接收缓冲区由d1_Start和d2_End定义。
输入
指定数据传输到的MCU的插槽编号(高位字节)和端口号(低位字节)。
16#xx01:插槽16#xx中MCU上的COM1
16#xx02:插槽16#xx中MCU上的COM2
接收缓冲区的起始地址
接收缓冲区的结束地址
除非已通过评估"接收完成"标志确认接收结束,否则请勿执行F161_MRCV。使用F161_MRCV轮询数据无法正确工作!可以使用IsReceptionDone和IsReceptionDoneByTimeOut函数或通过评估输入(X)标志X0和X2评估“接收完成”标志。
接收字节数存储在由接收缓冲区的d1_Start指定的初始地址中。如果接收数据超过由b2_End指定的结束地址,则检测到运算错误。将存储在d2_End接收到的数据。F161_MRCV还会清除接收缓冲区,复位"接收完成"标志并允许进一步接收数据。
F161_MRCV受所有PLC支持:如果使用合适的函数代替标志,即可创建PLC独立程序,用于处理CPU通信端口以及MCU端口的通信。不使用MCU端口的PLC根本不转化F161_MRCV指令。对于易于阅读的程序,建议使用ReadData或ReadCharacters函数。
如果使用索引寄存器指定的区域超出限制。
如果指定插槽中不存在MCU单元或应发送零字节。
如果指定的通信端口不存在
如果使用索引寄存器指定的区域超出限制。
如果指定插槽中不存在MCU单元或应发送零字节。
如果指定的通信端口不存在
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
ReadReceivedData: BOOL:=FALSE;
ReceiveBuffer: ARRAY [0..10] OF INT:=[11(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 := 8 ;
NETWORK_BODY
B(B_F,F161_MRCV!,,17,2,24,8,,?DEN?Ds_Port?Dd1_Start?Dd2_End?AENO);
B(B_VARIN,,ReadReceivedData,15,3,17,5,);
B(B_VARIN,,16#0201,15,4,17,6,);
B(B_VARIN,,ReceiveBuffer[0],15,5,17,7,);
B(B_VARIN,,ReceiveBuffer[10],15,6,17,8,);
B(B_COMMENT,,The received data of port 1 of the MCU in slot 2 are read:,2,1,32,2,);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_F,F161_MRCV!,,17,0,24,6,,?DEN?Ds_Port?Dd1_Start?Dd2_End?AENO);
B(B_VARIN,,ReadReceivedData,15,1,17,3,);
B(B_VARIN,,16#0301,15,2,17,4,);
B(B_VARIN,,ReceiveBuffer,6,4,8,6,);
B(B_F,Adr_Of_Var_I!,,10,3,17,5,,?D?C);
B(B_F,AdrLast_Of_Var_I!,,8,4,17,6,,?D?C);
L(1,0,1,6);
L(8,4,8,5);
L(8,4,10,4);
END_NETWORK_BODY
END_NET_WORK
END_BODY