博文

贝加莱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地址的和端口的变更。

结尾

其实,我想说贝加莱的温控是很强的,无奈现在各行各业都对成本的敏感,不过贝加莱依旧有多种适配的方式。

← 返回博文列表