libiec61850  1.2.0
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  IEC61850_OPTFLDS = 31, /* bit-string(10) */
122  IEC61850_TRGOPS = 32 /* bit-string(6) */
123 
124 
125 #if (CONFIG_IEC61850_USE_COMPAT_TYPE_DECLARATIONS == 1)
126  ,
127  BOOLEAN = 0,/* int */
128  INT8 = 1, /* int8_t */
129  INT16 = 2, /* int16_t */
130  INT32 = 3, /* int32_t */
131  INT64 = 4, /* int64_t */
132  INT128 = 5, /* no native mapping! */
133  INT8U = 6, /* uint8_t */
134  INT16U = 7, /* uint16_t */
135  INT24U = 8, /* uint32_t */
136  INT32U = 9, /* uint32_t */
137  FLOAT32 = 10, /* float */
138  FLOAT64 = 11, /* double */
139  ENUMERATED = 12,
140  OCTET_STRING_64 = 13,
141  OCTET_STRING_6 = 14,
142  OCTET_STRING_8 = 15,
143  VISIBLE_STRING_32 = 16,
144  VISIBLE_STRING_64 = 17,
145  VISIBLE_STRING_65 = 18,
146  VISIBLE_STRING_129 = 19,
147  VISIBLE_STRING_255 = 20,
148  UNICODE_STRING_255 = 21,
149  TIMESTAMP = 22,
150  QUALITY = 23,
151  CHECK = 24,
152  CODEDENUM = 25,
153  GENERIC_BITSTRING = 26,
154  CONSTRUCTED = 27,
155  ENTRY_TIME = 28,
156  PHYCOMADDR = 29,
157  CURRENCY = 30
158  OPTFLDS = 31,
159  TRGOPS = 32
160 #endif
162 
163 typedef enum {
168 } ModelNodeType;
169 
170 struct sIedModel {
171  char* name;
172  LogicalDevice* firstChild;
173  DataSet* dataSets;
174  ReportControlBlock* rcbs;
175  GSEControlBlock* gseCBs;
176  SVControlBlock* svCBs;
177  SettingGroupControlBlock* sgcbs;
178  LogControlBlock* lcbs;
179  Log* logs;
180  void (*initializer) (void);
181 };
182 
184  ModelNodeType modelType;
185  char* name;
186  ModelNode* parent;
187  ModelNode* sibling;
188  ModelNode* firstChild;
189 };
190 
191 struct sModelNode {
192  ModelNodeType modelType;
193  char* name;
194  ModelNode* parent;
195  ModelNode* sibling;
196  ModelNode* firstChild;
197 };
198 
199 struct sLogicalNode {
200  ModelNodeType modelType;
201  char* name;
202  ModelNode* parent;
203  ModelNode* sibling;
204  ModelNode* firstChild;
205 };
206 
207 struct sDataObject {
208  ModelNodeType modelType;
209  char* name;
210  ModelNode* parent;
211  ModelNode* sibling;
212  ModelNode* firstChild;
213 
214  int elementCount; /* > 0 if this is an array */
215 };
216 
218  ModelNodeType modelType;
219  char* name;
220  ModelNode* parent;
221  ModelNode* sibling;
222  ModelNode* firstChild;
223 
224  int elementCount; /* > 0 if this is an array */
225 
228 
229  uint8_t triggerOptions; /* TRG_OPT_DATA_CHANGED | TRG_OPT_QUALITY_CHANGED | TRG_OPT_DATA_UPDATE */
230 
232 
233  uint32_t sAddr;
234 };
235 
236 typedef struct sDataSetEntry {
240  int index;
243  struct sDataSetEntry* sibling;
244 } DataSetEntry;
245 
246 struct sDataSet {
248  char* name; /* eg. MMXU1$dataset1 */
251  DataSet* sibling;
252 };
253 
255  LogicalNode* parent;
256  char* name;
257  char* rptId;
258  bool buffered;
259  char* dataSetName; /* pre loaded with relative name in logical node */
260 
261  uint32_t confRef; /* ConfRef - configuration revision */
262  uint8_t trgOps; /* TrgOps - trigger conditions */
263  uint8_t options; /* OptFlds */
264  uint32_t bufferTime; /* BufTm - time to buffer events until a report is generated */
265  uint32_t intPeriod; /* IntgPd - integrity period */
266 
267  ReportControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
268 };
269 
271  LogicalNode* parent;
272 
273  char* name;
274 
275  char* dataSetName;
276  char* logRef; /* object reference to the journal. Defaults to <MMS DomainName>/<LNName>$GeneralLog */
277 
278  uint8_t trgOps; /* TrgOps - trigger conditions */
279  uint32_t intPeriod; /* IntgPd - integrity period */
280 
281  bool logEna; /* enable log by default */
282  bool reasonCode; /* include reason code in log */
283 
284  LogControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
285 };
286 
287 struct sLog {
288  LogicalNode* parent;
289 
290  char* name;
291 
292  Log* sibling; /* next log instance in list or NULL if this is the last entry */
293 };
294 
296  LogicalNode* parent;
297 
298  uint8_t actSG; /* value from SCL file */
299  uint8_t numOfSGs; /* value from SCL file */
300 
301  uint8_t editSG; /* 0 at power-up */
302  bool cnfEdit; /* false at power-up */
303  uint64_t timestamp;
304  uint16_t resvTms;
305 
306  SettingGroupControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
307 };
308 
310  LogicalNode* parent;
311  char* name;
312  char* appId;
313  char* dataSetName; /* pre loaded with relative name in logical node */
314  uint32_t confRev; /* ConfRev - configuration revision */
315  bool fixedOffs; /* fixed offsets */
316  PhyComAddress* address; /* GSE communication parameters */
317  int minTime; /* optional minTime parameter --> -1 if not present */
318  int maxTime; /* optional maxTime parameter --> -1 if not present */
319  GSEControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
320 };
321 
323  LogicalNode* parent;
324  char* name;
325 
326  char* svId; /* MsvUD/UsvID */
327  char* dataSetName; /* pre loaded with relative name in logical node */
328 
329  uint8_t optFlds;
330 
331  uint8_t smpMod;
332  uint16_t smpRate;
333 
334  uint32_t confRev; /* ConfRev - configuration revision */
335 
336  PhyComAddress* dstAddress; /* SV communication parameters */
337 
338  bool isUnicast;
339 
340  int noASDU;
341 
342  SVControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
343 };
344 
353 int
354 ModelNode_getChildCount(ModelNode* self);
355 
364 ModelNode*
365 ModelNode_getChild(ModelNode* self, const char* name);
366 
380 ModelNode*
381 ModelNode_getChildWithFc(ModelNode* self, const char* name, FunctionalConstraint fc);
382 
392 char*
393 ModelNode_getObjectReference(ModelNode* self, char* objectReference);
394 
402 ModelNodeType
403 ModelNode_getType(ModelNode* self);
404 
414 void
415 IedModel_setIedName(IedModel* self, const char* iedName);
416 
429 ModelNode*
430 IedModel_getModelNodeByObjectReference(IedModel* self, const char* objectReference);
431 
432 SVControlBlock*
433 IedModel_getSVControlBlock(IedModel* self, LogicalNode* parentLN, const char* svcbName);
434 
447 ModelNode*
448 IedModel_getModelNodeByShortObjectReference(IedModel* self, const char* objectReference);
449 
461 ModelNode*
462 IedModel_getModelNodeByShortAddress(IedModel* self, uint32_t shortAddress);
463 
472 LogicalDevice*
473 IedModel_getDeviceByInst(IedModel* self, const char* ldInst);
474 
483 LogicalDevice*
484 IedModel_getDeviceByIndex(IedModel* self, int index);
485 
486 
495 LogicalNode*
496 LogicalDevice_getLogicalNode(LogicalDevice* self, const char* lnName);
497 
505 SettingGroupControlBlock*
506 LogicalDevice_getSettingGroupControlBlock(LogicalDevice* self);
507 
518 void
519 IedModel_setAttributeValuesToNull(IedModel* self);
520 
529 LogicalDevice*
530 IedModel_getDevice(IedModel* self, const char* ldName);
531 
540 DataSet*
541 IedModel_lookupDataSet(IedModel* self, const char* dataSetReference);
542 
551 DataAttribute*
552 IedModel_lookupDataAttributeByMmsValue(IedModel* self, MmsValue* value);
553 
554 
562 int
563 IedModel_getLogicalDeviceCount(IedModel* self);
564 
565 int
566 LogicalDevice_getLogicalNodeCount(LogicalDevice* self);
567 
568 ModelNode*
569 LogicalDevice_getChildByMmsVariableName(LogicalDevice* self, const char* mmsVariableName);
570 
571 bool
572 LogicalNode_hasFCData(LogicalNode* self, FunctionalConstraint fc);
573 
574 bool
575 LogicalNode_hasBufferedReports(LogicalNode* self);
576 
577 bool
578 LogicalNode_hasUnbufferedReports(LogicalNode* self);
579 
588 DataSet*
589 LogicalNode_getDataSet(LogicalNode* self, const char* dataSetName);
590 
591 bool
592 DataObject_hasFCData(DataObject* self, FunctionalConstraint fc);
593 
594 
595 #ifdef __cplusplus
596 }
597 #endif
598 
599 
600 #endif /* MODEL_H_ */
Definition: iec61850_model.h:92
LogicalNode * parent
Definition: iec61850_model.h:255
Definition: iec61850_model.h:90
int elementCount
Definition: iec61850_model.h:249
int index
Definition: iec61850_model.h:240
ModelNodeType modelType
Definition: iec61850_model.h:184
LogicalNode * parent
Definition: iec61850_model.h:310
bool LogicalNode_hasBufferedReports(LogicalNode *self)
char * name
Definition: iec61850_model.h:311
Definition: iec61850_model.h:112
char * name
Definition: iec61850_model.h:185
uint16_t smpRate
Definition: iec61850_model.h:332
Definition: iec61850_model.h:270
Definition: iec61850_common.h:41
Definition: iec61850_model.h:115
char * name
Definition: iec61850_model.h:193
char * dataSetName
Definition: iec61850_model.h:259
Definition: iec61850_model.h:100
Definition: iec61850_model.h:96
bool logEna
Definition: iec61850_model.h:281
bool DataObject_hasFCData(DataObject *self, FunctionalConstraint fc)
int minTime
Definition: iec61850_model.h:317
Definition: iec61850_model.h:118
ReportControlBlock * rcbs
Definition: iec61850_model.h:174
uint8_t actSG
Definition: iec61850_model.h:298
ModelNode * firstChild
Definition: iec61850_model.h:196
uint32_t intPeriod
Definition: iec61850_model.h:265
char * logicalDeviceName
Definition: iec61850_model.h:237
Definition: iec61850_model.h:99
Definition: iec61850_model.h:95
PhyComAddress * address
Definition: iec61850_model.h:316
ModelNode * IedModel_getModelNodeByShortAddress(IedModel *self, uint32_t shortAddress)
Lookup a model node by its short address.
int maxTime
Definition: iec61850_model.h:318
char * ModelNode_getObjectReference(ModelNode *self, char *objectReference)
Return the IEC 61850 object reference of a model node.
uint8_t optFlds
Definition: iec61850_model.h:329
LogicalDevice * IedModel_getDeviceByIndex(IedModel *self, int index)
Lookup logical device (LD) instance by index.
ModelNodeType modelType
Definition: iec61850_model.h:218
Definition: iec61850_model.h:164
uint32_t confRev
Definition: iec61850_model.h:314
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:256
uint32_t bufferTime
Definition: iec61850_model.h:264
IEC 61850 data model of setting group control block (SGCB)
Definition: iec61850_model.h:295
SVControlBlock * sibling
Definition: iec61850_model.h:342
DataSet * IedModel_lookupDataSet(IedModel *self, const char *dataSetReference)
Lookup a data set in the IED model.
ModelNodeType
Definition: iec61850_model.h:163
Definition: iec61850_model.h:109
GSEControlBlock * sibling
Definition: iec61850_model.h:319
IEC 61850 data model element of type logical device.
Definition: iec61850_model.h:183
GSEControlBlock * gseCBs
Definition: iec61850_model.h:175
Definition: iec61850_model.h:167
SettingGroupControlBlock * sgcbs
Definition: iec61850_model.h:177
bool buffered
Definition: iec61850_model.h:258
ModelNode * firstChild
Definition: iec61850_model.h:212
uint8_t smpMod
Definition: iec61850_model.h:331
ModelNode * firstChild
Definition: iec61850_model.h:222
char * dataSetName
Definition: iec61850_model.h:327
void(* initializer)(void)
Definition: iec61850_model.h:180
ModelNodeType ModelNode_getType(ModelNode *self)
Get the type of the ModelNode.
Definition: iec61850_model.h:107
bool isUnicast
Definition: iec61850_model.h:338
uint8_t numOfSGs
Definition: iec61850_model.h:299
MmsValue * value
Definition: iec61850_model.h:242
Definition: iec61850_model.h:104
Definition: iec61850_model.h:94
ModelNode * parent
Definition: iec61850_model.h:220
Definition: iec61850_model.h:254
Definition: iec61850_model.h:98
Definition: iec61850_model.h:116
Definition: iec61850_model.h:119
Definition: iec61850_model.h:165
Definition: iec61850_model.h:236
ModelNode * sibling
Definition: iec61850_model.h:211
Definition: iec61850_model.h:108
Definition: iec61850_model.h:120
abstract base type for IEC 61850 data model nodes
Definition: iec61850_model.h:191
FunctionalConstraint fc
Definition: iec61850_model.h:226
char * svId
Definition: iec61850_model.h:326
Definition: iec61850_model.h:287
DataSet * LogicalNode_getDataSet(LogicalNode *self, const char *dataSetName)
get a data set instance
bool reasonCode
Definition: iec61850_model.h:282
char * rptId
Definition: iec61850_model.h:257
char * variableName
Definition: iec61850_model.h:239
SettingGroupControlBlock * sibling
Definition: iec61850_model.h:306
DataSetEntry * fcdas
Definition: iec61850_model.h:250
char * logRef
Definition: iec61850_model.h:276
bool LogicalNode_hasFCData(LogicalNode *self, FunctionalConstraint fc)
bool cnfEdit
Definition: iec61850_model.h:302
char * name
Definition: iec61850_model.h:290
ModelNode * sibling
Definition: iec61850_model.h:187
DataAttributeType type
Definition: iec61850_model.h:227
Definition: iec61850_model.h:121
uint16_t resvTms
Definition: iec61850_model.h:304
bool fixedOffs
Definition: iec61850_model.h:315
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:202
Definition: iec61850_model.h:110
Definition: iec61850_model.h:106
DataAttributeType
Definition: iec61850_model.h:89
ModelNode * parent
Definition: iec61850_model.h:194
PhyComAddress * dstAddress
Definition: iec61850_model.h:336
char * name
Definition: iec61850_model.h:171
Definition: iec61850_model.h:114
LogicalDevice * firstChild
Definition: iec61850_model.h:172
bool isLDNameDynamicallyAllocated
Definition: iec61850_model.h:238
void IedModel_setAttributeValuesToNull(IedModel *self)
unset all MmsValue references in the data model
char * logicalDeviceName
Definition: iec61850_model.h:247
LogicalNode * parent
Definition: iec61850_model.h:288
ModelNode * ModelNode_getChild(ModelNode *self, const char *name)
return a child model node
DataSet * dataSets
Definition: iec61850_model.h:173
Definition: iec61850_model.h:101
char * name
Definition: iec61850_model.h:324
LogControlBlock * sibling
Definition: iec61850_model.h:284
LogicalDevice * IedModel_getDevice(IedModel *self, const char *ldName)
Lookup logical device (LD) by device name.
uint8_t trgOps
Definition: iec61850_model.h:262
LogicalNode * parent
Definition: iec61850_model.h:323
Definition: iec61850_model.h:111
Definition: iec61850_model.h:102
Definition: iec61850_model.h:166
ModelNode * sibling
Definition: iec61850_model.h:221
LogControlBlock * lcbs
Definition: iec61850_model.h:178
ModelNode * firstChild
Definition: iec61850_model.h:188
IEC 61850 data model element of type data attribute.
Definition: iec61850_model.h:217
LogicalNode * parent
Definition: iec61850_model.h:271
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:246
Definition: iec61850_model.h:105
ModelNode * LogicalDevice_getChildByMmsVariableName(LogicalDevice *self, const char *mmsVariableName)
Log * logs
Definition: iec61850_model.h:179
Definition: iec61850_model.h:117
uint8_t trgOps
Definition: iec61850_model.h:278
MmsValue * mmsValue
Definition: iec61850_model.h:231
char * name
Definition: iec61850_model.h:273
ReportControlBlock * sibling
Definition: iec61850_model.h:267
uint32_t confRev
Definition: iec61850_model.h:334
Definition: iec61850_model.h:322
ModelNodeType modelType
Definition: iec61850_model.h:192
uint32_t sAddr
Definition: iec61850_model.h:233
SVControlBlock * IedModel_getSVControlBlock(IedModel *self, LogicalNode *parentLN, const char *svcbName)
LogicalNode * parent
Definition: iec61850_model.h:296
Definition: iec61850_model.h:122
Definition: iec61850_model.h:309
IEC 61850 data model element of type data object.
Definition: iec61850_model.h:207
char * name
Definition: iec61850_model.h:201
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:170
uint8_t editSG
Definition: iec61850_model.h:301
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:204
FunctionalConstraint
Definition: iec61850_common.h:202
uint8_t triggerOptions
Definition: iec61850_model.h:229
Definition: iec61850_model.h:113
char * name
Definition: iec61850_model.h:248
ModelNode * sibling
Definition: iec61850_model.h:195
char * dataSetName
Definition: iec61850_model.h:313
Definition: iec61850_model.h:93
SVControlBlock * svCBs
Definition: iec61850_model.h:176
ModelNodeType modelType
Definition: iec61850_model.h:208
uint64_t timestamp
Definition: iec61850_model.h:303
ModelNode * sibling
Definition: iec61850_model.h:203
Log * sibling
Definition: iec61850_model.h:292
int elementCount
Definition: iec61850_model.h:224
ModelNodeType modelType
Definition: iec61850_model.h:200
ModelNode * parent
Definition: iec61850_model.h:186
uint32_t confRef
Definition: iec61850_model.h:261
char * dataSetName
Definition: iec61850_model.h:275
DataSet * sibling
Definition: iec61850_model.h:251
Definition: iec61850_model.h:97
char * appId
Definition: iec61850_model.h:312
ModelNode * parent
Definition: iec61850_model.h:210
uint32_t intPeriod
Definition: iec61850_model.h:279
Definition: iec61850_model.h:91
char * name
Definition: iec61850_model.h:219
int ModelNode_getChildCount(ModelNode *self)
get the number of direct children of a model node
char * name
Definition: iec61850_model.h:209
char * componentName
Definition: iec61850_model.h:241
IEC 61850 data model element of type logical node.
Definition: iec61850_model.h:199
struct sMmsValue MmsValue
Definition: mms_value.h:68
int elementCount
Definition: iec61850_model.h:214
struct sDataSetEntry * sibling
Definition: iec61850_model.h:243
int noASDU
Definition: iec61850_model.h:340
Definition: iec61850_model.h:103
uint8_t options
Definition: iec61850_model.h:263