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.

453 lines
12 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_reqm.h
* @author yh huiy@xjgc.com */
/* */
/* 日期 作者 注释 */
/* 2007/07/16 YH 创建文件 */
/****************************************************************************/
#ifndef IEC61850_AC_REQM_INCLUDED
#define IEC61850_AC_REQM_INCLUDED
#include "ai_def.h"
#include "mms_mp.h"
#include "mvl_defs.h"
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_FILE_NAME_LENGTH 255
/** 关联服务请求所需信息结构定义*/
typedef struct
{
SOCKET sock; /**< 保存socket句柄用于超时返回时关闭socket */
MVL_NET_INFO *net_info; /**< 关联上以后通道信息结构指针*/
}AC_ASSOC_REQ_CTRL;
/** 读服务请求所需信息结构定义*/
typedef struct
{
AI_OBJ_ID *obj_ids; /**< 命名变量ID数组*/
AI_OBJ_TYPE obj_type; /**< 对象类型*/
ST_INT num_obj; /**< 命名变量个数如果是DS则是DS的数据成员的个数*/
AI_OBJ_VAL *obj_vals; /**< 命名变量的值信息结构指针*/
ST_INT *results; /**< 结果*/
}AC_READ_REQ_CTRL;
/** 读数据集服务请求所需信息结构定义*/
typedef struct
{
AI_OBJ_ID ds_id; /**< 数据集ID*/
ST_INT num; /**< 数据成员数目 */
AI_OBJ_VAL *obj_vals; /**< 每个成员变量的值信息结构指针*/
}AC_GETDSV_REQ_CTRL;
/** 写服务请求所需信息结构定义*/
typedef struct
{
AI_OBJ_VAL *obj_vals; /**< 命名变量的值信息结构指针*/
ST_INT num_obj; /**< 命名变量总数*/
ST_INT *results; /**< 结果*/
}AC_WRITE_REQ_CTRL;
/** 获取ied目录服务请求所需信息结构定义*/
typedef struct
{
ST_CHAR **names; //ld 名称数组
ST_INT num; //ld个数
}AC_GIEDD_REQ_CTRL;
/** 获取ld目录服务请求所需信息结构定义*/
typedef struct
{
ST_CHAR ld_name[MAX_IDENT_LEN+1];
AI_OBJ_TYPE obj_type; //var 或 nvl
ST_CHAR **names; //var或nvl名称数组
ST_INT num; //var个数
ST_BOOLEAN morefollow;
}AC_GLDD_REQ_CTRL;
/** 获取对象结构定义请求所需信息结构定义可以为ln及ln以下所有类型*/
typedef struct
{
AI_OBJ_REF obj_ref;
ST_CHAR *tdl;
}AC_GOBJDEF_REQ_CTRL;
/** 获取ds目录服务请求所需信息结构定义*/
typedef struct
{
AI_OBJ_REF ds_ref;
AI_OBJ_REF *mb_refs;
ST_INT mb_num;
ST_BOOLEAN deletable;
}AC_GDSD_REQ_CTRL;
/** 创建数据集服务请求所需信息结构定义*/
typedef struct
{
AI_OBJ_REF ds_ref; /**< 数据集名称参引*/
ST_INT *mb_ids; /**< 成员ID数组*/
OBJECT_NAME ds_name; /**< 参引*/
OBJECT_NAME *mb_names; /**< 成员参引数组*/
ST_INT num_var; /**< 成员总数*/
ST_INT ds_id; /**< 数据集ID */
} AC_CREDS_REQ_CTRL;
/** 删除数据集服务请求所需信息结构定义*/
typedef struct
{
ST_INT ds_id; /**< 数据集ID*/
} AC_DELDS_REQ_CTRL;
/** 文件服务请求所需信息结构定义*/
typedef struct
{
ST_CHAR filename[MAX_FILE_NAME_LENGTH+1];/**< 文件名称*/
ST_UINT32 filesize; /**< 文件大小 */
MMS_UTC_TIME t; /**< 文件最后修改时间 */
}AC_FILE_ATTRIBUTE_REQ_CTRL;
/**
* 读定值请求结构定义
*/
typedef struct
{
AI_OBJ_ID sgcb_id; /**< sgcb控制块的对象ID */
ST_INT group; /**< 定值组号 */
ST_BOOLEAN isSe; /**< SD_TRUE读编辑区定值SD_FALSE读激活区定值*/
ST_INT sg_num; /**< 取回的定值个数 */
AI_OBJ_VAL *sg_vals; /**< 取回的定值,数组 */
ST_INT counter; /**< 一次读一个定值时,用于未返回的请求计数 */
}AC_GSGV_REQ_CTRL;
/**
* 写定值请求结构定义
*/
typedef struct
{
AI_OBJ_ID sgcb_id; /**< sgcb控制块的对象ID */
ST_INT group; /**< 定值组号 */
ST_INT sg_num; /**< 下发的定值个数 */
AI_OBJ_VAL *sg_vals; /**< 下发的定值,数组 */
ST_INT counter; /**< 一次读写一个定值时,用于未返回的请求计数 */
ST_BOOLEAN write_cnf; /**< 是否包括写定值确认步骤 */
}AC_SSGV_REQ_CTRL;
typedef struct
{
ST_INT frsmid; /**< 从服务器返回的文件标识,一般是服务器端打开文件得到的文件句柄*/
FILE *fp; /**< 本地打开文件得到的句柄 */
}FILE_READ_IDFP;
/**
* 读文件请求结构定义
*/
typedef struct
{
ST_CHAR src_fname[MAX_FILE_NAME_LENGTH+1]; /**< 源文件名称,远方服务器文件名 */
ST_CHAR dest_fname[MAX_FILE_NAME_LENGTH+1]; /**< 目标文件名称,存到本地文件系统中用的名字 */
FILE_READ_IDFP *hp;
}AC_GETF_REQ_CTRL;
/**
* 写文件请求结构定义
*/
typedef struct
{
ST_CHAR src_fname[MAX_FILE_NAME_LENGTH+1]; /**< 源文件名称,本地文件的名字 */
ST_CHAR dest_fname[MAX_FILE_NAME_LENGTH+1]; /**< 目标文件名称,写到远方服务器时用的名字 */
}AC_SETF_REQ_CTRL;
/**
* 删除文件
*/
typedef struct
{
ST_CHAR file_name[MAX_FILE_NAME_LENGTH+1]; /**< 要删除的远方服务器中文件的名字 */
}AC_DELF_REQ_CTRL;
/**
* 文件属性结构定义
*/
typedef struct
{
ST_CHAR file_name[MAX_FILE_NAME_LENGTH+1]; /**< File Name */
ST_INT32 file_size; /**< 文件尺寸 */
ST_TIMESTAMP last_modified; /**< 文件最后修改时间 */
}AC_FILE_ATTR;
/**
* 读文件属性或某个目录下所有文件属性的请求结构定义
*/
typedef struct
{
ST_CHAR file_name[MAX_FILE_NAME_LENGTH+1]; /**< 请求的文件的名称或目录的名称*/
ST_INT file_num; /**< 返回的文件个数如果file_name为文件名则此值为1 */
AC_FILE_ATTR *file_attrs; /**< 返回的文件属性,数组 */
}AC_GETFAV_REQ_CTRL;
/** 控制请求,选择、取消、执行结构中值结构定义 */
typedef struct /* Values -7-2-17.5.2.2 and -8-1-E4.4 */
{
union
{
ST_BOOLEAN bVal; /* SPC or DPC */
ST_INT32 iVal32; /* INC */
ST_INT8 iVal8; /* ISC */
CODE_ENUM_TDEF cdVal;/* BSC*/
ST_UINT8 iUVal8;
struct
{
ST_INT32 iVal; /* for i */
ST_FLOAT fVal; /* for f */
}setMag; /* APC only one attribute f or i shall be present at a given time for APC*/
}val;
struct {
ST_INT8 orCat;
ST_OSTRING64 orIdent;
} origin;
ST_UINT8 ctlNum;
ST_TIMESTAMP operTm;
ST_TIMESTAMP T;
ST_CHECK check;
ST_BOOLEAN Test;
} AC_CTRL_VALUE;
/** 控制请求,选择、取消、执行请求结构定义 */
typedef struct
{
AI_OBJ_ID ctrl_obj;
AC_CTRL_VALUE ctrl_val;
ST_RET result;
}AC_CTRL_REQ_CTRL;
/** 按时间读日志 */
typedef struct
{
EntryID_TDEF EntryID; /**< 条目ID*/
EntryTime_TDEF TimeOfEntry; /**< 条目时间*/
AI_OBJ_VAL *obj_vals; /**< 数据,数组*/
AI_OBJ_REF *obj_ref; /**< 参引*/
ST_INT obj_num; /**< 数据个数*/
ST_RET result;
}AC_QLOGENTRY_CTRL;
/** 按时间读日志 */
typedef struct
{
AI_OBJ_ID dom_id; /**< LDID */
EntryTime_TDEF start_time; /**< 起始时间 */
EntryTime_TDEF stop_time; /**< 终止时间 */
EntryID_TDEF startEntryID; /**< 起始条目ID*/
ST_INT entry_num; /**< 条目个数*/
AC_QLOGENTRY_CTRL *entry_info; /**< 条目信息*/
ST_RET result;
}AC_QLOG_CTRL;
/**
* ENABLE报告请求信息结构
*/
typedef struct
{
AI_OBJ_ID rcb_id; /**< 报告ID*/
ST_INT OptFlds; /**< OptFlds值*/
ST_INT TrgOps; /**< TrgOps值*/
ST_INT IntgPd; /**< IntgPd值*/
ST_BOOLEAN rptEna;
ST_VOID * attr_info;
}AC_ENAREPORT_CTRL;
/** 请求所需信息结构定义*/
typedef struct ac_req_ctrl
{
DBL_LNK l;
ST_INT srv_id; /**< 服务器ID */
IEC61850_OP op; /**< 请求服务类型*/
union{
AC_ASSOC_REQ_CTRL assoCtrl; /**< associate */
AC_READ_REQ_CTRL rdCtrl; /**< read */
AC_WRITE_REQ_CTRL wrCtrl; /**< write */
AC_GIEDD_REQ_CTRL gieddCtrl; /**< get server directory */
AC_GLDD_REQ_CTRL glddCtrl; /**< get ld directory */
AC_GOBJDEF_REQ_CTRL gobjdefCtrl; /**< get obj definition */
AC_GDSD_REQ_CTRL gdsdCtrl; /**< get dataSet directory */
AC_CREDS_REQ_CTRL credsCtrl; /**< create dataSet */
AC_DELDS_REQ_CTRL deldsCtrl; /**< delete dataSet */
AC_GETDSV_REQ_CTRL getdsvCtrl; /**< get dataSet value */
AC_GSGV_REQ_CTRL getsgvCtrl; /**< get sg value */
AC_SSGV_REQ_CTRL setsgvCtrl; /**< set sg value */
AC_CTRL_REQ_CTRL ctrlCtrl; /**< select selectWithVal cancel oper */
AC_GETF_REQ_CTRL getfCtrl; /**< get file */
AC_SETF_REQ_CTRL setfCtrl; /**< set file */
AC_DELF_REQ_CTRL delfCtrl; /**< delete file */
AC_GETFAV_REQ_CTRL getfavCtrl; /**< get file attribute value */
AC_QLOG_CTRL qlogCtrl; /**< querylogbytime */
AC_ENAREPORT_CTRL enaRptCtrl; /**< 报告击活*/
}u; /**< 不同请求服务结构联合体*/
ST_RET result; /**< 服务最终结果,成功或者错误码*/
ST_DOUBLE timeout; /**< 请求超时时间*/
/**< 回调给应用层的回调指针*/
ST_VOID (*u_ac_req_done)(struct ac_req_ctrl *req_ctrl);
ST_VOID *sg_info;
ST_VOID *user_info;
//new
AC_CHANNEL chnl; //A、B网标志
}AC_REQ_CTRL;
/** 服务请求返回给应用层回调函数指针*/
typedef ST_VOID (*U_AC_REQ_DONE)(AC_REQ_CTRL *req_ctrl);
/**
* 构造一个请求实例并将结构成员。
* 服务类型标志赋值、请求超时时间赋值、前一个后一个节点指针赋值
* @param op 服务类型标志目前定义的值为0~20
* @param srv_id 服务器ID
* @param time_out 服务超时时间
* @param u_req_done 服务回调指针
* @return AC_REQ_CTRL *为请求结构内存头指针失败返回NULL
*/
AC_REQ_CTRL *ac_create_reqCtrl(IEC61850_OP op, ST_INT srv_id, ST_INT time_out, U_AC_REQ_DONE u_req_done);
/**
* 销毁一个请求实例
* 根据服务类型释放调用不同服务接口函数释放其成员的资源,最后释放其自身的资源
* @param reqCtrl 请求结构指针
* @return ST_VOID
*/
ST_VOID ac_destroy_reqCtrl(AC_REQ_CTRL *reqCtrl);
/**
* 销毁一个请求实例,先将请求从请求队列中解列,再释放。
* 根据服务类型释放调用不同服务接口函数释放其成员的资源,最后释放其自身的资源
* @param reqCtrl 请求结构指针
* @return ST_VOID
*/
ST_VOID ac_cancel_reqCtrl(AC_REQ_CTRL *reqCtrl);
/**
* 根据服务类型不同调用不同的发送函数发送一个请求
* @param reqCtrl 请求结构指针
* @retval SD_FAILURE 失败
* @retval SD_SUCCESS 成功
*/
ST_RET ac_send_req(AC_REQ_CTRL *reqCtrl);
/**
* 清空一个站点的待发送请求队列。
* 包括解列和释放
* @param srv_id 站点ID
* @return ST_VOID
*/
ST_VOID ac_cleanup_acReqList(ST_INT srv_id);
/**
* 检测已发送请求队列每个请求超时,并处理
* @param net_info 网络通道指针
* @return ST_VOID
*/
ST_VOID ac_mvlReqList_handle(MVL_NET_INFO *net_info);
/**
* 检测待发送队列中每个请求超时,并处理; 是否允许发送,允许则发送
* @param srv_id
* @return ST_VOID
*/
ST_VOID ac_acReqList_handle(ST_INT srv_id);
/**
* 释放MVL_REQ_PEND结构
* @param reqPend 已发送的请求结构指针
* @return ST_VOID
*/
ST_VOID ac_destroy_mvlReqPend(MVL_REQ_PEND *reqPend);
/**
* 检测待发送请求是否超时
* @param reqCtrl 请求结构指针
* @retval SD_TRUE 超时
* @retval SD_FALSE 未超时
*/
ST_BOOLEAN ac_req_timeout(AC_REQ_CTRL *reqCtrl);
/**
* 通过站点的ID向请求链表加入一个请求结构
* @param srv_id 服务器ID
* @param req_ctrl 要加入的请求结构
* @retval SD_SUCCESS 成功 SD_FAILURE 失败
*/
ST_RET ac_add_req_last(ST_INT srv_id, AC_REQ_CTRL *req_ctrl);
/**
* 通过站点的ID获得取得请求链表中第一个请求结构
* @param srv_id 服务器ID
* @retval AC_REQ_CTRL 取得请求链表中第一个请求结构失败或为空返回NULL
*/
AC_REQ_CTRL * ac_get_req_first(ST_INT srv_id);
/**
* 通过站点的ID获得取得请求链表中req_ctrl后一个请求结构
* @param srv_id 服务器ID
* @param req_ctrl 要加入的请求结构
* @retval AC_REQ_CTRL 取得的请求结构失败或为空返回NULL
*/
AC_REQ_CTRL * ac_get_req_next(ST_INT srv_id, AC_REQ_CTRL *req_ctrl);
/**
* 从请求链表里解裂一个请求机构
* @param srv_id 服务器ID
* @param req_ctrl 要解裂的请求结构
*/
ST_VOID ac_unlink_req(ST_INT srv_id, AC_REQ_CTRL *req_ctrl);
/**
* 请求处理结束,调用用户回调
* @param req_ctrl 请求结构
* @param ret 请求处理结果
*/
ST_VOID ac_req_done(AC_REQ_CTRL *req_ctrl, ST_RET ret);
#ifdef __cplusplus
}
#endif
#endif /**< IEC61850_AC_REQM_INCLUDE */