123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #include "MyIec61850Server.h"
- static int running = 0;
- void sigint_handler(int signalId) {
- running = 0;
- }
- using namespace MyIec61850;
- MyIec61850Server::MyIec61850Server(int port) : port(port), iedServer(nullptr), model(nullptr),
- lDevice1(nullptr), lln0(nullptr), ttmp1(nullptr),
- temperatureValue(nullptr), temperatureTimestamp(nullptr),
- hhum1(nullptr), humidityValue(nullptr), humidityTimestamp(nullptr),
- dataSet(nullptr) {
- setupDataModel();
- }
- MyIec61850Server::~MyIec61850Server() {
- stop();
- if (model) {
- IedModel_destroy(model);
- }
- }
- void MyIec61850Server::setupDataModel() {
- model = IedModel_create("TemperatureHumiditySensor");
- lDevice1 = LogicalDevice_create("SENSORS", model);
- lln0 = LogicalNode_create("LLN0", lDevice1);
- /* Create a Temperature Sensor LN */
- ttmp1 = LogicalNode_create("TTMP1", lDevice1);
- DataObject* ttmp1_tmpsv = CDC_SAV_create("TmpSv", (ModelNode*) ttmp1, 0, false);
- temperatureValue = (DataAttribute*) ModelNode_getChild((ModelNode*) ttmp1_tmpsv, "instMag.f");
- temperatureTimestamp = (DataAttribute*) ModelNode_getChild((ModelNode*) ttmp1_tmpsv, "t");
- /* Create a Humidity Sensor LN */
- hhum1 = LogicalNode_create("HHUM1", lDevice1);
- DataObject* hhum1_humsv = CDC_SAV_create("HumSv", (ModelNode*) hhum1, 0, false);
- humidityValue = (DataAttribute*) ModelNode_getChild((ModelNode*) hhum1_humsv, "instMag.f");
- humidityTimestamp = (DataAttribute*) ModelNode_getChild((ModelNode*) hhum1_humsv, "t");
- /* Create DataSet for reporting */
- dataSet = DataSet_create("sensorData", lln0);
- DataSetEntry_create(dataSet, "TTMP1$MX$TmpSv$instMag$f", -1, NULL);
- DataSetEntry_create(dataSet, "HHUM1$MX$HumSv$instMag$f", -1, NULL);
- /* Create Report Control Block */
- uint8_t rptOptions = RPT_OPT_SEQ_NUM | RPT_OPT_TIME_STAMP | RPT_OPT_REASON_FOR_INCLUSION;
- ReportControlBlock_create("sensorReport", lln0, "sensorReport", false, NULL, 1, TRG_OPT_DATA_CHANGED, rptOptions, 50, 0);
- }
- void MyIec61850Server::start() {
- iedServer = IedServer_create(model); // 确保使用 sIedServer*
- /* MMS server will be instructed to start listening to client connections. */
- IedServer_start(iedServer, port);
- if (!IedServer_isRunning(iedServer)) { // 使用 IedServer_isRunning 检查服务器状态
- printf("Starting server failed! Exit.\n");
- stop();
- exit(-1);
- }
- }
- void MyIec61850Server::stop() {
- if (iedServer != nullptr) {
- IedServer_stop(iedServer);
- IedServer_destroy(iedServer); // 传递 sIedServer* 类型的参数
- iedServer = nullptr; // 手动将指针置为 nullptr
- }
- }
- void MyIec61850Server::run() {
- running = 1;
- signal(SIGINT, sigint_handler);
- float temperature = 25.0f; // Initial temperature value
- float humidity = 50.0f; // Initial humidity value
- while (running) {
- IedServer_lockDataModel(iedServer);
- /* Update temperature and humidity values */
- IedServer_updateUTCTimeAttributeValue(iedServer, temperatureTimestamp, Hal_getTimeInMs());
- IedServer_updateFloatAttributeValue(iedServer, temperatureValue, temperature);
- IedServer_updateUTCTimeAttributeValue(iedServer, humidityTimestamp, Hal_getTimeInMs());
- IedServer_updateFloatAttributeValue(iedServer, humidityValue, humidity);
- IedServer_unlockDataModel(iedServer);
- /* Simulate periodic updates */
- temperature += 0.1f;
- humidity += 0.1f;
- Thread_sleep(1000); // Sleep for 1 second
- }
- }
|