From 6c9b8e90b1d2cd5ebe36bbd676b033eeee7ede0b Mon Sep 17 00:00:00 2001 From: ypc <15051963820@163.com> Date: Thu, 11 Jun 2026 17:30:55 +0800 Subject: [PATCH] =?UTF-8?q?<=E4=BF=AE=E6=94=B9>=201=E3=80=81=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=95=B0=E6=8D=AE=E4=B8=AD=E5=BF=83=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E5=8F=82=E6=95=B0=E4=BF=AE=E6=94=B9=E5=90=8E=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E5=9C=A8=E4=B8=8A=E4=BD=8D=E6=9C=BA=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E5=88=B0=EF=BC=9B2=E3=80=81=E5=9C=A8=E4=B8=8A=E4=BD=8D?= =?UTF-8?q?=E6=9C=BA=E4=BF=AE=E6=94=B9=E5=AE=9A=E5=80=BC=E5=8C=BA=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E8=AE=BE=E7=BD=AE=E5=8F=82=E6=95=B0=E5=80=BC=E6=94=BE?= =?UTF-8?q?=E5=88=B0=E5=9B=9E=E8=B0=83=E5=A4=96=E9=9D=A2=EF=BC=8C=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E4=B8=AD=E6=9C=89IedServer=5FlockDataModel=EF=BC=8C?= =?UTF-8?q?=E4=BC=B0=E8=AE=A1=E4=BC=9A=E5=BD=B1=E5=93=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/protocol/libmms_s/src/mms_s.cpp | 4 ++-- src/system/libdatacenter/src/dc_signal.cpp | 20 ++++++++++++++++ src/system/libiec61850s/src/iec61850s.cpp | 28 +++++++++++++++++----- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/protocol/libmms_s/src/mms_s.cpp b/src/protocol/libmms_s/src/mms_s.cpp index 8be8b88..5f1eaeb 100644 --- a/src/protocol/libmms_s/src/mms_s.cpp +++ b/src/protocol/libmms_s/src/mms_s.cpp @@ -217,9 +217,9 @@ LOCAL void *mms_s_run_task(void *parameter) IedModel *iedModel = (IedModel *)parameter; while(g_running) { - IedServer_lockDataModel(gp_iedServer); + // IedServer_lockDataModel(gp_iedServer); - IedServer_unlockDataModel(gp_iedServer); + // IedServer_unlockDataModel(gp_iedServer); Thread_sleep(100); diff --git a/src/system/libdatacenter/src/dc_signal.cpp b/src/system/libdatacenter/src/dc_signal.cpp index a0236f3..da3bcfb 100644 --- a/src/system/libdatacenter/src/dc_signal.cpp +++ b/src/system/libdatacenter/src/dc_signal.cpp @@ -1273,6 +1273,16 @@ int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_ty dc_set_signal_val(p_signal->vec_p_data[0], data_type, p_data); dc_set_param_cfg_change(true); + + for(auto &entry : p_signal->change_cb_list) + { + if(entry.second) + { + if (entry.first == module_id) continue; + entry.second(saddr, SIGNAL_CTRL_STEP::DIRECT, data_type, 0, p_data); + } + } + return 0; } else @@ -1497,6 +1507,16 @@ int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data } dc_set_signal_val(p_signal->vec_p_data[setting_zone], data_type, p_data); dc_set_param_cfg_change(true); + + for(auto &entry : p_signal->change_cb_list) + { + if(entry.second != nullptr) + { + if (entry.first == module_id) continue; + entry.second(saddr, SIGNAL_CTRL_STEP::DIRECT, data_type, setting_zone, p_data); + } + } + return 0; } diff --git a/src/system/libiec61850s/src/iec61850s.cpp b/src/system/libiec61850s/src/iec61850s.cpp index 14f9237..135dae9 100644 --- a/src/system/libiec61850s/src/iec61850s.cpp +++ b/src/system/libiec61850s/src/iec61850s.cpp @@ -30,6 +30,24 @@ LOCAL std::vector g_vec_setting = {}; LOCAL std::vector g_vec_param = {}; LOCAL mms_s_value_update_cb g_mms_s_value_update_cb = NULL; +LOCAL std::string g_sg_zone_saddr = ""; +LOCAL std::string g_sg_zone_act_sg = ""; + +LOCAL void check_sg_zone_change() +{ + if(g_sg_zone_saddr.empty() || g_sg_zone_act_sg.empty()) + { + return; + } + + if(g_mms_s_value_update_cb != NULL) + { + g_mms_s_value_update_cb(g_sg_zone_saddr.c_str(), g_sg_zone_act_sg.c_str()); + } + + g_sg_zone_saddr = ""; + g_sg_zone_act_sg = ""; +} LOCAL void iec61850s_sg_change_callback(const char *zone_saddr, int new_act_sg) { @@ -62,12 +80,9 @@ LOCAL void iec61850s_sg_change_callback(const char *zone_saddr, int new_act_sg) return; } - // /* 同步更新 MMS 服务端模型,使 IEDScout 等客户端能读到最新值 */ - // std::string val_str = dc_get_signal_val(p_val, setting.base.type); - // if(g_mms_s_value_update_cb != NULL) - // { - // g_mms_s_value_update_cb(zone_saddr, val_str.c_str()); - // } + /* 同步更新 MMS 服务端模型,使 IEDScout 等客户端能读到最新值 */ + g_sg_zone_saddr = zone_saddr; + g_sg_zone_act_sg = dc_get_signal_val((void *)&new_act_sg, setting.base.type); break; } @@ -552,6 +567,7 @@ void *app_iec61850s(void *arg) if(event & EV_TIMER3) { + check_sg_zone_change(); p_app->run_cnt++; } }