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