diff --git a/src/iec61850/inc_private/control.h b/src/iec61850/inc_private/control.h index 23a27e4b..ce26a75c 100644 --- a/src/iec61850/inc_private/control.h +++ b/src/iec61850/inc_private/control.h @@ -65,13 +65,14 @@ struct sControlObject MmsValue* ctlNumSt; MmsValue* originSt; + DataAttribute* stSeld; + char ctlObjectName[130]; /* for LastAppIError */ MmsValue* error; MmsValue* addCause; - bool selected; uint64_t selectTime; uint32_t selectTimeout; MmsValue* sboClass; diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index 9a4548ea..435eb4f8 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -393,6 +393,17 @@ ControlObject_initialize(ControlObject* self) MmsValue_setVisibleString(self->sbo, controlObjectReference); } + char* stSeldName = StringUtils_createStringInBuffer(strBuf, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".stSeld"); + + self->stSeld = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, stSeldName); + + if ((self->stSeld) && (self->stSeld->type != IEC61850_BOOLEAN)) { + self->stSeld = NULL; + + if (DEBUG_IED_SERVER) + printf("IED_SERVER: ERROR - stSeld of wrong type!\n"); + } + self->error = MmsValue_newIntegerFromInt32(0); self->addCause = MmsValue_newIntegerFromInt32(0); @@ -488,6 +499,14 @@ ControlObject_getMmsValue(ControlObject* self) return self->mmsValue; } +static void +setStSeld(ControlObject* self, bool value) +{ + if (self->stSeld) { + IedServer_updateBooleanAttributeValue(self->iedServer, self->stSeld, value); + } +} + static void selectObject(ControlObject* self, uint64_t selectTime, MmsServerConnection connection) { @@ -495,9 +514,10 @@ selectObject(ControlObject* self, uint64_t selectTime, MmsServerConnection conne printf("IED_SERVER: control %s selected\n", self->ctlObjectName); updateSboTimeoutValue(self); - self->selected = true; + self->selectTime = selectTime; self->mmsConnection = connection; + setStSeld(self, true); setState(self, STATE_READY); } @@ -506,6 +526,8 @@ unselectObject(ControlObject* self) { setState(self, STATE_UNSELECTED); + setStSeld(self, false); + if (DEBUG_IED_SERVER) printf("IED_SERVER: control %s unselected\n", self->ctlObjectName); }