Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * server_example3.c
- *
- * - How to use simple control models
- * - How to serve analog measurement data
- */
- #include "iec61850_server.h"
- #include "hal_thread.h"
- #include <signal.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <math.h>
- #include "static_model.h"
- /* import IEC 61850 device model created from SCL-File */
- extern IedModel iedModel;
- static int running = 0;
- static IedServer iedServer = NULL;
- void
- sigint_handler(int signalId)
- {
- running = 0;
- }
- static ControlHandlerResult
- controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test)
- {
- if (test)
- return CONTROL_RESULT_FAILED;
- if (MmsValue_getType(value) == MMS_BOOLEAN) {
- printf("received binary control command: ");
- if (MmsValue_getBoolean(value))
- printf("on\n");
- else
- printf("off\n");
- }
- else
- return CONTROL_RESULT_FAILED;
- uint64_t timeStamp = Hal_getTimeInMs();
- if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) {
- IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp);
- IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value);
- }
- if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) {
- IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp);
- IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value);
- }
- if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) {
- IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp);
- IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value);
- }
- if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) {
- IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp);
- IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value);
- }
- return CONTROL_RESULT_OK;
- }
- static void
- connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter)
- {
- if (connected)
- printf("Connection opened\n");
- else
- printf("Connection closed\n");
- }
- int
- main(int argc, char** argv)
- {
- int tcpPort = 102;
- if (argc > 1) {
- tcpPort = atoi(argv[1]);
- }
- printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString());
- iedServer = IedServer_create(&iedModel);
- /* Install handler for operate command */
- IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1,
- (ControlHandler) controlHandlerForBinaryOutput,
- IEDMODEL_GenericIO_GGIO1_SPCSO1);
- IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2,
- (ControlHandler) controlHandlerForBinaryOutput,
- IEDMODEL_GenericIO_GGIO1_SPCSO2);
- IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3,
- (ControlHandler) controlHandlerForBinaryOutput,
- IEDMODEL_GenericIO_GGIO1_SPCSO3);
- IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4,
- (ControlHandler) controlHandlerForBinaryOutput,
- IEDMODEL_GenericIO_GGIO1_SPCSO4);
- IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL);
- /* MMS server will be instructed to start listening to client connections. */
- IedServer_start(iedServer, 102);
- if (!IedServer_isRunning(iedServer)) {
- printf("Starting server failed! Exit.\n");
- IedServer_destroy(iedServer);
- exit(-1);
- }
- running = 1;
- signal(SIGINT, sigint_handler);
- float t = 0.f;
- while (running) {
- uint64_t timestamp = Hal_getTimeInMs();
- t += 0.1f;
- float an1 = sinf(t);
- float an2 = sinf(t + 1.f);
- float an3 = sinf(t + 2.f);
- float an4 = sinf(t + 3.f);
- IedServer_lockDataModel(iedServer);
- Timestamp iecTimestamp;
- Timestamp_clearFlags(&iecTimestamp);
- Timestamp_setTimeInMilliseconds(&iecTimestamp, timestamp);
- Timestamp_setLeapSecondKnown(&iecTimestamp, true);
- /* toggle clock-not-synchronized flag in timestamp */
- if (((int) t % 2) == 0)
- Timestamp_setClockNotSynchronized(&iecTimestamp, true);
- IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, &iecTimestamp);
- IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1);
- IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, &iecTimestamp);
- IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2);
- IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, &iecTimestamp);
- IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3);
- IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, &iecTimestamp);
- IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4);
- IedServer_unlockDataModel(iedServer);
- Thread_sleep(100);
- }
- /* stop MMS server - close TCP server socket and all client sockets */
- IedServer_stop(iedServer);
- /* Cleanup - free all resources */
- IedServer_destroy(iedServer);
- } /* main() */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement