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
因篇幅问题不能全部显示,请点此查看更多更全内容