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.

169 lines
5.0 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.

/****************************************************************************/
/* 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