libIEC61850  1.0.1
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 */
120 
121 
122 #if (CONFIG_IEC61850_USE_COMPAT_TYPE_DECLARATIONS == 1)
123  ,
124  BOOLEAN = 0,/* int */
125  INT8 = 1, /* int8_t */
126  INT16 = 2, /* int16_t */
127  INT32 = 3, /* int32_t */
128  INT64 = 4, /* int64_t */
129  INT128 = 5, /* no native mapping! */
130  INT8U = 6, /* uint8_t */
131  INT16U = 7, /* uint16_t */
132  INT24U = 8, /* uint32_t */
133  INT32U = 9, /* uint32_t */
134  FLOAT32 = 10, /* float */
135  FLOAT64 = 11, /* double */
136  ENUMERATED = 12,
137  OCTET_STRING_64 = 13,
138  OCTET_STRING_6 = 14,
139  OCTET_STRING_8 = 15,
140  VISIBLE_STRING_32 = 16,
141  VISIBLE_STRING_64 = 17,
142  VISIBLE_STRING_65 = 18,
143  VISIBLE_STRING_129 = 19,
144  VISIBLE_STRING_255 = 20,
145  UNICODE_STRING_255 = 21,
146  TIMESTAMP = 22,
147  QUALITY = 23,
148  CHECK = 24,
149  CODEDENUM = 25,
150  GENERIC_BITSTRING = 26,
151  CONSTRUCTED = 27,
152  ENTRY_TIME = 28,
153  PHYCOMADDR = 29
154 #endif
156 
157 typedef enum {
162 } ModelNodeType;
163 
164 struct sIedModel {
165  char* name;
166  LogicalDevice* firstChild;
167  DataSet* dataSets;
168  ReportControlBlock* rcbs;
169  GSEControlBlock* gseCBs;
170  SVControlBlock* svCBs;
171  SettingGroupControlBlock* sgcbs;
172  LogControlBlock* lcbs;
173  Log* logs;
174  void (*initializer) (void);
175 };
176 
178  ModelNodeType modelType;
179  char* name;
180  ModelNode* parent;
181  ModelNode* sibling;
182  ModelNode* firstChild;
183 };
184 
185 struct sModelNode {
186  ModelNodeType modelType;
187  char* name;
188  ModelNode* parent;
189  ModelNode* sibling;
190  ModelNode* firstChild;
191 };
192 
193 struct sLogicalNode {
194  ModelNodeType modelType;
195  char* name;
196  ModelNode* parent;
197  ModelNode* sibling;
198  ModelNode* firstChild;
199 };
200 
201 struct sDataObject {
202  ModelNodeType modelType;
203  char* name;
204  ModelNode* parent;
205  ModelNode* sibling;
206  ModelNode* firstChild;
207 
208  int elementCount; /* > 0 if this is an array */
209 };
210 
212  ModelNodeType modelType;
213  char* name;
214  ModelNode* parent;
215  ModelNode* sibling;
216  ModelNode* firstChild;
217 
218  int elementCount; /* > 0 if this is an array */
219 
222 
223  uint8_t triggerOptions; /* TRG_OPT_DATA_CHANGED | TRG_OPT_QUALITY_CHANGED | TRG_OPT_DATA_UPDATE */
224 
226 
227  uint32_t sAddr;
228 };
229 
230 typedef struct sDataSetEntry {
234  int index;
237  struct sDataSetEntry* sibling;
238 } DataSetEntry;
239 
240 struct sDataSet {
242  char* name; /* eg. MMXU1$dataset1 */
245  DataSet* sibling;
246 };
247 
249  LogicalNode* parent;
250  char* name;
251  char* rptId;
252  bool buffered;
253  char* dataSetName; /* pre loaded with relative name in logical node */
254 
255  uint32_t confRef; /* ConfRef - configuration revision */
256  uint8_t trgOps; /* TrgOps - trigger conditions */
257  uint8_t options; /* OptFlds */
258  uint32_t bufferTime; /* BufTm - time to buffer events until a report is generated */
259  uint32_t intPeriod; /* IntgPd - integrity period */
260 
261  ReportControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
262 };
263 
265  LogicalNode* parent;
266 
267  char* name;
268 
269  char* dataSetName;
270  char* logRef; /* object reference to the journal. Defaults to <MMS DomainName>/<LNName>$GeneralLog */
271 
272  uint8_t trgOps; /* TrgOps - trigger conditions */
273  uint32_t intPeriod; /* IntgPd - integrity period */
274 
275  bool logEna; /* enable log by default */
276  bool reasonCode; /* include reason code in log */
277 
278  LogControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
279 };
280 
281 struct sLog {
282  LogicalNode* parent;
283 
284  char* name;
285 
286  Log* sibling; /* next log instance in list or NULL if this is the last entry */
287 };
288 
290  LogicalNode* parent;
291 
292  uint8_t actSG; /* value from SCL file */
293  uint8_t numOfSGs; /* value from SCL file */
294 
295  uint8_t editSG; /* 0 at power-up */
296  bool cnfEdit; /* false at power-up */
297  uint64_t timestamp;
298  uint16_t resvTms;
299 
300  SettingGroupControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
301 };
302 
304  LogicalNode* parent;
305  char* name;
306  char* appId;
307  char* dataSetName; /* pre loaded with relative name in logical node */
308  uint32_t confRev; /* ConfRev - configuration revision */
309  bool fixedOffs; /* fixed offsets */
310  PhyComAddress* address; /* GSE communication parameters */
311  int minTime; /* optional minTime parameter --> -1 if not present */
312  int maxTime; /* optional maxTime parameter --> -1 if not present */
313  GSEControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
314 };
315 
317  LogicalNode* parent;
318  char* name;
319 
320  char* svId; /* MsvUD/UsvID */
321  char* dataSetName; /* pre loaded with relative name in logical node */
322 
323  uint8_t optFlds;
324 
325  uint8_t smpMod;
326  uint16_t smpRate;
327 
328  uint32_t confRev; /* ConfRev - configuration revision */
329 
330  PhyComAddress* dstAddress; /* SV communication parameters */
331 
332  bool isUnicast;
333 
334  int noASDU;
335 
336  SVControlBlock* sibling; /* next control block in list or NULL if this is the last entry */
337 };
338 
347 int
348 ModelNode_getChildCount(ModelNode* self);
349 
358 ModelNode*
359 ModelNode_getChild(ModelNode* self, const char* name);
360 
374 ModelNode*
375 ModelNode_getChildWithFc(ModelNode* self, const char* name, FunctionalConstraint fc);
376 
386 char*
387 ModelNode_getObjectReference(ModelNode* self, char* objectReference);
388 
392 ModelNodeType
393 ModelNode_getType(ModelNode* self);
394 
404 void
405 IedModel_setIedName(IedModel* self, const char* iedName);
406 
419 ModelNode*
420 IedModel_getModelNodeByObjectReference(IedModel* model, const char* objectReference);
421 
422 SVControlBlock*
423 IedModel_getSVControlBlock(IedModel* self, LogicalNode* parentLN, const char* svcbName);
424 
437 ModelNode*
438 IedModel_getModelNodeByShortObjectReference(IedModel* model, const char* objectReference);
439 
451 ModelNode*
452 IedModel_getModelNodeByShortAddress(IedModel* model, uint32_t shortAddress);
453 
462 LogicalNode*
463 LogicalDevice_getLogicalNode(LogicalDevice* device, const char* lnName);
464 
472 SettingGroupControlBlock*
473 LogicalDevice_getSettingGroupControlBlock(LogicalDevice* device);
474 
485 void
486 IedModel_setAttributeValuesToNull(IedModel* iedModel);
487 
488 LogicalDevice*
489 IedModel_getDevice(IedModel* model, const char* deviceName);
490 
491 /*
492  * \param dataSetReference MMS mapping object reference! e.g. ied1Inverter/LLN0$dataset1
493  */
494 DataSet*
495 IedModel_lookupDataSet(IedModel* model, const char* dataSetReference);
496 
497 int
498 IedModel_getLogicalDeviceCount(IedModel* iedModel);
499 
500 int
501 LogicalDevice_getLogicalNodeCount(LogicalDevice* logicalDevice);
502 
503 ModelNode*
504 LogicalDevice_getChildByMmsVariableName(LogicalDevice* logicalDevice, const char* mmsVariableName);
505 
506 bool
507 LogicalNode_hasFCData(LogicalNode* node, FunctionalConstraint fc);
508 
509 bool
510 LogicalNode_hasBufferedReports(LogicalNode* node);
511 
512 bool
513 LogicalNode_hasUnbufferedReports(LogicalNode* node);
514 
523 DataSet*
524 LogicalNode_getDataSet(LogicalNode* self, const char* dataSetName);
525 
526 bool
527 DataObject_hasFCData(DataObject* dataObject, FunctionalConstraint fc);
528 
529 DataAttribute*
530 IedModel_lookupDataAttributeByMmsValue(IedModel* model, MmsValue* value);
531 
532 #ifdef __cplusplus
533 }
534 #endif
535 
536 
537 #endif /* MODEL_H_ */
Definition: iec61850_model.h:92
LogicalNode * parent
Definition: iec61850_model.h:249
Definition: iec61850_model.h:90
int elementCount
Definition: iec61850_model.h:243
int index
Definition: iec61850_model.h:234
ModelNodeType modelType
Definition: iec61850_model.h:178
LogicalNode * parent
Definition: iec61850_model.h:304
char * name
Definition: iec61850_model.h:305
Definition: iec61850_model.h:112
char * name
Definition: iec61850_model.h:179
SettingGroupControlBlock * LogicalDevice_getSettingGroupControlBlock(LogicalDevice *device)
Get the setting group control block (SGCB) of the logical device.
uint16_t smpRate
Definition: iec61850_model.h:326
Definition: iec61850_model.h:264
Definition: iec61850_common.h:41
Definition: iec61850_model.h:115
char * name
Definition: iec61850_model.h:187
char * dataSetName
Definition: iec61850_model.h:253
ModelNode * IedModel_getModelNodeByShortAddress(IedModel *model, uint32_t shortAddress)
Lookup a model node by its short address.
Definition: iec61850_model.h:100
Definition: iec61850_model.h:96
bool logEna
Definition: iec61850_model.h:275
int minTime
Definition: iec61850_model.h:311
Definition: iec61850_model.h:118
ReportControlBlock * rcbs
Definition: iec61850_model.h:168
uint8_t actSG
Definition: iec61850_model.h:292
ModelNode * firstChild
Definition: iec61850_model.h:190
uint32_t intPeriod
Definition: iec61850_model.h:259
char * logicalDeviceName
Definition: iec61850_model.h:231
Definition: iec61850_model.h:99
void IedModel_setAttributeValuesToNull(IedModel *iedModel)
unset all MmsValue references in the data model
Definition: iec61850_model.h:95
PhyComAddress * address
Definition: iec61850_model.h:310
int maxTime
Definition: iec61850_model.h:312
char * ModelNode_getObjectReference(ModelNode *self, char *objectReference)
Return the IEC 61850 object reference of a model node.
bool DataObject_hasFCData(DataObject *dataObject, FunctionalConstraint fc)
uint8_t optFlds
Definition: iec61850_model.h:323
ModelNodeType modelType
Definition: iec61850_model.h:212
Definition: iec61850_model.h:158
uint32_t confRev
Definition: iec61850_model.h:308
char * name
Definition: iec61850_model.h:250
uint32_t bufferTime
Definition: iec61850_model.h:258
IEC 61850 data model of setting group control block (SGCB)
Definition: iec61850_model.h:289
SVControlBlock * sibling
Definition: iec61850_model.h:336
ModelNodeType
Definition: iec61850_model.h:157
Definition: iec61850_model.h:109
GSEControlBlock * sibling
Definition: iec61850_model.h:313
IEC 61850 data model element of type logical device.
Definition: iec61850_model.h:177
GSEControlBlock * gseCBs
Definition: iec61850_model.h:169
Definition: iec61850_model.h:161
LogicalDevice * IedModel_getDevice(IedModel *model, const char *deviceName)
SettingGroupControlBlock * sgcbs
Definition: iec61850_model.h:171
bool LogicalNode_hasFCData(LogicalNode *node, FunctionalConstraint fc)
DataSet * IedModel_lookupDataSet(IedModel *model, const char *dataSetReference)
bool buffered
Definition: iec61850_model.h:252
ModelNode * firstChild
Definition: iec61850_model.h:206
uint8_t smpMod
Definition: iec61850_model.h:325
ModelNode * firstChild
Definition: iec61850_model.h:216
char * dataSetName
Definition: iec61850_model.h:321
void(* initializer)(void)
Definition: iec61850_model.h:174
ModelNodeType ModelNode_getType(ModelNode *self)
Definition: iec61850_model.h:107
bool isUnicast
Definition: iec61850_model.h:332
uint8_t numOfSGs
Definition: iec61850_model.h:293
MmsValue * value
Definition: iec61850_model.h:236
Definition: iec61850_model.h:104
Definition: iec61850_model.h:94
ModelNode * parent
Definition: iec61850_model.h:214
Definition: iec61850_model.h:248
Definition: iec61850_model.h:98
Definition: iec61850_model.h:116
Definition: iec61850_model.h:119
Definition: iec61850_model.h:159
DataAttribute * IedModel_lookupDataAttributeByMmsValue(IedModel *model, MmsValue *value)
Definition: iec61850_model.h:230
int IedModel_getLogicalDeviceCount(IedModel *iedModel)
ModelNode * sibling
Definition: iec61850_model.h:205
Definition: iec61850_model.h:108
int LogicalDevice_getLogicalNodeCount(LogicalDevice *logicalDevice)
abstract base type for IEC 61850 data model nodes
Definition: iec61850_model.h:185
FunctionalConstraint fc
Definition: iec61850_model.h:220
char * svId
Definition: iec61850_model.h:320
Definition: iec61850_model.h:281
DataSet * LogicalNode_getDataSet(LogicalNode *self, const char *dataSetName)
get a data set instance
bool reasonCode
Definition: iec61850_model.h:276
char * rptId
Definition: iec61850_model.h:251
char * variableName
Definition: iec61850_model.h:233
SettingGroupControlBlock * sibling
Definition: iec61850_model.h:300
DataSetEntry * fcdas
Definition: iec61850_model.h:244
char * logRef
Definition: iec61850_model.h:270
bool cnfEdit
Definition: iec61850_model.h:296
char * name
Definition: iec61850_model.h:284
ModelNode * sibling
Definition: iec61850_model.h:181
DataAttributeType type
Definition: iec61850_model.h:221
uint16_t resvTms
Definition: iec61850_model.h:298
bool fixedOffs
Definition: iec61850_model.h:309
ModelNode * ModelNode_getChildWithFc(ModelNode *self, const char *name, FunctionalConstraint fc)
return a child model node with a given functional constraint
ModelNode * parent
Definition: iec61850_model.h:196
Definition: iec61850_model.h:110
Definition: iec61850_model.h:106
DataAttributeType
Definition: iec61850_model.h:89
ModelNode * parent
Definition: iec61850_model.h:188
PhyComAddress * dstAddress
Definition: iec61850_model.h:330
char * name
Definition: iec61850_model.h:165
Definition: iec61850_model.h:114
LogicalDevice * firstChild
Definition: iec61850_model.h:166
bool isLDNameDynamicallyAllocated
Definition: iec61850_model.h:232
ModelNode * LogicalDevice_getChildByMmsVariableName(LogicalDevice *logicalDevice, const char *mmsVariableName)
LogicalNode * LogicalDevice_getLogicalNode(LogicalDevice *device, const char *lnName)
Lookup a logical node by name that is part of the given logical device.
char * logicalDeviceName
Definition: iec61850_model.h:241
LogicalNode * parent
Definition: iec61850_model.h:282
ModelNode * ModelNode_getChild(ModelNode *self, const char *name)
return a child model node
DataSet * dataSets
Definition: iec61850_model.h:167
Definition: iec61850_model.h:101
char * name
Definition: iec61850_model.h:318
LogControlBlock * sibling
Definition: iec61850_model.h:278
uint8_t trgOps
Definition: iec61850_model.h:256
LogicalNode * parent
Definition: iec61850_model.h:317
Definition: iec61850_model.h:111
Definition: iec61850_model.h:102
Definition: iec61850_model.h:160
ModelNode * sibling
Definition: iec61850_model.h:215
LogControlBlock * lcbs
Definition: iec61850_model.h:172
ModelNode * firstChild
Definition: iec61850_model.h:182
IEC 61850 data model element of type data attribute.
Definition: iec61850_model.h:211
LogicalNode * parent
Definition: iec61850_model.h:265
Definition: iec61850_model.h:240
Definition: iec61850_model.h:105
Log * logs
Definition: iec61850_model.h:173
Definition: iec61850_model.h:117
uint8_t trgOps
Definition: iec61850_model.h:272
MmsValue * mmsValue
Definition: iec61850_model.h:225
char * name
Definition: iec61850_model.h:267
ReportControlBlock * sibling
Definition: iec61850_model.h:261
uint32_t confRev
Definition: iec61850_model.h:328
Definition: iec61850_model.h:316
ModelNodeType modelType
Definition: iec61850_model.h:186
uint32_t sAddr
Definition: iec61850_model.h:227
SVControlBlock * IedModel_getSVControlBlock(IedModel *self, LogicalNode *parentLN, const char *svcbName)
LogicalNode * parent
Definition: iec61850_model.h:290
Definition: iec61850_model.h:303
IEC 61850 data model element of type data object.
Definition: iec61850_model.h:201
char * name
Definition: iec61850_model.h:195
bool LogicalNode_hasBufferedReports(LogicalNode *node)
Root node of the IEC 61850 data model. This is usually created by the model generator tool (genmodel...
Definition: iec61850_model.h:164
uint8_t editSG
Definition: iec61850_model.h:295
void IedModel_setIedName(IedModel *self, const char *iedName)
Set the name of the IED.
ModelNode * firstChild
Definition: iec61850_model.h:198
ModelNode * IedModel_getModelNodeByShortObjectReference(IedModel *model, const char *objectReference)
Lookup a model node by its short (normalized) reference.
bool LogicalNode_hasUnbufferedReports(LogicalNode *node)
FunctionalConstraint
Definition: iec61850_common.h:202
uint8_t triggerOptions
Definition: iec61850_model.h:223
Definition: iec61850_model.h:113
char * name
Definition: iec61850_model.h:242
ModelNode * sibling
Definition: iec61850_model.h:189
char * dataSetName
Definition: iec61850_model.h:307
Definition: iec61850_model.h:93
SVControlBlock * svCBs
Definition: iec61850_model.h:170
ModelNodeType modelType
Definition: iec61850_model.h:202
uint64_t timestamp
Definition: iec61850_model.h:297
ModelNode * sibling
Definition: iec61850_model.h:197
Log * sibling
Definition: iec61850_model.h:286
int elementCount
Definition: iec61850_model.h:218
ModelNodeType modelType
Definition: iec61850_model.h:194
ModelNode * parent
Definition: iec61850_model.h:180
uint32_t confRef
Definition: iec61850_model.h:255
char * dataSetName
Definition: iec61850_model.h:269
DataSet * sibling
Definition: iec61850_model.h:245
Definition: iec61850_model.h:97
char * appId
Definition: iec61850_model.h:306
ModelNode * parent
Definition: iec61850_model.h:204
uint32_t intPeriod
Definition: iec61850_model.h:273
ModelNode * IedModel_getModelNodeByObjectReference(IedModel *model, const char *objectReference)
Lookup a model node by its object reference.
Definition: iec61850_model.h:91
char * name
Definition: iec61850_model.h:213
int ModelNode_getChildCount(ModelNode *self)
get the number of direct children of a model node
char * name
Definition: iec61850_model.h:203
char * componentName
Definition: iec61850_model.h:235
IEC 61850 data model element of type logical node.
Definition: iec61850_model.h:193
struct sMmsValue MmsValue
Definition: mms_value.h:68
int elementCount
Definition: iec61850_model.h:208
struct sDataSetEntry * sibling
Definition: iec61850_model.h:237
int noASDU
Definition: iec61850_model.h:334
Definition: iec61850_model.h:103
uint8_t options
Definition: iec61850_model.h:257