2 Commits

Author SHA1 Message Date
lnk
ed4b39eab5 compile for arm 2026-01-20 15:51:41 +08:00
lnk
6e74f21167 modify log format and remove otlv 2026-01-06 10:23:43 +08:00
15 changed files with 206 additions and 354 deletions

View File

@@ -46,13 +46,19 @@ extern std::string G_ROCKETMQ_TOPIC;//topie
extern std::string G_ROCKETMQ_TAG;//tag extern std::string G_ROCKETMQ_TAG;//tag
extern std::string G_ROCKETMQ_KEY;//key extern std::string G_ROCKETMQ_KEY;//key
extern std::string G_MQCONSUMER_TOPIC_LOG;
extern std::string G_MQCONSUMER_TOPIC_SET;
extern std::string G_MQCONSUMER_TOPIC_RC;
extern std::string G_MQCONSUMER_TOPIC_UD;
extern std::string G_MQCONSUMER_TOPIC_RT;
extern std::string FRONT_INST; extern std::string FRONT_INST;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
extern std::string G_MQCONSUMER_TOPIC_SET; // C++ 中的全局变量声明
#ifdef __cplusplus #ifdef __cplusplus
} }
@@ -555,7 +561,7 @@ void rocketmq_producer_send(const char* strbody, const char* topic)
catch (const std::exception& e) { catch (const std::exception& e) {
std::cerr << "Failed to send message: " << e.what() << std::endl; std::cerr << "Failed to send message: " << e.what() << std::endl;
// 处理发送失败的情况,例如记录日志或重试 // 处理发送失败的情况,例如记录日志或重试
DIY_ERRORLOG_CODE("process",LOG_CODE_MQ,"【ERROR】前置的%s%d号进程 mq发送失败,请检查mq配置", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_MQ,"前置的%s%d号进程 mq发送失败,请检查mq配置", get_front_msg_from_subdir(), g_front_seg_index);
} }
} }
#endif #endif
@@ -649,7 +655,7 @@ void producer_send(const char* strbody)
/////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////
extern "C" { extern "C" {
extern std::string G_MQCONSUMER_TOPIC_RT;
void rocketmq_test_rt() void rocketmq_test_rt()
{ {
Ckafka_data_t data; Ckafka_data_t data;
@@ -663,7 +669,7 @@ void rocketmq_test_rt()
data.mp_id = 123123; data.mp_id = 123123;
my_rocketmq_send(data); my_rocketmq_send(data);
} }
extern std::string G_MQCONSUMER_TOPIC_UD;
void rocketmq_test_ud()//用来测试台账更新 void rocketmq_test_ud()//用来测试台账更新
{ {
Ckafka_data_t data; Ckafka_data_t data;
@@ -706,7 +712,7 @@ void rocketmq_test_only()//用来测试进程控制脚本
my_rocketmq_send(data); my_rocketmq_send(data);
} }
extern std::string G_MQCONSUMER_TOPIC_RC;
void rocketmq_test_rc() void rocketmq_test_rc()
{ {
Ckafka_data_t data; Ckafka_data_t data;
@@ -721,7 +727,7 @@ void rocketmq_test_rc()
my_rocketmq_send(data); my_rocketmq_send(data);
} }
extern std::string G_MQCONSUMER_TOPIC_LOG;
void rocketmq_test_log() void rocketmq_test_log()
{ {
Ckafka_data_t data; Ckafka_data_t data;

View File

@@ -21,7 +21,10 @@ using namespace std;
#define OTL_ODBC_UNIX #define OTL_ODBC_UNIX
#include <unistd.h> #include <unistd.h>
#include "otlv4.h" //#include "otlv4.h"
#include <stdio.h> #include <stdio.h>
#include <sstream> //lnk 2024-10-16 #include <sstream> //lnk 2024-10-16
@@ -40,6 +43,17 @@ using namespace std;
#include "../log4cplus/log4.h"//lnk添加log4 #include "../log4cplus/log4.h"//lnk添加log4
#include <cstring> #include <cstring>
class otl_datetime {
public:
int year;
int month;
int day;
int hour;
int minute;
int second;
};
//用于测试时防止数据激增 //用于测试时防止数据激增
#ifndef apr_time_from_msec #ifndef apr_time_from_msec
#define apr_time_from_msec(ms) ((apr_time_t)(ms) * 1000) #define apr_time_from_msec(ms) ((apr_time_t)(ms) * 1000)
@@ -515,18 +529,18 @@ void init_config() {
ba = settings.value("Oss/OssEndpoint", "").toString().toLatin1(); ba = settings.value("Oss/OssEndpoint", "").toString().toLatin1();
OSS_ENDPOINT = strdup(ba.data()); //OSS_ENDPOINT = strdup(ba.data());
ba = settings.value("Oss/AccessKeyID", "").toString().toLatin1(); ba = settings.value("Oss/AccessKeyID", "").toString().toLatin1();
ACCESS_KEY_ID = strdup(ba.data()); //ACCESS_KEY_ID = strdup(ba.data());
ba = settings.value("Oss/AccessKeySecret", "").toString().toLatin1(); ba = settings.value("Oss/AccessKeySecret", "").toString().toLatin1();
ACCESS_KEY_SECRET = strdup(ba.data()); //ACCESS_KEY_SECRET = strdup(ba.data());
ba = settings.value("Oss/BucketName", "").toString().toLatin1(); ba = settings.value("Oss/BucketName", "").toString().toLatin1();
BUCKET_NAME = strdup(ba.data()); //BUCKET_NAME = strdup(ba.data());
qDebug() << "Read OSS_ENDPOINT:" << OSS_ENDPOINT << endl; //qDebug() << "Read OSS_ENDPOINT:" << OSS_ENDPOINT << endl;
qDebug() << "Read ACCESS_KEY_ID:" << ACCESS_KEY_ID << endl; //qDebug() << "Read ACCESS_KEY_ID:" << ACCESS_KEY_ID << endl;
qDebug() << "Read ACCESS_KEY_SECRET:" << ACCESS_KEY_SECRET << endl; //qDebug() << "Read ACCESS_KEY_SECRET:" << ACCESS_KEY_SECRET << endl;
qDebug() << "Read BUCKET_NAME:" << BUCKET_NAME << endl; //qDebug() << "Read BUCKET_NAME:" << BUCKET_NAME << endl;
ba = settings.value("Kafka/brokerlist", "").toString().toLatin1(); ba = settings.value("Kafka/brokerlist", "").toString().toLatin1();
BROKER_LIST = strdup(ba.data()); BROKER_LIST = strdup(ba.data());
@@ -1462,7 +1476,7 @@ int parse_rpt_log_ini()
//添加判断有的监测点没有cpuno为2直接申请了LD_info[1]没申请LD_info[0] //添加判断有的监测点没有cpuno为2直接申请了LD_info[1]没申请LD_info[0]
if(ied_usr->LD_info[cpuno].LD_name == NULL){ if(ied_usr->LD_info[cpuno].LD_name == NULL){
printf("this ld_info didn't palloc space ,maybe this ledger has problem!"); printf("this ld_info didn't palloc space ,maybe this ledger has problem!");
DIY_ERRORLOG_CODE("process",LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1); DIY_ERRORLOG_CODE("process",LOG_CODE_RPTINIT,"终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1);
continue;//跳过防止崩溃 continue;//跳过防止崩溃
} }
@@ -1804,18 +1818,18 @@ int parse_ledger_update_xml(trigger_update_xml_t* trigger_update_xml)
//加载一个文件的内容到数据结构 //加载一个文件的内容到数据结构
if (!load_ledger_update_from_xml(trigger_update_xml, filename)) { if (!load_ledger_update_from_xml(trigger_update_xml, filename)) {
std::cout << "read /etc/ledgerupdate/" << filename << " success..." << std::endl; std::cout << "read /etc/ledgerupdate/" << filename << " success..." << std::endl;
DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER_UPDATE,"【WARN】前置的%s%d号进程 读取台账更新文件成功,开始更新台账", get_front_msg_from_subdir(), g_front_seg_index); DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER_UPDATE,"前置的%s%d号进程 读取台账更新文件成功,开始更新台账", get_front_msg_from_subdir(), g_front_seg_index);
} }
//处理过的文件删除掉 //处理过的文件删除掉
if (std::remove(filename.c_str()) != 0) { if (std::remove(filename.c_str()) != 0) {
std::cerr << "Failed to remove file: " << filename << " Error: " << strerror(errno) << std::endl; std::cerr << "Failed to remove file: " << filename << " Error: " << strerror(errno) << std::endl;
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER_UPDATE,"【ERROR】前置的%s%d号进程 删除已读取的台账更新文件失败!请检查台账更新文件是否残留在/FeProject/etc/ledgerupdate", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER_UPDATE,"前置的%s%d号进程 删除已读取的台账更新文件失败!请检查台账更新文件是否残留在/FeProject/etc/ledgerupdate", get_front_msg_from_subdir(), g_front_seg_index);
return APR_EGENERAL; return APR_EGENERAL;
} }
else{ else{
std::cout << "remove file: " << filename << " success..." << std::endl; std::cout << "remove file: " << filename << " success..." << std::endl;
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程 删除已读取的台账更新文件成功", get_front_msg_from_subdir(), g_front_seg_index); DIY_INFOLOG("process","前置的%s%d号进程 删除已读取的台账更新文件成功", get_front_msg_from_subdir(), g_front_seg_index);
} }
} }
} }
@@ -1995,7 +2009,7 @@ int parse_3s_xml(trigger_3s_xml_t* trigger_3s_xml)
printf("/etc/trigger3s/*.xml success...\n"); printf("/etc/trigger3s/*.xml success...\n");
DIY_INFOLOG("process","【WARN】前置读取实时数据触发文件成功,即将注册实时数据报告"); DIY_INFOLOG("process","前置读取实时数据触发文件成功,即将注册实时数据报告");
return APR_SUCCESS; return APR_SUCCESS;
} }
@@ -2308,7 +2322,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, char* id)
QDir dir(cfg_dir); QDir dir(cfg_dir);
if (!dir.exists()) { if (!dir.exists()) {
qDebug() << "folder does not exist!"; qDebug() << "folder does not exist!";
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法解析补招文件,补招文件路径/FeProject/etc/recall/不存在", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"前置的%s%d号进程 无法解析补招文件,补招文件路径/FeProject/etc/recall/不存在", get_front_msg_from_subdir(), g_front_seg_index);
return false; return false;
} }
//指定文件后缀名,可指定多种类型 //指定文件后缀名,可指定多种类型
@@ -2324,7 +2338,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, char* id)
if (!file.open(QIODevice::ReadOnly)) if (!file.open(QIODevice::ReadOnly))
{ {
qDebug() << "file.open error"; qDebug() << "file.open error";
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法打开补招文件%s", get_front_msg_from_subdir(), g_front_seg_index,qstrRecallPath.toStdString().c_str()); DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"前置的%s%d号进程 无法打开补招文件%s", get_front_msg_from_subdir(), g_front_seg_index,qstrRecallPath.toStdString().c_str());
continue; //以只读方式打开 continue; //以只读方式打开
} }
bool ret = doc.setContent(&file); bool ret = doc.setContent(&file);
@@ -2332,7 +2346,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, char* id)
if (!ret) if (!ret)
{ {
qDebug() << "doc.setContent error"; qDebug() << "doc.setContent error";
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法解析补招文件%s,补招内容无效", get_front_msg_from_subdir(), g_front_seg_index,qstrRecallPath.toStdString().c_str()); DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"前置的%s%d号进程 无法解析补招文件%s,补招内容无效", get_front_msg_from_subdir(), g_front_seg_index,qstrRecallPath.toStdString().c_str());
continue; continue;
} }
//将文件内容读到doc中 //将文件内容读到doc中
@@ -2910,7 +2924,7 @@ void DeletcRecallXml() {
QDir dir(cfg_dir); QDir dir(cfg_dir);
if (!dir.exists()) { if (!dir.exists()) {
qDebug() << "folder does not exist!"; qDebug() << "folder does not exist!";
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 删除旧的补招文件失败,补招文件路径/FeProject/etc/recall/不存在", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"前置的%s%d号进程 删除旧的补招文件失败,补招文件路径/FeProject/etc/recall/不存在", get_front_msg_from_subdir(), g_front_seg_index);
return; return;
} }
QStringList filter(file_name); QStringList filter(file_name);
@@ -2925,7 +2939,7 @@ void DeletcRecallXml() {
if (fileInfo.lastModified() < saveDaysAgo) { if (fileInfo.lastModified() < saveDaysAgo) {
QFile::remove(fileInfo.absoluteFilePath()); QFile::remove(fileInfo.absoluteFilePath());
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程 删除超过两天的补招文件", get_front_msg_from_subdir(), g_front_seg_index); DIY_INFOLOG("process","前置的%s%d号进程 删除超过两天的补招文件", get_front_msg_from_subdir(), g_front_seg_index);
} }
} }
@@ -2942,7 +2956,7 @@ void CreateRecallXml()
{ {
printf("insert ID_CJournalRecall_Map\n"); printf("insert ID_CJournalRecall_Map\n");
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程 开始写入补招文件", get_front_msg_from_subdir(), g_front_seg_index); DIY_INFOLOG("process","前置的%s%d号进程 开始写入补招文件", get_front_msg_from_subdir(), g_front_seg_index);
QMap<QString, QList<CJournalRecall> > ID_CJournalRecall_Map; QMap<QString, QList<CJournalRecall> > ID_CJournalRecall_Map;
@@ -2975,7 +2989,7 @@ void CreateRecallXml()
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
printf("补招查询完成,打开%s失败,无法写入线路补招配置!\n", qstrRecallPath.toAscii().data()); printf("补招查询完成,打开%s失败,无法写入线路补招配置!\n", qstrRecallPath.toAscii().data());
DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"【ERROR】前置的%s%d号进程 无法将补招文件写入补招文件路径/FeProject/etc/recall/", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_RECALL,"前置的%s%d号进程 无法将补招文件写入补招文件路径/FeProject/etc/recall/", get_front_msg_from_subdir(), g_front_seg_index);
QMap<QString, QList<CJournalRecall> >().swap(ID_CJournalRecall_Map); QMap<QString, QList<CJournalRecall> >().swap(ID_CJournalRecall_Map);
return; return;
@@ -3703,14 +3717,14 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
// 参数验证 // 参数验证
if (num <= 0) { if (num <= 0) {
std::cerr << "Error: 'num' must be greater than 0." << std::endl; std::cerr << "Error: 'num' must be greater than 0." << std::endl;
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置的多进程最大进程号为:%d,应该为大于0的整数",num); DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"前置的多进程最大进程号为:%d,应该为大于0的整数",num);
return 1; // 返回适当的错误码 return 1; // 返回适当的错误码
} }
index = index - 1; index = index - 1;
if (index < 0 || index >= num) { if (index < 0 || index >= num) {
std::cerr << "Error: 'index' must be in the range [0, num]." << std::endl; std::cerr << "Error: 'index' must be in the range [0, num]." << std::endl;
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置当前进程的进程号为:%d,应该为0到最大进程号范围内的整数",index); DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"前置当前进程的进程号为:%d,应该为0到最大进程号范围内的整数",index);
return 1; // 返回适当的错误码 return 1; // 返回适当的错误码
} }
} }
@@ -3718,7 +3732,7 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
// 获取参数 // 获取参数
if (codes.empty()) { if (codes.empty()) {
std::cerr << "Error: 'codes' vector is empty." << std::endl; std::cerr << "Error: 'codes' vector is empty." << std::endl;
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置的%s%d号进程调用web台账接口的入参为空",get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"前置的%s%d号进程调用web台账接口的入参为空",get_front_msg_from_subdir(), g_front_seg_index);
return 1; return 1;
} }
@@ -3838,7 +3852,7 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
} }
} }
std::cerr << "data 无效或为空数组,重试" << std::endl; std::cerr << "data 无效或为空数组,重试" << std::endl;
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置从web接口中获取的台账信息为空或者无效信息无法解析,请核对前置使用的入参信息:%s",parm.c_str()); DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"前置从web接口中获取的台账信息为空或者无效信息无法解析,请核对前置使用的入参信息:%s",parm.c_str());
} }
} }
@@ -3880,7 +3894,7 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
break; // 本地台账解析成功且数组非空 break; // 本地台账解析成功且数组非空
} }
} }
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置从本地台账中获取的台账信息为空或者无效信息无法解析,请核对前置使用的入参信息:%s",parm.c_str()); DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"前置从本地台账中获取的台账信息为空或者无效信息无法解析,请核对前置使用的入参信息:%s",parm.c_str());
} }
free(ledger); // root==null释放内容 free(ledger); // root==null释放内容
@@ -4113,7 +4127,7 @@ int parse_device_cfg_web()
std::cout << "input_jstr: " << input_jstr << std::endl; // 输出结果 std::cout << "input_jstr: " << input_jstr << std::endl; // 输出结果
DIY_DEBUGLOG("process","【DEBUG】前置的%s%d号进程调用web接口获取台账使用的请求输入为:%s",get_front_msg_from_subdir(), g_front_seg_index,input_jstr); DIY_DEBUGLOG("process","前置的%s%d号进程调用web接口获取台账使用的请求输入为:%s",get_front_msg_from_subdir(), g_front_seg_index,input_jstr);
codes.push_back(input_jstr); //是否需要筛选状态直接在配置文件控制 codes.push_back(input_jstr); //是否需要筛选状态直接在配置文件控制
@@ -4148,13 +4162,13 @@ int parse_device_cfg_web()
//判断是否相等 //判断是否相等
if(max_process_num != max_index){ if(max_process_num != max_index){
if(max_process_num > 0 && max_process_num < 10){ if(max_process_num > 0 && max_process_num < 10){
DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER,"【WARN】前置比对台账获取的进程数:%d和本地配置的进程数:%d,不匹配,按照台账进程数重置前置的进程数量",max_process_num,max_index); DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER,"前置比对台账获取的进程数:%d和本地配置的进程数:%d,不匹配,按照台账进程数重置前置的进程数量",max_process_num,max_index);
// 调用执行脚本函数 // 调用执行脚本函数
close_listening_socket(); close_listening_socket();
execute_bash("reset", max_process_num, "all"); execute_bash("reset", max_process_num, "all");
} }
else{ else{
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置从台账获取的进程数:%d不符合范围1~9,按照本地配置进程数启动进程",max_process_num); DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"前置从台账获取的进程数:%d不符合范围1~9,按照本地配置进程数启动进程",max_process_num);
} }
} }
} }
@@ -4163,7 +4177,7 @@ int parse_device_cfg_web()
std::cout << "terminal_ledger_num:" << count_cfg << std::endl; std::cout << "terminal_ledger_num:" << count_cfg << std::endl;
DIY_DEBUGLOG("process","【DEBUG】前置的%s%d号进程调用获取到的台账的数量为:%d",get_front_msg_from_subdir(), g_front_seg_index,count_cfg); DIY_DEBUGLOG("process","前置的%s%d号进程调用获取到的台账的数量为:%d",get_front_msg_from_subdir(), g_front_seg_index,count_cfg);
//如果当前进程获取的台账为0按照配置数量申请空间台账内容为空 //如果当前进程获取的台账为0按照配置数量申请空间台账内容为空
g_node->n_clients = count_cfg; g_node->n_clients = count_cfg;
@@ -4178,11 +4192,11 @@ int parse_device_cfg_web()
//添加提示 //添加提示
std::cout << "!!!!!!!!!!single process can not add any ledger unless reboot!!!!!!!"<< std::endl; std::cout << "!!!!!!!!!!single process can not add any ledger unless reboot!!!!!!!"<< std::endl;
DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER,"【WARN】前置的%s%d号进程获取到的台账的数量大于配置文件中给单个进程配置的台账数量:%d,这个进程将按照获取到的台账的数量来创建台账空间,这个进程不能直接通过台账添加来新增台账,只能通过重启进程或者先删除已有台账再添加台账的方式来添加新台账",get_front_msg_from_subdir(), g_front_seg_index,IED_COUNT); DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER,"前置的%s%d号进程获取到的台账的数量大于配置文件中给单个进程配置的台账数量:%d,这个进程将按照获取到的台账的数量来创建台账空间,这个进程不能直接通过台账添加来新增台账,只能通过重启进程或者先删除已有台账再添加台账的方式来添加新台账",get_front_msg_from_subdir(), g_front_seg_index,IED_COUNT);
} }
else{ else{
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, IED_COUNT * sizeof(ied_t*));//g_node->clients 这块大内存空间存储了 count_cfg 个 ied_t* 类型的指针(即一个指针数组)这是(指向内存块的指针)的指针数组 g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, IED_COUNT * sizeof(ied_t*));//g_node->clients 这块大内存空间存储了 count_cfg 个 ied_t* 类型的指针(即一个指针数组)这是(指向内存块的指针)的指针数组
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程根据配置文件中给单个进程配置的台账数量:%d来创建台账空间",get_front_msg_from_subdir(), g_front_seg_index,IED_COUNT); DIY_INFOLOG("process","前置的%s%d号进程根据配置文件中给单个进程配置的台账数量:%d来创建台账空间",get_front_msg_from_subdir(), g_front_seg_index,IED_COUNT);
} }
//把ied放入数组 //把ied放入数组
@@ -4459,7 +4473,7 @@ int parse_device_cfg_web()
isdelta_flag = 1; //存在一个监测点为角型接线则这个前置就要启动第二个配置列表 isdelta_flag = 1; //存在一个监测点为角型接线则这个前置就要启动第二个配置列表
cout << "monitor_id" << monitor_id << "v_wiring_type:" << line_info.v_wiring_type << "is delta wiring:" << isdelta_flag << endl; cout << "monitor_id" << monitor_id << "v_wiring_type:" << line_info.v_wiring_type << "is delta wiring:" << isdelta_flag << endl;
DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER,"【WARN】前置连接的监测点 %s 是角形接线,对应终端为%s 终端类型是%s",line_info.mp_id,ied_usr->terminal_id,ied_usr->dev_type); DIY_WARNLOG_CODE("process",LOG_CODE_LEDGER,"前置连接的监测点 %s 是角形接线,对应终端为%s 终端类型是%s",line_info.mp_id,ied_usr->terminal_id,ied_usr->dev_type);
} }
strcpy(line_info.monitor_status, monitor_status); strcpy(line_info.monitor_status, monitor_status);
@@ -4533,10 +4547,10 @@ int parse_device_cfg_web()
cout << "dev init create count:" << count_real; cout << "dev init create count:" << count_real;
return APR_SUCCESS; return APR_SUCCESS;
} }
catch (otl_exception& e) catch (...)
{ {
printf("\n device error,ERROR code= %d,msg= %s \n", e.code, e.msg); printf("\n device ledger error \n");
return e.code; return 1;
} }
} }
@@ -4690,7 +4704,7 @@ int parse_model_cfg_web()
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
if(parse_model_web(&icd_model_map,codes)){ if(parse_model_web(&icd_model_map,codes)){
DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置的%s%d号进程 icd模型接口异常,将使用默认的icd模型,请检查接口配置", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"前置的%s%d号进程 icd模型接口异常,将使用默认的icd模型,请检查接口配置", get_front_msg_from_subdir(), g_front_seg_index);
return APR_SUCCESS; //可以使用默认的映射文件所以返回正常 return APR_SUCCESS; //可以使用默认的映射文件所以返回正常
} }
@@ -4727,10 +4741,10 @@ int parse_model_cfg_web()
delete_icd_model_map(icd_model_map); delete_icd_model_map(icd_model_map);
return APR_SUCCESS; return APR_SUCCESS;
} }
catch (otl_exception& e) catch (...)
{ {
printf("\n icd model error,ERROR code= %d,msg= %s \n", e.code, e.msg); printf("\n icd model error \n");
return e.code; return 1;
} }
} }
////////////////////////////////////////////////////////////icd模型重构函数lnk20250116 ////////////////////////////////////////////////////////////icd模型重构函数lnk20250116
@@ -4798,9 +4812,9 @@ char* parse_model_cfg_web_one(ied_t* ied, char* out_model)
delete_icd_model_map(icd_model_map);//lnk20250701 delete_icd_model_map(icd_model_map);//lnk20250701
return NULL; return NULL;
} }
catch (otl_exception& e) catch (...)
{ {
printf("\n icd model error,ERROR code= %d,msg= %s \n", e.code, e.msg); printf("\n icd model one error \n");
return NULL; return NULL;
} }
} }
@@ -4951,7 +4965,7 @@ int recall_json_handle(const char* jstr)
if(strcmp(ied_usr->LD_info[m].mp_id,monitorId.toStdString().c_str()) == 0){//匹配上了 if(strcmp(ied_usr->LD_info[m].mp_id,monitorId.toStdString().c_str()) == 0){//匹配上了
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程处理监测点%s -id:%s 的数据补招",get_front_msg_from_subdir(), g_front_seg_index,ied_usr->LD_info[m].name,ied_usr->LD_info[m].mp_id); DIY_INFOLOG("process","前置的%s%d号进程处理监测点%s -id:%s 的数据补招",get_front_msg_from_subdir(), g_front_seg_index,ied_usr->LD_info[m].name,ied_usr->LD_info[m].mp_id);
mppair = 1; mppair = 1;
break;//找到就退出监测点循环 break;//找到就退出监测点循环
} }
@@ -5174,7 +5188,7 @@ void handleUploadResponse(const std::string& response, char* wavepath) {
cJSON* json_data = cJSON_Parse(response.c_str()); cJSON* json_data = cJSON_Parse(response.c_str());
if (json_data == nullptr) { if (json_data == nullptr) {
std::cerr << "Error parsing response: " << cJSON_GetErrorPtr() << std::endl; std::cerr << "Error parsing response: " << cJSON_GetErrorPtr() << std::endl;
DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传暂态录波文件失败,web返回的消息错误无法解析"); DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"前置上传暂态录波文件失败,web返回的消息错误无法解析");
return; return;
} }
@@ -5220,11 +5234,11 @@ void handleUploadResponse(const std::string& response, char* wavepath) {
std::cout << "wavepath: " << wavepath << std::endl; std::cout << "wavepath: " << wavepath << std::endl;
DIY_INFOLOG("process","【NORMAL】前置上传暂态录波文件成功,远端文件名:%s",wavepath); DIY_INFOLOG("process","前置上传暂态录波文件成功,远端文件名:%s",wavepath);
} }
} else { } else {
std::cerr << "Error: Missing expected fields in JSON response." << std::endl; std::cerr << "Error: Missing expected fields in JSON response." << std::endl;
DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传暂态录波文件失败,web返回的消息没有远端文件名"); DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"前置上传暂态录波文件失败,web返回的消息没有远端文件名");
} }
// 释放 JSON 对象 // 释放 JSON 对象
@@ -5341,7 +5355,7 @@ void SendFileWeb(const std::string& strUrl, const char* localpath, const char* c
CURLcode res = curl_easy_perform(curl); CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) { if (res != CURLE_OK) {
std::cerr << "http web failed: " << curl_easy_strerror(res) << std::endl; std::cerr << "http web failed: " << curl_easy_strerror(res) << std::endl;
DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传暂态录波文件 %s 失败,请检查文件上传接口配置",localpath); DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"前置上传暂态录波文件 %s 失败,请检查文件上传接口配置",localpath);
} else { } else {
std::cout << "http web success, response: " << resPost0 << std::endl; std::cout << "http web success, response: " << resPost0 << std::endl;
handleUploadResponse(resPost0, wavepath); // 处理响应 handleUploadResponse(resPost0, wavepath); // 处理响应
@@ -5860,7 +5874,7 @@ int parse_rpt_log_ini_one(ied_t* ied)
//添加判断有的监测点没有cpuno为2直接申请了LD_info[2-1]没申请LD_info[0] //添加判断有的监测点没有cpuno为2直接申请了LD_info[2-1]没申请LD_info[0]
if(ied_usr->LD_info[cpuno].LD_name == NULL){ if(ied_usr->LD_info[cpuno].LD_name == NULL){
printf("this ld_info didn't palloc space ,maybe this ledger has problem!"); printf("this ld_info didn't palloc space ,maybe this ledger has problem!");
DIY_ERRORLOG_CODE("process",LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1); DIY_ERRORLOG_CODE("process",LOG_CODE_RPTINIT,"终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1);
continue;//跳过防止崩溃 continue;//跳过防止崩溃
} }

View File

@@ -340,7 +340,7 @@ void init_loggers_bydevid(const char* dev_id)
logger_map[device_key_c] = TypedLogger(device_logger_c, LOGTYPE_COM); logger_map[device_key_c] = TypedLogger(device_logger_c, LOGTYPE_COM);
logger_map[device_key_d] = TypedLogger(device_logger_d, LOGTYPE_DATA); logger_map[device_key_d] = TypedLogger(device_logger_d, LOGTYPE_DATA);
DIY_INFOLOG(device_key_d.c_str(),"【NORMAL】终端id:%s终端级日志初始化完毕", ied_usr->terminal_id); DIY_INFOLOG(device_key_d.c_str(),"终端id:%s终端级日志初始化完毕", ied_usr->terminal_id);
} }
// 初始化监测点 // 初始化监测点
@@ -369,7 +369,7 @@ void init_loggers_bydevid(const char* dev_id)
logger_map[mon_key_c.str()] = TypedLogger(mon_logger_c, LOGTYPE_COM); logger_map[mon_key_c.str()] = TypedLogger(mon_logger_c, LOGTYPE_COM);
logger_map[mon_key_d.str()] = TypedLogger(mon_logger_d, LOGTYPE_DATA); logger_map[mon_key_d.str()] = TypedLogger(mon_logger_d, LOGTYPE_DATA);
DIY_INFOLOG(mon_key_d.str().c_str(),"【NORMAL】监测点:%s - id:%s监测点级日志初始化完毕", ied_usr->LD_info[i].name,ied_usr->LD_info[i].mp_id); DIY_INFOLOG(mon_key_d.str().c_str(),"监测点:%s - id:%s监测点级日志初始化完毕", ied_usr->LD_info[i].name,ied_usr->LD_info[i].mp_id);
} }
} }
@@ -418,7 +418,7 @@ void init_loggers() {
logger_map[device_key_c] = TypedLogger(device_logger_c, LOGTYPE_COM); logger_map[device_key_c] = TypedLogger(device_logger_c, LOGTYPE_COM);
logger_map[device_key_d] = TypedLogger(device_logger_d, LOGTYPE_DATA); logger_map[device_key_d] = TypedLogger(device_logger_d, LOGTYPE_DATA);
DIY_INFOLOG(device_key_d.c_str(),"【NORMAL】终端id:%s终端级日志初始化完毕", ied_usr->terminal_id); DIY_INFOLOG(device_key_d.c_str(),"终端id:%s终端级日志初始化完毕", ied_usr->terminal_id);
// 初始化监测点 // 初始化监测点
// 监测点 logger 名称格式monitor.<mp_id>.COM / .DATA // 监测点 logger 名称格式monitor.<mp_id>.COM / .DATA
@@ -443,7 +443,7 @@ void init_loggers() {
logger_map[mon_key_c.str()] = TypedLogger(mon_logger_c, LOGTYPE_COM); logger_map[mon_key_c.str()] = TypedLogger(mon_logger_c, LOGTYPE_COM);
logger_map[mon_key_d.str()] = TypedLogger(mon_logger_d, LOGTYPE_DATA); logger_map[mon_key_d.str()] = TypedLogger(mon_logger_d, LOGTYPE_DATA);
DIY_INFOLOG(mon_key_d.str().c_str(),"【NORMAL】监测点:%s - id:%s监测点级日志初始化完毕", ied_usr->LD_info[i].name,ied_usr->LD_info[i].mp_id); DIY_INFOLOG(mon_key_d.str().c_str(),"监测点:%s - id:%s监测点级日志初始化完毕", ied_usr->LD_info[i].name,ied_usr->LD_info[i].mp_id);
} }

