- IEC 61850 server: integrated automatic handling of "origin" and "ctlVal" status (ST) values for controllable CDCs

pull/72/head
Michael Zillgith 7 years ago
parent 713ca54cd0
commit 020b1f40aa

@ -212,11 +212,13 @@
<DA name="t" bType="Timestamp" fc="MX" /> <DA name="t" bType="Timestamp" fc="MX" />
</DOType> </DOType>
<DOType id="SPC_1_SPCSO1" cdc="SPC"> <DOType id="SPC_1_SPCSO1" cdc="SPC">
<DA name="origin" fc="ST" type="Originator_1" bType="Struct" />
<DA name="ctlNum" fc="ST" bType="INT8U" />
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" /> <DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" /> <DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="t" bType="Timestamp" fc="ST" /> <DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
<DA name="Oper" type="SPCOperate_1" bType="Struct" fc="CO" />
</DOType> </DOType>
<DOType id="INC_2_Mod" cdc="INC"> <DOType id="INC_2_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" /> <DA name="q" bType="Quality" fc="ST" qchg="true" />

@ -3,7 +3,7 @@
* *
* automatically generated from simpleIO_direct_control.icd * automatically generated from simpleIO_direct_control.icd
*/ */
#include "../server_example_basic_io/static_model.h" #include "static_model.h"
static void initializeValues(); static void initializeValues();
@ -1571,10 +1571,62 @@ DataObject iedModel_GenericIO_GGIO1_SPCSO4 = {
"SPCSO4", "SPCSO4",
(ModelNode*) &iedModel_GenericIO_GGIO1, (ModelNode*) &iedModel_GenericIO_GGIO1,
(ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_stVal, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_origin,
0 0
}; };
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin = {
DataAttributeModelType,
"origin",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlNum,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_origin_orCat,
0,
IEC61850_FC_ST,
IEC61850_CONSTRUCTED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin_orCat = {
DataAttributeModelType,
"orCat",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_origin,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_origin_orIdent,
NULL,
0,
IEC61850_FC_ST,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin_orIdent = {
DataAttributeModelType,
"orIdent",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_origin,
NULL,
NULL,
0,
IEC61850_FC_ST,
IEC61850_OCTET_STRING_64,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlNum = {
DataAttributeModelType,
"ctlNum",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_stVal,
NULL,
0,
IEC61850_FC_ST,
IEC61850_INT8U,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = {
DataAttributeModelType, DataAttributeModelType,
"stVal", "stVal",
@ -1592,7 +1644,7 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = {
DataAttributeModelType, DataAttributeModelType,
"q", "q",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_t,
NULL, NULL,
0, 0,
IEC61850_FC_ST, IEC61850_FC_ST,
@ -1601,11 +1653,37 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = {
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlModel,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = {
DataAttributeModelType,
"ctlModel",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper,
NULL,
0,
IEC61850_FC_CF,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = {
DataAttributeModelType, DataAttributeModelType,
"Oper", "Oper",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlModel, NULL,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal,
0, 0,
IEC61850_FC_CO, IEC61850_FC_CO,
@ -1718,32 +1796,6 @@ DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = {
NULL, NULL,
0}; 0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = {
DataAttributeModelType,
"ctlModel",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_t,
NULL,
0,
IEC61850_FC_CF,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4,
NULL,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataObject iedModel_GenericIO_GGIO1_Ind1 = { DataObject iedModel_GenericIO_GGIO1_Ind1 = {
DataObjectModelType, DataObjectModelType,
"Ind1", "Ind1",

@ -123,8 +123,14 @@ extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t;
extern DataObject iedModel_GenericIO_GGIO1_SPCSO4; extern DataObject iedModel_GenericIO_GGIO1_SPCSO4;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin_orCat;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_origin_orIdent;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin;
@ -134,8 +140,6 @@ extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check; extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel;
extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t;
extern DataObject iedModel_GenericIO_GGIO1_Ind1; extern DataObject iedModel_GenericIO_GGIO1_Ind1;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal; extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q; extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q;
@ -267,8 +271,14 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO3_ctlModel) #define IEDMODEL_GenericIO_GGIO1_SPCSO3_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO3_ctlModel)
#define IEDMODEL_GenericIO_GGIO1_SPCSO3_t (&iedModel_GenericIO_GGIO1_SPCSO3_t) #define IEDMODEL_GenericIO_GGIO1_SPCSO3_t (&iedModel_GenericIO_GGIO1_SPCSO3_t)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4 (&iedModel_GenericIO_GGIO1_SPCSO4) #define IEDMODEL_GenericIO_GGIO1_SPCSO4 (&iedModel_GenericIO_GGIO1_SPCSO4)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_origin (&iedModel_GenericIO_GGIO1_SPCSO4_origin)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO4_origin_orCat)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO4_origin_orIdent)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO4_ctlNum)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal (&iedModel_GenericIO_GGIO1_SPCSO4_stVal) #define IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal (&iedModel_GenericIO_GGIO1_SPCSO4_stVal)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_q (&iedModel_GenericIO_GGIO1_SPCSO4_q) #define IEDMODEL_GenericIO_GGIO1_SPCSO4_q (&iedModel_GenericIO_GGIO1_SPCSO4_q)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_t (&iedModel_GenericIO_GGIO1_SPCSO4_t)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO4_ctlModel)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper (&iedModel_GenericIO_GGIO1_SPCSO4_Oper) #define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper (&iedModel_GenericIO_GGIO1_SPCSO4_Oper)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal) #define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin) #define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin)
@ -278,8 +288,6 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_T) #define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_T)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test) #define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check) #define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO4_ctlModel)
#define IEDMODEL_GenericIO_GGIO1_SPCSO4_t (&iedModel_GenericIO_GGIO1_SPCSO4_t)
#define IEDMODEL_GenericIO_GGIO1_Ind1 (&iedModel_GenericIO_GGIO1_Ind1) #define IEDMODEL_GenericIO_GGIO1_Ind1 (&iedModel_GenericIO_GGIO1_Ind1)
#define IEDMODEL_GenericIO_GGIO1_Ind1_stVal (&iedModel_GenericIO_GGIO1_Ind1_stVal) #define IEDMODEL_GenericIO_GGIO1_Ind1_stVal (&iedModel_GenericIO_GGIO1_Ind1_stVal)
#define IEDMODEL_GenericIO_GGIO1_Ind1_q (&iedModel_GenericIO_GGIO1_Ind1_q) #define IEDMODEL_GenericIO_GGIO1_Ind1_q (&iedModel_GenericIO_GGIO1_Ind1_q)

@ -62,6 +62,9 @@ struct sControlObject
MmsValue* origin; MmsValue* origin;
MmsValue* timestamp; MmsValue* timestamp;
MmsValue* ctlNumSt;
MmsValue* originSt;
char ctlObjectName[130]; char ctlObjectName[130];
/* for LastAppIError */ /* for LastAppIError */

@ -110,8 +110,8 @@ updateSboTimeoutValue(ControlObject* self)
self->selectTimeout = CONFIG_CONTROL_DEFAULT_SBO_TIMEOUT; self->selectTimeout = CONFIG_CONTROL_DEFAULT_SBO_TIMEOUT;
} }
static void void
initialize(ControlObject* self) ControlObject_initialize(ControlObject* self)
{ {
MmsServer mmsServer = IedServer_getMmsServer(self->iedServer); MmsServer mmsServer = IedServer_getMmsServer(self->iedServer);
@ -139,6 +139,14 @@ initialize(ControlObject* self)
StringUtils_createStringInBuffer(self->ctlObjectName, 5, MmsDomain_getName(self->mmsDomain), "/", StringUtils_createStringInBuffer(self->ctlObjectName, 5, MmsDomain_getName(self->mmsDomain), "/",
self->lnName, "$CO$", self->name); self->lnName, "$CO$", self->name);
char* ctlNumName = StringUtils_createStringInBuffer(strBuf, 4, self->lnName, "$ST$", self->name, "$ctlNum");
self->ctlNumSt = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, ctlNumName);
char* originName = StringUtils_createStringInBuffer(strBuf, 4, self->lnName, "$ST$", self->name, "$origin");
self->originSt = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, originName);
self->error = MmsValue_newIntegerFromInt32(0); self->error = MmsValue_newIntegerFromInt32(0);
self->addCause = MmsValue_newIntegerFromInt32(0); self->addCause = MmsValue_newIntegerFromInt32(0);
@ -387,12 +395,6 @@ exit_function:
return self; return self;
} }
void
ControlObject_initialize(ControlObject* self)
{
initialize(self);
}
void void
ControlObject_destroy(ControlObject* self) ControlObject_destroy(ControlObject* self)
{ {
@ -900,6 +902,12 @@ updateControlParameters(ControlObject* controlObject, MmsValue* ctlVal, MmsValue
controlObject->ctlVal = MmsValue_clone(ctlVal); controlObject->ctlVal = MmsValue_clone(ctlVal);
controlObject->ctlNum = MmsValue_clone(ctlNum); controlObject->ctlNum = MmsValue_clone(ctlNum);
controlObject->origin = MmsValue_clone(origin); controlObject->origin = MmsValue_clone(origin);
if (controlObject->ctlNumSt)
MmsValue_update(controlObject->ctlNumSt, ctlNum);
if (controlObject->originSt)
MmsValue_update(controlObject->originSt, origin);
} }
static bool static bool

Loading…
Cancel
Save