FP_READ_FROM_SLAVE

从从站中读取数据

使用此指令,通过采用MEWTOCOL-COM或Modbus RTU协议的通信端口,如所用端口的系统寄存器中所定义,从从站请求数据。确保对主站和从站设置相同的协议。主站和从站必须具有匹配的内存区。如果无法在主站的用户区域使用从站数据,请使用FP_READ_FROM_SLAVE_AREA_OFFSFP_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 = 插槽编号)

StationNumber (WORD, INT, UINT)

从站的站号MEWTOCOL:1–99,MODBUS:1-255)

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

SlaveAddress (WORD, INT, UINT)

请求数据的从站上的源地址。

输出

Destination (ANY)

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

Result (ANY)
  • 仅对于FP7
    • 0:正常完成

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

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

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

    • 4:发送超时

    • 5:响应接收超时

    • 6:接收数据错误

  • 对于其他PLC:设置为0

时间图

  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)
  • 如果从站或主站数据超出可用地址范围。

  • 如果通信模式未被设置为MEWTOCOL-COM主站/从站或Modbus RTU主站/从站。

  • 如果所选的COM端口需要尚未安装的通信插件。

sys_bIsOperationErrorNonHold(对于一次扫描变为TRUE)
  • 如果从站或主站数据超出可用地址范围。

  • 如果通信模式未被设置为MEWTOCOL-COM主站/从站或Modbus RTU主站/从站。

  • 如果所选的COM端口需要尚未安装的通信插件。

示例

全局变量

在全局变量列表中,定义项目中所有POU都可以访问的变量。

POU头

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

	VAR_EXTERNAL
		g_Peripherie_SlaveResult_Address: ARRAY[0..9] OF REAL:=[10(0)];
	END_VAR
	VAR
		bReadResult: BOOL:=FALSE;
		wReadFromSlaveResult: WORD:=0;
			(*result of write to slave instruction*)
		iSlaveStationNumber: INT:=0;
			(*slave station number*)
		arrResults: ARRAY [0..9] OF REAL:=[10(0.0)];
			(*Array of results to be read from slave station*)
		iSlaveMemoryArea: INT:=5;
			(*memory Area in slave station*)
		iSlaveMemoryOffset: INT:=100;
		iSlaveMemorySize: INT:=1;
	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 := 8 ;
        NETWORK_BODY
B(B_VARIN,,SYS_COM1_PORT,19,2,21,4,);
B(B_VARIN,,iSlaveStationNumber,19,3,21,5,);
B(B_CONTACT,,bReadResult,8,1,10,3,);
B(B_VAROUT,,wReadFromSlaveResult,38,3,40,5,);
B(B_VAROUT,,arrResults,38,2,40,4,);
B(B_F,FP_READ_FROM_SLAVE!,,21,0,33,6,,?DEN?DnPort?DStationNumber?DSlaveAddress?AENO?CDestination?CResult);
B(B_VARIN,,g_Peripherie_SlaveResult_Address,19,4,21,6,);
L(1,2,8,2);
L(10,2,21,2);
L(33,3,38,3);
L(33,4,38,4);
L(1,0,1,8);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

ST本体

if (bReadResult) then
    FP_READ_FROM_SLAVE(Port := SYS_COM1_PORT, StationNumber := iSlaveStationNumber,
                       SlaveAddress := g_Peripherie_SlaveResult_Address, Destination => arrResults[0], 
                       Result => wReadFromSlaveResult);
end_if;

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