/**************************************************************************** * FileName : Common.h * * Programmer : Li Liangchu * * Writen at : 2002.09.20 * * Version : * * Description: header of the nport.c * * Last modify: 2002.11.6 * ****************************************************************************/ #ifndef __COMMON_H_ICL__ #define __COMMON_H_ICL__ #ifdef _WIN32 #else #define OS_UNIX #endif #ifdef _WIN32 #ifdef _DEBUG // #define _OS_WINDOWS_DEBUG_ #else // _DEBUG #define _OS_WINDOWS_ #endif // _DEBUG #include #include #include #include #include #include #else #include #include #endif #include "platform_def.h" #include #include #include //#include "menu.h" // 基本函数库 #include "basefunc.h" #include "DSFileSystem.h" #include "chainlist.h" #include "os_heap.h" #include "basetype.h" #include "confrw.h" #define OPEN 0 #define CLOSE 1 // wen 2005.04.12 定义输出信息格式 /* !输出信息级别为提示信息 */ #define MSG_CLASS_TIP 1 /* !输出信息级别为警告信息 */ #define MSG_CLASS_WARN 2 /* !输出信息级别为错误信息 */ #define MSG_CLASS_ERROR 3 /*! * 端口读标识 */ #define FLAG_READ 0x0001 /*! * 端口写标识 */ #define FLAG_WRITE 0x0002 /*! * 端口读标识 */ #define FLAG_OPEN (FLAG_READ | FLAG_WRITE) #define OPEN_PORT 3 // 端口处于完全打开状态 #define CLOSE_PORT 0 // 端口处于关闭状态 // 网络端口创建标识FAIL_GREATE、SUCCEED_GREATE、SOCKET_BEING #define FAIL_GREATE 0 // 创建socket失败 #define SUCCEED_GREATE 1 // 创建socket成功 #define SOCKET_BEING 2 // socket已经存在,无需重新创建 #define AI_DATA_DISP 4 #define DI_DATA_DISP 5 #define PI_DATA_DISP 6 #define WATCH_DATA_DISP 8 typedef u_char BYTE; typedef u_short WORD; typedef u_long DWORD; #ifndef _WIN32 #define OS_UNIX typedef unsigned long long ULONG_PTR, *PULONG_PTR; typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; #define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff)) #define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff)) #define LOBYTE(w) ((BYTE)(((DWORD_PTR)(w)) & 0xff)) #define HIBYTE(w) ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff)) #define _getpid getpid #define _stricmp strcasecmp #define Sleep(x) usleep(1000*x) // #define GetPrivateProfileString QGetPrivateProfileString #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif #define BYTE3(a) (((a)&0xff)<<24) #define BYTE2(a) (((a)&0xff)<<16) #define BYTE1(a) (((a)&0xff)<<8) #define BYTE0(a) ((a)&0xff) #define ExchWord(a) (HIBYTE(a) | (LOBYTE(a)<<8)) #define ExchDWord(a) (ExchWord(HIWORD(a)) | (ExchWord(LOWORD(a))<<16)) #define BcdByteToInt( c ) (((c&0xf0) >> 4)*10 + (c&0x0f)) #define IntToBcdByte( c ) ((c/10)*16 + (c%10)) #define HexDigitToChar( c ) (((c) >= 10) ? ((c)-10+'A') : ((c)+'0')) #define HexCharToInt( c ) \ ( ((c) >= '0') && ((c) <= '9') ? (c) - '0' : \ ((c) >= 'a') && ((c) <= 'f') ? (c) - 'a' + 10 : \ ((c) >= 'A') && ((c) <= 'F') ? (c) - 'A' + 10 : 0 ) #define INC_TOTAL_MSG( port ) (SioParam[port].MsgNum++) #define INC_Lost_SYNC_CNT( port ) (SioParam[port].LostSyncCnt++) #define INC_ERROR_MSG( port ) \ do { \ SioParam[port].ErrMsgNum++; \ SioParam[port].MsgNum++; \ } while ( 0 ) //基本宏定义 #define DEFAULT_UDP_COMM_PORT 0xff00 //定义用于读写EEPROM的PB6、PB7地址 #define SUCC 1 #define FAIL 0 #define MAX_NET_BUF_SIZE (80*1024) #define MAX_MSG_BUF_SIZE 81920 #define NET_MAC_LEN 6 #define DEFAULT_MAX_SERIAL_PORT_NUM 16 #define DEFAULT_MAX_NET_PORT_NUM 8 #define DEFAULT_MAX_PORT_NUM (DEFAULT_MAX_SERIAL_PORT_NUM+DEFAULT_MAX_NET_PORT_NUM) #define MAX_DEV_NUM 16 #define MAX_PROV_PORT_NUM 16 #define MAX_NET_NUM 3 #define DEFAULT_BAUD 9600 //1、设备配置初始化类 #define SDS_GET_IP_ADDR 0x101 #define SDS_N_GET_IP_ADDR 0x102 #define SDS_SET_IP_ADDR 0x103 #define SDS_GET_NET_MAC_CODE 0x109 #define SDS_SET_NET_MAC_CODE 0x110 #define SDS_SIO_RECV_DATA 0x141 #define SDS_SIO_SEND_DATA 0x142 #define SDS_SIO_SET_WATCH_PORT 0x161 #define SDS_SIO_CLR_WATCH_PORT 0x162 //7、保护机信息类 #define SDS_SIO_GET_PROTOCOL_NAME 0x201 // 读所有协议名称 #define SDS_SIO_GET_PORT_CONFIG_INFO 0x203 // 读端口公共配置信息 #define SDS_SIO_GET_PROTOCOL_CONFIG_INFO 0x204 // 根据协议号读协议配置信息 // 与接收数据有关项目 #define SDS_SIO_GET_STAT_INFO 0x211 // 读所有端口统计信息 #define SDS_SIO_CLR_STAT_INFO 0x212 // 端口统计信息清零 #define SDS_SIO_GET_AI_DATA_INFO 0x213 // 读端口遥测 #define SDS_SIO_GET_DI_DATA_INFO 0x214 // 读端口遥信 #define SDS_SIO_GET_PI_DATA_INFO 0x215 // 读端口电度 #define SDS_SIO_GET_CONFIG_FILE 0x221 // 读portconfig.ini 文件 #define SDS_SIO_SET_CONFIG_FILE 0x222 // 写portconfig.ini 文件 #define SDS_SIO_SET_SYSTEM_TIME 0x231 // 系统对时 #define SDS_SIO_RESET 0x255 // 读端口电度 #define MAX_MAP_REG_NUM 8 #define NO_HANDSHAKE_MODE 0x00 #define HARDWARE_MODE 0x01 #define SOFTWARE_MODE 0x02 #define RS232_COMM_MODE 0x00 #define RS422_COMM_MODE 0x01 #define RS485_COMM_MODE 0x02 #define RS485_INPUT 0 #define RS485_OUTPUT 1 #define NO_COMM 0 #define UDP_COMM 1 #define TCP_S_COMM 2 #define TCP_C_COMM 3 #define RECV_PROTOCOL 0 #define PROV_PROTOCOL 1 #define PROTOCOL_SLAVE PROV_PROTOCOL #define PROTOCOL_MASTER RECV_PROTOCOL #define POLL_CMD_TYPE_NUM 3 #define NORMAL_CMD_TYPE 0 #define INSERAT_CMD_TYPE 1 #define FAST_CMD_TYPE 2 //设定maskbit意义在于(&~maskbit)|bit确定位值 // 数据位数 #define BITMASK 0x03 #define BIT5 0x00 #define BIT6 0x01 #define BIT7 0x02 #define BIT8 0x03 // 停止位 #define STOPMASK 0x0c #define STOP1 0x04 #define STOP2 0x08 #define STOP15 0x0c // 校验位 #define PARITYMASK 0xf0 #define PARITYNONE 0x00 #define PARITYODD 0x10 #define PARITYEVE 0x20 #define PARITYMRK 0x30 #define PARITYSPC 0x40 // 流控制 #define RTSMASK 0x01 #define DTRMASK 0x02 #define CTSMASK 0x04 #define PNT_ENABLE 0 // 点使能 #define PNT_STATE 1 // 点状态 #define PNT_RAWVALUE 3 // 点原值(遥测,电度) #define PNT_POLAR 5 // 遥测点极性 #define PNT_STATUS 6 // 遥信点状态 #define PNT_CTRL_NO 7 // 遥信控点号 #define PNT_PROV_MSG 10 // 转发信息 #define PNT_SOE_TIME 20 // 遥信 SOE 时间 #define PNT_ALL_MSG 21 // 读取点的所有信息 #define PNT_SOE_TIME_EX 22 // 含有扩展信息的遥信SOE时间 #define AI_PNT_TYPE 0 #define DI_PNT_TYPE 1 #define CN_PNT_TYPE 2 //#define PI_PNT_TYPE 2 #define PI_PNT_TYPE 3 #define OD_PNT_TYPE 4 #define AO_PNT_TYPE 20 #define DO_PNT_TYPE 21 /*! \brief 保护模拟量类型 */ #define PROTECT_AI_PNT_TYPE 128 /*! \brief 保护开关量类型 */ #define PROTECT_DI_PNT_TYPE 129 /*! \brief 保护定值类型 */ #define PROTECT_FIX_PNT_TYPE 130 /*! \brief 保护事件类型 */ #define PROTECT_EVENT_PNT_TYPE 131 #define POLL_CMD_TYPE_CMD 3 #define NORMAL_POLL_CMD 0 // 普通命令队列 #define INSERT_POLL_CMD 1 // 插入命令队列 #define FAST_POLL_CMD 2 // 快速命令队列 // TIMER_CNT, CREATE_CNT, LED_CNT必须能整除1000 //#define TIMER_CNT 20 // Poll命令定时器时间 20 ms #define TIMER_CNT 200 // Poll命令定时器时间 200 ms #define DATA_PRO_CNT 10 // 定时器基本时间 10 ms #define CREATE_CNT 100 // 100 ms #define LED_CNT 250 // 250 ms #define BLK_SIZE 256 #define SYSTEM_TIME 300 // RTU 对时, 300秒一次 #define MAX_DISP_LINE 2048 #define MAX_PROV_SOE 128 #define STEP_YKYT_NOEXEC 0 // 无 操 作 #define STEP_YKYT_SELECT 1 // 遥控选择 #define STEP_YKYT_EXEC 2 // 遥控执行 #define STEP_YKYT_CANCEL 3 // 遥控撤销 #define STEP_YT_SELECT 4 // 遥调选择 #define STEP_YT_EXEC 5 // 遥调执行 #define STEP_YT_CANCEL 6 // 遥调撤销 #define STEP_YKYT_DIRECT 7 // 直 控 #define STEP_YKYT_STOP 8 // 遥调急停 // 数据类型 /*! 无效数据类型 */ #define DT_NO 0 /*! 无符号整型数 */ #define DT_UINT 1 /*! 整型数 */ #define DT_INT 2 /*! 浮点数 */ #define DT_FLOAT 3 /*! 字符串 */ #define DT_STRING 4 /*! 二进制数据 */ #define DT_BINARY 5 /*! 控制字 */ #define DT_CONTROL 6 // 信息扩展数据至少扩展2个字节,其中第一字节指示数据类型, // 第二字节根据不同数据类型有所不同。 #define CHECK_NO 1 // 无校验,第二扩展字节无效,置0 #define CHECK_WHOLE 2 // 总校验,第二扩展字节为校验错误数 #define CHECK_GROUP 3 // 分组校验,第二扩展校验错误总数 #define DATATYPE_NO -1 #define DATATYPE_AI 0 #define DATATYPE_DI 1 #define DATATYPE_OD 2 #define DATATYPE_STRING 3 #define DATATYPE_PI 4 // wen 2005.10.08 解决malloc分配内存不能释放的问题 #define MIN_MALLOC_SIZE 200 // malloc分配内存的最小尺寸 #define MAX_NO_WRITE_NUM 600000 // 网络最大不可写尺寸 #define MAX_BUFUNIT_NUM 1000 // 缓冲区单元最大数量 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 增加fend功能的宏定义 #define MAX_HOST 2 #define MAX_FEND 2 #define MAX_ADDR 2 #define MAX_NET_BUF 16384 #define MMI_TYPE 0 #define FEND_TYPE 1 #define HOST_TYPE 2 #define TCPIP_ADDR_LEN 32 // TCP/IP 通讯地址最大长度 #define MAX_MACHINE_NAME_LEN 48 // 计算机名最大长度 #define MAX_RTU_MSG_SIZE 8192 // RTU 信息包最大长度 #ifdef OS_LINUX // 在linux下定义属性单字节对齐 typedef int SOCKET; #define INVALID_SOCKET (SOCKET)(~0) #endif #define __attribute__(x) //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #define MAX_POLL_CMD_BUF_LEN 256 // 轮询指令缓冲区最大长度 enum Param_Type { PARAM_NO=0, PARAM_LINK, PARAM_DEV, PARAM_YC, PARAM_YX, PARAM_YM, PARAM_YK, PARAM_SYNCTIME, PARAM_ASDU10 }; #ifdef OS_WINDOWS #pragma pack (push,1) #else// OS_UNIX #pragma pack(1) #endif //OS_UNIX //SDS 包类型头 typedef struct { BYTE PortIdx; // 信息类型 WORD MsgType; // 信息类型 WORD MsgLen; // 信息长度 } RTUMSGHEAD; //SDS包类型结构 typedef struct { BYTE PortIdx; // 信息类型 WORD MsgType; // 信息类型 WORD MsgLen; // 信息长度 u_char MsgData[MAX_MSG_BUF_SIZE]; } RTUMSG; //网络发包临时数据绶冲结构 typedef struct { int BufSize; int MsgCnt; int Front; int Rear; u_char MsgData[MAX_MSG_BUF_SIZE]; } DATA_BUF; struct WR_DATA { // u_short MsgType ; u_short MsgLen; u_char *MsgData; int PLen; struct WR_DATA *Next; }; typedef struct { WORD PortNo; WORD PntNo; u_char Enable; u_char ChangeFlag; float fFactor; // 模拟盘专用参数 WORD wType; // 转发点类型 } PROV_AI_PNT; typedef struct { WORD PortNo; WORD PntNo; u_char Enable; u_char ChangeFlag; u_char CtrlEnable; short ControlNo; // 模拟盘专用参数 WORD wType; // 转发点类型 } PROV_DI_PNT; typedef PROV_AI_PNT PROV_PI_PNT; typedef struct { WORD PortNo; WORD PntNo; u_char Enable; } PROV_PNT; typedef struct { BYTE Enable; BYTE State; // 遥测状态 //WORD RawValue; // 遥测原值 DWORD RawValue; // 遥测原值 BYTE Polar; // 处理极性 PROV_PNT Prov[MAX_PROV_PORT_NUM]; // 转发标志 } AI_DEF; typedef struct { BYTE Enable; BYTE State; // 遥信状态 BYTE Status; // 遥信状态 u_char CtrlEnable; WORD ControlNo; DAY_TIME SoeTime; PROV_PNT Prov[MAX_PROV_PORT_NUM]; // 转发标志 } DI_DEF; typedef struct { BYTE Enable; BYTE State; // 电度状态 u_long RawValue; // 电度原值 PROV_PNT Prov[MAX_PROV_PORT_NUM]; // 转发标志 } PI_DEF; typedef struct { int iPntNo; // SOE点号 BYTE bStatus; // 状态值 // wen 2005.05.18 增加扩展字节处理(针对于103有效) BYTE u8Type; // 103中表现为asdu号 BYTE u8ProvFun; // 103转发中的FUN BYTE u8ProvInf; // 103转发中的INF WORD wRelativeTime; // 相对时间 WORD wFaultNo; // 故障序号 DAY_TIME SoeTime; // SOE时间 // wen 2005.10.25 增加扩充字符串,用来解析保护事件中的故障参数 char szMsgEx[64]; // 扩充字节数不得大于64字节 } SOE_DEF; typedef struct { int iSoeNum; // soe数量 int iFront; // 队列首指针 int iRear; // 队列尾指针 SOE_DEF *ptrProvSoe; // 端口soe数据缓冲区(最大=MAX_PROV_SOE)队列 } PROV_SOE_DEF; #define YKYT_CMD_FROM_NO 0 // 没有数据来源 #define YKYT_CMD_FROM_SCADA 1 // 来源于scada系统 #define YKYT_CMD_FROM_PROVPORT 2 // 来源于转发端口 // wen 2003.08.22 增加遥控遥调转发处理 typedef struct { int m_iProvPortIdx; // 转发厂站端口号 int m_iProvPntIdx; // 转发厂站遥信点号 int m_iProvYkYtPointIdx;// 转发厂站遥控遥调点号 int m_iYkYtPointIdx; // 实际厂站遥控遥调点号 int m_iYkYtStep; // 遥控遥调转发步骤(无操作(=0)/选择(=1)/执行(=2)) // 该结构成员是用来保存操作类型的(不仅仅针对转发遥控) int m_iYkYtOperate; // 遥控遥调操作(控分、控合、失败) int m_iYkYtMode; // 遥控遥调模式(仅对104有效) DAY_TIME m_sDayTime; // 遥控命令下发的时间 int m_iTimeOut; // 转发遥控超时时间 int m_iCmdFrom; // 指令来源(=0 无来源; =1 来源scada; =2 来源转发端口) } PROV_YKYT_DEF; #define YKYT_SEND_UP 1 // #define YKYT_SEND_DOWN 2 // typedef struct { int m_iYkYtStep; // 遥控遥调执行步骤 int m_iYkYtPnt; // 遥控遥调点 int m_iYkYtOperate; // 遥控遥调操作状态(控分、控合、失败) int m_iYkYtUpDown; // 上行命令还是下行命令(1=up, 0=down) } YKYT_PARAM; typedef struct { //******************** 串行端口信息 ************************ DWORD Baud; // 波特率(cdt计算时间间隔) //**************** 数据收发缓冲区接收状态******************* int m_iRevStatus; // 接收数据缓冲区状态 int m_iNeedRevLength; // 还需要接收的数据长度 //******************** Poll Cmd **************************** u_long Retry; // 重试命令次数 u_long RetryCnt; // 重试命令计数 u_long RetryTime; // 重试命令时间 u_long RetryTimeCnt; // 重试命令时间计数 u_long WaitTime; // 命令间隔时间 u_long WaitTimeCnt; // 命令间隔时间计数 u_char ForceWaitFlag; // 强制等待标志 u_short ForceWaitCnt; // 强制等待计数 u_char ReSendCmdFlag; // 重发命令标志 u_char SendCmdFlag; // 命令发送标志 u_char RevCmdFlag; // 命令正常接收标志 u_char LastGetCmdBuf; // 当前使用缓冲区 DATA_BUF PollCmd[POLL_CMD_TYPE_NUM]; //******************* 端口数据库 *************************** u_char PortType; // MAIN_PORT or SLAVE_PORT u_char CheckTime; // 时间校正(=0, 不对时; =1, 上对时(接收); =2, 下对时(发送)) WORD AiNum; // 端口遥测数量 WORD DiNum; // 端口遥信数量 WORD PiNum; // 端口电度数量 void *AiPtr; // 遥测数据内存指针 void *DiPtr; // 遥信数据内存指针 void *PiPtr; // 电度数据内存指针 // wen 2004.11.16 数据转发时用 u_char DiChange; // 遥信数据是否变化 u_char AiChange; // 遥测数据是否变化 // wen 2004.11.16 增加soe数据的转发存储 PROV_SOE_DEF ProvSoeBuf; // 转发soe数据缓冲区 PROV_YKYT_DEF ProvYkYtMsg; // 转发遥控信息缓冲区 } SIO_PARAM_BAOHU_DEF; typedef struct { //***************** 串行端口信息 ************************ DWORD Baud; // 波特率 u_char CommMode; // 数据位、校验和停止位 u_char WorkMode; // 方式,RS323、422、485 int Rs485WaitCnt; // 485 切换等待计数 u_char ChipCheckOk; // 芯片检验标志 u_char ChSelect; // 芯片型号 u_char FreqSelect; // 芯片工作频率 u_char WrRegMap[MAX_MAP_REG_NUM]; // 芯片寄存器映射 u_char HandshakeMode; // 通讯握手方式 u_char XonChar1; // 软件握手ON字符1 u_char XonChar2; // 软件握手ON字符2 u_char XoffChar1; // 软件握手OFF字符1 u_char XoffChar2; // 软件握手OFF字符2 //********************************************************** } SIO_PARAM_SERIAL_DEF; //串口相关所有参数集中定义 typedef struct { //******************** 端口基本信息 ************************ u_char ProtocolIdx; // 规约索引,大于 0 u_char ByPassFlag; // 旁路标志 u_char OpenFlag; // 打开标志(该标识弃用,改在共享内存中) u_char Status; // 端口状态,用来判断端口是否通讯正常 // 在端口正常的1分钟后发送全数据, 避免数据未全部刷新导致的乱报警 int iDelaySendAllData;// 全数据延迟传送 int iForceSendFlag; // 强制下发标志 //******************** 网络端口信息 ************************ u_char NetType; // UDP_COMM、TCP_S_COMM、TCO_C_COMM DWORD NetPort; // 网络通讯端口 u_long NetCommIpAddr; // 网络通讯地址 int LiSock; // 侦听socket int CommSock; // 通讯socket //********************************************************** //******************** 数据收发缓冲区*********************** DATA_BUF RecvBuf; // 接收数据缓冲区 struct WR_DATA *WriteData; // 下行数据缓冲区 int iWriteDataNo; // 下行数据缓冲区序号 //******************** 统计信息 **************************** u_long MsgNum; // 端口信息计数 u_long LostSyncCnt; // 端口失步次数 u_long ErrMsgNum; // 端口错误信息计数 u_long RecvCharNum; // 端口在线时间统计 u_long SendCharNum; // 端口离线时间统计 u_long LineCommCnt; // 端口是否在线计数 //****************** 串行端口信息 ************************** SIO_PARAM_SERIAL_DEF *m_psSerial; //********************************************************** //******************* 保护信息 ***************************** SIO_PARAM_BAOHU_DEF *m_psBaoHu; //********************************************************** //******************** 用户扩展结构 ************************ void *ExtInfo; //********************************************************** } SIO_PARAM_DEF; typedef struct { u_long AllIpAddr[MAX_NET_NUM]; u_long NetMaskIpAddr[MAX_NET_NUM]; u_long BroadCastIpAddr[MAX_NET_NUM]; u_long MainIpAddr[MAX_NET_NUM]; } HOST_IP_ADDR; typedef struct { WORD PortNumber; SOCKET Socket; struct sockaddr_in Addr; u_char WaitFalg; } UDP_SET_DEF; typedef struct { int LineCnt; int Front; int Rear; char Line[MAX_DISP_LINE][128]; } DISP_LINE_BUF; typedef struct { u_long IpAddr[MAX_NET_NUM]; u_char NetNum; u_long CurCommIp; u_char IpAddrChangeFlag; u_char NetCardMacCode[MAX_NET_NUM][NET_MAC_LEN]; u_char ReadMacCodeFlag; u_char PortNum; u_char SerialPortNum; u_char NetPortNum; DISP_LINE_BUF WatchDispLine; } DEV_DEF; // wen 2005.05.27 保护数据(保护模拟量、保护开关量、保护定值的存储结构) /*! \struct GROUPDATADEF \brief 通用分类数据定义 \par 快速参考 common.h */ typedef struct { /*! \var GROUPDATADEF::m_szName \brief 信息点名称描述 \note 取值范围:[有效的ASCII码字符串,最大长度为64]\n */ char m_szName[66]; /*! \var GROUPDATADEF::m_u32DataID \brief 数据类型 \note 取值范围:[DATAID_NO(0)---DATAID_SINGLE(10)]\n 如果为DATAID_NO,则数据返回浮点数 */ u_32 m_u32DataID; /*! \var GROUPDATADEF::m_fValue \brief 信息点值 \note 取值范围:浮点数取值范围\n */ float m_fValue; /*! \var GROUPDATADEF::m_fMaxValue \brief 信息点最大值 \note 取值范围:浮点数取值范围\n */ float m_fMaxValue; /*! \var GROUPDATADEF::m_fMinValue \brief 信息点最小值 \note 取值范围:浮点数取值范围\n */ float m_fMinValue; /*! \var GROUPDATADEF::m_fStepValue \brief 信息点步长值 \note 取值范围:浮点数取值范围\n */ float m_fStepValue; /*! \var GROUPDATADEF::m_szUnit \brief 信息点量纲 \note 取值范围:[有效的ASCII码字符串,最大长度为16]\n */ char m_szUnit[18]; /*! \var GROUPDATADEF::iFixDataType \brief 信息点上送到protect的显示类型 \note 取值范围:[0-255](类型(AI=1, DI=2))\n */ u_char iFixDataType; }GROUPDATADEF; /*! \struct GROUPEVENTDEF \brief 保护事件定义 \par 快速参考 common.h */ typedef struct{ /*! \var GROUPEVENTDEF::m_iNewEventNo \brief 最新事件序号 \note 取值范围:[0--(BUF_EVENT_NUM-1)=15]\n */ i_32 m_iNewEventNo; /*! \var GROUPEVENTDEF::m_iNewEvents \brief 最新事件数量 \note 取值范围:[0--16]\n */ i_32 m_iNewEvents; /*! \var GROUPEVENTDEF::m_iAllEvents \brief 缓冲事件数量 \note 取值范围:[0--16]\n */ i_32 m_iAllEvents; /*! \var GROUPEVENTDEF::m_sTm[] \brief 事件发生时间 */ //SYSTEMTIME m_sTm[BUF_EVENT_NUM]; /*! \var GROUPEVENTDEF::m_u8INF[] \brief 事件信息序号 */ // BYTE m_u8INF[BUF_EVENT_NUM]; }GROUPEVENTDEF; /*! \struct GROUPDEF \brief 通用分类数据组定义 \note 保护模拟量、保护开关量、保护定值通用存储结构 \par 快速参考 common.h */ typedef struct{ /*! \var GROUPDEF::m_iGroupNo \brief 通用分类数据组号 \note 取值范围:[0--255]\n */ i_32 m_iGroupNo; /*! \var GROUPDEF::m_iStartItemNo \brief 通用分类数据起始条目号 \note 取值范围:[0--255]\n */ i_32 m_iStartItemNo; /*! \var GROUPDEF::m_iDataType \brief 该组号数据对应的数据类型 \note 取值范围:AI_PNT_TYPE(模拟量)\n DI_PNT_TYPE(开关量)\n PI_PNT_TYPE(电度量)\n PROTECT_AI_PNT_TYPE(保护模拟量)\n PROTECT_DI_PNT_TYPE(保护开关量)\n PROTECT_FIX_PNT_TYPE(保护定 值)\n PROTECT_EVENT_PNT_TYPE(保护事 件)\n */ i_32 m_iDataType; /*! \var GROUPDEF::m_iStationNo \brief 写入数据库中的厂站号 \note 取值范围:[0--MAX_PORT_NUM,0为无效(缺省值)]\n */ i_32 m_iStationNo; /*! \var GROUPDEF::m_iStartPntNo \brief 写入数据库中的起始点号 \note 取值范围:[0--(该类型点的最大点号-1)]\n */ i_32 m_iStartPntNo; /*! \var GROUPDEF::m_u8NGD \brief 组数据的NGD \note 取值范围:[0--(该类型点的最大点号-1)]\n */ BYTE m_u8NGD; /*! \var GROUPDEF::m_pu8DataType \brief 保护定值数据类型指针 \note 取值范围:无\n */ BYTE *m_pu8DataType; /*! \var GROUPDEF::m_pu8DataLen \brief 保护定值数据长度指针 \note 取值范围:无\n */ BYTE *m_pu8DataLen; /*! \var GROUPDEF::m_pu8GIN \brief 保护定值数据条目号 \note 取值范围:无\n */ BYTE *m_pu8GIN; /*! \var GROUPDEF::m_u32CurPntNo \brief 当前数据点号 \note 取值范围:[1--255]\n \note 用于处理多帧通用分类数据时,确定该帧的数据起始点号 */ u_32 m_u32CurPntNo; /*! \var GROUPDEF::m_iPntNum \brief 数量 \note 取值范围:无\n \note 用于遥控点和保护定值数据 */ i_32 m_iPntNum; /*! \var GROUPDEF::m_bInit \brief 保护定值数据长度 \note 取值范围:无\n */ BOOL m_bInit; /*! \var GROUPDEF::m_psDataInfo \brief 组数据信息指针 \note 取值范围:无\n */ GROUPDATADEF *m_psDataInfo; /*! \var GROUPDEF::m_psEventInfo \brief 组事件信息缓冲区指针 \note 取值范围:非事件记录组,该指针为NULL\n */ GROUPEVENTDEF *m_psEventInfo; }GROUPDEF; /*! \struct DBINFO \brief 测量值数据信息定义 \par 快速参考 common.h */ typedef struct{ /*! \var DBINFO::m_u8Asdu \brief 基本测量值的数据类型 \note 取值范围:[0--255)]\n */ u_char m_u8Asdu; // 数据类型 // wen 2006.05.20 修改为16位 /*! \var DBINFO::m_u8Fun \brief 基本测量值的功能类型 \note 取值范围:[0--255)]\n */ WORD m_u8Fun; // 功能类型 /*! \var DBINFO::m_u8Inf \brief 基本测量值的信息序号 \note 取值范围:[0--255]\n */ WORD m_u8Inf; // 信息序号 // 以下参数用作转发 /*! \var DBINFO::m_u8ProvFun \brief 基本测量值的功能类型 \note 取值范围:[0--255)]\n */ BYTE m_u8ProvFun; /*! \var DBINFO::m_u8ProvInf \brief 基本测量值的信息序号 \note 取值范围:[0--255]\n */ BYTE m_u8ProvInf; /*! \var DBINFO::m_u8LoopData \brief 是否总召唤数据 \note 取值范围:[0--1]\n */ BYTE m_u8LoopData; }DBINFO, *pDBINFO; /*! \struct DBORIENTATION \brief 测量值数据库定位结构 \par 快速参考 common.h */ typedef struct { /*! \var DBORIENTATION::m_iStnNo \brief 基本测量值在数据库中写入站号 \note 取值范围:[1--最大厂站号)]\n */ i_32 m_iStnNo; // 写入数据库站号 /*! \var DBORIENTATION::m_iStartPntNo \brief 基本测量值在数据库中起始点号 \note 数据类型为规约本身提供的测量值 \note 取值范围:[0--(最大遥测点号-1)]\n */ i_32 m_iStartPntNo; // 写入数据库起始点号 /*! \var DBORIENTATION::m_iPntNum \brief 基本测量值的数量 \note 取值范围:[0--255]\n */ i_32 m_iPntNum; // 数量 /*! \var DBORIENTATION::m_psDataInfo \brief 测量值数据信息指针 */ pDBINFO m_psDataInfo; }DBORIENTATION; typedef struct tagDEVADDRPARAM { /*! \var DEVADDRPARAM::m_uchLinkAddr \brief 链路地址 */ BYTE m_uchLinkAddr; /*! \var DEVADDRPARAM::m_uchCommAddr \brief 公共地址 */ BYTE m_uchCommAddr; /*! \var DEVADDRPARAM::m_iLinkIdx \brief 链路索引号 */ int m_iLinkIdx; /*! \var DEVADDRPARAM::m_iDevIdx \brief 装置索引号 */ int m_iDevIdx; }DEVADDRPARAM, *pDEVADDRPARAM; typedef struct tagCMDPARAM { /*! \var CMDPARAM::m_uchFun \brief 指令参数功能号 */ BYTE m_uchFun; /*! \var CMDPARAM::m_uchInf \brief 指令参数信息号 */ BYTE m_uchInf; /*! \var CMDPARAM::m_uchRII \brief 返回值 */ BYTE m_uchRII; /*! \var CMDPARAM::m_sDevAddr \brief 指令参数地址信息 */ DEVADDRPARAM m_sDevAddr; }CMDPARAM, *pCMDPARAM; typedef struct tagBAOHUPROVPARAM { /*! \var BAOHUPROVPARAM::m_sProvStartTime \brief 调度转发指令下发时间 */ DAY_TIME m_sBaoHuCmdStartTime; /*! \var BAOHUPROVPARAM::m_iBaoHuCommid \brief 调度转发指令端口 \note <0, 没有调度转发命令 */ int m_iBaoHuCommid; /*! \var BAOHUPROVPARAM::m_iBaoHuMsgType \brief 调度指令类型 \note <0, 没有调度转发命令 */ int m_iBaoHuMsgType; /*! \var BAOHUPROVPARAM::m_sProvRealAddrParam \brief 调度转发指令时,实际装置的参数 */ DEVADDRPARAM m_sRealAddrParam; }BAOHUPROVPARAM, *pBAOHUPROVPARAM; #define PROV_SOE_MAX 10 /*! \struct DEVPROVSOE \brief 转发SOE数据结构 \par 快速参考 common.h */ typedef struct { /*! \var DEVPROVSOE::m_sSoeData \brief 转发SOE数据参数 \note 用于转发事件 */ SOE_DEF m_sSoeData[PROV_SOE_MAX]; /*! \var DEVPROVSOE::m_shSoeNum \brief 转发SOE数据数目 \note 用于转发事件 */ short m_shSoeNum; /*! \var DEVPROVSOE::m_shFront \brief 转发SOE数据头索引 \note 用于转发事件 */ short m_shFront; /*! \var DEVPROVSOE::m_shRear \brief 转发SOE数据尾索引 \note 用于转发事件 */ short m_shRear; }DEVPROVSOE; // 所有规约的通用函数接口指针 typedef const struct tagFUNCTION_CALL { char *ProtocolName; // 规约名称 char *Account; // 规约说明 char **ProtocolInfo; // 规约信息指针 void (*ReadConfig)( int ); // 初始化处理 void (*RecvData)( int, u_char *, int ); // 规约读数据处理 void (*Timer)( int ); // 定时器处理 void (*YkYtProcess)( int, u_char *, int ); // 遥控遥调处理 void (*SendSystemTime)( int ); // 系统对时 void (*ProtocolExit)( int ); // 规约退出时处理 // 以下函数指针仅仅针对保护规约有效 void (*BaoHuCmdProcess)(int, RTUMSG *, BOOL); // 保护数据处理 int (*GetBaohuDataBase)(int, int, GROUPDEF **); // 获取保护数据库 }FUNCTION_CALL; #ifdef OS_WINDOWS #pragma pack (pop) #else// OS_UNIX #pragma pack (0) #endif //OS_UNIX #endif