////////////////////////////////////////////////////////////////////////////// ////// ////// ////// 作 者: Wangjianfeng; ////// ////// 创建时间: 2011-02-26 ; ////// ////// 说 明: EmersonUPS NXL协议 ; ////// ////// ////// ////// 修改时间: 2011-02-26 ; ////// ////// 修改说明: 无; ////// ////// ////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// #ifndef __UPS_NXL__ #define __UPS_NXL__ #pragma once #include "CommProcess.h" #include "CommInterface.h" class CUPS_NXL :public CCommInterface { #define DEBUG_UPSNXL 0 //.1.调试开关; #define MAX_CID 2 //.+.最大的CID2长度; #define VAR_MSG_LENGTH 255 //.2.数组数据长度; #define SEND_MSG_LENGTH 32 //.3.发送数据的最大长度; #define RECE_MSG_LENGTH 255 //.4.接收数据的最大长度; //.RTN返回码意义; enum ___EEROR_CODE_RTN { RTN_NORMAL = 0x00, //.1.正常; RTN_VER_ERRROR, //.2.VER(版本)错误; RTN_CHKSUM_ERROR, //.3.校验码错误; RTN_LCHKSUM_EEROR, //.4.长度校验码错误; RTN_CID2_INVALID, //.5.CDI2无效; RTN_COMMAND_FORMAT_EEROR, //.6.命令格式错误; RTN_INVALID_DATA, //.7.无效数据; RTN_INVALID_LIMIT =0x10 //.8.无效权限; }; enum __ERRO_CODE_COMM { ERR_CODE_COM_FAULT = 50201 , //.1.设备串口通信故障; ERR_CODE_COM_BUSY , //.2.设备串口通信忙; ERR_CODE_COM_READ_NO_DATA , //.3.设备没有读到数据; ERR_CODE_COM_READ_LEN_OVER , //.4.设备读到数据长度超时限制; ERR_CODE_COM_LRC_LOST , //.5.设备lrc校验失败; EER_CODE_COM_WRITE_DATA , //.6.设备写串口错误; EER_CODE_COM_REGNUM , //.7.设备寄存器数; ERR_CODE_COM_VARLEN , //.8.设备变量长度非法; ERR_CODE_COM_INVALIDRES , //.9.设备无效应答; }; typedef struct __HEAD_SOI_ { BYTE Soi ; BYTE Ver[2]; BYTE Adr[2]; BYTE Cid1[2]; }__soi; typedef struct __END_EOI { BYTE ChkSum[4]; BYTE Eoi; }__eoi; //.请求设备; typedef struct __REQUSE_READ_ { __soi heads; BYTE Cid2[2]; BYTE Length[4]; __eoi endof; }__request_read; //.设备响应; typedef struct __RESPONES_READ_ { __soi heads; BYTE Rtn[2]; BYTE Length[4]; BYTE Info[RECE_MSG_LENGTH]; __eoi endof; }__respones_read; public: CUPS_NXL( char szPath[MAX_PATH], //.1. 程序所在路径; char szIniName[MAX_PATH], //.2. 配置文件名称; int iCommPort, //.3. 串行端口; int iAddr, //.4. 设备地址; int iRate, //.5. 波特率; int iDataBit, //.6. 数据位; int iStopBit, //.7. 停止位; int iParity, //.8. 校验位; int iInterval //.9. 时间间隔; ); virtual ~CUPS_NXL() { #if IS_USE_READMSG_CS DeleteCriticalSection(&m_csReadMsg); #endif MTVERIFY(CloseHandle(m_hSemComm)); CloseComm(); }; private: HANDLE m_hSemComm; //.串口读写事件对象; #if IS_USE_READMSG_CS CRITICAL_SECTION m_csReadMsg; //.临界值; #endif BOOL m_dwOnlineTick[MAX_ADDR]; //.1.在线标号; BOOL m_devOnline[MAX_ADDR]; //.2.设备是否在线; protected: char m_szNXL_42HMsg[MAX_ADDR][RECE_MSG_LENGTH]; //.1.获取模拟量量化数据(定点数); char m_szNXL_43HMsg[MAX_ADDR][RECE_MSG_LENGTH]; //.2.获取开关量输入状态 ; char m_szNXL_44HMsg[MAX_ADDR][RECE_MSG_LENGTH]; //.3.获取告警量输入状态 ; char m_szNXL_E0HMsg[MAX_ADDR][RECE_MSG_LENGTH]; //.4.获取系统模拟量量化数据(定点数,厂家自定义模拟量 1); char m_szNXL_E1HMsg[MAX_ADDR][RECE_MSG_LENGTH]; //.5.获取自定义模拟量量化数据1(定点数); char m_szNXL_E2HMsg[MAX_ADDR][RECE_MSG_LENGTH]; //.6.获取自定义模拟量量化数据2(定点数); char m_szNXL_E3HMsg[MAX_ADDR][RECE_MSG_LENGTH]; //.7.获取自定义模拟量量化数据3(定点数); char m_szNXL_ECHMsg[MAX_ADDR][RECE_MSG_LENGTH]; //.8.获取自定义告警量 ; char m_szNXL_EEHMsg[MAX_ADDR][RECE_MSG_LENGTH]; //.9.获取系统设置参数数据(厂家自定义帧) ; public: //.发送请求设备数据; int SendReadRequest( char szPath[MAX_PATH], // 1.程序所在路径; char szIniName[MAX_PATH], // 2.配置文件名称 ; int nCommPort, // 3.串行端口; int nAddr, // 4.设备地址; char szCmd[MAX_CMD], // 5.请求命令; char szMsg[VAR_MSG], // 6.响应的值 ; int nReversed1, // 7.预留整形参数1接口; int nReversed2, // 8.预留整形参数2接口; int nReversed3, // 9.预留整形参数3接口; int nReversed4, // 10.预留整形参数4接口; int nReversed5, // 11.预留整形参数5接口; float fReversed1, // 12.预留float参数1接口; float fReversed2, // 13.预留float参数2接口; float fReversed3, // 14.预留float参数3接口; char szReversed1[MAX_RESERVED1], // 15.预留字符数组参数1接口; char szReversed2[MAX_RESERVED2], // 16.预留字符数组参数2接口; char szReversed3[MAX_RESERVED3], // 17.预留字符数组参数3接口; char szReversed4[MAX_RESERVED4], // 18.预留字符数组参数4接口; char szReversed5[MAX_RESERVED5] // 19.预留字符数组参数5接口; ); //.发送设置设备参数请求; int SendSetReuest( char szPath[MAX_PATH], // 1.程序所在路径; char szIniName[MAX_PATH], // 2.配置文件名称 ; int nCommPort, // 3.串行端口; int nAddr, // 4.设备地址; char szCmd[MAX_CMD], // 5.请求命令; char szRecvMsg[VAR_MSG], // 6.响应的值; int nReversed1, // 7.预留整形参数1接口; int nReversed2, // 8.预留整形参数2接口; int nReversed3, // 9.预留整形参数3接口; int nReversed4, // 10.预留整形参数4接口; int nReversed5, // 11.预留整形参数5接口; float fReversed1, // 12.预留float参数1接口; float fReversed2, // 13.预留float参数2接口; float fReversed3, // 14.预留float参数3接口; char szReversed1[MAX_RESERVED1], // 15.预留字符数组参数1接口; char szReversed2[MAX_RESERVED2], // 16.预留字符数组参数2接口; char szReversed3[MAX_RESERVED3], // 17.预留字符数组参数3接口; char szReversed4[MAX_RESERVED4], // 18.预留字符数组参数4接口; char szReversed5[MAX_RESERVED5] // 19.预留字符数组参数5接口; ); //.打开串口; BOOL NxlOpenComm(int nCommPort, int nAddr, int nRate, int nDataBit, int nStopBit, int nParity, int nInterval); //.获取ini文件分键信息; int GetNXL_ini_info( char szPath[MAX_PATH], //.1.服务器程序所在目录; char szIniName[MAX_PATH], //.2.配置文件名; char szCmd[MAX_CMD], //.3.命令; char szCID2[MAX_CID], //.4.CID2; char nType[MAX_CMD], //.5.数据类型; int &nIndex, //.6.索引; int &nLen //.7.截取长度; ); protected: int GetEquipmentParamter(CCommProcess *pCom,int iAddr,char szCmd[MAX_CMD],char szCID2[MAX_CID]); //.0.获取设备传进的请求信息; int Request_ReadStatus(CCommProcess *pCom,int iAddr,char szCmd[MAX_CMD],char szCID2[MAX_CID]); //.1.向设备发送请求命令; int Response_ReadStatus(CCommProcess *pCom,int iAddr,char szCmd[MAX_CMD]); //.2.接收请求设备响应数据; protected: int SetEquipmentParamter(CCommProcess *pCom,int iAddr,char szCmd[MAX_CMD],char szCID2[MAX_CID],char szRecvMsg[RECE_MSG_LENGTH]);//.0.获取设备传进的设置信息; int Request_WirteStatus(CCommProcess *pCom,int iAddr,char szCmd[MAX_CMD]); //.1.向设备发送设置命令; int Respones_WirteStatus(CCommProcess *pCom,int iAddr,char szCmd[MAX_CMD]); //.2.接收设置设备的响应数据; protected: int Get_NXL_42_VarMsg(int iAddr,char szCmd[MAX_CMD],char szRecvMsg[RECE_MSG_LENGTH],int &iIndex,int &iLen,char szTy[TYPE_LENGTH]); int Get_NXL_43_VarMsg(int iAddr,char szCmd[MAX_CMD],char szRecvMsg[RECE_MSG_LENGTH],int &iIndex,int &iLen,char szTy[TYPE_LENGTH]); int Get_NXL_44_VarMsg(int iAddr,char szCmd[MAX_CMD],char szRecvMsg[RECE_MSG_LENGTH],int &iIndex,int &iLen,char szTy[TYPE_LENGTH]); int Get_NXL_E0_VarMsg(int iAddr,char szCmd[MAX_CMD],char szRecvMsg[RECE_MSG_LENGTH],int &iIndex,int &iLen,char szTy[TYPE_LENGTH]); int Get_NXL_E1_VarMsg(int iAddr,char szCmd[MAX_CMD],char szRecvMsg[RECE_MSG_LENGTH],int &iIndex,int &iLen,char szTy[TYPE_LENGTH]); int Get_NXL_E2_VarMsg(int iAddr,char szCmd[MAX_CMD],char szRecvMsg[RECE_MSG_LENGTH],int &iIndex,int &iLen,char szTy[TYPE_LENGTH]); int Get_NXL_E3_VarMsg(int iAddr,char szCmd[MAX_CMD],char szRecvMsg[RECE_MSG_LENGTH],int &iIndex,int &iLen,char szTy[TYPE_LENGTH]); int Get_NXL_EC_VarMsg(int iAddr,char szCmd[MAX_CMD],char szRecvMsg[RECE_MSG_LENGTH],int &iIndex,int &iLen,char szTy[TYPE_LENGTH]); int Get_NXL_EE_VarMsg(int iAddr,char szCmd[MAX_CMD],char szRecvMsg[RECE_MSG_LENGTH],int &iIndex,int &iLen,char szTy[TYPE_LENGTH]); protected: int Set_NXL_42_VarMsg(int iAddr,char szCmd[MAX_CMD],char *szRecvMsg); int Set_NXL_43_VarMsg(int iAddr,char szCmd[MAX_CMD],char *szRecvMsg); int Set_NXL_44_VarMsg(int iAddr,char szCmd[MAX_CMD],char *szRecvMsg); int Set_NXL_E0_VarMsg(int iAddr,char szCmd[MAX_CMD],char *szRecvMsg); int Set_NXL_E1_VarMsg(int iAddr,char szCmd[MAX_CMD],char *szRecvMsg); int Set_NXL_E2_VarMsg(int iAddr,char szCmd[MAX_CMD],char *szRecvMsg); int Set_NXL_E3_VarMsg(int iAddr,char szCmd[MAX_CMD],char *szRecvMsg); int Set_NXL_EC_VarMsg(int iAddr,char szCmd[MAX_CMD],char *szRecvMsg); int Set_NXL_EE_VarMsg(int iAddr,char szCmd[MAX_CMD],char *szRecvMsg); protected: int RtnCheck(char szRecvMsg[RECE_MSG_LENGTH]); int NxlGetCheckSum(char *SendMsg,BYTE *szRecvCheck,int iMsgLen); BOOL Check_RecvMsgCheckSum(char *RecvMsg,int iMsgLen); BOOL LengthCheck(char szRecvMsg[RECE_MSG_LENGTH]); }; #endif