View File

@@ -174,6 +174,7 @@ void SendWebAPI_Nacos_Ptr(const string strUrl, const char* code, char** ptr)
strcpy(*ptr, resPost0.c_str()); strcpy(*ptr, resPost0.c_str());
} }
else { else {
printf("Memory allocation failed!\n"); printf("Memory allocation failed!\n");
} }
} }

View File

@@ -40,7 +40,7 @@ void get_object_to_file();
void get_object_to_file_new(char* File_Name, char* savepath); void get_object_to_file_new(char* File_Name, char* savepath);
void delete_object(); void delete_object();
void delete_object_new(char* File_Name); void delete_object_new(char* File_Name);
#if 0
void TestOSS() void TestOSS()
{ {
apr_file_t *output = NULL; apr_file_t *output = NULL;
@@ -136,7 +136,7 @@ void DelOSS(char* File_Name)
return; return;
} }
#endif
void coutTest() void coutTest()
{ {
std:: cout << "OSS_ENDPOINT:" << OSS_ENDPOINT << std::endl; std:: cout << "OSS_ENDPOINT:" << OSS_ENDPOINT << std::endl;

View File

@@ -33,9 +33,6 @@ extern std::string WEB_EVENT;
extern std::string WEB_FILEDOWNLOAD; extern std::string WEB_FILEDOWNLOAD;
extern std::string G_CONNECT_TOPIC; extern std::string G_CONNECT_TOPIC;
//lnk20250115添加台账锁
extern pthread_mutex_t mtx;
bool DEBUGOPEN = 0; bool DEBUGOPEN = 0;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -59,10 +56,7 @@ public:
int nDataType; //告警SOE事件类型 int nDataType; //告警SOE事件类型
QString type; //参数等级type类型0-DataType 1-监测点 2-剔除标记 3-发生时刻,毫秒 4-数据链表 5-相位 6-值索引 9-实时SOE事件 QString type; //参数等级type类型0-DataType 1-监测点 2-剔除标记 3-发生时刻,毫秒 4-数据链表 5-相位 6-值索引 9-实时SOE事件
QString triggerFlag; //告警SOE事件触发指标名称 QString triggerFlag; //告警SOE事件触发指标名称
int nIndex; //数据在每条线路LineInfo值数组中的位置 int nIndex; //数据在每条线路LineInfo值数组中的位置
QString desc; //soe事件描述
QString DO; //数据对象名 QString DO; //数据对象名
QString DA; //数据属性名 QString DA; //数据属性名
QString strFullName; //数据对象名 $ 数据属性名 QString strFullName; //数据对象名 $ 数据属性名
@@ -151,8 +145,7 @@ public:
QString WavePhasicA; QString WavePhasicA;
QString WavePhasicB; QString WavePhasicB;
QString WavePhasicC; QString WavePhasicC;
QString TypeOfData; //闪变和统计是否合并 0-分开 1-合并 QString UnitOfTimeUnit; //暂态事件持续事件单位0 - 毫秒 1 - 秒
QString UnitOfTimeUnit; //暂态事件持续事件单位0 - 毫秒 1 - 秒 lnk20260127
QString ValueOfTimeUnit; //上送值的时间UTC-UTC时间 beijing-北京时间 QString ValueOfTimeUnit; //上送值的时间UTC-UTC时间 beijing-北京时间
QString WaveTimeFlag; //录波文件的时间UTC-UTC时间 beijing-北京时间 QString WaveTimeFlag; //录波文件的时间UTC-UTC时间 beijing-北京时间
QString IEDname; //例PQMonitor QString IEDname; //例PQMonitor
@@ -251,8 +244,6 @@ bool get_xml_config_by_dev_type(const char* dev_type, XmlConfigC* out_cfg) {
return false; return false;
} }
memset(out_cfg, 0, sizeof(*out_cfg));
QString dev_type_q = QString::fromUtf8(dev_type); QString dev_type_q = QString::fromUtf8(dev_type);
QMap<QString, Xmldata*>::iterator it = xmlinfo_list.find(dev_type_q); QMap<QString, Xmldata*>::iterator it = xmlinfo_list.find(dev_type_q);
if (it == xmlinfo_list.end() || it.value() == nullptr) { if (it == xmlinfo_list.end() || it.value() == nullptr) {
@@ -268,7 +259,6 @@ bool get_xml_config_by_dev_type(const char* dev_type, XmlConfigC* out_cfg) {
strncpy(out_cfg->WavePhasicB, cfg.WavePhasicB.toUtf8().constData(), sizeof(out_cfg->WavePhasicB) - 1); strncpy(out_cfg->WavePhasicB, cfg.WavePhasicB.toUtf8().constData(), sizeof(out_cfg->WavePhasicB) - 1);
strncpy(out_cfg->WavePhasicC, cfg.WavePhasicC.toUtf8().constData(), sizeof(out_cfg->WavePhasicC) - 1); strncpy(out_cfg->WavePhasicC, cfg.WavePhasicC.toUtf8().constData(), sizeof(out_cfg->WavePhasicC) - 1);
strncpy(out_cfg->UnitOfTimeUnit, cfg.UnitOfTimeUnit.toUtf8().constData(), sizeof(out_cfg->UnitOfTimeUnit) - 1); strncpy(out_cfg->UnitOfTimeUnit, cfg.UnitOfTimeUnit.toUtf8().constData(), sizeof(out_cfg->UnitOfTimeUnit) - 1);
strncpy(out_cfg->TypeOfData, cfg.TypeOfData.toUtf8().constData(), sizeof(out_cfg->TypeOfData) - 1); out_cfg->TypeOfData[sizeof(out_cfg->TypeOfData) - 1] = '\0';//lnk20260127
strncpy(out_cfg->ValueOfTimeUnit, cfg.ValueOfTimeUnit.toUtf8().constData(),sizeof(out_cfg->ValueOfTimeUnit) - 1); strncpy(out_cfg->ValueOfTimeUnit, cfg.ValueOfTimeUnit.toUtf8().constData(),sizeof(out_cfg->ValueOfTimeUnit) - 1);
strncpy(out_cfg->WaveTimeFlag, cfg.WaveTimeFlag.toUtf8().constData(), sizeof(out_cfg->WaveTimeFlag) - 1); strncpy(out_cfg->WaveTimeFlag, cfg.WaveTimeFlag.toUtf8().constData(), sizeof(out_cfg->WaveTimeFlag) - 1);
strncpy(out_cfg->IEDname, cfg.IEDname.toUtf8().constData(), sizeof(out_cfg->IEDname) - 1); strncpy(out_cfg->IEDname, cfg.IEDname.toUtf8().constData(), sizeof(out_cfg->IEDname) - 1);
@@ -875,7 +865,6 @@ bool ParseXMLConfig2(int xml_flag, XmlConfig *cfg, list<CTopic*> *ctopiclist,QSt
{ {
CEventData* ed = new CEventData(); //SOE事件类指针 CEventData* ed = new CEventData(); //SOE事件类指针
ed->triggerFlag = node.toElement().attribute("name"); //SOE名称 ed->triggerFlag = node.toElement().attribute("name"); //SOE名称
ed->desc = node.toElement().attribute("desc"); //SOE描述
ed->DO = node.toElement().attribute("DO"); //数据对象名 ed->DO = node.toElement().attribute("DO"); //数据对象名
ed->DA = node.toElement().attribute("DA"); //数据属性名 ed->DA = node.toElement().attribute("DA"); //数据属性名
ed->type = node.toElement().attribute("type"); //参数等级type类型0-DataType 1-监测点 2-剔除标记 3-发生时刻,毫秒 4-数据链表 5-相位 6-值索引 9-实时SOE事件 ed->type = node.toElement().attribute("type"); //参数等级type类型0-DataType 1-监测点 2-剔除标记 3-发生时刻,毫秒 4-数据链表 5-相位 6-值索引 9-实时SOE事件
@@ -909,11 +898,6 @@ bool ParseXMLConfig2(int xml_flag, XmlConfig *cfg, list<CTopic*> *ctopiclist,QSt
{ {
cfg->UnitOfTimeUnit.append(e.attribute("Unit")); cfg->UnitOfTimeUnit.append(e.attribute("Unit"));
} }
//lnk 20260127
if ("TypeOfData" == strTag)
{
cfg->TypeOfData.append(e.attribute("Unit"));
}
if ("ValueOfTime" == strTag) if ("ValueOfTime" == strTag)
{ {
cfg->ValueOfTimeUnit.append(e.attribute("Unit")); cfg->ValueOfTimeUnit.append(e.attribute("Unit"));
@@ -1045,46 +1029,9 @@ void printCTopicList(const std::list<CTopic*>& ctopic_list) {
} }
} }
// ===== DEBUG 打印: mms_str_map (属性名 -> 值) =====
static void print_mms_str_map(const json_block_data* data)
{
if (!data) {
std::cout << "[DBG] json_block_data is NULL\n";
return;
}
std::cout << "\n========== [DBG] json_block_data.mms_str_map ==========\n";
std::cout << "[DBG] monitorId=" << data->monitorId
<< " func_type=" << data->func_type
<< " flag=" << data->flag
<< " time(ms)=" << data->time
<< " voltage_level=" << data->voltage_level
<< "\n";
std::cout << "[DBG] mp_id=" << data->mp_id.toStdString()
<< " dev_type=" << data->dev_type.toStdString()
<< "\n";
std::cout << "[DBG] mms_str_map size=" << data->mms_str_map.size() << "\n";
// Qt4/Qt5 都稳QMapIterator
QMapIterator<QString, double> it(data->mms_str_map);
while (it.hasNext()) {
it.next();
std::cout << " " << it.key().toStdString() << " = " << it.value() << "\n";
}
std::cout << "======================================================\n\n";
}
//20250214添加角型接线处理 //20250214添加角型接线处理
int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json生成函数 zw修改 2023-8-11 调整传送json结构 目前仅限历史稳态数据 int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json生成函数 zw修改 2023-8-11 调整传送json结构 目前仅限历史稳态数据
{ {
// 刚进函数就打印 mms_str_map
if (DEBUGOPEN) {
print_mms_str_map(data);
}
list<CTopic*> ctopic_list; list<CTopic*> ctopic_list;
////lnk2024-8-15 区分星型,角型接线 ////lnk2024-8-15 区分星型,角型接线
@@ -1107,7 +1054,7 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
cout << "transfer_json_block_data contain data->dev_type" << endl; cout << "transfer_json_block_data contain data->dev_type" << endl;
ctopic_list = xmlinfo_list2[data->dev_type]->topicList; ctopic_list = xmlinfo_list2[data->dev_type]->topicList;
if(DEBUGOPEN)printCTopicList(ctopic_list);
} }
else { else {
cout << "transfer_json_block_data not contain data->dev_type:" << data->dev_type.toStdString() << " !!!!"<< endl; cout << "transfer_json_block_data not contain data->dev_type:" << data->dev_type.toStdString() << " !!!!"<< endl;
@@ -1116,43 +1063,6 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
} }
} }
if(DEBUGOPEN)printCTopicList(ctopic_list);
//lnk20260127 添加数据类型区分
bool typeofdata = false;
bool data_have_static = data->data_have_statistic;
QString devType = data->dev_type;
QByteArray devTypeBytes = devType.toUtf8();
const char* dev_type_cstr = devTypeBytes.constData();
qDebug() << "[DBG] devType (QString) =" << devType;
qDebug() << "[DBG] devType length =" << devType.length();
qDebug() << "[DBG] devTypeBytes =" << devTypeBytes;
qDebug() << "[DBG] devTypeBytes size =" << devTypeBytes.size();
printf("[DBG] dev_type_cstr = '%s'\n", dev_type_cstr);
XmlConfigC cfg1;
if (get_xml_config_by_dev_type(dev_type_cstr, &cfg1)) {
printf("========== XmlConfigC dump ==========\n");
printf("WavePhasicFlag = '%s'\n", cfg1.WavePhasicFlag);
printf("WavePhasicA = '%s'\n", cfg1.WavePhasicA);
printf("WavePhasicB = '%s'\n", cfg1.WavePhasicB);
printf("WavePhasicC = '%s'\n", cfg1.WavePhasicC);
printf("UnitOfTimeUnit = '%s'\n", cfg1.UnitOfTimeUnit);
printf("TypeOfData = '%s'\n", cfg1.TypeOfData);
printf("ValueOfTimeUnit = '%s'\n", cfg1.ValueOfTimeUnit);
printf("WaveTimeFlag = '%s'\n", cfg1.WaveTimeFlag);
printf("IEDname = '%s'\n", cfg1.IEDname);
printf("LDevicePrefix = '%s'\n", cfg1.LDevicePrefix);
printf("=====================================\n");
// 如果 TypeOfData == "1",则置 true
if (strcmp(cfg1.TypeOfData, "1") == 0) {
typeofdata = true;
}
} else {
printf("not find this dev_type\n");
}
bool shortjumpflag = false; bool shortjumpflag = false;
bool longjumpflag = false; bool longjumpflag = false;
@@ -1426,16 +1336,11 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
kafka_data_list_mutex.unlock(); //解锁 kafka_data_list_mutex.unlock(); //解锁
longjumpflag = true; longjumpflag = true;
} }
if (longjumpflag == true || shortjumpflag == true) {
//lnk20260127 return 1;
if (typeofdata == false || data_have_static == false) {//不合并则处理完闪变就不处理其他数据,如果有统计数据或者数据类型区分了就继续处理其他数据 }
if (longjumpflag == true || shortjumpflag == true) {
return 1;
}
}
} //②-②历史闪变数据解析结束!-------------------------------- } //②-②历史闪变数据解析结束!--------------------------------
//合并则继续处理其他数据
if (1 == pDataType->iDataType) //②-①历史稳态数据----------------------------------------------------------- if (1 == pDataType->iDataType) //②-①历史稳态数据-----------------------------------------------------------
{ {
Ckafka_data_t KafkaData; //kafka发送数据结构类对象 Ckafka_data_t KafkaData; //kafka发送数据结构类对象
@@ -2335,10 +2240,8 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
kafka_data_list_mutex.unlock(); //解锁 kafka_data_list_mutex.unlock(); //解锁
longjumpflag = true; longjumpflag = true;
} }
if (typeofdata == false || data_have_static == false) {//不合并则处理完闪变就不处理其他数据 if (longjumpflag == true || shortjumpflag == true) {
if (longjumpflag == true || shortjumpflag == true) { return 1;
return 1;
}
} }
//return 1; //结束该函数,停止后续代码执行 //return 1; //结束该函数,停止后续代码执行
} //②-②历史闪变数据解析结束!-------------------------------- } //②-②历史闪变数据解析结束!--------------------------------
@@ -2658,35 +2561,8 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
return 1; return 1;
} }
static void format_time_ms(long long ms, char* buf, size_t buf_len)
{
time_t sec = ms / 1000;
int milli = ms % 1000;
struct tm tm_time;
localtime_r(&sec, &tm_time); // 线程安全
snprintf(buf, buf_len,
"%04d-%02d-%02d %02d:%02d:%02d.%03d",
tm_time.tm_year + 1900,
tm_time.tm_mon + 1,
tm_time.tm_mday,
tm_time.tm_hour,
tm_time.tm_min,
tm_time.tm_sec,
milli);
}
void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long time,char* devtype,int monitor_id) void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long time,char* devtype,int monitor_id)
{ {
//监测点日志的key,lnk20250526
char full_key_m_c[256]; // 分配足够空间
char full_key_m_d[256]; // 分配足够空间
snprintf(full_key_m_c, sizeof(full_key_m_c), "monitor.%s.COM", mp_id);
snprintf(full_key_m_d, sizeof(full_key_m_d), "monitor.%s.DATA", mp_id);
//监测点日志的key,lnk20250526
XmlConfig c_xmlcfg; XmlConfig c_xmlcfg;
if (xmlinfo_list.contains(devtype)) { if (xmlinfo_list.contains(devtype)) {
c_xmlcfg = xmlinfo_list[devtype]->xmlcfg; c_xmlcfg = xmlinfo_list[devtype]->xmlcfg;
@@ -2718,28 +2594,6 @@ void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long ti
if (pEventData->strFullName.indexOf(Full_name) != -1) if (pEventData->strFullName.indexOf(Full_name) != -1)
{ {
KafkaData.strText.append(QString("\"%1\"").arg(pEventData->triggerFlag)); KafkaData.strText.append(QString("\"%1\"").arg(pEventData->triggerFlag));
//使用日志接口记录日志
char time_str[64];
format_time_ms(time, time_str, sizeof(time_str));
QByteArray descBa = pEventData->desc.toLocal8Bit();
pthread_mutex_lock(&mtx); std::cout << "ggio hold lock !!!!!!!!!!!" << std::endl;
const char* mp_name_raw = find_mp_name_from_mp_id(mp_id);
pthread_mutex_unlock(&mtx); std::cout << "ggio unlock lock !!!!!!!!!!!" << std::endl;
char mp_name[128];
if (mp_name_raw && mp_name_raw[0] != '\0') {
snprintf(mp_name, sizeof(mp_name), "%s", mp_name_raw);
} else {
snprintf(mp_name, sizeof(mp_name), "unknown");
}
DIY_WARNLOG_CODE(full_key_m_d, LOG_CODE_REPORT,
"监测点:%s(%s),在%s发生事件:%s,事件值:%.2f",
mp_name, mp_id, time_str, descBa.constData(), v);
break; break;
} }
} }
@@ -2752,7 +2606,6 @@ void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long ti
kafka_data_list_mutex.lock(); //加锁 kafka_data_list_mutex.lock(); //加锁
kafka_data_list.append(KafkaData); //添加 kafka发送链表 kafka_data_list.append(KafkaData); //添加 kafka发送链表
kafka_data_list_mutex.unlock(); //解锁 kafka_data_list_mutex.unlock(); //解锁
} }
//zw修改 2023-8-31 新增或更新list队列 写入xml数据库信息 模型编码 终端型号 终端厂家 oss存储路径 时间 //zw修改 2023-8-31 新增或更新list队列 写入xml数据库信息 模型编码 终端型号 终端厂家 oss存储路径 时间
@@ -2850,7 +2703,7 @@ void Set_xml_databaseinfo(char* MODEL_ID, char* TMNL_TYPE, char* FILE_PATH, char
cout << file_name << "!!!!!!!!!!!!!!!!!!!!!!!!!!" << save_name << endl; cout << file_name << "!!!!!!!!!!!!!!!!!!!!!!!!!!" << save_name << endl;
//mq日志 //mq日志
DIY_WARNLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"【WARN】前置获取到终端类型%s,该终端类型对应的映射文件为%s,映射文件将下载并保存在本地为%s",TMNL_TYPE,FILE_PATH,save_name); DIY_WARNLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"前置获取到终端类型%s,该终端类型对应的映射文件为%s,映射文件将下载并保存在本地为%s",TMNL_TYPE,FILE_PATH,save_name);
//20241028 lnk 替换为文件下载web接口 //20241028 lnk 替换为文件下载web接口
//构造文件下载接口参数 //构造文件下载接口参数
@@ -2884,7 +2737,7 @@ void Set_xml_databaseinfo(char* MODEL_ID, char* TMNL_TYPE, char* FILE_PATH, char
isErrorJson = true; isErrorJson = true;
std::cerr << "Error: Server returned empty file stream, code=A00555." << std::endl; std::cerr << "Error: Server returned empty file stream, code=A00555." << std::endl;
DIY_ERRORLOG_CODE("process", LOG_CODE_ICD_AND_DOWNLOAD, DIY_ERRORLOG_CODE("process", LOG_CODE_ICD_AND_DOWNLOAD,
"【ERROR】前置下载文件失败服务端返回A00555(文件流为空),文件=%s", "前置下载文件失败服务端返回A00555(文件流为空),文件=%s",
save_name); save_name);
} }
cJSON_Delete(root); cJSON_Delete(root);
@@ -2900,17 +2753,17 @@ void Set_xml_databaseinfo(char* MODEL_ID, char* TMNL_TYPE, char* FILE_PATH, char
outFile.close(); outFile.close();
std::cout << "File saved successfully!" << std::endl; std::cout << "File saved successfully!" << std::endl;
//mq日志 //mq日志
DIY_INFOLOG("process","【NORMAL】前置下载映射文件%s成功",save_name); DIY_INFOLOG("process","前置下载映射文件%s成功",save_name);
} else { } else {
std::cerr << "Error: Unable to open file for writing." << std::endl; std::cerr << "Error: Unable to open file for writing." << std::endl;
DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置写入本地映射文件%s失败",save_name); DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"前置写入本地映射文件%s失败",save_name);
} }
// 释放分配的内存 // 释放分配的内存
free(fileContent); free(fileContent);
} else { } else {
std::cerr << "Error: Unable to download file." << std::endl; std::cerr << "Error: Unable to download file." << std::endl;
DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置调用文件下载接口下载远端文件文件%s失败",FILE_PATH); DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"前置调用文件下载接口下载远端文件文件%s失败",FILE_PATH);
} }
} }
@@ -3241,7 +3094,7 @@ static bool writeJsonToFile(const char* filePath, const char* jsonString)
{ {
FILE* fp = fopen(filePath, "w"); FILE* fp = fopen(filePath, "w");
if (!fp) { if (!fp) {
//DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【ERROR】无法将暂态事件写入本地缓存"); //DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"无法将暂态事件写入本地缓存");
std::cerr << "Failed to write in file : " << filePath << std::endl; std::cerr << "Failed to write in file : " << filePath << std::endl;
return false; return false;
} }
@@ -3328,7 +3181,7 @@ static void scanAndResendOfflineFiles(const std::string &dirPath)
// 读取文件内容(即之前存的 JSON) // 读取文件内容(即之前存的 JSON)
FILE* fp = fopen(fileList[i].fileName.c_str(), "r"); FILE* fp = fopen(fileList[i].fileName.c_str(), "r");
if (!fp) { if (!fp) {
DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【ERROR】无法打开本地缓存的暂态事件"); DIY_ERRORLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"无法打开本地缓存的暂态事件");
std::cerr << " fail to open exsist file " << fileList[i].fileName << std::endl; std::cerr << " fail to open exsist file " << fileList[i].fileName << std::endl;
continue; continue;
} }
@@ -3356,12 +3209,12 @@ static void scanAndResendOfflineFiles(const std::string &dirPath)
// 表示有响应,则可视为成功;根据项目需要可加更精细的判断 // 表示有响应,则可视为成功;根据项目需要可加更精细的判断
handleCommentResponse(std::string(ptr)); handleCommentResponse(std::string(ptr));
DIY_WARNLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【WARN】前置重发暂态事件失败"); DIY_WARNLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"前置重发暂态事件失败");
} }
else{ else{
DIY_WARNLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"【WARN】前置重发暂态事件成功"); DIY_WARNLOG_CODE("process",LOG_CODE_TRANSIENT_COMM,"前置重发暂态事件成功");
std::cout << "old file send success,remove it" << std::endl; std::cout << "old file send success,remove it" << std::endl;
// 删除文件 // 删除文件
@@ -3471,7 +3324,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype)
if (j_r == NULL) { if (j_r == NULL) {
//mq日志 //mq日志
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"【ERROR】暂态接口响应异常,无法上送监测点%s的暂态事件",mp_id); DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"暂态接口响应异常,无法上送监测点%s的暂态事件",mp_id);
std::cout << "qvvr send fail ,store in local" << std::endl; std::cout << "qvvr send fail ,store in local" << std::endl;
// 1) 先检查/FeProject/dat/qvvr/目录文件大小是否超过 10M若超过则删除最老的一个文件 // 1) 先检查/FeProject/dat/qvvr/目录文件大小是否超过 10M若超过则删除最老的一个文件
@@ -3493,7 +3346,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype)
// 把 json_string 写入文件 // 把 json_string 写入文件
if(!writeJsonToFile(fileName.c_str(), json_string)){ if(!writeJsonToFile(fileName.c_str(), json_string)){
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"【ERROR】监测点:%s无法将暂态时间为%lld的暂态事件写入本地缓存",start_tm,mp_id); DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"监测点:%s无法将暂态时间为%lld的暂态事件写入本地缓存",start_tm,mp_id);
} }
checkAndRemoveOldestIfNeeded(qvvrDir, 10LL * 1024 * 1024); checkAndRemoveOldestIfNeeded(qvvrDir, 10LL * 1024 * 1024);
@@ -3521,7 +3374,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype)
std::cout << "Error: Received NULL response" << std::endl; std::cout << "Error: Received NULL response" << std::endl;
//mq日志 //mq日志
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"【ERROR】暂态接口无响应,无法上送监测点%s的暂态事件",mp_id); DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"暂态接口无响应,无法上送监测点%s的暂态事件",mp_id);
std::cout << "qvvr send fail ,store in local" << std::endl; std::cout << "qvvr send fail ,store in local" << std::endl;
// 1) 先检查/FeProject/dat/qvvr/目录文件大小是否超过 10M若超过则删除最老的一个文件 // 1) 先检查/FeProject/dat/qvvr/目录文件大小是否超过 10M若超过则删除最老的一个文件
@@ -3541,7 +3394,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype)
fileName += ".txt"; fileName += ".txt";
// 把 json_string 写入文件 // 把 json_string 写入文件
if(!writeJsonToFile(fileName.c_str(), json_string)){ if(!writeJsonToFile(fileName.c_str(), json_string)){
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"【ERROR】监测点:%s无法将暂态时间为%lld的暂态事件写入本地缓存",start_tm,mp_id); DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT_COMM,"监测点:%s无法将暂态时间为%lld的暂态事件写入本地缓存",start_tm,mp_id);
} }
checkAndRemoveOldestIfNeeded(qvvrDir, 10LL * 1024 * 1024); checkAndRemoveOldestIfNeeded(qvvrDir, 10LL * 1024 * 1024);

