From fe16beb18833110d29499202ed6da40674688ba5 Mon Sep 17 00:00:00 2001 From: lnk Date: Fri, 17 Jul 2026 11:15:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=B7=BB=E5=8A=A0pq?= =?UTF-8?q?dif=E5=88=A4=E6=96=AD=EF=BC=8C=E6=96=B0=E5=A2=9Epqdif=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cfg_parse/cfg_parser.cpp | 52 +++++++++++++++++++++++++++++++++++----- cfg_parse/log4.cpp | 4 +++- json/mms_json_inter.h | 1 + json/save2json.cpp | 2 ++ mms/db_interface.h | 1 + mms/main.c | 2 ++ mms/mms_process.c | 10 ++++++-- mms/rdb_client.c | 6 +++++ set_process.sh | 3 +++ 9 files changed, 72 insertions(+), 9 deletions(-) diff --git a/cfg_parse/cfg_parser.cpp b/cfg_parse/cfg_parser.cpp index 1de0d45..8fea8ce 100644 --- a/cfg_parse/cfg_parser.cpp +++ b/cfg_parse/cfg_parser.cpp @@ -156,6 +156,7 @@ public: char dev_type[64]; char dev_key[255]; char dev_series[255]; + char com_type[32]; char addr_str[64]; char port[64]; char timestamp[64]; @@ -859,7 +860,10 @@ void init_config() { } else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波 TEST_PORT = TEST_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index; - } + } + else if (g_node_id == PQDIF_DATA_BASE_NODE_ID) { + TEST_PORT = TEST_PORT + PQDIF_DATA_BASE_NODE_ID + g_front_seg_index; + } } @@ -3388,6 +3392,31 @@ void SendJsonAPI_web(const std::string& strUrl, const char* code, const std::str } // 打印 terminal_dev_map 中所有内容的函数 +static bool is_cfg_pqdif_process() +{ + return std::strstr(subdir, "cfg_pqdif_data") != NULL; +} + +static bool is_pqdif_com_type(const char* com_type) +{ + QString type = com_type ? QString::fromLocal8Bit(com_type).trimmed() : QString(); + return type.compare("pqdif", Qt::CaseInsensitive) == 0; +} + +static bool terminal_should_bind_to_current_process(const terminal_dev* dev) +{ + if (dev == NULL) + return false; + + if (is_pqdif_com_type(dev->com_type)) + return is_cfg_pqdif_process(); + + if (is_cfg_pqdif_process()) + return false; + + return (atoi(dev->processNo) == g_front_seg_index || g_front_seg_index == 0); +} + void printTerminalDevMap(const QMap& terminal_dev_map) { QMap::const_iterator it; for (it = terminal_dev_map.constBegin(); it != terminal_dev_map.constEnd(); ++it) { @@ -3406,6 +3435,7 @@ void printTerminalDevMap(const QMap& terminal_dev_map) { << ", Device Type:" << QString(dev->dev_type) << ", Device Key:" << QString(dev->dev_key) << ", Device Series:" << QString(dev->dev_series) + << ", Device comType:" << QString(dev->com_type) << ", Device processNo:" << QString(dev->processNo) << ", Device maxProcessNum:" << QString(dev->maxProcessNum) << ", Address:" << QString(dev->addr_str) @@ -4085,6 +4115,13 @@ int terminal_ledger_web(QMap* terminal_dev_map, else strncpy(dev->dev_series, "N/A", sizeof(dev->dev_series) - 1); dev->dev_series[sizeof(dev->dev_series) - 1] = '\0'; + cJSON* comType = cJSON_GetObjectItem(item, "comType"); + if (comType == NULL) + comType = cJSON_GetObjectItem(item, "com_type"); + if (comType && comType->type == cJSON_String) strncpy(dev->com_type, comType->valuestring, sizeof(dev->com_type) - 1); + else strncpy(dev->com_type, "mms", sizeof(dev->com_type) - 1); + dev->com_type[sizeof(dev->com_type) - 1] = '\0'; + //lnk20250210台账进程号 cJSON* processNo = cJSON_GetObjectItem(item, "processNo"); // processNo转为字符串 if (processNo && processNo->type == cJSON_Number) snprintf(dev->processNo, sizeof(dev->processNo), "%d", processNo->valueint); @@ -4190,19 +4227,20 @@ int terminal_ledger_web(QMap* terminal_dev_map, //lnk20260312防止内存泄漏 bool inserted = false; + bool should_bind = terminal_should_bind_to_current_process(dev); // 检查是否存在重复键 if (terminal_dev_map->contains(key)) { std::cerr << "Duplicate terminal_code found: " << key.toStdString() << std::endl; // 删除旧的 terminal_dev 对象以避免内存泄漏 - delete terminal_dev_map->value(key); + if (should_bind) delete terminal_dev_map->value(key); // 移除旧的键值对 - terminal_dev_map->remove(key); + if (should_bind) terminal_dev_map->remove(key); // 插入新的 terminal_dev 对象 - if(atoi(dev->processNo) == g_front_seg_index || g_front_seg_index == 0){//lnk20250210匹配进程号 + if(should_bind){//lnk20250210匹配进程号 //调试用 std::cout<< "process num match" << std::endl; terminal_dev_map->insert(key, dev); @@ -4210,7 +4248,7 @@ int terminal_ledger_web(QMap* terminal_dev_map, }//后续修改为只有进程号匹配上index才录入当前进程 } else { // 插入新的 terminal_dev 对象 - if(atoi(dev->processNo) == g_front_seg_index || g_front_seg_index == 0){//lnk20250210匹配进程号 + if(should_bind){//lnk20250210匹配进程号 //调试用 std::cout<< "process num match" << std::endl; terminal_dev_map->insert(key, dev); @@ -7290,6 +7328,8 @@ const char* get_front_msg_from_subdir() { return "实时数据进程"; else if (std::strstr(subdir, "cfg_soe_comtrade") != NULL) return "暂态和告警进程"; + else if (std::strstr(subdir, "cfg_pqdif_data") != NULL) + return "pqdif处理进程"; else if (std::strstr(subdir, "cfg_recallhis_data") != NULL) return "稳态补招进程"; else if (std::strstr(subdir, "cfg_stat_data") != NULL) @@ -7511,4 +7551,4 @@ void read_latest_ledger_file(char** out) { fclose(fp); } } -} \ No newline at end of file +} diff --git a/cfg_parse/log4.cpp b/cfg_parse/log4.cpp index d68f05c..6447644 100644 --- a/cfg_parse/log4.cpp +++ b/cfg_parse/log4.cpp @@ -229,6 +229,8 @@ std::string get_front_type_from_subdir() { return "realTime"; else if (std::strstr(subdir, "cfg_soe_comtrade") != NULL) return "comtrade"; + else if (std::strstr(subdir, "cfg_pqdif_data") != NULL) + return "pqdif"; else if (std::strstr(subdir, "cfg_recallhis_data") != NULL) return "recall"; else if (std::strstr(subdir, "cfg_stat_data") != NULL) @@ -869,4 +871,4 @@ int main() { return 0; } -*/ \ No newline at end of file +*/ diff --git a/json/mms_json_inter.h b/json/mms_json_inter.h index 1cd04b3..3591ebf 100644 --- a/json/mms_json_inter.h +++ b/json/mms_json_inter.h @@ -26,6 +26,7 @@ #define THREE_SECS_DATA_BASE_NODE_ID 200 // 三秒数据、实时数据 #define SOE_COMTRADE_BASE_NODE_ID 300 // soe 录波 #define HIS_DATA_BASE_NODE_ID 400 //历史、补招 +#define PQDIF_DATA_BASE_NODE_ID 800 // pqdif数据 class json_block_data //json拼接参数类 { diff --git a/json/save2json.cpp b/json/save2json.cpp index 18783c3..d46e2b7 100644 --- a/json/save2json.cpp +++ b/json/save2json.cpp @@ -271,6 +271,8 @@ void add_comm_log(char* log_str) com_log_fn += "comm_300_comtrade.txt"; else if (g_node_id == HIS_DATA_BASE_NODE_ID) com_log_fn += "comm_400_his.txt"; + else if (g_node_id == PQDIF_DATA_BASE_NODE_ID) + com_log_fn += "comm_800_pqdif.txt"; else if (g_node_id == NEW_HIS_DATA_BASE_NODE_ID) { com_log_fn.append(QString("comm_400_his_%1.txt").arg(g_front_seg_index)); } diff --git a/mms/db_interface.h b/mms/db_interface.h index 8baa3f3..9f462b0 100644 --- a/mms/db_interface.h +++ b/mms/db_interface.h @@ -31,6 +31,7 @@ #define NEW_HIS_DATA_BASE_NODE_ID 500 #define RECALL_HIS_DATA_BASE_NODE_ID 600 #define RECALL_ALL_DATA_BASE_NODE_ID 700 +#define PQDIF_DATA_BASE_NODE_ID 800 #define REPORT_TYPE_STAT 1 #define REPORT_TYPE_REAL 2 diff --git a/mms/main.c b/mms/main.c index 27a293d..d687fd6 100644 --- a/mms/main.c +++ b/mms/main.c @@ -81,6 +81,8 @@ void init_global_function_enable() three_secs_enabled = 1; }else if (strcmp(subdir,"cfg_soe_comtrade")==0) { //告警和录波和暂态 g_node_id = SOE_COMTRADE_BASE_NODE_ID; + }else if (strcmp(subdir,"cfg_pqdif_data")==0) { + g_node_id = PQDIF_DATA_BASE_NODE_ID; }else if (strcmp(subdir,"cfg_his_data")==0) { //不使用 g_node_id = RECALL_ALL_DATA_BASE_NODE_ID; g_node_id = HIS_DATA_BASE_NODE_ID; diff --git a/mms/mms_process.c b/mms/mms_process.c index 9dfd5d0..13bf469 100644 --- a/mms/mms_process.c +++ b/mms/mms_process.c @@ -1634,12 +1634,18 @@ void CheckAllConnectedChannel() if(DEBUGOPEN)printf("[FILEDIR] enter HandleFileDirReqForChannel"); HandleFileDirReqForChannel(chnl_usr);//文件目录请求 } - - ChannelCheckIECReports(chnl_usr);//报告 + if(g_node_id == PQDIF_DATA_BASE_NODE_ID){ + //补招PQDIF文件 + } + else{ + ChannelCheckIECReports(chnl_usr);//报告 + } + if ( (g_node_id == SOE_COMTRADE_BASE_NODE_ID) || (g_node_id == HIS_DATA_BASE_NODE_ID) || (g_node_id == NEW_HIS_DATA_BASE_NODE_ID) || (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID)) ChannelCheckWaveFiles(chnl_usr);//录波文件 if(g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID)) ChannelCheckIECLogs(chnl_usr);//补招文件 + if ( (sGetMsTime() - chnl_usr->m_LastPosRespTime) > 15*1000 ) //wait 15 secs,隔15秒获取一次响应,两次没响应后关闭 { char** varnames ; diff --git a/mms/rdb_client.c b/mms/rdb_client.c index 1f161e7..ac91d1b 100644 --- a/mms/rdb_client.c +++ b/mms/rdb_client.c @@ -311,6 +311,9 @@ apr_status_t run_protocol() else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波 ServerPort = SOCKET_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index; } + else if (g_node_id == PQDIF_DATA_BASE_NODE_ID) { + ServerPort = SOCKET_PORT + PQDIF_DATA_BASE_NODE_ID + g_front_seg_index; + } struct sockaddr_in server_sockaddr; memset(&server_sockaddr, 0, sizeof(server_sockaddr)); @@ -351,6 +354,9 @@ apr_status_t run_protocol() else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波 HTTP_PORT = HTTP_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index; } + else if (g_node_id == PQDIF_DATA_BASE_NODE_ID) { + HTTP_PORT = HTTP_PORT + PQDIF_DATA_BASE_NODE_ID + g_front_seg_index; + } printf("try_start_web_http_thread \n"); try_start_web_http_thread(); printf("try_start_http_thread \n"); diff --git a/set_process.sh b/set_process.sh index 063a925..adf6768 100644 --- a/set_process.sh +++ b/set_process.sh @@ -329,6 +329,7 @@ handle_reset() { sed -i '/cfg_recallhis_data/d' /FeProject/etc/runtime.cf sed -i '/cfg_3s_data/d' /FeProject/etc/runtime.cf sed -i '/cfg_soe_comtrade/d' /FeProject/etc/runtime.cf + sed -i '/cfg_pqdif_data/d' /FeProject/etc/runtime.cf sed -i '/fe_watchdog/d' /FeProject/etc/runtime.cf # 根据进程号添加对应进程配置 @@ -340,6 +341,7 @@ handle_reset() { sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s 1_1^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf + sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_pqdif_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf else #看门狗固定放在第一个,防止stop时会把要杀死的进程重启 @@ -353,6 +355,7 @@ handle_reset() { #以下部分没有多进程 sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf + sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_pqdif_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf fi