- IED Server: prevent integrated GOOSE publisher to crash when ethernet socket cannot be created

pull/309/head
Michael Zillgith 5 years ago
parent 23a3b3a371
commit 9e064ab709

@ -58,99 +58,101 @@ goCbEventHandler(MmsGooseControlBlock goCb, int event, void* parameter)
printf(" GoEna: %i\n", MmsGooseControlBlock_getGoEna(goCb)); printf(" GoEna: %i\n", MmsGooseControlBlock_getGoEna(goCb));
} }
int main(int argc, char** argv) { int
main(int argc, char** argv)
{
IedServerConfig config = IedServerConfig_create(); IedServerConfig config = IedServerConfig_create();
iedServer = IedServer_createWithConfig(&iedModel, NULL, config); iedServer = IedServer_createWithConfig(&iedModel, NULL, config);
IedServerConfig_destroy(config); IedServerConfig_destroy(config);
if (argc > 1) { if (argc > 1) {
char* ethernetIfcID = argv[1]; char* ethernetIfcID = argv[1];
printf("Using GOOSE interface: %s\n", ethernetIfcID); printf("Using GOOSE interface: %s\n", ethernetIfcID);
/* set GOOSE interface for all GOOSE publishers (GCBs) */ /* set GOOSE interface for all GOOSE publishers (GCBs) */
IedServer_setGooseInterfaceId(iedServer, ethernetIfcID); IedServer_setGooseInterfaceId(iedServer, ethernetIfcID);
} }
if (argc > 2) { if (argc > 2) {
char* ethernetIfcID = argv[2]; char* ethernetIfcID = argv[2];
printf("Using GOOSE interface for GenericIO/LLN0.gcbAnalogValues: %s\n", ethernetIfcID); printf("Using GOOSE interface for GenericIO/LLN0.gcbAnalogValues: %s\n", ethernetIfcID);
/* set GOOSE interface for a particular GOOSE publisher (GCB) */ /* set GOOSE interface for a particular GOOSE publisher (GCB) */
IedServer_setGooseInterfaceIdEx(iedServer, IEDMODEL_GenericIO_LLN0, "gcbAnalogValues", ethernetIfcID); IedServer_setGooseInterfaceIdEx(iedServer, IEDMODEL_GenericIO_LLN0, "gcbAnalogValues", ethernetIfcID);
} }
IedServer_setGoCBHandler(iedServer, goCbEventHandler, NULL); IedServer_setGoCBHandler(iedServer, goCbEventHandler, NULL);
/* MMS server will be instructed to start listening to client connections. */ /* MMS server will be instructed to start listening to client connections. */
IedServer_start(iedServer, 102); IedServer_start(iedServer, 102);
IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, (ControlHandler) controlHandlerForBinaryOutput, IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, (ControlHandler) controlHandlerForBinaryOutput,
IEDMODEL_GenericIO_GGIO1_SPCSO1); IEDMODEL_GenericIO_GGIO1_SPCSO1);
IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2, (ControlHandler) controlHandlerForBinaryOutput, IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2, (ControlHandler) controlHandlerForBinaryOutput,
IEDMODEL_GenericIO_GGIO1_SPCSO2); IEDMODEL_GenericIO_GGIO1_SPCSO2);
IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3, (ControlHandler) controlHandlerForBinaryOutput, IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3, (ControlHandler) controlHandlerForBinaryOutput,
IEDMODEL_GenericIO_GGIO1_SPCSO3); IEDMODEL_GenericIO_GGIO1_SPCSO3);
IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4, (ControlHandler) controlHandlerForBinaryOutput, IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4, (ControlHandler) controlHandlerForBinaryOutput,
IEDMODEL_GenericIO_GGIO1_SPCSO4); IEDMODEL_GenericIO_GGIO1_SPCSO4);
if (!IedServer_isRunning(iedServer)) { if (!IedServer_isRunning(iedServer)) {
printf("Starting server failed! Exit.\n"); printf("Starting server failed! Exit.\n");
IedServer_destroy(iedServer); IedServer_destroy(iedServer);
exit(-1); exit(-1);
} }
/* Start GOOSE publishing */ /* Start GOOSE publishing */
IedServer_enableGoosePublishing(iedServer); IedServer_enableGoosePublishing(iedServer);
running = 1; running = 1;
signal(SIGINT, sigint_handler); signal(SIGINT, sigint_handler);
float anIn1 = 0.f; float anIn1 = 0.f;
int eventCount = 10; int eventCount = 10;
while (running) { while (running) {
IedServer_lockDataModel(iedServer); IedServer_lockDataModel(iedServer);
IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, Hal_getTimeInMs()); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, Hal_getTimeInMs());
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, anIn1); IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, anIn1);
if (eventCount) { if (eventCount) {
IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, Hal_getTimeInMs()); IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, Hal_getTimeInMs());
if (eventCount % 2) { if (eventCount % 2) {
IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_q, QUALITY_VALIDITY_GOOD); IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_q, QUALITY_VALIDITY_GOOD);
IedServer_updateBooleanAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, true); IedServer_updateBooleanAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, true);
} }
else { else {
IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_q, QUALITY_VALIDITY_INVALID); IedServer_updateQuality(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_q, QUALITY_VALIDITY_INVALID);
IedServer_updateBooleanAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, false); IedServer_updateBooleanAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, false);
} }
eventCount--;
}
eventCount--; IedServer_unlockDataModel(iedServer);
}
IedServer_unlockDataModel(iedServer); anIn1 += 0.1;
anIn1 += 0.1; Thread_sleep(1000);
}
Thread_sleep(1000); /* stop MMS server - close TCP server socket and all client sockets */
} IedServer_stop(iedServer);
/* stop MMS server - close TCP server socket and all client sockets */ /* Cleanup - free all resources */
IedServer_stop(iedServer); IedServer_destroy(iedServer);
/* Cleanup - free all resources */ return 0;
IedServer_destroy(iedServer);
return 0;
} /* main() */ } /* main() */

