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

@@ -60,27 +60,27 @@ void try_start_kafka_thread();
void try_start_mqconsumer_thread();//lnk20241216
//0. json<EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//0. json生成开始函数
int json_block_create_start( char voltage_level[],char monid_char[],int flicker_flag, char temcode[],int line_id);
//1. json<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>
//1. json生成设置时标函数
int json_block_create_time(char monid_char[], long long Time, int flicker_flag);
//1.5 json<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>flag<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//1.5 json生成设置flag函数
int json_block_create_flag(char monid_char[], int flag, int flicker_flag);
//2. json<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//2. json生成数据回调函数
int json_block_create_data(char monid_char[], char* mms_str , double v, int flicker_flag);
//3. json<EFBFBD><EFBFBD><EFBFBD>ɽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//lnk2024-8-16<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>
int json_block_create_end(char v_wiring_type[], char monid_char[], int flicker_flag); //CZY 2023-08-17 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//3. json生成结束函数
//lnk2024-8-16添加参数
int json_block_create_end(char v_wiring_type[], char monid_char[], int flicker_flag); //CZY 2023-08-17 测试
//zw 2024-01-31 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>Ż<EFBFBD>
//zw 2024-01-31 补招模式优化
void add_mvl_type_ctrl(char doname[], int ctrl);
int sel_mvl_type_ctrl_flag(char doname[]);
void del_mvl_type_ctrl();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>Ż<EFBFBD> end
//补招模式优化 end
#ifndef DB_INTERFACE_H
#define DB_INTERFACE_H
// ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LD_info_t
// 前向声明 LD_info_t
typedef struct LD_info_t LD_info_t;
int urcbRealDataHasReceived(int dev_index, LD_info_t* LD_info, long long Time); //lnk20241223
#endif
@@ -98,21 +98,21 @@ void add_comm_log(char* log_str);
void clear_old_comtrade_files();
int process_login_verify();
//////////////////////////////WW 20230819<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//////////////////////////////WW 20230819增加数据库操作函数
void TestToken();
void TestBodyPost();//WW <EFBFBD><EFBFBD><EFBFBD><EFBFBD>qt post
void TestSMSPost();//WW <EFBFBD><EFBFBD><EFBFBD><EFBFBD>qt post
void TestBodyPost();//WW 测试qt post
void TestSMSPost();//WW 测试qt post
void TestJson(char* szJson);
void TestOSS();//WW <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void PutOSS(char* File_Name, char* data); //zw<EFBFBD>޸<EFBFBD> 2023-9-7 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>oss<EFBFBD>ļ<EFBFBD>
void GetOSS(char* File_Name, char* savepath); //zw<EFBFBD>޸<EFBFBD> 2023-9-7 <EFBFBD><EFBFBD>ȡoss<EFBFBD>ļ<EFBFBD>
void TestOSS();//WW 测试
void PutOSS(char* File_Name, char* data); //zw修改 2023-9-7 上送oss文件
void GetOSS(char* File_Name, char* savepath); //zw修改 2023-9-7 获取oss文件
void DelOSS(char* File_Name);
void delete_object_new(char* File_Name);
void coutTest();//CZY 2023-09-11 test
void TestOBS();//WW 20230921 <EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD>Ϊ<EFBFBD>Ʒ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void TestOBS();//WW 20230921 测试华为云服务器
void OBSFile(char* localpath, char* cloudpath,const char* code);
void OBSFile_del(char* cloudpath, const char* code);
void DataHub_Send_Datahub(char* topic, char* data);//datahubͨѶ
void DataHub_Send_Datahub(char* topic, char* data);//datahub通讯
void Nacos_GetParam(char* postgres_uid, char* postgres_pwd, char* web_clientid, char* web_clientsecret);//nacos
void Nacos_GetParam_Ptr(const char* code, char** ptr);
void Read_Nacos_Param_Postgres(char** database_ip, char** database_port, char** postgres_database, char** postgres_username, char** postgres_password, char** postgres_schema, char** postgres_dnsname, char** postgres_tableprefix);
@@ -120,21 +120,21 @@ void Read_Nacos_Param_Kafka(char** broker_list, char** topic_stat, char** topic_
void Read_Nacos_Param_Web(char** client_id, char** client_secret, char** token_url, char** device_url, char** grant_type);
void Read_Nacos_Param_Flag(int* file_flag, int* send_flag, int* front_inst, char** front_ip);
void Read_Nacos_Param_Recall(int* recall_len, int* recall_sta, int* recall_daily);
void Read_Nacos_Param_Uds(char** uds_upload_url, char** uds_download_url, char** uds_delete_url);//nacos<EFBFBD><EFBFBD>ȡuds<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Read_Nacos_Param_Uds(char** uds_upload_url, char** uds_download_url, char** uds_delete_url);//nacos获取uds参数
int WebAPI_Uds_Upload(char* strUrl, char* loacl_path, char* uuid,char* filename);
void WebAPI_Uds_Download(char* strUrl, char* uuid, char* local_path,char* filename);
int base64_decode(const char* indata, int inlen, char* outdata, long* outlen);
int testbase64();
/////////////////////////////WW end
//////////////////////////////WW 20230822<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD>WebSocket<EFBFBD>߳<EFBFBD>
void try_start_socket_thread(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Web Socket<EFBFBD>߳<EFBFBD>
void try_start_ontimer_thread();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>߳<EFBFBD>s
//////////////////////////////WW 20230822增加数据库和WebSocket线程
void try_start_socket_thread(); //启动Web Socket线程
void try_start_ontimer_thread();//启动定时线程s
/////////////////////////////WW end
//lnk20241029<EFBFBD><EFBFBD><EFBFBD><EFBFBD>http<EFBFBD>߳<EFBFBD>////////////////////////////////////////
void try_start_web_http_thread(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Webhttp<EFBFBD>߳<EFBFBD>
void try_start_http_thread(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>http<EFBFBD>߳<EFBFBD>
//lnk20241029增加http线程////////////////////////////////////////
void try_start_web_http_thread(); //启动Webhttp线程
void try_start_http_thread(); //启动http线程
int try_start_mqtest_thread(int argc, char *argv[]); //20241202
void CreateRecallXml();
void DeletcRecallXml();
@@ -148,6 +148,7 @@ void comflag_test();
int parse_device_cfg_web();
int parse_model_cfg_web();
void SOEFileWeb(char* localpath,char* cloudpath,char* wavepath);
const char* get_front_msg_from_subdir();
//////////////////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus

View File

@@ -16,7 +16,9 @@
#include "node.h"
/*lnk10-10 */
#include "../include/rocketmq/SimpleProducer.h"
#include "../rocketmq/SimpleProducer.h"
#include "../log4cplus/log4.h"//lnk添加log4
#include "../cfg_parse/custom_printf.h"//lnk20250225
@@ -27,7 +29,7 @@ extern pt61850app_t *g_pt61850app;
extern node_t *g_node;
char g_my_conf_fname[256];
char g_onlyIP[255]; //ֱ<EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char g_onlyIP[255]; //直连某个IP仅仅为方便测试
apr_pool_t *g_root_pool;
apr_pool_t *g_rdb_pool;
@@ -58,34 +60,34 @@ int three_secs_enabled = 0;
int auto_register_report_enabled = 0;
int g_front_seg_index = 0;
int g_front_seg_num = 0;
int FRONT_MP_NUM = 0;//<EFBFBD>ն<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int g_front_num_count = 0;//<EFBFBD>ն<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>
int FRONT_MP_NUM = 0;//终端连接数量
int g_front_num_count = 0;//终端连接数量过低次数
///////////////////////////////////////////////////////////////////////////////
//<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><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//根据配置子目录判别全局功能的投退,设定四个分功能性能均衡程序的功能运行划分设定
void init_global_function_enable()
{
if (strcmp(subdir,"cfg_stat_data")==0) { //<EFBFBD><EFBFBD>ʷ<EFBFBD><EFBFBD>̬
if (strcmp(subdir,"cfg_stat_data")==0) { //历史稳态
g_node_id = STAT_DATA_BASE_NODE_ID;
auto_register_report_enabled = 1;
}else if (strcmp(subdir,"cfg_3s_data")==0) { //ʵʱ
}else if (strcmp(subdir,"cfg_3s_data")==0) { //实时
g_node_id = THREE_SECS_DATA_BASE_NODE_ID;
three_secs_enabled = 1;
}else if (strcmp(subdir,"cfg_soe_comtrade")==0) { //<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬
}else if (strcmp(subdir,"cfg_soe_comtrade")==0) { //告警和录波和暂态
g_node_id = SOE_COMTRADE_BASE_NODE_ID;
}else if (strcmp(subdir,"cfg_his_data")==0) { //<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
}else if (strcmp(subdir,"cfg_his_data")==0) { //不使用
g_node_id = RECALL_ALL_DATA_BASE_NODE_ID;
g_node_id = HIS_DATA_BASE_NODE_ID;
}
else if (strcmp(subdir, "cfg_newhis_data") == 0) { //<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
else if (strcmp(subdir, "cfg_newhis_data") == 0) { //不使用
g_node_id = RECALL_ALL_DATA_BASE_NODE_ID;
g_node_id = NEW_HIS_DATA_BASE_NODE_ID;
}
else if (strcmp(subdir, "cfg_recallhis_data") == 0) { //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if (strcmp(subdir, "cfg_recallhis_data") == 0) { //补招
g_node_id = RECALL_HIS_DATA_BASE_NODE_ID;
}
else if (strcmp(subdir, "cfg_recallall_data") == 0) { //<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
else if (strcmp(subdir, "cfg_recallall_data") == 0) { //不使用
g_node_id = RECALL_ALL_DATA_BASE_NODE_ID;
}
}
@@ -98,21 +100,21 @@ void init_daemon(void)
int i;
if( pid = fork() )
exit(0); /** <EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
exit(0); /** 是父进程,结束父进程 */
else if( pid < 0 )
exit(1); /** forkʧ<EFBFBD>ܣ<EFBFBD><EFBFBD>˳<EFBFBD> */
exit(1); /** fork失败,退出 */
/** <EFBFBD>ǵ<EFBFBD>һ<EFBFBD>ӽ<EFBFBD><EFBFBD>̣<EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD> */
/** 是第一子进程,后台继续执行 */
setsid(); /** <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> */
setsid(); /** 第一子进程成为新的会话组长和进程组长并与控制终端分离 */
if( pid = fork() )
exit(0); /** <EFBFBD>ǵ<EFBFBD>һ<EFBFBD>ӽ<EFBFBD><EFBFBD>̣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD> */
exit(0); /** 是第一子进程,结束第一子进程 */
else if( pid < 0)
exit(1); /** forkʧ<EFBFBD>ܣ<EFBFBD><EFBFBD>˳<EFBFBD> */
exit(1); /** fork失败,退出 */
chdir("/FeProject/bin/"); //multi process running at same time
umask(0); /** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
umask(0); /** 重设文件创建掩码 */
return;
}
@@ -132,12 +134,12 @@ int prepare_entironment_2()
apr_status_t rv;
/* apr library need call this first. */
apr_initialize(); //APACHE<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
apr_initialize(); //APACHE初始化
atexit(apr_terminate);
/* Create node root pool */
rv = apr_pool_create(&g_root_pool, NULL); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
rv = apr_pool_create(&g_root_pool, NULL); //分配根内存
if(rv != APR_SUCCESS) {
fprintf(stderr,"%s","Create node root pool failed!\n");
return (-1);
@@ -165,13 +167,13 @@ int prepare_entironment_2()
}
echo_msg("==============================================================\n");
rv = apr_pool_create(&g_rdb_pool, g_root_pool); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>RDB<EFBFBD>ڴ<EFBFBD>
rv = apr_pool_create(&g_rdb_pool, g_root_pool); //分配RDB内存
if(rv != APR_SUCCESS) {
echo_errg("Create system runtime pool failed!\n");
return (-1);
}
rv = apr_pool_create(&g_cfg_pool, g_root_pool); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
rv = apr_pool_create(&g_cfg_pool, g_root_pool); //分配配置内存
if(rv != APR_SUCCESS) {
echo_errg("Create system config pool failed!\n");
return (-1);
@@ -211,6 +213,8 @@ int main(int argc, const char **argv)
return rv;
}
getVersion(argc,argv);
rv=parse_param(argc, argv);
@@ -218,6 +222,13 @@ int main(int argc, const char **argv)
return rv;
}
//lnk启动进程日志
init_logger_process();
char buf[256];
sprintf(buf, "前置的%s%d号进程 进程级日志初始化完毕", get_front_msg_from_subdir(), g_front_seg_index);
log_debug("process", buf);
#ifdef _OS_UNIX_
#ifdef QT_NO_DEBUG
if (!g_need_password)
@@ -250,23 +261,26 @@ int main(int argc, const char **argv)
rv = init_rdb();
if (rv!=APR_SUCCESS){
return rv;
}
}
//初始化终端和监测点日志
init_loggers();
rv = run_protocol();
if (rv!=APR_SUCCESS){
return rv;
}
//<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־,<2C><>ֹ<EFBFBD><D6B9>δ׼<CEB4><D7BC><EFBFBD><EFBFBD>ȫ<EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><C2B1><EFBFBD>
//初始化完成标志,防止还未准备完全就接收消息处理导致崩溃
INITFLAG = 1;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//调试用
printf("INITFLAG=%d\n",INITFLAG);
if (1 == G_TEST_FLAG) {
//lnk<EFBFBD><EFBFBD><EFBFBD><EFBFBD>mqģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ֻ<EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
//lnk添加mq模拟测试,这个只能放在主线程
printf("try_start_mqtest_thread \n");
int ret = try_start_mqtest_thread(0,NULL);
// <EFBFBD>ȴ<EFBFBD><EFBFBD>߳<EFBFBD><EFBFBD>˳<EFBFBD>
// 等待线程退出
echo_warn1("%-60s","System shutdown now......");
apr_pool_destroy(g_root_pool);
echo_msg("OK\n");
@@ -276,16 +290,16 @@ int main(int argc, const char **argv)
while(1) {
/* sleep 1s, just like 1s timer */
apr_sleep(apr_time_from_sec(1));
/* ÿ30<EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>״̬ */
/* 30秒钟检查一次状态 */
if( !(stimer++ % 60) ) {//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (g_dead_lock_counter++ >=3) {//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( !(stimer++ % 60) ) {//分钟
if (g_dead_lock_counter++ >=3) {//三分钟
g_thread_blocked_times++;
g_dead_lock_counter = 0;
}
MVL_LOG_ACSE1 ("MYLOG: current g_thread_blocked_times = %u ", g_thread_blocked_times);
if (FRONT_MP_NUM <= 1) {//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (FRONT_MP_NUM <= 1) {//监测点数
g_front_num_count++;
}
else {
@@ -293,16 +307,16 @@ int main(int argc, const char **argv)
}
}
//work<EFBFBD>߳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3*13<31><33><EFBFBD>ӣ<EFBFBD><D3A3>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
//work线程死了3*13分钟退出进程
if (g_thread_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);
}
//lnk20241211 <EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD>Կ<EFBFBD><EFBFBD><EFBFBD>
//lnk20241211 添加测试开关
pthread_mutex_lock(&mtx);
if (!G_TEST_FLAG && g_front_num_count >= 30 && g_onlyIP[0] == 0 && g_node->n_clients>10) {//30<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 (!G_TEST_FLAG && g_front_num_count >= 30 && g_onlyIP[0] == 0 && g_node->n_clients>10) {//30分钟连接数量过低且不是单连且台账大于十个终端
MVL_LOG_ACSE0("MYLOG: g_front_num_count>=20, so exit to restart ");
apr_sleep(apr_time_from_sec(10));
@@ -403,19 +417,19 @@ int parse_param(int argc, const char **argv)
return 0;
}
///////////////////////////////////////////////////////////////<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD>̵ļ<EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD>lnk20250304
///////////////////////////////////////////////////////////////添加测试进程的监控函数lnk20250304
void doMonitorTaskmain(void) {
static int stimer = 0;
stimer++;
if( !(stimer++ % 60) ) {//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (g_dead_lock_counter++ >=3) {//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( !(stimer++ % 60) ) {//分钟
if (g_dead_lock_counter++ >=3) {//三分钟
g_thread_blocked_times++;
g_dead_lock_counter = 0;
}
MVL_LOG_ACSE1 ("MYLOG: current g_thread_blocked_times = %u ", g_thread_blocked_times);
if (FRONT_MP_NUM <= 1) {//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (FRONT_MP_NUM <= 1) {//监测点数
g_front_num_count++;
}
else {
@@ -423,16 +437,16 @@ void doMonitorTaskmain(void) {
}
}
//work<EFBFBD>߳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3*13<31><33><EFBFBD>ӣ<EFBFBD><D3A3>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
//work线程死了3*13分钟退出进程
if (g_thread_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);
}
//lnk20241211 <EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD>Կ<EFBFBD><EFBFBD><EFBFBD>
//lnk20241211 添加测试开关
pthread_mutex_lock(&mtx);
if (!G_TEST_FLAG && g_front_num_count >= 30 && g_onlyIP[0] == 0 && g_node->n_clients>10) {//30<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 (!G_TEST_FLAG && g_front_num_count >= 30 && g_onlyIP[0] == 0 && g_node->n_clients>10) {//30分钟连接数量过低且不是单连且台账大于十个终端
MVL_LOG_ACSE0("MYLOG: g_front_num_count>=20, so exit to restart ");
apr_sleep(apr_time_from_sec(10));

File diff suppressed because it is too large Load Diff

View File

@@ -121,8 +121,8 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
not_set_log_q_this = TRUE;
not_set_log_t_this = TRUE;
ST_INT timeflag = TRUE;//ִ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>ȡʱ<EFBFBD><EFBFBD>
int log_data_steady_type = 0;//<EFBFBD><EFBFBD>̬ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
ST_INT timeflag = TRUE;//执行前先取时标
int log_data_steady_type = 0;//稳态 长闪 短闪标志
double start, end;
static double last_check_recall_config_time = 0.0;
@@ -186,7 +186,7 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
v = mms_dec_data.data_item[ii].u.data_double;
apr_snprintf(mms_ref, sizeof(mms_ref), "%s$%s", do_name, mms_dec_data.data_item[ii].comp_name);
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//调试用
printf("u.data_str: %s (as hex: 0x%X)\n", mms_dec_data.data_item[ii].u.data_str, *((ST_UINT16*)mms_dec_data.data_item[ii].u.data_str));
if (strstr(mms_ref, "QVVR")) {
@@ -202,18 +202,18 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
length_FCDA = strlen(mms_ref);
if (('$' == mms_ref[length_FCDA - 2]) && ('t' == mms_ref[length_FCDA - 1])) {
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20250307
//调试用lnk20250307
printf("readtime = 1");
readtime = 1;
t = convert_btime6_to_apr_time(&(mms_dec_data.data_item[ii].u.data_bTime6));
//<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>Ϣ
//调试用
// 定义一个结构体保存转换后的时间信息
apr_time_exp_t xt;
// ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> apr_time_exp_gmt(&xt, t) <EFBFBD>õ<EFBFBD> GMT ʱ<EFBFBD>
// 使用本地时区转换(也可以用 apr_time_exp_gmt(&xt, t) 得到 GMT 时间)
if (apr_time_exp_lt(&xt, t) == APR_SUCCESS) {
// tm_year <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD> 1900 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1900<EFBFBD><EFBFBD>tm_mon <EFBFBD><EFBFBD>ΧΪ 0~11<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD> 1
// tm_year 表示自 1900 年起的年数,需要加上 1900tm_mon 范围为 0~11,需要加 1
printf("Converted time: %04d-%02d-%02d %02d:%02d:%02d.%06d\n",
xt.tm_year + 1900,
xt.tm_mon + 1,
@@ -225,36 +225,36 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
} else {
printf("Failed to convert apr_time_t\n");
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//调试用
}
if (('$' == mms_ref[length_FCDA - 2]) && ('q' == mms_ref[length_FCDA - 1])) {
if (log_data_type == STEADY_DATA) {
readquailty = 1;
char* q = mms_dec_data.data_item[ii].u.data_str;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20250307
//调试用lnk20250307
if (q != NULL)
{
int i;
for (i = 0; q[i] != '\0'; i++)
{
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD> '\0' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE>ų<EFBFBD><C5B3><EFBFBD> '\0' */
/* 如果当前字符是 '\0' 则跳过,但循环条件已经排除了 '\0' */
if (q[i] == '\0')
continue;
printf("q[%d] = %c\n", i, q[i]);
}
printf("!!!!!\n");
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20250307
//调试用lnk20250307
if (q[0] == '0' && q[1] == '0'){
quality = 0;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20250307
//调试用lnk20250307
printf("quality = 0");
}else{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20250307
//调试用lnk20250307
printf("quality = 1");
quality = 1;
}
@@ -262,21 +262,21 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
}
}
if (readtime == 1 && readquailty == 1) {
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20250307
//调试用lnk20250307
printf("readtime == 1 && readquailty = 1");
break;
}
}
if (readtime == 1 && readquailty == 1) {
if (0) {//<EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>Ҫ<EFBFBD>Ļ<EFBFBD>quality == 0
if (0) {//调试,要改回quality == 0
timeflag = TRUE;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20250307
//调试用lnk20250307
printf("readtime == 1 && readquailty = 1 && quality == 1 continue");
continue;
}
else
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20250307
//调试用lnk20250307
printf("readtime == 1 && readquailty = 1 && quality == 0 log");
timeflag = FALSE;
@@ -289,21 +289,21 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
apr_time_exp_t preTime;
apr_time_exp_gmt(&preTime, process_jou_entry_t);
if (newTime.tm_year != preTime.tm_year || newTime.tm_mon != preTime.tm_mon || newTime.tm_mday != preTime.tm_mday || newTime.tm_hour != preTime.tm_hour || newTime.tm_min != preTime.tm_min) //ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>json<6F><6E><EFBFBD><EFBFBD>
if (newTime.tm_year != preTime.tm_year || newTime.tm_mon != preTime.tm_mon || newTime.tm_mday != preTime.tm_mday || newTime.tm_hour != preTime.tm_hour || newTime.tm_min != preTime.tm_min) //时间发生跳变 长闪 短闪 和稳态数据执行json推送
{
printf("\n newTime: %d %d %d %d %d %d", newTime.tm_year, newTime.tm_mon, newTime.tm_mday, newTime.tm_hour, newTime.tm_min, newTime.tm_sec);
printf("\n preTime: %d %d %d %d %d %d", preTime.tm_year, preTime.tm_mon, preTime.tm_mday, preTime.tm_hour, preTime.tm_min, preTime.tm_sec);
json_block_create_end(loginfo->LD_info->v_wiring_type,loginfo->LD_info->mp_id, 0);//<EFBFBD><EFBFBD>̬
json_block_create_end(loginfo->LD_info->v_wiring_type,loginfo->LD_info->mp_id, 1);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
json_block_create_end(loginfo->LD_info->v_wiring_type,loginfo->LD_info->mp_id, 2);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
process_jou_entry_t = t;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
json_block_create_end(loginfo->LD_info->v_wiring_type,loginfo->LD_info->mp_id, 0);//稳态
json_block_create_end(loginfo->LD_info->v_wiring_type,loginfo->LD_info->mp_id, 1);//长闪
json_block_create_end(loginfo->LD_info->v_wiring_type,loginfo->LD_info->mp_id, 2);//短闪 波动
process_jou_entry_t = t;//调整至最新时标
ied_t* ied;
ied = find_ied_from_dev_code(loginfo->LD_info->terminal_code);
ied_usr_t* ied_usr = (ied_usr_t*)ied->usr_ext;
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 0, ied_usr->dev_type, loginfo->LD_info->line_id);//<EFBFBD><EFBFBD><EFBFBD>ͽ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><C2B6><EFBFBD> <20><>̬
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 1, ied_usr->dev_type, loginfo->LD_info->line_id);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 2, ied_usr->dev_type, loginfo->LD_info->line_id);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 0, ied_usr->dev_type, loginfo->LD_info->line_id);//推送结束 重新初始化新队列 稳态
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 1, ied_usr->dev_type, loginfo->LD_info->line_id);//长闪
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 2, ied_usr->dev_type, loginfo->LD_info->line_id);//短闪
}
}
}
@@ -363,7 +363,7 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
int quality = 0;
char* q = mms_dec_data.data_item[ii].u.data_str;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20250307
//调试用lnk20250307
printf("q[0] = %c ,q[1] = %c !!!!!",q[0],q[1]);
if (q[0]=='0'&& q[1]=='0'){
@@ -373,7 +373,7 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
printf("quality = 1");
quality = 1;
}
if (0) {//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>Ҫ<EFBFBD>Ļ<EFBFBD>quality == 0
if (0) {//调试用,要改回quality == 0
printf("quality = 1 continue");
continue;
}
@@ -503,12 +503,12 @@ ST_RET mms_jread (loginfo_t *loginfo,MVL_NET_INFO *clientNetInfo, ST_CHAR *dom_n
double start,end;
static double last_check_recall_config_time = 0.0;
static double heart_time_cout = 0.0;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
static double heart_time_cout_start = 0.0;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ <20><>ʼ
static double heart_time_cout_now = 0.0;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ <20><>ǰ
static double heart_time_cout = 0.0;//心跳计时
static double heart_time_cout_start = 0.0;//心跳计时 开始
static double heart_time_cout_now = 0.0;//心跳计时 当前
do {
heart_time_cout_now = sGetMsTime();
if (heart_time_cout_now - heart_time_cout_start > 30000)//30<EFBFBD><EFBFBD> <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
if (heart_time_cout_now - heart_time_cout_start > 30000)//30秒 定时心跳
{
printf("\n heart_time_cout OK");
heart_time_cout_start = sGetMsTime();
@@ -600,17 +600,17 @@ ST_RET mms_jread (loginfo_t *loginfo,MVL_NET_INFO *clientNetInfo, ST_CHAR *dom_n
if ( jread_resp->more_follows == 0 && ((i + 1) == jread_resp->num_of_jou_entry)) {
printf("\njread_resp->more_follows == 0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
//lnk2024-8-16<EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><EFBFBD>߲<EFBFBD><EFBFBD><EFBFBD>
json_block_create_end(loginfo->LD_info->v_wiring_type, loginfo->LD_info->mp_id, 0);//more followsΪ0 <EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> ǿ<>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD>ݵ<EFBFBD>json<6F><6E>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
//lnk2024-8-16添加接线参数
json_block_create_end(loginfo->LD_info->v_wiring_type, loginfo->LD_info->mp_id, 0);//more follows0 数据接受最后一条 强行处理稳态数据的json防止遗留
json_block_create_end(loginfo->LD_info->v_wiring_type, loginfo->LD_info->mp_id, 1);
json_block_create_end(loginfo->LD_info->v_wiring_type, loginfo->LD_info->mp_id, 2);
ied_t* ied;
ied = find_ied_from_dev_code(loginfo->LD_info->terminal_code);
ied_usr_t* ied_usr = (ied_usr_t*)ied->usr_ext;
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 0, ied_usr->dev_type, loginfo->LD_info->line_id);//<EFBFBD><EFBFBD><EFBFBD>ͽ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><C2B6><EFBFBD> <20><>̬
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 1, ied_usr->dev_type, loginfo->LD_info->line_id);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 2, ied_usr->dev_type, loginfo->LD_info->line_id);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 0, ied_usr->dev_type, loginfo->LD_info->line_id);//推送结束 重新初始化新队列 稳态
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 1, ied_usr->dev_type, loginfo->LD_info->line_id);//长闪
json_block_create_start(loginfo->LD_info->voltage_level, loginfo->LD_info->mp_id, 2, ied_usr->dev_type, loginfo->LD_info->line_id);//短闪
}
end = sGetMsTime();
}
@@ -627,7 +627,7 @@ ST_RET mms_jread (loginfo_t *loginfo,MVL_NET_INFO *clientNetInfo, ST_CHAR *dom_n
apr_time_exp_t preTime;
apr_time_exp_gmt(&preTime, end_time);
printf("\nstart timecheck_2");
if (newTime.tm_year != preTime.tm_year || newTime.tm_mon != preTime.tm_mon || newTime.tm_mday != preTime.tm_mday || (newTime.tm_hour != preTime.tm_hour && newTime.tm_hour != preTime.tm_hour + 1 && newTime.tm_hour != preTime.tm_hour - 1)) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4B3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʱ <20><><EFBFBD><EFBFBD>
if (newTime.tm_year != preTime.tm_year || newTime.tm_mon != preTime.tm_mon || newTime.tm_mday != preTime.tm_mday || (newTime.tm_hour != preTime.tm_hour && newTime.tm_hour != preTime.tm_hour + 1 && newTime.tm_hour != preTime.tm_hour - 1)) //结束时标判断 当上送时间超过结束时标时 跳出
{
printf("\nstart timecheck_3");
printf("\n more_follows newTime: %d %d %d %d %d %d", newTime.tm_year, newTime.tm_mon, newTime.tm_mday, newTime.tm_hour, newTime.tm_min, newTime.tm_sec);

View File

@@ -95,7 +95,7 @@ ST_VOID object_name_clone_destroy(OBJECT_NAME* obj);
static ST_ULONG a_get_rem_ip_addr_inline(ST_LONG acse_conn_id, int* nPort);
static char* _convert_ip_2_char(unsigned long dwIP);
#if 1 //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP WW 2023-08-29
#if 1 //测试 获取服务器IP WW 2023-08-29
static char* _convert_ip_2_char(unsigned long dwIP)
{
static char buf[64] = { 0 };
@@ -293,10 +293,10 @@ RCB_INFO* rcb_info_create(MVL_NET_INFO* net_info, ST_CHAR* domName,
+ BSTR_NUMBITS_TO_NUMBYTES(numDsVar); /* rcb_info->rcb_data.Inclusion */
rcb_info = (RCB_INFO*)chk_calloc(1, extended_size);
strcpy(rcb_info->dom_Name, domName); //WW 2023-08-29 <EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strcpy(rcb_info->rcb_name, rcbName); //WW 2023-08-29 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strcpy(rcb_info->dom_Name, domName); //WW 2023-08-29 逻辑设备名称
strcpy(rcb_info->rcb_name, rcbName); //WW 2023-08-29 报告控制块名称
//////////////////////////////////////////////////////////////////////////
strcpy(rcb_info->ds_Nam, datSetName); //WW 2023-08-29 <EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strcpy(rcb_info->ds_Nam, datSetName); //WW 2023-08-29 数据集名称
//////////////////////////////////////////////////////////////////////////
echo_msg4("Client RCB info 0x%X created for '%s' in domain '%s'.datasetnam '%s' \n", rcb_info, rcbName, domName, datSetName);
@@ -732,11 +732,11 @@ ST_RET rcb_enable(MVL_NET_INFO* netInfo, ST_CHAR* domName,
ret = mms_named_var_write(netInfo, varName, DOM_SPEC, domName, rpt_typeids->bstr6, TrgOps, timeOut);
if (ret != SD_SUCCESS) {
printf("%s Write Error!!!", varName);
echo_warn1("Reportע<EFBFBD><EFBFBD> %s Write Error!!!", varName);
echo_warn1("Report注册 %s Write Error!!!", varName);
}
}
#if 0 /* Add something like this if other options needed. ???????? BufTm <EFBFBD><EFBFBD>??*/
#if 0 /* Add something like this if other options needed. ???????? BufTm ??*/
if (ret == SD_SUCCESS)
{
apr_snprintf(varName, sizeof(varName), "%s$Trgs", rcbName);
@@ -841,7 +841,7 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
log_var_data(info_va[va_num], &mms_dec_data);
//assert(add_mms_dec_data== (uint32_t)&mms_dec_data);
rptinfo = find_rptinfo_from_net_rpt_info_name(net_info, rcb_info);
//rptinfo->m_LastDataTime = sGetMsTime();//WW 2023-08-29 ȥ<EFBFBD><EFBFBD>
//rptinfo->m_LastDataTime = sGetMsTime();//WW 2023-08-29 去除
LD_info = rptinfo->LD_info;
chnl_usr = net_info->user_ext;
ied = chnl_usr->chnl->ied;
@@ -850,7 +850,7 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
not_set_rpt_q_this = TRUE;
//g_db_inf_clear_data(RPT_IDX);
rptinfo->count++;
printf("[BEGIND Process] Received Report From %s:%d %s %s ,va_total = %i ,<EFBFBD><EFBFBD>count = %i<EFBFBD><EFBFBD> \n",
printf("[BEGIND Process] Received Report From %s:%d %s %s ,va_total = %i ,count = %i \n",
chnl_usr->ip_str, chnl_usr->chnl->port, LD_info->LD_name, rcb_info->RptID, va_total, rptinfo->count);
//apr_time_t previousTime = apr_time_now();//
@@ -980,9 +980,9 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
//assert(0);
if (LD_info->line_id > 0) {
if (strstr(rcb_info->RptID, "QVVR"))//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbQVVR
if (strstr(rcb_info->RptID, "QVVR"))//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR
processQVVR_start(LD_info);
else if (strstr(rcb_info->RptID, "RDRE"))//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbRDRE
else if (strstr(rcb_info->RptID, "RDRE"))//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbRDRE
processRDRE_start(LD_info);
else {
ied_t* ied;
@@ -990,7 +990,7 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
ied_usr_t* ied_usr = (ied_usr_t*)ied->usr_ext;
if (rptinfo->flickerflag==1)//CZY 2023-08-17 WW 2022-11-14 ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>һ<EFBFBD>ν<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> json_block_create_start(LD_info->line_id);
if (rptinfo->flickerflag==1)//CZY 2023-08-17 WW 2022-11-14 只有闪变和第一次进入才会初始化 json_block_create_start(LD_info->line_id);
json_block_create_start( LD_info->voltage_level, LD_info->mp_id, rptinfo->flickerflag, ied_usr->dev_type, LD_info->line_id);
else if(rptinfo->flickerflag == 0) {
if (LD_info->rptRecvCheckFlag == 0)
@@ -1038,16 +1038,16 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
// cout<<" FULL_FCDA_Name "<< FULL_FCDA_Name <<endl;
//printf("\n ----5.12--%d- %s \n", va_num, FULL_FCDA_Name);
length_FCDA = strlen(FULL_FCDA_Name);
//11 08 beijing <EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>q
//11 08 beijing 许继装置不处理q
if (('$' == FULL_FCDA_Name[length_FCDA - 2]) && ('q' == FULL_FCDA_Name[length_FCDA - 1])) {
if (not_set_rpt_q_this) {
int flag = Set_q_from_61850rpt(mms_dec_data.data_item[ii].u.data_str);
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbQVVR
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR
//need do nothing!
not_set_rpt_q_this = FALSE;
}
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14<EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD> LLN0$BR$brcbRDRE
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14修改判断 LLN0$BR$brcbRDRE
//need do nothing!
not_set_rpt_q_this = FALSE;
}
@@ -1059,14 +1059,14 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
}
else if (('$' == FULL_FCDA_Name[length_FCDA - 2]) && ('t' == FULL_FCDA_Name[length_FCDA - 1])) {
if (not_set_rpt_TimeID_this) {
apr_time_t t = convert_btime6_to_apr_time(&(mms_dec_data.data_item[ii].u.data_bTime6));//΢<EFBFBD><EFBFBD>
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbQVVR
apr_time_t t = convert_btime6_to_apr_time(&(mms_dec_data.data_item[ii].u.data_bTime6));//微秒
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR
if (strstr(FULL_FCDA_Name, "VarStr$t")) {
processQVVR_time(LD_info, t / 1000);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
processQVVR_time(LD_info, t / 1000);//毫秒
not_set_rpt_TimeID_this = FALSE;
}
}
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14<EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD> LLN0$BR$brcbRDRE
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14修改判断 LLN0$BR$brcbRDRE
//need do nothing!
not_set_rpt_TimeID_this = FALSE;
}
@@ -1075,7 +1075,7 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
printf("rcb_info->RptID=%s ,LineId=%d , Timestamp= %lld \n", rcb_info->RptID, LD_info->line_id, t / 1000);
not_set_rpt_TimeID_this = FALSE;
if (strstr(rcb_info->RptID, "LLN0$RP$urcbRealData")) {
//20241223lnk<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն˺Ų<EFBFBD><EFBFBD><EFBFBD>
//20241223lnk添加终端号参数
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
if (urcbRealDataHasReceived(ied_usr->dev_idx,LD_info, t / 1000))
return;
@@ -1098,10 +1098,10 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
else if (mms_dec_data.data_item[ii].type == DATA_STR_TYPE)
v = strtol(mms_dec_data.data_item[ii].u.data_str, NULL, 2);
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbQVVR
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR
processQVVR_data(LD_info, FULL_FCDA_Name, v);
}
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbRDRE
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbRDRE
processRDRE_data(LD_info, FULL_FCDA_Name, v);
}
else
@@ -1114,34 +1114,34 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
//set_rpt_LineID(LD_info->line_id);
//set_line_info(RPT_IDX,LD_info->line_id,LD_info->SubV_Index,LD_info->Dev_Index,LD_info->Sub_Index,LD_info->GD_Index);
//write_updatetime_to_db(chnl_usr->chnl->addr);
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbQVVR
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR
processQVVR_end(LD_info);
}
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbRDRE
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbRDRE
processRDRE_end(LD_info);
}
else {
printf("%d : %d", LD_info->rptRecvFlag, LD_info->rptRecvCheckFlag);
//append_db_records(RPT_IDX);
if (rptinfo->flickerflag==1)//CZY 2023-08-17 WW 2022-11-14 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
if (rptinfo->flickerflag==1)//CZY 2023-08-17 WW 2022-11-14 增加闪变标志
{
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022<EFBFBD><EFBFBD>12<EFBFBD><EFBFBD>6<EFBFBD><EFBFBD>14:09:08 <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>ICD֧<44><D6A7>
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022年12月6日14:09:08 增加多个ICD支持
//int devkind = ied_usr->dev_flag;
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag); //lnk2024-8-16<EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD>
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag); //lnk2024-8-16增加接线类型参数
}
else if(rptinfo->flickerflag == 0){//CZY 2023-08-17 WW 2022-11-14 <EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
else if(rptinfo->flickerflag == 0){//CZY 2023-08-17 WW 2022-11-14 增加多个报告判断
if (LD_info->rptRecvFlag == LD_info->rptRecvCheckFlag) {
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022<EFBFBD><EFBFBD>12<EFBFBD><EFBFBD>6<EFBFBD><EFBFBD>14:09:08 <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>ICD֧<44><D6A7>
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022年12月6日14:09:08 增加多个ICD支持
//int devkind = ied_usr->dev_flag;
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag); //lnk2024-8-16<EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD>
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag); //lnk2024-8-16增加接线类型参数
LD_info->rptRecvCheckFlag = 0;
}
}
else if (rptinfo->flickerflag == 2) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
else if (rptinfo->flickerflag == 2) {//CZY 2023-08-17 WW 2022-11-14 增加多个报告判断
if (LD_info->rptPstRecvFlag == LD_info->rptPstRecvCheckFlag) {
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022<EFBFBD><EFBFBD>12<EFBFBD><EFBFBD>6<EFBFBD><EFBFBD>14:09:08 <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>ICD֧<44><D6A7>
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022年12月6日14:09:08 增加多个ICD支持
//int devkind = ied_usr->dev_flag;
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag); //lnk2024-8-16<EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD>
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag); //lnk2024-8-16增加接线类型参数
LD_info->rptPstRecvCheckFlag = 0;
}
}
@@ -1151,7 +1151,7 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
echo_err3("Ignore this report due to line_id invalid , Report From %s %s %s !!!",
APR_EGENERAL, chnl_usr->ip_str, LD_info->LD_name, rcb_info->RptID);
}
printf("[END Process] Report From %s:%d %s %s ,va_total = %i ,<EFBFBD><EFBFBD>count = %i<EFBFBD><EFBFBD> \n",
printf("[END Process] Report From %s:%d %s %s ,va_total = %i ,count = %i \n",
chnl_usr->ip_str, chnl_usr->chnl->port, LD_info->LD_name, rcb_info->RptID, va_total, rptinfo->count);
//apr_time_t previousTimeend = apr_time_now();//
@@ -1171,7 +1171,7 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va,
}
}
//<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> add on Aug 3 for testing of guangdong CRITICAL
//设置响应时间,避免频繁召唤装置名称,导致丢包 add on Aug 3 for testing of guangdong CRITICAL
chnl_usr->m_LastPosRespTime = sGetMsTime();
//assert (va_num==va_total); /* Did we count right? */
@@ -1204,7 +1204,7 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
log_var_data(info_va[va_num], &mms_dec_data);
//assert(add_mms_dec_data== (uint32_t)&mms_dec_data);
rptinfo = find_rptinfo_from_net_rcb_info(net_info, rcb_info);
//rptinfo->m_LastDataTime = sGetMsTime();//WW 2023-08-29 ȥ<EFBFBD><EFBFBD>
//rptinfo->m_LastDataTime = sGetMsTime();//WW 2023-08-29 去除
LD_info = rptinfo->LD_info;
chnl_usr = net_info->user_ext;
ied = chnl_usr->chnl->ied;
@@ -1213,7 +1213,7 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
not_set_rpt_q_this = TRUE;
//g_db_inf_clear_data(RPT_IDX);
rptinfo->count++;
printf("[BEGIND Process] Received Report From %s:%d %s %s ,va_total = %i ,<EFBFBD><EFBFBD>count = %i<EFBFBD><EFBFBD> mp_id=%s\n",
printf("[BEGIND Process] Received Report From %s:%d %s %s ,va_total = %i ,count = %i mp_id=%s\n",
chnl_usr->ip_str, chnl_usr->chnl->port, LD_info->LD_name, rcb_info->RptID, va_total, rptinfo->count, LD_info->mp_id);
//apr_time_t previousTime = apr_time_now();//
@@ -1342,9 +1342,9 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
// cout<<"pEquipment->m_OMSObject_FULL_FCDA_Map.entries() = "<<pEquipment->m_OMSObject_FULL_FCDA_Map.entries()<<endl
//assert(0);
if (LD_info->line_id > 0) {
if (strstr(rcb_info->RptID, "QVVR"))//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbQVVR
processQVVR_start(LD_info);//<EFBFBD><EFBFBD><EFBFBD>͵ı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if (strstr(rcb_info->RptID, "RDRE"))//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbRDRE
if (strstr(rcb_info->RptID, "QVVR"))//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR
processQVVR_start(LD_info);//上送的报告里面的监测点号
else if (strstr(rcb_info->RptID, "RDRE"))//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbRDRE
processRDRE_start(LD_info);
else {
ied_t* ied;
@@ -1352,7 +1352,7 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
ied = find_ied_from_dev_code(LD_info->terminal_code);
ied_usr_t* ied_usr = (ied_usr_t*)ied->usr_ext;
if (rptinfo->flickerflag == 1)//CZY 2023-08-17 WW 2022-11-14 ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>һ<EFBFBD>ν<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> json_block_create_start(LD_info->line_id);
if (rptinfo->flickerflag == 1)//CZY 2023-08-17 WW 2022-11-14 只有闪变和第一次进入才会初始化 json_block_create_start(LD_info->line_id);
json_block_create_start(LD_info->voltage_level, LD_info->mp_id, rptinfo->flickerflag, ied_usr->dev_type, LD_info->line_id);
else if (rptinfo->flickerflag == 0) {
if (LD_info->rptRecvCheckFlag == 0)
@@ -1404,7 +1404,7 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
break;
}
}
for (ii = 0; ii < mms_dec_data.item_num; ++ii)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>FCDA
for (ii = 0; ii < mms_dec_data.item_num; ++ii)//遍历FCDA
{
char* FULL_FCDA_Name;
int length_FCDA;
@@ -1417,16 +1417,16 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
// cout<<" FULL_FCDA_Name "<< FULL_FCDA_Name <<endl;
//printf("\n ----5.12--%d- %s \n", va_num, FULL_FCDA_Name);
length_FCDA = strlen(FULL_FCDA_Name);
//11 08 beijing <EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>q
//11 08 beijing 许继装置不处理q
if (('$' == FULL_FCDA_Name[length_FCDA - 2]) && ('q' == FULL_FCDA_Name[length_FCDA - 1])) {
if (not_set_rpt_q_this) {
int flag = Set_q_from_61850rpt(mms_dec_data.data_item[ii].u.data_str);
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbQVVR
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR
//need do nothing!
not_set_rpt_q_this = FALSE;
}
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14<EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD> LLN0$BR$brcbRDRE
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14修改判断 LLN0$BR$brcbRDRE
//need do nothing!
not_set_rpt_q_this = FALSE;
}
@@ -1443,17 +1443,17 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
else if (('$' == FULL_FCDA_Name[length_FCDA - 2]) && ('t' == FULL_FCDA_Name[length_FCDA - 1])) {
if (not_set_rpt_TimeID_this) {
apr_time_t t = convert_btime6_to_apr_time(&(mms_dec_data.data_item[ii].u.data_bTime6));
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbQVVR
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR
if (strstr(FULL_FCDA_Name, "VarStr$t")) {
processQVVR_time(LD_info, t / 1000);
not_set_rpt_TimeID_this = FALSE;
}
}
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14<EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD> LLN0$BR$brcbRDRE
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14修改判断 LLN0$BR$brcbRDRE
//need do nothing!
not_set_rpt_TimeID_this = FALSE;
}
else if (strstr(FULL_FCDA_Name, "GGIO")) {//CZY 2023-08-17 WW 2022-11-14<EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD> LLN0$BR$brcbRDRE
else if (strstr(FULL_FCDA_Name, "GGIO")) {//CZY 2023-08-17 WW 2022-11-14修改判断 LLN0$BR$brcbRDRE
//need do nothing!
not_set_rpt_TimeID_this = FALSE;
}
@@ -1462,9 +1462,9 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
printf("rcb_info->RptID=%s ,LineId=%d , Timestamp= %lld \n", rcb_info->RptID, LD_info->line_id, t / 1000);
not_set_rpt_TimeID_this = FALSE;
if (strstr(rcb_info->RptID, "LLN0$RP$urcbRealData")) {
//20241223lnk<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն˺Ų<EFBFBD><EFBFBD><EFBFBD>
//20241223lnk添加终端号参数
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
if (urcbRealDataHasReceived(ied_usr->dev_idx,LD_info, t / 1000))//<EFBFBD>ж<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>
if (urcbRealDataHasReceived(ied_usr->dev_idx,LD_info, t / 1000))//判断时间重复
return;
}
}
@@ -1485,17 +1485,17 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
else if (mms_dec_data.data_item[ii].type == DATA_STR_TYPE)
v = strtol(mms_dec_data.data_item[ii].u.data_str, NULL, 2);
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbQVVR
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR
processQVVR_data(LD_info, FULL_FCDA_Name, v);
}
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbRDRE
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbRDRE
processRDRE_data(LD_info, FULL_FCDA_Name, v);
}
else if (strstr(FULL_FCDA_Name, "GGIO"))
{
ied_t* ied = LD_info->ied;
ied_usr_t* ied_usr = GET_IEDEXT_ADDR(ied);
processGGIO_start_data_end(LD_info->mp_id, FULL_FCDA_Name, v, time, ied_usr->dev_type, LD_info->line_id);//GGIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>״<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
processGGIO_start_data_end(LD_info->mp_id, FULL_FCDA_Name, v, time, ied_usr->dev_type, LD_info->line_id);//GGIO数据全套处理流程
}
else
json_block_create_data(LD_info->mp_id, FULL_FCDA_Name, v, rptinfo->flickerflag);
@@ -1508,34 +1508,34 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
//set_rpt_LineID(LD_info->line_id);
//set_line_info(RPT_IDX,LD_info->line_id,LD_info->SubV_Index,LD_info->Dev_Index,LD_info->Sub_Index,LD_info->GD_Index);
//write_updatetime_to_db(chnl_usr->chnl->addr);
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbQVVR
if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR
processQVVR_end(LD_info);
}
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD>޸<EFBFBD><EFBFBD>ж<EFBFBD>LLN0$BR$brcbRDRE
else if (strstr(rcb_info->RptID, "RDRE")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbRDRE
processRDRE_end(LD_info);
}
else {
printf("%d : %d", LD_info->rptRecvFlag, LD_info->rptRecvCheckFlag);
//append_db_records(RPT_IDX);
if (rptinfo->flickerflag == 1)//CZY 2023-08-17 WW 2022-11-14 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
if (rptinfo->flickerflag == 1)//CZY 2023-08-17 WW 2022-11-14 增加闪变标志
{
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022<EFBFBD><EFBFBD>12<EFBFBD><EFBFBD>6<EFBFBD><EFBFBD>14:09:08 <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>ICD֧<44><D6A7>
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022年12月6日14:09:08 增加多个ICD支持
//int devkind = ied_usr->dev_flag;
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag);//lnk<EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD>
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag);//lnk角形处理
}
else if (rptinfo->flickerflag == 0) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
else if (rptinfo->flickerflag == 0) {//CZY 2023-08-17 WW 2022-11-14 增加多个报告判断
if (LD_info->rptRecvFlag == LD_info->rptRecvCheckFlag) {
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022<EFBFBD><EFBFBD>12<EFBFBD><EFBFBD>6<EFBFBD><EFBFBD>14:09:08 <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>ICD֧<44><D6A7>
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022年12月6日14:09:08 增加多个ICD支持
//int devkind = ied_usr->dev_flag;
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag);//lnk<EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD>
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag);//lnk角形处理
LD_info->rptRecvCheckFlag = 0;
}
}
else if (rptinfo->flickerflag == 2) {//CZY 2023-08-17 WW 2022-11-14 <EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
else if (rptinfo->flickerflag == 2) {//CZY 2023-08-17 WW 2022-11-14 增加多个报告判断
if (LD_info->rptPstRecvFlag == LD_info->rptPstRecvCheckFlag) {
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022<EFBFBD><EFBFBD>12<EFBFBD><EFBFBD>6<EFBFBD><EFBFBD>14:09:08 <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>ICD֧<44><D6A7>
//ied_usr_t* ied_usr = ied->usr_ext;//CZY 2023-08-17 WW 2022年12月6日14:09:08 增加多个ICD支持
//int devkind = ied_usr->dev_flag;
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag);//lnk<EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD>
json_block_create_end(LD_info->v_wiring_type, LD_info->mp_id, rptinfo->flickerflag);//lnk角形处理
LD_info->rptPstRecvCheckFlag = 0;
}
}
@@ -1545,7 +1545,7 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
echo_err3("Ignore this report due to line_id invalid , Report From %s %s %s !!!",
APR_EGENERAL, chnl_usr->ip_str, LD_info->LD_name, rcb_info->RptID);
}
printf("[END Process] Report From %s:%d %s %s ,va_total = %i ,<EFBFBD><EFBFBD>count = %i<EFBFBD><EFBFBD> \n",
printf("[END Process] Report From %s:%d %s %s ,va_total = %i ,count = %i \n",
chnl_usr->ip_str, chnl_usr->chnl->port, LD_info->LD_name, rcb_info->RptID, va_total, rptinfo->count);
//apr_time_t previousTimeend = apr_time_now();//
@@ -1565,7 +1565,7 @@ ST_VOID u_iec_rpt_ind_data(MVL_VAR_ASSOC** info_va,
}
}
}
//<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> add on Aug 3 for testing of guangdong CRITICAL
//设置响应时间,避免频繁召唤装置名称,导致丢包 add on Aug 3 for testing of guangdong CRITICAL
chnl_usr->m_LastPosRespTime = sGetMsTime();
//assert (va_num==va_total); /* Did we count right? */
if (va_num != va_total)
@@ -1670,58 +1670,58 @@ ST_RET u_iec_rpt_ind_by_devtype(MVL_COMM_EVENT* event)
return (SD_FAILURE);
}
//////////////////
//WW 2023-08-29 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rcb_info<EFBFBD>󶨴<EFBFBD><EFBFBD><EFBFBD>
int port; //<EFBFBD>˿<EFBFBD>
//WW 2023-08-29 增加终端类型与报告rcb_info绑定代码
int port; //端口
RCB_INFO *rcb_info1;
ST_CHAR rptID[MVL61850_MAX_RPTID_LEN + 1] = { 0 }; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID 66
ST_ULONG a_ip = get_rem_ip_addr_inline(event->net_info->acse_conn_id, &port); //WW 2023-08-29 <EFBFBD><EFBFBD>ȡװ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ں<EFBFBD>
ST_CHAR *p_ip = _convert_ip_2_char(htonl(a_ip)); //WW 2023-08-29 <EFBFBD><EFBFBD>IPתΪ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>192.168.1.238
if (gDev_rcb_list.dev_rcb_info_Head == NULL) //ȫ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>ָ<EFBFBD><EFBFBD> || gDev_rcb_list->rcb_info_list == NULL
ST_CHAR rptID[MVL61850_MAX_RPTID_LEN + 1] = { 0 }; //报告ID 66
ST_ULONG a_ip = get_rem_ip_addr_inline(event->net_info->acse_conn_id, &port); //WW 2023-08-29 获取装置IP、端口号
ST_CHAR *p_ip = _convert_ip_2_char(htonl(a_ip)); //WW 2023-08-29 将IP转为字符串指针 例:192.168.1.238
if (gDev_rcb_list.dev_rcb_info_Head == NULL) //全局报告控制块指针 || gDev_rcb_list->rcb_info_list == NULL
{
//SLOGALWAYS0 ("Received InformationReport. No IEC-61850 or UCA RCB enabled. Ignored.");
//LOG_INFO("<EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>棬δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IEC-61850<EFBFBD><EFBFBD>UCA RCBʹ<EFBFBD>ܡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>"); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-1-23 09:10:39
//LOG_INFO("收到报告,未启用IEC-61850UCA RCB使能。忽略!"); //仅调试使用! zl 2019-1-23 09:10:39
return (SD_FAILURE);
}
//<EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>IP<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>2019-12-24 17:27:29
//װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>------------------------------------------------------------------------------------------------------------------------------
Dev_RCB_INFO *dev_rcb = NULL;//װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹָ<EFBFBD><EFBFBD>
Dev_IP_Port_INFO *dev_info = NULL; //װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ںŽṹָ<EFBFBD><EFBFBD>
ST_BOOLEAN bFindIpPort = 0; //<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD>䵽װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ں<EFBFBD>
for (dev_rcb = gDev_rcb_list.dev_rcb_info_Head; dev_rcb != NULL; dev_rcb = (Dev_RCB_INFO *)list_get_next(gDev_rcb_list.dev_rcb_info_Head, dev_rcb)) //<EFBFBD>ٱ<EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>
//逻辑根据装置IP、端口号先找到装置类型再匹配报告信息再解析报告2019-12-24 17:27:29
//装置类型查找判断------------------------------------------------------------------------------------------------------------------------------
Dev_RCB_INFO *dev_rcb = NULL;//装置报告结构指针
Dev_IP_Port_INFO *dev_info = NULL; //装置IP、端口号结构指针
ST_BOOLEAN bFindIpPort = 0; //是否在链表中匹配到装置IP、端口号
for (dev_rcb = gDev_rcb_list.dev_rcb_info_Head; dev_rcb != NULL; dev_rcb = (Dev_RCB_INFO *)list_get_next(gDev_rcb_list.dev_rcb_info_Head, dev_rcb)) //①遍历 全局装置报告控制块链表
{
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>gDev_rcb_list<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, dev_type_name= %s", dev_rcb->dev_type_name); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:16:31
//װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ںŲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>-------------------------------------------------------------------------------------------------------------------------------------------------------------------
for (dev_info = dev_rcb->dev_ip_port_list; dev_info != NULL; dev_info = (Dev_IP_Port_INFO *)list_get_next(dev_rcb->dev_ip_port_list, dev_info)) //<EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD><D7B0>IP<49><50><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
//LOG_INFO("(报告解析)遍历gDev_rcb_list链表, dev_type_name= %s", dev_rcb->dev_type_name); //仅调试使用! zl 2019-12-24 00:16:31
//装置IP、端口号查找判断-------------------------------------------------------------------------------------------------------------------------------------------------------------------
for (dev_info = dev_rcb->dev_ip_port_list; dev_info != NULL; dev_info = (Dev_IP_Port_INFO *)list_get_next(dev_rcb->dev_ip_port_list, dev_info)) //②遍历 全局装置IP、端口链表
{
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>dev_ip_port_list<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, dev_type_name= %s, ip= %s, port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:16:31
if ((strcmp(dev_info->IP, p_ip) == 0) && (dev_info->Port == port)) //ƥ<EFBFBD><EFBFBD> װ<><D7B0>IP && <EFBFBD>˿ں<EFBFBD>
//LOG_INFO("(报告解析)遍历dev_ip_port_list链表, dev_type_name= %s, ip= %s, port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //仅调试使用! zl 2019-12-24 00:16:31
if ((strcmp(dev_info->IP, p_ip) == 0) && (dev_info->Port == port)) //匹配 装置IP && 端口号
{
bFindIpPort = 1; //<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD>IP && <EFBFBD>˿ں<EFBFBD>
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>䵽װ<E4B5BD><D7B0>dev_type_name= %s, IP= %s<EFBFBD><EFBFBD>Port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:23:55
//strcpy(dev_rcb->dev_type_name, dev_rcb->dev_type_name); //ƥ<EFBFBD><EFBFBD> װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bFindIpPort = 1; //查找到装置IP && 端口号
//LOG_INFO("(报告解析)匹配到装置dev_type_name= %s, IP= %sPort= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //仅调试使用! zl 2019-12-24 00:23:55
//strcpy(dev_rcb->dev_type_name, dev_rcb->dev_type_name); //匹配 装置类型
break;
}
} //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> װ<><D7B0>IP<49><50><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (bFindIpPort) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD>䵽װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ں<EFBFBD>
} //遍历 装置IP、端口链表 结束
if (bFindIpPort) //在链表中匹配到装置IP、端口号
break;
} //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
} //遍历 全局装置报告控制块链表 结束
if (!bFindIpPort) //δ<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
if (!bFindIpPort) //未查找到装置IP、端口
{
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)dev_type_name= %sδƥ<EFBFBD>IP= %s<EFBFBD><EFBFBD>Port= %d<EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>goto CLEANUP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", dev_rcb->dev_type_name, p_ip, port); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:23:55
//LOG_INFO("(报告解析)dev_type_name= %s未匹配到IP= %sPort= %d的装置类型,goto CLEANUP跳出!", dev_rcb->dev_type_name, p_ip, port); //仅调试使用! zl 2019-12-24 00:23:55
retcode = SD_FAILURE;
goto END; //<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD> CLEANUP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>retcode<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
goto END; //跳转至 CLEANUP,即:返回retcode结束
}
rcb_info = dev_rcb->rcb_info_list; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD>Ϣ
rcb_info = dev_rcb->rcb_info_list; //根据装置类型,匹配报告控制块信息
//WW 2023-08-29 end
//////////////////////////////
/* Get "all_rcb_info" from "user_info". User must set "user_info" when conn established.*/
//////////////////////
//WW 2023-08-29ע<EFBFBD><EFBFBD>
//WW 2023-08-29注释
//all_rcb_info = (ALL_RCB_INFO*)event->net_info->user_info;
///* Check "all_rcb_info" to see if any RCB has been enabled. */
@@ -1742,11 +1742,11 @@ ST_RET u_iec_rpt_ind_by_devtype(MVL_COMM_EVENT* event)
sizeof(MVL_VAR_ASSOC*));
//////////////////
//WW 2023-08-29 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rcb_info<EFBFBD>󶨴<EFBFBD><EFBFBD><EFBFBD>
rcb_info = dev_rcb->rcb_info_list; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD>Ϣ
//WW 2023-08-29 增加终端类型与报告rcb_info绑定代码
rcb_info = dev_rcb->rcb_info_list; //根据装置类型,匹配报告控制块信息
va_num = 0;
info_va[va_num++] = rcb_info->rcb_var.RptID;
//LOG_INFO("va_num = %d", va_num); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-1-23 09:10:39
//LOG_INFO("va_num = %d", va_num); //仅调试使用! zl 2019-1-23 09:10:39
all_rcb_info = (ALL_RCB_INFO*)chk_calloc(1, sizeof(ALL_RCB_INFO));
all_rcb_info->rpt_typeids = &g_rpt_typeids;
@@ -1754,32 +1754,32 @@ ST_RET u_iec_rpt_ind_by_devtype(MVL_COMM_EVENT* event)
event->net_info->user_info = all_rcb_info;
rcb_info = all_rcb_info->rcb_info_list;
rcb_info->rcb_data.RptID[0] = '\0'; /* start with empty string */
mvl_info_data_to_local(event, va_num, info_va); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>ʽ
mvl_info_data_to_local(event, va_num, info_va); //将报告数据转换为本地格式
/* NOTE: decoded RptID is now in "rcb_info->rcb_data.RptID". Save it.*/
strcpy(saveRptID, rcb_info->rcb_data.RptID); //װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD>ID <20><><EFBFBD><EFBFBD>PQM2/LLN0$BR$brcbStatisticData01
//LOG_INFO("װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD>saveRptID<EFBFBD><EFBFBD>%s", saveRptID); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-1-23 09:10:39
strcpy(saveRptID, rcb_info->rcb_data.RptID); //装置上送报告ID 例:PQM2/LLN0$BR$brcbStatisticData01
//LOG_INFO("装置上送报告saveRptID%s", saveRptID); //仅调试使用! zl 2019-1-23 09:10:39
chk_free(all_rcb_info);
event->net_info->user_info = NULL;
/* Search list of "rcb_info" to find one with matching RptID. If not found, rcb_info will be == NULL. */
//װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>-----------------------------------------------------------------------------------------------------------------------------------------------------
for (rcb_info = dev_rcb->rcb_info_list; rcb_info != NULL; rcb_info = (RCB_INFO *)list_get_next(dev_rcb->rcb_info_list, rcb_info)) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>
//装置报告控制块查找判断-----------------------------------------------------------------------------------------------------------------------------------------------------
for (rcb_info = dev_rcb->rcb_info_list; rcb_info != NULL; rcb_info = (RCB_INFO *)list_get_next(dev_rcb->rcb_info_list, rcb_info)) //遍历 全局报告控制块链表
{
//LOG_INFO("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RptID<EFBFBD><EFBFBD>%s<><73>saveRptID<EFBFBD><EFBFBD>%s", rcb_info->RptID, saveRptID); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-1-23 09:10:39
//LOG_INFO("遍历报告控制块链表RptID%ssaveRptID%s", rcb_info->RptID, saveRptID); //仅调试使用! zl 2019-1-23 09:10:39
if (strcmp(rcb_info->RptID, saveRptID) == 0)
break; /* rcb_info now points to right structure */
}
if (!rcb_info) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>ָ<EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>
if (!rcb_info) //报告控制块指针为空!
{
//SLOGALWAYS1 ("RptID '%s' not recognized on this connection. Received report ignored.", saveRptID);
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>RptID= '%s'<EFBFBD><EFBFBD>goto CLEANUP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", saveRptID); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-23 15:09:36
//LOG_INFO("(报告解析)报告控制块链表查找不到RptID= '%s'goto CLEANUP跳出!", saveRptID); //仅调试使用! zl 2019-12-23 15:09:36
retcode = SD_FAILURE;
goto CLEANUP; //<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD> CLEANUP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>retcode<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
goto CLEANUP; //跳转至 CLEANUP,即:返回retcode结束
}
//WW 2023-08-29 end
//////////////////////////////
//////////////////////
//WW 2023-08-29ע<EFBFBD><EFBFBD>
//WW 2023-08-29注释
///* Must decode the RptID first to find the correct RCB_INFO. Could decode into
//* any "vstring65" variable. We just use the RptID variable from the first
//* rcb_info on the list.
@@ -1842,15 +1842,15 @@ ST_RET u_iec_rpt_ind_by_devtype(MVL_COMM_EVENT* event)
log_var_to_data(rcb_info->rcb_var.DatSetNa, rptID);
//for (rcb_info1 = all_rcb_info->rcb_info_list;
// rcb_info1 != NULL;
// rcb_info1 = (RCB_INFO *) list_get_next (all_rcb_info->rcb_info_list, rcb_info1)) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> װ<>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>
// rcb_info1 = (RCB_INFO *) list_get_next (all_rcb_info->rcb_info_list, rcb_info1)) //遍历 装置报告控制块链表
for (rcb_info1 = dev_rcb->rcb_info_list;
rcb_info1 != NULL;
rcb_info1 = (RCB_INFO *)list_get_next(dev_rcb->rcb_info_list, rcb_info1)) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>
rcb_info1 = (RCB_INFO *)list_get_next(dev_rcb->rcb_info_list, rcb_info1)) //遍历 报告控制块链表
{
if (strcmp(rcb_info1->ds_Nam, rptID) == 0) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ψһ<EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD>
if (strcmp(rcb_info1->ds_Nam, rptID) == 0) //报告ID作为不同报告间的唯一标识符
{
//SLOGALWAYS3 ("Num of var received in RPT (%d) does not match expected (%d)dateSet=%s ", va_total, va_num,rptID);
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD>RptID= '%s'<EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>rptID= %s<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(%d)<29><>Ԥ<EFBFBD>ڴ<EFBFBD>С(%d)<29><>ƥ<EFBFBD>䣬brak<61><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", saveRptID, rptID, va_total, va_num); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-23 15:09:30
//LOG_INFO("(报告解析)接收报告RptID= '%s'数据集rptID= %s,大小(%d)与预期大小(%d)不匹配brak跳出", saveRptID, rptID, va_total, va_num); //仅调试使用! zl 2019-12-23 15:09:30
rcb_info = rcb_info1;
break;
}
@@ -2044,7 +2044,7 @@ ST_RET u_iec_rpt_ind(MVL_COMM_EVENT* event)
info_va[va_num++] = rcb_info->rcb_var.TimeOfEntry;
if ((retcode = check_va_count_too_big(va_num, va_total)) == SD_FAILURE) goto CLEANUP;
//WW 2024-09-02 <EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>
//WW 2024-09-02 数据集名称确认
if (BSTR_BIT_GET(OptFldsData, OPTFLD_BITNUM_DATSETNAME))
info_va[va_num++] = rcb_info->rcb_var.DatSetNa;
@@ -2053,19 +2053,19 @@ ST_RET u_iec_rpt_ind(MVL_COMM_EVENT* event)
if (BSTR_BIT_GET(OptFldsData, OPTFLD_BITNUM_DATSETNAME))
{
//info_va[va_num++] = rcb_info->rcb_var.DatSetNa; //WW 2024-09-02 ע<EFBFBD><EFBFBD>
//info_va[va_num++] = rcb_info->rcb_var.DatSetNa; //WW 2024-09-02 注释
///////////////////
//WW 2023-08-29
log_var_to_data(rcb_info->rcb_var.DatSetNa, saveRptID);
for (rcb_info1 = all_rcb_info->rcb_info_list;
rcb_info1 != NULL;
rcb_info1 = (RCB_INFO*)list_get_next(all_rcb_info->rcb_info_list, rcb_info1)) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>
rcb_info1 = (RCB_INFO*)list_get_next(all_rcb_info->rcb_info_list, rcb_info1)) //遍历 报告控制块链表
{
if (strcmp(rcb_info1->ds_Nam, saveRptID) == 0) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ψһ<EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD>
if (strcmp(rcb_info1->ds_Nam, saveRptID) == 0) //报告ID作为不同报告间的唯一标识符
{
printf("ds_name '%s' ! Recive name %s WWTest \n", rcb_info1->ds_Nam, saveRptID);
//SLOGALWAYS3 ("Num of var received in RPT (%d) does not match expected (%d)dateSet=%s ", va_total, va_num,rptID);
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD>RptID= '%s'<EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>rptID= %s<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(%d)<29><>Ԥ<EFBFBD>ڴ<EFBFBD>С(%d)<29><>ƥ<EFBFBD>䣬brak<61><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", saveRptID, rptID, va_total, va_num); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-23 15:09:30
//LOG_INFO("(报告解析)接收报告RptID= '%s'数据集rptID= %s,大小(%d)与预期大小(%d)不匹配brak跳出", saveRptID, rptID, va_total, va_num); //仅调试使用! zl 2019-12-23 15:09:30
rcb_info = rcb_info1;
break;
}
@@ -2152,7 +2152,7 @@ ST_RET u_iec_rpt_ind(MVL_COMM_EVENT* event)
/* Perform 3rd decode (everything). */
mvl_info_data_to_local(event, va_num, info_va);
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20250114
//报告处理加锁lnk20250114
//pthread_mutex_lock(&mtx); printf("rpt hold lock !!!!!!!!!!!");
u_iec_rpt_ind_data(info_va, OptFldsData, InclusionData, rcb_info, va_total, event->net_info);
//pthread_mutex_unlock(&mtx); printf("rpt free lock !!!!!!!!!!!");
@@ -2164,7 +2164,7 @@ CLEANUP:
return (retcode);
}
/************************************************************************/
//61850<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//61850报告解析为本地数据
/************************************************************************/
void log_var_to_data(MVL_VAR_ASSOC *var, char *pdata)
{
@@ -2200,7 +2200,7 @@ static ST_RET myLocToTextBs(ST_UCHAR* pSrc, RUNTIME_TYPE* rt, ST_CHAR* text)
ST_CHAR* destBuf;
ST_UCHAR mask;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//调试用
//printf("pSrc[0]: 0x%X, pSrc[1]: 0x%X, text: %s\n", pSrc[0], pSrc[1], text);
//printf("%s text_len %d %d pSrc %d %d \n", text, strlen(text), rt->u.p.el_len, pSrc[0], pSrc[1]);
@@ -2245,7 +2245,7 @@ static ST_RET myLocToTextBs(ST_UCHAR* pSrc, RUNTIME_TYPE* rt, ST_CHAR* text)
}
destBuf[i] = 0;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//调试用
//printf("pSrc[0]: 0x%X, pSrc[1]: 0x%X, text: %s\n", pSrc[0], pSrc[1], text);
return (SD_SUCCESS);
@@ -2313,7 +2313,7 @@ ST_RET my_asn1_convert_utc_to_btod(MMS_UTC_TIME* utc, MMS_BTOD* btod)
btod->day = (long)(utc->secs - tJan84) / SECONDS_PER_DAY; /* num of days since 1/1/1984 */
btod->ms = (long)((utc->secs - tJan84) % SECONDS_PER_DAY) * 1000; /* num milliseconds since midnight */
/* NOTE: use 0x01000000 (2**24) in fraction computations. */
// Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 28.9999Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>29ms
// 要四舍五入到毫秒数,比如 28.9999应该是29ms
btod->ms += (ST_INT32)(0.5 + (ST_DOUBLE)utc->fraction * 1000.0 / (ST_DOUBLE)0x01000000);
/* add the milliseconds left in a sec */
btod->form = MMS_BTOD6;
@@ -2458,7 +2458,7 @@ void my_local_to_data(ST_CHAR* datptr, SD_CONST RUNTIME_TYPE* rt_head,
break;
case RT_BIT_STRING:
myLocToTextBs((ST_UCHAR*)datptr, rt_ptr, tmpBuf);//<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> '1' <EFBFBD><EFBFBD> '0' <EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>
myLocToTextBs((ST_UCHAR*)datptr, rt_ptr, tmpBuf);//将存储在内存中的比特串转换为对应的文本字符串(由字符 '1' '0' 组成)
strcpy(data->data_item[valid_item_num].comp_name, (const char*)attr_str);
data->data_item[valid_item_num].size = abs(rt_ptr->u.p.el_len);
data->data_item[valid_item_num].type = DATA_STR_TYPE;
@@ -2503,7 +2503,7 @@ void my_local_to_data(ST_CHAR* datptr, SD_CONST RUNTIME_TYPE* rt_head,
break;
#endif
default:
echo_warn1("δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RT_INTEGER<EFBFBD><EFBFBD>RT_BCD <EFBFBD><EFBFBD><EFBFBD><EFBFBD> size = %i \n", rt_ptr->u.p.el_len);
echo_warn1("未处理的RT_INTEGERRT_BCD 整数 size = %i \n", rt_ptr->u.p.el_len);
break;
}
break;
@@ -2542,7 +2542,7 @@ void my_local_to_data(ST_CHAR* datptr, SD_CONST RUNTIME_TYPE* rt_head,
break;
#endif /* INT64_SUPPORT */
default:
echo_warn1("δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> size = %i \n", rt_ptr->u.p.el_len);
echo_warn1("未处理的 无符号整数 size = %i \n", rt_ptr->u.p.el_len);
break;
}
break;

View File

@@ -83,7 +83,7 @@
extern uint32_t g_node_id;
extern char subdir[128];
unsigned int g_no_auth = 0;
DEV_TYPE_LIST gDev_rcb_list; //ȫ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DEV_TYPE_LIST gDev_rcb_list; //全局报告控制块链表
#if defined(MVL_GOOSE_SUPPORT)
/* Need parts of "iecgoose" sample app */
#include "iec_demo.h" /* definitions from "iecgoose" sample app */
@@ -312,7 +312,7 @@ ST_INT mms_get_datatype_from_type_id (ST_INT type_id, ST_UCHAR* datatype,ST_INT
ret = mvl_get_runtime (type_id, &rt_ctrl.rt_first,&rt_ctrl.rt_num);
if (ret == SD_SUCCESS)
{//ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> rt_ctrl.rt_num <EFBFBD>е<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͺ<EFBFBD> <20><><EFBFBD><EFBFBD>
{//只返回 rt_ctrl.rt_num 中第一个数据的类型和 长度
RUNTIME_TYPE *rt_type = &rt_ctrl.rt_first[0];
*datatype = rt_type->el_tag;
*len = rt_type->u.p.el_len;
@@ -433,7 +433,7 @@ void init_MMS()
loc_dib_table = localDibTable;
// num_rem_dib_entries = sizeof(rem_dib_table)/sizeof(DIB_ENTRY);
memset(&gDev_rcb_list, 0, sizeof(DEV_TYPE_LIST)); //WW 2023-08-29 ȫ<EFBFBD><EFBFBD>װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
memset(&gDev_rcb_list, 0, sizeof(DEV_TYPE_LIST)); //WW 2023-08-29 全局装置报告指针初始化
// tp4_config(); /* see tp4_hc.c */
tp0_cfg.max_tpdu_len = 8192;//8192;
@@ -450,7 +450,7 @@ void init_MMS()
/* Fill in mvlCfg. */
mvlCfg.num_called = 0;
mvlCfg.max_msg_size = 320000; //to enlage to fit the <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mvlCfg.max_msg_size = 320000; //to enlage to fit the 主设备保护
strcpy (mvlCfg.local_ar_name, "local1");
#else /* #if defined(HARD_CODED_CFG) */
@@ -595,7 +595,7 @@ ST_RET mms_mvla_fdelete (MVL_NET_INFO *net_info,ST_CHAR *file_to_delete,int iTi
}
#endif
//<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><EFBFBD><EFBFBD>
//用于发送文件目录请求,获取远程设备的文件列表,并返回符合条件的文件名。
#if (MMS_FDIR_EN & REQ_EN)
ST_RET mms_mvla_fdir (MVL_NET_INFO *net_info,ST_CHAR *filespec,int iTimeout,
char*** filenames ,int* filenum,apr_pool_t *pool)
@@ -712,7 +712,7 @@ ST_RET mms_mvla_getnam (MVL_NET_INFO *net_info,ST_INT scope,
//else {
// printf ("\n More Follows : FALSE");
//}
printf("<EFBFBD><EFBFBD>");//
printf("");//
//printf ("mms_mvla_getname %d Names returned . \n",getnam_resp->num_names);
varnames2 = apr_pcalloc( pool,(*varnum+getnam_resp->num_names)*sizeof(char*) );
@@ -769,7 +769,7 @@ ST_UCHAR TrgOps [1]; /* 8 bit bitstring */
rcb_info = rcb_info_create (clientNetInfo, dom_name, rcb_name, rpt_typeids, timeOut);
if (rcb_info)
{
//<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//先注销报告先
ST_BOOLEAN RptDisEna = 0; /* 0 = disable the report */
ST_CHAR varName [MAX_IDENT_LEN + 1];
apr_snprintf (varName,sizeof(varName), "%s$RptEna", rcb_name);
@@ -825,7 +825,7 @@ ST_UCHAR TrgOps [1]; /* 8 bit bitstring */
}
///////////////////////////////////////////
//WW 2023-08-29 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>,<2C>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><E6B4A5><EFBFBD>ٶ<EFBFBD>
//WW 2023-08-29 增加设备类型处理,优化报告触发速度
RCB_INFO* mms_register_iec_rpt_by_devtype(MVL_NET_INFO *clientNetInfo, RPT_TYPEIDS *rpt_typeids,
ST_CHAR *dom_name, ST_CHAR *rcb_name, ST_INT timeOut, ST_CHAR *dev_type, ST_CHAR *ip, int port,
ST_INT scanRate, ST_UCHAR trgops, ST_UINT8* pEntryID, ST_UINT8* OptFlds)
@@ -835,80 +835,80 @@ RCB_INFO* mms_register_iec_rpt_by_devtype(MVL_NET_INFO *clientNetInfo, RPT_TYPEI
ST_UCHAR TrgOps[1]; /* 8 bit bitstring */
//һ<EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>---------------------------------------------------------------------------------------------------------------------------
ST_BOOLEAN bFindDevType = 0; //<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Dev_RCB_INFO *dev_rcb = NULL;//װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹָ<EFBFBD><EFBFBD>
for (dev_rcb = gDev_rcb_list.dev_rcb_info_Head; dev_rcb != NULL; dev_rcb = (Dev_RCB_INFO *)list_get_next(gDev_rcb_list.dev_rcb_info_Head, dev_rcb)) //<EFBFBD>ٱ<EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>
//一、装置类型查找判断---------------------------------------------------------------------------------------------------------------------------
ST_BOOLEAN bFindDevType = 0; //是否在链表中查找到装置类型
Dev_RCB_INFO *dev_rcb = NULL;//装置报告结构指针
for (dev_rcb = gDev_rcb_list.dev_rcb_info_Head; dev_rcb != NULL; dev_rcb = (Dev_RCB_INFO *)list_get_next(gDev_rcb_list.dev_rcb_info_Head, dev_rcb)) //①遍历 全局装置报告控制块链表
{
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>gDev_rcb_list<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, dev_type_name= %s", dev_rcb->dev_type_name); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:16:31
if ((strcmp(dev_rcb->dev_type_name, dev_type) == 0)) //ƥ<EFBFBD><EFBFBD> װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//LOG_INFO("(报告触发)遍历gDev_rcb_list链表, dev_type_name= %s", dev_rcb->dev_type_name); //仅调试使用! zl 2019-12-24 00:16:31
if ((strcmp(dev_rcb->dev_type_name, dev_type) == 0)) //匹配 装置类型
{
bFindDevType = 1; //<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>䵽װ<E4B5BD><D7B0><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>dev_type_name= %s", dev_rcb->dev_type_name); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:23:55
bFindDevType = 1; //查找到装置类型
//LOG_INFO("(报告触发)匹配到装置类型,dev_type_name= %s", dev_rcb->dev_type_name); //仅调试使用! zl 2019-12-24 00:23:55
break;
}
} //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (!bFindDevType) //δ<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} //遍历 装置类型链表 结束
if (!bFindDevType) //未查找到装置类型
{
dev_rcb = (Dev_RCB_INFO *)chk_calloc(1, sizeof(Dev_RCB_INFO)); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<D5BC><E4A3AC><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַָ<D6B7><EFBFBD><EFBFBD><E0B5B1>New
strcpy(dev_rcb->dev_type_name, dev_type); //װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>dev_type_name= %s", dev_rcb->dev_type_name); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:23:55
list_add_last(&gDev_rcb_list.dev_rcb_info_Head, dev_rcb); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>
dev_rcb = (Dev_RCB_INFO *)chk_calloc(1, sizeof(Dev_RCB_INFO)); //调用 申请连续内存空间并初始化为0返回首地址指针相当于New
strcpy(dev_rcb->dev_type_name, dev_type); //装置类型
//LOG_INFO("(报告触发)新增装置类型,dev_type_name= %s", dev_rcb->dev_type_name); //仅调试使用! zl 2019-12-24 00:23:55
list_add_last(&gDev_rcb_list.dev_rcb_info_Head, dev_rcb); //添加 全局装置报告控制块链表
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ںŲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>---------------------------------------------------------------------------------------------------------------------------------------------------
ST_BOOLEAN bFindIpPort = 0; //<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ں<EFBFBD>
Dev_IP_Port_INFO *dev_info = NULL; //װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ںŽṹָ<EFBFBD><EFBFBD>
for (dev_info = dev_rcb->dev_ip_port_list; dev_info != NULL; dev_info = (Dev_IP_Port_INFO *)list_get_next(dev_rcb->dev_ip_port_list, dev_info)) //<EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD><D7B0>IP<49><50><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
//二、装置IP、端口号查找判断---------------------------------------------------------------------------------------------------------------------------------------------------
ST_BOOLEAN bFindIpPort = 0; //是否在链表中查找到装置IP、端口号
Dev_IP_Port_INFO *dev_info = NULL; //装置IP、端口号结构指针
for (dev_info = dev_rcb->dev_ip_port_list; dev_info != NULL; dev_info = (Dev_IP_Port_INFO *)list_get_next(dev_rcb->dev_ip_port_list, dev_info)) //②遍历 全局装置IP、端口链表
{
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>dev_ip_port_list<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, dev_type_name= %s, ip= %s, port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:16:31
if ((strcmp(dev_info->IP, ip) == 0) && (dev_info->Port == port)) //ƥ<EFBFBD><EFBFBD> װ<><D7B0>IP && <EFBFBD>˿ں<EFBFBD>
//LOG_INFO("(报告触发)遍历dev_ip_port_list链表, dev_type_name= %s, ip= %s, port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //仅调试使用! zl 2019-12-24 00:16:31
if ((strcmp(dev_info->IP, ip) == 0) && (dev_info->Port == port)) //匹配 装置IP && 端口号
{
bFindIpPort = 1; //<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD>IP && <EFBFBD>˿ں<EFBFBD>
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>䵽װ<E4B5BD><D7B0>dev_type_name= %s, IP= %s<EFBFBD><EFBFBD> Port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:23:55
bFindIpPort = 1; //查找到装置IP && 端口号
//LOG_INFO("(报告触发)匹配到装置dev_type_name= %s, IP= %s Port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //仅调试使用! zl 2019-12-24 00:23:55
break;
}
}//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> װ<><D7B0>IP<49><50><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (!bFindIpPort) //δ<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
}//遍历 装置IP、端口链表 结束
if (!bFindIpPort) //未查找到装置IP、端口
{
dev_info = (Dev_IP_Port_INFO *)chk_calloc(1, sizeof(Dev_IP_Port_INFO)); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<D5BC><E4A3AC><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַָ<D6B7><EFBFBD><EFBFBD><E0B5B1>New
dev_info = (Dev_IP_Port_INFO *)chk_calloc(1, sizeof(Dev_IP_Port_INFO)); //调用 申请连续内存空间并初始化为0返回首地址指针相当于New
strcpy(dev_info->IP, ip); //װ<EFBFBD><EFBFBD>IP
dev_info->Port = port; //<EFBFBD>˿ں<EFBFBD>
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>dev_type_name= %s, IP= %s<EFBFBD><EFBFBD> Port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:23:55
list_add_last(&dev_rcb->dev_ip_port_list, dev_info); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>->װ<><D7B0>IP<49><50><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
strcpy(dev_info->IP, ip); //装置IP
dev_info->Port = port; //端口号
//LOG_INFO("(报告触发)新增装置dev_type_name= %s, IP= %s Port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //仅调试使用! zl 2019-12-24 00:23:55
list_add_last(&dev_rcb->dev_ip_port_list, dev_info); //添加 全局装置报告控制块链表->装置IP、端口链表
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>----------------------------------------------------------------------------------------------------------------------------------------------------------------------
RCB_INFO *rcb_info = NULL; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>ָ<EFBFBD><EFBFBD>
ST_BOOLEAN bFindRCB = 0; //<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>ҵ<EFBFBD>
for (rcb_info = dev_rcb->rcb_info_list; rcb_info != NULL; rcb_info = (RCB_INFO *)list_get_next(dev_rcb->rcb_info_list, rcb_info)) //<EFBFBD>۱<EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
//三、装置报告控制块查找判断----------------------------------------------------------------------------------------------------------------------------------------------------------------------
RCB_INFO *rcb_info = NULL; //报告控制块指针
ST_BOOLEAN bFindRCB = 0; //是否在装置报告控制块链表中查找到
for (rcb_info = dev_rcb->rcb_info_list; rcb_info != NULL; rcb_info = (RCB_INFO *)list_get_next(dev_rcb->rcb_info_list, rcb_info)) //③遍历 全局装置报告控制块链表->报告控制块信息链表
{
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>rcb_info_list<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, RptID= %s<EFBFBD><EFBFBD>dom_Name= %s<EFBFBD><EFBFBD>dom= %s<EFBFBD><EFBFBD>rcb_name= %s<EFBFBD><EFBFBD>rpt= %s", rcb_info->RptID, rcb_info->dom_Name, dom, rcb_info->rcb_name, rpt); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2018-10-17 21:19:36
if ((strcmp(rcb_info->rcb_name, rcb_name) == 0) && (strcmp(rcb_info->dom_Name, dom_name) == 0)) //ƥ<EFBFBD><EFBFBD> װ<>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>
//LOG_INFO("(报告触发)遍历rcb_info_list链表, RptID= %sdom_Name= %sdom= %srcb_name= %srpt= %s", rcb_info->RptID, rcb_info->dom_Name, dom, rcb_info->rcb_name, rpt); //仅调试使用! zl 2018-10-17 21:19:36
if ((strcmp(rcb_info->rcb_name, rcb_name) == 0) && (strcmp(rcb_info->dom_Name, dom_name) == 0)) //匹配 装置报告控制块
{
bFindRCB = 1; //<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>dev_type_name= %s, dom= %s<EFBFBD><EFBFBD>rcb= %s<EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", dev_rcb->dev_type_name, dom, rpt); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-3-13 14:24:43
bFindRCB = 1; //查找到装置报告控制块
//LOG_INFO("(报告触发)匹配到报告控制块dev_type_name= %s, dom= %srcb= %s,已触发过!", dev_rcb->dev_type_name, dom, rpt); //仅调试使用! zl 2019-3-13 14:24:43
break; /* rcb_info now points to right structure */
}
}
if (!bFindRCB) //δ<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>
if (!bFindRCB) //未查找到装置报告控制块
{
rcb_info = rcb_info_create(clientNetInfo, dom_name, rcb_name, rpt_typeids, timeOut); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD> <20><>>> ע<><D7A2><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>͵ı<CDB5><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>
rcb_info = rcb_info_create(clientNetInfo, dom_name, rcb_name, rpt_typeids, timeOut); //调用 创建装置报告控制块 —>> 注:该函数较为耗时,若本装置类型的报告控制块已创建过,则不需再进行创建!
if (rcb_info == NULL) {
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>dev_type_name= %s, dom= %s<EFBFBD><EFBFBD>rcb= %s", dev_rcb->dev_type_name, dom, rpt); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-3-13 14:24:43
//LOG_INFO("(报告触发)创建报告控制块失败!dev_type_name= %s, dom= %srcb= %s", dev_rcb->dev_type_name, dom, rpt); //仅调试使用! zl 2019-3-13 14:24:43
return SD_FAILURE;
}
else {
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dev_type_name= %s, dom= %s<EFBFBD><EFBFBD>rcb= %s", dev_rcb->dev_type_name, dom, rpt); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-3-13 14:24:43
list_add_last(&dev_rcb->rcb_info_list, rcb_info); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
//LOG_INFO("(报告触发)创建报告控制块成功,新增全局报告控制块链表!dev_type_name= %s, dom= %srcb= %s", dev_rcb->dev_type_name, dom, rpt); //仅调试使用! zl 2019-3-13 14:24:43
list_add_last(&dev_rcb->rcb_info_list, rcb_info); //添加 全局报告控制块链表->报告控制块信息链表
}
//TRACE("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ飡dom= %s rcb= %s<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ:%0.6f<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С:%d", dom, rpt, dwEnd - dwStart, sizeof(RCB_INFO));
//TRACE("(报告触发)创建报告控制块!dom= %s rcb= %s,耗时:%0.6f,报告大小:%d", dom, rpt, dwEnd - dwStart, sizeof(RCB_INFO));
}
if (rcb_info)
{
//<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WW 2023-08-29ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
//先注销报告先 WW 2023-08-29注释先注销报告的代码
//ST_BOOLEAN RptDisEna = 0; /* 0 = disable the report */
//ST_CHAR varName[MAX_IDENT_LEN + 1];
//apr_snprintf(varName, sizeof(varName), "%s$RptEna", rcb_name);
@@ -971,81 +971,81 @@ ST_RET mms_unregister_iec_rpt_by_devtype(MVL_NET_INFO *clientNetInfo, RPT_TYPEID
ST_BOOLEAN RptEna = 0;
ST_CHAR varName[MAX_IDENT_LEN + 1];
ST_RET ret; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>з<EFBFBD><EFBFBD><EFBFBD>ֵ
ST_RET ret; //函数执行返回值
//һ<EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>---------------------------------------------------------------------------------------------------------------------------
ST_BOOLEAN bFindDevType = 0; //<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Dev_RCB_INFO *dev_rcb = NULL;//װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹָ<EFBFBD><EFBFBD>
for (dev_rcb = gDev_rcb_list.dev_rcb_info_Head; dev_rcb != NULL; dev_rcb = (Dev_RCB_INFO *)list_get_next(gDev_rcb_list.dev_rcb_info_Head, dev_rcb)) //<EFBFBD>ٱ<EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>
//一、装置类型查找判断---------------------------------------------------------------------------------------------------------------------------
ST_BOOLEAN bFindDevType = 0; //是否在链表中查找到装置类型
Dev_RCB_INFO *dev_rcb = NULL;//装置报告结构指针
for (dev_rcb = gDev_rcb_list.dev_rcb_info_Head; dev_rcb != NULL; dev_rcb = (Dev_RCB_INFO *)list_get_next(gDev_rcb_list.dev_rcb_info_Head, dev_rcb)) //①遍历 全局装置报告控制块链表
{
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ)<29><><EFBFBD><EFBFBD>gDev_rcb_list<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, dev_type_name= %s", dev_rcb->dev_type_name); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:16:31
if ((strcmp(dev_rcb->dev_type_name, dev_type) == 0)) //ƥ<EFBFBD><EFBFBD> װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//LOG_INFO("(报告停止)遍历gDev_rcb_list链表, dev_type_name= %s", dev_rcb->dev_type_name); //仅调试使用! zl 2019-12-24 00:16:31
if ((strcmp(dev_rcb->dev_type_name, dev_type) == 0)) //匹配 装置类型
{
bFindDevType = 1; //<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ)ƥ<>䵽װ<E4B5BD><D7B0><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>dev_type_name= %s", dev_rcb->dev_type_name); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:23:55
bFindDevType = 1; //查找到装置类型
//LOG_INFO("(报告停止)匹配到装置类型,dev_type_name= %s", dev_rcb->dev_type_name); //仅调试使用! zl 2019-12-24 00:23:55
break;
}
} //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
} //遍历 装置类型链表 结束
if (!bFindDevType) //δ<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!bFindDevType) //未查找到装置类型
{
dev_rcb = (Dev_RCB_INFO *)chk_calloc(1, sizeof(Dev_RCB_INFO)); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<D5BC><E4A3AC><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַָ<D6B7><EFBFBD><EFBFBD><E0B5B1>New
//memset(dev_rcb, 0, sizeof(Dev_RCB_INFO)); //ָ<EFBFBD><EFBFBD> <20><>0
strcpy(dev_rcb->dev_type_name, dev_type); //װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
list_add_last(&gDev_rcb_list.dev_rcb_info_Head, dev_rcb); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>
dev_rcb = (Dev_RCB_INFO *)chk_calloc(1, sizeof(Dev_RCB_INFO)); //调用 申请连续内存空间并初始化为0返回首地址指针相当于New
//memset(dev_rcb, 0, sizeof(Dev_RCB_INFO)); //指针 清0
strcpy(dev_rcb->dev_type_name, dev_type); //装置类型
list_add_last(&gDev_rcb_list.dev_rcb_info_Head, dev_rcb); //添加 全局装置报告控制块链表
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ںŲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>---------------------------------------------------------------------------------------------------------------------------------------------------
ST_BOOLEAN bFindIpPort = 0; //<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ں<EFBFBD>
Dev_IP_Port_INFO *dev_info = NULL; //װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿ںŽṹָ<EFBFBD><EFBFBD>
for (dev_info = dev_rcb->dev_ip_port_list; dev_info != NULL; dev_info = (Dev_IP_Port_INFO *)list_get_next(dev_rcb->dev_ip_port_list, dev_info)) //<EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD><D7B0>IP<49><50><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
//二、装置IP、端口号查找判断---------------------------------------------------------------------------------------------------------------------------------------------------
ST_BOOLEAN bFindIpPort = 0; //是否在链表中查找到装置IP、端口号
Dev_IP_Port_INFO *dev_info = NULL; //装置IP、端口号结构指针
for (dev_info = dev_rcb->dev_ip_port_list; dev_info != NULL; dev_info = (Dev_IP_Port_INFO *)list_get_next(dev_rcb->dev_ip_port_list, dev_info)) //②遍历 全局装置IP、端口链表
{
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ)<29><><EFBFBD><EFBFBD>dev_ip_port_list<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, dev_type_name= %s, ip= %s, port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:16:31
if ((strcmp(dev_info->IP, ip) == 0) && (dev_info->Port == port)) //ƥ<EFBFBD><EFBFBD> װ<><D7B0>IP && <EFBFBD>˿ں<EFBFBD>
//LOG_INFO("(报告停止)遍历dev_ip_port_list链表, dev_type_name= %s, ip= %s, port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //仅调试使用! zl 2019-12-24 00:16:31
if ((strcmp(dev_info->IP, ip) == 0) && (dev_info->Port == port)) //匹配 装置IP && 端口号
{
bFindIpPort = 1; //<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD>IP && <EFBFBD>˿ں<EFBFBD>
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ)ƥ<>䵽װ<E4B5BD><D7B0>dev_type_name= %s, IP= %s<EFBFBD><EFBFBD> Port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-12-24 00:23:55
bFindIpPort = 1; //查找到装置IP && 端口号
//LOG_INFO("(报告停止)匹配到装置dev_type_name= %s, IP= %s Port= %d", dev_rcb->dev_type_name, dev_info->IP, dev_info->Port); //仅调试使用! zl 2019-12-24 00:23:55
break;
}
} //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> װ<><D7B0>IP<49><50><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (!bFindIpPort) //δ<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
} //遍历 装置IP、端口链表 结束
if (!bFindIpPort) //未查找到装置IP、端口
{
dev_info = (Dev_IP_Port_INFO *)chk_calloc(1, sizeof(Dev_IP_Port_INFO)); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<D5BC><E4A3AC><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַָ<D6B7><EFBFBD><EFBFBD><E0B5B1>New
//memset(dev_info, 0, sizeof(Dev_IP_Port_INFO)); //ָ<EFBFBD><EFBFBD> <20><>0
strcpy(dev_info->IP, ip); //װ<EFBFBD><EFBFBD>IP
dev_info->Port = port; //<EFBFBD>˿ں<EFBFBD>
list_add_last(&dev_rcb->dev_ip_port_list, dev_info); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>->װ<><D7B0>IP<49><50><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
dev_info = (Dev_IP_Port_INFO *)chk_calloc(1, sizeof(Dev_IP_Port_INFO)); //调用 申请连续内存空间并初始化为0返回首地址指针相当于New
//memset(dev_info, 0, sizeof(Dev_IP_Port_INFO)); //指针 清0
strcpy(dev_info->IP, ip); //装置IP
dev_info->Port = port; //端口号
list_add_last(&dev_rcb->dev_ip_port_list, dev_info); //添加 全局装置报告控制块链表->装置IP、端口链表
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>----------------------------------------------------------------------------------------------------------------------------------------------------------------------
RCB_INFO *rcb_info = NULL; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>ָ<EFBFBD><EFBFBD>
ST_BOOLEAN bFindRCB = 0; //<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>ҵ<EFBFBD>
for (rcb_info = dev_rcb->rcb_info_list; rcb_info != NULL; rcb_info = (RCB_INFO *)list_get_next(dev_rcb->rcb_info_list, rcb_info)) //<EFBFBD>۱<EFBFBD><EFBFBD><EFBFBD> ȫ<><C8AB>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
//三、装置报告控制块查找判断----------------------------------------------------------------------------------------------------------------------------------------------------------------------
RCB_INFO *rcb_info = NULL; //报告控制块指针
ST_BOOLEAN bFindRCB = 0; //是否在装置报告控制块链表中查找到
for (rcb_info = dev_rcb->rcb_info_list; rcb_info != NULL; rcb_info = (RCB_INFO *)list_get_next(dev_rcb->rcb_info_list, rcb_info)) //③遍历 全局装置报告控制块链表->报告控制块信息链表
{
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ)<29><><EFBFBD><EFBFBD>rcb_info_list<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, RptID= %s<EFBFBD><EFBFBD>dom_Name= %s<EFBFBD><EFBFBD>dom= %s<EFBFBD><EFBFBD>rcb_name= %s<EFBFBD><EFBFBD>rpt= %s", rcb_info->RptID, rcb_info->dom_Name, dom, rcb_info->rcb_name, rpt); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2018-10-17 21:19:36
//if ((strcmp (rcb_info->rcb_name, rpt) == 0) && (strcmp(rcb_info->dom_Name, dom) == 0)) //ƥ<EFBFBD><EFBFBD> װ<>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> zl 2019-12-26 17:27:29
if ((strcmp(rcb_info->rcb_name, rcb_name) == 0)) //ƥ<EFBFBD><EFBFBD> װ<>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>
//LOG_INFO("(报告停止)遍历rcb_info_list链表, RptID= %sdom_Name= %sdom= %srcb_name= %srpt= %s", rcb_info->RptID, rcb_info->dom_Name, dom, rcb_info->rcb_name, rpt); //仅调试使用! zl 2018-10-17 21:19:36
//if ((strcmp (rcb_info->rcb_name, rpt) == 0) && (strcmp(rcb_info->dom_Name, dom) == 0)) //匹配 装置报告控制块 —— 废弃! zl 2019-12-26 17:27:29
if ((strcmp(rcb_info->rcb_name, rcb_name) == 0)) //匹配 装置报告控制块
{
bFindRCB = 1; //<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ)ƥ<><EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>dom= %s<EFBFBD><EFBFBD>rcb= %s<EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", dom, rpt); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-3-13 14:24:43
bFindRCB = 1; //查找到装置报告控制块
//LOG_INFO("(报告停止)匹配到报告控制块dom= %srcb= %s,已触发过!", dom, rpt); //仅调试使用! zl 2019-3-13 14:24:43
break; /* rcb_info now points to right structure */
}
}
if (!bFindRCB) //δ<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>װ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>
if (!bFindRCB) //未查找到装置报告控制块
{
rcb_info = rcb_info_create(clientNetInfo, dom_name, rcb_name, rpt_typeids, timeOut); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD> <20><>>> ע<><D7A2><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>͵ı<CDB5><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>
rcb_info = rcb_info_create(clientNetInfo, dom_name, rcb_name, rpt_typeids, timeOut); //调用 创建装置报告控制块 —>> 注:该函数较为耗时,若本装置类型的报告控制块已创建过,则不需再进行创建!
if (rcb_info == NULL) {
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>dom= %s<EFBFBD><EFBFBD>rcb= %s", dom, rpt); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-3-13 14:24:43
//LOG_INFO("(报告停止)创建报告控制块失败!dom= %srcb= %s", dom, rpt); //仅调试使用! zl 2019-3-13 14:24:43
return SD_FAILURE;
}
else {
//LOG_INFO("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dom= %s<EFBFBD><EFBFBD>rcb= %s", dom, rpt); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD> zl 2019-3-13 14:24:43
list_add_last(&dev_rcb->rcb_info_list, rcb_info); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
//LOG_INFO("(报告停止)创建报告控制块成功,新增全局报告控制块链表!dom= %srcb= %s", dom, rpt); //仅调试使用! zl 2019-3-13 14:24:43
list_add_last(&dev_rcb->rcb_info_list, rcb_info); //添加 全局报告控制块链表->报告控制块信息链表
}
}
sprintf(varName, "%s$RptEna", rcb_name); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ <20><><EFBFBD><EFBFBD>LLN0$BR$brcbStatisticData03$RptEna
ret = mms_named_var_write(clientNetInfo, varName, DOM_SPEC, dom_name, rpt_typeids->mmsbool, (ST_CHAR *)&RptEna, timeOut); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> д<><D0B4>װ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD>(<28><><EFBFBD><EFBFBD>ֹͣ)
sprintf(varName, "%s$RptEna", rcb_name); //报告停止 例:LLN0$BR$brcbStatisticData03$RptEna
ret = mms_named_var_write(clientNetInfo, varName, DOM_SPEC, dom_name, rpt_typeids->mmsbool, (ST_CHAR *)&RptEna, timeOut); //调用 写入装置报告控制块(报告停止)
return ret;
@@ -1107,18 +1107,18 @@ ST_VOID doCommService ()
/* connectToServer */
/************************************************************************/
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD>ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><EFBFBD>򲻿ɼ<EFBFBD><EFBFBD>ַ<EFBFBD>lnk20241119
// 检查字符串是否为空、仅空格或不可见字符lnk20241119
int is_empty_or_whitespace(const char* str) {
if (str == NULL) {
return 1; // NULL <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ"<22><>"
return 1; // NULL 情况,视为"空"
}
while (*str) {
if (!isspace((unsigned char)*str)) {
return 0; // <EFBFBD>зǿո<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<22><>"
return 0; // 有非空格字符,非"空"
}
str++;
}
return 1; // ȫ<EFBFBD>ǿո<EFBFBD><EFBFBD>򲻿ɼ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ"<22><>"
return 1; // 全是空格或不可见字符,视为"空"
}
ST_RET mms_connectToServer (ST_CHAR * dev_key,ST_CHAR *dev_series, ST_CHAR *serverARName,
@@ -1174,7 +1174,7 @@ S_SEC_ENCRYPT_CTRL *encryptCtrl = NULL; /* conn enctryption info */
//authInfo->mech_type = ACSE_AUTH_MECH_PASSWORD;
//memset(ied_password,0,sizeof(ied_password));
//lnk20241119<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>
//lnk20241119添加判断和打印,确保识别码秘钥为空时不调用加密
if (!is_empty_or_whitespace(dev_series) || !is_empty_or_whitespace(dev_key)) {
printf("dev_series= %s,dev_key= %s\n", dev_series,dev_key);
/* Fill out an authentication structure */

View File

@@ -1,6 +1,6 @@
/**
* @file: $RCSfile: parse_xml.c,v $
* @brief: $<EFBFBD><EFBFBD><EFBFBD><EFBFBD>xml
* @brief: $解析xml
*
* @version: $Revision: 1.5 $
* @date: $Date: 2018/12/29 03:18:14 $
@@ -85,11 +85,11 @@ apr_status_t app_get_private_config(const char *myfilename)
//************<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ReportControl.xml ***************//
//************解析 ReportControl.xml ***************//
#define REPORTCONTROL_FILE_PATH CONFIG_FILEPATH
/*
<!-- װ<EFBFBD><EFBFBD>ID,CPUID,ReportCtrlNum -->
<!-- 装置ID,CPUID,ReportCtrlNum -->
<ReportControlCount>104,1,2</ReportControlCount>
*/
//lnk20250122start
@@ -101,12 +101,12 @@ int init_rptctrl_by_count(LD_info_t* LD_info,int rptcount)
int j,i;
LD_info->rptcount = rptcount;
if(LD_info->rptinfo == 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>Ӹ<EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>20<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>¸<EFBFBD>ֵ
if(LD_info->rptinfo == NULL){ //如果是空的说明是第一次初始化需要申请空间直接给每个监测点申请20个报告位如果台账删除直接清空内容如果需要重用直接重新赋值
LD_info->rptinfo = apr_pcalloc( g_init_pool,MAX_RPT_COUNT*sizeof(rptinfo_t*) );
}
for(j=0; j<rptcount; j++) {
if(LD_info->rptinfo[j] == 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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD>Ŀռ䣬ֱ<EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ij<EFBFBD>ʼ<EFBFBD><EFBFBD>
if(LD_info->rptinfo[j] == NULL){//如果是空的说明是第一次初始化,需要申请空间,否则沿用原来的空间,直接进行值的初始化
LD_info->rptinfo[j] = apr_pcalloc( g_init_pool,sizeof(rptinfo_t) );
}
LD_info->rptinfo[j]->LD_info = LD_info;
@@ -124,7 +124,7 @@ int init_rptctrl_by_count(LD_info_t* LD_info,int rptcount)
}
//lnk20250122end
//ReportControl: װ<EFBFBD><EFBFBD>ID,CPUID,ID,RCBName, intgPd, dchg, qchg, dupd, period ,gi, ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻ<EFBFBD>׺,<2C><>
//ReportControl: 装置ID,CPUID,ID,RCBName, intgPd, dchg, qchg, dupd, period ,gi, 实例名是否增加后缀, 
// seqNum, timeStamp, reasonCode, dataSet, dataRef, bufOvfl, entryID, configRef, segmentation
//<ReportControl>104,1,1,brcbDin,60,1,0,0,1,0,yes,1,1,0,1,1,1,1,1,0</ReportControl>
int fill_rptctrl_by_cfg(LD_info_t* LD_info,int rptno,char *buf)
@@ -138,7 +138,7 @@ int fill_rptctrl_by_cfg(LD_info_t* LD_info,int rptno,char *buf)
if(!(str = strtok(buf,",")))
return 1;
rptinfo->rptNo = rptno;//CZY 2023-08-16 WW 2022-11-14 <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>
rptinfo->rptNo = rptno;//CZY 2023-08-16 WW 2022-11-14 增加报告编号,用于判断报告是否收完,可以进行数据处理
tmp_str = apr_pstrdup(g_init_pool,str);
rptinfo->rptID = str_trim_both(tmp_str," \t\'" );
@@ -199,7 +199,7 @@ int fill_rptctrl_by_cfg(LD_info_t* LD_info,int rptno,char *buf)
rptinfo->report_PQ_type = atoi(str);
}else return 1;
if ((str = strtok(NULL, ","))) { //CZY 2023-08-16 WW 2022-11-14<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
if ((str = strtok(NULL, ","))) { //CZY 2023-08-16 WW 2022-11-14增加闪变报告标志
rptinfo->flickerflag = atoi(str);
if (rptinfo->flickerflag == 0) {
LD_info->rptRecvFlag += 0x01 << rptno;
@@ -218,10 +218,10 @@ int fill_rptctrl_by_cfg(LD_info_t* LD_info,int rptno,char *buf)
//////////////////////////////////////////////////////////
//************<EFBFBD><EFBFBD><EFBFBD><EFBFBD> LogControl.xml ***************//
//************解析 LogControl.xml ***************//
/*
<!-- װ<EFBFBD><EFBFBD>ID,CPUID,LogCtrlNum -->
<!-- 装置ID,CPUID,LogCtrlNum -->
<LogControlCount>104,1,2</LogControlCount>
*/
@@ -274,7 +274,7 @@ int fill_logctrl_by_cfg(LD_info_t* LD_info,int logno,char *buf,char* devtype)
if(!(str = strtok(NULL,",")))
return 1;
apr_snprintf(loginfo->logName,sizeof(loginfo->logName), devtype,LD_info->cpuno);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>PQM1
apr_snprintf(loginfo->logName,sizeof(loginfo->logName), devtype,LD_info->cpuno);//例如PQM1
if((str = strtok(NULL,","))) loginfo->reasonCode = atoi(str); else return 1;
if((str = strtok(NULL,","))) loginfo->IntgPd = atoi(str); else return 1;

View File

@@ -1,6 +1,6 @@
/**
* @file: $RCSfile: rdb_client.c,v $
* @brief: $PROFIBUS <EFBFBD><EFBFBD>SSRTDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief: $PROFIBUS SSRTDB交互
*
* @version: $Revision: 1.11 $
* @date: $Date: 2020/10/28 05:21:18 $
@@ -14,7 +14,7 @@
#include "rdb_client.h"
#include "db_interface.h"
#include "node.h"
#include <pthread.h>//lnk20250114<EFBFBD><EFBFBD>̨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include <pthread.h>//lnk20250114给台账添加互斥锁
/*lnk10-10 */////////////////////////////////
extern int HTTP_PORT;
@@ -23,7 +23,7 @@ extern int G_TEST_FLAG;
extern int g_front_seg_index;
extern int g_front_seg_num;
#include "../include/rocketmq/SimpleProducer.h"
#include "../rocketmq/SimpleProducer.h"
#include "../cfg_parse/custom_printf.h"//lnk20250225
////////////////////////////////////////////
@@ -42,11 +42,11 @@ apr_pool_t* g_init_pool;
apr_pool_t* g_run_pool;
apr_pool_t* g_temp_dev_pool;
//lnk20250114<EFBFBD><EFBFBD>̨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//lnk20250114给台账添加互斥锁
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
extern char g_onlyIP[255]; //ֱ<EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD>IP<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>
extern char g_onlyIP[255]; //直连某个IP仅仅为方便测试
//为无锡西径变调档添加
uint8_t set_mx_q;
pt61850app_t* g_pt61850app;
@@ -186,21 +186,23 @@ apr_status_t init_rdb()
GetServerIndexFromDB();
rv = parse_device_cfg_web();
if (rv != APR_SUCCESS) {
echo_errg("Parsed device config xml file with error,try to run! \n");
return rv;
}
//台账读取过后初始化各级的日志
rv = parse_model_cfg_web();
if (rv != APR_SUCCESS) {
echo_errg("Parsed model with error,try to run! \n");
return rv;
}
Set_xml_nodeinfo();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>xmlģ<EFBFBD><EFBFBD>
Set_xml_nodeinfo();//解析xml模型
rv = parse_rpt_log_ini();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
rv = parse_rpt_log_ini();//报告块初始化
if (rv != APR_SUCCESS) {
echo_errg("Failed to parse report log define ini file! \n");
return rv;
@@ -216,7 +218,7 @@ apr_status_t init_rdb()
extern int SOCKETENABLE;
extern int HTTPENABLE;
/*--------------------------- <EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> -----------------------------------*/
/*--------------------------- 规约初始化 -----------------------------------*/
apr_status_t run_protocol()
{
apr_status_t rv;
@@ -224,9 +226,9 @@ apr_status_t run_protocol()
static apr_threadattr_t* worker_attr = NULL;
//lnk20250214//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD>0<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>ˣ<EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD>Ľ<EFBFBD><EFBFBD>̺<EFBFBD>
if (g_onlyIP[0] != 0 && g_front_seg_index == 0 && g_front_seg_num >= 10){ //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>web<EFBFBD>˿<EFBFBD><EFBFBD>ƴ򿪵ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_front_seg_index = g_front_seg_num; //<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>־
//lnk20250214//单连模式进程先通过进程号0获取所有台账然后再更新自己的进程号
if (g_onlyIP[0] != 0 && g_front_seg_index == 0 && g_front_seg_num >= 10){ //这是web端控制打开的单连进程
g_front_seg_index = g_front_seg_num; //更新进程号为:为这个单连进程设置的进程号,用来控制实时日志
}
init_MMS();
@@ -248,20 +250,20 @@ apr_status_t run_protocol()
if ((rv = apr_thread_create(&rtdb_thread, worker_attr, rtdb_worker, NULL, g_run_pool)) != APR_SUCCESS)
return rv;
try_start_kafka_thread();//mq<EFBFBD>߳<EFBFBD>
try_start_kafka_thread();//mq线程
//lnk20241213<EFBFBD><EFBFBD><EFBFBD><EFBFBD>mq<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
//lnk20241213添加mq消费者线程
try_start_mqconsumer_thread();
///////////////////WW 2023-08-22 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD>WebSocket<EFBFBD>߳<EFBFBD>
///////////////////WW 2023-08-22 增加数据库和WebSocket线程
if (g_onlyIP[0] != 0 || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_ALL_DATA_BASE_NODE_ID)
{
printf("g_onlyIP[0] != 0!\n\a");
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>socket<EFBFBD><EFBFBD>http<EFBFBD>߳<EFBFBD>
//单连进程不打开sockethttp线程
}
else //socket<EFBFBD><EFBFBD>http<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵߳Ŀ<EFBFBD><EFBFBD><EFBFBD>
else //sockethttp、测试线程的开启
{
printf("g_onlyIP[0] == 0!\n\a");
if (1 == SOCKETENABLE)
@@ -272,16 +274,16 @@ apr_status_t run_protocol()
exit(1);
}
int ServerPort = 13000;//WW <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD>ж<EFBFBD>ȡ
if (g_node_id == STAT_DATA_BASE_NODE_ID)//ͳ<EFBFBD>Ʋɼ<EFBFBD>
int ServerPort = 13000;//WW 这里后面需要从数据库的表中读取
if (g_node_id == STAT_DATA_BASE_NODE_ID)//统计采集
ServerPort = SOCKET_PORT + STAT_DATA_BASE_NODE_ID + g_front_seg_index;
else if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {//补召
ServerPort = SOCKET_PORT + RECALL_HIS_DATA_BASE_NODE_ID + g_front_seg_index;
}
else if (g_node_id == THREE_SECS_DATA_BASE_NODE_ID) {//3<EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>
else if (g_node_id == THREE_SECS_DATA_BASE_NODE_ID) {//3秒采集
ServerPort = SOCKET_PORT + THREE_SECS_DATA_BASE_NODE_ID + g_front_seg_index;
}
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//<EFBFBD><EFBFBD>̬¼<EFBFBD><EFBFBD>
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波
ServerPort = SOCKET_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index;
}
@@ -312,23 +314,23 @@ apr_status_t run_protocol()
if (1 == HTTPENABLE)
{
//lnk20241029<EFBFBD><EFBFBD><EFBFBD><EFBFBD>http<EFBFBD>߳<EFBFBD>///////////////////////////////////////////////////////////////////////////////////////////////
if (g_node_id == STAT_DATA_BASE_NODE_ID)//ͳ<EFBFBD>Ʋɼ<EFBFBD>
//lnk20241029增加http线程///////////////////////////////////////////////////////////////////////////////////////////////
if (g_node_id == STAT_DATA_BASE_NODE_ID)//统计采集
HTTP_PORT = HTTP_PORT + STAT_DATA_BASE_NODE_ID + g_front_seg_index;
else if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {//补召
HTTP_PORT = HTTP_PORT + RECALL_HIS_DATA_BASE_NODE_ID + g_front_seg_index;
}
else if (g_node_id == THREE_SECS_DATA_BASE_NODE_ID) {//3<EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>
else if (g_node_id == THREE_SECS_DATA_BASE_NODE_ID) {//3秒采集
HTTP_PORT = HTTP_PORT + THREE_SECS_DATA_BASE_NODE_ID + g_front_seg_index;
}
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//<EFBFBD><EFBFBD>̬¼<EFBFBD><EFBFBD>
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波
HTTP_PORT = HTTP_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index;
}
printf("try_start_web_http_thread \n");
try_start_web_http_thread();
printf("try_start_http_thread \n");
try_start_http_thread();
//lnk20241029<EFBFBD><EFBFBD><EFBFBD><EFBFBD>http<EFBFBD>߳<EFBFBD>///////////////////////////////////////////////////////////////////////////////////////////////////
//lnk20241029增加http线程///////////////////////////////////////////////////////////////////////////////////////////////////
}
@@ -342,32 +344,32 @@ apr_status_t run_protocol()
extern uint32_t g_dead_lock_counter;
extern uint32_t g_thread_blocked_times;
/*--------------------------- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD> -----------------------------------*/
/*--------------------------- 连接实时库线程 -----------------------------------*/
static void* APR_THREAD_FUNC rtdb_worker(apr_thread_t* thd, void* data)
{
while (1) {
doCommService();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>61850<EFBFBD><EFBFBD>Ϣ
doCommService();//处理61850消息
check_3s_config();//3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>̶<EFBFBD>ȡ3<EFBFBD><EFBFBD><EFBFBD>
check_3s_config();//3秒数据进程读取3秒触发
CheckNextNotConnectedChannel();//<EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
CheckNextNotConnectedChannel();//所有长连接进程判断连接状态
CheckAllConnectedChannel();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD>١<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CheckAllConnectedChannel();//触发报告、日志补召、发送心跳
create_recall_xml();//<EFBFBD><EFBFBD><EFBFBD>ɴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>xml<EFBFBD>ļ<EFBFBD>
create_recall_xml();//生成待补招xml文件
pthread_mutex_lock(&mtx);
check_ledger_update();//lnk20250113<EFBFBD><EFBFBD>ȡ̨<EFBFBD>˸<EFBFBD><EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD>
check_ledger_update();//lnk20250113读取台账更新,触发台账更新
pthread_mutex_unlock(&mtx);
check_disk_quota();//<EFBFBD>жϴ<EFBFBD><EFBFBD>̿ռ<EFBFBD>
check_disk_quota();//判断磁盘空间
apr_pool_clear(g_pt61850app->tmp_pool);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
apr_pool_clear(g_pt61850app->tmp_pool);//清除临时缓存
g_dead_lock_counter = 0;
g_thread_blocked_times = 0;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
g_thread_blocked_times = 0;//监控线程
}
echo_msg("rtdb worker thread terminated...");
@@ -406,7 +408,7 @@ apr_time_t convert_btime6_to_apr_time(MMS_BTIME6* bTime6)
{
apr_time_t ticks;
if ((TIME_T_1984_JAN_1 + (bTime6->day * SECONDS_PER_DAY)) > TIME_T_2036) {
echo_warn("ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬳<EFBFBD><EFBFBD><EFBFBD>2036<EFBFBD>");
echo_warn("时标错误,超过2036年!");
}
ticks = TIME_T_1984_JAN_1;
ticks += (bTime6->day * SECONDS_PER_DAY);
@@ -418,7 +420,7 @@ apr_time_t convert_btime6_to_apr_time(MMS_BTIME6* bTime6)
/*
61850
λ <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ֵ
位 属性名称 值
0-1 Good 00
Invalid 01
Reserved 10
@@ -437,15 +439,15 @@ apr_time_t convert_btime6_to_apr_time(MMS_BTIME6* bTime6)
*/
/*
60870
λ <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ֵ
0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
5 <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>
6 <EFBFBD>ǵ<EFBFBD>ǰֵ
7 <EFBFBD><EFBFBD>Ч
位 属性名称 值
0 溢出
1 保留
2 保留
3 保留
4 被封锁
5 被取代
6 非当前值
7 无效
*/
byte_t get_mx_q_from_61850(char* q_61850)
{
@@ -480,15 +482,15 @@ byte_t get_mx_q_from_61850(char* q_61850)
/*
60870
λ <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ֵ
0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
5 <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>
6 <EFBFBD>ǵ<EFBFBD>ǰֵ
7 <EFBFBD><EFBFBD>Ч
位 属性名称 值
0 保留
1 保留
2 保留
3 保留
4 被封锁
5 被取代
6 非当前值
7 无效
*/
byte_t get_st_q_from_61850(char* q_61850)
{

View File

@@ -1,6 +1,6 @@
/**
* @file iec103ttylink.h
* @brief IEC61850 <EFBFBD><EFBFBD>rdb <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ͷ<EFBFBD>ļ<EFBFBD>
* @brief IEC61850 rdb 交互处理 的头文件
*
* @version $Revision: 1.18 $
* @date $Date: 2018/12/29 12:30:29 $
@@ -16,23 +16,23 @@
#include "ied.h"
#include "node.h"
//lnk20250113<EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>˶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
//lnk20250113添加包含台账定义的头文件
#include "../json/save2json.h"
#include <stdbool.h>
//<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>Чʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡֵ
//文件有效时间的取值
#define FROM_FILE_NAME (0)
#define FROM_SYSTEM (1)
//ͨ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>Ŀ¼
//通用文件存放的目录
#define GENERAL_PREFIX "0_0"
#define GENERAL_PATH "0_0\\19700101\\00"
//iec report <EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD>״̬
#define VALUE_REACHED (0x01) // ״̬<EFBFBD><EFBFBD>ң<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>
#define Q_REACHED (0x02) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>
#define T_REACHED (0x04) // ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>
#define REASON_REACHED (0x08) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>
//iec report 数据到达状态
#define VALUE_REACHED (0x01) // 状态或遥测值已收到
#define Q_REACHED (0x02) // 数据质量已收到
#define T_REACHED (0x04) // 时标已收到
#define REASON_REACHED (0x08) // 发送原因已收到
//CHANNELSTATE macro defines
#define CHANNEL_CONNECTING (0x01) //
@@ -45,19 +45,19 @@
#define RELAY_RUN (0x02) //
#define RELAY_CANCEL (0x03) //
#define MIN_INIT_NUM (10) //<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>
#define NEXT_CONNECT_TIME (10000) //һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10*1000=10s
#define MIN_INIT_NUM (10) //链路层完全初始化最少次数,作为可以进行召唤录波文件的条件。
#define NEXT_CONNECT_TIME (10000) //一次链接失败后,下次链接时间间隔10*1000=10s
#define MAX_SAME_FCDNAME_OBJECTS (500) // for <EFBFBD><EFBFBD><EFBFBD><EFBFBD>PQװ<EFBFBD>ã<EFBFBD><EFBFBD>ij<EFBFBD>64 2016-5-10 //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>FCD<EFBFBD>ֳɶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> ACT<43><54><EFBFBD>󣬷ֳ<F3A3ACB7>general<EFBFBD><EFBFBD>phsa<EFBFBD><EFBFBD>b<EFBFBD><EFBFBD>c<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define MAX_SAME_FCDNAME_OBJECTS (500) // for 灿能PQ装置改成64 2016-5-10 //最多一个FCD分成多个对象的个数 ,如一个 ACT对象分成generalphsabc等数个对象
/** ======================<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>չͬ<EFBFBD>ڹ<EFBFBD><EFBFBD><EFBFBD>============================ */
/** ======================浙江渔都变顺控扩展同期功能============================ */
/*
16:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>բ
17:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ں<EFBFBD>բ
18:<EFBFBD><EFBFBD>ͬ<EFBFBD>ں<EFBFBD>բ
19:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>բ
CHECK_BY_SETTING CHECK_U <EFBFBD><EFBFBD>Ӧ˳<EFBFBD><EFBFBD>Ʊͬ<EFBFBD><EFBFBD>ң<EFBFBD>ص<EFBFBD><EFBFBD>ĵ<EFBFBD>һ<EFBFBD><EFBFBD>ң<EFBFBD>ص<EFBFBD>
CHECK_NOTHING CHECK_SYN <EFBFBD><EFBFBD>Ӧ˳<EFBFBD><EFBFBD>Ʊͬ<EFBFBD><EFBFBD>ң<EFBFBD>ص<EFBFBD><EFBFBD>ĵڶ<EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>ص<EFBFBD>
16:按定值方式合闸
17:不检同期合闸
18:检同期合闸
19:检无压合闸
CHECK_BY_SETTING CHECK_U 对应顺控票同期遥控点的第一个遥控点
CHECK_NOTHING CHECK_SYN 对应顺控票同期遥控点的第二个遥控点
*/
#define CHECK_START_QU 16
#define CHECK_BY_SETTING 0
@@ -65,10 +65,10 @@ CHECK_NOTHING CHECK_SYN
#define CHECK_SYN 2
#define CHECK_U 3
#define DEFAULT_EDIT_FXDAREANO (0x80FE) /**< Ĭ<EFBFBD>ϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define FIXED_AREA_GRP_DOT2_EDIT_AREA (2) /**< <EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><EFBFBD><E0BCAD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> */
#define DEFAULT_EDIT_FXDAREANO (0x80FE) /**< 默认编辑区定值区号 */
#define FIXED_AREA_GRP_DOT2_EDIT_AREA (2) /**< 定值区组->编辑定值区点 */
//lnk<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܱ<EFBFBD>־20250121
//lnk添加使能标志20250121
#define ENABLE 1
#define UNUSED 0
@@ -87,7 +87,7 @@ typedef struct ied_info_t ied_info_t;
struct autorecall_t {
long long start;
long long end;
int need_steady; //lnk20241030<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD>־
int need_steady; //lnk20241030添加补招稳态暂态标志
int need_voltage;
};
//////////////////////////////////////////////////////////
@@ -96,7 +96,7 @@ struct ied_info_t{
unsigned char name[50][128];
char value[50][20];
};
//lnk20250113<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>˸<EFBFBD><EFBFBD>½ṹ///////////////////////////////
//lnk20250113添加台账更新结构///////////////////////////////
#define MAX_UPDATEA_NUM 10
typedef struct trigger_update_xml_t trigger_update_xml_t;
struct trigger_update_xml_t{
@@ -138,8 +138,8 @@ struct trigger_3s_xml_t{
typedef struct recall_t recall_t;
struct recall_t{
char* line_id;
long long start_time; //<EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>ʼʱ<EFBFBD><EFBFBD>
long long end_time; //<EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
long long start_time; //待召唤日志起始时间
long long end_time; //待召唤日志结束时间
int need_steady;
int need_voltage;
};
@@ -175,30 +175,30 @@ struct element_usr_t{
struct rptinfo_t{
char* rptID;
byte_t instanceNeedSuffix; //ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻ<EFBFBD>׺
byte_t instanceNeedSuffix; //实例名是否增加后缀
byte_t TrgOpt;
byte_t OptFlds [2]; /* 10 bit bitstring but only allow write of 9 bits*/
uint32_t IntgPd; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
int report_PQ_type; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ͳ<EFBFBD>ơ<EFBFBD>ʵʱ<EFBFBD><EFBFBD>soe<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>
uint32_t IntgPd; //完整性上送时间(秒)
int report_PQ_type; //报告前置类型统计、实时、soe、事件类型等
LD_info_t* LD_info;
int rpt_registered; //<EFBFBD>Ƿ<EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
byte_t chnl_id; //<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>
int rpt_registered; //是否注册成功
byte_t chnl_id; //如果未注册,下次试图注册报告的通道号
//如果已注册,则是本次注册报告的通道号
RCB_INFO * m_rcb_info;
double m_LastDataTime; //<EFBFBD>ϴ<EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><EFBFBD>
double m_LastGITime; //<EFBFBD>ϴ<EFBFBD>GI<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
double m_LastRegisterFailedTime; //<EFBFBD>ϴ<EFBFBD>ע<EFBFBD><EFBFBD>ʧ<EFBFBD>ܵ<EFBFBD>ʱ<EFBFBD><EFBFBD>
double m_LastUnRegisterFailedTime; //<EFBFBD>ϴ<EFBFBD>ȡ<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>ʧ<EFBFBD>ܵ<EFBFBD>ʱ<EFBFBD><EFBFBD>
double m_LastDataTime; //上次收到数据的时间
double m_LastGITime; //上次GI的时间
double m_LastRegisterFailedTime; //上次注册失败的时间
double m_LastUnRegisterFailedTime; //上次取消注册失败的时间
byte_t m_EntryID[8];
int m_curRptSuffix;
int count; //<EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĴ<EFBFBD><EFBFBD><EFBFBD>
int rptNo;//CZY 2023-08-17 WW 2022-11-14<EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>
int flickerflag;//CZY 2023-08-17 WW 2022-11-14<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
int count; //收到报告数据的次数
int rptNo;//CZY 2023-08-17 WW 2022-11-14增加编号用于匹配数据收集
int flickerflag;//CZY 2023-08-17 WW 2022-11-14增加闪变标志
int pstflag;//CZY 2023-08-17 WW 2022-11-14<EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
int pstflag;//CZY 2023-08-17 WW 2022-11-14增加短闪闪变标志
};
@@ -206,14 +206,14 @@ struct loginfo_t{
char* lcbName;
char* datasetName;
char logName[32];
uint32_t IntgPd; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
uint32_t IntgPd; //完整性上送时间(秒)
byte_t reasonCode;
byte_t TrgOpt;
LD_info_t* LD_info;
//LCB_INFO * m_lcb_info;
apr_time_t start_time; //<EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>ʼʱ<EFBFBD><EFBFBD>
apr_time_t end_time; //<EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
apr_time_t start_time; //待召唤日志起始时间
apr_time_t end_time; //待召唤日志结束时间
//double last_checktime;
int need_steady;
@@ -243,107 +243,107 @@ struct LD_info_t{
ied_t *ied;
byte_t cpuno;
char *LD_name;
apr_hash_t *ht_fcd; /**< FCD object hash<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> element */
apr_hash_t *ht_full_fcda; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>FCDA object hash<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> element */
int rptcount; /**< report <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
rptinfo_t **rptinfo; /**< rptinfo_t* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int read_flag ; //CZY 2023-02-28 <EFBFBD>ж<EFBFBD><EFBFBD>Ƿ񽫼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ч
apr_hash_t *ht_fcd; /**< FCD object hash索引 到 element */
apr_hash_t *ht_full_fcda; /**< 完整FCDA object hash索引 到 element */
int rptcount; /**< report 个数 */
rptinfo_t **rptinfo; /**< rptinfo_t* 数组 */
int read_flag ; //CZY 2023-02-28 判断是否将监测点是否有效
char mp_id[256];//CZY 2023-08-20 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8afaa
char terminal_code[256];//CZY 2023-08-20 <EFBFBD>ն˱<EFBFBD><EFBFBD><EFBFBD>
//int ld_ins;//CZY 2023-08-20 <EFBFBD>߼<EFBFBD><EFBFBD>豸ʵ<EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
char voltage_level[256];//CZY 2023-08-20 <EFBFBD><EFBFBD>ѹ<EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>30
char v_wiring_type[256];//CZY 2023-08-20 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>01-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>02-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long long time; //CZY 2023-08-20 ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>) ̨<>˸<EFBFBD><CBB8><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>1691656669
int update_flag;//CZY 2023-08-20 ̨<EFBFBD>˸<EFBFBD><EFBFBD>±<EFBFBD>־ 0:keep 2:delete 4:update 8:add
char monitor_status[64]; //lnk20241031<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int rptRecvFlag;//CZY 2023-08-17 WW 2022-11-14<EFBFBD>жϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,rptRecvFlag=<3D><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int rptRecvCheckFlag;//CZY 2023-08-17 WW 2022-11-14<EFBFBD>жϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ÿ<><C3BF><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rptRecvFlagһ<67><D2BB><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
int rptPstRecvFlag;//CZY 2023-08-17 WW 2022-11-14<EFBFBD>жϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,rptRecvFlag=<3D><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int rptPstRecvCheckFlag;//CZY 2023-08-17 WW 2022-11-14<EFBFBD>жϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ÿ<><C3BF><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rptRecvFlagһ<67><D2BB><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
int iUnitOfTime;//CZY 2023-08-17 WW 2022<EFBFBD><EFBFBD>12<EFBFBD><EFBFBD>7<EFBFBD><EFBFBD>15:43:34 װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䵥λ<E4B5A5>л<EFBFBD>(0-ms; 1-s)
int iStatOfTime;//CZY 2023-08-17 WW 2022<EFBFBD><EFBFBD>12<EFBFBD><EFBFBD>7<EFBFBD><EFBFBD>15:48:33 ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> 0-<2D><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> 1-UTCʱ<EFBFBD><EFBFBD>
int iJournalTime;//CZY 2023-08-17 WW 2022<EFBFBD><EFBFBD>12<EFBFBD><EFBFBD>7<EFBFBD><EFBFBD>15:52:32 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ʱ<D6BE><CAB1>(0-UTCʱ<43><CAB1>(<28><>־<EFBFBD><D6BE>¼<EFBFBD><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ΪUTCʱ<43><CAB1>); 1-<2D><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>(<28><>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ʱ<EFBFBD>䡢¼<E4A1A2><C2BC><EFBFBD>ļ<EFBFBD>UTCʱ<43><CAB1> ע<><D7A2><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>+8Сʱ<D0A1><CAB1>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־))
//<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD>־
int logcount; /**< log <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
loginfo_t **loginfo; /**< loginfo_t* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
//<EFBFBD><EFBFBD>־
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char mp_id[256];//CZY 2023-08-20 监测点编码,例:8afaa
char terminal_code[256];//CZY 2023-08-20 终端编码
//int ld_ins;//CZY 2023-08-20 逻辑设备实例号,例:1
char voltage_level[256];//CZY 2023-08-20 电压等级,例:30
char v_wiring_type[256];//CZY 2023-08-20 监测点电压接线方式01-三相星型02-三相角型
long long time; //CZY 2023-08-20 时间戳(秒) 台账更新时间,例:1691656669
int update_flag;//CZY 2023-08-20 台账更新标志 0:keep 2:delete 4:update 8:add
char monitor_status[64]; //lnk20241031监测点状态
//报告
int rptRecvFlag;//CZY 2023-08-17 WW 2022-11-14判断报告是否收齐,rptRecvFlag=有效报告序号相加
int rptRecvCheckFlag;//CZY 2023-08-17 WW 2022-11-14判断报告是否收齐,每次收到报告相加与rptRecvFlag一起判断是否收完
int rptPstRecvFlag;//CZY 2023-08-17 WW 2022-11-14判断报告是否收齐,rptRecvFlag=有效报告序号相加
int rptPstRecvCheckFlag;//CZY 2023-08-17 WW 2022-11-14判断报告是否收齐,每次收到报告相加与rptRecvFlag一起判断是否收完
//报告
//不使用
int iUnitOfTime;//CZY 2023-08-17 WW 2022年12月7日15:43:34 装置上送事件持续时间单位切换(0-ms; 1-s)
int iStatOfTime;//CZY 2023-08-17 WW 2022年12月7日15:48:33 统计数据时间 0-北京时间 1-UTC时间
int iJournalTime;//CZY 2023-08-17 WW 2022年12月7日15:52:32 补招日志时间(0-UTC时间(日志、录波文件均为UTC时间); 1-北京时间(日志北京时间、录波文件UTC时间 注:仅四川地区+8小时读取补招日志))
//不使用
//日志
int logcount; /**< log 个数 */
loginfo_t **loginfo; /**< loginfo_t* 数组 */
//日志
//补招
int autorecallflag;
int autorecallcount;
autorecall_t **autorecall;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
//补招
//不使用
uint32_t group; //add by rzx
//<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
//ʵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//不使用
//实时数据
int line_id;
//ʵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//¼<EFBFBD><EFBFBD>
//实时数据
//录波
int FltNum[256];
//¼<EFBFBD><EFBFBD>
//ʵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//录波
//实时数据
int real_data;
int soe_data;
int limit;
int count;
//ʵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
//实时数据
//不使用
int SubV_Index;
int Dev_Index;
int Sub_Index;
int GD_Index;
//<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
//不使用
//process QVVR
QVVR_t qvvr[QVVR_NUM];
int qvvr_idx;
//<EFBFBD><EFBFBD>̬
//暂态
//process RDRE
int RDRE_FltNum;
//¼<EFBFBD><EFBFBD>
//录波
};
struct ied_usr_t{
LD_info_t *LD_info; /**< LD<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int dev_idx; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
char dev_type[256]; /**< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
char dev_key[256]; /**< <EFBFBD><EFBFBD><EFBFBD>Կ */
char dev_series[256]; /**< <EFBFBD>豸ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int dev_flag; /**< <EFBFBD><EFBFBD><EFBFBD>־ */
LD_info_t *LD_info; /**< LD数组 */
int dev_idx; /**< 设备序号 */
char dev_type[256]; /**< 设备类型 */
char dev_key[256]; /**< 设备秘钥 */
char dev_series[256]; /**< 设备识别码 */
int dev_flag; /**< 设备标志 */
void *cookie;
double last_call_wavelist_time ; //<EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>ʱ<EFBFBD><EFBFBD>
double last_call_wavelist_time ; //上次召录波列表时间
char terminal_id[256];//CZY 2023-08-20 <EFBFBD>ն<EFBFBD>id<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8afaa9a15707483a0157262f8e78077d
char org_name[256];//CZY 2023-08-20 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˾
char maint_name[256];//CZY 2023-08-20 <EFBFBD><EFBFBD>ά<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˾
char station_name[256];//CZY 2023-08-20 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>վ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>220kV<EFBFBD><EFBFBD>̨ɽ<EFBFBD><EFBFBD>
char tmnl_factory[256];//CZY 2023-08-20 <EFBFBD>ն˳<EFBFBD><EFBFBD>ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͼ<EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>˾
long long time; //CZY 2023-08-20 ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>) ̨<>˸<EFBFBD><CBB8><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>1691656669
char tmnl_status[256];//CZY 2023-08-30 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
char terminal_code[256];//CZY 2023-08-30 <EFBFBD>ն˱<EFBFBD><EFBFBD><EFBFBD>
int update_flag;//CZY 2023-08-20 ̨<EFBFBD>˸<EFBFBD><EFBFBD>±<EFBFBD>־ 0:keep 2:delete 4:update 8:add
char terminal_id[256];//CZY 2023-08-20 终端id8afaa9a15707483a0157262f8e78077d
char org_name[256];//CZY 2023-08-20 所属单位,例:南京供公司
char maint_name[256];//CZY 2023-08-20 运维单位,例:南京供公司
char station_name[256];//CZY 2023-08-20 所属变电站220kV五台山变
char tmnl_factory[256];//CZY 2023-08-20 终端厂家,例:南京自动化股份有限公司
long long time; //CZY 2023-08-20 时间戳(秒) 台账更新时间,例:1691656669
char tmnl_status[256];//CZY 2023-08-30 运行状态
char terminal_code[256];//CZY 2023-08-30 终端编码
int update_flag;//CZY 2023-08-20 台账更新标志 0:keep 2:delete 4:update 8:add
char processNo[64];//̨<EFBFBD>˽<EFBFBD><EFBFBD>̺<EFBFBD>
char processNo[64];//台账进程号
};
struct chnl_usr_t{
byte_t chnl_id;
char ip_str[20];
channel_t *chnl; /**< <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>channel ָ<EFBFBD><EFBFBD> */
channel_t *chnl; /**< 对应的channel 指针 */
MVL_NET_INFO *net_info;
MVL_REQ_PEND *m_reqCtrl; //MVL_REQ_PEND
int m_state;
double m_StartConnectingTime; //<EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD>ʼ connect <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
double m_StartDisconnectingTime; //<EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD>ʼ disconnect <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
double m_ClosedMsTime; //<EFBFBD>ϴ<EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><EFBFBD>
double m_LastPosRespTime; //<EFBFBD>ϴο϶<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
int m_NegRespTimes; // <EFBFBD>ۼƷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double m_StartConnectingTime; //这次开始 connect 的时间
double m_StartDisconnectingTime; //这次开始 disconnect 的时间
double m_ClosedMsTime; //上次通道关闭时间
double m_LastPosRespTime; //上次肯定响应的时间
int m_NegRespTimes; // 累计否定响应次数
};
@@ -354,32 +354,32 @@ struct pt61850app_t
// rdb_t *rdb;
node_t *node;
// driver_t *driver;
//byte_t IsMaster; //<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
//byte_t IsMaster; //当前的主备状态
////////////////////////////
uint32_t mmsOpTimeout; //mms<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵĽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD>
//uint32_t relayTimeout; //ң<EFBFBD>صȴ<EFBFBD>ң<EFBFBD>ŷ<EFBFBD><EFBFBD>صij<EFBFBD>ʱʱ<EFBFBD><EFBFBD>
uint32_t giTime; //<EFBFBD>ܲ<EFBFBD>ѯʱ<EFBFBD><EFBFBD>
int rptSuffix[2][2]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD>׺
uint32_t mmsOpTimeout; //mms操作,读写变量等的交互超时时间
//uint32_t relayTimeout; //遥控等待遥信返回的超时时间
uint32_t giTime; //总查询时间
int rptSuffix[2][2]; //报告控制块后缀
//char ftp_srv_ip[16];
//char ftpsrv_path[64];
//char ftp_user[32];
//char ftp_password[32];
char accPath[65]; //װ<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
//char RcdMadeAddStr[65]; //¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>ŵ<EFBFBD>ַ
//uint8_t change_file_name; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD>޸<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
char accPath[65]; //装置录波文件路径
//char RcdMadeAddStr[65]; //录波动作遥信地址
//uint8_t change_file_name; //保存时,是否修改文件名
uint32_t chnl_counts;
chnl_usr_t **chnl_usr;
apr_pool_t *tmp_pool; // <EFBFBD><EFBFBD>ʱpool
//<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><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>
apr_pool_t *tmp_pool; // 临时pool
//链路层完全初始化次数,作为可以进行召唤录波文件的条件。即确保所有装置初始化最少一次后才允许开始召唤文件
uint8_t initNum;
//<EFBFBD>ٻ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>Ϊ0<EFBFBD><EFBFBD>ֻ<EFBFBD>ٻ<EFBFBD><EFBFBD><EFBFBD>ӦĿ¼<EFBFBD>µ<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>Ϊ1<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>չ
//召唤文件类型为0则只召唤对应目录下的录波文件为1则召唤对应目录下的所有文件其余留待扩展
//uint8_t call_file_type;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>Ч
uint8_t check_dgtVal;//0<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>
//数字量入库前是否检查值有效
uint8_t check_dgtVal;//0不判非0判
};
//Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//为无锡西径变调档添加
extern uint8_t set_mx_q;
#ifdef _OS_WIN32_
@@ -420,14 +420,14 @@ rptinfo_t* find_rptinfo_from_net_rpt_info_name(MVL_NET_INFO *net_info, RCB_INFO
void get_rpt_inst_name(rptinfo_t *rptinfo, char * rpt_inst_name );
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>rdb<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> APR_SUCCESS
* @brief 初始化rdb库相关内容
* @return 如果创建成功,返回 APR_SUCCESS
*/
apr_status_t init_rdb();
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> APR_SUCCESS
* @brief 启动规约处理相关线程
* @return 如果成功,返回 APR_SUCCESS
*/
apr_status_t run_protocol();
@@ -440,7 +440,7 @@ void CheckNextNotConnectedChannel();
//WW 2023-08-22
int HandleReceiveMessage(int socketClient, char buffer[256]);
int ExecuteWebCommand(LD_info_t *LD_info, int iType);
int SendMessageToWeb(int socketClient, int iErrorCode); //<EFBFBD><EFBFBD>Web Socket<EFBFBD>ͻ<EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int SendMessageToWeb(int socketClient, int iErrorCode); //Web Socket客户端发送消息
//WW 2023-08-22 end
void CheckAllConnectedChannel() ;

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)
{