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.

913 lines
36 KiB
C

1 year ago
#ifndef SCL_INCLUDED
#define SCL_INCLUDED
/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 2004-2004 All Rights Reserved */
/* */
/* MODULE NAME : scl.h */
/* PRODUCT(S) : MMS-EASE-LITE */
/* */
/* MODULE DESCRIPTION : */
/* SCL main header file. */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 07/25/05 JRB 12 scl2_ld_create_all: Add brcb_bufsize arg. */
/* SCL_INFO: add brcb_bufsize element. */
/* 06/28/05 JRB 11 Del scl2_ld_destroy_all. Use mvl_vmd_destroy.*/
/* 06/24/05 JRB 10 Chg "ord" from unsigned to signed value. */
/* 05/27/05 CRM 09 Add scl_info_destroy & scl2_ld_destroy_all. */
/* 03/22/05 JRB 08 Add ifdef __cplusplus to work with C++ code. */
/* 02/15/05 JRB 07 Add iedName to SCL_INFO. */
/* Add domName to SCL_LD & SCL_FCDA. */
/* Add varName to SCL_LN. */
/* Define SCL_HEADER struct & add it to SCL_INFO.*/
/* Add scl_header_save. */
/* 08/06/04 JRB 06 Add scl_parse. */
/* Move mapping functions to user header. */
/* 07/19/04 JRB 05 Add out_filename arg to datamap_cfg_read. */
/* Add any_cfg_count proto. */
/* 07/15/04 JRB 04 Clean up SCL_GCB, scl_gcb_add. */
/* 07/09/04 JRB 03 scl2_ld_create_all: add reportScanRate arg. */
/* 07/02/04 JRB 02 Add SCL_LCB, SCL_GCB, scl_lcb_add, scl_gcb_add.*/
/* 06/08/04 JRB 01 Initial Revision. */
/************************************************************************/
#include "gen_list.h"
#include "mms_def2.h" /* need MAX_IDENT_LEN */
#include "mvl_defs.h" /* need MVL_VAR_ASSOC, etc. */
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_VALKIND_LEN 4 /* Spec, Conf, RO, or Set */
#define MAX_CDC_LEN 5 /* SPS, DPS, etc. (CURVE is longest) */
#define MAX_FC_LEN 2 /* ST, MX, etc. */
/* These defines used in SCL_DA struct to differentiate between structs */
/* containing DA info and structs containing SDO info. */
#define SCL_OBJTYPE_DA 0
#define SCL_OBJTYPE_SDO 1
/* This def used for flattened leaf names (longer to allow array indices)*/
#define MAX_FLAT_LEN (MAX_IDENT_LEN*2)
#define MAX_OBJECT_NAME_LEN 32 /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>ӽڵ<D3BD><DAB5>ĸ<EFBFBD><C4B8>ڵ<EFBFBD><DAB5><EFBFBD>ʶ */
#define P_ADDRESS 0
#define P_GSE 1
#define P_SMV 2
#define P_PHYSCONN 3
#define MAX_AR_NAME 64
#define MAX_AP_TITLE 80
#define MAX_AE_QUAL 32
/************************************************************************/
/* Structures to contain information from "Header" section of SCL. */
/************************************************************************/
typedef struct
{
/* NOTE: only required elements included here. Add optional elements as needed.*/
ST_CHAR id [MAX_IDENT_LEN+1];
/* Defined values for "nameStructure" attribute */
#define SCL_NAMESTRUCTURE_IEDNAME 0 /* value="IEDName" */
#define SCL_NAMESTRUCTURE_FUNCNAME 1 /* value="FuncName" */
ST_INT nameStructure;
} SCL_HEADER;
/************************************************************************/
/* Structures to contain information from "AccessPoint" section of SCL.*/
/************************************************************************/
/* "scl_fcda_add" allocates this struct, fills it in, */
/* and adds it to the linked list "fcdaHead" in SCL_DATASET. */
typedef struct
{
DBL_LNK l;
ST_CHAR domName[MAX_IDENT_LEN+1]; /* domain name (constructed) */
ST_CHAR ldInst [MAX_IDENT_LEN+1];
ST_CHAR prefix [MAX_IDENT_LEN+1];
ST_CHAR lnInst [MAX_IDENT_LEN+1];
ST_CHAR lnClass [MAX_IDENT_LEN+1];
ST_CHAR doName [MAX_IDENT_LEN+1];
ST_CHAR daName [MAX_IDENT_LEN+1];
ST_CHAR fc [MAX_FC_LEN+1]; /* ST, MX, etc. */
} SCL_FCDA;
/* "scl_dai_add" allocates this struct, fills it in, */
/* and adds it to the linked list "daiHead" in SCL_LN. */
/* The "flattened" name must be constructed from the "name" & "ix" */
/* attribute of the DOI and DAI and possibly the intervening SDI, */
/* where "ix" is an array index (we'll need some new flattened name */
/* syntax to handle the array index). */
/* The "accessControl" attr of DOI is ignored (don't know what it means).*/
/* The "desc" attr of DOI, SDI, & DAI are ignored (not useful). */
typedef struct
{
DBL_LNK l;
ST_CHAR flattened[MAX_IDENT_LEN+1]; /* flattened attribute name */
/* constructed from "name" & "ix"*/
/* from DOI, SDI, & DAI */
ST_CHAR desc[MAX_IDENT_LEN+1]; //<2F><><EFBFBD><EFBFBD>DOI<4F><49>desc<73><63><EFBFBD><EFBFBD>
ST_CHAR *Val; /* attribute value text */
/* allocate appropriate size buffer*/
ST_CHAR sAddr[MAX_IDENT_LEN+1]; /* from DAI */
ST_CHAR valKind[MAX_VALKIND_LEN+1]; /* from DAI */
} SCL_DAI;
/* "scl_dataset_add" allocates this struct, */
/* and adds it to the linked list "datasetHead" in SCL_LN. */
typedef struct
{
DBL_LNK l;
ST_CHAR name[MAX_IDENT_LEN+1]; /* dataset name */
ST_CHAR desc[MAX_IDENT_LEN+1]; /* description (optional)*/
/* TRUNCATED if longer than buffer*/
SCL_FCDA *fcdaHead; /* head of list of FCDA */
} SCL_DATASET;
/* "scl_rcb_add" allocates this struct, fills it in, */
/* and adds it to the linked list "rcbHead" in SCL_LN. */
typedef struct
{
DBL_LNK l;
ST_CHAR name[MAX_IDENT_LEN+1];
ST_CHAR desc[MAX_IDENT_LEN+1]; /* description (optional)*/
/* TRUNCATED if longer than buffer*/
ST_CHAR datSet[MAX_IDENT_LEN+1];
ST_UINT intgPd;
ST_CHAR rptID[MAX_IDENT_LEN+1];
ST_UINT confRev;
ST_BOOLEAN buffered; /* TRUE if this is buffered RCB */
ST_UINT bufTime;
ST_UINT8 TrgOps [1]; /* 8-bit bitstring */
/* Boolean vals from SCL file */
/* (dchg, qchg, dupd, & period) */
/* used to set bits in TrgOps bitstring */
ST_UINT8 OptFlds [2]; /* 9-bit bitstring */
/* Boolean vals from SCL file */
/* (seqNum, timeStamp, dataSet, */
/* reasonCode, dataRef, bufOvfl, */
/* entryID, configRef) */
/* segmentation boolean is ignored */
/* used to set bits in OptFlds bitstring*/
/* NOTE: the RptEnabled element of the SCL file is ignored. SISCO software*/
/* does not need to know which clients may access the RCB. */
ST_INT max_num;//ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} SCL_RCB; /* Report Control Block */
typedef struct
{
/* Counters of different types of BRCB. */
ST_UINT brcb_count_complex;
ST_UINT brcb_count_ST;
ST_UINT brcb_count_MX;
ST_UINT brcb_count_CO;
ST_UINT brcb_count_SP;
ST_UINT brcb_count_SG;
ST_UINT brcb_count_SE;
ST_UINT brcb_count_SV;
ST_UINT brcb_count_CF;
ST_UINT brcb_count_DC;
ST_UINT brcb_count_EX;
/* Counters of different types of URCB. */
ST_UINT urcb_count_complex;
ST_UINT urcb_count_ST;
ST_UINT urcb_count_MX;
ST_UINT urcb_count_CO;
ST_UINT urcb_count_SP;
ST_UINT urcb_count_SG;
ST_UINT urcb_count_SE;
ST_UINT urcb_count_SV;
ST_UINT urcb_count_CF;
ST_UINT urcb_count_DC;
ST_UINT urcb_count_EX;
} SCL_RCB_COUNTERS;
/************************************************************************/
/* LOG Control Block */
/* "scl_lcb_add" allocates this struct, fills it in, */
/* and adds it to the linked list "lcbHead" in SCL_LN. */
typedef struct
{
DBL_LNK l;
ST_CHAR name[MAX_IDENT_LEN+1];
ST_CHAR desc[MAX_IDENT_LEN+1]; /* description (optional)*/
/* TRUNCATED if longer than buffer*/
ST_CHAR datSet[MAX_IDENT_LEN+1];
ST_UINT intgPd;
ST_CHAR logName[MAX_IDENT_LEN+1];
ST_BOOLEAN logEna;
ST_BOOLEAN reasonCode;
ST_UINT8 TrgOps [1]; /* 8-bit bitstring */
/* Boolean vals from SCL file */
/* (dchg, qchg, dupd, & period) */
/* used to set bits in TrgOps bitstring */
} SCL_LCB;
/************************************************************************/
/* Added By djf 2007-08-16 */
/* Setting Group Control Block */
/* "scl_sgcb_add" allocates this struct, fills it in, */
/*and adds it to the linked list "sgcbHead" in SCL_LN */
typedef struct
{
ST_CHAR *desc; /* description (optional)*/
/* TRUNCATED if longer than buffer*/
ST_UINT numOfSG; /* Number of SG */
ST_UINT actSG; /* ActSG */
} SCL_SGCB;
/************************************************************************/
/* GOOSE Control Block */
/* "scl_gcb_add" allocates this struct, fills it in, */
/* and adds it to the linked list "gcbHead" in SCL_LN. */
typedef struct
{
DBL_LNK l;
ST_CHAR name[MAX_IDENT_LEN+1];
ST_CHAR desc[MAX_IDENT_LEN+1]; /* description (optional)*/
/* TRUNCATED if longer than buffer*/
ST_CHAR datSet[MAX_IDENT_LEN+1]; /* for GOOSE only */
ST_UINT confRev; /* for GOOSE only */
ST_BOOLEAN isGoose; /* SD_TRUE if "GOOSE", SD_FALSE if "GSSE"*/
ST_CHAR appID[MAX_IDENT_LEN+1]; /* for GOOSE only */
/* The SCL file may also contain one or more "IEDName" elements to */
/* indicate IEDs that should subscribe for GOOSE data. We have no */
/* way to use this information, so it is ignored. */
} SCL_GCB;
/* added for do desc 20080617 djf */
typedef struct
{
DBL_LNK l;
ST_CHAR doName[MAX_IDENT_LEN+1];
ST_CHAR desc[MAX_IDENT_LEN+1];
}SCL_DOI;
/* "scl_ln_add" allocates this struct, fills it in, */
/* and adds it to the linked list "lnHead" in SCL_LD. */
typedef struct
{
DBL_LNK l;
ST_CHAR varName[MAX_IDENT_LEN+1]; /* variable name (constructed) */
ST_CHAR desc[MAX_IDENT_LEN+1]; /* description (optional)*/
/* TRUNCATED if longer than buffer*/
ST_CHAR lnType[MAX_IDENT_LEN+1]; /* LN Type name */
ST_CHAR lnClass[MAX_IDENT_LEN+1]; /* LN Class name */
/* for LN0, must be "LLN0" */
ST_CHAR inst[MAX_IDENT_LEN+1]; /* LN inst name */
/* for LN0, must be "" (empty string)*/
ST_CHAR prefix[MAX_IDENT_LEN+1]; /* LN prefix name */
/* for LNO, ignored */
SCL_DAI *daiHead; /* head of list of DAI */
SCL_DATASET *datasetHead; /* head of list of DataSet */
SCL_RCB *rcbHead; /* head of list of RCB (Report Control) */
SCL_LCB *lcbHead; /* head of list of LCB (Log Control) */
SCL_GCB *gcbHead; /* head of list of GCB (GOOSE Control) */
/* NOTE: In LN or LN0: Inputs ignored */
/* NOTE: In LN0: SampledValueControl, SettingControl, SCLControl ignored*/
/* Added By djf 2007-08-16 */
SCL_SGCB *sgcbPtr; /* the ptr of SGCB only for LLN0 */
/* added djf 20080617 */
SCL_DOI *doiHead; /* <20><><EFBFBD><EFBFBD>doi<6F>е<EFBFBD>desc */
MVL_VAR_ASSOC *mvl_var_assoc; /* MVL Variable Association created from LN info*/
} SCL_LN; /* Logical Node (LN or LN0 in SCL) */
/* "scl_ld_create" allocates this struct */
/* and adds it to the linked list "ldHead" in SCL_INFO. */
typedef struct
{
DBL_LNK l;
ST_CHAR domName[MAX_IDENT_LEN+1]; /* domain name (constructed) */
ST_CHAR desc[MAX_IDENT_LEN+1]; /* description (optional)*/
/* TRUNCATED if longer than buffer*/
ST_CHAR inst[MAX_IDENT_LEN+1]; /* LD inst name */
SCL_LN *lnHead; /* head of list of LN */
/* NOTE: AccessControl in LDevice is ignored */
} SCL_LD; /* Logical Device (LDevice in SCL)*/
/************************************************************************/
/* Structures to contain information from "DataTypeTemplates" section of SCL.*/
/************************************************************************/
/* This structure should be allocated and filled in by the function */
/* "scl_lntype_add_do". */
typedef struct scl_do
{
/* CRITICAL: First 2 parameters used to add this struct to linked */
/* lists using list_add_last, etc. */
struct scl_do *next; /* CRITICAL: DON'T MOVE. */
struct scl_do *prev; /* CRITICAL: DON'T MOVE. */
ST_CHAR name[MAX_IDENT_LEN+1]; /* data object name */
ST_CHAR desc[MAX_IDENT_LEN+1]; //<2F><><EFBFBD><EFBFBD>
ST_CHAR type[MAX_IDENT_LEN+1]; /* data object type */
} SCL_DO;
typedef struct scl_lntype
{
/* CRITICAL: First 2 parameters used to add this struct to linked */
/* lists using list_add_last, etc. */
struct scl_lntype *next; /* CRITICAL: DON'T MOVE. */
struct scl_lntype *prev; /* CRITICAL: DON'T MOVE. */
ST_CHAR id[MAX_IDENT_LEN+1]; /* name used to reference this LN Type*/
ST_CHAR lnClass[MAX_IDENT_LEN+1]; /* logical node class */
SCL_DO *doHead; /* head of list of DO */
/* scl_lntype_add_do adds to list */
} SCL_LNTYPE;
/* This structure should be allocated and filled in by the function */
/* "scl_dotype_add_da" OR "scl_dotype_add_sdo", and possibly modified by the optional */
/* function "scl_dotype_add_da_val". */
/* NOTE: the same structure must be used for DA or SDO because each must */
/* be put on the same linked list in the order they are read from the SCL file.*/
/* Most of the parameters are relevant only for DA elements. They are */
/* ignored if this is an SDO (i.e. objtype=SCL_OBJTYPE_SDO). */
typedef struct
{
DBL_LNK l;
ST_CHAR name[MAX_IDENT_LEN+1]; /* DA or SDO name */
ST_INT objtype; /* SCL_OBJTYPE_DA or SCL_OBJTYPE_SDO */
ST_CHAR desc[MAX_IDENT_LEN+1]; /* DA or SDO description (optional)*/
/* TRUNCATED if longer than buffer */
ST_CHAR sAddr[MAX_IDENT_LEN+1]; /* for DA only: DA sAddr */
ST_CHAR bType[MAX_IDENT_LEN+1]; /* for DA only: DA bType */
ST_CHAR valKind[MAX_VALKIND_LEN+1]; /* for DA only: Spec, Conf, RO, or Set */
ST_CHAR type[MAX_IDENT_LEN+1]; /* for DA: needed if bType="Struct" or "Enum"*/
/* for SDO: required */
ST_UINT count; /* for DA only: num array entries*/
ST_CHAR fc[MAX_FC_LEN+1]; /* for DA only: functional constraint */
ST_BOOLEAN dchg; /* for DA only: TrgOp (data change) */
ST_BOOLEAN qchg; /* for DA only: TrgOp (quality change) */
ST_BOOLEAN dupd; /* for DA only: TrgOp (data update) */
/* The "Val" and "sGroup" parameters are only set if the SCL file contains the
* optional "Val" element, in which case "scl_dotype_add_da_val" is called.
*/
ST_CHAR *Val; /* for DA only: attribute value text */
/* allocate appropriate size buffer*/
ST_UINT sGroup; /* for DA only: optional Setting Group Number*/
} SCL_DA;
typedef struct scl_dotype
{
/* CRITICAL: First 2 parameters used to add this struct to linked */
/* lists using list_add_last, etc. */
struct scl_dotype *next; /* CRITICAL: DON'T MOVE. */
struct scl_dotype *prev; /* CRITICAL: DON'T MOVE. */
ST_CHAR id[MAX_IDENT_LEN+1]; /* name used to reference this DO Type */
ST_CHAR cdc[MAX_CDC_LEN+1]; /* CDC name */
SCL_DA *daHead; /* head of list of DA or SDO */
/* scl_dotype_add_da OR */
/* scl_dotype_add_sdo adds to list */
} SCL_DOTYPE;
/* This structure should be allocated and filled in by the function */
/* "scl_datype_add_bda". */
typedef struct
{
DBL_LNK l;
ST_CHAR name[MAX_IDENT_LEN+1]; /* data attribute name */
ST_CHAR desc[MAX_IDENT_LEN+1]; /* DA or SDO description (optional)*/
/* TRUNCATED if longer than buffer */
ST_CHAR sAddr[MAX_IDENT_LEN+1]; /* for DA only: DA sAddr */
ST_CHAR bType[MAX_IDENT_LEN+1]; /* data attribute type */
ST_CHAR valKind[MAX_VALKIND_LEN+1]; /* Spec, Conf, RO, or Set */
ST_CHAR type[MAX_IDENT_LEN+1]; /* only used if btype="Struct" or "Enum"*/
ST_UINT count; /* for DA only: num array entries*/
/* The "Val" and "sGroup" parameters are only set if the SCL file contains the
* optional "Val" element, in which case "scl_datype_add_bda_val" is called.
*/
ST_CHAR *Val; /* attribute value text */
/* allocate appropriate size buffer*/
ST_UINT sGroup; /* optional Setting Group Number*/
} SCL_BDA; /* Basic Data Attribute */
typedef struct
{
DBL_LNK l;
ST_CHAR id[MAX_IDENT_LEN+1]; /* name used to reference this DA Type*/
SCL_BDA *bdaHead; /* head of list of BDA */
/* scl_datype_add_bda adds to list */
} SCL_DATYPE;
/* This structure should be allocated and filled in by the function */
/* "scl_enumtype_add_enumval". */
typedef struct
{
DBL_LNK l;
ST_INT ord; /* ord attribute */
ST_CHAR EnumVal[MAX_IDENT_LEN+1]; /* EnumVal element */
/* TRUNCATED if longer than buffer */
} SCL_ENUMVAL;
typedef struct
{
DBL_LNK l;
ST_CHAR id[MAX_IDENT_LEN+1]; /* name used to reference this DA Type*/
SCL_ENUMVAL *enumvalHead; /* head of list of EnumVal */
/* scl_enumtype_add_enumval adds to list*/
} SCL_ENUMTYPE;
/************************************************************************/
/* SCL_INFO */
/* This structure contains all information extracted from the SCL file */
/* to be used for MMS-EASE Lite initialization. */
/************************************************************************/
typedef struct
{
ST_CHAR iedName [MAX_IDENT_LEN+1]; /* passed to scl_parse */
SCL_HEADER Header; /* Info from "Header" section of SCL file*/
/* Logical Node Type definitions (from DataTypeTemplates section) */
SCL_LNTYPE *lnTypeHead; /* head of list of LNodeType defs */
SCL_DOTYPE *doTypeHead; /* head of list of DOType defs */
SCL_DATYPE *daTypeHead; /* head of list of DAType defs */
SCL_ENUMTYPE *enumTypeHead; /* head of list of EnumType defs */
/* Logical Device (MMS Domain) definitions (from AccessPoint section) */
SCL_LD *ldHead; /* head of list of LDevice defs */
ST_INT brcb_bufsize; /* BRCB buffer size */
/* scl2_ld_create_all uses arg to set it*/
} SCL_INFO;
/* Communication <20>ڵ㲿<DAB5>ֽṹ<D6BD><E1B9B9><EFBFBD><EFBFBD>*/
/* P */
typedef struct
{
DBL_LNK l;
ST_CHAR *type; /* type (required)*/
ST_CHAR *p; /* address */
} SCL_P;
/* Address */
typedef struct
{
SCL_P *P_head; /* Head of P */
} SCL_ADDR;
/* GSE */
typedef struct
{
DBL_LNK l;
ST_CHAR *ld_inst; /* LD inst requred*/
ST_CHAR *cb_name; /* control block name requred*/
ST_CHAR *desc; /* description (optional)*/
/* option sub node */
SCL_ADDR *pAddress; /* Address Node */
ST_CHAR *min_time_unit; /* MinTime (requred) fix:s*/
ST_CHAR *min_time_multiplier; /* MinTime (optional) fix:m*/
ST_UINT min_time; /* MinTime value*/
ST_CHAR *max_time_unit; /* MaxTime (requred) fix:s*/
ST_CHAR *max_time_multiplier; /* MaxTime (optional) fix:m*/
ST_UINT max_time; /* MaxTime value*/
} SCL_GSE;
/* SMV */
typedef struct
{
DBL_LNK l;
ST_CHAR *ld_inst; /* LD inst requred*/
ST_CHAR *cb_name; /* control block name requred*/
ST_CHAR *desc; /* description (optional)*/
/* option sub node */
SCL_ADDR *pAddress; /* Address Node */
} SCL_SMV;
/* PhysConn */
typedef struct
{
DBL_LNK l;
ST_CHAR *type; /* type (requred)*/
SCL_P *P_head; /* Head of P */
} SCL_PHYS;
/* connectedAP */
typedef struct
{
DBL_LNK l;
ST_CHAR *ied_name; /* IED name requred*/
ST_CHAR *desc; /* description (optional)*/
ST_CHAR *connectedAP_name; /* connectedAP name requred*/
/* option sub node */
SCL_ADDR *pAddress; /* Address Node */
SCL_GSE *GSE_head; /* Head of GSE */
SCL_SMV *SMV_head; /* Head of SMV */
SCL_PHYS *PhysConn_head; /* Head of PhysConn */
} SCL_NETAP;
/* SubNetwork */
typedef struct
{
DBL_LNK l;
ST_CHAR *name; /* SubNetwork name */
ST_CHAR *desc; /* description (optional)*/
ST_CHAR *type; /* type (optional)*/
/* option sub node BitRate*/
ST_CHAR *unit; /* unit (if BitRate then requred) Fix:b/s */
ST_CHAR *multiplier; /* multiplier (optional) Fix:M */
ST_UINT bitrate; /* BitRate */
SCL_NETAP *netap_head; /* Head of connectedAP */
} SCL_SUBNET;
/**
<EFBFBD>scd<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>нڵ<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ
*/
typedef struct
{
SCL_SUBNET *subnet_head; /**<< SubNetwork<72>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>*/
SCL_INFO *ieds; /**<< <20><><EFBFBD><EFBFBD>ied<65><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>*/
ST_INT ied_num; /**<< ied<65><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>*/
SCL_INFO *data_type; /**<< scd<63>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ڵ<EFBFBD>*/
}SCD_INFO;
/************************************************************************/
/************************************************************************/
/* FUNCTIONS to store SCL info in "SCL_INFO" structure. */
/************************************************************************/
/************************************************************************/
/************************************************************************/
/*added by djf 2007/08/16 */
/* scl_sgcb_add */
/* Add a Setting Group Control Block (SGCB). */
/* Allocates a SCL_SGCB struct, fills it in, */
/* and evaluate it to the pointer "sgcbPtr" in SCL_LN. */
/************************************************************************/
ST_RET scl_sgcb_add(SCL_INFO *scl_info, /* main struct where all SCL info stored*/
ST_CHAR *desc, /* SGCB description (optional) */
/* TRUNCATED if longer than buffer */
ST_UINT numOfSG,
ST_UINT actSG);
/************************************************************************/
/* scl_header_save */
/* Save "Header" information from SCL file. */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_header_save (SCL_INFO *sclInfo, ST_CHAR *id, ST_CHAR *nameStructure);
/************************************************************************/
/* scl_lntype_create */
/* Begin creation of a Logical Node Type (LNodeType). */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_lntype_create (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *id, /* name used to reference this LN Type*/
ST_CHAR *lnClass); /* logical node class */
/************************************************************************/
/* scl_lntype_add_do */
/* Add a Data Object (DO) to a Logical Node Type (LNodeType). */
/* Adds to lntype created by most recent call to "scl_lntype_create". */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_lntype_add_do (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *name, /* data object name */
ST_CHAR *type, /* data object type */
ST_CHAR *desc); //<2F><><EFBFBD><EFBFBD>
/************************************************************************/
/* scl_dotype_create */
/* Begin creation of a Data Object Type (DOType). */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_dotype_create (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *id, /* name used to reference this DO Type*/
ST_CHAR *cdc); /* CDC name */
/************************************************************************/
/* scl_dotype_add_da */
/* Add a Data Attribute (DA) to a Data Object Type (DOType). */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_dotype_add_da (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *name, /* DA name */
ST_CHAR *desc, /* DA description (optional)*/
ST_CHAR *sAddr, /* DA sAddr */
ST_CHAR *bType, /* DA bType */
ST_CHAR *valKind, /* Spec, Conf, RO, or Set */
ST_CHAR *type, /* needed if bType="Struct" or "Enum"*/
ST_UINT count, /* num array entries*/
ST_CHAR *fc, /* functional constraint */
ST_BOOLEAN dchg, /* TrgOp (data change) */
ST_BOOLEAN qchg, /* TrgOp (quality change) */
ST_BOOLEAN dupd); /* TrgOp (data update) */
/************************************************************************/
/* scl_dotype_add_sdo */
/* Add a (SDO) to a Data Object Type (DOType). */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_dotype_add_sdo (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *name, /* DA or SDO name */
ST_CHAR *desc, /* DA or SDO description (optional)*/
ST_CHAR *type); /* SDO type (ref to lower DOType)*/
/************************************************************************/
/* scl_dotype_add_da_val */
/* Add a Val element to a DA which is being added to a DOType. */
/* Add to DA created by most recent call to scl_dotype_add_da. */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_dotype_add_da_val (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *Val, /* Val to add */
ST_UINT sGroup); /* optional Setting Group Number*/
/************************************************************************/
/* scl_datype_create */
/* Begin creation of a Data Attribute Type (DAType). */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_datype_create (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *id); /* name used to reference this DA Type*/
/************************************************************************/
/* scl_datype_add_bda */
/* Add a Basic Data Attribute (BDA) to a Data Attribute Type (DAType). */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_datype_add_bda (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *name, /* DA name */
ST_CHAR *desc, /* DA description (optional)*/
ST_CHAR *sAddr,
ST_CHAR *bType, /* data attribute type */
ST_CHAR *valKind, /* Spec, Conf, RO, or Set */
ST_CHAR *type, /* only used if bType="Struct" or "Enum"*/
ST_UINT count); /* num array entries */
/************************************************************************/
/* scl_datype_add_bda_val */
/* Add a Val element to a BDA which is being added to a DAType. */
/* Add to BDA created by most recent call to scl_datype_add_bda. */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_datype_add_bda_val (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *Val, /* Val to add */
ST_UINT sGroup); /* optional Setting Group Number*/
/************************************************************************/
/* scl_enumtype_create */
/* Begin creation of an EnumType. */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_enumtype_create (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *id); /* name used to reference this EnumType*/
/************************************************************************/
/* scl_enumtype_add_enumval */
/* Add an EnumVal to an EnumType. */
/* Add to EnumType created by most recent call to scl_enumtype_create. */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_enumtype_add_enumval (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_INT ord, /* ord attribute */
ST_CHAR *EnumVal); /* EnumVal element */
/************************************************************************/
/* scl_fcda_add */
/* Allocates a SCL_FCDA struct, fills it in, */
/* and adds it to the linked list "fcdaHead" in SCL_DATASET. */
/************************************************************************/
ST_RET scl_fcda_add (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *ldInst,
ST_CHAR *prefix,
ST_CHAR *lnInst,
ST_CHAR *lnClass,
ST_CHAR *doName,
ST_CHAR *daName,
ST_CHAR *fc);
/************************************************************************/
/* scl_dai_add */
/* Allocates a SCL_DAI struct, fills it in, */
/* and adds it to the linked list "daiHead" in SCL_LN. */
/************************************************************************/
ST_RET scl_dai_add (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *flattened, /* flattened attribute name */
/* constructed from "name" & "ix" */
/* from DOI, SDI, & DAI */
ST_CHAR *Val, /* attribute value text from DAI */
/* allocate appropriate size buffer */
ST_CHAR *sAddr, /* from DAI */
ST_CHAR *valKind, /* from DAI */
ST_CHAR *desc); /* from DAI */
/************************************************************************/
/* scl_dataset_add */
/* Allocates a SCL_DATASET struct, fills it in, */
/* and adds it to the linked list "datasetHead" in SCL_LN. */
/************************************************************************/
ST_RET scl_dataset_add (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *name, /* DataSet name */
ST_CHAR *desc); /* DataSet description (optional) */
/* TRUNCATED if longer than buffer */
/************************************************************************/
/* scl_rcb_add */
/* Allocates a SCL_RCB struct, fills it in, */
/* and adds it to the linked list "rcbHead" in SCL_LN. */
/* NOTE: the RptEnabled element of the SCL file is ignored. SISCO software*/
/* does not need to know which clients may access the RCB. */
/************************************************************************/
ST_RET scl_rcb_add (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *name, /* RCB name */
ST_CHAR *desc, /* RCB description (optional) */
/* TRUNCATED if longer than buffer */
ST_CHAR *datSet,
ST_UINT intgPd,
ST_CHAR *rptID,
ST_UINT confRev,
ST_BOOLEAN buffered, /* TRUE if this is buffered RCB */
ST_UINT bufTime,
ST_UINT8 *TrgOps, /* 8-bit bitstring */
/* Pointer to 1-byte array */
/* Boolean vals from SCL file */
/* (dchg, qchg, dupd, & period) */
/* used to set bits in TrgOps bitstring */
ST_UINT8 *OptFlds, /* 9-bit bitstring */
/* Pointer to 2-byte array */
/* Boolean vals from SCL file */
/* (seqNum, timeStamp, dataSet, */
/* reasonCode, dataRef, bufOvfl, */
/* entryID, configRef) */
/* segmentation boolean is ignored */
/* used to set bits in OptFlds bitstring*/
ST_INT max_num);//ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/************************************************************************/
/* scl_lcb_add */
/* Add a LOG Control Block (LCB). */
/* Allocates a SCL_LCB struct, fills it in, */
/* and adds it to the linked list "lcbHead" in SCL_LN. */
/************************************************************************/
ST_RET scl_lcb_add (
SCL_INFO *scl_info, /* main struct where all SCL info stored*/
ST_CHAR *name, /* LCB name */
ST_CHAR *desc, /* LCB description (optional) */
/* TRUNCATED if longer than buffer */
ST_CHAR *datSet,
ST_UINT intgPd,
ST_CHAR *logName,
ST_BOOLEAN logEna,
ST_BOOLEAN reasonCode,
ST_UINT8 *TrgOps); /* 8-bit bitstring */
/* Pointer to 1-byte array */
/* Boolean vals from SCL file */
/* (dchg, qchg, dupd, & period) */
/* used to set bits in TrgOps bitstring */
/************************************************************************/
/* scl_gcb_add */
/* Add a GOOSE Control Block (GCB). */
/* Allocates a SCL_GCB struct, fills it in, */
/* and adds it to the linked list "gcbHead" in SCL_LN. */
/* NOTE: The SCL file may also contain one or more "IEDName" elements to*/
/* indicate IEDs that should subscribe for GOOSE data. We have no */
/* way to use this information, so it is ignored. */
/************************************************************************/
ST_RET scl_gcb_add (
SCL_INFO *scl_info, /* main struct where all SCL info stored*/
ST_CHAR *name, /* GCB name */
ST_CHAR *desc, /* GCB description (optional) */
/* TRUNCATED if longer than buffer */
ST_CHAR *datSet,
ST_UINT confRev,
ST_BOOLEAN isGoose, /* SD_TRUE if "GOOSE", SD_FALSE if "GSSE"*/
ST_CHAR *appID);
/************************************************************************/
/* scl_ln_add */
/* Allocates a SCL_LN struct, fills it in, */
/* and adds it to the linked list "lnHead" in SCL_LD. */
/************************************************************************/
ST_RET scl_ln_add (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *desc, /* LN description (optional) */
/* TRUNCATED if longer than buffer */
ST_CHAR *lnType, /* LN lnType */
ST_CHAR *lnClass, /* LN lnClass */
ST_CHAR *inst, /* LN inst */
ST_CHAR *prefix); /* LN prefix */
/************************************************************************/
/* scl_parse */
/* Parses SCL file and stores extracted info in SCL_INFO structure. */
/************************************************************************/
ST_RET scl_parse (ST_CHAR *xmlFileName, ST_CHAR *iedName,
ST_CHAR *accessPointName, SCL_INFO *sclInfo);
ST_VOID scl_log_all (SCL_INFO *scl_info);
/* Add by tyj 2007/07/11 */
/* scd<63>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> */
ST_RET ai_parse_scd(ST_CHAR *scd_name, SCD_INFO *scd_info);
/************************************************************************/
/* scl_info_destroy */
/* Destroy all info stored in the SCL_INFO structure by "scl_parse". */
/************************************************************************/
ST_VOID scl_info_destroy (SCL_INFO *scl_info);
/* Add by tyj 2007/07/11 */
/* <09>ͷ<EFBFBD>scd<63><EFBFBD>ռ<EFBFBD> */
ST_VOID ai_cleanup_scd_info(SCD_INFO *scd_info);
/************************************************************************/
/* scl_ld_create */
/* Allocates SCL_LD struct */
/* and adds it to the linked list "ldHead" in SCL_INFO. */
/************************************************************************/
ST_RET scl_ld_create (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *desc, /* LD description (optional) */
/* TRUNCATED if longer than buffer */
ST_CHAR *inst); /* LD inst */
/************************************************************************/
/* scl2_datatype_create_all */
/* Create MMS Data types for all Logical Node Types (LNodeType) */
/* defined in SCL. */
/* This function needs a user buffer for constructing TDL strings. */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl2_datatype_create_all (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_CHAR *tdlbuf, /* buffer to use for constructing TDL */
/* reused for each LNType in list */
size_t tdlbuflen); /* len of tdlbuf buffer in bytes */
/************************************************************************/
/* scl_create_type_id */
/* Add by tyj 2007/07/12 */
/* Create MMS Data type for one Logical Node Type (LNodeType) */
/* defined in SCL. */
/* This function needs a user buffer for constructing TDL strings. */
/* TDL is generated by calling "tdladd_*" functions. A ptr to a */
/* TDLADD_CTXT structure is passed to each "tdladd_*" function. */
/* The structure is used to keep track of the current ptr in the TDL */
/* buffer and the space remaining in the buffer. */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl_create_type_id(
SCL_INFO *scl_info, /* main struct where all SCL info stored*/
SCL_LNTYPE *scl_lntype, /* info for this LNType */
ST_CHAR *tdl_buf, /* buffer to use for constructing TDL */
/* reused for each LNType in list */
size_t tdl_buf_len, /* len of tdlbuf buffer in bytes */
SCL_LD *scl_ld_special, /* LD containing LN with "special stuff"*/
/* (i.e. ReportControl, LogControl, etc)*/
/* NULL if nothing special in LN. */
SCL_LN *scl_ln_special); /* LN with "special stuff" */
/* NULL if nothing special in LN. */
/************************************************************************/
/* scl2_ld_create_all */
/* Create all Logical Devices from SCL info saved in "sclInfo". */
/* RETURNS: SD_SUCCESS or error code */
/************************************************************************/
ST_RET scl2_ld_create_all (
SCL_INFO *sclInfo, /* main struct where all SCL info stored*/
ST_UINT reportScanRate, /* report scan rate (millisec) */
ST_INT brcb_bufsize); /* BRCB buffer size */
/************************************************************************/
/* u_set_all_leaf_functions */
/* User customizable function to set all leaf functions for a data type.*/
/************************************************************************/
ST_RET u_set_all_leaf_functions (RUNTIME_CTRL *rt_ctrl);
//add doi
ST_RET scl_doi_add(SCL_INFO *scl_info, ST_CHAR *do_name, ST_CHAR *desc);
#ifdef __cplusplus
}
#endif
#endif /* !SCL_INCLUDED */