libiec61850/examples/server_example_dynamic/server_example_dynamic.c
2016-02-02 16:06:55 +01:00

104 lines
2.8 KiB
C

/*
* server_example_dynamic.c
*
* This example shows how to build a data model at runtime by API calls.
*
*/
#include "iec61850_server.h"
#include "hal_thread.h"
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
static int running = 0;
void sigint_handler(int signalId)
{
running = 0;
}
int main(int argc, char** argv) {
int tcpPort = 102;
if (argc > 1) {
tcpPort = atoi(argv[1]);
}
/*********************
* Setup data model
********************/
IedModel* model = IedModel_create("testmodel");
LogicalDevice* lDevice1 = LogicalDevice_create("SENSORS", model);
LogicalNode* lln0 = LogicalNode_create("LLN0", lDevice1);
DataObject* lln0_mod = CDC_ENS_create("Mod", (ModelNode*) lln0, 0);
DataObject* lln0_health = CDC_ENS_create("Health", (ModelNode*) lln0, 0);
SettingGroupControlBlock_create(lln0, 1, 1);
/* Add a temperature sensor LN */
LogicalNode* ttmp1 = LogicalNode_create("TTMP1", lDevice1);
DataObject* ttmp1_tmpsv = CDC_SAV_create("TmpSv", (ModelNode*) ttmp1, 0, false);
DataAttribute* temperatureValue = (DataAttribute*) ModelNode_getChild((ModelNode*) ttmp1_tmpsv, "instMag.f");
DataAttribute* temperatureTimestamp = (DataAttribute*) ModelNode_getChild((ModelNode*) ttmp1_tmpsv, "t");
DataSet* dataSet = DataSet_create("events", lln0);
DataSetEntry_create(dataSet, "TTMP1$MX$TmpSv$instMag$f", -1, NULL);
uint8_t rptOptions = RPT_OPT_SEQ_NUM | RPT_OPT_TIME_STAMP | RPT_OPT_REASON_FOR_INCLUSION;
ReportControlBlock_create("events01", lln0, "events01", false, NULL, 1, TRG_OPT_DATA_CHANGED, rptOptions, 50, 0);
ReportControlBlock_create("events02", lln0, "events02", false, NULL, 1, TRG_OPT_DATA_CHANGED, rptOptions, 50, 0);
GSEControlBlock_create("gse01", lln0, "events01", "events", 1, false, 200, 3000);
/*********************
* run server
********************/
IedServer iedServer = IedServer_create(model);
/* MMS server will be instructed to start listening to client connections. */
IedServer_start(iedServer, tcpPort);
if (!IedServer_isRunning(iedServer)) {
printf("Starting server failed! Exit.\n");
IedServer_destroy(iedServer);
exit(-1);
}
running = 1;
signal(SIGINT, sigint_handler);
float val = 0.f;
while (running) {
IedServer_lockDataModel(iedServer);
IedServer_updateUTCTimeAttributeValue(iedServer, temperatureTimestamp, Hal_getTimeInMs());
IedServer_updateFloatAttributeValue(iedServer, temperatureValue, val);
IedServer_unlockDataModel(iedServer);
val += 0.1f;
Thread_sleep(100);
}
/* stop MMS server - close TCP server socket and all client sockets */
IedServer_stop(iedServer);
/* Cleanup - free all resources */
IedServer_destroy(iedServer);
/* destroy dynamic data model */
IedModel_destroy(model);
} /* main() */