qvvr has bug
This commit is contained in:
@@ -150,6 +150,19 @@ int parse_model_cfg_web();
|
||||
void SOEFileWeb(char* localpath,char* cloudpath,char* wavepath);
|
||||
const char* get_front_msg_from_subdir();
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
typedef struct {
|
||||
char WavePhasicFlag[64];
|
||||
char WavePhasicA[64];
|
||||
char WavePhasicB[64];
|
||||
char WavePhasicC[64];
|
||||
char UnitOfTimeUnit[64];
|
||||
char ValueOfTimeUnit[64];
|
||||
char WaveTimeFlag[64];
|
||||
char IEDname[64];
|
||||
char LDevicePrefix[64];
|
||||
} XmlConfigC;
|
||||
|
||||
bool get_xml_config_by_dev_type(const char* dev_type, XmlConfigC* out_cfg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
31
mms/main.c
31
mms/main.c
@@ -55,6 +55,11 @@ SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
|
||||
///////////////////////////////////////////////////////
|
||||
uint32_t g_dead_lock_counter = 0;
|
||||
uint32_t g_thread_blocked_times = 0;
|
||||
|
||||
//给mq生产线程和定时线程都加上死锁计数器
|
||||
uint32_t g_mqproducer_blocked_times = 0;
|
||||
uint32_t g_ontime_blocked_times = 0;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
int three_secs_enabled = 0;
|
||||
int auto_register_report_enabled = 0;
|
||||
@@ -225,9 +230,11 @@ int main(int argc, const char **argv)
|
||||
|
||||
//lnk启动进程日志
|
||||
init_logger_process();
|
||||
char buf[256];
|
||||
sprintf(buf, "前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
log_debug("process", buf);
|
||||
|
||||
//char buf[256];
|
||||
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
//log_debug("process", buf);
|
||||
DIY_WARNLOG("process","前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
|
||||
#ifdef _OS_UNIX_
|
||||
#ifdef QT_NO_DEBUG
|
||||
@@ -260,11 +267,19 @@ int main(int argc, const char **argv)
|
||||
|
||||
rv = init_rdb();
|
||||
if (rv!=APR_SUCCESS){
|
||||
//char buf[256];
|
||||
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 台账初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
//log_error("process", buf);
|
||||
DIY_ERRORLOG("process","前置的%s%d号进程 台账初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = run_protocol();
|
||||
if (rv!=APR_SUCCESS){
|
||||
//char buf[256];
|
||||
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程 线程初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
//log_error("process", buf);
|
||||
DIY_ERRORLOG("process","前置的%s%d号进程 线程初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -307,6 +322,12 @@ int main(int argc, const char **argv)
|
||||
//work线程死了3*13分钟,退出进程
|
||||
if (g_thread_blocked_times>=13) {
|
||||
MVL_LOG_ACSE0 ("MYLOG: g_thread_blocked_times>=3, so exit to restart ");
|
||||
|
||||
//char buf[256];
|
||||
//format_log_msg(buf,sizeof(buf),"前置的业务线程死锁,退出进程");
|
||||
//log_error("process", buf);
|
||||
DIY_ERRORLOG("process","前置的%s%d号进程 业务线程死锁,退出进程", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
|
||||
apr_sleep(apr_time_from_sec(10));
|
||||
exit(-1039);
|
||||
}
|
||||
@@ -422,6 +443,8 @@ void doMonitorTaskmain(void) {
|
||||
if( !(stimer++ % 60) ) {//分钟
|
||||
if (g_dead_lock_counter++ >=3) {//三分钟
|
||||
g_thread_blocked_times++;
|
||||
g_mqproducer_blocked_times++;
|
||||
g_ontime_blocked_times++;
|
||||
g_dead_lock_counter = 0;
|
||||
}
|
||||
MVL_LOG_ACSE1 ("MYLOG: current g_thread_blocked_times = %u ", g_thread_blocked_times);
|
||||
@@ -435,7 +458,7 @@ void doMonitorTaskmain(void) {
|
||||
}
|
||||
|
||||
//work线程死了3*13分钟,退出进程
|
||||
if (g_thread_blocked_times>=13) {
|
||||
if (g_thread_blocked_times>=13 || g_mqproducer_blocked_times>=13 || g_ontime_blocked_times>=13 ) {
|
||||
MVL_LOG_ACSE0 ("MYLOG: g_thread_blocked_times>=3, so exit to restart ");
|
||||
apr_sleep(apr_time_from_sec(10));
|
||||
exit(-1039);
|
||||
|
||||
@@ -659,7 +659,7 @@ void check_3s_config()
|
||||
printf("begin 3s config...\n");
|
||||
|
||||
last_check_3s_config_time = now; //记录本次运行时间
|
||||
while (APR_SUCCESS==parse_3s_xml(&trigger_3s_xml)){ //处理3秒文件
|
||||
while (APR_SUCCESS==parse_3s_xml(&trigger_3s_xml)){ //处理3秒文件,一次处理一个
|
||||
//处理实时触发加台账锁lnk20250114
|
||||
//pthread_mutex_lock(&mtx); printf("3s hold lock !!!!!!!!!!!");
|
||||
process_3s_config(&trigger_3s_xml); //根据文件处理数据
|
||||
@@ -1799,6 +1799,33 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
||||
|
||||
/*上传.cfg和.dat两个文件*/
|
||||
/*上传消息*/
|
||||
/////////////////////////////////////////////////////lnk20250520
|
||||
//根据配置文件控制上传的暂态事件时间为北京时间的ms数
|
||||
printf("~~~~~~~this dev type is %s~~~~~~~",ied_usr->dev_type);
|
||||
XmlConfigC cfg1;
|
||||
if (get_xml_config_by_dev_type(ied_usr->dev_type, &cfg1)) {
|
||||
printf("UnitOfTimeUnit = %s\n", cfg1.UnitOfTimeUnit);
|
||||
printf("ValueOfTimeUnit = %s\n", cfg1.ValueOfTimeUnit);
|
||||
} else {
|
||||
printf("读取失败,未找到 dev_type\n");
|
||||
}
|
||||
double s_or_ms;
|
||||
long long utc_or_beijing;
|
||||
if(cfg1.UnitOfTimeUnit == "1"){//持续时间上送的是秒1还是毫秒0
|
||||
s_or_ms = 0.001;
|
||||
}
|
||||
else{
|
||||
s_or_ms = 1.0;
|
||||
}
|
||||
|
||||
if(cfg1.ValueOfTimeUnit == "utc"){//持续时间上送的是秒1还是毫秒0
|
||||
utc_or_beijing = 28800000;
|
||||
}
|
||||
else{
|
||||
utc_or_beijing = 0;
|
||||
}
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
//to send json of this qvvr and rdre
|
||||
end_tm = (long long)(qvvr->QVVR_PerTime*1000) + trig_tm; //结束时间是持续时间加触发时间
|
||||
if (FILE_FLAG == 3) {
|
||||
@@ -1809,7 +1836,18 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
||||
if (cfg_result != NULL && dat_result != NULL) {
|
||||
snprintf(cfg_result, cfg_len, "%s-%s", uuid_cfg, filename_cfg); // 拼接字符串并确保不会溢出目标缓冲区
|
||||
snprintf(dat_result, dat_len, "%s-%s", uuid_dat, filename_dat); // 拼接字符串并确保不会溢出目标缓冲区
|
||||
ret3 = transfer_json_qvvr_data(g_node_id, LD_info->line_id, (double)qvvr->QVVR_Amg, (double)qvvr->QVVR_PerTime, start_tm, end_tm, qvvr->QVVR_type, cfg_result, dat_result, LD_info->mp_id, qvvr->QVVR_Rptname, ied_usr->dev_type);
|
||||
ret3 = transfer_json_qvvr_data(g_node_id,
|
||||
LD_info->line_id,
|
||||
(double)qvvr->QVVR_Amg,
|
||||
(double)qvvr->QVVR_PerTime/s_or_ms, //lnk20250520上送的暂态持续时间为毫秒
|
||||
start_tm + utc_or_beijing, //lnk20250520上送的暂态时间为北京时间
|
||||
end_tm + utc_or_beijing, //lnk20250520上送的暂态时间为北京时间
|
||||
qvvr->QVVR_type,
|
||||
cfg_result,
|
||||
dat_result,
|
||||
LD_info->mp_id,
|
||||
qvvr->QVVR_Rptname,
|
||||
ied_usr->dev_type);
|
||||
}
|
||||
free(cfg_result); // 使用完毕后释放动态分配的内存空间
|
||||
free(dat_result); // 使用完毕后释放动态分配的内存空间
|
||||
@@ -1827,11 +1865,16 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
||||
snprintf(dat_result, dat_len, wavepath_dat); // 拼接字符串并确保不会溢出目标缓冲区
|
||||
ret3 = transfer_json_qvvr_data(g_node_id, //这个参数没有使用
|
||||
LD_info->line_id, //监测点序号
|
||||
(double)qvvr->QVVR_Amg, (double)qvvr->QVVR_PerTime,
|
||||
qvvr->QVVR_time, //这里不使用文件中的开始时间start_tm,因为会影响写库,使用QVVR的时间QVVR_time//lnk20250311
|
||||
end_tm, qvvr->QVVR_type, //伏值、持续时间、开始时间、结束时间、暂态类型
|
||||
cfg_result, dat_result, //两个文件路径
|
||||
LD_info->mp_id, qvvr->QVVR_Rptname, ied_usr->dev_type);//监测点号,文件和监测点暂态事件匹配上的暂态报告名,终端类型
|
||||
(double)qvvr->QVVR_Amg,
|
||||
(double)qvvr->QVVR_PerTime/s_or_ms, //lnk20250520上送的暂态持续时间为毫秒
|
||||
qvvr->QVVR_time + utc_or_beijing, //lnk20250520上送的暂态时间为北京时间 //这里不使用文件中的开始时间start_tm,因为会影响写库,使用QVVR的时间QVVR_time//lnk20250311
|
||||
end_tm + utc_or_beijing, //lnk20250520上送的暂态时间为北京时间
|
||||
qvvr->QVVR_type, //伏值、持续时间、开始时间、结束时间、暂态类型
|
||||
cfg_result,
|
||||
dat_result, //两个文件路径
|
||||
LD_info->mp_id,
|
||||
qvvr->QVVR_Rptname,
|
||||
ied_usr->dev_type);//监测点号,文件和监测点暂态事件匹配上的暂态报告名,终端类型
|
||||
}
|
||||
free(cfg_result); // 使用完毕后释放动态分配的内存空间
|
||||
free(dat_result); // 使用完毕后释放动态分配的内存空间
|
||||
@@ -1845,7 +1888,18 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
||||
if (cfg_result != NULL && dat_result != NULL) {
|
||||
snprintf(cfg_result, cfg_len, "%s-%s", oss_file_fullname_cfg, cfg_only_filename_ret); // 拼接字符串并确保不会溢出目标缓冲区
|
||||
snprintf(dat_result, dat_len, "%s-%s", oss_file_fullname_dat, dat_only_filename_ret); // 拼接字符串并确保不会溢出目标缓冲区
|
||||
ret3 = transfer_json_qvvr_data(g_node_id, LD_info->line_id, (double)qvvr->QVVR_Amg, (double)qvvr->QVVR_PerTime, start_tm, end_tm, qvvr->QVVR_type, cfg_result, dat_result, LD_info->mp_id, qvvr->QVVR_Rptname, ied_usr->dev_type);
|
||||
ret3 = transfer_json_qvvr_data(g_node_id,
|
||||
LD_info->line_id,
|
||||
(double)qvvr->QVVR_Amg,
|
||||
(double)qvvr->QVVR_PerTime/s_or_ms, //lnk20250520上送的暂态持续时间为毫秒
|
||||
start_tm + utc_or_beijing, //lnk20250520上送的暂态时间为北京时间
|
||||
end_tm + utc_or_beijing, //lnk20250520上送的暂态时间为北京时间
|
||||
qvvr->QVVR_type,
|
||||
cfg_result,
|
||||
dat_result,
|
||||
LD_info->mp_id,
|
||||
qvvr->QVVR_Rptname,
|
||||
ied_usr->dev_type);
|
||||
}
|
||||
free(cfg_result); // 使用完毕后释放动态分配的内存空间
|
||||
free(dat_result); // 使用完毕后释放动态分配的内存空间
|
||||
|
||||
@@ -190,6 +190,12 @@ apr_status_t init_rdb()
|
||||
rv = parse_device_cfg_web();
|
||||
if (rv != APR_SUCCESS) {
|
||||
echo_errg("Parsed device config xml file with error,try to run! \n");
|
||||
|
||||
//char buf[256];
|
||||
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程调用web台账接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
//log_error("process", buf);
|
||||
DIY_ERRORLOG("process","前置的%s%d号进程调用web台账接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -199,6 +205,12 @@ apr_status_t init_rdb()
|
||||
rv = parse_model_cfg_web();
|
||||
if (rv != APR_SUCCESS) {
|
||||
echo_errg("Parsed model with error,try to run! \n");
|
||||
|
||||
//char buf[256];
|
||||
//format_log_msg(buf,sizeof(buf),"前置的%s%d号进程调用web模型接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
//log_error("process", buf);
|
||||
DIY_ERRORLOG("process","前置的%s%d号进程调用web模型接口失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -207,13 +219,20 @@ apr_status_t init_rdb()
|
||||
rv = parse_rpt_log_ini();//报告块初始化
|
||||
if (rv != APR_SUCCESS) {
|
||||
echo_errg("Failed to parse report log define ini file! \n");
|
||||
|
||||
DIY_ERRORLOG("process","前置的%s%d号进程报告初始化失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (app_get_private_config(g_my_conf_fname) != APR_SUCCESS) {
|
||||
echo_errg("Failed when processing private configuration\n");
|
||||
|
||||
DIY_ERRORLOG("process","前置的%s%d号进程读取mms配置失败", get_front_msg_from_subdir(), g_front_seg_index);
|
||||
|
||||
return APR_EGENERAL;
|
||||
}
|
||||
|
||||
init_rem_dib_table();
|
||||
return APR_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -477,7 +477,7 @@ void processQVVR_start(LD_info_t* LD_info)
|
||||
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);
|
||||
printf("\n~~~~~~~~~~~~~~~~~ processQVVR_time: line_id=%d ,Time=%lld \n",LD_info->line_id,Time);//这里是报告上送的时间
|
||||
}
|
||||
|
||||
|
||||
@@ -525,21 +525,55 @@ void processQVVR_end(LD_info_t* LD_info)
|
||||
if (LD_info->qvvr[LD_info->qvvr_idx].QVVR_start)//波动数据处理时FCDA包含VarStr$stVal,QVVR_start为1,退出处理
|
||||
return;
|
||||
|
||||
//获取时间类型lnk20250520
|
||||
printf("~~~~~~~this dev type is %s~~~~~~~",ied_usr->dev_type);
|
||||
XmlConfigC cfg;
|
||||
if (get_xml_config_by_dev_type(ied_usr->dev_type, &cfg)) {
|
||||
printf("UnitOfTimeUnit = %s\n", cfg.UnitOfTimeUnit);
|
||||
printf("ValueOfTimeUnit = %s\n", cfg.ValueOfTimeUnit);
|
||||
} else {
|
||||
printf("读取失败,未找到 dev_type\n");
|
||||
}
|
||||
double s_or_ms;
|
||||
long long utc_or_beijing;
|
||||
if(cfg.UnitOfTimeUnit == "1"){//持续时间上送的是秒1还是毫秒0
|
||||
s_or_ms = 0.001;
|
||||
}
|
||||
else{
|
||||
s_or_ms = 1.0;
|
||||
}
|
||||
|
||||
if(cfg.ValueOfTimeUnit == "utc"){//上送的是utc还是北京
|
||||
utc_or_beijing = 28800000;
|
||||
}
|
||||
else{
|
||||
utc_or_beijing = 0;
|
||||
}
|
||||
|
||||
|
||||
for (i=0;i<QVVR_NUM;i++) { //暂降/暂升/中断等进入处理,遍历所有波动位置
|
||||
if (i==LD_info->qvvr_idx) //跳过监测点当前波动位置,第一次记录波形后,第一次的第三个事件会让0号点为QVVR_DATA_RECEIVED,
|
||||
//第二次记录波形,第二次的第一个事件qvvr_idx=1,1号中为QVVR_DATA_RECEIVED,QVVR_start=1,跳过记录,
|
||||
//第二次的第二个事件qvvr_idx=1,QVVR_start=0,记录到0中,0为QVVR_DATA_PAIRED
|
||||
//第二次的第三个事件qvvr_idx=2,2号中为QVVR_DATA_RECEIVED,QVVR_start=1,跳过记录
|
||||
//第二次录波匹配文件时应该匹配到1号的qvvrtime,但是1没有QVVR_DATA_PAIRED所以对不上,需要修改逻辑
|
||||
{
|
||||
printf("skip this index\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (LD_info->qvvr[i].used_status != QVVR_DATA_RECEIVED)//跳过没有收到波动的位置
|
||||
{
|
||||
printf("qvvr %d is not received\n",i);
|
||||
continue;
|
||||
|
||||
//添加时间判断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){
|
||||
}
|
||||
|
||||
//添加时间判断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/s_or_ms) > 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));
|
||||
- LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime/s_or_ms));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -548,7 +582,8 @@ void processQVVR_end(LD_info_t* LD_info)
|
||||
//其他某位置的波动也没有定义类型/这个位置的波动类型和当前位置的波动类型一致,暂降事件一次会发三个报告,启动和上值和结束
|
||||
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;//结束时间是持续时间加最初的触发时间,毫秒
|
||||
//long long end_tm = (long long)(LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime*1000) + LD_info->qvvr[i].QVVR_time;//结束时间是持续时间加最初的触发时间,毫秒
|
||||
long long end_tm = (long long)(LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime/s_or_ms) + 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);
|
||||
@@ -560,7 +595,7 @@ void processQVVR_end(LD_info_t* LD_info)
|
||||
|
||||
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_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; //记录当前这个点的波动数据到找到的点位置上,确保记录的是最新的相同类型的事件
|
||||
|
||||
LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_NOT_USED; //当前这个点位置释放
|
||||
@@ -578,12 +613,15 @@ void processQVVR_end(LD_info_t* LD_info)
|
||||
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,
|
||||
(double)LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime/s_or_ms, //上传转换为ms
|
||||
LD_info->qvvr[i].QVVR_time + utc_or_beijing, //上传北京时间
|
||||
end_tm + utc_or_beijing, //上传北京时间
|
||||
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);//监测点号,文件和监测点暂态事件匹配上的暂态报告名,终端类型
|
||||
"",
|
||||
"", //两个文件路径为空
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user