MbTCPSlave.st

<< 点击显示目录 >>

主页  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