- IEC 61850 server: control model - implemented automatic handling of stSeld when present in data object

pull/179/head
Michael Zillgith 7 years ago
parent c98a2b0baa
commit a3c2c4652e

@ -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;

@ -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);
}

Loading…
Cancel
Save