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