diff --git a/mms/mms_process.c b/mms/mms_process.c index c9e6060..e8975ef 100644 --- a/mms/mms_process.c +++ b/mms/mms_process.c @@ -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); } } diff --git a/mms/rdb_ext_utils.c b/mms/rdb_ext_utils.c index 52d7e69..3b9fff4 100644 --- a/mms/rdb_ext_utils.c +++ b/mms/rdb_ext_utils.c @@ -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