libiec61850/examples/server_example_config_file/server_example_config_file.c
2014-12-01 10:47:22 +01:00

139 lines
3.6 KiB
C

/*
* server_example_config_file.c
*
* This example shows how to use dynamic server data model with a configuration file.
*
* - How to open and parse the model configuration file
* - How to access data attributes by object reference strings
* - How to access data attributes by short addresses
*
* Note: If building with cmake the vmd-filestore folder containing the configuration file
* (model.cfg) has to be copied to the folder where the example is executed!
* The configuration file can be created from the SCL(ICD) file with the Java tool genconfig.jar
* that is included in the source distribution of libiec61580.
*
*/
#include "iec61850_server.h"
#include "hal_thread.h"
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include "hal_filesystem.h"
#include "iec61850_config_file_parser.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]);
}
/* open configuration file */
FileHandle configFile = FileSystem_openFile("model.cfg", false);
if (configFile == NULL) {
printf("Error opening config file!\n");
return 1;
}
/* parse the configuration file and create the data model */
IedModel* model = ConfigFileParser_createModelFromConfigFile(configFile);
FileSystem_closeFile(configFile);
if (model == NULL) {
printf("Error parsing config file!\n");
return 1;
}
IedServer iedServer = IedServer_create(model);
/* Access to data attributes by object reference */
DataAttribute* anIn1_mag_f = (DataAttribute*)
IedModel_getModelNodeByObjectReference(model, "simpleIOGenericIO/GGIO1.AnIn1.mag.f");
DataAttribute* anIn1_t = (DataAttribute*)
IedModel_getModelNodeByObjectReference(model, "simpleIOGenericIO/GGIO1.AnIn1.t");
if (anIn1_mag_f == NULL)
printf("Error getting AnIn1.mag.f data attribute!\n");
/* Access to data attributes by short address */
DataAttribute* anIn2_mag = (DataAttribute*)
IedModel_getModelNodeByShortAddress(model, 101);
DataAttribute* anIn2_t = (DataAttribute*)
IedModel_getModelNodeByShortAddress(model, 102);
DataAttribute* anIn2_mag_f = NULL;
if (anIn2_mag == NULL)
printf("Error getting AnIn2.mag data attribute!\n");
else
anIn2_mag_f = (DataAttribute*) ModelNode_getChild((ModelNode*) anIn2_mag, "f");
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;
MmsValue* floatValue = MmsValue_newFloat(val);
while (running) {
if (anIn1_mag_f != NULL) {
MmsValue_setFloat(floatValue, val);
IedServer_lockDataModel(iedServer);
MmsValue_setUtcTimeMs(anIn1_t->mmsValue, Hal_getTimeInMs());
IedServer_updateAttributeValue(iedServer, anIn1_mag_f, floatValue);
IedServer_unlockDataModel(iedServer);
}
if (anIn2_mag_f != NULL) {
MmsValue_setFloat(floatValue, 0.f - val);
IedServer_lockDataModel(iedServer);
MmsValue_setUtcTimeMs(anIn2_t->mmsValue, Hal_getTimeInMs());
IedServer_updateAttributeValue(iedServer, anIn2_mag_f, floatValue);
IedServer_unlockDataModel(iedServer);
}
val += 0.1f;
Thread_sleep(100);
}
MmsValue_delete(floatValue);
IedServer_stop(iedServer);
IedServer_destroy(iedServer);
IedModel_destroy(model);
} /* main() */