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.

148 lines
4.5 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. */
/* */
/* 模块描述: */
/**本地对象空间目录服务模块
* 选择激活定值区 SelectActiveSG
* 选择编辑定值区 SelectEditSG
* 读定值 GetSGValues
* 写定值 SetSGValues
* 确认编辑定值 ConfirmEditSGValues
* 读定值控制块 GetSGCBValues
* @file ac_sg.h */
/* */
/* 日期 作者 注释 */
/* 2007/09/18 guoqiang 创建文件 */
/****************************************************************************/
#ifndef IEC61850_AC_SG_INCLUDED
#define IEC61850_AC_SG_INCLUDED
/**
*
*/
#include "ai_obj.h"
#include "ac_reqm.h"
#ifdef __cplusplus
extern "C" {
#endif
/** 读定值服务请求所需信息结构定义*/
typedef struct
{
AI_OBJ_ID sgcb_id; /**< 定值控制块ID*/
ST_INT group_num; /**< 读定值组,如果传入-1则认为是读当前激活区*/
ST_INT num_obj;
AI_OBJ_ID *obj_ids;
U_AC_REQ_DONE u_callback; /**< 用户回调指针*/
ST_INT timeout; /**< 超时时间*/
}AC_GETSGV_REQ_INFO;
/** 写定值服务请求所需信息结构定义*/
typedef struct
{
AI_OBJ_ID sgcb_id; /**< 定值控制块ID*/
ST_INT group_num; /**< 写定值组*/
ST_INT sg_num; /**< 写定值个数*/
AI_OBJ_VAL *sg_vals; /**< 写定值值数组*/
U_AC_REQ_DONE u_callback; /**< 用户回调指针*/
ST_INT timeout; /**< 超时时间*/
}AC_SETSGV_REQ_INFO;
/**
* 一个LD下所有定值的fcd集合
*/
typedef struct
{
AI_OBJ_ID sgcb_id; /**< 定值控制块ID*/
ST_INT sg_num; /**< 定值个数*/
AI_OBJ_ID *sg_ids; /**< 激活区定值ID*/
AI_OBJ_ID *se_ids; /**< 编辑区定值ID*/
}AC_LD_SG_CTRL;
/**
* 一个IED下所有定值的fcd集合
*/
typedef struct
{
ST_INT sgcb_num; /**< 定值控制块个数*/
AC_LD_SG_CTRL *ldsg_ctrl;/**< IED下的AC_LD_SG_CTRL结构数组*/
}AC_IED_SG_CTRL;
/**
* 初始化客户端定值管理.
* 先在ied内查找sgcb对象然后查找fc为SG和SE的fcd存到全局变量s_ied_sgs中。
* 在每个ied对象空间创建完毕后调用此接口。
* @param ied ied对象
* @param ied_sg_ctrl 定值管理信息
*/
ST_VOID ac_init_sg(AI_IED_CTRL *ied, AC_IED_SG_CTRL *ied_sg_ctrl);
/**
* 反初始化定值管理
* 释放初始化时分配的空间,在释放每个站点时调用
* @return ST_VOID
*/
ST_VOID ac_uninit_sg(AC_IED_SG_CTRL *ied_sg_ctrl);
/**
* 在s_ied_sgs里查找和传入的sgcb对应ld_sg_ctrl
* @param srv_id 服务器ID
* @param sgcb 定值控制块ID
* @return 指向AC_LD_SG_CTRL结构的指针
*/
AC_LD_SG_CTRL *ac_find_ld_sg_ctrl(ST_INT srv_id, AI_OBJ_ID sgcb);
/**
* 读定值读取sgcb_id所属的ld下的所有定值。
* 首先读sgcb的值得到当前区号、编辑区号及定值区个数。
* 如果要读的定值区号group_num==act_sg则直接从激活区读取定值
* 如果要读的定值区号group_num==edit_sg则直接从编辑区读取定值
* 如果要读的定值区号group_num!=act_sg && group_num!=edit_sg
* 则要先把编辑区号切换为group_num然后从编辑区里读定值。
* 支持两种模式一次取完和分多次取。定值对应的fcd的id从全局变量g_ied_sgs中取。
* @param srv_id 服务器ID
* @param setSgv_info 读定值服务请求信息结构指针
* @param req 请求结构(输出)
*/
ST_RET ac_get_sg_values(ST_INT srv_id, AC_GETSGV_REQ_INFO *getSgv_info, AC_REQ_CTRL **req);
/**
* 写定值。首先读sgcb的值得到当前区号act_sg、编辑区号edit_sg及定值区个数num_of_sg。
* 如果要写的定值区号group_num==edit_sg则直接下发写服务
* 如果要写的定值区号group_num!=edit_sg则切换编辑区为group_num 然后再下发写服务;
* 最后下发确认定值编辑服务,直到这步返回成功,才认为整个写定值成功。
* 支持两种模式,一次写完和分多次写。
* @param srv_id 服务器ID
* @param setSgv_info 写定值服务请求信息结构指针
* @param req 请求结构(输出)
*/
ST_RET ac_set_sg_values(ST_INT srv_id, AC_SETSGV_REQ_INFO *setSgv_info, AC_REQ_CTRL **req);
/**
* 不包括写定值确认步骤的写定值请求
*/
ST_RET ac_set_sg_values_pre(ST_INT srv_id, AC_SETSGV_REQ_INFO *setSgv_info, AC_REQ_CTRL **req);
/**
* 释放读定值控制块结构指针getSgv_ctrl指向的内存.
* @param getSgv_ctrl 读定值控制块结构指针
* @return ST_VOID
*/
ST_VOID ac_cleanup_getSgvCtrl(AC_GSGV_REQ_CTRL *getSgv_ctrl);
/**
* 释放写定值控制块结构指针setSgv_ctrl指向的内存.
* @param setSgv_ctrl 读定值控制块结构指针
* @return ST_VOID
*/
ST_VOID ac_cleanup_setSgvCtrl(AC_SSGV_REQ_CTRL *setSgv_ctrl);
#ifdef __cplusplus
}
#endif
#endif /**< IEC61850_AC_SG_INCLUDE */