/**************************************************************************** 文件名: 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