2025-04-30 16:24:29 +08:00

360 lines
11 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/****************************************************************************
文件名: iec61850lib.h
----------------------------------------------------------------------------
描述 : iec61850lib 库头文件
----------------------------------------------------------------------------
修改日志 :
日期 姓名 操作
----------------------------------------------------------------------------
2010-06-11 陈云洲 创建
****************************************************************************/
#ifndef _IEC61850LIB_H_
#define _IEC61850LIB_H_
#ifdef __cplusplus
extern "C"{
#endif
/******************* 如下是采样值相关结构体的定义 ***********************/
//数据类型长度见9-2表14
#define SV2_MAX_VSTRING_LEN 35
#define SV2_MAX_OBJREF_LEN 64
#define SV2_MAX_SVID_LEN 34
#define SV2_MAX_ASDU_NUM 10 //最大支持一个apdu中包含10个asdu
/**
* smv9-2初始化信息
*/
typedef struct
{
int eth_index;
int timeout;
unsigned short int appid;
char svID[SV2_MAX_SVID_LEN+1]; /**< svID用于区分采样值配置 */
}GSV_SV2RECV_INI;
typedef struct
{
unsigned short int smpCnt; /**< 采样值计数器 */
unsigned int confRev; /**< 配置改变计数器 */
char smpSynch; /**< 有0、1、2三个值,见9-2le7.2.2 */
char *ds_buf; /**< 数据集缓冲区指针数组,格式见9-2le figure5 */
int buf_len; /**< ds_buf的长度 */
}SV2_ASDU_VAL;
/** ASN.1 简单单元信息 */
typedef struct ASN_1_UNIT_struct
{
unsigned short int tag; /**< 单元标签 */
unsigned short int size; /**< 单元数据长度 */
unsigned short int offset; /**< 在数据流中相对于asn1数据起始位置的偏移量 */
} ASN_1_UNIT, * PASN_1_UNIT;
typedef struct
{
char *apdu;
ASN_1_UNIT smpCnt;
ASN_1_UNIT confRev;
ASN_1_UNIT smpSynch;
ASN_1_UNIT ds_buf;
ASN_1_UNIT svId;
}SV2_ASDU_AU;
/**2012-03-27新添加结构体从GOOSE_SMV.txt文件中读取的信息**/
typedef struct
{
char daRef[SV2_MAX_OBJREF_LEN+1];
char outVarName[SV2_MAX_OBJREF_LEN+1];
int entryIndex; //在数据集中的相对位置从1开始
int userIndex; //用户编号
float rating; //额定值,新增 2012-03-30, from int to float
} SV2_ASDU_USER;
/**
* smv9-2控制结构用于保存收到的数据
*/
typedef struct
{
int eth_index; /**< 网卡序号 */
unsigned short int appid;
unsigned short int reserved1;
unsigned short int reserved2;
char svId[SV2_MAX_SVID_LEN+1];
SV2_ASDU_VAL *asdu_vals;
SV2_ASDU_AU *val_asdu_au;
unsigned char asdu_num; /**< apdu中asdu的个数 */
unsigned short int apdu_len; /**< 用于判断报文或asdu个数是否变化 */
SV2_ASDU_USER *asdu_user; //hsj add 2012-03-27
int entryNumAct; //数据集中实际用到的数据个数,即上面指针数组长度
int entryNumDataset; //数据集中总个数
int delayPoint; //合并单元发送,延迟点数
int ctrlIndex; //控制块编号从0开始 add 2012-05-10
}GSV_SV2RECV_CTRL;
/**
* 由用户定义的回调收到9-2数据解析后调用将解析后的数据回传给用户用户从
* sv2_ctrl中的ds_buffs中取值
* svIndex从0开始的序号svNum本次中断收到的SV总个数, recvTime收到的相对时间单位ns
*/
typedef void (*U_SMV2RECV_CALLBACK)(GSV_SV2RECV_CTRL *sv2_ctrl, int svIndex, int svNum, unsigned int recvTime );
/************************** 如下是GOOSE相关结构体的定义 ******************/
#define MAX_IDENT_LEN 64 /* length of an Identifier variable */
#define MVL61850_MAX_OBJREF_LEN 129 /* Value specified by Tissue 141*/
//防止重复包含
#ifndef GEN_LIST_INCLUDED
typedef struct dbl_lnk
{
/* Note: adding/removing fields to/from this struct will make older */
/* !!! applications incompatible with new security DLLs. */
struct dbl_lnk * next;
struct dbl_lnk * prev;
} DBL_LNK;
#endif
typedef struct mms_utc_time_tag
{
unsigned long secs; /* Number of seconds since January 1, 1970 */
unsigned long fraction; /* Fraction of a second */
unsigned long qflags; /* Quality flags, 8 least-significant bits only */
} MMS_UTC_TIME;
typedef enum{
AS_DA_TYPE_UNKNOWN = 0,
AS_DA_TYPE_BOOLEAN,
AS_DA_TYPE_INT8,
AS_DA_TYPE_INT16,
AS_DA_TYPE_INT32,
AS_DA_TYPE_INT128,
AS_DA_TYPE_INT8U,
AS_DA_TYPE_INT16U,
AS_DA_TYPE_INT32U,
AS_DA_TYPE_FLOAT32,
AS_DA_TYPE_FLOAT64,
AS_DA_TYPE_CODEDENUM, //固定长度的bitstring, 2bit
// AS_DA_TYPE_TCMD, //固定长度的bitstring, 2bit
AS_DA_TYPE_OSTRING8, //变长octet string,最大长度8个字节
AS_DA_TYPE_OSTRING64, //变长octet string,最大长度64个字节
AS_DA_TYPE_VSTRING64, //可视变长字符串最大长度64
AS_DA_TYPE_VSTRING65, //可视变长字符串最大长度65
AS_DA_TYPE_VSTRING129, //可视变长字符串最大长度129
AS_DA_TYPE_VSTRING255 , //可视变长字符串最大长度255
AS_DA_TYPE_UNISTRING255, //utf-8字符串最大255个字符
AS_DA_TYPE_QUALITY, //变长bitstring 13bit
AS_DA_TYPE_TIMESTAMP, //utctime
AS_DA_TYPE_ENTRYTIME, //binary timebtime6格式
AS_DA_TYPE_OPTFLDS, //变长bitstring 10bit
AS_DA_TYPE_TRGC, //变长bitstring 6bit
AS_DA_TYPE_CHECK, //变长bitstring 2bit
AS_DA_TYPE_ENTRYID, //固定长度的octet string, 8个字节
AS_DA_TYPE_STRUCT //复杂类型的数据
}AS_DA_TYPE;
/**add 2012-03-27, 主要可能使用index读取的第一个数字***/
typedef struct
{
DBL_LNK l;
//MVL_VAR_ASSOC * var;
unsigned int index; //改为存储从userinfo中读取的偏移量
unsigned char gse_trged;//是否已经触发过goose
}MVL_VAR_LIST;
typedef struct
{
char da_ref [MAX_IDENT_LEN + 1]; /* 简单da的完整参引如:E1Q1SB1Ld1/LN$ST$Mod$stVal*/
char usr_data_info [MAX_IDENT_LEN + 1];
void * dataPtr;
void * dataType; /* data type of this leaf */
AS_DA_TYPE type; /*数据类型*/
void * do_map; /* 此da所属的do的map结构,使用时强制类型转换为as_do_map*/
MVL_VAR_LIST * var_list;//此data_map所对应的数据集的成员 added djf 20090807
void * last_data;//保存历史数据,便于数据比较 added djf 20090807
} AS_DA_MAP;
typedef struct
{
int da_map_num;//个数同一个开入对应多个damap可能==0
AS_DA_MAP ** da_maps;//数组同一个开入对应多个damap指向ln下的datamap数组中可能==NULL
}GOOSE_MAP_CTRL;
typedef struct
{
unsigned char connected;//是否处于连接状态
int eth_index;//网卡序号
double rx_time;//时限
}GOOSE_RX_CHNL;
typedef struct
{
DBL_LNK l;
struct
{
unsigned short etypeAppid; //通信部分的appid
unsigned char dstMac[6];//组播地址
//char gcRef [MVL61850_MAX_OBJREF_LEN + 1]; /* GoCBRef in IEC 61850 */
//char dataSetRef [MVL61850_MAX_OBJREF_LEN + 1];/* DatSet in IEC 61850 */
//char appID [MVL61850_MAX_OBJREF_LEN + 1]; /* GoID in IEC 61850 */
int timeValidate; //GOOSE报文中时间是否有效,hsj add 2012-03-30
int ctrlIndex; //控制块序号从0开始 2012-05-09
}ini_info;//初始化时传入的信息
//下面是解析goose得到的
char gcRef [MVL61850_MAX_OBJREF_LEN + 1]; /* GoCBRef in IEC 61850 */
unsigned long timeToLive;
char dataSetRef [MVL61850_MAX_OBJREF_LEN + 1];/* DatSet in IEC 61850 */
unsigned char appID_pres;
char appID [MVL61850_MAX_OBJREF_LEN + 1]; /* GoID in IEC 61850 */
MMS_UTC_TIME utcTime;
unsigned long stNum;
unsigned long sqNum;
unsigned char test;
unsigned long confRev;
unsigned char needsCommissioning;
unsigned long entryNum;
signed long numUnits; //dataset中包含的简单类型的数据单元个数
GOOSE_MAP_CTRL * goose_maps;//每个unit对应一个GOOSE_MAP_CTRL结构
int chnl_num;//通道个数
GOOSE_RX_CHNL * chnls;//接收通道
}GSE_RX_CTRL;
/************************** 如下是GOOSE发送相关结构体的定义 ******************/
#define GOOSE_SENDBUFF__MAX_LEN 1540
#define MAC_ADDR_SIZE 6
#define MVL61850_MAX_RPTID_LEN 65
typedef union
{
MMS_UTC_TIME utcTime;
unsigned short quality;
unsigned char dpi;
unsigned char spi;
unsigned long int1;
float fl1;
} USER_DATA_VAL;
typedef struct
{
//用户定义数据,
char Ref[MVL61850_MAX_OBJREF_LEN+1];
char typeStr[MVL61850_MAX_RPTID_LEN+1];
char InVarName[MVL61850_MAX_OBJREF_LEN+1];
int act; //act 这个是干嘛用的
unsigned long varIndex; //保护编号
AS_DA_TYPE type;
USER_DATA_VAL valNow;
USER_DATA_VAL valLast;
} GSE_IEC_DATA_USER;
typedef struct
{
unsigned char *goEna;
char gcRef [MVL61850_MAX_OBJREF_LEN + 1]; /* GoCBRef in IEC 61850 */
unsigned long timeToLive;
char dataSetRef [MVL61850_MAX_OBJREF_LEN + 1];/* DatSet in IEC 61850 */
unsigned char appID_pres;
char appID [MVL61850_MAX_RPTID_LEN + 1]; /* GoID in IEC 61850 */
/* (was AppID in Ed 1) */
MMS_UTC_TIME utcTime;
unsigned long stNum;
unsigned long sqNum;
unsigned char test;
unsigned long confRev;
unsigned char needsCommissioning;
long numDataEntries;
void * dataEntries; /* array of data entry structs */
long numDataMaps;
AS_DA_MAP ** data_maps;
GSE_IEC_DATA_USER *userData;
int ethIndex;
unsigned char *sendPst;
int sendLen;
unsigned char asn1Buf[GOOSE_SENDBUFF__MAX_LEN];
unsigned char *pstSqNum;
unsigned char *pstStNum;
unsigned char *pstTest;
unsigned char *pstutcTime;
unsigned char *pstTimeAllow;
}GSE_IEC_CTRL;
typedef struct iec_goose_send_user_info
{
struct iec_goose_send_user_info * next;
struct iec_goose_send_user_info * prev;
unsigned int goose_state; /*TRUE, ready to send GOOSE */
double next_time; /*下次发送时间 */
unsigned int retrans_curve_offset; /*offset to current retrans curve */
void * curve_pointer; /*pointer to retransmission curve*/
GSE_IEC_CTRL * gptr; /*pointer to GOOSE Control */
// MVL_NVLIST_CTRL * nvl; /*pointer to Data Set associated with GOOSE*/
// MVL_IND_PEND * scan_ind; /*pointer to structure that allows for polling*/
unsigned char dstAddress[MAC_ADDR_SIZE]; /*destination MAC address to which GOOSE will be sent */
unsigned short etype_tci; /* Ethertype TCI */
unsigned short etype_id; /* Ethertype ID */
unsigned short etype_appID; /* Ethertype AppID */
unsigned char val_changed; /* 有数据变化需要触发goose */
}IEC_GOOSE_SEND_USER_INFO;
/********************* 下面的结构体不再使用,这里仅仅保留 *******************/
typedef struct
{
unsigned char devAddr;
unsigned char devCpu;
union
{
struct
{
#ifdef CONFIG_CPU_BIG_ENDIAN
unsigned char infHigh;
unsigned char infLow;
#else
unsigned char infLow;
unsigned char infHigh;
#endif
} inf_struc;
unsigned short inf;
} inf_union;
unsigned int unique; //根据上述4项计算出来的唯一值
char infType; //信息对象类型,遥测C/遥信X/遥控K/定植Z/GOOSE S/
} DATAMAP_USER_INFO;
#ifdef __cplusplus
}
#endif
#endif