/****************************************************************************/ /* Copyright (c) 2007,许继集团有限公司 */ /* All rights reserved. */ /* */ /* 模块描述: */ /** 提供解析报告数据服务的接口 * @file ac_rpt.c * @author yh huiy@xjgc.com */ /* */ /* 日期 作者 注释 */ /* 2009/04/07 DJF 重构报告解析流程,改用缓存机制过滤双网报告 */ /* 2007/07/16 YH 创建文件 */ /****************************************************************************/ #ifndef IEC61850_RPT2_INCLUDED #define IEC61850_RPT2_INCLUDED #include "glbtypes.h" #include "ai_obj.h" #ifdef __cplusplus extern "C" { #endif /** * 报告传送原因,为应用层方便,把掩码形式的传送原因变成枚举型, * 如果报告中同时同时出现多个触发选项,则上送优先级高的选项,优先级依次为DCHG、QCHG、DUPD、GI、INTGPD */ typedef enum { RPT_REASON_UNKNOWN, RPT_REASON_DCHG, RPT_REASON_QCHG, RPT_REASON_DUPD, RPT_REASON_INTGPD, RPT_REASON_GI } AC_REPORT_REASON; /** * 报告触发选项定义,和本地数据格式的trgop值一致,长度为一个字节 */ #define TRG_RESERVED 0x80 #define TRG_DCHG 0x40 #define TRG_QCHG 0x20 #define TRG_DUPD 0x10 #define TRG_INTGRD 0x08 #define TRG_GI 0x04 #define TRG_UNKNOWN 0x02 /** * OPTFLDS值定义 */ #define OPT_RESERVED 0x80 #define OPT_SEQNUM 0x40 #define OPT_REPORT_TIME_STAMP 0x20 #define OPT_REASON_FOR_INCLUSION 0x10 #define OPT_DATA_SET_NAME 0x08 #define OPT_DATA_REFERENCE 0x04 #define OPT_BUFFER_OVERFLOW 0x02 #define OPT_ENTRYID 0x01 #define OPT_CONF_REVISION 0x8000 #define OPT_SEGMENTATION 0x4000 #define OPT_UNKNOWN 0x2000 /** * 报告数据集中的一个对象的信息,初始化时建立,解析报告时用到这些信息。 */ typedef struct { ST_CHAR *data_ptr; /**< 指向对象空间中的值 */ ST_CHAR *data; /**< 存放从报告中解析出来的值 */ ST_INT data_size; /**< 值占有的空间大小 */ ST_TIMESTAMP *t; /**< 指向data中的t */ RUNTIME_TYPE *rt; /**< 对象的rt,用于解析报告中的数据 */ AI_OBJ_VAL obj_val; /**< 对象的objVal,其中的每个prim的指针指向对象空间中对象的值 */ }AC_RPT_ENTRYDATA; //缓存entrydata的条数 #define RPT_ENTRYDATA_BUF_NUM 50 typedef struct { AI_OBJ_ID obj_id; ST_TIMESTAMP t; }AC_ENTRYDATA_BUF_UNIT; typedef struct { AC_ENTRYDATA_BUF_UNIT units[RPT_ENTRYDATA_BUF_NUM]; ST_INT index; }AC_ENTRYDATA_BUF; /** * 报告解析过程中使用的报告的数据集和报告的信息 * 应用程序在刷新对象空间后初始化 */ typedef struct { ST_BOOLEAN init_ok; /**< 初始化完成标志 */ ST_CHAR rptID[MAX_IDENT_LEN+1]; /**< RPTID*/ ST_INT rcb_id; /**< 报告控制块的ID*/ ST_CHAR dsRef[MAX_REFERENCE_LENGTH + 1]; /**< 数据集成员参引 */ AI_DS_CTRL *ds; /**< 数据集指针*/ ST_INT entry_num; /**< 数据集对象个数 */ AC_RPT_ENTRYDATA *entry_datas; /**< 数据集成员信息*/ ST_UCHAR *includebit; /**< 报告中包含的数据集成员的掩码,初始化时申请内存 */ RUNTIME_TYPE *includebit_rt; /**< includebit的RUNTIME_TYPE指针*/ ST_INT includebit_TYPEID; /**< includebit的typeid*/ AC_ENTRYDATA_BUF entry_buf; /**< 报告缓冲区,用于过滤双网报告*/ }AC_RCB_INFO; /** * 报告解析过程中使用的报告的数据集和报告的信息,解析过程中使用的临时缓存指针 * 应用程序在刷新对象空间后初始化 */ typedef struct { AC_RCB_INFO *rcb_info; /**< 报告控制块信息数组*/ ST_INT rcb_num; /**< 报告控制块个数*/ ST_BOOLEAN init_flag; /**< 是否初始化*/ }AC_IED_RCB_INFO; /** * 控制报告恢复给应用层时用的结构 */ typedef struct { ST_CHAR obj_ref[MAX_REFERENCE_LENGTH + 1]; ST_RET result; ST_INT8 add_cause; ST_UINT8 ctrl_num; /**< ctlNum值 */ }AC_CTLREPORT_CTRL; /** * 终止化报告要用到的数据集信息。 * @param rcb_info 报告的数据集及报告ID,及报告解析过程中使用的临时缓存的内存的释放 * @return ST_VOID 无 */ ST_VOID ac_uninit_rpt(AC_IED_RCB_INFO *rcb_info); /** * 初始化报告要用到的数据集信息 * @param ied srv指针 * @param rcb_info 报告块指针 * @retval SD_FAILURE 失败 * @retval SD_SUCCESS 成功 */ ST_RET ac_init_rpt(AI_IED_CTRL *ied, AC_IED_RCB_INFO *rcb_info); extern ST_VOID (*u_ac_on_recv_report)( VISIBLE_STRING65_TDEF rptID, /**< 传出rptid,应用层可用来映射到特定用途,如故障报告*/ ST_INT obj_num, /**< 对象个数*/ AI_OBJ_VAL *obj_val, /**< 对象数据,数组*/ ST_BOOLEAN *val_chgs, /**< 指示每个obj的值是否有变化,数组,本地写对象空间的接口要添加传出参数,指明数据是否发生变化*/ AC_REPORT_REASON *reasons, /**< 指示报告上送原因*/ ST_INT srv_id); /**< IEDID*/ extern ST_VOID (*u_ac_on_ctl_report)( AC_CTLREPORT_CTRL *ctl_rpt_ctrl, /**< 控制报告结构指针*/ ST_INT srv_id); /**< IEDID*/ #ifdef __cplusplus } #endif #endif