2025-01-16 16:17:01 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @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>
|
|
|
|
|
|
*
|
|
|
|
|
|
* @version: $Revision: 1.11 $
|
|
|
|
|
|
* @date: $Date: 2018/12/23 12:39:52 $
|
|
|
|
|
|
* @author: $Author: lizhongming $
|
|
|
|
|
|
* @state: $State: Exp $
|
|
|
|
|
|
*
|
|
|
|
|
|
* @latest: $Id: rdb_ext_utils.c,v 1.11 2018/12/23 12:39:52 lizhongming Exp $
|
|
|
|
|
|
*/
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
#include "rdb_client.h"
|
|
|
|
|
|
#include "xmltools.h"
|
|
|
|
|
|
#include "db_interface.h"
|
2025-03-04 17:29:04 +08:00
|
|
|
|
#include "../cfg_parse/custom_printf.h"//lnk20250225
|
2025-01-16 16:17:01 +08:00
|
|
|
|
//extern rdb_t* g_rdb ;
|
|
|
|
|
|
extern node_t* g_node ;
|
|
|
|
|
|
extern char g_my_conf_fname[256];
|
|
|
|
|
|
extern apr_pool_t* g_init_pool;
|
|
|
|
|
|
extern apr_pool_t* g_run_pool;
|
|
|
|
|
|
extern pt61850app_t* g_pt61850app;
|
|
|
|
|
|
//extern int g_sysfile_appid;
|
|
|
|
|
|
//extern char *g_sysfile_filedir;
|
|
|
|
|
|
//int my_index =0;
|
|
|
|
|
|
//extern ied_info_t *my_info;
|
|
|
|
|
|
//extern byte_t g_file_name_len;
|
|
|
|
|
|
//extern byte_t g_file_time_from;
|
|
|
|
|
|
////////////////////////str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
char* str_trim_both(char* temp,const char* pattern)
|
|
|
|
|
|
{ // pattern such as " \t" or " \t\'"
|
|
|
|
|
|
unsigned int i,j;
|
|
|
|
|
|
for(i=0;i<strlen(temp);i++) {
|
|
|
|
|
|
if ( strchr(pattern,temp[i]) == NULL )
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
temp +=i;
|
|
|
|
|
|
|
|
|
|
|
|
for(j=(strlen(temp)-1);j>=0;j--) {
|
|
|
|
|
|
if ( strchr(pattern,temp[j]) )
|
|
|
|
|
|
temp[j] = 0;
|
|
|
|
|
|
else
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
return(temp);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////rdb 61850<35><30><EFBFBD><EFBFBD><EFBFBD>ṹ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
ied_usr_t* GET_IEDEXT_ADDR(ied_t *ied)
|
|
|
|
|
|
{
|
|
|
|
|
|
assert(ied);
|
|
|
|
|
|
return (ied_usr_t* )ied->usr_ext;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
element_usr_t* GET_DOTEXT_ADDR(element_t *elem)
|
|
|
|
|
|
{
|
|
|
|
|
|
element_usr_t *elem_usr;
|
|
|
|
|
|
assert(elem);
|
|
|
|
|
|
if (elem->usr_ext == NULL) {
|
|
|
|
|
|
elem_usr = apr_pcalloc(g_init_pool,sizeof(element_usr_t));
|
|
|
|
|
|
elem_usr->last_soe_status = 99;
|
|
|
|
|
|
elem->usr_ext = elem_usr;
|
|
|
|
|
|
}
|
|
|
|
|
|
return (element_usr_t* )elem->usr_ext;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LD_info_t* find_LD_from_cpuCount_and_LEDRs(ied_t* ied, byte_t cpuCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
LD_info_t *LD_info = NULL;
|
|
|
|
|
|
element_t *elem = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
LD_info = & (GET_IEDEXT_ADDR(ied)->LD_info[cpuCount]);
|
|
|
|
|
|
|
|
|
|
|
|
elem = apr_hash_get(LD_info->ht_fcd, "LLN0$CO$LEDRs", APR_HASH_KEY_STRING);
|
|
|
|
|
|
if (elem)
|
|
|
|
|
|
return LD_info;
|
|
|
|
|
|
else
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LD_info_t* find_LD_from_cpuId(ied_t* ied,byte_t cpuId)
|
|
|
|
|
|
{
|
|
|
|
|
|
int cpuno;
|
|
|
|
|
|
LD_info_t* LD_info = NULL;
|
|
|
|
|
|
assert(ied);
|
|
|
|
|
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
|
|
|
|
|
if ( ied->cpuinfo[cpuno].addr != cpuId )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
LD_info = & (GET_IEDEXT_ADDR(ied)->LD_info[cpuno]) ;
|
|
|
|
|
|
}
|
|
|
|
|
|
return LD_info;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LD_info_t* find_LD_from_IEDLDName(ied_t* ied, char *IEDLDName)
|
|
|
|
|
|
{
|
|
|
|
|
|
int cpuno;
|
|
|
|
|
|
LD_info_t* LD_info = NULL;
|
|
|
|
|
|
assert(ied);
|
|
|
|
|
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
|
|
|
|
|
LD_info = & (GET_IEDEXT_ADDR(ied)->LD_info[cpuno]) ;
|
|
|
|
|
|
if(LD_info->LD_name){
|
|
|
|
|
|
if (strcmp(LD_info->LD_name, IEDLDName)==0)
|
|
|
|
|
|
return LD_info;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LD_info_t* find_LD_from_IEDLDName_in_report(ied_t* ied, char *IEDLDName)
|
|
|
|
|
|
{
|
|
|
|
|
|
ST_CHAR * DomName;
|
|
|
|
|
|
LD_info_t* LD_info = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
DomName = IEDLDName; //strtok (DataReference, "/");/* extract domain name */
|
|
|
|
|
|
LD_info = find_LD_from_IEDLDName(ied, DomName);
|
|
|
|
|
|
assert(LD_info);
|
|
|
|
|
|
return LD_info;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LD_info_t* find_LD_from_element(element_t* elem)
|
|
|
|
|
|
{
|
|
|
|
|
|
return find_LD_from_cpuId(elem->ied, (elem->grp->id>>8)&0xff ) ;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RCB_INFO* FindRcbInfo(MVL_NET_INFO *net_info,ST_CHAR *dom_name, ST_CHAR *rcb_name)
|
|
|
|
|
|
{
|
|
|
|
|
|
ied_t *ied;
|
|
|
|
|
|
ied_usr_t *ied_usr;
|
|
|
|
|
|
chnl_usr_t *chnl_usr;
|
|
|
|
|
|
LD_info_t *LD_info;
|
|
|
|
|
|
rptinfo_t *rptinfo = NULL;
|
|
|
|
|
|
int cpuno,rpt_no;
|
|
|
|
|
|
char rpt_inst_name[65];
|
|
|
|
|
|
|
|
|
|
|
|
chnl_usr = net_info->user_ext;
|
|
|
|
|
|
ied = chnl_usr->chnl->ied;
|
|
|
|
|
|
ied_usr = GET_IEDEXT_ADDR(ied);
|
|
|
|
|
|
|
|
|
|
|
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
|
|
|
|
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
|
|
|
|
|
if (!LD_info->LD_name)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
if ( strcmp(LD_info->LD_name,dom_name)!=0 )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
|
|
|
|
|
rptinfo = LD_info->rptinfo[rpt_no];
|
|
|
|
|
|
get_rpt_inst_name(rptinfo,rpt_inst_name);
|
|
|
|
|
|
if ( strcmp(rpt_inst_name,rcb_name)==0 ) {
|
|
|
|
|
|
if (rptinfo->rpt_registered)
|
|
|
|
|
|
return rptinfo->m_rcb_info;
|
|
|
|
|
|
else
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////
|
|
|
|
|
|
//WW 2023-08-29 <20><><EFBFBD><EFBFBD>rcb_info<66><6F>dev_type<70><EFBFBD><F3B6A8B2>Ǻͼ<C7BA><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F3B6A8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<DEB8><C4B9><EFBFBD><F2A3ACB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
|
|
|
|
|
|
rptinfo_t* find_rptinfo_from_net_rpt_info_name(MVL_NET_INFO *net_info, RCB_INFO *rcb_info)
|
|
|
|
|
|
{
|
|
|
|
|
|
ied_t *ied;
|
|
|
|
|
|
ied_usr_t *ied_usr;
|
|
|
|
|
|
chnl_usr_t *chnl_usr;
|
|
|
|
|
|
LD_info_t *LD_info;
|
|
|
|
|
|
rptinfo_t *rptinfo = NULL;
|
|
|
|
|
|
int cpuno,rpt_no;
|
|
|
|
|
|
|
|
|
|
|
|
chnl_usr = net_info->user_ext;
|
|
|
|
|
|
ied = chnl_usr->chnl->ied;
|
|
|
|
|
|
ied_usr = GET_IEDEXT_ADDR(ied);
|
|
|
|
|
|
|
|
|
|
|
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
|
|
|
|
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
|
|
|
|
|
|
|
|
|
|
|
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 <20><EFBFBD>Ϊƥ<CEAA><C6A5><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
|
return rptinfo;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
//WW 2023-08-29 ע<><D7A2>
|
|
|
|
|
|
////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////
|
|
|
|
|
|
//WW 2023-08-29 ע<><D7A2>
|
|
|
|
|
|
rptinfo_t* find_rptinfo_from_net_rcb_info(MVL_NET_INFO *net_info,RCB_INFO *rcb_info)
|
|
|
|
|
|
{
|
|
|
|
|
|
ied_t *ied;
|
|
|
|
|
|
ied_usr_t *ied_usr;
|
|
|
|
|
|
chnl_usr_t *chnl_usr;
|
|
|
|
|
|
LD_info_t *LD_info;
|
|
|
|
|
|
rptinfo_t *rptinfo = NULL;
|
|
|
|
|
|
int cpuno,rpt_no;
|
|
|
|
|
|
|
|
|
|
|
|
chnl_usr = net_info->user_ext;
|
|
|
|
|
|
ied = chnl_usr->chnl->ied;
|
|
|
|
|
|
ied_usr = GET_IEDEXT_ADDR(ied);
|
|
|
|
|
|
|
|
|
|
|
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
|
|
|
|
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
|
|
|
|
|
|
|
|
|
|
|
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
|
|
|
|
|
rptinfo = LD_info->rptinfo[rpt_no];
|
|
|
|
|
|
if (rcb_info==rptinfo->m_rcb_info)
|
|
|
|
|
|
return rptinfo;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////
|
|
|
|
|
|
//WW 2023-08-29 ע<><D7A2> end
|
|
|
|
|
|
void get_rpt_inst_name(rptinfo_t *rptinfo, char * rpt_inst_name )
|
|
|
|
|
|
{
|
|
|
|
|
|
strcpy(rpt_inst_name,rptinfo->rptID);
|
|
|
|
|
|
if (rptinfo->instanceNeedSuffix) {
|
|
|
|
|
|
char rpt_suffix_str[8];
|
|
|
|
|
|
apr_snprintf(rpt_suffix_str,sizeof(rpt_suffix_str),"%02d",rptinfo->m_curRptSuffix);
|
|
|
|
|
|
strcat(rpt_inst_name,rpt_suffix_str);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void strip_file_name_tail_to_ms(char *fileName)
|
|
|
|
|
|
{
|
|
|
|
|
|
char *p = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
assert(fileName);
|
|
|
|
|
|
assert(strlen(fileName)<128);
|
|
|
|
|
|
assert(strlen(fileName)>0);
|
|
|
|
|
|
p = fileName;
|
|
|
|
|
|
while(*p != '.') {
|
|
|
|
|
|
p++;
|
|
|
|
|
|
}
|
|
|
|
|
|
while((p>fileName)&&(*p<0x30 || *p>0x39)) {
|
|
|
|
|
|
p--;
|
|
|
|
|
|
}
|
|
|
|
|
|
*++p = '\0';
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void _cut_file_name(char *fileName, byte_t len)
|
|
|
|
|
|
{
|
|
|
|
|
|
size_t full_len = strlen(fileName);
|
|
|
|
|
|
|
|
|
|
|
|
if (full_len<=len)
|
|
|
|
|
|
return;
|
|
|
|
|
|
else {
|
|
|
|
|
|
memmove(fileName, fileName+(full_len-len), len);
|
|
|
|
|
|
*(fileName+len) = '\0';
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
ied_t* find_ied_from_dev_idx(int dev_idx)
|
|
|
|
|
|
{
|
|
|
|
|
|
ied_t *ied = NULL;
|
|
|
|
|
|
int iedno;
|
|
|
|
|
|
ied_usr_t *ied_usr = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
for(iedno=0; iedno<g_node->n_clients; iedno++) {
|
|
|
|
|
|
ied = g_node->clients[iedno];
|
|
|
|
|
|
ied_usr = (ied_usr_t*)ied->usr_ext;
|
|
|
|
|
|
if (ied_usr && ied_usr->dev_idx == dev_idx )
|
|
|
|
|
|
return ied;
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ied_t* find_ied_from_dev_code(char dev_idx[])
|
|
|
|
|
|
{
|
|
|
|
|
|
ied_t* ied = NULL;
|
|
|
|
|
|
int iedno;
|
|
|
|
|
|
ied_usr_t* ied_usr = NULL;
|
|
|
|
|
|
for (iedno = 0; iedno < g_node->n_clients; iedno++) {
|
|
|
|
|
|
ied = g_node->clients[iedno];
|
|
|
|
|
|
ied_usr = (ied_usr_t*)ied->usr_ext;
|
|
|
|
|
|
if (ied_usr && strcmp(ied_usr->terminal_code, dev_idx) == 0) {
|
|
|
|
|
|
return ied;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//lnk20250114<31><34><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ն<EFBFBD>id<69><64><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>
|
|
|
|
|
|
ied_t* find_ied_from_terminal_id(char terminal_id[])
|
|
|
|
|
|
{
|
|
|
|
|
|
ied_t* ied = NULL;
|
|
|
|
|
|
int iedno;
|
|
|
|
|
|
ied_usr_t* ied_usr = NULL;
|
|
|
|
|
|
for (iedno = 0; iedno < g_node->n_clients; iedno++) {
|
|
|
|
|
|
ied = g_node->clients[iedno];
|
|
|
|
|
|
ied_usr = (ied_usr_t*)ied->usr_ext;
|
|
|
|
|
|
if (ied_usr && strcmp(ied_usr->terminal_id, terminal_id) == 0) {
|
|
|
|
|
|
return ied;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
2025-01-21 17:48:37 +08:00
|
|
|
|
//lnk20250121<32>Ҳ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>ied<65>ռ<EFBFBD>
|
2025-01-22 17:00:34 +08:00
|
|
|
|
ied_t* find_ied_unused()
|
2025-01-21 17:48:37 +08:00
|
|
|
|
{
|
|
|
|
|
|
ied_t* ied_find_unused = NULL;
|
|
|
|
|
|
int iedno;
|
|
|
|
|
|
ied_usr_t* ied_usr_find_unused = NULL;
|
|
|
|
|
|
for (iedno = 0; iedno < g_node->n_clients; iedno++) {
|
|
|
|
|
|
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) {
|
2025-01-22 17:00:34 +08:00
|
|
|
|
return ied_find_unused;//<2F>ҵ<EFBFBD><D2B5><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>
|
2025-01-21 17:48:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
2025-01-16 16:17:01 +08:00
|
|
|
|
|
|
|
|
|
|
LD_info_t* find_LD_info_from_line_id(ied_t* ied, int line_id)
|
|
|
|
|
|
{
|
|
|
|
|
|
LD_info_t *LD_info = NULL;
|
|
|
|
|
|
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
|
|
|
|
|
|
int cpuno;
|
|
|
|
|
|
|
|
|
|
|
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
|
|
|
|
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
|
|
|
|
|
if (LD_info && LD_info->line_id==line_id)
|
|
|
|
|
|
return LD_info;
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LD_info_t* find_LD_info_only_from_line_id(int line_id)
|
|
|
|
|
|
{
|
|
|
|
|
|
ied_t *ied = NULL;
|
|
|
|
|
|
int iedno;
|
|
|
|
|
|
LD_info_t *LD_info = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
for(iedno=0; iedno<g_node->n_clients; iedno++) {
|
|
|
|
|
|
ied = g_node->clients[iedno];
|
|
|
|
|
|
if (ied) {
|
|
|
|
|
|
LD_info = find_LD_info_from_line_id(ied,line_id);
|
|
|
|
|
|
if (LD_info)
|
|
|
|
|
|
return LD_info;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LD_info_t* find_LD_info_from_mp_id(ied_t* ied, char* mp_id)
|
|
|
|
|
|
{
|
|
|
|
|
|
LD_info_t* LD_info = NULL;
|
|
|
|
|
|
ied_usr_t* ied_usr = GET_IEDEXT_ADDR(ied);
|
|
|
|
|
|
int cpuno;
|
|
|
|
|
|
|
|
|
|
|
|
for (cpuno = 0; cpuno < ied->cpucount; cpuno++) {
|
|
|
|
|
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
|
|
|
|
|
if (LD_info && strcmp(LD_info->mp_id, mp_id) == 0)
|
|
|
|
|
|
return LD_info;
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LD_info_t* find_LD_info_only_from_mp_id(char* mp_id)
|
|
|
|
|
|
{
|
|
|
|
|
|
ied_t* ied = NULL;
|
|
|
|
|
|
int iedno;
|
|
|
|
|
|
LD_info_t* LD_info = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
for (iedno = 0; iedno < g_node->n_clients; iedno++) {
|
|
|
|
|
|
ied = g_node->clients[iedno];
|
|
|
|
|
|
if (ied) {
|
|
|
|
|
|
LD_info = find_LD_info_from_mp_id(ied, mp_id);
|
|
|
|
|
|
if (LD_info)
|
|
|
|
|
|
return LD_info;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void clear_all_LD_real_soe_report_shoud_register()
|
|
|
|
|
|
{
|
|
|
|
|
|
ied_t *ied = NULL;
|
|
|
|
|
|
int iedno;
|
|
|
|
|
|
ied_usr_t *ied_usr = NULL;
|
|
|
|
|
|
LD_info_t *LD_info = NULL;
|
|
|
|
|
|
int cpuno;
|
|
|
|
|
|
|
|
|
|
|
|
for(iedno=0; iedno<g_node->n_clients; iedno++) {
|
|
|
|
|
|
ied = g_node->clients[iedno];
|
|
|
|
|
|
ied_usr = (ied_usr_t*)ied->usr_ext;
|
|
|
|
|
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
|
|
|
|
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
|
|
|
|
|
if (LD_info ) {
|
|
|
|
|
|
LD_info->real_data = 0;
|
|
|
|
|
|
LD_info->soe_data = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void clear_rpt_counter_by_trigger(trigger_t *trigger)
|
|
|
|
|
|
{
|
|
|
|
|
|
ied_t *ied;
|
|
|
|
|
|
LD_info_t *LD_info;
|
|
|
|
|
|
int rpt_no;
|
|
|
|
|
|
rptinfo_t *rptinfo = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
trigger->count = 0;
|
|
|
|
|
|
ied = find_ied_from_dev_idx(trigger->dev_idx);
|
|
|
|
|
|
if (!ied)
|
|
|
|
|
|
return;
|
|
|
|
|
|
LD_info = find_LD_info_from_line_id(ied,trigger->line_id);
|
|
|
|
|
|
if (!LD_info)
|
|
|
|
|
|
return;
|
|
|
|
|
|
LD_info->count = 0;
|
|
|
|
|
|
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
|
|
|
|
|
rptinfo = LD_info->rptinfo[rpt_no];
|
|
|
|
|
|
rptinfo->count = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int get_real_report_count(LD_info_t *LD_info)
|
|
|
|
|
|
{
|
|
|
|
|
|
int rpt_no;
|
|
|
|
|
|
rptinfo_t *rptinfo = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
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)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>жϱ<D0B6><CFB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (rptinfo->report_PQ_type)//<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ж<EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ж<EFBFBD>
|
|
|
|
|
|
return rptinfo->count;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////<2F><>ѹ<EFBFBD><D1B9><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; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ûʹ<C3BB>ã<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (i>=QVVR_NUM) { //<2F>Ѿ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint32_t timestamp = LD_info->qvvr[0].timestamp;//<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
LD_info->qvvr_idx = 0;//<2F>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>㿪ʼ<E3BFAA><CABC>¼
|
|
|
|
|
|
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) {//<2F>ҵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>С<EFBFBD>ĵ㣬ʹ<E3A3AC><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|
|
|
|
|
LD_info->qvvr_idx = i;
|
|
|
|
|
|
timestamp = LD_info->qvvr[i].timestamp;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_RECEIVED;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>յ<EFBFBD><D5B5><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>
|
|
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 0; //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>
|
|
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].timestamp = apr_time_sec(apr_time_now());//<2F><>¼<EFBFBD><C2BC>ǰʱ<C7B0><CAB1>Ϊ<EFBFBD><CEAA>̬ʱ<CCAC><CAB1>
|
|
|
|
|
|
printf("\n~~~~~~~~~~~~~~~~~ processQVVR_start: line_id=%d \n",LD_info->line_id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void processQVVR_time(LD_info_t* LD_info, long long Time)
|
|
|
|
|
|
{
|
|
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_time = Time;
|
|
|
|
|
|
printf("\n~~~~~~~~~~~~~~~~~ processQVVR_time: line_id=%d ,Time=%lld \n",LD_info->line_id,Time);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void processQVVR_data(LD_info_t* LD_info,char* FULL_FCDA_Name,double v)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ( strstr(FULL_FCDA_Name,"VarStr$stVal") ) {
|
|
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_start = (v>0.99) ? 1:0;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ( strstr(FULL_FCDA_Name,"VVaTm$mag$f") )
|
2025-03-10 21:26:17 +08:00
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime = (float)v;
|
|
|
|
|
|
|
2025-01-16 16:17:01 +08:00
|
|
|
|
else if ( strstr(FULL_FCDA_Name,"VVa$mag$f") )
|
2025-03-10 21:26:17 +08:00
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg = (float)v;
|
2025-01-16 16:17:01 +08:00
|
|
|
|
else {
|
|
|
|
|
|
if ( strstr(FULL_FCDA_Name,"DipStr$stVal") && (v>0.99) ) //<2F><>ѹ<EFBFBD>ݽ<EFBFBD>
|
2025-03-10 21:26:17 +08:00
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1210002;//<2F><><EFBFBD>սӿ<D5BD><D3BF><EFBFBD>
|
2025-01-16 16:17:01 +08:00
|
|
|
|
else if ( strstr(FULL_FCDA_Name,"SwlStr$stVal") && (v>0.99) ) //<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
|
2025-03-10 21:26:17 +08:00
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1210001;
|
2025-01-16 16:17:01 +08:00
|
|
|
|
else if ( strstr(FULL_FCDA_Name,"IntrStr$stVal") && (v>0.99) ) //<2F><>ѹ<EFBFBD>ж<EFBFBD>
|
2025-03-10 21:26:17 +08:00
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1210004;
|
|
|
|
|
|
|
2025-01-16 16:17:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (strstr(FULL_FCDA_Name, "QVVR")) {
|
|
|
|
|
|
apr_snprintf(LD_info->qvvr[LD_info->qvvr_idx].QVVR_Rptname, sizeof(LD_info->qvvr[LD_info->qvvr_idx].QVVR_Rptname), "%s", FULL_FCDA_Name);//terminal_code
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
printf("\n~~~~~~~~~~~~~~~~~ processQVVR_data: line_id=%d ,mms_str=%s,v=%f \n",LD_info->line_id,FULL_FCDA_Name,v);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void processQVVR_end(LD_info_t* LD_info)
|
|
|
|
|
|
{
|
|
|
|
|
|
//lnk20241227lnk<6E><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>¼<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DZ<C7B1><DFBB><EFBFBD><EFBFBD>ϱ<EFBFBD>һ<EFBFBD>θ<EFBFBD><CEB8><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ﲻ<EFBFBD><EFB2BB><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
|
|
ied_t *ied = LD_info->ied;
|
|
|
|
|
|
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
|
|
|
|
|
|
int ret;
|
2025-03-11 21:07:17 +08:00
|
|
|
|
|
2025-01-16 16:17:01 +08:00
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
int find_paired = FALSE;
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
if (LD_info->qvvr[LD_info->qvvr_idx].QVVR_start)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>ʱFCDA<44><41><EFBFBD><EFBFBD>VarStr$stVal<61><6C>QVVR_startΪ1<CEAA><31><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
for (i=0;i<QVVR_NUM;i++) { //<2F>ݽ<EFBFBD>/<2F><><EFBFBD><EFBFBD>/<2F>жϵȽ<CFB5><C8BD>봦<EFBFBD><EBB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>λ<EFBFBD><CEBB>
|
2025-03-11 21:07:17 +08:00
|
|
|
|
if (i==LD_info->qvvr_idx) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㵱ǰ<E3B5B1><C7B0><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>,<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<45><44>
|
|
|
|
|
|
//<2F>ڶ<EFBFBD><DAB6>μ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Σ<EFBFBD><CEA3>ڶ<EFBFBD><DAB6>εĵ<CEB5>һ<EFBFBD><D2BB><EFBFBD>¼<EFBFBD>qvvr_idx=1<><31>1<EFBFBD><31><EFBFBD><EFBFBD>ΪQVVR_DATA_RECEIVED<45><44>QVVR_start=1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>
|
|
|
|
|
|
//<2F>ڶ<EFBFBD><DAB6>εĵڶ<C4B5><DAB6><EFBFBD><EFBFBD>¼<EFBFBD>qvvr_idx=1<><31>QVVR_start=0<><30><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>0<EFBFBD>У<EFBFBD>0ΪQVVR_DATA_PAIRED
|
|
|
|
|
|
//<2F>ڶ<EFBFBD><DAB6>εĵ<CEB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>qvvr_idx=2<><32>2<EFBFBD><32><EFBFBD><EFBFBD>ΪQVVR_DATA_RECEIVED<45><44>QVVR_start=1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
|
|
|
|
|
|
//<2F>ڶ<EFBFBD><DAB6><EFBFBD>¼<EFBFBD><C2BC>ƥ<EFBFBD><C6A5><EFBFBD>ļ<EFBFBD>ʱӦ<CAB1><D3A6>ƥ<EFBFBD>䵽1<E4B5BD>ŵ<EFBFBD>qvvrtime<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1û<31><C3BB>QVVR_DATA_PAIRED<45><44><EFBFBD>ԶԲ<D4B6><D4B2>ϣ<EFBFBD><CFA3><EFBFBD>Ҫ<EFBFBD><EFBFBD><DEB8><EFBFBD>
|
2025-01-16 16:17:01 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
if (LD_info->qvvr[i].used_status != QVVR_DATA_RECEIVED)//<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|
|
|
|
|
continue;
|
2025-03-11 21:07:17 +08:00
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD>lnk20250311
|
2025-03-12 14:33:55 +08:00
|
|
|
|
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
|
|
|
|
|
|
- LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime));
|
2025-03-11 21:07:17 +08:00
|
|
|
|
continue;
|
2025-03-12 14:33:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-11 21:07:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ijλ<C4B3>õIJ<C3B5><C4B2><EFBFBD>Ҳû<D2B2>ж<EFBFBD><D0B6><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>
|
2025-01-16 16:17:01 +08:00
|
|
|
|
if ( (LD_info->qvvr[i].QVVR_type==0)||(LD_info->qvvr[i].QVVR_type==LD_info->qvvr[LD_info->qvvr_idx].QVVR_type) ) {
|
2025-03-11 11:29:24 +08:00
|
|
|
|
|
2025-03-11 21:07:17 +08:00
|
|
|
|
long long end_tm = (long long)(LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime*1000) + LD_info->qvvr[i].QVVR_time;//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>dz<EFBFBD><C7B3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
2025-03-11 11:29:24 +08:00
|
|
|
|
printf("\n~~~~~~~now qvvr node type before record is %d~~~~~~~~~~ \n",LD_info->qvvr[LD_info->qvvr_idx].QVVR_type);
|
2025-03-11 21:07:17 +08:00
|
|
|
|
printf("~~~~~~~now qvvr node QVVR_PerTime before record is %f~~~~~~~~~~ \n",LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime);
|
|
|
|
|
|
printf("~~~~~~~now qvvr node QVVR_Amg before record is %f~~~~~~~~~~ \n",LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg);
|
|
|
|
|
|
printf("~~~~~~~now qvvr node QVVR_time before record is %lld~~~~~~~~~~ \n",LD_info->qvvr[LD_info->qvvr_idx].QVVR_time);
|
|
|
|
|
|
printf("~~~~~~~now qvvr node used_status before record is %d~~~~~~~~~~ \n",LD_info->qvvr[LD_info->qvvr_idx].used_status);
|
|
|
|
|
|
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);
|
2025-03-11 11:29:24 +08:00
|
|
|
|
|
2025-01-16 16:17:01 +08:00
|
|
|
|
LD_info->qvvr[i].used_status = QVVR_DATA_PAIRED; //ƥ<><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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; //<2F><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>ҵ<EFBFBD><D2B5>ĵ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ϣ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>͵<EFBFBD><CDB5>¼<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_NOT_USED; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ͷ<EFBFBD>
|
|
|
|
|
|
find_paired = TRUE;
|
2025-03-10 21:26:17 +08:00
|
|
|
|
|
2025-03-11 21:07:17 +08:00
|
|
|
|
printf("~~~~~~~this qvvr node QVVR_PerTime after record is %f~~~~~~~~~~ \n",LD_info->qvvr[i].QVVR_PerTime);
|
|
|
|
|
|
printf("~~~~~~~this qvvr node QVVR_Amg after record is %f~~~~~~~~~~ \n",LD_info->qvvr[i].QVVR_Amg);
|
|
|
|
|
|
printf("~~~~~~~this qvvr node used_status after record is %d~~~~~~~~~~ \n",LD_info->qvvr[i].used_status);
|
|
|
|
|
|
printf("~~~~~~~this qvvr node QVVR_type after record is %d~~~~~~~~~~ \n",LD_info->qvvr[i].QVVR_type);
|
|
|
|
|
|
printf("~~~~~~~this qvvr node QVVR_time after record is %lld~~~~~~~~~~ \n",LD_info->qvvr[i].QVVR_time);
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
//ƥ<><C6A5><EFBFBD><EFBFBD><EFBFBD>ٷ<EFBFBD>qvvr<76><72><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD>ǵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ʱֻ<CAB1><D6BB>ʱ<EFBFBD><CAB1>û<EFBFBD><C3BB>ֵ<EFBFBD><D6B5><EFBFBD>Ǹ<EFBFBD>ʱ<EFBFBD><CAB1>
|
2025-03-10 21:26:17 +08:00
|
|
|
|
ret = transfer_json_qvvr_data(g_node_id, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ʹ<EFBFBD><CAB9>
|
|
|
|
|
|
LD_info->line_id, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-03-11 21:07:17 +08:00
|
|
|
|
(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, //<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䡢<EFBFBD><E4A1A2>ʼʱ<CABC>䡢<EFBFBD><E4A1A2><EFBFBD><EFBFBD>ʱ<EFBFBD>䡢<EFBFBD><E4A1A2>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>
|
2025-03-10 21:26:17 +08:00
|
|
|
|
"", "", //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>Ϊ<EFBFBD><CEAA>
|
|
|
|
|
|
LD_info->mp_id, LD_info->qvvr[LD_info->qvvr_idx].QVVR_Rptname, ied_usr->dev_type);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3>ļ<EFBFBD><C4BC>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>¼<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(!ret)//ʧ<><CAA7>
|
|
|
|
|
|
{
|
|
|
|
|
|
printf("\n~~~~~~~~~~~~~~~~~ QVVR_json_data send error: line_id=%d \n",LD_info->line_id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-01-16 16:17:01 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (find_paired == FALSE) {
|
|
|
|
|
|
LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_NOT_USED; //ȫ<><C8AB>û<EFBFBD><C3BB>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣬<EFBFBD>´<EFBFBD><C2B4>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
printf("\n~~~~~~~~~~~~~~~~~ processQVVR_end: line_id=%d \n",LD_info->line_id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>trig_tm<74><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD> QVVR <20><><EFBFBD>ݡ<EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// - LD_info<66><6F>ָ<EFBFBD><D6B8> LD_info_t <20><><EFBFBD>ͽṹ<CDBD><E1B9B9><EFBFBD><EFBFBD>ָ<EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <20><><EFBFBD>ݡ<EFBFBD>
|
|
|
|
|
|
// - trig_tm<74><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD>䡣
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// - <20><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><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<4C><4C>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
|
|
|
|
|
|
// - <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><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>롣
|
|
|
|
|
|
// - <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> QVVR <20><><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD> NULL<4C><4C>
|
|
|
|
|
|
QVVR_t* find_qvvr_by_trig_tm(LD_info_t* LD_info, long long trig_tm)
|
|
|
|
|
|
{
|
|
|
|
|
|
long long diff; // <20><><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
int i; // ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> LD_info <20>е<EFBFBD> QVVR <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
for (i = 0; i < QVVR_NUM; i++) {
|
|
|
|
|
|
// <20><><EFBFBD>㵱ǰ QVVR <20><><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>봥<EFBFBD><EBB4A5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
|
|
|
|
|
|
diff = abs(LD_info->qvvr[i].QVVR_time - trig_tm);
|
|
|
|
|
|
|
2025-03-11 11:29:24 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-03-10 21:26:17 +08:00
|
|
|
|
printf("QVVRTIME:%lld >>>>> COMTRADE trig_tm:%lld >>>>> diff:%lld\n",LD_info->qvvr[i].QVVR_time,trig_tm,diff);
|
|
|
|
|
|
|
2025-01-16 16:17:01 +08:00
|
|
|
|
// <20><><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>룩
|
|
|
|
|
|
if ((LD_info->qvvr[i].used_status == QVVR_DATA_PAIRED) && (diff <= 1)) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ƥ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD>ظ<EFBFBD> QVVR <20><><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><D6B8>
|
2025-03-10 21:26:17 +08:00
|
|
|
|
printf(">>>>> pair QVVR success>>>>>> \n");
|
2025-01-16 16:17:01 +08:00
|
|
|
|
return &(LD_info->qvvr[i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-10 21:26:17 +08:00
|
|
|
|
printf(">>>>> pair QVVR fail>>>>>> \n");
|
2025-01-16 16:17:01 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD> QVVR <20><><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD> NULL
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
QVVR_t* find_qvvr_by_trig_tm(LD_info_t* LD_info,long long trig_tm)
|
|
|
|
|
|
{
|
|
|
|
|
|
long long diff;
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
for (i=0;i<QVVR_NUM;i++) {
|
|
|
|
|
|
diff = abs(LD_info->qvvr[i].QVVR_time-trig_tm);
|
|
|
|
|
|
if ( (LD_info->qvvr[i].used_status==QVVR_DATA_PAIRED) && (diff<=1) ) {
|
|
|
|
|
|
return &(LD_info->qvvr[i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
////////////////////¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>/////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
void processRDRE_start(LD_info_t* LD_info)
|
|
|
|
|
|
{
|
|
|
|
|
|
LD_info->RDRE_FltNum = -1;
|
|
|
|
|
|
printf("\n~~~~~~RDRE~~~~~~ processRDRE_start: line_id=%d \n",LD_info->line_id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void processRDRE_data(LD_info_t* LD_info,char* FULL_FCDA_Name,double v)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ( strstr(FULL_FCDA_Name,"FltNum$stVal") )
|
|
|
|
|
|
LD_info->RDRE_FltNum = (int)(v+0.4);
|
|
|
|
|
|
|
|
|
|
|
|
printf("\n~~~~~~RDRE~~~~~~ processRDRE_data: line_id=%d ,mms_str=%s,v=%f \n",LD_info->line_id,FULL_FCDA_Name,v);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void processRDRE_end(LD_info_t* LD_info)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (LD_info->RDRE_FltNum<=0)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
prepare_call_cn_wavelist(LD_info,LD_info->RDRE_FltNum);
|
|
|
|
|
|
printf("\n~~~~~~RDRE~~~~~~ processRDRE_end: line_id=%d \n",LD_info->line_id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|