add log4cplus

This commit is contained in:
lnk
2025-05-09 16:53:07 +08:00
parent 92117de97e
commit 8a2e6ea537
109 changed files with 18240 additions and 4034 deletions

View File

@@ -1,6 +1,6 @@
/**
* @file: $RCSfile: rdb_ext_utils.c,v $
* @brief: $ rdb <EFBFBD><EFBFBD><EFBFBD><EFBFBD>usr_ext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľṹ<EFBFBD><EFBFBD>һЩ<EFBFBD><EFBFBD><EFBFBD>ߺ<EFBFBD><EFBFBD><EFBFBD>
* @brief: $ rdb 利用usr_ext扩充的结构的一些工具函数
*
* @version: $Revision: 1.11 $
* @date: $Date: 2018/12/23 12:39:52 $
@@ -26,7 +26,7 @@ extern pt61850app_t* g_pt61850app;
//extern ied_info_t *my_info;
//extern byte_t g_file_name_len;
//extern byte_t g_file_time_from;
////////////////////////str <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////
////////////////////////str 辅助函数//////////////////////////
char* str_trim_both(char* temp,const char* pattern)
{ // pattern such as " \t" or " \t\'"
@@ -47,7 +47,7 @@ char* str_trim_both(char* temp,const char* pattern)
}
////////////////////////rdb 61850<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////
////////////////////////rdb 61850扩充结构 辅助函数//////////////////////////
ied_usr_t* GET_IEDEXT_ADDR(ied_t *ied)
{
@@ -163,7 +163,7 @@ RCB_INFO* FindRcbInfo(MVL_NET_INFO *net_info,ST_CHAR *dom_name, ST_CHAR *rcb_nam
return NULL;
}
////////////////////////////////////////
//WW 2023-08-29 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>rcb_info<EFBFBD><EFBFBD>dev_type<EFBFBD>󶨲<EFBFBD><EFBFBD>Ǻͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󶨣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸Ĺ<EFBFBD><EFBFBD>򣬱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD>
//WW 2023-08-29 由于rcb_infodev_type绑定不是和监测点绑定,这里修改规则,保留报告名称匹配
rptinfo_t* find_rptinfo_from_net_rpt_info_name(MVL_NET_INFO *net_info, RCB_INFO *rcb_info)
{
ied_t *ied;
@@ -183,17 +183,17 @@ rptinfo_t* find_rptinfo_from_net_rpt_info_name(MVL_NET_INFO *net_info, RCB_INFO
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
rptinfo = LD_info->rptinfo[rpt_no];
printf("%d rptinfo %s,rcbinfo %s ", rpt_no, rptinfo->rptID, rcb_info->RptID);
if (strcmp(rcb_info->RptID,rptinfo->rptID)==0)//WW <EFBFBD>޸<EFBFBD>Ϊƥ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
if (strcmp(rcb_info->RptID,rptinfo->rptID)==0)//WW 修改为匹配字符串
return rptinfo;
}
}
return NULL;
}
//WW 2023-08-29 ע<EFBFBD><EFBFBD>
//WW 2023-08-29 注释
////////////////////////////////////////
////////////////////////////////////////
//WW 2023-08-29 ע<EFBFBD><EFBFBD>
//WW 2023-08-29 注释
rptinfo_t* find_rptinfo_from_net_rcb_info(MVL_NET_INFO *net_info,RCB_INFO *rcb_info)
{
ied_t *ied;
@@ -219,7 +219,7 @@ rptinfo_t* find_rptinfo_from_net_rcb_info(MVL_NET_INFO *net_info,RCB_INFO *rcb_i
return NULL;
}
////////////////////////////////////////
//WW 2023-08-29 ע<EFBFBD><EFBFBD> end
//WW 2023-08-29 注释 end
void get_rpt_inst_name(rptinfo_t *rptinfo, char * rpt_inst_name )
{
strcpy(rpt_inst_name,rptinfo->rptID);
@@ -293,7 +293,7 @@ ied_t* find_ied_from_dev_code(char dev_idx[])
return NULL;
}
//lnk20250114<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>id<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>
//lnk20250114新增通过终端id查找终端
ied_t* find_ied_from_terminal_id(char terminal_id[])
{
ied_t* ied = NULL;
@@ -309,7 +309,7 @@ ied_t* find_ied_from_terminal_id(char terminal_id[])
}
return NULL;
}
//lnk20250121<EFBFBD>Ҳ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>ied<EFBFBD>ռ<EFBFBD>
//lnk20250121找不使用的ied空间
ied_t* find_ied_unused()
{
ied_t* ied_find_unused = NULL;
@@ -319,7 +319,7 @@ ied_t* find_ied_unused()
ied_find_unused = g_node->clients[iedno];
ied_usr_find_unused = (ied_usr_t*)ied_find_unused->usr_ext;
if (ied_usr_find_unused && ied_usr_find_unused->dev_flag == UNUSED) {
return ied_find_unused;//<EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>
return ied_find_unused;//找到第一个就返回
}
}
return NULL;
@@ -436,8 +436,8 @@ int get_real_report_count(LD_info_t *LD_info)
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
rptinfo = LD_info->rptinfo[rpt_no];
//if (rptinfo->report_PQ_type & REPORT_TYPE_REAL)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (rptinfo->report_PQ_type)//<EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʵʱ<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
//if (rptinfo->report_PQ_type & REPORT_TYPE_REAL)//遍历所有报告判断报告类型
if (rptinfo->report_PQ_type)//上层已判断实时数据,不需要再判断
return rptinfo->count;
}
return 0;
@@ -445,32 +445,32 @@ int get_real_report_count(LD_info_t *LD_info)
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/////////////////////////////
////////////////////电压波动处理/////////////////////////////
void processQVVR_start(LD_info_t* LD_info)
{
int i;
for (i=0;i<QVVR_NUM;i++) {
if (LD_info->qvvr[i].used_status==QVVR_DATA_NOT_USED) {
LD_info->qvvr_idx = i; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ûʹ<EFBFBD>ã<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD_info->qvvr_idx = i; //这个点没使用,使用这个点
break;
}
}
if (i>=QVVR_NUM) { //<EFBFBD>Ѿ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t timestamp = LD_info->qvvr[0].timestamp;//<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
LD_info->qvvr_idx = 0;//<EFBFBD>ӵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>¼
if (i>=QVVR_NUM) { //已经使用到了最后一个点
uint32_t timestamp = LD_info->qvvr[0].timestamp;//第一个点的时间
LD_info->qvvr_idx = 0;//从第一个点开始记录
echo_warn1("QVVR data memory is full,to replace the oldest,line_id=%d \n",LD_info->line_id);
for (i=1;i<QVVR_NUM;i++) {
if (LD_info->qvvr[i].timestamp<timestamp) {//<EFBFBD>ҵ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>ĵ㣬ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
if (LD_info->qvvr[i].timestamp<timestamp) {//找到时间最小的点,使用它的位置
LD_info->qvvr_idx = i;
timestamp = LD_info->qvvr[i].timestamp;
}
}
}
LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_RECEIVED;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 0; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD>
LD_info->qvvr[LD_info->qvvr_idx].timestamp = apr_time_sec(apr_time_now());//<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>ǰʱ<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>̬ʱ<EFBFBD><EFBFBD>
LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_RECEIVED;//这个点标记为收到暂态数据
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 0; //类型未定
LD_info->qvvr[LD_info->qvvr_idx].timestamp = apr_time_sec(apr_time_now());//记录当前时间为暂态时间
printf("\n~~~~~~~~~~~~~~~~~ processQVVR_start: line_id=%d \n",LD_info->line_id);
}
@@ -492,11 +492,11 @@ void processQVVR_data(LD_info_t* LD_info,char* FULL_FCDA_Name,double v)
else if ( strstr(FULL_FCDA_Name,"VVa$mag$f") )
LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg = (float)v;
else {
if ( strstr(FULL_FCDA_Name,"DipStr$stVal") && (v>0.99) ) //<EFBFBD><EFBFBD>ѹ<EFBFBD>ݽ<EFBFBD>
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1210002;//<EFBFBD><EFBFBD><EFBFBD>սӿ<EFBFBD><EFBFBD>޸<EFBFBD>
else if ( strstr(FULL_FCDA_Name,"SwlStr$stVal") && (v>0.99) ) //<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ( strstr(FULL_FCDA_Name,"DipStr$stVal") && (v>0.99) ) //电压暂降
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1210002;//按照接口修改
else if ( strstr(FULL_FCDA_Name,"SwlStr$stVal") && (v>0.99) ) //电压暂升
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1210001;
else if ( strstr(FULL_FCDA_Name,"IntrStr$stVal") && (v>0.99) ) //<EFBFBD><EFBFBD>ѹ<EFBFBD>ж<EFBFBD>
else if ( strstr(FULL_FCDA_Name,"IntrStr$stVal") && (v>0.99) ) //电压中断
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1210004;
}
@@ -512,7 +512,7 @@ void processQVVR_data(LD_info_t* LD_info,char* FULL_FCDA_Name,double v)
void processQVVR_end(LD_info_t* LD_info)
{
//lnk20241227lnk<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>¼<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DZ߻<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>һ<EFBFBD>θ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
//lnk20241227lnk添加暂态事件直接上报,等录波事件上来后,那边会再上报一次更新文件路径,这里不更新文件路径
ied_t *ied = LD_info->ied;
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
int ret;
@@ -522,20 +522,20 @@ void processQVVR_end(LD_info_t* LD_info)
int find_paired = FALSE;
int i;
if (LD_info->qvvr[LD_info->qvvr_idx].QVVR_start)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD>ʱFCDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>VarStr$stVal<EFBFBD><EFBFBD>QVVR_startΪ1<EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (LD_info->qvvr[LD_info->qvvr_idx].QVVR_start)//波动数据处理时FCDA包含VarStr$stValQVVR_start为1退出处理
return;
for (i=0;i<QVVR_NUM;i++) { //<EFBFBD>ݽ<EFBFBD>/<2F><><EFBFBD><EFBFBD>/<2F>жϵȽ<CFB5><C8BD><EFBFBD><EBB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>λ<EFBFBD><CEBB>
if (i==LD_info->qvvr_idx) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㵱ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>,<2C><>һ<EFBFBD>μ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>κ󣬵<CEBA>һ<EFBFBD>εĵ<CEB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>ŵ<EFBFBD>ΪQVVR_DATA_RECEIVED<EFBFBD><EFBFBD>
//<EFBFBD>ڶ<EFBFBD><EFBFBD>μ<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD>εĵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>qvvr_idx=1<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪQVVR_DATA_RECEIVED<EFBFBD><EFBFBD>QVVR_start=1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>
//<EFBFBD>ڶ<EFBFBD><EFBFBD>εĵڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>qvvr_idx=1<EFBFBD><EFBFBD>QVVR_start=0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>0<EFBFBD>У<EFBFBD>QVVR_DATA_PAIRED
//<EFBFBD>ڶ<EFBFBD><EFBFBD>εĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>qvvr_idx=2<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪQVVR_DATA_RECEIVED<EFBFBD><EFBFBD>QVVR_start=1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʱӦ<EFBFBD><EFBFBD>ƥ<EFBFBD>䵽1<EFBFBD>ŵ<EFBFBD>qvvrtime<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QVVR_DATA_PAIRED<EFBFBD><EFBFBD><EFBFBD>ԶԲ<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>޸<EFBFBD><EFBFBD>߼<EFBFBD>
for (i=0;i<QVVR_NUM;i++) { //暂降/暂升/中断等进入处理,遍历所有波动位置
if (i==LD_info->qvvr_idx) //跳过监测点当前波动位置,第一次记录波形后第一次的第三个事件会让0号点为QVVR_DATA_RECEIVED
//第二次记录波形,第二次的第一个事件qvvr_idx=11号中为QVVR_DATA_RECEIVEDQVVR_start=1,跳过记录,
//第二次的第二个事件qvvr_idx=1QVVR_start=0记录到0中0为QVVR_DATA_PAIRED
//第二次的第三个事件qvvr_idx=22号中为QVVR_DATA_RECEIVEDQVVR_start=1,跳过记录
//第二次录波匹配文件时应该匹配到1号的qvvrtime但是1没有QVVR_DATA_PAIRED所以对不上需要修改逻辑
continue;
if (LD_info->qvvr[i].used_status != QVVR_DATA_RECEIVED)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
if (LD_info->qvvr[i].used_status != QVVR_DATA_RECEIVED)//跳过没有收到波动的位置
continue;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>lnk20250311
//添加时间判断lnk20250311
if (fabs((LD_info->qvvr[LD_info->qvvr_idx].QVVR_time - LD_info->qvvr[i].QVVR_time)/1.0
- LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime) > 1.0){
printf("~~~~~~~fail in pair qvvr node %f~~~~~~~~~~ \n",fabs((LD_info->qvvr[LD_info->qvvr_idx].QVVR_time - LD_info->qvvr[i].QVVR_time)/1.0
@@ -545,10 +545,10 @@ void processQVVR_end(LD_info_t* LD_info)
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ijλ<EFBFBD>õIJ<EFBFBD><EFBFBD><EFBFBD>Ҳû<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>λ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͺ͵<CDBA>ǰλ<C7B0>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>£<EFBFBD><C2A3>ݽ<EFBFBD><DDBD>¼<EFBFBD>һ<EFBFBD>λᷢ<CEBB><E1B7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>
//其他某位置的波动也没有定义类型/这个位置的波动类型和当前位置的波动类型一致,暂降事件一次会发三个报告,启动和上值和结束
if ( (LD_info->qvvr[i].QVVR_type==0)||(LD_info->qvvr[i].QVVR_type==LD_info->qvvr[LD_info->qvvr_idx].QVVR_type) ) {
long long end_tm = (long long)(LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime*1000) + LD_info->qvvr[i].QVVR_time;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long long end_tm = (long long)(LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime*1000) + LD_info->qvvr[i].QVVR_time;//结束时间是持续时间加最初的触发时间,毫秒
printf("\n~~~~~~~now qvvr node type before record is %d~~~~~~~~~~ \n",LD_info->qvvr[LD_info->qvvr_idx].QVVR_type);
printf("~~~~~~~now qvvr node QVVR_PerTime before record is %f~~~~~~~~~~ \n",LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime);
@@ -558,12 +558,12 @@ void processQVVR_end(LD_info_t* LD_info)
printf("~~~~~~~now qvvr node QVVR_start before record is %d~~~~~~~~~~ \n",LD_info->qvvr[LD_info->qvvr_idx].QVVR_start);
printf("~~~~~~~now qvvr node timestamp before record is %d~~~~~~~~~~ \n",LD_info->qvvr[LD_info->qvvr_idx].timestamp);
LD_info->qvvr[i].used_status = QVVR_DATA_PAIRED; //ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD_info->qvvr[i].used_status = QVVR_DATA_PAIRED; //匹配上了
LD_info->qvvr[i].QVVR_type = LD_info->qvvr[LD_info->qvvr_idx].QVVR_type;
LD_info->qvvr[i].QVVR_PerTime = LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime;
LD_info->qvvr[i].QVVR_Amg = LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg; //<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>ĵ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD>¼<EFBFBD>
LD_info->qvvr[i].QVVR_Amg = LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg; //记录当前这个点的波动数据到找到的点位置上,确保记录的是最新的相同类型的事件
LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_NOT_USED; //<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>
LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_NOT_USED; //当前这个点位置释放
find_paired = TRUE;
printf("~~~~~~~this qvvr node QVVR_PerTime after record is %f~~~~~~~~~~ \n",LD_info->qvvr[i].QVVR_PerTime);
@@ -574,17 +574,17 @@ void processQVVR_end(LD_info_t* LD_info)
printf("~~~~~~~this qvvr node timestamp before record is %d~~~~~~~~~~ \n",LD_info->qvvr[i].timestamp);
printf("~~~~~~~this qvvr node QVVR_start before record is %d~~~~~~~~~~ \n",LD_info->qvvr[i].QVVR_start);
//ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٷ<EFBFBD>qvvr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼʱ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱֻ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>ʱ<EFBFBD><EFBFBD>
ret = transfer_json_qvvr_data(g_node_id, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
LD_info->line_id, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//匹配后再发qvvr起始时间要填暂态触发的时间就是第一次事件上送时只有时间没有值的那个时间
ret = transfer_json_qvvr_data(g_node_id, //这个参数没有使用
LD_info->line_id, //监测点序号
(double)LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg,
(double)LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime,
LD_info->qvvr[i].QVVR_time,
end_tm,
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type, //<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ʼʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
"", "", //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>
LD_info->mp_id, LD_info->qvvr[LD_info->qvvr_idx].QVVR_Rptname, ied_usr->dev_type);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>¼<EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(!ret)//ʧ<EFBFBD><EFBFBD>
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type, //伏值、持续时间、开始时间、结束时间、暂态类型
"", "", //两个文件路径为空
LD_info->mp_id, LD_info->qvvr[LD_info->qvvr_idx].QVVR_Rptname, ied_usr->dev_type);//监测点号,文件和监测点暂态事件匹配上的暂态报告名,终端类型
if(!ret)//失败
{
printf("\n~~~~~~~~~~~~~~~~~ QVVR_json_data send error: line_id=%d \n",LD_info->line_id);
}
@@ -594,7 +594,7 @@ void processQVVR_end(LD_info_t* LD_info)
}
if (find_paired == FALSE) {
LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_NOT_USED; //ȫ<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_NOT_USED; //全都没有匹配上直接释放这个点,下次事件可以直接在这个点上使用
printf("\nERROR:~~~~~~~~~~~~~ processQVVR qvvr returned to 0,but found no data to pair!, line_id=%d,QVVR_type=%d \n",
LD_info->line_id, LD_info->qvvr[LD_info->qvvr_idx].QVVR_type);
}
@@ -602,38 +602,38 @@ void processQVVR_end(LD_info_t* LD_info)
printf("\n~~~~~~~~~~~~~~~~~ processQVVR_end: line_id=%d \n",LD_info->line_id);
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>trig_tm<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// - LD_info<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD> LD_info_t <EFBFBD><EFBFBD><EFBFBD>ͽṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
// - trig_tm<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <20><><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD><EBA1A3><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD> QVVR <20><><EFBFBD>ݣ<EFBFBD><DDA3>򷵻<EFBFBD> NULL<EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
// - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <20><><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD>
// - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <20><><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD> NULL<EFBFBD><EFBFBD>
// 函数功能根据触发时间戳trig_tm查找匹配的 QVVR 数据。
// 输入参数:
// - LD_info:指向 LD_info_t 类型结构体的指针,包含多个 QVVR 数据。
// - trig_tm:触发时间戳,用于与 QVVR 数据中的时间进行匹配。
// 输出参数:
// - 返回匹配的 QVVR 数据的指针。如果没有找到匹配的 QVVR 数据,则返回 NULL
// 返回值:
// - 如果找到符合条件的 QVVR 数据,返回指向该数据的指针。
// - 如果没有找到符合条件的 QVVR 数据,返回 NULL
QVVR_t* find_qvvr_by_trig_tm(LD_info_t* LD_info, long long trig_tm)
{
long long diff; // <EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int i; // ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long long diff; // 用于计算时间戳差异
int i; // 循环计数器
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> LD_info <EFBFBD>е<EFBFBD> QVVR <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 遍历 LD_info 中的 QVVR 数据数组
for (i = 0; i < QVVR_NUM; i++) {
// <EFBFBD><EFBFBD><EFBFBD>㵱ǰ QVVR <EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD>
// 计算当前 QVVR 数据的时间戳与触发时间戳之间的差异
diff = abs(LD_info->qvvr[i].QVVR_time - trig_tm);
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//调试用
printf("QVVRTIME:%lld >>>>> COMTRADE trig_tm:%lld >>>>> diff:%lld\n",LD_info->qvvr[i].QVVR_time,trig_tm,diff);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <20><><EFBFBD>ݵ<EFBFBD>״̬<D7B4><CCAC> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<22><>QVVR_DATA_PAIRED<45><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>С<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> 1<><31><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>
// 如果该 QVVR 数据的状态是 "已配对"QVVR_DATA_PAIRED并且时间差小于等于 1单位毫秒
if ((LD_info->qvvr[i].used_status == QVVR_DATA_PAIRED) && (diff <= 1)) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD> QVVR <20><><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><D6B8>
// 如果匹配,返回该 QVVR 数据的指针
printf(">>>>> pair QVVR success>>>>>> \n");
return &(LD_info->qvvr[i]);
}
}
printf(">>>>> pair QVVR fail>>>>>> \n");
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <20><><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD> NULL
// 如果没有找到匹配的 QVVR 数据,返回 NULL
return NULL;
}
#if 0
@@ -651,7 +651,7 @@ QVVR_t* find_qvvr_by_trig_tm(LD_info_t* LD_info,long long trig_tm)
return NULL;
}
#endif
////////////////////¼<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/////////////////////////////
////////////////////录波文件处理/////////////////////////////
void processRDRE_start(LD_info_t* LD_info)
{