@ -508,37 +508,39 @@ MmsGooseControlBlock_disable(MmsGooseControlBlock self, MmsMapping* mmsMapping)
void void
MmsGooseControlBlock_checkAndPublish(MmsGooseControlBlock self, uint64_t currentTime) MmsGooseControlBlock_checkAndPublish(MmsGooseControlBlock self, uint64_t currentTime)
{ {
if (currentTime >= self->nextPublishTime) { if (self->publisher) {
if (currentTime >= self->nextPublishTime) {
#if (CONFIG_MMS_THREADLESS_STACK != 1) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->publisherMutex); Semaphore_wait(self->publisherMutex);
#endif #endif
GoosePublisher_publish(self->publisher, self->dataSetValues); GoosePublisher_publish(self->publisher, self->dataSetValues);
if (self->retransmissionsLeft > 0) { if (self->retransmissionsLeft > 0) {
self->nextPublishTime = currentTime + self->minTime; self->nextPublishTime = currentTime + self->minTime;
if (self->retransmissionsLeft > 1) if (self->retransmissionsLeft > 1)
GoosePublisher_setTimeAllowedToLive(self->publisher, self->minTime * 3); GoosePublisher_setTimeAllowedToLive(self->publisher, self->minTime * 3);
else else
GoosePublisher_setTimeAllowedToLive(self->publisher, self->maxTime * 3); GoosePublisher_setTimeAllowedToLive(self->publisher, self->maxTime * 3);
self->retransmissionsLeft--; self->retransmissionsLeft--;
} }
else { else {
GoosePublisher_setTimeAllowedToLive(self->publisher, self->maxTime * 3); GoosePublisher_setTimeAllowedToLive(self->publisher, self->maxTime * 3);
self->nextPublishTime = currentTime + self->maxTime; self->nextPublishTime = currentTime + self->maxTime;
} }
#if (CONFIG_MMS_THREADLESS_STACK != 1) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_post(self->publisherMutex); Semaphore_post(self->publisherMutex);
#endif #endif
} }
else if ((self->nextPublishTime - currentTime) > ((uint32_t) self->maxTime * 2)) { else if ((self->nextPublishTime - currentTime) > ((uint32_t) self->maxTime * 2)) {
self->nextPublishTime = currentTime + self->minTime; self->nextPublishTime = currentTime + self->minTime;
}
} }
} }
@ -551,6 +553,9 @@ MmsGooseControlBlock_setStateChangePending(MmsGooseControlBlock self)
void void
MmsGooseControlBlock_publishNewState(MmsGooseControlBlock self) MmsGooseControlBlock_publishNewState(MmsGooseControlBlock self)
{ {
if (self->publisher == false)
return;
if (self->stateChangePending) { if (self->stateChangePending) {
#if (CONFIG_MMS_THREADLESS_STACK != 1) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->publisherMutex); Semaphore_wait(self->publisherMutex);

Loading…
Cancel
Save