From 3806a32af9a05eb514661888c16659594e5cfc23 Mon Sep 17 00:00:00 2001 From: ypc <15051963820@163.com> Date: Thu, 11 Jun 2026 16:40:07 +0800 Subject: [PATCH] =?UTF-8?q?<=E4=BF=AE=E6=94=B9>=201=E3=80=81=E7=BB=99?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=AD=E5=BF=83=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=8A=A0=E4=B8=8Amodule=5Fid=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E7=B1=BB=E5=9E=8B=E5=91=BD=E4=BB=A4=E8=87=AA?= =?UTF-8?q?=E9=94=81=EF=BC=9B2=E3=80=81iec61850s=E4=B8=AD=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=8E=A5=E5=8F=A3=E6=B3=A8=E5=86=8C=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E4=B8=8E=E5=AE=9A=E5=80=BC=E5=8C=BA=EF=BC=8C?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=AE=9A=E5=80=BC=E5=8C=BA=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E8=83=BD=E7=9B=B8=E5=BA=94=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/tasks.json | 24 +++++- release/inc/myDatacenter.h | 30 +++---- release/inc/myMms_m.h | 2 +- release/inc/myMms_s.h | 17 ++++ src/protocol/libmms_m/src/mms_m.cpp | 4 +- src/protocol/libmms_s/src/mms_s_param.cpp | 41 ++++++++-- src/system/RTU/src/app_cmd.cpp | 4 +- src/system/libdatacenter/inc/dc_param.h | 2 + src/system/libdatacenter/inc/dc_signal.h | 5 +- src/system/libdatacenter/src/dc_param.cpp | 4 +- src/system/libdatacenter/src/dc_signal.cpp | 89 +++++++++++--------- src/system/libiec/inc/iec_point.h | 2 + src/system/libiec/src/iec_point.cpp | 6 +- src/system/libiec61850m/inc/iec61850m.h | 2 + src/system/libiec61850m/src/iec61850m.cpp | 47 +++++++++-- src/system/libiec61850s/inc/iec61850s.h | 4 +- src/system/libiec61850s/src/iec61850s.cpp | 95 +++++++++++++++++++--- src/system/libself_ptl/inc/self_ptl.h | 2 + src/system/libself_ptl/src/method.cpp | 10 +-- src/system/libself_ptl/src/self_ptl.cpp | 6 +- src/system/libweb_server/inc/ws_method.h | 2 + src/system/libweb_server/src/ws_method.cpp | 20 ++--- 22 files changed, 306 insertions(+), 112 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index a9839f2..f4ce3e0 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,11 +5,33 @@ "label": "run-build-script", "type": "shell", "command": "${workspaceFolder}/release/build.sh", - "problemMatcher": ["$gcc"], + "problemMatcher": [ + "$gcc" + ], "group": { "kind": "build", "isDefault": true } + }, + { + "type": "cppbuild", + "label": "C/C++: aarch64-linux-gnu-g++ 生成活动文件", + "command": "/usr/bin/aarch64-linux-gnu-g++", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}/${fileBasenameNoExtension}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": "build", + "detail": "编译器: /usr/bin/aarch64-linux-gnu-g++" } ] } \ No newline at end of file diff --git a/release/inc/myDatacenter.h b/release/inc/myDatacenter.h index cdc337c..c6297ab 100644 --- a/release/inc/myDatacenter.h +++ b/release/inc/myDatacenter.h @@ -57,42 +57,42 @@ void datacenter_run_1000ms(); // 数据中心out信号注册接口 int dc_signal_out(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data); -int dc_signal_out_with_callback(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data, out_signal_change_cb cb); +int dc_signal_out_with_callback(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data, out_signal_change_cb cb, const std::string &module_id); -int dc_signal_out_link_with_callback(const std::string &saddr, void **p_data, out_signal_change_cb cb); +int dc_signal_out_link_with_callback(const std::string &saddr, void **p_data, out_signal_change_cb cb, const std::string &module_id); // 数据中心in信号注册并链接out信号接口 int dc_signal_in(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data); -int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data, out_signal_change_cb cb); +int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data, out_signal_change_cb cb, const std::string &module_id); -int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb); +int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb, const std::string &module_id); -int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb); +int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb, const std::string &module_id); -int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data); +int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data, const std::string &module_id); -int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data); +int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data, const std::string &module_id); // 数据中心参数信号注册接口 -int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, void **p_default_data, int num, signal_change_cb cb); +int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, void **p_default_data, int num, signal_change_cb cb, const std::string &module_id); // 数据中心参数链接信号接口 -int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, int num, signal_change_cb cb); +int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, int num, signal_change_cb cb, const std::string &module_id); // 数据中心参数设置接口 -int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, uint8_t setting_zone, void *p_data); +int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, uint8_t setting_zone, void *p_data, const std::string &module_id); -int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, uint8_t setting_zone, void *p_data); +int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, uint8_t setting_zone, void *p_data, const std::string &module_id); // 数据中心遥控信号注册接口 -int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb); +int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb, const std::string &module_id); // 数据中心遥控信号链接接口 -int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb); +int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb, const std::string &module_id); // 数据中心遥控控制接口(校验前置,调用前需先调 dc_yk_ctrl_valid) -int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data); +int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data, const std::string &module_id); // 数据中心获取out信号信息接口 int dc_get_out_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, void **p_data); @@ -112,7 +112,7 @@ int dc_get_yk_signal_info(const std::string &saddr, std::string &desc, uint8_t & std::string dc_get_signal_val(void *p_data, uint8_t data_type); // 数据中心设置信号值字符串接口 -int dc_set_out_signal_val(const std::string &saddr, void *set_data); +int dc_set_out_signal_val(const std::string &saddr, void *set_data, const std::string &module_id); // 数据中心根据数据类型创建数据指针接口 void *dc_create_data_ptr_by_type(uint8_t data_type); diff --git a/release/inc/myMms_m.h b/release/inc/myMms_m.h index e77d670..da45c5a 100644 --- a/release/inc/myMms_m.h +++ b/release/inc/myMms_m.h @@ -76,7 +76,7 @@ typedef struct int app_fd; int reason; int type; - int quality; + uint32_t quality; MMS_STR name; MMS_STR desc; MMS_REF reference; diff --git a/release/inc/myMms_s.h b/release/inc/myMms_s.h index 3aab684..ab513ff 100644 --- a/release/inc/myMms_s.h +++ b/release/inc/myMms_s.h @@ -200,6 +200,23 @@ int mms_s_param_register(stru_mms_s_param *p_param, uint16_t num, mms_s_param_cb */ int mms_s_file_path_set(const char* file_path); +/** + * 定值组激活切换回调 + * @param zone_saddr 绑定的定值区指示信号短地址 + * @param new_act_sg 新的激活定值组号(1-based) + */ +typedef void (*mms_s_sg_change_cb)(const char *zone_saddr, int new_act_sg); + +/** + * 绑定表示定值区号的信号,并注册定值组切换回调 + * 当定值组激活切换时(如 IEDScout 的 Activate selected SG), + * 通过 cb 通知上层更新 datacenter 中对应的信号值 + * @param zone_saddr 定值区指示信号的短地址(如 "ao.0") + * @param cb 定值组切换回调函数 + * @return 0 成功,-1 失败 + */ +int mms_s_bind_param_zone_signal(const char *zone_saddr, mms_s_sg_change_cb cb); + #ifdef __cplusplus } diff --git a/src/protocol/libmms_m/src/mms_m.cpp b/src/protocol/libmms_m/src/mms_m.cpp index 41529d2..532eed9 100644 --- a/src/protocol/libmms_m/src/mms_m.cpp +++ b/src/protocol/libmms_m/src/mms_m.cpp @@ -1070,8 +1070,8 @@ static int mms_m_get_MmsValue(stru_point_value &point_value, stru_mms_m_out_valu tm_flag = 1; break; case MMS_BIT_STRING: - out_val.type = MMS_BIT_STRING; - *(uint32_t *)p_val = MmsValue_getBitStringAsIntegerBigEndian(p_mms_values); + // out_val.type = MMS_BIT_STRING; + out_val.quality = MmsValue_getBitStringAsIntegerBigEndian(p_mms_values); break; default: break; diff --git a/src/protocol/libmms_s/src/mms_s_param.cpp b/src/protocol/libmms_s/src/mms_s_param.cpp index 0e0ac75..0419cda 100644 --- a/src/protocol/libmms_s/src/mms_s_param.cpp +++ b/src/protocol/libmms_s/src/mms_s_param.cpp @@ -30,6 +30,9 @@ LOCAL std::vector g_vec_params; LOCAL mms_s_param_cb g_param_cb = NULL; +LOCAL char g_zone_saddr[MMS_S_STR_LEN] = {0}; +LOCAL mms_s_sg_change_cb g_sg_change_cb = NULL; + /** 更新 BOOLEAN 类型属性值 */ void param_update_BOOLEAN(IedServer server, DataAttribute* dataAttribute, std::string val) { @@ -202,7 +205,6 @@ LOCAL void param_load_edit_sg_values(stru_LDevice &ld, int editSG) return; } - for(std::vector::iterator it_param = g_vec_params.begin(); it_param != g_vec_params.end(); it_param++) { std::string saddr = std::string(it_param->base.saddr) + "_SE"; @@ -271,6 +273,11 @@ LOCAL bool param_active_sg_changed_handler(void* parameter, SettingGroupControlB param_load_active_sg_values(*p_ld, newActSg); + if(strlen(g_zone_saddr) > 0 && g_sg_change_cb != NULL) + { + g_sg_change_cb(g_zone_saddr, newActSg); + } + return true; } @@ -547,9 +554,10 @@ LOCAL void param_get_FLOAT(DataAttribute *node_SE, DataAttribute *node_SG, std:: float gap = floatVal - min; if(fabs(step) > EPSILON) { - float gap_mod = fmod(gap, step); - - if(fabs(gap_mod) > EPSILON && fabs(gap_mod - step) > EPSILON) + float steps = roundf(gap / step); + float expected = min + steps * step; + float stepEpsilon = fmax(1e-5f, step * 1e-4f); + if(fabs(floatVal - expected) > stepEpsilon) { LOG_E("Value %f does not conform to step size %f", floatVal, step); return; @@ -670,7 +678,7 @@ LOCAL void edit_sg_confirmation_handler(void* parameter, SettingGroupControlBloc { g_param_get_funcs[i].get_value((DataAttribute *)node_se, (DataAttribute *)node_sg, val); - if(g_param_cb != NULL) + if(!val.empty() && g_param_cb != NULL) { g_param_cb(&*it_param, val.c_str(), editSg - 1); } @@ -796,5 +804,28 @@ int param_init(IedServer server, stru_icd &icd) } + return 0; +} + +/** + * 绑定表示定值区号的信号,并注册定值组切换回调 + * 当定值组激活切换时,通过 cb 通知上层更新 datacenter 中对应的信号值 + * @param zone_saddr 定值区指示信号的短地址(如 "ao.0") + * @param cb 定值组切换回调函数 + * @return 0 成功,-1 失败 + */ +int mms_s_bind_param_zone_signal(const char *zone_saddr, mms_s_sg_change_cb cb) +{ + if(NULL == zone_saddr || strlen(zone_saddr) == 0) + { + LOG_E("zone_saddr is NULL or empty"); + return -1; + } + + strncpy(g_zone_saddr, zone_saddr, MMS_S_STR_LEN - 1); + g_zone_saddr[MMS_S_STR_LEN - 1] = '\0'; + g_sg_change_cb = cb; + + LOG_I("bind zone signal %s", zone_saddr); return 0; } \ No newline at end of file diff --git a/src/system/RTU/src/app_cmd.cpp b/src/system/RTU/src/app_cmd.cpp index 5285e8c..e831df4 100644 --- a/src/system/RTU/src/app_cmd.cpp +++ b/src/system/RTU/src/app_cmd.cpp @@ -82,7 +82,7 @@ LOCAL void cmd_recv() int app_cmd_init1(void *arg) { - lineniseSetCompletionCallback(cmd_complete); + // lineniseSetCompletionCallback(cmd_complete); return 0; } @@ -114,7 +114,7 @@ void *app_cmd(void *arg) if(event & EV_TIMER1) { - cmd_recv(); + // cmd_recv(); } if(event & EV_TIMER2) diff --git a/src/system/libdatacenter/inc/dc_param.h b/src/system/libdatacenter/inc/dc_param.h index 74fa7f3..b0175bb 100644 --- a/src/system/libdatacenter/inc/dc_param.h +++ b/src/system/libdatacenter/inc/dc_param.h @@ -4,6 +4,8 @@ #include "dc_signal.h" #include "myDatacenter.h" +#define MODULE_DATACENTER "datacenter" + #include diff --git a/src/system/libdatacenter/inc/dc_signal.h b/src/system/libdatacenter/inc/dc_signal.h index 457d5f0..ffc8bb8 100644 --- a/src/system/libdatacenter/inc/dc_signal.h +++ b/src/system/libdatacenter/inc/dc_signal.h @@ -27,8 +27,9 @@ typedef struct stru_signal std::unordered_set link_set; // O(1) 查重 uint8_t ctrl_type; // 信号控制类型 stru_signal_param param; // 信号参数信息 - std::vector out_change_cb_list; // 输出类型信号变化回调函数列表 - std::vector change_cb_list; // 参数类型信号变化回调函数列表 + std::vector> out_change_cb_list; // + std::vector> change_cb_list; // + std::string last_caller_module; // 上次修改本信号的模块ID(用于out信号回调回路阻断) }stru_signal; diff --git a/src/system/libdatacenter/src/dc_param.cpp b/src/system/libdatacenter/src/dc_param.cpp index c733bb2..d573753 100644 --- a/src/system/libdatacenter/src/dc_param.cpp +++ b/src/system/libdatacenter/src/dc_param.cpp @@ -223,7 +223,7 @@ static int dc_param_register_signals(const std::string ¶m_path, { dc_signal_ao(saddr, desc, data_type, SIGNAL_CTRL_TYPE::SBO_NORMAL, - p_data, p_default_data, nullptr); + p_data, p_default_data, nullptr, MODULE_DATACENTER); } } } @@ -296,7 +296,7 @@ static int dc_param_register_signals(const std::string ¶m_path, { dc_signal_param(saddr, desc, data_type, SIGNAL_CTRL_TYPE::SBO_NORMAL, - vec_p_data.data(), vec_p_default_data.data(), num, nullptr); + vec_p_data.data(), vec_p_default_data.data(), num, nullptr, MODULE_DATACENTER); } } } diff --git a/src/system/libdatacenter/src/dc_signal.cpp b/src/system/libdatacenter/src/dc_signal.cpp index 0320fa7..a0236f3 100644 --- a/src/system/libdatacenter/src/dc_signal.cpp +++ b/src/system/libdatacenter/src/dc_signal.cpp @@ -302,8 +302,10 @@ void dc_signal_out_change_check() if (0 != dc_data_compare(p_signal->data_type, p_signal->vec_p_data[0], p_signal->p_last_data)) { - for (auto cb : p_signal->out_change_cb_list) { - cb(p_signal->saddr, p_signal->data_type, + for (auto &entry : p_signal->out_change_cb_list) { + // 回路阻断:修改本信号的模块不回调自身 + if (entry.first == p_signal->last_caller_module) continue; + entry.second(p_signal->saddr, p_signal->data_type, p_signal->vec_p_data[0], p_signal->p_last_data); } dc_set_signal_val(p_signal->p_last_data, @@ -454,7 +456,7 @@ LOCAL bool dc_signal_param_add_check(stru_signal *p_signal, const std::string &d { if(0 != dc_data_compare(p_signal->data_type, p_default_data[i], p_signal->vec_p_default_data[i])) { - printf(" zone %d: val=%s def=%s, %p, %p\n", i+1, dc_get_signal_val(p_signal->vec_p_data[i], p_signal->data_type).c_str(), dc_get_signal_val(p_signal->vec_p_default_data[i], p_signal->data_type).c_str(), p_signal->vec_p_data[i], p_signal->vec_p_default_data[i]); + // printf(" zone %d: val=%s def=%s, %p, %p\n", i+1, dc_get_signal_val(p_signal->vec_p_data[i], p_signal->data_type).c_str(), dc_get_signal_val(p_signal->vec_p_default_data[i], p_signal->data_type).c_str(), p_signal->vec_p_data[i], p_signal->vec_p_default_data[i]); change = true; } } @@ -927,7 +929,7 @@ int dc_signal_out(const std::string &saddr, const std::string &desc, uint8_t dat return dc_signal_add_to_map(signal, g_datacenter.signal_out); } -int dc_signal_out_with_callback(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data, out_signal_change_cb cb) +int dc_signal_out_with_callback(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data, out_signal_change_cb cb, const std::string &module_id) { if(nullptr == p_data) { @@ -957,13 +959,13 @@ int dc_signal_out_with_callback(const std::string &saddr, const std::string &des signal.p_last_data = p_last_data; if(nullptr != cb) { - signal.out_change_cb_list.push_back(cb); + signal.out_change_cb_list.push_back({module_id, cb}); } return dc_signal_add_to_map(signal, g_datacenter.signal_out); } -int dc_signal_out_link_with_callback(const std::string &saddr, void **p_data, out_signal_change_cb cb) +int dc_signal_out_link_with_callback(const std::string &saddr, void **p_data, out_signal_change_cb cb, const std::string &module_id) { stru_signal *p_signal = dc_find_out_signal(saddr); if(nullptr == p_signal) @@ -985,7 +987,7 @@ int dc_signal_out_link_with_callback(const std::string &saddr, void **p_data, ou if(nullptr != cb) { - p_signal->out_change_cb_list.push_back(cb); + p_signal->out_change_cb_list.push_back({module_id, cb}); } return 0; @@ -1040,7 +1042,7 @@ int dc_signal_in(const std::string &saddr, const std::string &desc, const std::s return dc_signal_add_to_map(signal, g_datacenter.signal_in); } -int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data, out_signal_change_cb cb) +int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data, out_signal_change_cb cb, const std::string &module_id) { if(p_data == nullptr) { @@ -1079,7 +1081,7 @@ int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc if(nullptr != cb) { - p_signal_out->out_change_cb_list.push_back(cb); + p_signal_out->out_change_cb_list.push_back({module_id, cb}); } if(p_signal_out->link_set.find(saddr) == p_signal_out->link_set.end()) @@ -1093,7 +1095,7 @@ int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc return dc_signal_add_to_map(signal, g_datacenter.signal_in); } -int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb) +int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb, const std::string &module_id) { if(p_data == nullptr || p_default_data == nullptr) { @@ -1120,10 +1122,10 @@ int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data dc_delete_signal_data(p_signal->vec_p_data[0], data_type); p_signal->vec_p_data[0] = p_data; - p_signal->change_cb_list.push_back(cb); + p_signal->change_cb_list.push_back({module_id, cb}); return 0; } - + dc_set_param_cfg_change(true); stru_signal signal; @@ -1144,16 +1146,16 @@ int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data if(cb) { - p_signal->change_cb_list.push_back(cb); + p_signal->change_cb_list.push_back({module_id, cb}); } - + return 0; } return -1; } -int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb) +int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb, const std::string &module_id) { if(p_data == nullptr) { @@ -1167,7 +1169,7 @@ int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, sig { if(cb) { - p_signal->change_cb_list.push_back(cb); + p_signal->change_cb_list.push_back({module_id, cb}); } (*p_data) = p_signal->vec_p_data.empty() ? nullptr : p_signal->vec_p_data[0]; @@ -1177,7 +1179,7 @@ int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, sig return -1; } -int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data) +int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data, const std::string &module_id) { if(p_data == nullptr) { @@ -1218,11 +1220,13 @@ int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_s return -1; } - for(auto cb : p_signal->change_cb_list) + for(auto &entry : p_signal->change_cb_list) { - if(cb) + if(entry.second) { - cb(saddr, step, ctrl.data_type, 0, p_data); + // 回路阻断:修改本信号的模块不回调自身 + if (entry.first == module_id) continue; + entry.second(saddr, step, ctrl.data_type, 0, p_data); } } @@ -1243,7 +1247,7 @@ int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_s return -1; } -int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data) +int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data, const std::string &module_id) { if(p_data == nullptr) { @@ -1280,7 +1284,7 @@ int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_ty return -1; } -int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, void **p_default_data, int data_num, signal_change_cb cb) +int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, void **p_default_data, int data_num, signal_change_cb cb, const std::string &module_id) { // 先从参数表里解析,调用参数注册 // 程序注册时,从参数表里去查找,同一个信息,使用参数表中的保存的数据值,在线程初始化时,通知所有链接此信号的信号 @@ -1343,7 +1347,7 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d p_signal->vec_p_default_data.push_back(p_default_data[i]); } - p_signal->change_cb_list.push_back(cb); + p_signal->change_cb_list.push_back({module_id, cb}); return 0; } @@ -1370,7 +1374,7 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d if(cb) { - p_signal->change_cb_list.push_back(cb); + p_signal->change_cb_list.push_back({module_id, cb}); } return 0; } @@ -1378,7 +1382,7 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d return -1; } -int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, int data_num, signal_change_cb cb) +int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, int data_num, signal_change_cb cb, const std::string &module_id) { XXH128_hash_t hash = XXH3_128bits(saddr.c_str(), saddr.length()); stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_param); @@ -1386,7 +1390,7 @@ int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, { if(cb) { - p_signal->change_cb_list.push_back(cb); + p_signal->change_cb_list.push_back({module_id, cb}); } for(size_t i = 0; i < p_signal->vec_p_data.size() && i < data_num; i++) @@ -1400,7 +1404,7 @@ int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, } -int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, uint8_t setting_zone, void *p_data) +int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, uint8_t setting_zone, void *p_data, const std::string &module_id) { if(p_data == nullptr) { @@ -1440,11 +1444,13 @@ int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, str return -1; } - for(auto cb : p_signal->change_cb_list) + for(auto &entry : p_signal->change_cb_list) { - if(cb != nullptr) + if(entry.second != nullptr) { - cb(saddr, step, ctrl.data_type, setting_zone, p_data); + // 回路阻断:修改本信号的模块不回调自身 + if (entry.first == module_id) continue; + entry.second(saddr, step, ctrl.data_type, setting_zone, p_data); } } @@ -1465,7 +1471,7 @@ int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, str return -1; } -int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, uint8_t setting_zone, void *p_data) +int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, uint8_t setting_zone, void *p_data, const std::string &module_id) { if(p_data == nullptr) { @@ -1498,7 +1504,7 @@ int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data return -1; } -int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb) +int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb, const std::string &module_id) { if(p_data == nullptr) { @@ -1521,7 +1527,7 @@ int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data { if(cb) { - p_signal->change_cb_list.push_back(cb); + p_signal->change_cb_list.push_back({module_id, cb}); } p_signal->ctrl_type = ctrl_type; @@ -1532,7 +1538,7 @@ int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data return -1; } -int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb) +int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb, const std::string &module_id) { if(p_data == nullptr) { @@ -1546,7 +1552,7 @@ int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, sig { if(cb) { - p_signal->change_cb_list.push_back(cb); + p_signal->change_cb_list.push_back({module_id, cb}); } (*p_data) = p_signal->vec_p_data.empty() ? nullptr : p_signal->vec_p_data[0]; return (*p_data) != nullptr ? 0 : -1; @@ -1555,7 +1561,7 @@ int dc_signal_yk_link_with_callback(const std::string &saddr, void **p_data, sig return -1; } -int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data) +int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data, const std::string &module_id) { if(p_data == nullptr) { @@ -1589,11 +1595,13 @@ int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, str return -1; } - for(auto cb : p_signal->change_cb_list) + for(auto &entry : p_signal->change_cb_list) { - if(cb != nullptr) + if(entry.second != nullptr) { - cb(saddr, step, ctrl.data_type, 0, p_data); + // 回路阻断:修改本信号的模块不回调自身 + if (entry.first == module_id) continue; + entry.second(saddr, step, ctrl.data_type, 0, p_data); } } @@ -1947,11 +1955,12 @@ void dc_set_signal_val_from_str(void *p_data, uint8_t data_type, const std::stri } } -int dc_set_out_signal_val(const std::string &saddr, void *set_data) +int dc_set_out_signal_val(const std::string &saddr, void *set_data, const std::string &module_id) { stru_signal *p_signal = dc_find_out_signal(saddr); if(p_signal != nullptr) { + p_signal->last_caller_module = module_id; dc_mark_signal_dirty(p_signal); return dc_set_signal_val(p_signal->vec_p_data[0], p_signal->data_type, set_data); } diff --git a/src/system/libiec/inc/iec_point.h b/src/system/libiec/inc/iec_point.h index 7fad55f..a947eb8 100644 --- a/src/system/libiec/inc/iec_point.h +++ b/src/system/libiec/inc/iec_point.h @@ -6,4 +6,6 @@ #include "iec_cfg_parse.h" #include "iec.h" +#define MODULE_IEC104 "iec104" + int iec_point_init(); \ No newline at end of file diff --git a/src/system/libiec/src/iec_point.cpp b/src/system/libiec/src/iec_point.cpp index 8e74208..3d66982 100644 --- a/src/system/libiec/src/iec_point.cpp +++ b/src/system/libiec/src/iec_point.cpp @@ -213,7 +213,7 @@ int iec_point_init() p_vec = vec_st_mx_dd[i]; for(uint32_t j = 0; j < p_vec->size(); j++) { - if(0 != dc_signal_out_link_with_callback(p_vec->at(j).link, &p_vec->at(j).p_data, vec_out_change_cb_list[i])) + if(0 != dc_signal_out_link_with_callback(p_vec->at(j).link, &p_vec->at(j).p_data, vec_out_change_cb_list[i], MODULE_IEC104)) { MY_LOG_E("dc_signal_out_link_with_callback failed, link %s", p_vec->at(j).link.c_str()); return -1; @@ -223,7 +223,7 @@ int iec_point_init() for(uint32_t i = 0; i < p_iec_cfg->vec_co.size(); i++) { - if(0 != dc_signal_yk_link_with_callback(p_iec_cfg->vec_co[i].link, &p_iec_cfg->vec_co[i].p_data, iec_signal_yk_change)) + if(0 != dc_signal_yk_link_with_callback(p_iec_cfg->vec_co[i].link, &p_iec_cfg->vec_co[i].p_data, iec_signal_yk_change, MODULE_IEC104)) { MY_LOG_E("dc_signal_yk_link failed, link %s", p_iec_cfg->vec_co[i].link.c_str()); return -1; @@ -232,7 +232,7 @@ int iec_point_init() for(uint32_t i = 0; i < p_iec_cfg->vec_ao.size(); i++) { - if(0 != dc_signal_ao_link_with_callback(p_iec_cfg->vec_ao[i].link, &p_iec_cfg->vec_ao[i].p_data, iec_signal_ao_change)) + if(0 != dc_signal_ao_link_with_callback(p_iec_cfg->vec_ao[i].link, &p_iec_cfg->vec_ao[i].p_data, iec_signal_ao_change, MODULE_IEC104)) { MY_LOG_E("dc_signal_ao_link failed, link %s, type %d", p_iec_cfg->vec_ao[i].link.c_str(), p_iec_cfg->vec_ao[i].type); return -1; diff --git a/src/system/libiec61850m/inc/iec61850m.h b/src/system/libiec61850m/inc/iec61850m.h index 20b683d..6ac7283 100644 --- a/src/system/libiec61850m/inc/iec61850m.h +++ b/src/system/libiec61850m/inc/iec61850m.h @@ -4,3 +4,5 @@ #include "mySystem.h" #include "myMms_m.h" +#define MODULE_IEC61850M "iec61850m" + diff --git a/src/system/libiec61850m/src/iec61850m.cpp b/src/system/libiec61850m/src/iec61850m.cpp index 7e938d9..b0e7970 100644 --- a/src/system/libiec61850m/src/iec61850m.cpp +++ b/src/system/libiec61850m/src/iec61850m.cpp @@ -50,6 +50,7 @@ LOCAL std::vector g_vec_iec61850m_info = LOCAL std::map g_mms_m_type_to_local_type = { {MMS_BOOLEAN, DATA_TYPE_U8}, + {MMS_BIT_STRING, DATA_TYPE_U32}, {MMS_INTEGER, DATA_TYPE_S32}, {MMS_UNSIGNED, DATA_TYPE_U32}, {MMS_FLOAT, DATA_TYPE_F32}, @@ -140,6 +141,9 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p) case MMS_BOOLEAN: printf("value %d, ", MY_GET_DATA_WITH_TYPE(p->p_value, uint8_t)); break; + case MMS_BIT_STRING: + printf("value %d, ", MY_GET_DATA_WITH_TYPE(p->p_value, uint32_t)); + break; case MMS_INTEGER: printf("value %d, ", MY_GET_DATA_WITH_TYPE(p->p_value, int32_t)); break; @@ -150,6 +154,7 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p) printf("value %s, ", (char *)p->p_value); break; default: + printf("unknown type %d, ", p->type); break; } stru_mms_m_time *t = &p->time; @@ -164,7 +169,7 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p) { if(strcmp(p_cfg->point.p_st[j].saddr, p->name) == 0 && NULL != p_cfg->point.p_st[j].value.p_val[0]) { - dc_set_out_signal_val(p_cfg->point.p_st[j].saddr, p->p_value); + dc_set_out_signal_val(p_cfg->point.p_st[j].saddr, p->p_value, MODULE_IEC61850M); } } @@ -172,7 +177,7 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p) { if(strcmp(p_cfg->point.p_mx[j].saddr, p->name) == 0 && NULL != p_cfg->point.p_mx[j].value.p_val[0]) { - dc_set_out_signal_val(p_cfg->point.p_mx[j].saddr, p->p_value); + dc_set_out_signal_val(p_cfg->point.p_mx[j].saddr, p->p_value, MODULE_IEC61850M); } } @@ -191,7 +196,20 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p) continue; } - dc_signal_ao_set_val_without_check(p_cfg->point.p_ao[j].saddr, local_type, p->p_value); + // dc_signal_ao_set_val_without_check(p_cfg->point.p_ao[j].saddr, local_type, p->p_value, MODULE_IEC61850M); + + auto ao = p_cfg->point.p_ao[j]; + uint8_t temp[128] = {0}; + stru_signal_ctrl ctrl = {}; + ctrl.type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; + ctrl.p_data = temp; + ctrl.step = SIGNAL_CTRL_STEP::READY; + ctrl.data_type = local_type; + + if(0 != dc_signal_ao_set_val(ao.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, p->p_value, MODULE_IEC61850M)) + { + LOG_E("iec61850m_ext_demo, set ao %s value failed", ao.saddr); + } } } } @@ -212,7 +230,20 @@ LOCAL void mms_data_back(stru_mms_m_out_value *p) } printf("mms_data_back: set param %s zone=%d\n", p_cfg->point.p_param[j].saddr, p->set_zone); - dc_signal_param_set_val_without_check(p_cfg->point.p_param[j].saddr, local_type, p->set_zone - 1, p->p_value); + // dc_signal_param_set_val_without_check(p_cfg->point.p_param[j].saddr, local_type, p->set_zone - 1, p->p_value, MODULE_IEC61850M); + + auto param = p_cfg->point.p_param[j]; + uint8_t temp[128] = {0}; + stru_signal_ctrl ctrl = {}; + ctrl.type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; + ctrl.p_data = temp; + ctrl.step = SIGNAL_CTRL_STEP::READY; + ctrl.data_type = local_type; + + if(0 != dc_signal_param_set_val(param.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, p->set_zone - 1, p->p_value, MODULE_IEC61850M)) + { + LOG_E("iec61850m_ext_demo, set param %s value failed", param.saddr); + } } } } @@ -449,7 +480,7 @@ LOCAL int iec61850m_co_signal_init(int num, stru_point_item *p_item) } uint8_t local_type = g_mms_m_type_to_local_type[p->type]; uint8_t local_ctrl_type = g_mms_m_ctrl_type_to_local_ctrl_type[p->ctrl_model]; - if(0 != dc_signal_yk(p->saddr, p->desc, local_type, local_ctrl_type, p->value.p_val[0], iec61850m_signal_co_change_callback)) + if(0 != dc_signal_yk(p->saddr, p->desc, local_type, local_ctrl_type, p->value.p_val[0], iec61850m_signal_co_change_callback, MODULE_IEC61850M)) { MY_LOG_E("dc_signal_yk failed, saddr %s, desc %s, type %d", p->saddr, p->desc, p->type); return -1; @@ -482,7 +513,7 @@ LOCAL int iec61850m_ao_signal_init(int num, stru_point_item *p_item) uint8_t local_type = g_mms_m_type_to_local_type[p->type]; uint8_t ctrl_type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; - if(0 != dc_signal_ao(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val[0], p->value.p_default[0], iec61850m_signal_ao_change_callback)) + if(0 != dc_signal_ao(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val[0], p->value.p_default[0], iec61850m_signal_ao_change_callback, MODULE_IEC61850M)) { MY_LOG_E("dc_signal_ao failed, saddr %s, desc %s, type %d", p->saddr, p->desc, p->type); return -1; @@ -509,7 +540,7 @@ LOCAL int iec61850m_param_signal_init(int num, stru_point_item *p_item) uint8_t local_type = g_mms_m_type_to_local_type[p->type]; uint8_t ctrl_type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; - if(0 != dc_signal_param(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val, p->value.p_default, MMS_M_MAX_VAL_NUM, iec61850m_signal_param_change_callback)) + if(0 != dc_signal_param(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val, p->value.p_default, MMS_M_MAX_VAL_NUM, iec61850m_signal_param_change_callback, MODULE_IEC61850M)) { MY_LOG_E("dc_signal_param failed, saddr %s, desc %s, type %d", p->saddr, p->desc, p->type); return -1; @@ -844,4 +875,4 @@ LOCAL void cmd_iec61850m(int argc, char *argv[]) } } -CMD_REGISTER("iec61850m", cmd_iec61850m, "iec61850客户端线程的控制命令"); \ No newline at end of file +CMD_REGISTER(MODULE_IEC61850M, cmd_iec61850m, "iec61850客户端线程的控制命令"); \ No newline at end of file diff --git a/src/system/libiec61850s/inc/iec61850s.h b/src/system/libiec61850s/inc/iec61850s.h index 5ad23e6..244e163 100644 --- a/src/system/libiec61850s/inc/iec61850s.h +++ b/src/system/libiec61850s/inc/iec61850s.h @@ -2,4 +2,6 @@ #include "myBase.h" #include "mySystem.h" -#include "myMms_s.h" \ No newline at end of file +#include "myMms_s.h" + +#define MODULE_IEC61850S "iec61850s" \ No newline at end of file diff --git a/src/system/libiec61850s/src/iec61850s.cpp b/src/system/libiec61850s/src/iec61850s.cpp index 86ac1ef..14f9237 100644 --- a/src/system/libiec61850s/src/iec61850s.cpp +++ b/src/system/libiec61850s/src/iec61850s.cpp @@ -31,6 +31,50 @@ LOCAL std::vector g_vec_param = {}; LOCAL mms_s_value_update_cb g_mms_s_value_update_cb = NULL; +LOCAL void iec61850s_sg_change_callback(const char *zone_saddr, int new_act_sg) +{ + printf("[THREAD_TRACE] iec61850s_sg_change_callback ENTER zone_saddr=%s new_act_sg=%d tid=%lu\n", zone_saddr, new_act_sg, pthread_self()); + LOG_I("SG changed to %d, zone_saddr %s", new_act_sg, zone_saddr); + + for(auto &setting : g_vec_setting) + { + if(strcmp(setting.base.saddr, zone_saddr) == 0) + { + uint8_t temp[128] = {0}; + stru_signal_ctrl ctrl = {}; + ctrl.step = SIGNAL_CTRL_STEP::READY; + ctrl.type = setting.base.ctrl_model; + ctrl.data_type = setting.base.type; + ctrl.p_data = temp; + + if(setting.base.ctrl_model == SIGNAL_CTRL_TYPE::SBO_NORMAL) + { + if(0 != dc_signal_ao_set_val(setting.base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, (void *)&new_act_sg, MODULE_IEC61850S)) + { + LOG_E("dc_signal_ao_set_val SELECT failed, saddr: %s", setting.base.saddr); + return; + } + } + + if(0 != dc_signal_ao_set_val(setting.base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, (void *)&new_act_sg, MODULE_IEC61850S)) + { + LOG_E("dc_signal_ao_set_val DIRECT failed, saddr: %s", setting.base.saddr); + 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()); + // } + + break; + } + } +} + + LOCAL void iec61850s_st_mx_change_callback(std::string saddr, uint8_t data_type, void *p_data, void *p_last_data) { if(NULL == p_data || NULL == p_last_data) @@ -66,7 +110,7 @@ LOCAL int iec61850s_st_signals_init(std::vector &vec_st) st.base = it; std::string desc = ""; - if(0 != dc_signal_out_link_with_callback(st.base.saddr, &st.p_data, iec61850s_st_mx_change_callback)) + if(0 != dc_signal_out_link_with_callback(st.base.saddr, &st.p_data, iec61850s_st_mx_change_callback, MODULE_IEC61850S)) { LOG_E("dc_signal_out_link_with_callback failed"); return -1; @@ -91,7 +135,7 @@ LOCAL int iec61850s_mx_signals_init(std::vector &vec_mx) mx.base = it; std::string desc = ""; - if(0 != dc_signal_out_link_with_callback(mx.base.saddr, &mx.p_data, iec61850s_st_mx_change_callback)) + if(0 != dc_signal_out_link_with_callback(mx.base.saddr, &mx.p_data, iec61850s_st_mx_change_callback, MODULE_IEC61850S)) { LOG_E("dc_signal_out_link_with_callback failed"); return -1; @@ -127,7 +171,7 @@ LOCAL void iec61850s_control_callback(stru_mms_s_control *p_control, uint8_t sta if(base.ctrl_model == CONTROL_MODEL_DIRECT_NORMAL || base.ctrl_model == CONTROL_MODEL_DIRECT_ENHANCED) { ctrl.type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; - if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, &state)) + if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, &state, MODULE_IEC61850S)) { MY_LOG_E("dc_signal_yk_set_status failed"); return; @@ -136,13 +180,13 @@ LOCAL void iec61850s_control_callback(stru_mms_s_control *p_control, uint8_t sta else if(base.ctrl_model == CONTROL_MODEL_SBO_NORMAL || base.ctrl_model == CONTROL_MODEL_SBO_ENHANCED) { ctrl.type = SIGNAL_CTRL_TYPE::SBO_NORMAL; - if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, &state)) + if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, &state, MODULE_IEC61850S)) { MY_LOG_E("dc_signal_yk_set_status failed"); return; } - if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, &state)) + if(0 != dc_signal_yk_set_status(base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, &state, MODULE_IEC61850S)) { MY_LOG_E("dc_signal_yk_set_status failed"); return; @@ -184,6 +228,22 @@ LOCAL int iec61850s_control_signals_init(std::vector &ve return 0; } +LOCAL void iec61850s_ao_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data) +{ + if(NULL == p_data) + { + LOG_E("p_data is NULL"); + return; + } + + LOG_I("ao change callback called saddr: %s, step: %i, data_type: %i, setting_zone: %i", saddr.c_str(), step, data_type, setting_zone); + std::string val = dc_get_signal_val(p_data, data_type); + if(g_mms_s_value_update_cb != NULL && !val.empty()) + { + g_mms_s_value_update_cb(saddr.c_str(), val.c_str()); + } +} + LOCAL void iec61850s_setting_callback(stru_mms_s_setting *p_setting, const char *p_data) { if(NULL == p_setting || NULL == p_data) @@ -208,7 +268,7 @@ LOCAL void iec61850s_setting_callback(stru_mms_s_setting *p_setting, const char if(p_setting->base.ctrl_model == SIGNAL_CTRL_TYPE::DIRECT_NORMAL) { ctrl.type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; - if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, temp_val)) + if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, temp_val, MODULE_IEC61850S)) { MY_LOG_E("dc_signal_ao_set_val failed"); return; @@ -217,13 +277,13 @@ LOCAL void iec61850s_setting_callback(stru_mms_s_setting *p_setting, const char else if(p_setting->base.ctrl_model == SIGNAL_CTRL_TYPE::SBO_NORMAL) { ctrl.type = SIGNAL_CTRL_TYPE::SBO_NORMAL; - if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, temp_val)) + if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, temp_val, MODULE_IEC61850S)) { MY_LOG_E("dc_signal_ao_set_val select failed"); return; } - if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, temp_val)) + if(0 != dc_signal_ao_set_val(p_setting->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, temp_val, MODULE_IEC61850S)) { MY_LOG_E("dc_signal_ao_set_val direct failed"); return; @@ -243,7 +303,13 @@ LOCAL int iec61850s_setting_signals_init(std::vector &ve std::string desc = ""; - if(0 != dc_get_ao_signal_info(setting.base.saddr, desc, setting.base.type, nullptr, setting.base.ctrl_model, &setting.p_data, nullptr)) + if(0 != dc_signal_ao_link_with_callback(setting.base.saddr, &setting.p_data, iec61850s_ao_change_callback, MODULE_IEC61850S)) + { + LOG_E("dc_signal_ao_link_with_callback failed"); + return -1; + } + + if(0 != dc_get_ao_signal_info(setting.base.saddr, desc, setting.base.type, nullptr, setting.base.ctrl_model, NULL, NULL)) { MY_LOG_E("dc_get_ao_signal_info failed, saddr: %s, desc: %s", setting.base.saddr, desc.c_str()); return -1; @@ -284,7 +350,7 @@ LOCAL void iec61850s_param_callback(stru_mms_s_param *p_param, const char *p_dat if(p_param->base.ctrl_model == SIGNAL_CTRL_TYPE::DIRECT_NORMAL) { ctrl.type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; - if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, setting_zone, temp_val)) + if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, setting_zone, temp_val, MODULE_IEC61850S)) { MY_LOG_E("dc_signal_param_set_val failed"); return; @@ -293,13 +359,13 @@ LOCAL void iec61850s_param_callback(stru_mms_s_param *p_param, const char *p_dat else if(p_param->base.ctrl_model == SIGNAL_CTRL_TYPE::SBO_NORMAL) { ctrl.type = SIGNAL_CTRL_TYPE::SBO_NORMAL; - if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, setting_zone, temp_val)) + if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::SELECT, ctrl, setting_zone, temp_val, MODULE_IEC61850S)) { MY_LOG_E("dc_signal_param_set_val select failed"); return; } - if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, setting_zone, temp_val)) + if(0 != dc_signal_param_set_val(p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, ctrl, setting_zone, temp_val, MODULE_IEC61850S)) { MY_LOG_E("dc_signal_param_set_val direct failed"); return; @@ -439,6 +505,11 @@ int app_iec61850s_init2(void *arg) return -1; } + if(!g_vec_setting.empty() && strlen(g_vec_setting[0].base.saddr) > 0) + { + mms_s_bind_param_zone_signal(g_vec_setting[0].base.saddr, iec61850s_sg_change_callback); + } + return 0; } diff --git a/src/system/libself_ptl/inc/self_ptl.h b/src/system/libself_ptl/inc/self_ptl.h index 1ab1d59..5c402c4 100644 --- a/src/system/libself_ptl/inc/self_ptl.h +++ b/src/system/libself_ptl/inc/self_ptl.h @@ -4,6 +4,8 @@ #include "mySystem.h" #include "myDatacenter.h" +#define MODULE_SELF_PTL "self_ptl" + #define IEC_START 0x68 #define IEC_TAIL 0x16 diff --git a/src/system/libself_ptl/src/method.cpp b/src/system/libself_ptl/src/method.cpp index 9ac8488..4fb2185 100644 --- a/src/system/libself_ptl/src/method.cpp +++ b/src/system/libself_ptl/src/method.cpp @@ -135,7 +135,7 @@ void ao_pop_out(stru_icp67 *p_icp67, uint16_t addr, uint8_t type, uint8_t len, u // dc_signal_param_set_val(p_ao_data->p_param->base.saddr, SIGNAL_CTRL_STEP::SELECT, type, p_data); // dc_signal_param_set_val(p_ao_data->p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, type, p_data); - if(0 != dc_signal_ao_set_val_without_check(p_ao_data->p_param->base.saddr, type, (void *)p_data)) + if(0 != dc_signal_ao_set_val_without_check(p_ao_data->p_param->base.saddr, type, (void *)p_data, MODULE_SELF_PTL)) { LOG_E("dc_signal_ao_set_val_without_check failed,saddr %s, desc %s, inf %d, type %d", p_ao_data->p_param->base.saddr.c_str(), p_ao_data->p_param->base.desc.c_str(), p_ao_data->p_param->base.inf, type); @@ -472,7 +472,7 @@ void mx_trans(stru_icp67 *p_icp67, uint16_t info_addr, float p_data) { // *(float *)(p_app_cfg_data->mx_vec[info_addr].p_data) = p_data; - dc_set_out_signal_val(p_app_cfg_data->mx_vec[info_addr].p_base->saddr, &p_data); + dc_set_out_signal_val(p_app_cfg_data->mx_vec[info_addr].p_base->saddr, &p_data, MODULE_SELF_PTL); } } @@ -493,7 +493,7 @@ void st_trans(stru_icp67 *p_icp67, uint16_t info_addr, uint8_t p_data) // *(uint8_t *)(p_app_cfg_data->st_vec[info_addr].p_data) = p_data; - dc_set_out_signal_val(p_app_cfg_data->st_vec[info_addr].p_base->saddr, &p_data); + dc_set_out_signal_val(p_app_cfg_data->st_vec[info_addr].p_base->saddr, &p_data, MODULE_SELF_PTL); // if(*(uint8_t *)(p_app_cfg_data->st_vec[info_addr].p_last_data) != p_data) // { @@ -517,7 +517,7 @@ void dd_trans(stru_icp67 *p_icp67, uint16_t info_addr, float p_data) if(info_addr < p_app_cfg_data->dd_vec.size()) { - dc_set_out_signal_val(p_app_cfg_data->dd_vec[info_addr].p_base->saddr, &p_data); + dc_set_out_signal_val(p_app_cfg_data->dd_vec[info_addr].p_base->saddr, &p_data, MODULE_SELF_PTL); } LOG_I("dd_trans: info_addr %d, p_data %f", info_addr, p_data); } @@ -644,7 +644,7 @@ void mx_change(stru_icp67 *p_icp67, stru_mx_info *p_data) uint16_t addr = p_data->addr - YC_START_PORT; if(addr < p_app_cfg_data->mx_vec.size()) { - dc_set_out_signal_val(p_app_cfg_data->mx_vec[addr].p_base->saddr, &p_data->data); + dc_set_out_signal_val(p_app_cfg_data->mx_vec[addr].p_base->saddr, &p_data->data, MODULE_SELF_PTL); } } diff --git a/src/system/libself_ptl/src/self_ptl.cpp b/src/system/libself_ptl/src/self_ptl.cpp index 8ee1417..c4c5fa2 100644 --- a/src/system/libself_ptl/src/self_ptl.cpp +++ b/src/system/libself_ptl/src/self_ptl.cpp @@ -864,7 +864,7 @@ int self_ptl_do_signal_out(stru_app *p_app) p = &p_app_cfg_data->co_vec.at(i); if(p && p->p_base) { - ret |= dc_signal_yk(p->p_base->saddr, p->p_base->desc, DATA_TYPE_U8, SIGNAL_CTRL_TYPE::SBO_NORMAL, p->p_data, self_ptl_signal_change_callback); + ret |= dc_signal_yk(p->p_base->saddr, p->p_base->desc, DATA_TYPE_U8, SIGNAL_CTRL_TYPE::SBO_NORMAL, p->p_data, self_ptl_signal_change_callback, MODULE_SELF_PTL); } } @@ -892,7 +892,7 @@ int self_ptl_do_signal_out(stru_app *p_app) stru_self_ptl_cfg_param_data *p_ao = &p_app_cfg_data->ao_vec.at(i); if(p_ao && p_ao->p_param) { - ret |= dc_signal_ao(p_ao->p_param->base.saddr, p_ao->p_param->base.desc, p_ao->p_param->type, SIGNAL_CTRL_TYPE::SBO_NORMAL, p_ao->vec_p_data[0], p_ao->vec_p_default_data[0], self_ptl_signal_change_callback); + ret |= dc_signal_ao(p_ao->p_param->base.saddr, p_ao->p_param->base.desc, p_ao->p_param->type, SIGNAL_CTRL_TYPE::SBO_NORMAL, p_ao->vec_p_data[0], p_ao->vec_p_default_data[0], self_ptl_signal_change_callback, MODULE_SELF_PTL); } } @@ -907,7 +907,7 @@ int self_ptl_do_signal_out(stru_app *p_app) if(p_param && p_param->p_param) { ret |= dc_signal_param(p_param->p_param->base.saddr, p_param->p_param->base.desc, p_param->p_param->type, - SIGNAL_CTRL_TYPE::SBO_NORMAL, p_param->vec_p_data.data(), p_param->vec_p_default_data.data(), p_param->p_param->num, self_ptl_signal_change_callback); + SIGNAL_CTRL_TYPE::SBO_NORMAL, p_param->vec_p_data.data(), p_param->vec_p_default_data.data(), p_param->p_param->num, self_ptl_signal_change_callback, MODULE_SELF_PTL); } } diff --git a/src/system/libweb_server/inc/ws_method.h b/src/system/libweb_server/inc/ws_method.h index 641aff4..fe0b1dd 100644 --- a/src/system/libweb_server/inc/ws_method.h +++ b/src/system/libweb_server/inc/ws_method.h @@ -2,6 +2,8 @@ #include "myBase.h" +#define MODULE_WEB_SERVER "web_server" + struct mg_connection; void ws_recv(struct mg_connection *c, const char *p_rx, uint16_t rx_len); diff --git a/src/system/libweb_server/src/ws_method.cpp b/src/system/libweb_server/src/ws_method.cpp index 732aa45..b5c5337 100644 --- a/src/system/libweb_server/src/ws_method.cpp +++ b/src/system/libweb_server/src/ws_method.cpp @@ -345,7 +345,7 @@ LOCAL void set_out_signal_data(stru_ws_session &s, const std::string& saddr, con { dc_set_signal_val_from_str(data, p_signal->data_type, val); - if(0 != dc_set_out_signal_val(saddr, (void *)data)) + if(0 != dc_set_out_signal_val(saddr, (void *)data, MODULE_WEB_SERVER)) { LOG_E("set_signal_data: dc_set_signal_val failed, saddr = %s, val = %s", saddr.c_str(), val.c_str()); return; @@ -372,7 +372,7 @@ LOCAL void set_yk_signal_data(stru_ws_session &s, const std::string& saddr, cons if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL) { - if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data)) + if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER)) { LOG_E("set_signal_data: dc_signal_yk_set_status direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str()); return; @@ -383,7 +383,7 @@ LOCAL void set_yk_signal_data(stru_ws_session &s, const std::string& saddr, cons } else if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::SBO_NORMAL) { - if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)data)) + if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER)) { LOG_E("set_signal_data: dc_signal_yk_set_status select failed, saddr = %s, val = %s", saddr.c_str(), val.c_str()); return; @@ -391,7 +391,7 @@ LOCAL void set_yk_signal_data(stru_ws_session &s, const std::string& saddr, cons LOG_I("saddr %s, select value %s success !!!", saddr.c_str(), val.c_str()); - if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data)) + if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER)) { LOG_E("set_signal_data: dc_signal_yk_set_status direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str()); return; @@ -423,7 +423,7 @@ LOCAL void set_ao_signal_data(stru_ws_session &s, const std::string& saddr, cons if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL) { - if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data)) + if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER)) { LOG_E("set_signal_data: dc_signal_ao_set_val direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str()); return; @@ -435,7 +435,7 @@ LOCAL void set_ao_signal_data(stru_ws_session &s, const std::string& saddr, cons else if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::SBO_NORMAL) { - if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)data)) + if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER)) { LOG_E("set_signal_data: dc_signal_ao_set_val select failed, saddr = %s, val = %s", saddr.c_str(), val.c_str()); return; @@ -443,7 +443,7 @@ LOCAL void set_ao_signal_data(stru_ws_session &s, const std::string& saddr, cons LOG_I("saddr %s, select, value %s success !!!", saddr.c_str(), val.c_str()); - if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data)) + if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)data, MODULE_WEB_SERVER)) { LOG_E("set_signal_data: dc_signal_ao_set_val direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str()); return; @@ -474,7 +474,7 @@ LOCAL void set_param_signal_data(stru_ws_session &s, const std::string& saddr, c if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL) { - if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, setting_zone, (void *)data)) + if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, setting_zone, (void *)data, MODULE_WEB_SERVER)) { LOG_E("set_signal_data: dc_signal_param_set_val direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str()); return; @@ -485,7 +485,7 @@ LOCAL void set_param_signal_data(stru_ws_session &s, const std::string& saddr, c } else if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::SBO_NORMAL) { - if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, setting_zone, (void *)data)) + if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, setting_zone, (void *)data, MODULE_WEB_SERVER)) { LOG_E("set_signal_data: dc_signal_param_set_val select failed, saddr = %s, val = %s", saddr.c_str(), val.c_str()); return; @@ -493,7 +493,7 @@ LOCAL void set_param_signal_data(stru_ws_session &s, const std::string& saddr, c LOG_I("saddr %s, select, value %s success !!!", saddr.c_str(), val.c_str()); - if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, setting_zone, (void *)data)) + if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, setting_zone, (void *)data, MODULE_WEB_SERVER)) { LOG_E("set_signal_data: dc_signal_param_set_val direct failed, saddr = %s, val = %s", saddr.c_str(), val.c_str()); return;