libIEC61850  1.1.2
Open-source IEC 61850 MMS/GOOSE/SV server and client library
iec61850_model.h
Go to the documentation of this file.
1 /*
2  * model.h
3  *
4  * Copyright 2013-2016 Michael Zillgith
5  *
6  * This file is part of libIEC61850.
7  *
8  * libIEC61850 is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * libIEC61850 is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with libIEC61850. If not, see <http://www.gnu.org/licenses/>.
20  *
21  * See COPYING file for the complete license text.
22  */
23 
24 #ifndef MODEL_H_
25 #define MODEL_H_
26 
27 #include "iec61850_common.h"
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
46 typedef struct sModelNode ModelNode;
47 
51 typedef struct sDataAttribute DataAttribute;
52 
56 typedef struct sDataObject DataObject;
57 
61 typedef struct sLogicalNode LogicalNode;
62 
66 typedef struct sLogicalDevice LogicalDevice;
67 
71 typedef struct sIedModel IedModel;
72 
73 typedef struct sDataSet DataSet;
74 typedef struct sReportControlBlock ReportControlBlock;
75 
79 typedef struct sSettingGroupControlBlock SettingGroupControlBlock;
80 
81 typedef struct sGSEControlBlock GSEControlBlock;
82 
83 typedef struct sSVControlBlock SVControlBlock;
84 
85 typedef struct sLogControlBlock LogControlBlock;
86 
87 typedef struct sLog Log;
88 
89 typedef enum {
90  IEC61850_BOOLEAN = 0,/* int */
91  IEC61850_INT8 = 1, /* int8_t */
92  IEC61850_INT16 = 2, /* int16_t */
93  IEC61850_INT32 = 3, /* int32_t */
94  IEC61850_INT64 = 4, /* int64_t */
95  IEC61850_INT128 = 5, /* no native mapping! */
96  IEC61850_INT8U = 6, /* uint8_t */
97  IEC61850_INT16U = 7, /* uint16_t */
98  IEC61850_INT24U = 8, /* uint32_t */
99  IEC61850_INT32U = 9, /* uint32_t */
100  IEC61850_FLOAT32 = 10, /* float */
101  IEC61850_FLOAT64 = 11, /* double */
121 
122 
123 #if (CONFIG_IEC61850_USE_COMPAT_TYPE_DECLARATIONS == 1)
124  ,
125  BOOLEAN = 0,/* int */
126  INT8 = 1, /* int8_t */
127  INT16 = 2, /* int16_t */
128  INT32 = 3, /* int32_t */
129  INT64 = 4, /* int64_t */
130  INT128 = 5, /* no native mapping! */
131  INT8U = 6, /* uint8_t */
132  INT16U = 7, /* uint16_t */
133  INT24U = 8, /* uint32_t */
134  INT32U = 9, /* uint32_t */
135  FLOAT32 = 10, /* float */
136  FLOAT64 = 11, /* double */
137  ENUMERATED = 12,
138  OCTET_STRING_64 = 13,
139  OCTET_STRING_6 = 14,
140  OCTET_STRING_8 = 15,
141  VISIBLE_STRING_32 = 16,
142  VISIBLE_STRING_64 = 17,
143  VISIBLE_STRING_65 = 18,
144  VISIBLE_STRING_129 = 19,
145  VISIBLE_STRING_255 = 20,
146  UNICODE_STRING_255 = 21,
147  TIMESTAMP = 22,
148  QUALITY = 23,
149  CHECK = 24,
150  CODEDENUM = 25,
151  GENERIC_BITSTRING = 26,
152  CONSTRUCTED = 27,
153  ENTRY_TIME = 28,
154  PHYCOMADDR = 29,
155  CURRENCY = 30
156 #endif
158 
159 typedef enum {
164 } ModelNodeType;
165 
166 struct sIedModel {
167  char* name;
168  LogicalDevice* firstChild;
169  DataSet* dataSets;
170  ReportControlBlock* rcbs;
171  GSEControlBlock* gseCBs;
172  SVControlBlock* svCBs;
173  SettingGroupControlBlock* sgcbs;
174  LogControlBlock* lcbs;
175  Log* logs;
176  void (*initializer) (void);
177 };
178 
180  ModelNodeType modelType;
181  char* name;
182  ModelNode* parent;
183  ModelNode* sibling;
184  ModelNode* firstChild;
185 };
186 
187 struct sModelNode {
188  ModelNodeType modelType;
189  char* name;
190  ModelNode* parent;
191  ModelNode* sibling;
192  ModelNode* firstChild;
193 };
194 
195 struct sLogicalNode {
196  ModelNodeType modelType;
197  char* name;
198  ModelNode* parent;
199  ModelNode* sibling;
200  ModelNode* firstChild;
201 };
202 
203 struct sDataObject {
204  ModelNodeType modelType;
205  char* name;
206  ModelNode* parent;
207  ModelNode* sibling;
208  ModelNode* firstChild;
209 
210  int elementCount; /* > 0 if this is an array */
211 };
212 
214  ModelNodeType modelType;
215  char* name;
216  ModelNode* parent;
217  ModelNode* sibling;
218  ModelNode* firstChild;
219 
220  int elementCount; /* > 0 if this is an array */
221 
224 
225  uint8_t triggerOptions; /* TRG_OPT_DATA_CHANGED | TRG_OPT_QUALITY_CHANGED | TRG_OPT_DATA_UPDATE */
226 
228 
229  uint32_t sAddr;
230 };
231 
232 typedef struct sDataSetEntry {
236  int index;
239  struct sDataSetEntry* sibling;
240 } DataSetEntry;
241 
242 struct sDataSet {
244  char* name; /* eg. MMXU1$dataset1 */
247  DataSet* sibling;
248 };
249 
251  LogicalNode* parent;
252  char* name;
253  char* rptId;
254  bool buffered;
255  char* dataSetName; /* pre loaded with relative name in logical node */
256 
257  uint32_t confRef; /* ConfRef - configuration revision */
258  uint8_t trgOps; /* TrgOps - trigger conditions */
259  uint8_t options; /* OptFlds */
260  uint32_t bufferTime; /* BufTm - time to buffer events until a report is generated */
261  uint32_t intPeriod; /* IntgPd - integrity period */
262 
263  ReportControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
264 };
265 
267  LogicalNode* parent;
268 
269  char* name;
270 
271  char* dataSetName;
272  char* logRef; /* object reference to the journal. Defaults to <MMS DomainName>/<LNName>$GeneralLog */
273 
274  uint8_t trgOps; /* TrgOps - trigger conditions */
275  uint32_t intPeriod; /* IntgPd - integrity period */
276 
277  bool logEna; /* enable log by default */
278  bool reasonCode; /* include reason code in log */
279 
280  LogControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
281 };
282 
283 struct sLog {
284  LogicalNode* parent;
285 
286  char* name;
287 
288  Log* sibling; /* next log instance in list or NULL if this is the last entry */
289 };
290 
292  LogicalNode* parent;
293 
294  uint8_t actSG; /* value from SCL file */
295  uint8_t numOfSGs; /* value from SCL file */
296 
297  uint8_t editSG; /* 0 at power-up */
298  bool cnfEdit; /* false at power-up */
299  uint64_t timestamp;
300  uint16_t resvTms;
301 
302  SettingGroupControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
303 };
304 
306  LogicalNode* parent;
307  char* name;
308  char* appId;
309  char* dataSetName; /* pre loaded with relative name in logical node */
310  uint32_t confRev; /* ConfRev - configuration revision */
311  bool fixedOffs; /* fixed offsets */
312  PhyComAddress* address; /* GSE communication parameters */
313  int minTime; /* optional minTime parameter --> -1 if not present */
314  int maxTime; /* optional maxTime parameter --> -1 if not present */
315  GSEControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
316 };
317 
319  LogicalNode* parent;
320  char* name;
321 
322  char* svId; /* MsvUD/UsvID */
323  char* dataSetName; /* pre loaded with relative name in logical node */
324 
325  uint8_t optFlds;
326 
327  uint8_t smpMod;
328  uint16_t smpRate;
329 
330  uint32_t confRev; /* ConfRev - configuration revision */
331 
332  PhyComAddress* dstAddress; /* SV communication parameters */
333 
334  bool isUnicast;
335 
336  int noASDU;
337 
338  SVControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
339 };
340 
349 int
350 ModelNode_getChildCount(ModelNode* self);
351 
360 ModelNode*
361 ModelNode_getChild(ModelNode* self, const char* name);
362 
376 ModelNode*
377 ModelNode_getChildWithFc(ModelNode* self, const char* name, FunctionalConstraint fc);
378 
388 char*
389 ModelNode_getObjectReference(ModelNode* self, char* objectReference);
390 
398 ModelNodeType
399 ModelNode_getType(ModelNode* self);
400 
410 void
411 IedModel_setIedName(IedModel* self, const char* iedName);
412 
425 ModelNode*
426 IedModel_getModelNodeByObjectReference(IedModel* self, const char* objectReference);
427 
428 SVControlBlock*
429 IedModel_getSVControlBlock(IedModel* self, LogicalNode* parentLN, const char* svcbName);
430 
443 ModelNode*
444 IedModel_getModelNodeByShortObjectReference(IedModel* self, const char* objectReference);
445 
457 ModelNode*
458 IedModel_getModelNodeByShortAddress(IedModel* self, uint32_t shortAddress);
459 
468 LogicalDevice*
469 IedModel_getDeviceByInst(IedModel* self, const char* ldInst);
470 
471 
480 LogicalNode*
481 LogicalDevice_getLogicalNode(LogicalDevice* self, const char* lnName);
482 
490 SettingGroupControlBlock*
491 LogicalDevice_getSettingGroupControlBlock(LogicalDevice* self);
492 
503 void
504 IedModel_setAttributeValuesToNull(IedModel* self);
505 
514 LogicalDevice*
515 IedModel_getDevice(IedModel* self, const char* ldName);
516 
525 DataSet*
526 IedModel_lookupDataSet(IedModel* self, const char* dataSetReference);
527 
536 DataAttribute*
537 IedModel_lookupDataAttributeByMmsValue(IedModel* self, MmsValue* value);
538 
539 
547 int
548 IedModel_getLogicalDeviceCount(IedModel* self);
549 
550 int
551 LogicalDevice_getLogicalNodeCount(LogicalDevice* self);
552 
553 ModelNode*
554 LogicalDevice_getChildByMmsVariableName(LogicalDevice* self, const char* mmsVariableName);
555 
556 bool
557 LogicalNode_hasFCData(LogicalNode* self, FunctionalConstraint fc);
558 
559 bool
560 LogicalNode_hasBufferedReports(LogicalNode* self);
561 
562 bool
563 LogicalNode_hasUnbufferedReports(LogicalNode* self);
564 
573 DataSet*
574 LogicalNode_getDataSet(LogicalNode* self, const char* dataSetName);
575 
576 bool
577 DataObject_hasFCData(DataObject* self, FunctionalConstraint fc);
578 
579 
580 #ifdef __cplusplus
581 }
582 #endif
583 
584 
585 #endif /* MODEL_H_ */
Definition: iec61850_model.h:92
LogicalNode * parent
Definition: iec61850_model.h:251
Definition: iec61850_model.h:90
int elementCount
Definition: iec61850_model.h:245
int index
Definition: iec61850_model.h:236
ModelNodeType modelType
Definition: iec61850_model.h:180
LogicalNode * parent
Definition: iec61850_model.h:306
bool LogicalNode_hasBufferedReports(LogicalNode *self)
char * name
Definition: iec61850_model.h:307
Definition: iec61850_model.h:112
char * name
Definition: iec61850_model.h:181
uint16_t smpRate
Definition: iec61850_model.h:328
Definition: iec61850_model.h:266
Definition: iec61850_common.h:41
Definition: iec61850_model.h:115
char * name
Definition: iec61850_model.h:189
char * dataSetName
Definition: iec61850_model.h:255
Definition: iec61850_model.h:100
Definition: iec61850_model.h:96
bool logEna
Definition: iec61850_model.h:277
bool DataObject_hasFCData(DataObject *self, FunctionalConstraint fc)
int minTime
Definition: iec61850_model.h:313
Definition: iec61850_model.h:118
ReportControlBlock * rcbs
Definition: iec61850_model.h:170
uint8_t actSG
Definition: iec61850_model.h:294
ModelNode * firstChild
Definition: iec61850_model.h:192
uint32_t intPeriod
Definition: iec61850_model.h:261
char * logicalDeviceName
Definition: iec61850_model.h:233
Definition: iec61850_model.h:99
Definition: iec61850_model.h:95
PhyComAddress * address
Definition: iec61850_model.h:312
ModelNode * IedModel_getModelNodeByShortAddress(IedModel *self, uint32_t shortAddress)
Lookup a model node by its short address.
int maxTime
Definition: iec61850_model.h:314
char * ModelNode_getObjectReference(ModelNode *self, char *objectReference)
Return the IEC 61850 object reference of a model node.
uint8_t optFlds
Definition: iec61850_model.h:325
ModelNodeType modelType
Definition: iec61850_model.h:214
Definition: iec61850_model.h:160
uint32_t confRev
Definition: iec61850_model.h:310
int IedModel_getLogicalDeviceCount(IedModel *self)
Get the number of logical devices.
SettingGroupControlBlock * LogicalDevice_getSettingGroupControlBlock(LogicalDevice *self)
Get the setting group control block (SGCB) of the logical device.
DataAttribute * IedModel_lookupDataAttributeByMmsValue(IedModel *self, MmsValue *value)
Lookup a DataAttribute instance with the corresponding MmsValue instance.
char * name
Definition: iec61850_model.h:252
uint32_t bufferTime
Definition: iec61850_model.h:260
IEC 61850 data model of setting group control block (SGCB)
Definition: iec61850_model.h:291
SVControlBlock * sibling
Definition: iec61850_model.h:338
DataSet * IedModel_lookupDataSet(IedModel *self, const char *dataSetReference)
Lookup a data set in the IED model.
ModelNodeType
Definition: iec61850_model.h:159
Definition: iec61850_model.h:109
GSEControlBlock * sibling
Definition: iec61850_model.h:315
IEC 61850 data model element of type logical device.
Definition: iec61850_model.h:179
GSEControlBlock * gseCBs
Definition: iec61850_model.h:171
Definition: iec61850_model.h:163
SettingGroupControlBlock * sgcbs
Definition: iec61850_model.h:173
bool buffered
Definition: iec61850_model.h:254
ModelNode * firstChild
Definition: iec61850_model.h:208
uint8_t smpMod
Definition: iec61850_model.h:327
ModelNode * firstChild
Definition: iec61850_model.h:218
char * dataSetName
Definition: iec61850_model.h:323
void(* initializer)(void)
Definition: iec61850_model.h:176
ModelNodeType ModelNode_getType(ModelNode *self)
Get the type of the ModelNode.
Definition: iec61850_model.h:107
bool isUnicast
Definition: iec61850_model.h:334
uint8_t numOfSGs
Definition: iec61850_model.h:295
MmsValue * value
Definition: iec61850_model.h:238
Definition: iec61850_model.h:104
Definition: iec61850_model.h:94
ModelNode * parent
Definition: iec61850_model.h:216
Definition: iec61850_model.h:250
Definition: iec61850_model.h:98
Definition: iec61850_model.h:116
Definition: iec61850_model.h:119
Definition: iec61850_model.h:161
Definition: iec61850_model.h:232
ModelNode * sibling
Definition: iec61850_model.h:207
Definition: iec61850_model.h:108
Definition: iec61850_model.h:120
abstract base type for IEC 61850 data model nodes
Definition: iec61850_model.h:187
FunctionalConstraint fc
Definition: iec61850_model.h:222
char * svId
Definition: iec61850_model.h:322
Definition: iec61850_model.h:283
DataSet * LogicalNode_getDataSet(LogicalNode *self, const char *dataSetName)
get a data set instance
bool reasonCode
Definition: iec61850_model.h:278
char * rptId
Definition: iec61850_model.h:253
char * variableName
Definition: iec61850_model.h:235
SettingGroupControlBlock * sibling
Definition: iec61850_model.h:302
DataSetEntry * fcdas
Definition: iec61850_model.h:246
char * logRef
Definition: iec61850_model.h:272
bool LogicalNode_hasFCData(LogicalNode *self, FunctionalConstraint fc)
bool cnfEdit
Definition: iec61850_model.h:298
char * name
Definition: iec61850_model.h:286
ModelNode * sibling
Definition: iec61850_model.h:183
DataAttributeType type
Definition: iec61850_model.h:223
uint16_t resvTms
Definition: iec61850_model.h:300
bool fixedOffs
Definition: iec61850_model.h:311
ModelNode * ModelNode_getChildWithFc(ModelNode *self, const char *name, FunctionalConstraint fc)
return a child model node with a given functional constraint
int LogicalDevice_getLogicalNodeCount(LogicalDevice *self)
ModelNode * parent
Definition: iec61850_model.h:198
Definition: iec61850_model.h:110
Definition: iec61850_model.h:106
DataAttributeType
Definition: iec61850_model.h:89
ModelNode * parent
Definition: iec61850_model.h:190
PhyComAddress * dstAddress
Definition: iec61850_model.h:332
char * name
Definition: iec61850_model.h:167
Definition: iec61850_model.h:114
LogicalDevice * firstChild
Definition: iec61850_model.h:168
bool isLDNameDynamicallyAllocated
Definition: iec61850_model.h:234
void IedModel_setAttributeValuesToNull(IedModel *self)
unset all MmsValue references in the data model
char * logicalDeviceName
Definition: iec61850_model.h:243
LogicalNode * parent
Definition: iec61850_model.h:284
ModelNode * ModelNode_getChild(ModelNode *self, const char *name)
return a child model node
DataSet * dataSets
Definition: iec61850_model.h:169
Definition: iec61850_model.h:101
char * name
Definition: iec61850_model.h:320
LogControlBlock * sibling
Definition: iec61850_model.h:280
LogicalDevice * IedModel_getDevice(IedModel *self, const char *ldName)
Lookup logical device (LD) by device name.
uint8_t trgOps
Definition: iec61850_model.h:258
LogicalNode * parent
Definition: iec61850_model.h:319
Definition: iec61850_model.h:111
Definition: iec61850_model.h:102
Definition: iec61850_model.h:162
ModelNode * sibling
Definition: iec61850_model.h:217
LogControlBlock * lcbs
Definition: iec61850_model.h:174
ModelNode * firstChild
Definition: iec61850_model.h:184
IEC 61850 data model element of type data attribute.
Definition: iec61850_model.h:213
LogicalNode * parent
Definition: iec61850_model.h:267
LogicalNode * LogicalDevice_getLogicalNode(LogicalDevice *self, const char *lnName)
Lookup a logical node by name that is part of the given logical device.
Definition: iec61850_model.h:242
Definition: iec61850_model.h:105
ModelNode * LogicalDevice_getChildByMmsVariableName(LogicalDevice *self, const char *mmsVariableName)
Log * logs
Definition: iec61850_model.h:175
Definition: iec61850_model.h:117
uint8_t trgOps
Definition: iec61850_model.h:274
MmsValue * mmsValue
Definition: iec61850_model.h:227
char * name
Definition: iec61850_model.h:269
ReportControlBlock * sibling
Definition: iec61850_model.h:263
uint32_t confRev
Definition: iec61850_model.h:330
Definition: iec61850_model.h:318
ModelNodeType modelType
Definition: iec61850_model.h:188
uint32_t sAddr
Definition: iec61850_model.h:229
SVControlBlock * IedModel_getSVControlBlock(IedModel *self, LogicalNode *parentLN, const char *svcbName)
LogicalNode * parent
Definition: iec61850_model.h:292
Definition: iec61850_model.h:305
IEC 61850 data model element of type data object.
Definition: iec61850_model.h:203
char * name
Definition: iec61850_model.h:197
bool LogicalNode_hasUnbufferedReports(LogicalNode *self)
ModelNode * IedModel_getModelNodeByObjectReference(IedModel *self, const char *objectReference)
Lookup a model node by its object reference.
ModelNode * IedModel_getModelNodeByShortObjectReference(IedModel *self, const char *objectReference)
Lookup a model node by its short (normalized) reference.
Root node of the IEC 61850 data model. This is usually created by the model generator tool (genmodel...
Definition: iec61850_model.h:166
uint8_t editSG
Definition: iec61850_model.h:297
LogicalDevice * IedModel_getDeviceByInst(IedModel *self, const char *ldInst)
Lookup logical device (LD) by device instance name (SCL attribute "inst")
void IedModel_setIedName(IedModel *self, const char *iedName)
Set the name of the IED.
ModelNode * firstChild
Definition: iec61850_model.h:200
FunctionalConstraint
Definition: iec61850_common.h:202
uint8_t triggerOptions
Definition: iec61850_model.h:225
Definition: iec61850_model.h:113
char * name
Definition: iec61850_model.h:244
ModelNode * sibling
Definition: iec61850_model.h:191
char * dataSetName
Definition: iec61850_model.h:309
Definition: iec61850_model.h:93
SVControlBlock * svCBs
Definition: iec61850_model.h:172
ModelNodeType modelType
Definition: iec61850_model.h:204
uint64_t timestamp
Definition: iec61850_model.h:299
ModelNode * sibling
Definition: iec61850_model.h:199
Log * sibling
Definition: iec61850_model.h:288
int elementCount
Definition: iec61850_model.h:220
ModelNodeType modelType
Definition: iec61850_model.h:196
ModelNode * parent
Definition: iec61850_model.h:182
uint32_t confRef
Definition: iec61850_model.h:257
char * dataSetName
Definition: iec61850_model.h:271
DataSet * sibling
Definition: iec61850_model.h:247
Definition: iec61850_model.h:97
char * appId
Definition: iec61850_model.h:308
ModelNode * parent
Definition: iec61850_model.h:206
uint32_t intPeriod
Definition: iec61850_model.h:275
Definition: iec61850_model.h:91
char * name
Definition: iec61850_model.h:215
int ModelNode_getChildCount(ModelNode *self)
get the number of direct children of a model node
char * name
Definition: iec61850_model.h:205
char * componentName
Definition: iec61850_model.h:237
IEC 61850 data model element of type logical node.
Definition: iec61850_model.h:195
struct sMmsValue MmsValue
Definition: mms_value.h:68
int elementCount
Definition: iec61850_model.h:210
struct sDataSetEntry * sibling
Definition: iec61850_model.h:239
int noASDU
Definition: iec61850_model.h:336
Definition: iec61850_model.h:103
uint8_t options
Definition: iec61850_model.h:259