You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1256 lines
28 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/****************************************************************************
* 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 <windows.h>
#include <winsock.h>
#include <dos.h>
#include <direct.h>
#include <sys/timeb.h>
#include <process.h>
#else
#include <sys/time.h>
#include <netinet/in.h>
#endif
#include "platform_def.h"
#include <stdio.h>
#include <string.h>
#include <time.h>
//#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_NUM0为无效(缺省值)]\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