优化波形文件匹配逻辑和日志提示

This commit is contained in:
lnk
2026-06-12 15:26:19 +08:00
parent d3579a2aa7
commit c221102a5a
2 changed files with 84 additions and 26 deletions

View File

@@ -78,6 +78,23 @@ extern int recall_daily;
extern char* UDS_UPLOAD_URL;
///////////////////////////////////////////////////////////////////
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);
}
//lnk20250122start
apr_status_t init_rem_dib_table()
{
@@ -622,11 +639,11 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
if(strcmp(cfg1.ValueOfTimeUnit, "utc") == 0){//装置时间是utc还是北京
utc_or_beijing = 28800;//秒
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据,下发补招时间为utc时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type);
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据,注意!下发补招时间为utc时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type);
}
else{
utc_or_beijing = 0;
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据,下发补招时间为beijing时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type);
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_RECALL,"【WARN】监测点:%s - id:%s开始补招数据,注意!下发补招时间为beijing时间,监测点对应装置型号:%s", LD_info->name,LD_info->mp_id,ied_usr->dev_type);
}
//////////////////////////////////////////////////////////////
@@ -2363,16 +2380,39 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
//获取时间类型lnk20250520
XmlConfigC cfg;
if (get_xml_config_by_dev_type(ied_usr->dev_type, &cfg)) {
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
DIY_ERRORLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld触发时间:%lld映射配置的暂态持续时间单位是s", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm);
}
else{
DIY_ERRORLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d,录波文件的开始时间:%lld触发时间:%lld映射配置的暂态持续时间单位是ms", LD_info->name,LD_info->mp_id,LD_info->FltNum[i],start_tm,trig_tm);
}
char trig_time_str[64] = {0};
format_time_ms(trig_tm, trig_time_str, sizeof(trig_time_str));
if(strcmp(cfg.WaveTimeFlag, "utc") == 0) {
DIY_ERRORLOG_CODE(
LD_info->mp_id,
2,
LOG_CODE_COMTRADE_FILE,
"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d录波触发时间戳:%lld录波触发时间:%s映射配置的暂态持续时间单位是s",
LD_info->name,
LD_info->mp_id,
LD_info->FltNum[i],
trig_tm,
trig_time_str);
} else {
DIY_ERRORLOG_CODE(
LD_info->mp_id,
2,
LOG_CODE_COMTRADE_FILE,
"【ERROR】监测点:%s - id:%s 匹配录波文件失败,录波号段:%d录波触发时间戳:%lld录波触发时间:%s映射配置的暂态持续时间单位是ms",
LD_info->name,
LD_info->mp_id,
LD_info->FltNum[i],
trig_tm,
trig_time_str);
}
}
else {
printf("读取失败,未找到 dev_type\n");
DIY_ERRORLOG_CODE(LD_info->mp_id,2,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(LD_info->mp_id,2,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);
}
}

View File

@@ -760,10 +760,10 @@ void processQVVR_end(LD_info_t* LD_info)
//mq日志
if(strcmp(cfg.UnitOfTimeUnit, "1") == 0){//持续时间上送的是秒1还是毫秒0
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s记录了一个暂态事件但是没有匹配到事件的发生时间,装置型号:%s 配置的暂态持续时间单位是",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s发生了暂态事件但是没有记录,可能是配置的暂态持续时间不匹配,当前装置型号:%s ,当前使用的配置的暂态持续时间单位是s",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
}
else{
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s记录了一个暂态事件但是没有匹配到事件的发生时间,装置型号:%s 配置的暂态持续时间单位是毫秒",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
DIY_WARNLOG_CODE(LD_info->mp_id,2,LOG_CODE_TRANSIENT,"【WARN】监测点:%s - id:%s发生了暂态事件但是没有记录,可能是配置的暂态持续时间不匹配,当前装置型号:%s ,当前使用的配置的暂态持续时间单位是ms",LD_info->name,LD_info->mp_id,ied_usr->dev_type);
}
}
@@ -782,27 +782,45 @@ void processQVVR_end(LD_info_t* LD_info)
// - 如果没有找到符合条件的 QVVR 数据,返回 NULL。
QVVR_t* find_qvvr_by_trig_tm(LD_info_t* LD_info, long long trig_tm)
{
long long diff; // 用于计算时间戳差异
int i; // 循环计数器
const long long EIGHT_HOURS_MS = 8LL * 60 * 60 * 1000;
// 遍历 LD_info 中的 QVVR 数据数组
for (i = 0; i < QVVR_NUM; i++) {
// 计算当前 QVVR 数据的时间戳与触发时间戳之间的差异
diff = abs(LD_info->qvvr[i].QVVR_time - trig_tm);
long long candidates[3] = {
trig_tm,
trig_tm - EIGHT_HOURS_MS,
trig_tm + EIGHT_HOURS_MS
};
//调试用
printf("QVVRTIME:%lld >>>>> COMTRADE trig_tm:%lld >>>>> diff:%lld\n",LD_info->qvvr[i].QVVR_time,trig_tm,diff);
for (int c = 0; c < 3; ++c) {
// 如果该 QVVR 数据的状态是 "已配对"QVVR_DATA_PAIRED并且时间差小于等于 1单位毫秒
if ((LD_info->qvvr[i].used_status == QVVR_DATA_PAIRED) && (diff <= 1)) {
// 如果匹配,返回该 QVVR 数据的指针
printf(">>>>> pair QVVR success>>>>>> \n");
return &(LD_info->qvvr[i]);
long long cmp_tm = candidates[c];
printf("===== try trig_tm:%lld offset:%lld =====\n",
cmp_tm,
cmp_tm - trig_tm);
for (int i = 0; i < QVVR_NUM; i++) {
long long diff =
llabs(LD_info->qvvr[i].QVVR_time - cmp_tm);
printf("QVVRTIME:%lld >>>>> COMTRADE trig_tm:%lld >>>>> diff:%lld\n",
LD_info->qvvr[i].QVVR_time,
cmp_tm,
diff);
if ((LD_info->qvvr[i].used_status == QVVR_DATA_PAIRED)
&& (diff <= 1))
{
printf(">>>>> pair QVVR success>>>>>> offset=%lld\n",
cmp_tm - trig_tm);
return &(LD_info->qvvr[i]);
}
}
}
printf(">>>>> pair QVVR fail>>>>>> \n");
// 如果没有找到匹配的 QVVR 数据,返回 NULL
printf(">>>>> pair QVVR fail>>>>>>\n");
return NULL;
}
#if 0