您的当前位置:首页正文

Modbus通信程序源程序文档

2022-12-12 来源:品趣旅游知识分享网


ModbusServer 源程序文档

一、ModbusServer程序的功能:

ModbusServer主要实现与站内网络modbus装置的通信功能,负责对所有站内设备的数据采集,入库等处理;同时接收来自前置的遥控操作,定值修改等命令,并转发给装置。

二、ModbusServer程序的执行流程:

ModbusServer首先需要进行设备信息初始化,包括所属设备对应模板的通信参数配置信息。其配置文件路径是H:\\Galasys\\Sys\\Modbus_Param.sy,根据modbus规约通信特点,配置了读写各数据类型的功能码、寄存器起始地址、包含数据个数、子设备号及数据类型。对于遥测及遥信数据,程序周期读取。Modbus_Param.sy通信配置文件的格式及说明如下:

1

三、ModbusServer程序中的主要类的功能:

(1) CMainProcess类:主程序框架类,完成通信配置参数的初始化,通道初始化,并启动通信规约线程;

(2)CChannelPool类:通信池类,实现对通信池中所有单元的管理与操作,一个通信池中最多包含对32单元设备的管理;

(3)StandardModbus类:modbus通信类,实现对modbus装置数据的请求及报文的解析;

(4)CDataOper类:数据操作类,提供数据库的各种操作接口;

四、ModbusServer程序中主要结构体及函数说明

/*寄存器读取信息结构体*/

struct ModbusReadParam

{

int fun_code; //读取功能码

2

int start_adr; //要读取的寄存器起始地址

int data_num; //读取的遥测量或遥信量数目

int data_type; //类型 DT_BOOL、DT_CHAR、DT_WORD、DT_DWORD

//DT_DWORD

int sub_addr; //子设备号

int begin_Pos; //此次读取点在库中点号偏移(从0起), 在读取模板时进行初始化

};

/*Modbus通信参数配置结构体*/

struct ModbusParam

{

char Module_name[16]; //模板名称

int NetRole; //网络角色 0-TCP SERVER;1-TCP CLIENT

int NetPort; //TCP端口号

3

ModbusReadParam * yx_ReadParam; //每台装置遥信读取信息

int yx_ReadCount; //每台装置遥信读取次数

ModbusReadParam * yc_ReadParam; //每台装置遥测读取信息

int yc_ReadCount; //每台装置遥测读取次数

ModbusReadParam * yk_ReadParam; //遥控信息

int yk_ReadCount; //遥控配置信息数目

ModbusReadParam * yt_ReadParam;//遥调信息

int yt_ReadCount; //遥调配置信息数目

int yx_start_adr; //起始地址范围>=1

int yx_max_num;

int yc_start_adr; //起始地址范围>=1

int yc_max_num;

int yk_start_adr; //起始地址范围>=1

4

int yk_max_num;

int yt_start_adr; //起始地址范围>=1

int yt_max_num;

};

/*Modbus模板参数配置信息,Modbus_Param.sys中所配置参数*/

struct ModbusModule

{

int Module_num;

ModbusParam *m_paramlst;

};

/*遥控遥调操作信息结构体*/

struct str_ykyt_value

{

5

int start_addr; //起始地址

char sub_addr; //子设备号

int ID; //点号(从1起)

//值

union

{

DWORD yk_value;

float yt_value;

};

/*

//遥控遥调操作过程状态

#define RECV_STATUS #define DOWN_STATUS

//接收到命令

2 //下发命令

6

1

#define SUCCESS_STATUS 3 //返校成功

#define FAILE_STATUS 4 //返校失败

*/

char status; //操作进度状态

char opr_cfg_id; //配置ID

};

 int CMainProcess::Run(void);

功能:主程序框架类的入口程序,完成对程序相关信息的初始化及通信规约各线程的启动。

 int CMainProcess::Init_ModbusModule();

功能:读取通信配置文件Modbus_Param.sys,对modbus通信参数进行初始化。

 int CMainProcess::InitChannelPool(OdbSysTab &odb);

功能:检索规约通道表,并创建规约线程ModbusProcess_Thread

参数:OdbSysTab &odb 实时库指针;

7

 int CMainProcess::InitNodesPool(OdbSysTab &i_odb);

功能: 初始化其单元池nodepool

参数:OdbSysTab &odb 实时库指针;

.

 int CMainProcess::TcpClientThread(void);

功能:客户端连接线程(modbus主站属于TCP客户端),根据装置当前通信状态,循环连接装置,建立tcp连接,并将连接信息转发所属通信池;

 int CMainProcess::RecvMnetProcess(void)

功能:接收下行报文,比如来自前置的命令,然后插入到具体某个单元的nodepool中, 然后各个线程Process中的函数ProcessDownReport获取其单元池中的下行报文经ProcessTeleToNode处理;

 int CMainProcess::ProcessSession(CChannelPool *pool);

功能:下行找到某个单元&当前有报文正在处理, 其报文处理中的事务状态 有值的,进行组包下行。一般适用于:某个类型操作,需要连续分多步交互的情形,例如:召录波等。

参数:CChannelPool *pool 通信池指针

8

 int StandardModbus::ProcessTeleToNode(const char

*system_info,const unsigned int system_info_len,char *&ptele,unsigned int &itele, const char* src_info);

功能:检测并解析来自后台的命令,有命令则下发给modbus装置,否则循环读取装置的遥测、遥信数据;

 int StandardModbus::ProcessZCHTeleToNode(char *&ptele,unsigned int &itele,char zch_type);

功能:请求遥测或遥信数据

 int CMainProcess::ProcessUpReportEx(CChannelPool *pool, int index);

功能: 调用DLL函数ProcessUp将此单元池的接收缓冲区取出报文解析,然后再调用ProcessTeleToSystem解析后发送至后台其他进程,更新入库等。

 int StandardModbus::ProcessTeleToSystem(const char *ptele,const unsigned int itele,char *&pinfo,unsigned int &iinfo,char &respon_checkok);

功能: 解析装置返送的报文,并做入库等相应的处理;

9

因篇幅问题不能全部显示,请点此查看更多更全内容