5 Commits

Author SHA1 Message Date
lnk
d5916f5559 fix D001 2026-03-04 19:15:32 +08:00
lnk
50dd5c8a3e add log in ggio 2026-02-04 09:21:54 +08:00
lnk
1bc32ae38c add debug print 2026-02-02 10:39:27 +08:00
lnk
fe8ba6fad9 fix recall 2026-01-28 13:43:24 +08:00
lnk
a2aa627b1e fix phpst and phplt in statistic data 2026-01-27 16:58:15 +08:00
6 changed files with 180 additions and 11 deletions

View File

@@ -33,6 +33,9 @@ extern std::string WEB_EVENT;
extern std::string WEB_FILEDOWNLOAD;
extern std::string G_CONNECT_TOPIC;
//lnk20250115添加台账锁
extern pthread_mutex_t mtx;
bool DEBUGOPEN = 0;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -56,7 +59,10 @@ public:
int nDataType; //告警SOE事件类型
QString type; //参数等级type类型0-DataType 1-监测点 2-剔除标记 3-发生时刻,毫秒 4-数据链表 5-相位 6-值索引 9-实时SOE事件
QString triggerFlag; //告警SOE事件触发指标名称
int nIndex; //数据在每条线路LineInfo值数组中的位置
int nIndex; //数据在每条线路LineInfo值数组中的位置
QString desc; //soe事件描述
QString DO; //数据对象名
QString DA; //数据属性名
QString strFullName; //数据对象名 $ 数据属性名
@@ -145,7 +151,8 @@ public:
QString WavePhasicA;
QString WavePhasicB;
QString WavePhasicC;
QString UnitOfTimeUnit; //暂态事件持续事件单位0 - 毫秒 1 - 秒
QString TypeOfData; //闪变和统计是否合并 0-分开 1-合并
QString UnitOfTimeUnit; //暂态事件持续事件单位0 - 毫秒 1 - 秒 lnk20260127
QString ValueOfTimeUnit; //上送值的时间UTC-UTC时间 beijing-北京时间
QString WaveTimeFlag; //录波文件的时间UTC-UTC时间 beijing-北京时间
QString IEDname; //例PQMonitor
@@ -244,6 +251,8 @@ bool get_xml_config_by_dev_type(const char* dev_type, XmlConfigC* out_cfg) {
return false;
}
memset(out_cfg, 0, sizeof(*out_cfg));
QString dev_type_q = QString::fromUtf8(dev_type);
QMap<QString, Xmldata*>::iterator it = xmlinfo_list.find(dev_type_q);
if (it == xmlinfo_list.end() || it.value() == nullptr) {
@@ -259,6 +268,7 @@ 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->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->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->WaveTimeFlag, cfg.WaveTimeFlag.toUtf8().constData(), sizeof(out_cfg->WaveTimeFlag) - 1);
strncpy(out_cfg->IEDname, cfg.IEDname.toUtf8().constData(), sizeof(out_cfg->IEDname) - 1);
@@ -865,6 +875,7 @@ bool ParseXMLConfig2(int xml_flag, XmlConfig *cfg, list<CTopic*> *ctopiclist,QSt
{
CEventData* ed = new CEventData(); //SOE事件类指针
ed->triggerFlag = node.toElement().attribute("name"); //SOE名称
ed->desc = node.toElement().attribute("desc"); //SOE描述
ed->DO = node.toElement().attribute("DO"); //数据对象名
ed->DA = node.toElement().attribute("DA"); //数据属性名
ed->type = node.toElement().attribute("type"); //参数等级type类型0-DataType 1-监测点 2-剔除标记 3-发生时刻,毫秒 4-数据链表 5-相位 6-值索引 9-实时SOE事件
@@ -898,6 +909,11 @@ bool ParseXMLConfig2(int xml_flag, XmlConfig *cfg, list<CTopic*> *ctopiclist,QSt
{
cfg->UnitOfTimeUnit.append(e.attribute("Unit"));
}
//lnk 20260127
if ("TypeOfData" == strTag)
{
cfg->TypeOfData.append(e.attribute("Unit"));
}
if ("ValueOfTime" == strTag)
{
cfg->ValueOfTimeUnit.append(e.attribute("Unit"));
@@ -1029,9 +1045,46 @@ 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添加角型接线处理
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;
////lnk2024-8-15 区分星型,角型接线
@@ -1054,7 +1107,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;
ctopic_list = xmlinfo_list2[data->dev_type]->topicList;
if(DEBUGOPEN)printCTopicList(ctopic_list);
}
else {
cout << "transfer_json_block_data not contain data->dev_type:" << data->dev_type.toStdString() << " !!!!"<< endl;
@@ -1063,6 +1116,43 @@ 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 longjumpflag = false;
@@ -1336,11 +1426,16 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
kafka_data_list_mutex.unlock(); //解锁
longjumpflag = true;
}
if (longjumpflag == true || shortjumpflag == true) {
return 1;
}
//lnk20260127
if (typeofdata == false || data_have_static == false) {//不合并则处理完闪变就不处理其他数据,如果有统计数据或者数据类型区分了就继续处理其他数据
if (longjumpflag == true || shortjumpflag == true) {
return 1;
}
}
} //②-②历史闪变数据解析结束!--------------------------------
//合并则继续处理其他数据
if (1 == pDataType->iDataType) //②-①历史稳态数据-----------------------------------------------------------
{
Ckafka_data_t KafkaData; //kafka发送数据结构类对象
@@ -2240,8 +2335,10 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
kafka_data_list_mutex.unlock(); //解锁
longjumpflag = true;
}
if (longjumpflag == true || shortjumpflag == true) {
return 1;
if (typeofdata == false || data_have_static == false) {//不合并则处理完闪变就不处理其他数据
if (longjumpflag == true || shortjumpflag == true) {
return 1;
}
}
//return 1; //结束该函数,停止后续代码执行
} //②-②历史闪变数据解析结束!--------------------------------
@@ -2561,8 +2658,35 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
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)
{
//监测点日志的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;
if (xmlinfo_list.contains(devtype)) {
c_xmlcfg = xmlinfo_list[devtype]->xmlcfg;
@@ -2594,6 +2718,28 @@ void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long ti
if (pEventData->strFullName.indexOf(Full_name) != -1)
{
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;
}
}
@@ -2606,6 +2752,7 @@ void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long ti
kafka_data_list_mutex.lock(); //加锁
kafka_data_list.append(KafkaData); //添加 kafka发送链表
kafka_data_list_mutex.unlock(); //解锁
}
//zw修改 2023-8-31 新增或更新list队列 写入xml数据库信息 模型编码 终端型号 终端厂家 oss存储路径 时间

View File

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

View File

@@ -1759,6 +1759,19 @@ 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)
{
if(INITFLAG != 1)return 1;//防止崩溃
@@ -2348,8 +2361,11 @@ int json_block_create_data(char monid_char[], char* mms_str, double v, int flick
if (pdata != NULL)
{
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);
}
}
return TRUE;
}

View File

@@ -159,7 +159,8 @@ typedef enum LogCode {
LOG_CODE_LOG_REQUEST = 405, /* 日志请求 */
LOG_CODE_REPORT = 500, /* 报告处理 */
LOG_CODE_COMM = 600, /* 通讯状态 */
LOG_CODE_SPACE_ALARM = 700 /* 空间告警 */
LOG_CODE_SPACE_ALARM = 700, /* 空间告警 */
LOG_CODE_DEVICE = 800 /* 设备告警 */
} LogCode;
#ifdef __cplusplus

View File

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

View File

@@ -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
processRDRE_data(LD_info, FULL_FCDA_Name, v);
}
else if (strstr(FULL_FCDA_Name, "GGIO"))
else if (strstr(FULL_FCDA_Name, "GGIO") || strstr(FULL_FCDA_Name, "LPHD"))
{
ied_t* ied = LD_info->ied;
ied_usr_t* ied_usr = GET_IEDEXT_ADDR(ied);