Advertisement
Guest User

Untitled

a guest
Feb 21st, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.54 KB | None | 0 0
  1. /*
  2.  *  server_example3.c
  3.  *
  4.  *  - How to use simple control models
  5.  *  - How to serve analog measurement data
  6.  */
  7.  
  8. #include "iec61850_server.h"
  9. #include "hal_thread.h"
  10. #include <signal.h>
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include <math.h>
  14.  
  15. #include "static_model.h"
  16.  
  17. /* import IEC 61850 device model created from SCL-File */
  18. extern IedModel iedModel;
  19.  
  20. static int running = 0;
  21. static IedServer iedServer = NULL;
  22.  
  23. void
  24. sigint_handler(int signalId)
  25. {
  26.     running = 0;
  27. }
  28.  
  29. static ControlHandlerResult
  30. controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test)
  31. {
  32.     if (test)
  33.         return CONTROL_RESULT_FAILED;
  34.  
  35.     if (MmsValue_getType(value) == MMS_BOOLEAN) {
  36.         printf("received binary control command: ");
  37.  
  38.         if (MmsValue_getBoolean(value))
  39.             printf("on\n");
  40.         else
  41.             printf("off\n");
  42.     }
  43.     else
  44.         return CONTROL_RESULT_FAILED;
  45.  
  46.     uint64_t timeStamp = Hal_getTimeInMs();
  47.  
  48.     if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) {
  49.         IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp);
  50.         IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value);
  51.     }
  52.  
  53.     if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) {
  54.         IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp);
  55.         IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value);
  56.     }
  57.  
  58.     if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) {
  59.         IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp);
  60.         IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value);
  61.     }
  62.  
  63.     if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) {
  64.         IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp);
  65.         IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value);
  66.     }
  67.  
  68.     return CONTROL_RESULT_OK;
  69. }
  70.  
  71.  
  72. static void
  73. connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter)
  74. {
  75.     if (connected)
  76.         printf("Connection opened\n");
  77.     else
  78.         printf("Connection closed\n");
  79. }
  80.  
  81. int
  82. main(int argc, char** argv)
  83. {
  84.  
  85.     int tcpPort = 102;
  86.  
  87.     if (argc > 1) {
  88.         tcpPort = atoi(argv[1]);
  89.     }
  90.    
  91.     printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString());
  92.  
  93.     iedServer = IedServer_create(&iedModel);
  94.  
  95.     /* Install handler for operate command */
  96.     IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1,
  97.             (ControlHandler) controlHandlerForBinaryOutput,
  98.             IEDMODEL_GenericIO_GGIO1_SPCSO1);
  99.  
  100.     IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2,
  101.             (ControlHandler) controlHandlerForBinaryOutput,
  102.             IEDMODEL_GenericIO_GGIO1_SPCSO2);
  103.  
  104.     IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3,
  105.             (ControlHandler) controlHandlerForBinaryOutput,
  106.             IEDMODEL_GenericIO_GGIO1_SPCSO3);
  107.  
  108.     IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4,
  109.             (ControlHandler) controlHandlerForBinaryOutput,
  110.             IEDMODEL_GenericIO_GGIO1_SPCSO4);
  111.  
  112.     IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL);
  113.  
  114.     /* MMS server will be instructed to start listening to client connections. */
  115.     IedServer_start(iedServer, 102);
  116.  
  117.     if (!IedServer_isRunning(iedServer)) {
  118.         printf("Starting server failed! Exit.\n");
  119.         IedServer_destroy(iedServer);
  120.         exit(-1);
  121.     }
  122.  
  123.     running = 1;
  124.  
  125.     signal(SIGINT, sigint_handler);
  126.  
  127.     float t = 0.f;
  128.  
  129.     while (running) {
  130.         uint64_t timestamp = Hal_getTimeInMs();
  131.  
  132.         t += 0.1f;
  133.  
  134.         float an1 = sinf(t);
  135.         float an2 = sinf(t + 1.f);
  136.         float an3 = sinf(t + 2.f);
  137.         float an4 = sinf(t + 3.f);
  138.  
  139.         IedServer_lockDataModel(iedServer);
  140.  
  141.         Timestamp iecTimestamp;
  142.  
  143.         Timestamp_clearFlags(&iecTimestamp);
  144.         Timestamp_setTimeInMilliseconds(&iecTimestamp, timestamp);
  145.         Timestamp_setLeapSecondKnown(&iecTimestamp, true);
  146.  
  147.         /* toggle clock-not-synchronized flag in timestamp */
  148.         if (((int) t % 2) == 0)
  149.             Timestamp_setClockNotSynchronized(&iecTimestamp, true);
  150.  
  151.         IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, &iecTimestamp);
  152.         IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1);
  153.  
  154.         IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, &iecTimestamp);
  155.         IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2);
  156.  
  157.         IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, &iecTimestamp);
  158.         IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3);
  159.  
  160.         IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, &iecTimestamp);
  161.         IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4);
  162.  
  163.         IedServer_unlockDataModel(iedServer);
  164.  
  165.         Thread_sleep(100);
  166.     }
  167.  
  168.     /* stop MMS server - close TCP server socket and all client sockets */
  169.     IedServer_stop(iedServer);
  170.  
  171.     /* Cleanup - free all resources */
  172.     IedServer_destroy(iedServer);
  173.  
  174. } /* main() */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement