<< 点击显示目录 >> 主页 ModbusTCP库使用说明 > 例程与用例 > ST > MBserver应用Demo > MbTCPSlave.st |
(*!
* @file MbTCPSlave.st
* @brief ModbusTCP Slave端示例代码
* @date 创建于:2021.01.18;最后修改日期:2022.07.12
* @version V1.00.6
* @author YZY
* @copyright B&R
*)
(*! History
*****************************************************************************
* 2021.01.18 V1.00.1 YZY
* (new) 初步实现
* 2021.11.26 V1.00.2 YZY
* (new) 调整接口
* 2021.12.30 V1.00.3 YZY
* (new) 增加大索引的测试
* 2021.12.31 V1.00.4 YZY
* (new) 增加对04读80个数据命令进行测试
* 2022.01.04 V1.00.5 YZY
* (new) 根据王鹏飞的反馈,增加一些注释信息。
* 2022.07.12 V1.00.6 YZY
* (new) 增加寄存器数据
******************************************************************************
*)
PROGRAM _INIT
(*********************************************************************)
(* 端口号设定 *)
(*********************************************************************)
//此端口默认可不设置,仅在测试场景,需一台设备多Slave任务时才需要修改。
Ctrl.Para.uServPort := 502;
(*********************************************************************)
(* 存储数据赋值 *)
(* 需注意,为测试观察方便,索引值为0~MAX_MBTCP_REGISTERS_NUM *)
(* 实际使用请自行调整ModbusTCP库中的MAX_MBTCP_REGISTERS_NUM数据大小 *)
(*********************************************************************)
FOR i := 0 TO MAX_MBTCP_REGISTERS_NUM DO
modbus_server_cfg.unit.p_discrete_inputs[i] := ADR(Ctrl.Status.Data.Slave_DI_Data[i]);//只读,对应寄存器地址10001开始的,从PLC(Server)中读到上位机(Client)的BOOL变量,比如上位读取PLC的报警信息。
modbus_server_cfg.unit.p_coils[i] := ADR(Ctrl.Status.Data.Slave_DO_Data[i]);//读写,对应寄存器地址00001开始的,是从上位(Client)写入到PLC(Server)中的BOOL变量,比如上位发给PLC的启停命令。
modbus_server_cfg.unit.p_input_registers[i] := ADR(Ctrl.Status.Data.Slave_AI_Data[i]);//只读,对应寄存器地址30001开始的,是从PLC(Server)中读到上位机(Client)的整形变量(16位),一一对应。比如上位读取PLC的一些电机温度,实际电机扭矩。
modbus_server_cfg.unit.p_holding_registers[i] := ADR(Ctrl.Status.Data.Slave_AO_Data[i]);//读写,对应寄存器地址40001开始的,是从上位机(Client)写入到PLC(Server)中的整形变量(16位),一一对应,比如上位输入的一些参数,如电机动作指令。
END_FOR;
END_PROGRAM
PROGRAM _CYCLIC
(************************************************************)
(* 随机数产生 以及测试数据准备 *)
(************************************************************)
Ctrl.Status.Data.Slave_AO_Data[0] := UINT_TO_INT(guChangeCount); //全局变量,以1ms更新,用以判断更新频率
Ctrl.Status.Data.Slave_AO_Data[1] := RandINT();
Ctrl.Status.Data.Slave_AO_Data[2] := RandINT();
Ctrl.Status.Data.Slave_AO_Data[3] := RandINT();
Ctrl.Status.Data.Slave_AO_Data[122] := RandINT();
Ctrl.Status.Data.Slave_AO_Data[123] := RandINT();
Ctrl.Status.Data.Slave_AO_Data[124] := RandINT();
Ctrl.Status.Data.Slave_AO_Data[125] := RandINT();
Ctrl.Status.Data.Slave_AO_Data[126] := 127;
Ctrl.Status.Data.Slave_DI_Data[0] := TRUE;
Ctrl.Status.Data.Slave_AI_Data[5] := 123;
Ctrl.Status.Data.Slave_AI_Data[6] := 456;
FOR i := 7 TO 80 DO
Ctrl.Status.Data.Slave_AI_Data[i] := i;
END_FOR;
Ctrl.Status.Data.Slave_AI_Data[80] := 80;
Ctrl.Status.Data.Slave_AO_Data[1997] := RandINT();
Ctrl.Status.Data.Slave_AO_Data[1998] := 789;
(*--大范围数据验证--*)
Ctrl.Status.Data.Slave_AO_Data[39997] := RandINT();
Ctrl.Status.Data.Slave_AO_Data[39996] := RandINT();
Ctrl.Status.Data.Slave_AO_Data[49996] := 4321;
Ctrl.Status.Data.Slave_AI_Data[49996] := 1234;
Ctrl.Status.Data.Slave_DI_Data[49996] := TRUE;
Ctrl.Status.Data.Slave_DO_Data[49996] := TRUE;
(************************************************************)
(* Slave核心调用程序段 *)
(************************************************************)
(*! 注意事项
*************************************************************
* 为避免在线更新程序后通信异常,建议将以下代码放在独立的任务中
* 避免与业务逻辑代码放在一起被在线更新
*************************************************************
*)
FB_MBserver_0.enable := TRUE;
FB_MBserver_0.serverPort := Ctrl.Para.uServPort;
FB_MBserver_0.TimeOut := 500;
FB_MBserver_0.p_cfg := ADR(modbus_server_cfg);
FB_MBserver_0();
Ctrl.Status.bRunOK := NOT(UINT_TO_BOOL(FB_MBserver_0.status));
END_PROGRAM
PROGRAM _EXIT
END_PROGRAM