/************************************************************************************ * * Copyright (C) 2004-2005 SCADA Control Technology Co., Ltd. * All rights reserved. * * 文件名称:scadaprotect.h * 文件标识:SCADA内部保护通讯规约 * 摘 要: * * 当前版本:1.0 * 作 者:aaawen * 完成日期:2005/06/02 * * 取代版本:1.0 * 原作者 :aaawen * 完成日期: * * 说 明:数据定义规则 * u8 --- BYTE(usigned char) * ch --- char * w --- WORD(u_short, usigned short) * sh --- short * b --- BOOL(bool) * i --- int * l --- long * u32 --- u_32 * ui --- unsigned int(u_int) * ul --- unsigned long(u_long) * f --- float * db --- double * c --- class * s --- struct * sta --- static * g --- 全局变量 * Array --- 数组 * a --- 数组 * m_ --- 数据成员 * p --- 指针 * str --- 字符串 * 全部大写 --- 常量 * 首字节必须大写--- 类名称,结构,函数 **************************************************************************************/ // buban103.h: interface for the buban103 class. // ////////////////////////////////////////////////////////////////////// #if !defined(_SCADABAOHU_H_200506020948__INCLUDED_) #define _SCADABAOHU_H_200506020948__INCLUDED_ #ifdef OS_LINUX #include "baohulib/common.h" #else #include "common.h" #endif ////////////////////////////////////////////////////////////////////////// // 宏定义 // // WEN 2005.06.02 // ////////////////////////////////////////////////////////////////////////// /*! 保护指令包(PROTECT->FEND) */ #define pPFV_PROTECT_BYPASS 1 /*! 保护数据包应答(FEND->PROTECT) */ #define fPFV_PROTECT_BYPASS_ACK 2 /*! 通道状态包(FEND->PROTECT) */ #define fPFV_STATUS 3 /*! 网络活动包(FEND<->PROTECT) */ #define fPFV_NETACTIVE 0xF0 //指令包操作码 /*! 读取定值 */ #define hREADFIX 0x01 /*! 读取定值区号 */ #define hREADFIXNO 0x07 /*! 读取保护模拟量 */ #define hREADPAI 0x09 /*! 读取保护开关量 */ #define hREADPDI 0x0b /*! 读取保护波形数据 */ #define hREADPWAVE 0x0d /*! 读取指定故障报告 */ #define hQUERYFAULT 0x11 /*! 读取指定的自检报告 */ #define hQUERYSELFCHECK 0x12 /*! 修改保护定值 */ #define hWRITEALLFIX 0x15 /*! 修改指定的保护定值 */ #define hWRITESPECIALFIX 0x16 /*! 保护定值确认 */ #define hWRITEFIXACK 0x17 /*! 保护定值不确认 */ #define hWRITEFIXNAK 0x18 /*! 修改保护定值区 */ #define hWRITEFIXNO 0x19 /*! 定值区修改确认 */ #define hWRITEFIXNOACK 0x1a /*! 定值区修改不确认 */ #define hWRITEFIXNONAK 0x1b /*! 保护信号复归 */ #define hRESETPROTECT 0x1c /*! 单个装置对时 */ #define hCHECKTIME 0x1d /*! 保护装置广播对时 */ #define hBROADCASTCHECKTIME 0x1e /*! 读取保护装置状态 */ #define hSTATUS 0x1f /*! 读取菜单单元值 */ #define hCOMMAND 0x20 /*! 读取扰动参数的命令 */ #define hDISTCOMMAND 0x21 /*! 保护操作取消 */ #define hCANCEL 0xFF //应答包操作码 /*! 数据申请中 */ #define hREADINGDATA 0x02 /*! 定值数据 */ #define hFIXDATA 0x03 /*! 数据申请结束 */ #define hREADDATAEND 0x04 /*! 数据申请无响应 */ #define hNORESPONSE 0x05 /*! 数据处理繁忙,稍后重试 */ #define hSYSTEMBUSY 0x06 /*! 定值区号数据 */ #define hFIXNODATA 0x08 /*! 保护模拟量数据 */ #define hPAIDATA 0x0a /*! 保护开关量数据 */ #define hPDIDATA 0x0c /*! 保护波行数据上送开始 */ #define hPWAVEDATASTART 0x0e /*! 保护波行数据 */ #define hPWAVEDATA 0x0f /*! 保护波行数据上送结束 */ #define hPWAVEDATAEND 0x10 /*! 带索引号的事件报告数据 */ #define hPEVENTDATAWITHID 0x13 /*! 字符串事件报告数据 */ #define hPEVENTDATAWITHSTRING 0x14 /*! 保护定值确认 */ #define hWRITEFIXACK 0x17 /*! 保护定值不确认 */ #define hWRITEFIXNAK 0x18 /*! 定值区修改确认 */ #define hWRITEFIXNOACK 0x1a /*! 定值区修改不确认 */ #define hWRITEFIXNONAK 0x1b /*! 定值数据带序号 */ #define hFIXDATAWITHNO 0x22 /*! 保护模拟量数据带序号 */ #define hPAIDATAWITHNO 0x23 /*! 保护开关量数据带序号 */ #define hPDIDATAWITHNO 0x24 // 数据项目属性 /*! 实际值 */ #define ITEM_ATTR_REALVALUE 1 /*! 缺省值 */ #define ITEM_ATTR_DEFAULTVALUE 2 /*! 量 程 */ #define ITEM_ATTR_MINMAXSTEP 3 /*! 备 用 */ #define ITEM_ATTR_STANDBY 4 /*! 精 度 */ #define ITEM_ATTR_PRECISION 5 /*! 因 子 */ #define ITEM_ATTR_FIGURE 6 /*! 参 比 */ #define ITEM_ATTR_RATE 7 /*! 列 表 */ #define ITEM_ATTR_LIST 8 /*! 量 纲 */ #define ITEM_ATTR_UNIT 9 /*! 描 述 */ #define ITEM_ATTR_DESCRIPTION 10 /*! 保护操作超时时间(秒) */ #define OPERPROTECTTIMEOUT 15 // 是pc机系统还是嵌入式系统 #ifdef PC_MACHINE #ifdef OS_WINDOWS #pragma pack (push,1) #else// OS_UNIX #pragma pack(1) #endif //OS_UNIX #endif typedef struct tagPROTECTCONTENTHEAD { u_32 ummid __attribute__ ((packed));// 操作用户 u_32 uAddr __attribute__ ((packed));// 保护地址 char cFixNo __attribute__ ((packed));// 定值区号 char cCPUNo __attribute__ ((packed));// CPU号 u_32 uFuncCode __attribute__ ((packed));// 操作功能码 u_32 uReserved __attribute__ ((packed));// 保留 }PROTECTCONTENTHEAD, *pPROTECTCONTENTHEAD; typedef struct { u_32 MsgType __attribute__ ((packed));// 信息类型 u_32 PortNumber __attribute__ ((packed));// 信息端口号 u_32 MsgLen __attribute__ ((packed));// 信息长度 //u_char MsgData[1]; // 信息数据 }PROTECTMSGHEAD; typedef struct { u_32 MsgType __attribute__ ((packed));// 信息类型 u_32 PortNumber __attribute__ ((packed));// 信息端口号 u_32 MsgLen __attribute__ ((packed));// 信息长度 u_char MsgData[MAX_RTU_MSG_SIZE] __attribute__ ((packed));// 信息数据 }PROTECTMSG; // 是pc机系统还是嵌入式系统 #ifdef PC_MACHINE #ifdef OS_WINDOWS #pragma pack (pop) #else// OS_UNIX #pragma pack (0) #endif //OS_UNIX #endif typedef struct { BOOL bPortIdle; // 端口保护操作空闲标识 u_32 timeOut; // 保护操作超时时间 u_32 mmid; // 保护操作用户 } PORTSTATUS, *pPORTSTATUS; typedef struct tagSCADAPROVDEVDEF { /*! \brief 装置的实际端口号 */ i_32 m_iRealCommid; /*! \brief 装置的转发地址(唯一确定一个装置) */ i_32 m_iProvAddr; /*! \brief 转发SOE数据参数 \note 用于历史记录的转发事件(应该是没有作用,已经遗弃) */ DEVPROVSOE m_sProvSoe; i_32 m_iStatusStn; i_32 m_iStatusPnt; DBORIENTATION m_sYxInfo; }SCADAPROVDEVDEF; typedef struct tagSCADAPROTECTPORTPARAM { /*! \var SCADAPROTECTPORTPARAM::m_achRecvBuf \brief 接收数据缓冲区 \note 缓冲区最大不超过 MAX_RTU_MSG_SIZE+12(包头) bytes\n */ char m_achRecvBuf[MAX_RTU_MSG_SIZE+12]; /*! \var SCADAPROTECTPORTPARAM::m_iRecvLen \brief 接收数据长度 */ int m_iRecvLen; /*! \var SCADAPROTECTPORTPARAM::m_iRecvLen \brief 网络活动包的发送时间 */ int m_iActiveTimeCnt; int m_iActiveTimeConst; /*! \var SCADAPROTECTPORTPARAM::m_iRecvLen \brief 通道状态包的发送时间 */ int m_iStatusTimeCnt; int m_iStatusTimeConst; /*! 保护装置数量 */ i_32 m_iDevNum; SCADAPROVDEVDEF *m_psProvDev; SINGLELIST m_sBaoHuData; char m_chArrayTempletFileName[256]; PORTSTATUS *m_pPrtPortStatus; /*! \brief 该规约的端口数据指针 */ SIO_PARAM_BAOHU_DEF *m_psBaoHu; }SCADAPROTECTPORTPARAM, *pSCADAPROTECTPORTPARAM; /////////////////////////以下为通用函数接口/////////////////////////// /*! \brief 读取配置函数 \param commid -- 端口号 \note 取值范围:0 -- MaxSerialPortNum + MaxNetPortNum -1\n */ void ScadaProtectReadConfig(int commid); // 初始化处理 /*! \brief 读取端口数据函数 \param commid -- 端口号 \note 取值范围:0 -- MaxSerialPortNum + MaxNetPortNum -1\n \param buf -- 数据源缓冲区指针 \param len -- 数据源长度 */ void ScadaProtectRecvData(int commid, u_char *buf, int len);// 规约读数据处理 /*! \brief 规约数据处理定时器函数 \param commid -- 端口号 \note 取值范围:0 -- MaxSerialPortNum + MaxNetPortNum -1\n */ void ScadaProtectTimer(int commid); // 定时器处理 /*! \brief 遥控遥调数据处理函数 \param commid -- 端口号 \note 取值范围:0 -- MaxSerialPortNum + MaxNetPortNum -1\n \param buf -- 数据源缓冲区指针 \param len -- 数据源长度 */ void ScadaProtectYkYtProcess(int commid, u_char *buf, int len); // 遥控遥调处理 /*! \brief 系统下发对时函数 \param commid -- 端口号 \note 取值范围:0 -- MaxSerialPortNum + MaxNetPortNum -1\n */ //void ScadaProtectSendSystemTime(int commid); // 系统对时 /*! \brief 系统退出时规约处理函数 \param commid -- 端口号 \note 取值范围:0 -- MaxSerialPortNum + MaxNetPortNum -1\n */ void ScadaProtectExit(int commid); // 规约退出 /*! \brief 保护命令处理函数 \param commid -- 端口号 \param rtumsg -- 下发的保护命令指针 \note 取值范围:0 -- MaxSerialPortNum + MaxNetPortNum -1\n */ void ScadaProtectBaoHuCmdProcess(int commid, RTUMSG *rtumsg, BOOL bUpData); /*! \brief 取保护数据库指针函数 \param commid -- 端口号 \param iProvAddr -- 统一编排的保护转发地址 \param ppBaoHuDB -- 存放保护数据指针的指针 \retval -- 返回该装置保护数据组数 */ int ScadaProtectGetBaohuDataBase(int commid, int iProvAddr, GROUPDEF **ppBaoHuDB); /////////////////////////通用函数接口结束/////////////////////////////// /////////////////////////以下为通用函数支持接口///////////////////////// void ScadaProtectProvMakeYkYtCommand(int commid, u_char *buf, int len); /////////////////////////通用函数支持接口结束/////////////////////////// ///////////////////////////以下为配置函数接口/////////////////////////// BOOL InitScadaInfoFromTempletFile(int commid, SCADAPROTECTPORTPARAM *psPortParam,\ char *ptrTemplate, BOOL bMaster); BOOL GetProvDevNumFromTemplateFileScada(int commid, HDSFILE hFile, SCADAPROTECTPORTPARAM *psPortParam); BOOL GetProvDevParamFromTemplateFileScada(int commid, HDSFILE hFile, SCADAPROTECTPORTPARAM *psPortParam); int FindProtectDevFromPntNoScada(SCADAPROTECTPORTPARAM *psPortParam, int iPntNo, int itype); /////////////////////////////配置函数接口结束/////////////////////////// ///////////////////////以下为规约处理函数接口/////////////////////////// void ReduceTimeOut(SCADAPROTECTPORTPARAM *psPortParam); BOOL IsProtectPortIdle(int commid, SCADAPROTECTPORTPARAM *psPortParam); BOOL GetProtectPortIdle(int commid, SCADAPROTECTPORTPARAM *psPortParam, PORTSTATUS *pStatus); BOOL SetProtectPortIdle(int commid, SCADAPROTECTPORTPARAM *psPortParam, PORTSTATUS *pStatus); BOOL SetProtectPortIdleEx(int commid, int iBaoHuCommid, PORTSTATUS *pStatus); void SendResponsetoMMI(int commid, int mmid, u_32 ResponseType, PROTECTMSG *pmsg); //将客户机报文所有的数据从网络字节循序转换成主机字节顺序函数 void AllNetToHostByteSequence(PROTECTMSG *userdata); //将客户机报文所有的数据从主机字节顺序转换成网络字节顺序函数 void AllHostToNetByteSequence(PROTECTMSG *userdata); BOOL ScadaProtectConvertToScadaFrameAndSend(int commid); BOOL ScadaProtectConvertTo103AndSend(int commid, PROTECTMSG *pmsg); //数据处理函数总入口 void ScadaProtectProcessData(int commid, SCADAPROTECTPORTPARAM *psPortParam, BOOL bProcess); void ScadaProtectByPassData(int commid, SCADAPROTECTPORTPARAM *psPortParam, PROTECTMSG *pmsg); BOOL FormatDataAndSend(int commid, PROTECTMSG *pmsg); void MakeInteractionCmd(int commid, int sourcommid, u_32 ResponseFunc, PROTECTCONTENTHEAD *pSourHead, BOOL bBoardCast); void MakeNetActivePacket(int commid); void MakeStatusPacket(int commid); BOOL MakeSoeDataPacket(int commid); /////////////////////////规约处理函数接口结束/////////////////////////// /////////////////////////以下为调试函数接口///////////////////////////// void DispPrtPortStatus(int commid, SCADAPROTECTPORTPARAM *psPortParam); ///////////////////////////调试函数接口结束///////////////////////////// #endif // !defined(_SCADABAOHU_H_200506020948__INCLUDED_)