贝加莱ModbusTCP通信东崎T620A温控模块
工控笔记
前言
本来没有打算会写这文章的。也是因为一个项目,客户原来考虑用台达的DTM温控模块,我也大致的规划了贝加莱的程序,里面DTM里面的的自定义地址的方式来实现项目的需要。谁知客户临时变更为东崎电气的T620A温控模块,而且这个模块是一个模块16路,客户需要用四块模块共64路。单服务器的项目用的多,多服务器访问的还真是没有试过。所以今晚就花时间搞了一下。基本搞定了,所以就想记录一下贝加莱控制器ModbusTCP客户端访问多个服务器的方式。
正文
项目中采用的还是贝加莱BR Help上共享的ModbusTCP的库。有需要的自行上贝加莱帮助网站上获取。
新建一个程序Pro_TC1
TYPE
Ctrl_typ : STRUCT
Para : Ctrl_Para_typ;
Status : Ctrl_Status_typ;
END_STRUCT;
Ctrl_Status_typ : STRUCT
bRunOK : BOOL;
Data : Ctrl_Status_Data_typ;
END_STRUCT;
Ctrl_Status_Data_typ : STRUCT
Slave_PV : ARRAY[1..16]OF INT;
Slave_SV : ARRAY[1..16]OF INT;
Slave_SW : ARRAY[1..16]OF INT;
Slave_ST : ARRAY[1..16]OF INT;
Slave_State : ARRAY[1..42]OF INT;
Slave_P : ARRAY[1..16]OF INT;
Slave_I : ARRAY[1..16]OF INT;
Slave_D : ARRAY[1..16]OF INT;
END_STRUCT;
Ctrl_Para_typ : STRUCT
sIP : STRING[16];
uServPort : UINT;
uUsePort : UINT;
END_STRUCT;
END_TYPE
VAR
ModbusTCP_Client : MBclient;
Para_MbTCP : modbus_client_cfg_typ;
Ctrl : Ctrl_typ;
iTC : INT;
iNum : INT;
bST : ARRAY[1..16] OF BOOL;
bSW : ARRAY[1..16] OF BOOL;
END_VAR
PROGRAM _INIT
(* Insert code here *)
//TCP
(************************************************************)
(* 连接Slave IP | 端口号设定 *)
(************************************************************)
Ctrl.Para.sIP := '192.168.5.51' ; //服务器IP
Ctrl.Para.uServPort := 502 ; //服务器端口
Ctrl.Para.uUsePort := Ctrl.Para.uServPort + 50 ;
//读当前温度
Para_MbTCP.action_enable[0].cyclic := 1 ;
Para_MbTCP.action_enable[0].single := 0 ;
Para_MbTCP.action_param[0].type := 3 ;
Para_MbTCP.action_param[0].start_addr := 8192 ;
Para_MbTCP.action_param[0].quantity := 16 ;
Para_MbTCP.action_param[0].p_pv := ADR(Ctrl.Status.Data.Slave_PV[1]);
Para_MbTCP.action_param[0].timer := 10;
//写设定温度
Para_MbTCP.action_enable[1].cyclic := 1 ;
Para_MbTCP.action_enable[1].single := 0 ;
Para_MbTCP.action_param[1].type := 16 ;
Para_MbTCP.action_param[1].start_addr := 8464 ;
Para_MbTCP.action_param[1].quantity := 16 ;
Para_MbTCP.action_param[1].p_pv := ADR(Ctrl.Status.Data.Slave_SV[1]);
Para_MbTCP.action_param[1].timer := 10;
//写温度开关
Para_MbTCP.action_enable[2].cyclic := 1 ;
Para_MbTCP.action_enable[2].single := 0 ;
Para_MbTCP.action_param[2].type := 16 ;
Para_MbTCP.action_param[2].start_addr := 8576 ;
Para_MbTCP.action_param[2].quantity := 16 ;
Para_MbTCP.action_param[2].p_pv := ADR(Ctrl.Status.Data.Slave_SW[1]);
Para_MbTCP.action_param[2].timer := 10;
//写整定开关
Para_MbTCP.action_enable[3].cyclic := 1 ;
Para_MbTCP.action_enable[3].single := 0 ;
Para_MbTCP.action_param[3].type := 16 ;
Para_MbTCP.action_param[3].start_addr := 8592 ;
Para_MbTCP.action_param[3].quantity := 16 ;
Para_MbTCP.action_param[3].p_pv := ADR(Ctrl.Status.Data.Slave_ST[1]);
Para_MbTCP.action_param[3].timer := 10;
//(*
//读状态
Para_MbTCP.action_enable[4].cyclic := 1 ;
Para_MbTCP.action_enable[4].single := 0 ;
Para_MbTCP.action_param[4].type := 3 ;
Para_MbTCP.action_param[4].start_addr := 8208 ;
Para_MbTCP.action_param[4].quantity := 16 ;
Para_MbTCP.action_param[4].p_pv := ADR(Ctrl.Status.Data.Slave_State[1]);
Para_MbTCP.action_param[4].timer := 10;
//读P
Para_MbTCP.action_enable[5].cyclic := 1 ;
Para_MbTCP.action_enable[5].single := 0 ;
Para_MbTCP.action_param[5].type := 3 ;
Para_MbTCP.action_param[5].start_addr := 10256 ;
Para_MbTCP.action_param[5].quantity := 16 ;
Para_MbTCP.action_param[5].p_pv := ADR(Ctrl.Status.Data.Slave_P[1]);
Para_MbTCP.action_param[5].timer := 10;
//读I
Para_MbTCP.action_enable[6].cyclic := 1 ;
Para_MbTCP.action_enable[6].single := 0 ;
Para_MbTCP.action_param[6].type := 3 ;
Para_MbTCP.action_param[6].start_addr := 10272 ;
Para_MbTCP.action_param[6].quantity := 16 ;
Para_MbTCP.action_param[6].p_pv := ADR(Ctrl.Status.Data.Slave_I[1]);
Para_MbTCP.action_param[6].timer := 10;
//读I
Para_MbTCP.action_enable[7].cyclic := 1 ;
Para_MbTCP.action_enable[7].single := 0 ;
Para_MbTCP.action_param[7].type := 3 ;
Para_MbTCP.action_param[7].start_addr := 10288 ;
Para_MbTCP.action_param[7].quantity := 16 ;
Para_MbTCP.action_param[7].p_pv := ADR(Ctrl.Status.Data.Slave_D[1]);
Para_MbTCP.action_param[7].timer := 10;
//*)
END_PROGRAM
PROGRAM _CYCLIC
(* Insert code here *)
ModbusTCP_Client.enable := TRUE ;
ModbusTCP_Client.port := Ctrl.Para.uUsePort ;
ModbusTCP_Client.serverPort := Ctrl.Para.uServPort ;
ModbusTCP_Client.p_cfg := ADR(Para_MbTCP);
ModbusTCP_Client.receive_timeout := 2000 ;
ModbusTCP_Client.server_ip_addr := Ctrl.Para.sIP ;
ModbusTCP_Client.unit_id ;
ModbusTCP_Client();
FOR iNum := 1 TO 16 DO
Ctrl.Status.Data.Slave_SV[iNum] := REAL_TO_INT(gPara.Temp.rSV[iNum]) ;
IF bSW[iNum] THEN
Ctrl.Status.Data.Slave_SW[iNum] := TRUE ;
ELSE
Ctrl.Status.Data.Slave_SW[iNum] := FALSE ;
END_IF ;
IF bST[iNum] THEN
Ctrl.Status.Data.Slave_ST[iNum] := TRUE ;
ELSE
Ctrl.Status.Data.Slave_ST[iNum] := FALSE ;
END_IF ;
END_FOR ;
END_PROGRAM
PROGRAM _EXIT
(* Insert code here *)
END_PROGRAM
这样子就完成了一个东崎T620A温控模块的常规使用了。现在你需要几个模块,就直接复制多几个程序,并在程序的Init段进行站号的端口的变更即可,当然这需要模块也对应的进行IP地址的和端口的变更。
结尾
其实,我想说贝加莱的温控是很强的,无奈现在各行各业都对成本的敏感,不过贝加莱依旧有多种适配的方式。