View File

@@ -38,8 +38,6 @@ public:
QString mp_id; //char型监测点 QString mp_id; //char型监测点
QString dev_type;//设备类型 QString dev_type;//设备类型
bool data_have_statistic;//是否有统计数据0没有1有
QMap<QString, double> mms_str_map; //数据值(61850数据属性名, 数据值) QMap<QString, double> mms_str_map; //数据值(61850数据属性名, 数据值)
}; };

View File

@@ -1530,63 +1530,63 @@ int parse_control(const std::string& json_str, const std::string& output_dir) {
// 填充 terminal_dev 的数据 // 填充 terminal_dev 的数据
cJSON* id = cJSON_GetObjectItem(item, "id"); // terminal_id cJSON* id = cJSON_GetObjectItem(item, "id"); // terminal_id
if (id && id->type == cJSON_String) if (id && id->type == cJSON_String)
std::strncpy(json_data.terminal_id, id->valuestring, sizeof(json_data.terminal_id) - 1); ::strncpy(json_data.terminal_id, id->valuestring, sizeof(json_data.terminal_id) - 1);
else else
std::strncpy(json_data.terminal_id, "N/A", sizeof(json_data.terminal_id) - 1); ::strncpy(json_data.terminal_id, "N/A", sizeof(json_data.terminal_id) - 1);
cJSON* name = cJSON_GetObjectItem(item, "name"); // terminal_code cJSON* name = cJSON_GetObjectItem(item, "name"); // terminal_code
if (name && name->type == cJSON_String) if (name && name->type == cJSON_String)
std::strncpy(json_data.terminal_code, name->valuestring, sizeof(json_data.terminal_code) - 1); ::strncpy(json_data.terminal_code, name->valuestring, sizeof(json_data.terminal_code) - 1);
else else
std::strncpy(json_data.terminal_code, "N/A", sizeof(json_data.terminal_code) - 1); ::strncpy(json_data.terminal_code, "N/A", sizeof(json_data.terminal_code) - 1);
cJSON* org_name = cJSON_GetObjectItem(item, "org_name"); // org_name cJSON* org_name = cJSON_GetObjectItem(item, "org_name"); // org_name
if (org_name && org_name->type == cJSON_String) if (org_name && org_name->type == cJSON_String)
std::strncpy(json_data.org_name, org_name->valuestring, sizeof(json_data.org_name) - 1); ::strncpy(json_data.org_name, org_name->valuestring, sizeof(json_data.org_name) - 1);
else else
std::strncpy(json_data.org_name, "N/A", sizeof(json_data.org_name) - 1); ::strncpy(json_data.org_name, "N/A", sizeof(json_data.org_name) - 1);
cJSON* maint_name = cJSON_GetObjectItem(item, "maint_name"); // maint_name cJSON* maint_name = cJSON_GetObjectItem(item, "maint_name"); // maint_name
if (maint_name && maint_name->type == cJSON_String) if (maint_name && maint_name->type == cJSON_String)
std::strncpy(json_data.maint_name, maint_name->valuestring, sizeof(json_data.maint_name) - 1); ::strncpy(json_data.maint_name, maint_name->valuestring, sizeof(json_data.maint_name) - 1);
else else
std::strncpy(json_data.maint_name, "N/A", sizeof(json_data.maint_name) - 1); ::strncpy(json_data.maint_name, "N/A", sizeof(json_data.maint_name) - 1);
cJSON* station_name = cJSON_GetObjectItem(item, "stationName"); // station_name cJSON* station_name = cJSON_GetObjectItem(item, "stationName"); // station_name
if (station_name && station_name->type == cJSON_String) if (station_name && station_name->type == cJSON_String)
std::strncpy(json_data.station_name, station_name->valuestring, sizeof(json_data.station_name) - 1); ::strncpy(json_data.station_name, station_name->valuestring, sizeof(json_data.station_name) - 1);
else else
std::strncpy(json_data.station_name, "N/A", sizeof(json_data.station_name) - 1); ::strncpy(json_data.station_name, "N/A", sizeof(json_data.station_name) - 1);
cJSON* manufacturer = cJSON_GetObjectItem(item, "manufacturer"); // tmnl_factory cJSON* manufacturer = cJSON_GetObjectItem(item, "manufacturer"); // tmnl_factory
if (manufacturer && manufacturer->type == cJSON_String) if (manufacturer && manufacturer->type == cJSON_String)
std::strncpy(json_data.tmnl_factory, manufacturer->valuestring, sizeof(json_data.tmnl_factory) - 1); ::strncpy(json_data.tmnl_factory, manufacturer->valuestring, sizeof(json_data.tmnl_factory) - 1);
else else
std::strncpy(json_data.tmnl_factory, "N/A", sizeof(json_data.tmnl_factory) - 1); ::strncpy(json_data.tmnl_factory, "N/A", sizeof(json_data.tmnl_factory) - 1);
cJSON* status = cJSON_GetObjectItem(item, "status"); // tmnl_status cJSON* status = cJSON_GetObjectItem(item, "status"); // tmnl_status
if (status && status->type == cJSON_String) if (status && status->type == cJSON_String)
std::strncpy(json_data.tmnl_status, status->valuestring, sizeof(json_data.tmnl_status) - 1); ::strncpy(json_data.tmnl_status, status->valuestring, sizeof(json_data.tmnl_status) - 1);
else else
std::strncpy(json_data.tmnl_status, "N/A", sizeof(json_data.tmnl_status) - 1); ::strncpy(json_data.tmnl_status, "N/A", sizeof(json_data.tmnl_status) - 1);
cJSON* dev_type = cJSON_GetObjectItem(item, "devType"); // dev_type cJSON* dev_type = cJSON_GetObjectItem(item, "devType"); // dev_type
if (dev_type && dev_type->type == cJSON_String) if (dev_type && dev_type->type == cJSON_String)
std::strncpy(json_data.dev_type, dev_type->valuestring, sizeof(json_data.dev_type) - 1); ::strncpy(json_data.dev_type, dev_type->valuestring, sizeof(json_data.dev_type) - 1);
else else
std::strncpy(json_data.dev_type, "N/A", sizeof(json_data.dev_type) - 1); ::strncpy(json_data.dev_type, "N/A", sizeof(json_data.dev_type) - 1);
cJSON* dev_key = cJSON_GetObjectItem(item, "devKey"); // dev_key cJSON* dev_key = cJSON_GetObjectItem(item, "devKey"); // dev_key
if (dev_key && dev_key->type == cJSON_String) if (dev_key && dev_key->type == cJSON_String)
std::strncpy(json_data.dev_key, dev_key->valuestring, sizeof(json_data.dev_key) - 1); ::strncpy(json_data.dev_key, dev_key->valuestring, sizeof(json_data.dev_key) - 1);
else else
std::strncpy(json_data.dev_key, "N/A", sizeof(json_data.dev_key) - 1); ::strncpy(json_data.dev_key, "N/A", sizeof(json_data.dev_key) - 1);
cJSON* dev_series = cJSON_GetObjectItem(item, "series"); // dev_series cJSON* dev_series = cJSON_GetObjectItem(item, "series"); // dev_series
if (dev_series && dev_series->type == cJSON_String) if (dev_series && dev_series->type == cJSON_String)
std::strncpy(json_data.dev_series, dev_series->valuestring, sizeof(json_data.dev_series) - 1); ::strncpy(json_data.dev_series, dev_series->valuestring, sizeof(json_data.dev_series) - 1);
else else
std::strncpy(json_data.dev_series, "N/A", sizeof(json_data.dev_series) - 1); ::strncpy(json_data.dev_series, "N/A", sizeof(json_data.dev_series) - 1);
//lnk20250210台账进程号 //lnk20250210台账进程号
cJSON* processNo = cJSON_GetObjectItem(item, "processNo"); // processNo转为字符串 cJSON* processNo = cJSON_GetObjectItem(item, "processNo"); // processNo转为字符串
@@ -1595,21 +1595,21 @@ int parse_control(const std::string& json_str, const std::string& output_dir) {
cJSON* ip = cJSON_GetObjectItem(item, "ip"); // addr_str cJSON* ip = cJSON_GetObjectItem(item, "ip"); // addr_str
if (ip && ip->type == cJSON_String) if (ip && ip->type == cJSON_String)
std::strncpy(json_data.addr_str, ip->valuestring, sizeof(json_data.addr_str) - 1); ::strncpy(json_data.addr_str, ip->valuestring, sizeof(json_data.addr_str) - 1);
else else
std::strncpy(json_data.addr_str, "N/A", sizeof(json_data.addr_str) - 1); ::strncpy(json_data.addr_str, "N/A", sizeof(json_data.addr_str) - 1);
cJSON* port = cJSON_GetObjectItem(item, "port"); // port cJSON* port = cJSON_GetObjectItem(item, "port"); // port
if (port && port->type == cJSON_String) if (port && port->type == cJSON_String)
std::strncpy(json_data.port, port->valuestring, sizeof(json_data.port) - 1); ::strncpy(json_data.port, port->valuestring, sizeof(json_data.port) - 1);
else else
std::strncpy(json_data.port, "N/A", sizeof(json_data.port) - 1); ::strncpy(json_data.port, "N/A", sizeof(json_data.port) - 1);
cJSON* updateTime = cJSON_GetObjectItem(item, "updateTime"); // timestamp cJSON* updateTime = cJSON_GetObjectItem(item, "updateTime"); // timestamp
if (updateTime && updateTime->type == cJSON_String) if (updateTime && updateTime->type == cJSON_String)
std::strncpy(json_data.timestamp, updateTime->valuestring, sizeof(json_data.timestamp) - 1); ::strncpy(json_data.timestamp, updateTime->valuestring, sizeof(json_data.timestamp) - 1);
else else
std::strncpy(json_data.timestamp, "N/A", sizeof(json_data.timestamp) - 1); ::strncpy(json_data.timestamp, "N/A", sizeof(json_data.timestamp) - 1);
// monitorData 解析,填充到 line 数组中 // monitorData 解析,填充到 line 数组中
cJSON* monitorData = cJSON_GetObjectItem(item, "monitorData"); cJSON* monitorData = cJSON_GetObjectItem(item, "monitorData");
@@ -1622,44 +1622,44 @@ int parse_control(const std::string& json_str, const std::string& output_dir) {
cJSON* monitor_id = cJSON_GetObjectItem(monitor_item, "id"); // monitor_id cJSON* monitor_id = cJSON_GetObjectItem(monitor_item, "id"); // monitor_id
if (monitor_id && monitor_id->type == cJSON_String) if (monitor_id && monitor_id->type == cJSON_String)
std::strncpy(monitor_data.monitor_id, monitor_id->valuestring, sizeof(monitor_data.monitor_id) - 1); ::strncpy(monitor_data.monitor_id, monitor_id->valuestring, sizeof(monitor_data.monitor_id) - 1);
else else
std::strncpy(monitor_data.monitor_id, "N/A", sizeof(monitor_data.monitor_id) - 1); ::strncpy(monitor_data.monitor_id, "N/A", sizeof(monitor_data.monitor_id) - 1);
cJSON* monitor_name = cJSON_GetObjectItem(monitor_item, "name"); // monitor_name cJSON* monitor_name = cJSON_GetObjectItem(monitor_item, "name"); // monitor_name
if (monitor_name && monitor_name->type == cJSON_String) if (monitor_name && monitor_name->type == cJSON_String)
std::strncpy(monitor_data.monitor_name, monitor_name->valuestring, sizeof(monitor_data.monitor_name) - 1); ::strncpy(monitor_data.monitor_name, monitor_name->valuestring, sizeof(monitor_data.monitor_name) - 1);
else else
std::strncpy(monitor_data.monitor_name, "N/A", sizeof(monitor_data.monitor_name) - 1); ::strncpy(monitor_data.monitor_name, "N/A", sizeof(monitor_data.monitor_name) - 1);
cJSON* voltage_level = cJSON_GetObjectItem(monitor_item, "voltageLevel"); // voltage_level cJSON* voltage_level = cJSON_GetObjectItem(monitor_item, "voltageLevel"); // voltage_level
if (voltage_level && voltage_level->type == cJSON_String) if (voltage_level && voltage_level->type == cJSON_String)
std::strncpy(monitor_data.voltage_level, voltage_level->valuestring, sizeof(monitor_data.voltage_level) - 1); ::strncpy(monitor_data.voltage_level, voltage_level->valuestring, sizeof(monitor_data.voltage_level) - 1);
else else
std::strncpy(monitor_data.voltage_level, "N/A", sizeof(monitor_data.voltage_level) - 1); ::strncpy(monitor_data.voltage_level, "N/A", sizeof(monitor_data.voltage_level) - 1);
cJSON* monitor_status = cJSON_GetObjectItem(monitor_item, "status"); // status cJSON* monitor_status = cJSON_GetObjectItem(monitor_item, "status"); // status
if (monitor_status && monitor_status->type == cJSON_String) if (monitor_status && monitor_status->type == cJSON_String)
std::strncpy(monitor_data.status, monitor_status->valuestring, sizeof(monitor_data.status) - 1); ::strncpy(monitor_data.status, monitor_status->valuestring, sizeof(monitor_data.status) - 1);
else else
std::strncpy(monitor_data.status, "N/A", sizeof(monitor_data.status) - 1); ::strncpy(monitor_data.status, "N/A", sizeof(monitor_data.status) - 1);
cJSON* lineNo = cJSON_GetObjectItem(monitor_item, "lineNo"); // logical_device_seq cJSON* lineNo = cJSON_GetObjectItem(monitor_item, "lineNo"); // logical_device_seq
if (lineNo && lineNo->type == cJSON_String) if (lineNo && lineNo->type == cJSON_String)
std::strncpy(monitor_data.logical_device_seq, lineNo->valuestring, sizeof(monitor_data.logical_device_seq) - 1); ::strncpy(monitor_data.logical_device_seq, lineNo->valuestring, sizeof(monitor_data.logical_device_seq) - 1);
else else
std::strncpy(monitor_data.logical_device_seq, "N/A", sizeof(monitor_data.logical_device_seq) - 1); ::strncpy(monitor_data.logical_device_seq, "N/A", sizeof(monitor_data.logical_device_seq) - 1);
cJSON* ptType = cJSON_GetObjectItem(monitor_item, "ptType"); // terminal_connect cJSON* ptType = cJSON_GetObjectItem(monitor_item, "ptType"); // terminal_connect
if (ptType && ptType->type == cJSON_String) if (ptType && ptType->type == cJSON_String)
std::strncpy(monitor_data.terminal_connect, ptType->valuestring, sizeof(monitor_data.terminal_connect) - 1); ::strncpy(monitor_data.terminal_connect, ptType->valuestring, sizeof(monitor_data.terminal_connect) - 1);
else else
std::strncpy(monitor_data.terminal_connect, "N/A", sizeof(monitor_data.terminal_connect) - 1); ::strncpy(monitor_data.terminal_connect, "N/A", sizeof(monitor_data.terminal_connect) - 1);
std::strncpy(monitor_data.timestamp, json_data.timestamp, sizeof(monitor_data.timestamp) - 1); ::strncpy(monitor_data.timestamp, json_data.timestamp, sizeof(monitor_data.timestamp) - 1);
std::strncpy(monitor_data.terminal_code, json_data.terminal_code, sizeof(monitor_data.terminal_code) - 1); ::strncpy(monitor_data.terminal_code, json_data.terminal_code, sizeof(monitor_data.terminal_code) - 1);
// 填充到 line 数组 // 填充到 line 数组
json_data.line[j] = monitor_data; json_data.line[j] = monitor_data;
@@ -1701,7 +1701,7 @@ int parse_control(const std::string& json_str, const std::string& output_dir) {
cJSON* id = cJSON_GetObjectItem(item, "id"); cJSON* id = cJSON_GetObjectItem(item, "id");
if (id != nullptr) { if (id != nullptr) {
terminal json_data; terminal json_data;
std::strncpy(json_data.terminal_id, cJSON_GetObjectItem(item, "id")->valuestring, sizeof(json_data.terminal_id) - 1); ::strncpy(json_data.terminal_id, cJSON_GetObjectItem(item, "id")->valuestring, sizeof(json_data.terminal_id) - 1);
// 准备 XML 内容并写入文件 // 准备 XML 内容并写入文件
std::string xmlContent = prepare_update(code_str, json_data,guid);//添加guid20250506 std::string xmlContent = prepare_update(code_str, json_data,guid);//添加guid20250506
if(xmlContent != ""){ if(xmlContent != ""){
@@ -1759,19 +1759,6 @@ int find_mp_index_from_mp_id(std::string line)
} }
char* find_mp_name_from_mp_id(const char* mp_id)
{
LD_info_t* LD_info = NULL;
LD_info = find_LD_info_only_from_mp_id((char*)mp_id);
if(LD_info == NULL){
return 0;
}
else{
return LD_info->name;
}
}
int myMessageCallbackrtdata(CPushConsumer* consumer, CMessageExt* msg) int myMessageCallbackrtdata(CPushConsumer* consumer, CMessageExt* msg)
{ {
if(INITFLAG != 1)return 1;//防止崩溃 if(INITFLAG != 1)return 1;//防止崩溃
@@ -2361,11 +2348,8 @@ int json_block_create_data(char monid_char[], char* mms_str, double v, int flick
if (pdata != NULL) if (pdata != NULL)
{ {
pdata->mms_str_map.insert(QString::fromAscii(mms_str), v); pdata->mms_str_map.insert(QString::fromAscii(mms_str), v);
if (strstr(mms_str, "MMXU2$MX$PhV")){ if (strstr(mms_str, "MMXU2$MX$PhV"))
pdata->data_have_statistic = 1;
printf("---------- json_block_create_data: mp_id= %s ,mms_str=%s value=%fkV----------\n", monid_char, mms_str, v); printf("---------- json_block_create_data: mp_id= %s ,mms_str=%s value=%fkV----------\n", monid_char, mms_str, v);
}
} }
return TRUE; return TRUE;
} }

View File

@@ -133,7 +133,7 @@ extern LOG_TLS int g_log_code_tls; // 声明为 TLS 变量,定义见 log4.cpp
#define DIY_DEBUGLOG(KEY, ...) DIY_LOG_CODE(log_debug, KEY, 0, __VA_ARGS__) // ★修改:默认 code=0 #define DIY_DEBUGLOG(KEY, ...) DIY_LOG_CODE(log_debug, KEY, 0, __VA_ARGS__) // ★修改:默认 code=0
// ★新增:显式传入 code 的便捷宏 // ★新增:显式传入 code 的便捷宏
// 用法示例DIY_WARNLOG_CODE(full_key_m_c, warn_recallstart, "【WARN】监测点:%s ...", ...); // 用法示例DIY_WARNLOG_CODE(full_key_m_c, warn_recallstart, "监测点:%s ...", ...);
#define DIY_ERRORLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_error, KEY, CODE_INT, __VA_ARGS__) // ★新增 #define DIY_ERRORLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_error, KEY, CODE_INT, __VA_ARGS__) // ★新增
#define DIY_WARNLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_warn, KEY, CODE_INT, __VA_ARGS__) // ★新增 #define DIY_WARNLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_warn, KEY, CODE_INT, __VA_ARGS__) // ★新增
#define DIY_INFOLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_info, KEY, CODE_INT, __VA_ARGS__) // ★新增 #define DIY_INFOLOG_CODE(KEY, CODE_INT, ...) DIY_LOG_CODE(log_info, KEY, CODE_INT, __VA_ARGS__) // ★新增
@@ -159,8 +159,7 @@ typedef enum LogCode {
LOG_CODE_LOG_REQUEST = 405, /* 日志请求 */ LOG_CODE_LOG_REQUEST = 405, /* 日志请求 */
LOG_CODE_REPORT = 500, /* 报告处理 */ LOG_CODE_REPORT = 500, /* 报告处理 */
LOG_CODE_COMM = 600, /* 通讯状态 */ LOG_CODE_COMM = 600, /* 通讯状态 */
LOG_CODE_SPACE_ALARM = 700, /* 空间告警 */ LOG_CODE_SPACE_ALARM = 700 /* 空间告警 */
LOG_CODE_DEVICE = 800 /* 设备告警 */
} LogCode; } LogCode;
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -152,8 +152,6 @@ int parse_model_cfg_web();
void SOEFileWeb(char* localpath,char* cloudpath,char* wavepath); void SOEFileWeb(char* localpath,char* cloudpath,char* wavepath);
const char* get_front_msg_from_subdir(); const char* get_front_msg_from_subdir();
char* find_mp_name_from_mp_id(const char* mp_id);
////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////
typedef struct { typedef struct {
@@ -162,7 +160,6 @@ typedef struct {
char WavePhasicB[64]; char WavePhasicB[64];
char WavePhasicC[64]; char WavePhasicC[64];
char UnitOfTimeUnit[64]; char UnitOfTimeUnit[64];
char TypeOfData[64];
char ValueOfTimeUnit[64]; char ValueOfTimeUnit[64];
char WaveTimeFlag[64]; char WaveTimeFlag[64];
char IEDname[64]; char IEDname[64];

View File

@@ -232,7 +232,7 @@ int main(int argc, const char **argv)
//char buf[256]; //char buf[256];
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index); //format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
//log_debug("process", buf); //log_debug("process", buf);
DIY_INFOLOG("process","【NORMAL】前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index); DIY_INFOLOG("process","前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
#ifdef _OS_UNIX_ #ifdef _OS_UNIX_
#ifdef QT_NO_DEBUG #ifdef QT_NO_DEBUG
@@ -268,7 +268,7 @@ int main(int argc, const char **argv)
//char buf[256]; //char buf[256];
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 台账初始化失败", get_front_msg_from_subdir(), g_front_seg_index); //format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 台账初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
//log_error("process", buf); //log_error("process", buf);
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置的%s%d号进程 台账初始化失败", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"前置的%s%d号进程 台账初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
return rv; return rv;
} }
@@ -277,7 +277,7 @@ int main(int argc, const char **argv)
//char buf[256]; //char buf[256];
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 线程初始化失败", get_front_msg_from_subdir(), g_front_seg_index); //format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 线程初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
//log_error("process", buf); //log_error("process", buf);
DIY_ERRORLOG_CODE("process",LOG_CODE_OTHER,"【ERROR】前置的%s%d号进程 线程初始化失败", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_OTHER,"前置的%s%d号进程 线程初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
return rv; return rv;
} }
@@ -324,7 +324,7 @@ int main(int argc, const char **argv)
//char buf[256]; //char buf[256];
//format_log_msg(buf,sizeof(buf),"前置的业务线程死锁,退出进程"); //format_log_msg(buf,sizeof(buf),"前置的业务线程死锁,退出进程");
//log_error("process", buf); //log_error("process", buf);
DIY_ERRORLOG_CODE("process",LOG_CODE_OTHER,"【ERROR】前置的%s%d号进程 业务线程死锁,退出进程", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_OTHER,"前置的%s%d号进程 业务线程死锁,退出进程", get_front_msg_from_subdir(), g_front_seg_index);
apr_sleep(apr_time_from_sec(10)); apr_sleep(apr_time_from_sec(10));
exit(-1039); exit(-1039);

View File

@@ -184,7 +184,7 @@ void closeChannel(chnl_usr_t *chnl_usr)
ret = mms_disconnectFromServer(chnl_usr->net_info,&chnl_usr->m_reqCtrl); ret = mms_disconnectFromServer(chnl_usr->net_info,&chnl_usr->m_reqCtrl);
echo_warn("---------end disconnectFromServer!\n"); echo_warn("---------end disconnectFromServer!\n");
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】前置与终端%s - ip端口%s:%d 断开连接", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port); DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"前置与终端%s - ip端口%s:%d 断开连接", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
if (ret != SD_SUCCESS){ if (ret != SD_SUCCESS){
echo_warn("---------disconnectFromServer success!\n"); echo_warn("---------disconnectFromServer success!\n");
@@ -321,13 +321,13 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
LD_info->registcount++; LD_info->registcount++;
if (LD_info->registcount <= 5) { if (LD_info->registcount <= 5) {
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"【ERROR】监测点:%s - id:%s报告触发失败,监测点逻辑标识号为0,请检查装置对应的台账信息是否正确", LD_info->name,LD_info->mp_id); DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"监测点:%s - id:%s报告触发失败,监测点逻辑标识号为0,请检查装置对应的台账信息是否正确", LD_info->name,LD_info->mp_id);
} }
// 到5次就不再打印并标记 // 到5次就不再打印并标记
if (LD_info->registcount > 5) { if (LD_info->registcount > 5) {
LD_info->has_logged_regist = true; LD_info->has_logged_regist = true;
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s监测点逻辑标识号错误日志已达本次记录上限不再输出请检查装置对应的台账信息是否正确", DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"监测点:%s - id:%s监测点逻辑标识号错误日志已达本次记录上限不再输出请检查装置对应的台账信息是否正确",
LD_info->name, LD_info->mp_id); LD_info->name, LD_info->mp_id);
} }
} }
@@ -341,7 +341,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
if (judge_rpt_next_should_do(rptinfo)==SHOULD_DO_NOTHING)//检查是否触发 if (judge_rpt_next_should_do(rptinfo)==SHOULD_DO_NOTHING)//检查是否触发
{ {
//DIY_DEBUGLOG(full_key_m_c,"【DEBUG】监测点:%s - id:%s不注册报告", LD_info->name,LD_info->mp_id); //DIY_DEBUGLOG(full_key_m_c,"监测点:%s - id:%s不注册报告", LD_info->name,LD_info->mp_id);
continue; continue;
} }
@@ -357,7 +357,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
printf("start mms_register_iec_rpt................................\n"); printf("start mms_register_iec_rpt................................\n");
//mq日志 //mq日志
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s开始注册报告,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name); DIY_INFOLOG(full_key_m_c,"监测点:%s - id:%s开始注册报告,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
if ( strstr(rptinfo->rptID,"LLN0$BR$brcbFlickerData") ) if ( strstr(rptinfo->rptID,"LLN0$BR$brcbFlickerData") )
rptinfo->IntgPd = 600; //10分钟 rptinfo->IntgPd = 600; //10分钟
@@ -385,14 +385,14 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
LD_info->registcount++; LD_info->registcount++;
if (LD_info->registcount <= 5) { if (LD_info->registcount <= 5) {
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT, "【WARN】监测点:%s - id:%s注册报告失败,报告名:%s", DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT, "监测点:%s - id:%s注册报告失败,报告名:%s",
LD_info->name, LD_info->mp_id, rpt_inst_name); LD_info->name, LD_info->mp_id, rpt_inst_name);
} }
// 到5次就不再打印并标记 // 到5次就不再打印并标记
if (LD_info->registcount > 5) { if (LD_info->registcount > 5) {
LD_info->has_logged_regist = true; LD_info->has_logged_regist = true;
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s注册报告失败日志已达本次注册上限不再输出请检查装置icd和映射文件是否匹配或者装置存在过多连接", DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"监测点:%s - id:%s注册报告失败日志已达本次注册上限不再输出请检查装置icd和映射文件是否匹配或者装置存在过多连接",
LD_info->name, LD_info->mp_id); LD_info->name, LD_info->mp_id);
} }
} }
@@ -415,7 +415,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
//mq日志 //mq日志
LD_info->has_logged_regist = FALSE; LD_info->has_logged_regist = FALSE;
LD_info->registcount = 0; LD_info->registcount = 0;
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s注册报告成功,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name); DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"监测点:%s - id:%s注册报告成功,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
// add here to GI not the same time // add here to GI not the same time
GIoffset = 0.5 * g_pt61850app->giTime; GIoffset = 0.5 * g_pt61850app->giTime;
@@ -423,7 +423,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
} }
printf("end mms_register_iec_rpt................................\n"); printf("end mms_register_iec_rpt................................\n");
//mq日志 //mq日志
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s注册报告结束,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name); DIY_INFOLOG(full_key_m_c,"监测点:%s - id:%s注册报告结束,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
} }
} }
else { //rpt_registered ==TRUE else { //rpt_registered ==TRUE
@@ -432,7 +432,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
printf("start mms_unregister_iec_rpt................................\n"); printf("start mms_unregister_iec_rpt................................\n");
//mq日志 //mq日志
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s开始注销报告,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name); DIY_INFOLOG(full_key_m_c,"监测点:%s - id:%s开始注销报告,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
ret = mms_unregister_iec_rpt (chnl_usr->net_info, &g_rpt_typeids, ret = mms_unregister_iec_rpt (chnl_usr->net_info, &g_rpt_typeids,
LD_info->LD_name,rpt_inst_name,g_pt61850app->mmsOpTimeout); LD_info->LD_name,rpt_inst_name,g_pt61850app->mmsOpTimeout);
@@ -443,7 +443,7 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
APR_EGENERAL, LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl_id); APR_EGENERAL, LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl_id);
//mq日志 //mq日志
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"【WARN】监测点:%s - id:%s注销报告失败,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name); DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_REPORT,"监测点:%s - id:%s注销报告失败,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
} }
else { else {
@@ -452,11 +452,11 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl->port,chnl_usr->chnl_id ); LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl->port,chnl_usr->chnl_id );
//mq日志 //mq日志
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s注销报告成功,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name); DIY_INFOLOG(full_key_m_c,"监测点:%s - id:%s注销报告成功,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
} }
printf("end mms_unregister_iec_rpt................................\n"); printf("end mms_unregister_iec_rpt................................\n");
//mq日志 //mq日志
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s注销报告结束,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name); DIY_INFOLOG(full_key_m_c,"监测点:%s - id:%s注销报告结束,报告名:%s", LD_info->name,LD_info->mp_id,rpt_inst_name);
} }
} }
@@ -523,13 +523,13 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
LD_info->registcount++; LD_info->registcount++;
if (LD_info->registcount <= 5) { if (LD_info->registcount <= 5) {
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【ERROR】监测点:%s - id:%s补招数据失败,监测点缺少日志控制块,请检查装置对应的装置类型是否有配对的icd模型", LD_info->name,LD_info->mp_id); DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"监测点:%s - id:%s补招数据失败,监测点缺少日志控制块,请检查装置对应的装置类型是否有配对的icd模型", LD_info->name,LD_info->mp_id);
} }
// 到5次就不再打印并标记 // 到5次就不再打印并标记
if (LD_info->registcount > 5) { if (LD_info->registcount > 5) {
LD_info->has_logged_regist = true; LD_info->has_logged_regist = true;
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s缺少日志控制块日志已达本次记录上限不再输出请检查装置对应的装置类型是否有配对的icd模型", DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"监测点:%s - id:%s缺少日志控制块日志已达本次记录上限不再输出请检查装置对应的装置类型是否有配对的icd模型",
LD_info->name, LD_info->mp_id); LD_info->name, LD_info->mp_id);
} }
} }
@@ -560,11 +560,11 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
if(strcmp(cfg1.ValueOfTimeUnit, "utc") == 0){//装置时间是utc还是北京 if(strcmp(cfg1.ValueOfTimeUnit, "utc") == 0){//装置时间是utc还是北京
utc_or_beijing = 28800;//秒 utc_or_beijing = 28800;//秒
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据,下发补招时间为utc时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type); DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"监测点:%s - id:%s开始补招数据,下发补招时间为utc时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type);
} }
else{ else{
utc_or_beijing = 0; utc_or_beijing = 0;
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据,下发补招时间为beijing时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type); DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"监测点:%s - id:%s开始补招数据,下发补招时间为beijing时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type);
} }
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
@@ -608,7 +608,7 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
LD_info->ied->id, LD_info->cpuno, LD_info->LD_name, loginfo->logName, chnl_usr->ip_str, chnl_usr->chnl_id); LD_info->ied->id, LD_info->cpuno, LD_info->LD_name, loginfo->logName, chnl_usr->ip_str, chnl_usr->chnl_id);
//mq日志 //mq日志
//DIY_WARNLOG(full_key_m_c,"【WARN】监测点:%s - id:%s开始补招数据", LD_info->name,LD_info->mp_id); //DIY_WARNLOG(full_key_m_c,"监测点:%s - id:%s开始补招数据", LD_info->name,LD_info->mp_id);
ret = mms_jread(loginfo, chnl_usr->net_info, loginfo->LD_info->LD_name, loginfo->logName, ret = mms_jread(loginfo, chnl_usr->net_info, loginfo->LD_info->LD_name, loginfo->logName,
loginfo->start_time, loginfo->end_time, g_pt61850app->mmsOpTimeout, chnl_usr->ip_str); loginfo->start_time, loginfo->end_time, g_pt61850app->mmsOpTimeout, chnl_usr->ip_str);
@@ -617,7 +617,7 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
LD_info->ied->id, LD_info->cpuno, LD_info->LD_name, loginfo->logName, chnl_usr->ip_str, chnl_usr->chnl_id); LD_info->ied->id, LD_info->cpuno, LD_info->LD_name, loginfo->logName, chnl_usr->ip_str, chnl_usr->chnl_id);
//mq日志 //mq日志
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【ERROR】监测点:%s - id:%s补招数据失败 - 失败时间点:%lld 至 %lld", LD_info->name,LD_info->mp_id,loginfo->start_time,loginfo->end_time); DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"监测点:%s - id:%s补招数据失败 - 失败时间点:%lld 至 %lld", LD_info->name,LD_info->mp_id,loginfo->start_time,loginfo->end_time);
failed_count++; failed_count++;
} }
@@ -670,7 +670,7 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
// ===== [新增结束] ===== // ===== [新增结束] =====
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s结束补招数据", LD_info->name,LD_info->mp_id); DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_RECALL,"监测点:%s - id:%s结束补招数据", LD_info->name,LD_info->mp_id);
//} //}
} }
@@ -1475,13 +1475,13 @@ void check_disk_quota()
//printf("Current user disk free size: %dMB ,total size: %dMB \n",freeSizeMB,totalSizeMB); //printf("Current user disk free size: %dMB ,total size: %dMB \n",freeSizeMB,totalSizeMB);
if (freeSizeMB<g_min_free_size){ if (freeSizeMB<g_min_free_size){
echo_warn2("Current user disk free size: %dMB < %dMB, please check!\n",freeSizeMB,g_min_free_size); echo_warn2("Current user disk free size: %dMB < %dMB, please check!\n",freeSizeMB,g_min_free_size);
DIY_WARNLOG_CODE("process",LOG_CODE_SPACE_ALARM,"【WARN】前置磁盘检测: 当前磁盘的可用空间为%dMB,小于最小可用空间%dMB,请检查磁盘",freeSizeMB,g_min_free_size); DIY_WARNLOG_CODE("process",LOG_CODE_SPACE_ALARM,"前置磁盘检测: 当前磁盘的可用空间为%dMB,小于最小可用空间%dMB,请检查磁盘",freeSizeMB,g_min_free_size);
} }
if ((freeSizeMB/(totalSizeMB/100+1) )<10){ if ((freeSizeMB/(totalSizeMB/100+1) )<10){
echo_warn2("Current user disk free size percent < 10%%, free size: %dMB ,total size: %dMB ,please check!\n", echo_warn2("Current user disk free size percent < 10%%, free size: %dMB ,total size: %dMB ,please check!\n",
freeSizeMB,totalSizeMB); freeSizeMB,totalSizeMB);
DIY_WARNLOG_CODE("process",LOG_CODE_SPACE_ALARM,"【WARN】前置磁盘检测: 当前磁盘的可用空间的百分比小于10%%,可用空间为%dMB,总空间为%dMB,请检查磁盘",freeSizeMB,totalSizeMB); DIY_WARNLOG_CODE("process",LOG_CODE_SPACE_ALARM,"前置磁盘检测: 当前磁盘的可用空间的百分比小于10%%,可用空间为%dMB,总空间为%dMB,请检查磁盘",freeSizeMB,totalSizeMB);
} }
} }
@@ -1632,7 +1632,7 @@ void CheckNextNotConnectedChannel()
//mq日志 //mq日志
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = true; ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = true;
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = false; ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = false;
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d连接成功", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port); DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"终端%s - ip端口:%s:%d连接成功", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
mvl_free_req_ctrl(chnl_usr->m_reqCtrl); mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
chnl_usr->m_reqCtrl = NULL; chnl_usr->m_reqCtrl = NULL;
@@ -1679,11 +1679,11 @@ void CheckNextNotConnectedChannel()
if(true == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat){ if(true == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat){
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = false; ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = false;
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true; ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip/端口:%s:%d,从开始连接到目前已经%i秒,连接失败,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,secsSince); DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"终端%s - ip/端口:%s:%d,从开始连接到目前已经%i秒,连接失败,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,secsSince);
} }
else if(false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat && false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect){ else if(false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat && false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect){
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true; ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip/端口:%s:%d,从开始连接到目前已经%i秒,连接失败,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,secsSince); DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"终端%s - ip/端口:%s:%d,从开始连接到目前已经%i秒,连接失败,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,secsSince);
} }
mvl_free_req_ctrl(chnl_usr->m_reqCtrl); mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
@@ -1714,11 +1714,11 @@ void CheckNextNotConnectedChannel()
if(true == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat){ if(true == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat){
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = false; ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat = false;
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true; ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d,从开始连接到目前已经300秒,未能获取连接响应,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port); DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"终端%s - ip端口:%s:%d,从开始连接到目前已经300秒,未能获取连接响应,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
} }
else if(false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat && false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect){ else if(false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->lastconnectstat && false == ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect){
((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true; ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->has_logged_disconnect = true;
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d,从开始连接到目前已经300秒,未能获取连接响应,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port); DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"终端%s - ip端口:%s:%d,从开始连接到目前已经300秒,未能获取连接响应,断开连接!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
} }
@@ -1758,7 +1758,7 @@ void CheckNextNotConnectedChannel()
if (chnl_usr->chnl->ied->cpucount != NULL && chnl_usr->chnl->ied->cpucount > 0 && ied_usr->dev_flag == ENABLE) {//2023-09-26 czy 如果line count<0 不需要连接//lnk20250121如果终端无效则不连接 if (chnl_usr->chnl->ied->cpucount != NULL && chnl_usr->chnl->ied->cpucount > 0 && ied_usr->dev_flag == ENABLE) {//2023-09-26 czy 如果line count<0 不需要连接//lnk20250121如果终端无效则不连接
//mq日志 //mq日志
//DIY_WARNLOG(full_key_t_c,"【WARN】重新连接终端%s - ip端口:%s:%d", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port); //DIY_WARNLOG(full_key_t_c,"重新连接终端%s - ip端口:%s:%d", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
ret = mms_connectToServer(ied_usr->dev_key, ied_usr->dev_series, serverARName, &(chnl_usr->net_info), &(chnl_usr->m_reqCtrl)); ret = mms_connectToServer(ied_usr->dev_key, ied_usr->dev_series, serverARName, &(chnl_usr->net_info), &(chnl_usr->m_reqCtrl));
@@ -1770,7 +1770,7 @@ void CheckNextNotConnectedChannel()
chnl_usr->m_StartConnectingTime = sGetMsTime(); chnl_usr->m_StartConnectingTime = sGetMsTime();
//mq日志 //mq日志
//DIY_WARNLOG(full_key_t_c,"【WARN】正在重新连接终端%s - ip端口:%s:%d - 识别码/秘钥:%s/%s", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->dev_series,((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->dev_key); //DIY_WARNLOG(full_key_t_c,"正在重新连接终端%s - ip端口:%s:%d - 识别码/秘钥:%s/%s", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port,((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->dev_series,((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->dev_key);
} }
@@ -1782,7 +1782,7 @@ void CheckNextNotConnectedChannel()
echo_warn3("FAILED: mms_connectToServer IP %s:%d ,NetInfo= %x \n", chnl_usr->ip_str, chnl_usr->chnl->port, chnl_usr->net_info); echo_warn3("FAILED: mms_connectToServer IP %s:%d ,NetInfo= %x \n", chnl_usr->ip_str, chnl_usr->chnl->port, chnl_usr->net_info);
//mq日志 //mq日志
//DIY_WARNLOG(full_key_t_c,"【WARN】重新连接终端%s - ip端口:%s:%d 失败!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port); //DIY_WARNLOG(full_key_t_c,"重新连接终端%s - ip端口:%s:%d 失败!", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
} }
} }
@@ -1813,7 +1813,7 @@ void CheckNextNotConnectedChannel()
chnl_usr->chnl->status = STATUS_BREAKOFF; chnl_usr->chnl->status = STATUS_BREAKOFF;
//mq日志 //mq日志
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d 断连完成,关闭连接通道", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port); DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"终端%s - ip端口:%s:%d 断连完成,关闭连接通道", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
} }
else else
@@ -1843,7 +1843,7 @@ void CheckNextNotConnectedChannel()
chnl_usr->chnl->status = STATUS_BREAKOFF; chnl_usr->chnl->status = STATUS_BREAKOFF;
//mq日志 //mq日志
DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"【WARN】终端%s - ip端口:%s:%d 断连未完成,但是已经超时180秒,关闭连接通道", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port); DIY_WARNLOG_CODE(full_key_t_c,LOG_CODE_COMM,"终端%s - ip端口:%s:%d 断连未完成,但是已经超时180秒,关闭连接通道", ((ied_usr_t*)(chnl_usr->chnl->ied->usr_ext))->terminal_id,chnl_usr->ip_str,chnl_usr->chnl->port);
} }
} }
@@ -2013,7 +2013,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
printf(">>>>>>>> IED [%d]: %s is calling cn wavefile, !!!!!!!! file_match_str=%s \n",ied->id,ied->name,file_match_str); printf(">>>>>>>> IED [%d]: %s is calling cn wavefile, !!!!!!!! file_match_str=%s \n",ied->id,ied->name,file_match_str);
//mq日志 //mq日志
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s开始召唤录波文件", LD_info->name,LD_info->mp_id); DIY_INFOLOG(full_key_m_c,"监测点:%s - id:%s开始召唤录波文件", LD_info->name,LD_info->mp_id);
ret = SD_FAILURE; ret = SD_FAILURE;
filenum = 0; filenum = 0;
@@ -2035,14 +2035,14 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
int ret2,ret3; int ret2,ret3;
//mq日志 //mq日志
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s获取录波文件列表成功,开始匹配录波文件", LD_info->name,LD_info->mp_id); DIY_INFOLOG(full_key_m_c,"监测点:%s - id:%s获取录波文件列表成功,开始匹配录波文件", LD_info->name,LD_info->mp_id);
//WW 2023-11-01将录波段号由字符串匹配修改为int的fltnum匹配 //WW 2023-11-01将录波段号由字符串匹配修改为int的fltnum匹配
ret2 = parse_file_names_by_fltnum(LD_info->FltNum[i], ldstr, filenames, filenum, &cfg_idx, &dat_idx, file_base_name, file_yyyymm); ret2 = parse_file_names_by_fltnum(LD_info->FltNum[i], ldstr, filenames, filenum, &cfg_idx, &dat_idx, file_base_name, file_yyyymm);
//WW 2023-11-01 end //WW 2023-11-01 end
if (ret2 !=APR_SUCCESS){ if (ret2 !=APR_SUCCESS){
//mq日志 //mq日志
//DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"【WARN】监测点:%s - id:%s前置记录的录波事件上传的录波号段%d与从装置获取的录波文件列表匹配失败,装置没有对应的号段的录波文件,清除该记录", LD_info->name,LD_info->mp_id,LD_info->FltNum[i]); //DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"监测点:%s - id:%s前置记录的录波事件上传的录波号段%d与从装置获取的录波文件列表匹配失败,装置没有对应的号段的录波文件,清除该记录", LD_info->name,LD_info->mp_id,LD_info->FltNum[i]);
//lnk20250819装置没有对应的文件时清除录波号段 //lnk20250819装置没有对应的文件时清除录波号段
printf("监测点:%s - id:%s前置记录的录波事件上传的录波号段%d与从装置获取的录波文件列表匹配失败,装置没有对应的号段的录波文件,清除该记录", LD_info->name,LD_info->mp_id,LD_info->FltNum[i]); printf("监测点:%s - id:%s前置记录的录波事件上传的录波号段%d与从装置获取的录波文件列表匹配失败,装置没有对应的号段的录波文件,清除该记录", LD_info->name,LD_info->mp_id,LD_info->FltNum[i]);
LD_info->FltNum[i] = -1; LD_info->FltNum[i] = -1;
@@ -2058,7 +2058,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
if (ret2==SD_SUCCESS && ret3==SD_SUCCESS ) { //两个文件都写好了 if (ret2==SD_SUCCESS && ret3==SD_SUCCESS ) { //两个文件都写好了
//mq日志 //mq日志
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s从终端获取录波文件成功", LD_info->name,LD_info->mp_id); DIY_INFOLOG(full_key_m_c,"监测点:%s - id:%s从终端获取录波文件成功", LD_info->name,LD_info->mp_id);
QVVR_t *qvvr; //暂态事件 QVVR_t *qvvr; //暂态事件
long long start_tm,trig_tm,end_tm; long long start_tm,trig_tm,end_tm;
@@ -2066,7 +2066,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
ret2 = extract_timestamp_from_cfg_file(filenames[cfg_idx],&start_tm,&trig_tm);//提取文件的开始时间和触发时间 ret2 = extract_timestamp_from_cfg_file(filenames[cfg_idx],&start_tm,&trig_tm);//提取文件的开始时间和触发时间
printf(">>>>>>>> extract_timestamp_from_cfg_file end \n"); printf(">>>>>>>> extract_timestamp_from_cfg_file end \n");
if (ret2 ==APR_SUCCESS) { if (ret2 ==APR_SUCCESS) {
DIY_INFOLOG(full_key_m_c,"【NORMAL】监测点:%s - id:%s提取录波文件时间成功", LD_info->name,LD_info->mp_id); DIY_INFOLOG(full_key_m_c,"监测点:%s - id:%s提取录波文件时间成功", LD_info->name,LD_info->mp_id);
//to find the paired qvvr by the time of trig_tm //to find the paired qvvr by the time of trig_tm
printf(">>>>>>>> extract_timestamp_from_cfg_file success \n"); printf(">>>>>>>> extract_timestamp_from_cfg_file success \n");
qvvr = find_qvvr_by_trig_tm(LD_info,trig_tm); //根据文件的触发时间查找检测点记录的匹配上的暂态事件 qvvr = find_qvvr_by_trig_tm(LD_info,trig_tm); //根据文件的触发时间查找检测点记录的匹配上的暂态事件
@@ -2091,7 +2091,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
memset(oss_file_fullname_cfg, 0, sizeof(oss_file_fullname_cfg)); memset(oss_file_fullname_cfg, 0, sizeof(oss_file_fullname_cfg));
apr_snprintf(oss_file_fullname_cfg, sizeof(oss_file_fullname_cfg), "comtrade/wave/%s/%s", LD_info->mp_id, cfg_only_filename_ret); apr_snprintf(oss_file_fullname_cfg, sizeof(oss_file_fullname_cfg), "comtrade/wave/%s/%s", LD_info->mp_id, cfg_only_filename_ret);
if (FILE_FLAG == 1) { if (FILE_FLAG == 1) {
PutOSS(oss_file_fullname_cfg, loc_file_fullname_cfg);//使用buffer推送文件 //PutOSS(oss_file_fullname_cfg, loc_file_fullname_cfg);//使用buffer推送文件
} }
else if (FILE_FLAG == 2) { else if (FILE_FLAG == 2) {
OBSFile(loc_file_fullname_cfg, oss_file_fullname_cfg, "putObject");//这里并没有上传文件流 OBSFile(loc_file_fullname_cfg, oss_file_fullname_cfg, "putObject");//这里并没有上传文件流
@@ -2129,7 +2129,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
memset(oss_file_fullname_dat, 0, sizeof(oss_file_fullname_dat)); memset(oss_file_fullname_dat, 0, sizeof(oss_file_fullname_dat));
apr_snprintf(oss_file_fullname_dat, sizeof(oss_file_fullname_dat), "comtrade/wave/%s/%s", LD_info->mp_id, dat_only_filename_ret); apr_snprintf(oss_file_fullname_dat, sizeof(oss_file_fullname_dat), "comtrade/wave/%s/%s", LD_info->mp_id, dat_only_filename_ret);
if (FILE_FLAG == 1) { if (FILE_FLAG == 1) {
PutOSS(oss_file_fullname_dat, loc_file_fullname_dat);//使用buffer推送文件 //PutOSS(oss_file_fullname_dat, loc_file_fullname_dat);//使用buffer推送文件
} }
else if (FILE_FLAG == 2) { else if (FILE_FLAG == 2) {
OBSFile(loc_file_fullname_dat, oss_file_fullname_dat, "putObject");//这里并没有上传文件流 OBSFile(loc_file_fullname_dat, oss_file_fullname_dat, "putObject");//这里并没有上传文件流
@@ -2287,10 +2287,10 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
printf("读取失败,未找到 dev_type\n"); printf("读取失败,未找到 dev_type\n");
} }
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0 if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld触发时间:%lld映射配置的暂态持续时间单位是秒", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm); DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld触发时间:%lld映射配置的暂态持续时间单位是秒", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm);
} }
else{ else{
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld触发时间:%lld映射配置的暂态持续时间单位是毫秒", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm); DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld触发时间:%lld映射配置的暂态持续时间单位是毫秒", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm);
} }
} }
@@ -2298,7 +2298,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
} }
else{ else{
DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 下载录波文件%s和%s失败录波号段%d", LD_info->name,LD_info->mp_id,filenames[cfg_idx],filenames[dat_idx],LD_info->FltNum[i]); DIY_ERRORLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"监测点:%s - id:%s 下载录波文件%s和%s失败录波号段%d", LD_info->name,LD_info->mp_id,filenames[cfg_idx],filenames[dat_idx],LD_info->FltNum[i]);
} }
} }
@@ -2306,7 +2306,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
if (ied && chnl_usr){ if (ied && chnl_usr){
echo_warn2("mms_mvla_fdir Failed: IED [%d] %s \n", ied->id , chnl_usr->ip_str) ; echo_warn2("mms_mvla_fdir Failed: IED [%d] %s \n", ied->id , chnl_usr->ip_str) ;
//mq日志 //mq日志
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"【WARN】监测点:%s - id:%s召唤录波文件列表失败,放弃这个号段", LD_info->name,LD_info->mp_id); DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_COMTRADE_FILE,"监测点:%s - id:%s召唤录波文件列表失败,放弃这个号段", LD_info->name,LD_info->mp_id);
LD_info->FltNum[i] = -1; LD_info->FltNum[i] = -1;
} }

