MyIec61850Server.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "MyIec61850Server.h"
  2. static int running = 0;
  3. void sigint_handler(int signalId) {
  4. running = 0;
  5. }
  6. using namespace MyIec61850;
  7. MyIec61850Server::MyIec61850Server(int port) : port(port), iedServer(nullptr), model(nullptr),
  8. lDevice1(nullptr), lln0(nullptr), ttmp1(nullptr),
  9. temperatureValue(nullptr), temperatureTimestamp(nullptr),
  10. hhum1(nullptr), humidityValue(nullptr), humidityTimestamp(nullptr),
  11. dataSet(nullptr) {
  12. setupDataModel();
  13. }
  14. MyIec61850Server::~MyIec61850Server() {
  15. stop();
  16. if (model) {
  17. IedModel_destroy(model);
  18. }
  19. }
  20. void MyIec61850Server::setupDataModel() {
  21. model = IedModel_create("TemperatureHumiditySensor");
  22. lDevice1 = LogicalDevice_create("SENSORS", model);
  23. lln0 = LogicalNode_create("LLN0", lDevice1);
  24. /* Create a Temperature Sensor LN */
  25. ttmp1 = LogicalNode_create("TTMP1", lDevice1);
  26. DataObject* ttmp1_tmpsv = CDC_SAV_create("TmpSv", (ModelNode*) ttmp1, 0, false);
  27. temperatureValue = (DataAttribute*) ModelNode_getChild((ModelNode*) ttmp1_tmpsv, "instMag.f");
  28. temperatureTimestamp = (DataAttribute*) ModelNode_getChild((ModelNode*) ttmp1_tmpsv, "t");
  29. /* Create a Humidity Sensor LN */
  30. hhum1 = LogicalNode_create("HHUM1", lDevice1);
  31. DataObject* hhum1_humsv = CDC_SAV_create("HumSv", (ModelNode*) hhum1, 0, false);
  32. humidityValue = (DataAttribute*) ModelNode_getChild((ModelNode*) hhum1_humsv, "instMag.f");
  33. humidityTimestamp = (DataAttribute*) ModelNode_getChild((ModelNode*) hhum1_humsv, "t");
  34. /* Create DataSet for reporting */
  35. dataSet = DataSet_create("sensorData", lln0);
  36. DataSetEntry_create(dataSet, "TTMP1$MX$TmpSv$instMag$f", -1, NULL);
  37. DataSetEntry_create(dataSet, "HHUM1$MX$HumSv$instMag$f", -1, NULL);
  38. /* Create Report Control Block */
  39. uint8_t rptOptions = RPT_OPT_SEQ_NUM | RPT_OPT_TIME_STAMP | RPT_OPT_REASON_FOR_INCLUSION;
  40. ReportControlBlock_create("sensorReport", lln0, "sensorReport", false, NULL, 1, TRG_OPT_DATA_CHANGED, rptOptions, 50, 0);
  41. }
  42. void MyIec61850Server::start() {
  43. iedServer = IedServer_create(model); // 确保使用 sIedServer*
  44. /* MMS server will be instructed to start listening to client connections. */
  45. IedServer_start(iedServer, port);
  46. if (!IedServer_isRunning(iedServer)) { // 使用 IedServer_isRunning 检查服务器状态
  47. printf("Starting server failed! Exit.\n");
  48. stop();
  49. exit(-1);
  50. }
  51. }
  52. void MyIec61850Server::stop() {
  53. if (iedServer != nullptr) {
  54. IedServer_stop(iedServer);
  55. IedServer_destroy(iedServer); // 传递 sIedServer* 类型的参数
  56. iedServer = nullptr; // 手动将指针置为 nullptr
  57. }
  58. }
  59. void MyIec61850Server::run() {
  60. running = 1;
  61. signal(SIGINT, sigint_handler);
  62. float temperature = 25.0f; // Initial temperature value
  63. float humidity = 50.0f; // Initial humidity value
  64. while (running) {
  65. IedServer_lockDataModel(iedServer);
  66. /* Update temperature and humidity values */
  67. IedServer_updateUTCTimeAttributeValue(iedServer, temperatureTimestamp, Hal_getTimeInMs());
  68. IedServer_updateFloatAttributeValue(iedServer, temperatureValue, temperature);
  69. IedServer_updateUTCTimeAttributeValue(iedServer, humidityTimestamp, Hal_getTimeInMs());
  70. IedServer_updateFloatAttributeValue(iedServer, humidityValue, humidity);
  71. IedServer_unlockDataModel(iedServer);
  72. /* Simulate periodic updates */
  73. temperature += 0.1f;
  74. humidity += 0.1f;
  75. Thread_sleep(1000); // Sleep for 1 second
  76. }
  77. }