162 lines
5.3 KiB
C
162 lines
5.3 KiB
C
/****************************************************************************/
|
||
/* 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
|