2025-04-30 16:24:29 +08:00

162 lines
5.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/****************************************************************************/
/* Copyright (c) 2008,许继集团有限公司 */
/* All rights reserved. */
/* */
/* 模块描述: */
/** goose接收处理模块
* @file gse_rx.h */
/* */
/* 日期 作者 注释 */
/* 2010/01/20 DJF 创建文件 */
/****************************************************************************/
#ifndef IEC61850_GSE_RX_H
#define IEC61850_GSE_RX_H
#include "sysincs.h"
#include "glbtypes.h"
#include "as_damap.h"
#include "mms_def2.h"
#ifdef __cplusplus
extern "C" {
#endif
//接收goose错误类型定义
#define GSE_RX_ERR_GOREF 0x00000001 //goref不一致
#define GSE_RX_ERR_GOID 0x00000002 //goose的go不一致
#define GSE_RX_ERR_DS 0x00000004 //DATASET不一致
#define GSE_RX_ERR_MAC 0x00000008 //mac地址不一致
#define GSE_RX_ERR_UNIT_NUM 0x00000010 //unit个数不一致
#define GSE_RX_ERR_DA_TYPE 0x00000020 //DA类型个数不一致
#define GSE_RX_ERR_CONFREV 0x00000040 //配置版本号不一致
#define GSE_RX_ERR_NDSCOM 0x00000080 //
typedef struct
{
DBL_LNK l;
ST_INT ofset;
ST_CHAR local_ref[MAX_IDENT_LEN + 1];
}GSE_DA_LINK;
//解析scl文件中inputs节点中的goose连线配置生成的结构
typedef struct
{
DBL_LNK l;
ST_UINT appid;
ST_UCHAR dstMac[6];//组播地址
ST_UINT16 danum;//数据集中成员个数
ST_UINT32 confRev;
ST_CHAR goID [MVL61850_MAX_OBJREF_LEN + 1]; /* GoID in IEC 61850 */
ST_CHAR dataSet [MVL61850_MAX_OBJREF_LEN + 1];/* DatSet in IEC 61850 */
ST_CHAR GoCBRef [MVL61850_MAX_OBJREF_LEN + 1];/* name */
GSE_DA_LINK * gs_da_link_list;
int timeValidate; //GOOSE报文中时间是否有效,hsj add 2012-03-30
}GSE_IN_CTRL;
typedef struct
{
ST_BOOLEAN connected;//是否处于连接状态
ST_INT eth_index;//网卡序号
ST_DOUBLE rx_time;//时限
}GOOSE_RX_CHNL;
typedef struct
{
ST_INT da_map_num;//个数同一个开入对应多个damap可能==0
AS_DA_MAP ** da_maps;//数组同一个开入对应多个damap指向ln下的datamap数组中可能==NULL
}GOOSE_MAP_CTRL;
typedef struct
{
DBL_LNK l;
struct
{
ST_UINT16 etypeAppid; //通信部分的appid
ST_UCHAR dstMac[6];//组播地址
//ST_CHAR gcRef [MVL61850_MAX_OBJREF_LEN + 1]; /* GoCBRef in IEC 61850 */
//ST_CHAR dataSetRef [MVL61850_MAX_OBJREF_LEN + 1];/* DatSet in IEC 61850 */
//ST_CHAR appID [MVL61850_MAX_OBJREF_LEN + 1]; /* GoID in IEC 61850 */
int timeValidate; //GOOSE报文中时间是否有效,hsj add 2012-03-30
int ctrlIndex; //控制块序号从0开始 2012-05-09
}ini_info;//初始化时传入的信息
//下面是解析goose得到的
ST_CHAR gcRef [MVL61850_MAX_OBJREF_LEN + 1]; /* GoCBRef in IEC 61850 */
ST_UINT32 timeToLive;
ST_CHAR dataSetRef [MVL61850_MAX_OBJREF_LEN + 1];/* DatSet in IEC 61850 */
ST_BOOLEAN appID_pres;
ST_CHAR appID [MVL61850_MAX_OBJREF_LEN + 1]; /* GoID in IEC 61850 */
MMS_UTC_TIME utcTime;
ST_UINT32 stNum;
ST_UINT32 sqNum;
ST_BOOLEAN test;
ST_UINT32 confRev;
ST_BOOLEAN needsCommissioning;
ST_UINT32 entryNum;
ST_INT32 numUnits; //dataset中包含的简单类型的数据单元个数
GOOSE_MAP_CTRL * goose_maps;//每个unit对应一个GOOSE_MAP_CTRL结构
ST_INT chnl_num;//通道个数
GOOSE_RX_CHNL * chnls;//接收通道
}GSE_RX_CTRL;
/**
* goose接收处理后的回调用户实现。收到的数据在gser_ctrl结构里。
* gser_ctrl->map_entry, 指针数组注意可能有为NULL的指针除非goose数据集中的每个简单成员都配了map信息
* gser_ctrl->numDataMaps, 数组大小
*/
extern ST_VOID (* u_as_recved_goose_callback )( GSE_RX_CTRL * gser_ctrl, ST_UINT32 err );
/**
* goose解析出错的回调
*/
//extern ST_VOID (* u_as_goose_parse_err )( GSE_RX_CTRL * gserCtrl, GSE_RX_ERR_TYPE err);
/**
* goose通道中断或连接上的回调。
* con, SD_TRUE 连接恢复正常SD_FALSE 连接异常超过2倍以上TimeToLive时间没有收到goose
*/
extern ST_VOID (* u_as_goose_connected )( ST_INT eth_index, GSE_RX_CTRL * gserCtrl, ST_BOOLEAN con );
/**
* 此goose控制块的所有接收通道都断了
*/
extern ST_VOID (* u_as_goose_allchnl_disconnected )( GSE_RX_CTRL * gserCtrl );
/************************************************************************/
/* goose接收端初始化处理 */
/************************************************************************/
ST_RET as_create_all_GooseSubscribe ( void );
ST_VOID as_unsubscribe_goose( void );
/**
* 接收goose报文并解析解析结果通过回调通知用户。每次最多处理50帧报文
* eth_index, 网卡序号
* return本次调用共处理了多少帧报文不只是goose
*/
ST_INT as_get_goose_messages( ST_INT eth_index );
ST_VOID parse_goose_message( ST_UCHAR * message, ST_INT eth_index, ST_UCHAR * dst_mac );
/**
* 根据传入appid查找gseRecv_ctrl
*/
GSE_RX_CTRL * as_find_gseRecv_ctrl( ST_UINT16 etypeAppid );
/**
* 检查是否有网络中断的goose接收控制块需循环调用
*/
ST_VOID as_check_gseRecv_timeOut( void );
#ifdef __cplusplus
}
#endif
#endif