360 lines
11 KiB
C
360 lines
11 KiB
C
|
||
/****************************************************************************
|
||
文件名: 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 time,btime6格式
|
||
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
|