libiec61850/examples/server_example_dynamic/server_example_dynamic.c
2014-12-01 10:34:45 +01:00

101 lines
2.7 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 "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);
/* 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);
/*********************
* 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);
MmsValue_setFloat(temperatureValue->mmsValue, val);
MmsValue_setUtcTimeMs(temperatureTimestamp->mmsValue, Hal_getTimeInMs());
IedServer_updateAttributeValue(iedServer, temperatureValue, temperatureValue->mmsValue);
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() */