View File

@@ -862,7 +862,7 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
//监测点日志的key,lnk20250526 //监测点日志的key,lnk20250526
//mq日志 //mq日志
DIY_INFOLOG(full_key_m_d,"【NORMAL】前置收到监测点:%s - id:%s的报告,报告名称:%s,监测点对应终端的ip和端口是: %s:%d,报告总数:%i,当前报告数:%i", LD_info->name,LD_info->mp_id,rcb_info->RptID,chnl_usr->ip_str,chnl_usr->chnl->port,va_total, rptinfo->count); DIY_INFOLOG(full_key_m_d,"前置收到监测点:%s - id:%s的报告,报告名称:%s,监测点对应终端的ip和端口是: %s:%d,报告总数:%i,当前报告数:%i", LD_info->name,LD_info->mp_id,rcb_info->RptID,chnl_usr->ip_str,chnl_usr->chnl->port,va_total, rptinfo->count);
//apr_time_t previousTime = apr_time_now();// //apr_time_t previousTime = apr_time_now();//
//apr_time_exp_t localTime; //apr_time_exp_t localTime;
@@ -1162,14 +1162,14 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
echo_err3("Ignore this report due to line_id invalid , Report From %s %s %s !!!", echo_err3("Ignore this report due to line_id invalid , Report From %s %s %s !!!",
APR_EGENERAL, chnl_usr->ip_str, LD_info->LD_name, rcb_info->RptID); APR_EGENERAL, chnl_usr->ip_str, LD_info->LD_name, rcb_info->RptID);
//mq日志 //mq日志
DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_REPORT,"【ERROR】前置不处理这个监测点:%s - id:%s的报告,报告名称:%s,原因是监测点的序号非法", LD_info->name,LD_info->mp_id,rcb_info->RptID); DIY_ERRORLOG_CODE(full_key_m_d,LOG_CODE_REPORT,"前置不处理这个监测点:%s - id:%s的报告,报告名称:%s,原因是监测点的序号非法", LD_info->name,LD_info->mp_id,rcb_info->RptID);
} }
printf("[END Process] Report From %s:%d %s %s ,va_total = %i ,【count = %i】 \n", printf("[END Process] Report From %s:%d %s %s ,va_total = %i ,【count = %i】 \n",
chnl_usr->ip_str, chnl_usr->chnl->port, LD_info->LD_name, rcb_info->RptID, va_total, rptinfo->count); chnl_usr->ip_str, chnl_usr->chnl->port, LD_info->LD_name, rcb_info->RptID, va_total, rptinfo->count);
//mq日志 //mq日志
DIY_INFOLOG(full_key_m_d,"【NORMAL】前置处理监测点:%s - id:%s的报告结束,报告名称:%s,监测点对应终端的ip和端口是: %s:%d,报告总数:%i,当前报告数:%i", LD_info->name,LD_info->mp_id,rcb_info->RptID,chnl_usr->ip_str,chnl_usr->chnl->port,va_total, rptinfo->count); DIY_INFOLOG(full_key_m_d,"前置处理监测点:%s - id:%s的报告结束,报告名称:%s,监测点对应终端的ip和端口是: %s:%d,报告总数:%i,当前报告数:%i", LD_info->name,LD_info->mp_id,rcb_info->RptID,chnl_usr->ip_str,chnl_usr->chnl->port,va_total, rptinfo->count);
//apr_time_t previousTimeend = apr_time_now();// //apr_time_t previousTimeend = apr_time_now();//
//apr_time_exp_t localTimeend; //apr_time_exp_t localTimeend;
@@ -1532,7 +1532,7 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbRDRE else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbRDRE
processRDRE_data(LD_info, FULL_FCDA_Name, v); processRDRE_data(LD_info, FULL_FCDA_Name, v);
} }
else if (strstr(FULL_FCDA_Name, "GGIO") || strstr(FULL_FCDA_Name, "LPHD")) else if (strstr(FULL_FCDA_Name, "GGIO"))
{ {
ied_t* ied = LD_info->ied; ied_t* ied = LD_info->ied;
ied_usr_t* ied_usr = GET_IEDEXT_ADDR(ied); ied_usr_t* ied_usr = GET_IEDEXT_ADDR(ied);

View File

@@ -194,7 +194,7 @@ apr_status_t init_rdb()
//char buf[256]; //char buf[256];
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程调用web台账接口失败", get_front_msg_from_subdir(), g_front_seg_index); //format_log_msg(buf,sizeof(buf),"前置的%s%d号进程调用web台账接口失败", get_front_msg_from_subdir(), g_front_seg_index);
//log_error("process", buf); //log_error("process", buf);
DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"【ERROR】前置的%s%d号进程调用web台账接口失败", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_LEDGER,"前置的%s%d号进程调用web台账接口失败", get_front_msg_from_subdir(), g_front_seg_index);
return rv; return rv;
} }
@@ -209,7 +209,7 @@ apr_status_t init_rdb()
//char buf[256]; //char buf[256];
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程调用web模型接口失败", get_front_msg_from_subdir(), g_front_seg_index); //format_log_msg(buf,sizeof(buf),"前置的%s%d号进程调用web模型接口失败", get_front_msg_from_subdir(), g_front_seg_index);
//log_error("process", buf); //log_error("process", buf);
DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"【ERROR】前置的%s%d号进程调用web模型接口失败", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_ICD_AND_DOWNLOAD,"前置的%s%d号进程调用web模型接口失败", get_front_msg_from_subdir(), g_front_seg_index);
return rv; return rv;
} }
@@ -220,7 +220,7 @@ apr_status_t init_rdb()
if (rv != APR_SUCCESS) { if (rv != APR_SUCCESS) {
echo_errg("Failed to parse report log define ini file! \n"); echo_errg("Failed to parse report log define ini file! \n");
DIY_ERRORLOG_CODE("process",LOG_CODE_RPTINIT,"【ERROR】前置的%s%d号进程报告初始化失败", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_RPTINIT,"前置的%s%d号进程报告初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
return rv; return rv;
} }
@@ -228,7 +228,7 @@ apr_status_t init_rdb()
if (app_get_private_config(g_my_conf_fname) != APR_SUCCESS) { if (app_get_private_config(g_my_conf_fname) != APR_SUCCESS) {
echo_errg("Failed when processing private configuration\n"); echo_errg("Failed when processing private configuration\n");
DIY_ERRORLOG_CODE("process",LOG_CODE_OTHER,"【ERROR】前置的%s%d号进程读取mms配置失败", get_front_msg_from_subdir(), g_front_seg_index); DIY_ERRORLOG_CODE("process",LOG_CODE_OTHER,"前置的%s%d号进程读取mms配置失败", get_front_msg_from_subdir(), g_front_seg_index);
return APR_EGENERAL; return APR_EGENERAL;
} }

View File

@@ -562,11 +562,11 @@ void processQVVR_end(LD_info_t* LD_info)
long long utc_or_beijing; long long utc_or_beijing;
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0 if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
s_or_ms = 0.001; s_or_ms = 0.001;
//DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s上送的暂态持续时间单位是秒,监测点对应装置型号:%s",LD_info->name,LD_info->mp_id,ied_usr->dev_type); //DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"监测点:%s - id:%s上送的暂态持续时间单位是秒,监测点对应装置型号:%s",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
} }
else{ else{
s_or_ms = 1.0; s_or_ms = 1.0;
//DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s上送的暂态持续时间单位是毫秒,监测点对应装置型号:%s",LD_info->name,LD_info->mp_id,ied_usr->dev_type); //DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"监测点:%s - id:%s上送的暂态持续时间单位是毫秒,监测点对应装置型号:%s",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
} }
if(strcmp(cfg.ValueOfTimeUnit, "utc") == 0){//上送的是utc还是北京 if(strcmp(cfg.ValueOfTimeUnit, "utc") == 0){//上送的是utc还是北京
@@ -635,7 +635,7 @@ void processQVVR_end(LD_info_t* LD_info)
//匹配后再发qvvr起始时间要填暂态触发的时间就是第一次事件上送时只有时间没有值的那个时间 //匹配后再发qvvr起始时间要填暂态触发的时间就是第一次事件上送时只有时间没有值的那个时间
//mq日志 //mq日志
DIY_WARNLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT,"【WARN】监测点%s - id:%s 发生暂态事件,暂态时间:%lld暂态持续时间%f暂态幅值%f暂态类型%d",LD_info->name,LD_info->mp_id, DIY_WARNLOG_CODE(full_key_m_d,LOG_CODE_TRANSIENT,"监测点%s - id:%s 发生暂态事件,暂态时间:%lld暂态持续时间%f暂态幅值%f暂态类型%d",LD_info->name,LD_info->mp_id,
LD_info->qvvr[LD_info->qvvr_idx].QVVR_time, LD_info->qvvr[LD_info->qvvr_idx].QVVR_time,
LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime, LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime,
LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg, LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg,
@@ -669,10 +669,10 @@ void processQVVR_end(LD_info_t* LD_info)
//mq日志 //mq日志
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0 if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s记录了一个暂态事件但是没有匹配到事件的发生时间装置型号:%s 配置的暂态持续时间单位是秒",LD_info->name,LD_info->mp_id,ied_usr->dev_type); DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"监测点:%s - id:%s记录了一个暂态事件但是没有匹配到事件的发生时间装置型号:%s 配置的暂态持续时间单位是秒",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
} }
else{ else{
DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s记录了一个暂态事件但是没有匹配到事件的发生时间装置型号:%s 配置的暂态持续时间单位是毫秒",LD_info->name,LD_info->mp_id,ied_usr->dev_type); DIY_WARNLOG_CODE(full_key_m_c,LOG_CODE_TRANSIENT,"监测点:%s - id:%s记录了一个暂态事件但是没有匹配到事件的发生时间装置型号:%s 配置的暂态持续时间单位是毫秒",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
} }
} }