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++; } }