Files
microser/mms/mms_process.c

1807 lines
65 KiB
C
Raw Normal View History

2025-01-16 16:17:01 +08:00
/**
* @file: $RCSfile: mms_process.c,v $
* @brief: $PROFIBUS <EFBFBD><EFBFBD>SSRTDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @version: $Revision: 1.28 $
* @date: $Date: 2022/11/28 07:13:13 $
* @author: $Author: lizhongming $
* @state: $State: Exp $
*
* @latest: $Id: mms_process.c,v 1.28 2022/11/28 07:13:13 lizhongming Exp $
*/
#include <string.h>
#include "rdb_client.h"
#include <stdlib.h>
#include "db_interface.h"
#include "node.h"
#include "ied.h"
#include "../json/mms_json_inter.h"
2025-03-04 17:29:04 +08:00
#include "../cfg_parse/custom_printf.h"//lnk20250225
2025-01-16 16:17:01 +08:00
void clear_rpt_counter_by_trigger(trigger_t *trigger);
//lnk20241031
extern void SOEFileWeb(char* localpath,char* cloudpath,char* wavepath);
//lnk 2024-11-4 <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-03-12 11:45:53 +08:00
char* convertMsToDateTimeString(int64_t msTime);
2025-01-16 16:17:01 +08:00
//lnk20250115
extern pthread_mutex_t mtx;
extern apr_pool_t* g_cfg_pool;
extern apr_pool_t* g_init_pool;
2025-01-21 17:48:37 +08:00
extern int g_DevFlag; //<2F><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>ʹ<EFBFBD><CAB9>lnk20250121
extern int IED_COUNT;
2025-01-16 16:17:01 +08:00
//lnk20250115end
#ifdef DEBUG_SISCO
SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
#endif
#ifdef _OS_UNIX_
#include <sys/vfs.h>
#endif
extern uint32_t g_dead_lock_counter;
extern uint32_t g_thread_blocked_times;
extern uint16_t g_client_id;
extern RPT_TYPEIDS g_rpt_typeids;
//extern rdb_t *g_rdb ;
extern node_t *g_node ;
extern char g_my_conf_fname[256];
extern apr_pool_t *g_init_pool;
extern apr_pool_t *g_run_pool;
extern pt61850app_t *g_pt61850app;
//extern char *g_sysfile_filedir;
extern char g_onlyIP[255]; //ֱ<><D6B1>ij<EFBFBD><C4B3>IP<49><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//extern int g_sysfile_appid; //add by rzx
//extern apr_time_t g_file_valid_time;
extern uint32_t g_min_free_size;
/////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
extern uint32_t g_node_id;
extern int three_secs_enabled;
extern int auto_register_report_enabled;
extern int FRONT_MP_NUM;
///////////////////////////////////////////////////////////////////////////////
extern int FILE_FLAG;
extern int recall_len;
extern int recall_sta;
extern int recall_daily;
extern char* UDS_UPLOAD_URL;
///////////////////////////////////////////////////////////////////
2025-01-22 17:00:34 +08:00
//lnk20250122start
apr_status_t init_rem_dib_table()
{
int pos = 0;
int iedno,chnl_no;
ied_t *ied;
struct in_addr ip;
chnl_usr_t *chnl_usr;
2025-02-17 16:58:14 +08:00
if(IED_COUNT < g_pt61850app->chnl_counts){
set_rem_dib_table_size( g_pt61850app->chnl_counts );//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_pt61850app->chnl_usr = apr_pcalloc( g_init_pool,g_pt61850app->chnl_counts*sizeof(chnl_usr_t*) );
printf( "set_rem_dib_table_size %d \n",g_pt61850app->chnl_counts );
}
else{
set_rem_dib_table_size( IED_COUNT );//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_pt61850app->chnl_usr = apr_pcalloc( g_init_pool,IED_COUNT*sizeof(chnl_usr_t*) );
printf( "set_rem_dib_table_size %d \n",IED_COUNT );
}
2025-01-22 17:00:34 +08:00
for(iedno=0 ; iedno<g_node->n_clients; iedno++) {
ied = g_node->clients[iedno];
for(chnl_no=0 ; chnl_no<ied->chncount; chnl_no++) {
chnl_usr = ied->channel[chnl_no].connect;
g_pt61850app->chnl_usr[pos] = chnl_usr;
ip.s_addr = htonl(ied->channel[chnl_no].addr);
strcpy(chnl_usr->ip_str,inet_ntoa(ip));
printf( " add_rem_dib_table %s:%d \n",chnl_usr->ip_str ,ied->channel[chnl_no].port );
add_rem_dib_table (pos++,chnl_usr->ip_str,ied->channel[chnl_no].port );
{
char comm_str[256];
memset(comm_str,0,256);
apr_snprintf(comm_str,sizeof(comm_str),"%16s:%d\t\tinited",chnl_usr->ip_str,ied->channel[chnl_no].port);
add_comm_log(comm_str);
}
}
}
return APR_SUCCESS;
}
//lnk20250122end
2025-01-16 16:17:01 +08:00
void CloseIECReports(chnl_usr_t *chnl_usr)
{
ied_t *ied;
ied_usr_t *ied_usr;
LD_info_t *LD_info;
rptinfo_t *rptinfo = NULL;
int cpuno,rpt_no;
ST_RET ret;
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
LD_info = &(ied_usr->LD_info[cpuno]);
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
char rpt_inst_name[65];
rptinfo = LD_info->rptinfo[rpt_no];
if ( ! rptinfo->rpt_registered )
continue;
if ( rptinfo->chnl_id != chnl_usr->chnl_id)
continue;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
rptinfo->rpt_registered = FALSE;
//ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>10<31><30><EFBFBD><EFBFBD> <20><>ע<EFBFBD><D7A2>һ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>
rptinfo->m_LastRegisterFailedTime = sGetMsTime() -10*60*1000;
rptinfo->m_rcb_info = NULL;
}
}
}
void closeChannel(chnl_usr_t *chnl_usr)
{
char comm_str[256];
memset(comm_str,0,256);
apr_snprintf(comm_str,sizeof(comm_str),"%16s:%d\t\tdisconnected !!!",chnl_usr->ip_str,chnl_usr->chnl->port);
add_comm_log(comm_str);
FRONT_MP_NUM--;
echo_warn1("Close Channel IP: %s",chnl_usr->ip_str );
CloseIECReports(chnl_usr);
echo_warn1("-------Close Channel IP: %s success!!!!!!!!!", chnl_usr->ip_str);
if (chnl_usr->net_info) {
ALL_RCB_INFO *all_rcb_info;
RCB_INFO *rcb_info;
ST_RET ret;
if(chnl_usr->net_info->user_info)
{
all_rcb_info = (ALL_RCB_INFO *)chnl_usr->net_info->user_info;
while((rcb_info = (RCB_INFO *)list_get_first(&all_rcb_info->rcb_info_list)) != NULL)
rcb_info_destroy (rcb_info);
chk_free(all_rcb_info);
chnl_usr->net_info->user_info=NULL;
}
chnl_usr->net_info->rem_vmd = NULL;
echo_warn("---------start disconnectFromServer!\n");
ret = mms_disconnectFromServer(chnl_usr->net_info,&chnl_usr->m_reqCtrl);
echo_warn("---------end disconnectFromServer!\n");
if (ret != SD_SUCCESS){
echo_warn("---------disconnectFromServer success!\n");
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
echo_warn2( "CHANNEL %s,NetInfo= %x mms_disconnectFromServer failed ,Disconnect it roughly! \n",chnl_usr->ip_str,chnl_usr->net_info);
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
chnl_usr->net_info->user_ext = NULL;
chnl_usr->net_info = NULL;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
chnl_usr->m_reqCtrl = NULL;
chnl_usr->net_info = NULL;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = sGetMsTime();
chnl_usr->chnl->status = STATUS_BREAKOFF;
}
else{
chnl_usr->m_state = CHANNEL_DISCONNECTING;
chnl_usr->m_StartDisconnectingTime = sGetMsTime();
}
}else {
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = sGetMsTime();
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
chnl_usr->chnl->status = STATUS_BREAKOFF;
}
}
ST_VOID Callback_channel_disconnect_ind(MVL_NET_INFO * NetInfo, ST_INT discType)
{
chnl_usr_t *chnl_usr;
chnl_usr = (chnl_usr_t*)NetInfo->user_ext;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if ( chnl_usr ) {
if(chnl_usr->m_state == CHANNEL_CONNECTING)
{ //do nothing;
printf("Do nothing,m_state == CHANNEL_CONNECTING ,NetInfo = %x",NetInfo);
}else if ( chnl_usr->m_state == CHANNEL_CONNECTED )
{
closeChannel(chnl_usr);
}else if ( chnl_usr->m_state == CHANNEL_DISCONNECTING )
{ //do nothing;
printf("Do nothing,m_state == CHANNEL_DISCONNECTING ,NetInfo = %x",NetInfo);
}else if ( chnl_usr->m_state == CHANNEL_DISCONNECTED )
{ //do nothing;
printf("Do nothing,m_state == CHANNEL_DISCONNECTED ,NetInfo = %x",NetInfo);
}
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
chnl_usr->net_info = NULL;
NetInfo->user_ext = NULL;
}
printf(" Callback_channel_disconnect_ind ,NetInfo = %x",NetInfo);
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
//zw<7A>޸<EFBFBD> 2023 - 8 - 17 ͨѶ<CDA8>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD> PG<50><47><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD>
ied_usr_t* ied_usr = (ied_usr_t*)(chnl_usr->chnl[0].ied->usr_ext);
}
void IECReport_tryGI(chnl_usr_t *chnl_usr,rptinfo_t *rptinfo)
{
char varName[64] = "";
ST_BOOLEAN GI = TRUE; /* call GI */
if ( (sGetMsTime() -rptinfo->m_LastGITime) < g_pt61850app->giTime*1000 )
return;
rptinfo->m_LastGITime = sGetMsTime();
get_rpt_inst_name(rptinfo,varName);
strcat(varName, "$GI");
mms_named_var_write (chnl_usr->net_info, varName, DOM_SPEC, rptinfo->LD_info->LD_name,
g_rpt_typeids.mmsbool, (ST_CHAR *) &GI, g_pt61850app->mmsOpTimeout);
}
//<2F><><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD>ܵȣ<DCB5><C8A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫע<D2AA>ᡢȡ<E1A1A2><C8A1>ע<EFBFBD><D7A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κδ<CEBA><CEB4><EFBFBD>
int judge_rpt_next_should_do(rptinfo_t *rptinfo)
{
int should_register_state = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ע<EFBFBD><D7A2>
int is_real_report = (rptinfo->report_PQ_type & REPORT_TYPE_REAL);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int is_soe_report = (rptinfo->report_PQ_type & REPORT_TYPE_SOE);
if (three_secs_enabled) {
should_register_state = 0; //3<><EFBFBD><EBB9A6>ģ<EFBFBD>飬Ĭ<E9A3AC>ϲ<EFBFBD>ע<EFBFBD><D7A2>
if (is_real_report) {//ӳ<><D3B3><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF>Ҵ<EFBFBD><D2B4><EFBFBD>
should_register_state = rptinfo->LD_info->real_data;
}
if (is_soe_report) {
should_register_state = rptinfo->LD_info->soe_data;
}
}
if (should_register_state==rptinfo->rpt_registered)//<2F>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>б
return SHOULD_DO_NOTHING;
else if (should_register_state)//<2F>б<D0B1><E4B6AF>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
return SHOULD_REGISTER;
else
return SHOULD_UNREGISTER;//<2F>б<D0B1><E4B6AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
{
ied_t *ied;
ied_usr_t *ied_usr;
LD_info_t *LD_info;
rptinfo_t *rptinfo = NULL;
channel_t *channel = NULL;
int cpuno,rpt_no;
char rpt_inst_name[65];
ST_RET ret;
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
channel = chnl_usr->chnl;
2025-02-21 16:24:41 +08:00
2025-01-16 16:17:01 +08:00
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++)
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
{
LD_info = &(ied_usr->LD_info[cpuno]); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if (LD_info->cpuno==0)
continue;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>棨ӳ<E6A3A8><D3B3><EFBFBD>ļ<EFBFBD><C4BC>ж<EFBFBD>ȡ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
rptinfo = LD_info->rptinfo[rpt_no] ;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if (judge_rpt_next_should_do(rptinfo)==SHOULD_DO_NOTHING)//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ񴥷<C7B7>
continue;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if(rptinfo->m_curRptSuffix==-1)
2025-04-29 15:05:36 +08:00
rptinfo->m_curRptSuffix = g_pt61850app->rptSuffix[g_client_id][0] ;
2025-01-16 16:17:01 +08:00
get_rpt_inst_name(rptinfo,rpt_inst_name);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if ( ! rptinfo->rpt_registered ) {
if ( (sGetMsTime() -rptinfo->m_LastRegisterFailedTime) > 20*1000 ) {
//ע<><D7A2>ʧ<EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD> 20<32><30> <20><>ע<EFBFBD><D7A2>һ<EFBFBD><D2BB>
RCB_INFO *rcb_info;
printf("start mms_register_iec_rpt................................\n");
if ( strstr(rptinfo->rptID,"LLN0$BR$brcbFlickerData") )
rptinfo->IntgPd = 600; //10<31><30><EFBFBD><EFBFBD>
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
/////////////////////////WW 2023-08-30 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB1A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rcb_info = mms_register_iec_rpt (chnl_usr->net_info, &g_rpt_typeids,
LD_info->LD_name,rpt_inst_name,g_pt61850app->mmsOpTimeout, rptinfo->IntgPd,rptinfo->TrgOpt,
(ST_UINT8*)rptinfo->m_EntryID ,(ST_UINT8*)rptinfo->OptFlds);
//WW end
///////////////////////////
if( !rcb_info )
{
if ( ++rptinfo->m_curRptSuffix > g_pt61850app->rptSuffix[g_client_id][1] )
rptinfo->m_curRptSuffix = g_pt61850app->rptSuffix[g_client_id][0] ;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
rptinfo->m_LastRegisterFailedTime = sGetMsTime() ;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
echo_err9("\nע<EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>Rregister iec_rpt failed !!! IED_ID=%d ,CPU=%d , domain: %s ,rpt_inst_name: %s ,ip: %s:%d,chnl_id: %d ,IntgPd=%d ,TrgOpt=0x%x \n",
APR_EGENERAL, LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl->port,
chnl_usr->chnl_id, rptinfo->IntgPd,rptinfo->TrgOpt );
}
else
{
double GIoffset;
rptinfo->rpt_registered = TRUE;
rptinfo->m_rcb_info = rcb_info;
rptinfo->chnl_id = chnl_usr->chnl_id;
chnl_usr->m_NegRespTimes = 0;
chnl_usr->m_LastPosRespTime = sGetMsTime();
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
echo_msg11("\nRegister iec_rpt succeed, IED_ID=%d ,CPU=%d ,domain: %s ,rpt_inst_name: %s ,ip: %s:%d,chnl_id: %d ,IntgPd=%d ,TrgOpt=0x%x ,OptFlds=0x%x%x \n",
LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl->port,chnl_usr->chnl_id,
rptinfo->IntgPd,rptinfo->TrgOpt,rptinfo->OptFlds[0],rptinfo->OptFlds[1] );
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
// add here to GI not the same time
GIoffset = 0.5 * g_pt61850app->giTime;
rptinfo->m_LastGITime = sGetMsTime() - GIoffset*1000;
}
printf("end mms_register_iec_rpt................................\n");
}
}
else { //rpt_registered ==TRUE
if ( (sGetMsTime() -rptinfo->m_LastUnRegisterFailedTime) > 20*1000 ) {
//ȡ<><C8A1>ע<EFBFBD><D7A2>ʧ<EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD> 20<32><30> <20><>ȡ<EFBFBD><C8A1>ע<EFBFBD><D7A2>һ<EFBFBD><D2BB>
printf("start mms_unregister_iec_rpt................................\n");
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
ret = mms_unregister_iec_rpt (chnl_usr->net_info, &g_rpt_typeids,
LD_info->LD_name,rpt_inst_name,g_pt61850app->mmsOpTimeout);
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if( ret == SD_FAILURE ) {
rptinfo->m_LastUnRegisterFailedTime = sGetMsTime() ;
echo_err6("\nȡ<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>UnRregister iec_rpt failed !!! IED_ID=%d ,CPU=%d , domain: %s ,rpt_inst_name: %s ,ip: %s,chnl_id: %d \n",
APR_EGENERAL, LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl_id);
}
else {
rptinfo->rpt_registered = FALSE;
echo_msg7("\nUnRegister iec_rpt succeed, IED_ID=%d ,CPU=%d ,domain: %s ,rpt_inst_name: %s ,ip: %s:%d,chnl_id: %d \n",
LD_info->ied->id,LD_info->cpuno,LD_info->LD_name,rpt_inst_name,chnl_usr->ip_str,chnl_usr->chnl->port,chnl_usr->chnl_id );
}
printf("end mms_unregister_iec_rpt................................\n");
}
2025-04-29 15:05:36 +08:00
}
2025-01-16 16:17:01 +08:00
}
}
}
void ChannelCheckWaveFiles(chnl_usr_t *chnl_usr)
{
ied_t *ied;
ied_usr_t *ied_usr;
LD_info_t *LD_info;
int cpuno;
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
LD_info = &(ied_usr->LD_info[cpuno]);
if (LD_info->line_id<=0) {
continue;
}
call_cn_wavelist(LD_info); //try to call wave file
}
}
void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
{
ST_RET ret;
ied_t *ied;
ied_usr_t *ied_usr;
LD_info_t *LD_info;
loginfo_t *loginfo = NULL;
int cpuno;
double now;
static double last_check_recall_config_time = 0.0;
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
LD_info = &(ied_usr->LD_info[cpuno]);
if (LD_info->logcount<=0)
continue;
loginfo = LD_info->loginfo[0] ;
apr_sleep(apr_time_from_sec(1) / 10);
Check_Recall_Config(LD_info->mp_id);//<2F><><EFBFBD>Ի<EFBFBD>ȡxml<6D>
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if (LD_info->autorecallcount != 0 && LD_info->autorecallflag != 1) {
int i;
int failed_count = 0;
for (i = 0; i < LD_info->autorecallcount; i++) {
LD_info->autorecallflag = 1;
//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>̬lnk20241030<33><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸ģ<DEB8>Check_Recall_Config<69><67>xml<6D>ļ<EFBFBD><C4BC><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݺ󣬸<DDBA>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>LD_info
loginfo->need_steady = LD_info->autorecall[i]->need_steady; loginfo->need_voltage = LD_info->autorecall[i]->need_voltage;
loginfo->start_time = apr_time_from_sec(LD_info->autorecall[i]->start - 5);
loginfo->end_time = apr_time_from_sec(LD_info->autorecall[i]->end - 5);
if (loginfo->need_steady == 0 && loginfo->need_voltage == 0)
continue;
if (loginfo->end_time <= loginfo->start_time)
continue;
printf("start mms_jread................................\n");
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
echo_msg6("\n mms_jread IED_ID=%d ,CPU=%d ,domain: %s ,logName: %s ,ip: %s,chnl_id: %d \n",
LD_info->ied->id, LD_info->cpuno, LD_info->LD_name, loginfo->logName, chnl_usr->ip_str, chnl_usr->chnl_id);
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
ret = mms_jread(loginfo, chnl_usr->net_info, loginfo->LD_info->LD_name, loginfo->logName,
loginfo->start_time, loginfo->end_time, g_pt61850app->mmsOpTimeout, chnl_usr->ip_str);
if (ret != SD_SUCCESS) {
echo_warn6("\n mms_jread Failed! IED_ID=%d ,CPU=%d ,domain: %s ,logName: %s ,ip: %s,chnl_id: %d \n",
LD_info->ied->id, LD_info->cpuno, LD_info->LD_name, loginfo->logName, chnl_usr->ip_str, chnl_usr->chnl_id);
failed_count++;
}
del_mvl_type_ctrl();
loginfo->need_steady = 0;
loginfo->need_voltage = 0;
loginfo->start_time = loginfo->end_time;
g_dead_lock_counter = 0;
g_thread_blocked_times = 0; //<2F><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD>˳<EFBFBD>
now = sGetMsTime();
last_check_recall_config_time = now;
printf("end ==============%.2f================\n", last_check_recall_config_time);
printf("end mms_jread................................\n");
}
if (failed_count==0) {//<2F>ɹ<EFBFBD>
Delete_recall_Xml(LD_info->mp_id);
}
}
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
}
}
void process_3s_config(trigger_3s_xml_t *trigger_3s_xml)
{
int i,j;
trigger_t *trigger;
trigger_t *trigger_work;
int trigger_num;
ied_t *ied;
LD_info_t *LD_info;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
int need_write_file;
int new_in_work_found;
printf("start process_3s_config\n");
need_write_file = FALSE;
trigger = trigger_3s_xml->new_triggers; //3s<33><73><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD>newtrigger<65><72><EFBFBD><EFBFBD><E9A3AC><EFBFBD><EFBFBD>û<EFBFBD><C3BB>newtrigger<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
trigger_num = trigger_3s_xml->new_trigger_num;
for (i=0; i<trigger_num; i++){
new_in_work_found = FALSE;
for (j=0; j<trigger_3s_xml->work_trigger_num; j++){
trigger_work = &trigger_3s_xml->work_triggers[j];
if (trigger_work->dev_idx==trigger[i].dev_idx && trigger_work->line_id==trigger[i].line_id ) {
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if (trigger[i].real_data>=0)
trigger_work->real_data = trigger[i].real_data;//<2F><><EFBFBD><EFBFBD>rtdata<74><61>־
if (trigger[i].soe_data>=0)
trigger_work->soe_data = trigger[i].soe_data; //<2F><><EFBFBD><EFBFBD>soe<6F><65>־
trigger_work->limit = trigger[i].limit;
clear_rpt_counter_by_trigger(trigger_work);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
new_in_work_found = TRUE;
}
}
if (!new_in_work_found) { //newtriggerΪ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>µĴ<C2B5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
clear_rpt_counter_by_trigger(&trigger[i]);
if (trigger[i].real_data<0)
trigger[i].real_data = 0;
if (trigger[i].soe_data<0)
trigger[i].soe_data = 0;
trigger_3s_xml->work_triggers[trigger_3s_xml->work_trigger_num++] = trigger[i];
}
need_write_file = TRUE;//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
}
trigger = trigger_3s_xml->delete_triggers; //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>deletetrigger<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
trigger_num = trigger_3s_xml->delete_trigger_num;
for (i=0; i<trigger_num; i++){
for (j=0; j<trigger_3s_xml->work_trigger_num; j++){
trigger_work = &trigger_3s_xml->work_triggers[j];
if (trigger_work->dev_idx==trigger[i].dev_idx && trigger_work->line_id==trigger[i].line_id ) {
clear_rpt_counter_by_trigger(trigger_work);
trigger_work->dev_idx = INVALID_DEV_IDX;
}
}
need_write_file = TRUE;
}
trigger = trigger_3s_xml->modify_triggers; //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>modifytrigger<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
trigger_num = trigger_3s_xml->modify_trigger_num;
for (i=0; i<trigger_num; i++){
for (j=0; j<trigger_3s_xml->work_trigger_num; j++){
trigger_work = &trigger_3s_xml->work_triggers[j];
if (trigger_work->dev_idx==trigger[i].dev_idx && trigger_work->line_id==trigger[i].line_id ) {
*trigger_work = trigger[i];
clear_rpt_counter_by_trigger(trigger_work);
}
}
need_write_file = TRUE;
}
clear_all_LD_real_soe_report_shoud_register(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫע<D2AA><D7A2><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><E6A3AC><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹLD_info->real_data = 0;LD_info->soe_data = 0;<3B>Ͳ<EFBFBD><CDB2><EFBFBD><E1B4A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
trigger = trigger_3s_xml->work_triggers; //<2F>ļ<EFBFBD><C4BC><EFBFBD>work<72><6B>
trigger_num = trigger_3s_xml->work_trigger_num;
for (i=0; i<trigger_num; i++){ //<2F><><EFBFBD><EFBFBD>work<72><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>
int real_report_count = 0; //ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (trigger[i].dev_idx==INVALID_DEV_IDX){//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն˺<D5B6>
printf("dev_idx incaild\n");
continue;
}
ied = find_ied_from_dev_idx(trigger[i].dev_idx); //ͨ<><CDA8><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD>dev<65><76><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><E8B1B8><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>Ƿ<EFBFBD><C7B7>б<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫʵ<D2AA>־͵<D6BE>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>
if (!ied){
printf("can't find ied by dev_idx\n");
continue;
}
LD_info = find_LD_info_from_line_id(ied,trigger[i].line_id); //<2F><><EFBFBD>ļ<EFBFBD><C4BC>еļ<D0B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>õļ<C3B5><C4BC><EFBFBD><EFBFBD><EFBFBD>
if (!LD_info){
printf("can't find line by line_idx\n");
continue;
}
real_report_count = get_real_report_count(LD_info); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LD_info->rptinfo[rpt_no]->count
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
printf("terminal:%s - mp:%s real_report_count %d\n", ((ied_usr_t*)(ied->usr_ext))->terminal_id, LD_info->mp_id, real_report_count);
trigger[i].count = real_report_count; //<2F><>¼<EFBFBD><C2BC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (trigger[i].real_data && trigger[i].limit && (real_report_count>trigger[i].limit) ) {//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>
trigger[i].real_data = 0;
trigger[i].limit = 0;
trigger[i].count = 0;
need_write_file = TRUE;
}
LD_info->real_data = trigger[i].real_data; //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><E6B4A5><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
LD_info->soe_data = trigger[i].soe_data;
LD_info->limit = trigger[i].limit;
LD_info->count = trigger[i].count;
if (LD_info->limit > 0) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>¼
need_write_file = TRUE;
if ( trigger[i].real_data==0 && trigger[i].soe_data==0 )//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
need_write_file = TRUE;
}
if (need_write_file)
create_3s_xml(trigger_3s_xml); //д<><D0B4><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>work<72><6B>
}
void del_process_recall_config(recall_xml_t* recall_xml)
{
int i,j;
recall_t *recall;
recall_t *recall_work;
int recall_num;
ied_t *ied;
LD_info_t *LD_info;
loginfo_t *loginfo = NULL;
int need_write_file;
need_write_file = FALSE;
recall = recall_xml->new_recalls;
recall_num = recall_xml->new_recall_num;
for (i=0; i<recall_num; i++){
recall_xml->work_recalls[recall_xml->work_recall_num++] = recall[i];
need_write_file = TRUE;
}
recall = recall_xml->work_recalls;
recall_num = recall_xml->work_recall_num;
for (i=0; i<recall_num; i++){
LD_info = find_LD_info_only_from_line_id(recall[i].line_id);
if (!LD_info)
continue;
if (LD_info->logcount<=0)
continue;
loginfo = LD_info->loginfo[0] ;
loginfo->need_steady = recall[i].need_steady;
loginfo->need_voltage = recall[i].need_voltage;
loginfo->start_time = recall[i].start_time;
loginfo->end_time = recall[i].end_time;
}
}
void check_3s_config()
{
double now;
static double last_check_3s_config_time = 0.0;//<2F><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>
trigger_3s_xml_t trigger_3s_xml; //3s<33><73><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
if (!three_secs_enabled) //cfg_3s_data<74><61><EFBFBD>̲ŻῪ<C5BB><E1BFAA>
return;
now = sGetMsTime(); //<2F><>ǰʱ<C7B0><CAB1>
if ( fabs(now - last_check_3s_config_time) < 3*1000 ) //wait 3secs //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>ʱ<EFBFBD><EFBFBD><E9BFB4>ǰʱ<C7B0><CAB1><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>ִ<EFBFBD><D6B4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>3<EFBFBD>벻ִ<EBB2BB>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>
return;
printf("begin 3s config...\n");
last_check_3s_config_time = now; //<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
while (APR_SUCCESS==parse_3s_xml(&trigger_3s_xml)){ //<2F><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>ļ<EFBFBD>
//<2F><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>lnk20250114
2025-02-24 16:45:42 +08:00
//pthread_mutex_lock(&mtx); printf("3s hold lock !!!!!!!!!!!");
2025-01-16 16:17:01 +08:00
process_3s_config(&trigger_3s_xml); //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-04-29 15:05:36 +08:00
//pthread_mutex_unlock(&mtx); printf("3s free lock !!!!!!!!!!!");
2025-01-16 16:17:01 +08:00
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//lnk20250114<31><34><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>Ϣ
2025-03-13 16:35:19 +08:00
int isValidModelId(const char* model_id) {
size_t i;
if (model_id == NULL) return 0; // NULL <20><>Ч
size_t len = strlen(model_id);
if (len < 4) return 0; // <20><><EFBFBD><EFBFBD> < 4 <20><>Ч
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ȫ<EFBFBD>ǿո<C7BF>
for (i = 0; i < len; i++) {
if (!isspace((unsigned char)model_id[i])) {
return 1; // ֻҪ<D6BB><D2AA><EFBFBD><EFBFBD><EFBFBD>ǿո<C7BF><D5B8>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǺϷ<C7BA><CFB7><EFBFBD>
}
}
return 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><D5B8><EFBFBD><EFBFBD><EFBFBD>Ч
}
2025-01-16 16:17:01 +08:00
void process_ledger_update(trigger_update_xml_t *ledger_update_xml)
{
int i,j;
terminal *update;
terminal *update_work;
int update_num;
ied_t *ied;
LD_info_t *LD_info;
int new_in_work_found;
ied_usr_t* ied_usr;
2025-01-17 17:10:18 +08:00
int chnl_no;
chnl_usr_t *chnl_usr = NULL;
2025-01-16 16:17:01 +08:00
printf("!!!start update ledger!!!\n");
update = ledger_update_xml->new_updates; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
update_num = ledger_update_xml->new_update_num;
printf("add ledger num:%d\n",update_num);
for (i=0; i<update_num; i++){ //<2F><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>
new_in_work_found = FALSE;
2025-01-16 19:16:26 +08:00
if(update[i].terminal_id != NULL){
2025-01-23 16:32:26 +08:00
printf("add ledger of %s\n",update[i].terminal_id);
2025-01-16 19:16:26 +08:00
ied = find_ied_from_terminal_id(update[i].terminal_id); //ͨ<><CDA8><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD><D0B5>ն˺<D5B6><CBBA>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>
if (ied){
printf("find ied by terminal_id, terminal already exsist\n");
new_in_work_found = TRUE; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD>е<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ǰ<EFBFBD>ն˴<D5B6> new_updates <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD> modify_updates <20><><EFBFBD><EFBFBD>
if (ledger_update_xml->modify_update_num < MAX_UPDATEA_NUM) {
// <20><><EFBFBD>ӵ<EFBFBD> modify_updates <20><><EFBFBD><EFBFBD>
ledger_update_xml->modify_updates[ledger_update_xml->modify_update_num] = update[i];
ledger_update_xml->modify_update_num++; // <20><><EFBFBD><EFBFBD> modify <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>նˣ<D5B6><CBA3><EFBFBD> new_updates <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD>
for (j = i; j < ledger_update_xml->new_update_num - 1; j++) {
ledger_update_xml->new_updates[j] = ledger_update_xml->new_updates[j + 1]; // <20><>ǰ<EFBFBD>ƶ<EFBFBD>Ԫ<EFBFBD><D4AA>
}
ledger_update_xml->new_update_num--; // <20><><EFBFBD><EFBFBD> new_update_num<75><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ԫ<EFBFBD><D4AA>
continue;
} else {
fprintf(stderr, "Exceeded MAX_UPDATEA_NUM limit for modify_updates!\n");
}
}
}
2025-01-16 16:17:01 +08:00
2025-01-21 17:48:37 +08:00
if (!new_in_work_found) { //<2F><><EFBFBD><EFBFBD>ȫ<EFBFBD>µ<EFBFBD>̨<EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-01-16 16:17:01 +08:00
2025-01-21 17:48:37 +08:00
int terminal_index;
int ied_take = 0; //<2F><>ǰ̨<C7B0><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>ied<65>ռ䣿0û<30>У<EFBFBD>1<EFBFBD><31>
2025-01-16 16:17:01 +08:00
//<2F><><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>Ӻͳ<D3BA>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//1-<2D><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5>ڴ<EFBFBD><DAB4>ռ<EFBFBD>//////////////////////////////
//<2F>µ<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (n_clients) <20><>ԭ<EFBFBD>е<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D4AD><EFBFBD><EFBFBD>Ϊ g_node->n_clients)
int new_client_count = g_node->n_clients + 1; // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>µ<EFBFBD>̨<EFBFBD><CCA8>
2025-01-21 17:48:37 +08:00
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><CCBA>Ƿ񳬹<C7B7>ԭ<EFBFBD>е<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˾ʹӲ<CDB4>ʹ<EFBFBD>ܵ<EFBFBD>ied<65>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD>ҿ<EFBFBD><D2BF>ÿռ<D5BC><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ܺ<EFBFBD><DCBA>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD>ն<EFBFBD>
2025-01-22 17:00:34 +08:00
if(new_client_count > IED_COUNT){ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-01-21 17:48:37 +08:00
ied_t *ied_unused = NULL;
ied_usr_t* ied_usr_unused = NULL;
2025-01-22 17:00:34 +08:00
ied_unused = find_ied_unused();//<2F><><EFBFBD><EFBFBD>g_node<64>ҵ<EFBFBD><D2B5><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>ied<65><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ied֮ǰ<D6AE><C7B0>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣬ֱ<E4A3AC><D6B1>ռ<EFBFBD><D5BC>
2025-01-21 17:48:37 +08:00
if(ied_unused != NULL){
ied_usr_unused = (ied_usr_t*)ied_unused->usr_ext;
ied = ied_unused; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>iedָ<64><D6B8><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>δʹ<CEB4>õ<EFBFBD>ied<65>ռ<EFBFBD>
2025-02-07 16:46:53 +08:00
terminal_index = ied_usr_unused->dev_idx; //<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ied<65>ı<EFBFBD><C4B1>ţ<EFBFBD><C5A3><EFBFBD>g_node<64><65><EFBFBD>±<EFBFBD>
2025-01-16 16:17:01 +08:00
2025-01-21 17:48:37 +08:00
//<2F><>ӡ<EFBFBD><D3A1>ʾ
2025-01-22 17:00:34 +08:00
printf("!!!!!!!!ied index:%d ,origin terminal_id:%s has been taken!!!!!!!!!!\n",ied_usr_unused->dev_idx,ied_usr_unused->terminal_id);
2025-01-16 16:17:01 +08:00
2025-01-21 17:48:37 +08:00
//<2F>ն˳<D5B6>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>
ied_usr = (ied_usr_t*)ied->usr_ext;
ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;
2025-01-16 16:17:01 +08:00
2025-01-21 17:48:37 +08:00
ied_usr->dev_flag = ENABLE;//<2F>ն<EFBFBD><D5B6><EFBFBD>Ч
ied->chncount = 1; //ͨ<>Ŷ˿<C5B6><CBBF><EFBFBD>
2025-01-22 17:00:34 +08:00
//<2F><><EFBFBD>ٷ<EFBFBD><D9B7><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ռ<EFBFBD>
2025-01-21 17:48:37 +08:00
ied->channel[0].ied = ied; //ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ied->channel[0].status = STATUS_BREAKOFF;//<2F><>ʼ<EFBFBD><CABC>Ϊͨ<CEAA><CDA8><EFBFBD>ж<EFBFBD>
ied->cpucount = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼΪ0<CEAA><30><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>ʱд<CAB1><D0B4>
ied_take = 1;//ied֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD>
}
2025-01-22 17:00:34 +08:00
else{ //<2F><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ȫ<EFBFBD><C8AB>̨<EFBFBD><CCA8><EFBFBD>ж<EFBFBD>û<EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>ied<65><64>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̿ɹҵ<C9B9>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>
2025-01-21 17:48:37 +08:00
printf("!!!!!!!!!!ledger array is full!!!!!!\n");
return;
}
2025-01-22 17:00:34 +08:00
}//<2F><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><E8B6A8>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else{
2025-02-11 18:23:19 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
printf("!!!!!!!!!!gnodeindex:%d!!!!!!\n",new_client_count - 1);
2025-01-21 17:48:37 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD>¼
g_node->clients[new_client_count - 1] = (ied_t*)apr_pcalloc(g_cfg_pool, sizeof(ied_t));
2025-01-16 16:17:01 +08:00
2025-01-21 17:48:37 +08:00
// <20><><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_node->n_clients = new_client_count; // <20><><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//1-<2D><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5>ڴ<EFBFBD><DAB4>ռ<EFBFBD>//////////////////////////////
//2-<2D><><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>̨<EFBFBD><CCA8>///////////////////////////////////
ied = g_node->clients[new_client_count - 1];//<2F>ն<EFBFBD>̨<EFBFBD><CCA8>ָ<EFBFBD><EFBFBD><EBB6A8><EFBFBD><EFBFBD>ied<65><64><EFBFBD>鵱ǰλ<C7B0>õĺ<C3B5>һλ
2025-02-10 17:03:15 +08:00
terminal_index = new_client_count;//<2F>µ<EFBFBD>̨<EFBFBD><CCA8><EFBFBD>ն<EFBFBD>
2025-01-21 17:48:37 +08:00
ied_usr = (ied_usr_t*)apr_pcalloc(g_init_pool, sizeof(ied_usr_t));
ied->usr_ext = ied_usr;//<2F>ڴ<EFBFBD><DAB4>ҵ<EFBFBD>ied<65><64>
if (ied_usr == NULL)
return APR_ENOMEM;
ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;//<2F><>FeProject/<2F>ӹ<EFBFBD><D3B9><EFBFBD>Ŀ¼/etc/pt61850netd_pqfe.xml<6D>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ܲ<EFBFBD>ѯʱ<D1AF><CAB1>
ied_usr->LD_info = (LD_info_t*)apr_pcalloc(g_init_pool, MAX_CPUNO * sizeof(LD_info_t));//<2F>ڴ<EFBFBD><DAB4>ҵ<EFBFBD>ied<65><64>
if (ied_usr->LD_info == NULL)
return APR_ENOMEM;
ied_usr->dev_flag = ENABLE;//<2F>ն<EFBFBD><D5B6><EFBFBD>Ч
2025-01-23 16:32:26 +08:00
ied->chncount = 1; //ͨ<>Ŷ˿<C5B6><CBBF><EFBFBD>,һ<><D2BB><EFBFBD>ն<EFBFBD>һ<EFBFBD><D2BB>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB>
2025-01-21 17:48:37 +08:00
ied->channel = (channel_t*)apr_pcalloc(g_cfg_pool, sizeof(channel_t) * ied->chncount);//<2F>ڴ<EFBFBD><DAB4>ҵ<EFBFBD>ied<65><64>
ied->channel[0].ied = ied; //ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ied->channel[0].status = STATUS_BREAKOFF;//<2F><>ʼ<EFBFBD><CABC>Ϊͨ<CEAA><CDA8><EFBFBD>ж<EFBFBD>
ied->cpucount = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼΪ0<CEAA><30><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>ʱд<CAB1><D0B4>
//2-<2D><><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>̨<EFBFBD><CCA8>///////////////////////////////////
}
2025-01-16 16:17:01 +08:00
//3-д<><D0B4>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////////
2025-01-21 17:48:37 +08:00
int ret = update_one_terminal_ledger(update,i,ied,terminal_index,ied_take);
2025-01-17 17:10:18 +08:00
if(ret){
printf("ledger can not be update!!!!!quit process!!!!!\n");
return 0;
}
2025-01-16 16:17:01 +08:00
//3-д<><D0B4>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>///////////////////////////////////
//4-<2D><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD>//////////////////////////////
2025-03-13 16:35:19 +08:00
char model[64];
2025-01-17 17:10:18 +08:00
// <20><>ȡģ<C8A1><C4A3>ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ񷵻<C7B7> NULL
char* model_id = parse_model_cfg_web_one(ied);//<2F><EFBFBD><E6B4A2>/FeProject/dat/
2025-03-13 16:35:19 +08:00
if (isValidModelId(model_id)) { //lnk20250313<31><33>ֹ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD>
2025-01-17 17:10:18 +08:00
// <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD> model <20><><EFBFBD><EFBFBD>
strncpy(model, model_id, sizeof(model) - 1);
model[sizeof(model) - 1] = '\0'; // ȷ<><C8B7><EFBFBD><EFBFBD> null <20><>β
printf("ledger Model ID: %s\n", model);
} else {
2025-03-13 16:35:19 +08:00
printf("ledger No model ID found.quit\n");
return ;
2025-01-17 17:10:18 +08:00
}
char full_path[128];
snprintf(full_path, sizeof(full_path), "/FeProject/dat/%s.xml", model); // ƴ<><C6B4>·<EFBFBD><C2B7>
// <20><>ӡģ<D3A1><C4A3>·<EFBFBD><C2B7>
printf("ledger icd config file full path: %s\n", full_path);
//ӳ<><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
Set_xml_nodeinfo_one(ied_usr->dev_type);
2025-01-16 16:17:01 +08:00
//4-<2D><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD>///////////////////////////////////
//5-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>//////////////////////////////
2025-01-22 17:00:34 +08:00
parse_rpt_log_ini_one(ied);
2025-01-16 16:17:01 +08:00
//5-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>///////////////////////////////////
2025-02-11 18:23:19 +08:00
//<2F><><EFBFBD><EFBFBD>
printf("ledger id: %s\n", ((ied_usr_t*)ied->channel[0].ied->usr_ext)->terminal_id);
2025-01-16 16:17:01 +08:00
//6-init_rem_dib_table//////////////////////////////
2025-02-07 16:46:53 +08:00
init_rem_dib_table_one(ied);
2025-01-16 16:17:01 +08:00
//6-init_rem_dib_table///////////////////////////////////
}
}
2025-01-17 17:10:18 +08:00
//////////////////////////////////////////////////////////////////////////////modify
2025-01-22 17:00:34 +08:00
update = ledger_update_xml->modify_updates; //<2F><><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>̨<EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
2025-01-21 17:48:37 +08:00
update_num = ledger_update_xml->modify_update_num;
2025-01-17 17:10:18 +08:00
printf("modify ledger num:%d\n",update_num);
for (i=0; i<update_num; i++){ //<2F><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>
new_in_work_found = FALSE;
if(update[i].terminal_id != NULL){
2025-01-23 16:32:26 +08:00
printf("modify ledger of %s\n",update[i].terminal_id);
2025-01-17 17:10:18 +08:00
ied = find_ied_from_terminal_id(update[i].terminal_id); //ͨ<><CDA8><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD><D0B5>ն˺<D5B6><CBBA>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>
if (ied){
printf("find ied by terminal_id, terminal already exsist\n");
new_in_work_found = TRUE; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD>е<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն˵<D5B6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////////////////////////////////////////////////
for(chnl_no=0 ; chnl_no<ied->chncount; chnl_no++) {
chnl_usr = (chnl_usr_t*)ied->channel[chnl_no].connect;
2025-02-07 16:46:53 +08:00
if (chnl_usr->m_state!=CHANNEL_CONNECTED){//<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>ӵ<EFBFBD>ͨ<EFBFBD><CDA8>
2025-01-17 17:10:18 +08:00
continue;
}
closeChannel(chnl_usr);//<2F>رո<D8B1><D5B8><EFBFBD>̨<EFBFBD>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/////////////////////////////////////////////////////////////////////////////////
//3-д<><D0B4>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////////
ied_usr = ied->usr_ext;
2025-02-07 16:46:53 +08:00
//д<><D0B4>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
clearIedUsr(ied_usr);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dev_idx
//ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;//<2F><>FeProject/<2F>ӹ<EFBFBD><D3B9><EFBFBD>Ŀ¼/etc/pt61850netd_pqfe.xml<6D>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ܲ<EFBFBD>ѯʱ<D1AF><CAB1>
ied_usr->dev_flag = ENABLE;//<2F>ն<EFBFBD><D5B6><EFBFBD>Ч
2025-02-07 16:46:53 +08:00
int ret = update_one_terminal_ledger(update,i,ied,ied_usr->dev_idx,1);//1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ied
2025-01-17 17:10:18 +08:00
if(ret){
printf("ledger can not be update!!!!!quit process!!!!!\n");
return 0;
}
//3-д<><D0B4>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>////////////////////////////////////////////
//4-<2D><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD>///////////////////////////////////////////
char model[64] = {0};
// <20><>ȡģ<C8A1><C4A3>ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ񷵻<C7B7> NULL
char* model_id = parse_model_cfg_web_one(ied);//<2F><EFBFBD><E6B4A2>/FeProject/dat/
if (model_id != NULL) {
// <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD> model <20><><EFBFBD><EFBFBD>
strncpy(model, model_id, sizeof(model) - 1);
model[sizeof(model) - 1] = '\0'; // ȷ<><C8B7><EFBFBD><EFBFBD> null <20><>β
printf("ledger Model ID: %s\n", model);
} else {
printf("ledger No model ID found.\n");
}
char full_path[128];
snprintf(full_path, sizeof(full_path), "/FeProject/dat/%s.xml", model); // ƴ<><C6B4>·<EFBFBD><C2B7>
// <20><>ӡģ<D3A1><C4A3>·<EFBFBD><C2B7>
printf("ledger icd config file full path: %s\n", full_path);
//ӳ<><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
Set_xml_nodeinfo_one(ied_usr->dev_type);
//4-<2D><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD>///////////////////////////////////
//5-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>//////////////////////////////
2025-02-07 16:46:53 +08:00
parse_rpt_log_ini_one(ied);
2025-01-17 17:10:18 +08:00
//5-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>///////////////////////////////////
//6-init_rem_dib_table//////////////////////////////
2025-02-07 16:46:53 +08:00
init_rem_dib_table_one(ied);
2025-01-17 17:10:18 +08:00
//6-init_rem_dib_table///////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////////////////////////////////////////////////
2025-01-16 16:17:01 +08:00
}
2025-01-17 17:10:18 +08:00
}
if (!new_in_work_found){
printf("modify_updates can not find ied!!!!!!\n");
}
}
///////////////////////////////////////////////////////////////////////////////delete
2025-01-23 16:32:26 +08:00
update = ledger_update_xml->delete_updates; //<2F><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>̨<EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
2025-02-07 16:46:53 +08:00
update_num = ledger_update_xml->delete_update_num; //ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-01-17 17:10:18 +08:00
printf("delete ledger num:%d\n",update_num);
2025-01-23 16:32:26 +08:00
for (i=0; i<update_num; i++){ //<2F><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫɾ<D2AA><C9BE><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>
new_in_work_found = FALSE; //<2F>ҵ<EFBFBD><D2B5>ִ<EFBFBD>̨<EFBFBD>˵ı<CBB5>־
if(update[i].terminal_id != NULL){ //<2F><><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>̨<EFBFBD><CCA8>
printf("delete ledger of %s\n",update[i].terminal_id);
2025-02-07 16:46:53 +08:00
ied = find_ied_from_terminal_id(update[i].terminal_id); //ͨ<><CDA8><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD><D0B5>ն˺<D5B6><CBBA>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><E8B1B8>û<EFBFBD>ҵ<EFBFBD><D2B5>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD>
2025-01-17 17:10:18 +08:00
if (ied){
printf("find ied by terminal_id, terminal already exsist\n");
new_in_work_found = TRUE; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD>е<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն˵<D5B6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////////////////////////////////////////////////
for(chnl_no=0 ; chnl_no<ied->chncount; chnl_no++) {
chnl_usr = (chnl_usr_t*)ied->channel[chnl_no].connect;
2025-01-23 16:32:26 +08:00
if (chnl_usr->m_state!=CHANNEL_CONNECTED){ //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ӵ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>һ<EFBFBD><D2BB><EFBFBD>ն<EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB>
2025-01-17 17:10:18 +08:00
continue;
}
2025-02-07 16:46:53 +08:00
closeChannel(chnl_usr);//<2F>رո<D8B1><D5B8><EFBFBD>̨<EFBFBD>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>򲻻<EFBFBD><F2B2BBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ied<65>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><E1B1BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻᱻע<E1B1BB><D7A2>
2025-01-17 17:10:18 +08:00
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////////////////////////////////////////////////
//3-ɾ<><C9BE>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////////
2025-02-07 16:46:53 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-01-17 17:10:18 +08:00
// <20><><EFBFBD><EFBFBD>Ҫɾ<D2AA><C9BE> g_node->clients <20>е<EFBFBD>ij<EFBFBD><C4B3> ied<65><64>index Ϊɾ<CEAA><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int index_to_remove = 0;
ied_t* ied_find = NULL;
int iedno;
2025-01-21 17:48:37 +08:00
ied_usr_t* ied_usr_find = NULL; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ied
ied_usr = (ied_usr_t*)ied->usr_ext;//Ҫɾ<D2AA><C9BE><EFBFBD><EFBFBD>ied
2025-01-17 17:10:18 +08:00
for (iedno = 0; iedno < g_node->n_clients; iedno++) {
ied_find = g_node->clients[iedno];
ied_usr_find = (ied_usr_t*)ied_find->usr_ext;
if (ied_usr_find && strcmp(ied_usr_find->terminal_id, ied_usr->terminal_id) == 0) {
2025-01-21 17:48:37 +08:00
index_to_remove = iedno;//<2F>ҵ<EFBFBD>Ҫɾ<D2AA><C9BE><EFBFBD><EFBFBD>ied<65><64>g_node<64>е<EFBFBD>λ<EFBFBD><CEBB>
2025-01-17 17:10:18 +08:00
break; //<2F>ҵ<EFBFBD><D2B5>˳<EFBFBD>
}
}
2025-01-21 17:48:37 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫɾ<D2AA><C9BE><EFBFBD><EFBFBD> ied <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ied_t* ied_to_remove = g_node->clients[index_to_remove];//ָ<><D6B8>g_node<64><65>Ӧ<EFBFBD><D3A6><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2025-01-17 17:10:18 +08:00
2025-01-21 17:48:37 +08:00
if(ied_to_remove == ied){//ͨ<><CDA8><EFBFBD>ն<EFBFBD>id<69>ҵ<EFBFBD><D2B5><EFBFBD>iedӦ<64><D3A6>Ҳָ<D2B2><D6B8>g_node<64><65>Ӧ<EFBFBD><D3A6><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
printf("this ied is ied_to_remove\n");
}
2025-02-07 16:46:53 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-01-17 17:10:18 +08:00
2025-01-23 16:32:26 +08:00
//<2F><><EFBFBD><EFBFBD>ied<65><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-02-07 16:46:53 +08:00
clearIed(ied_to_remove);
2025-01-17 17:10:18 +08:00
//3-ɾ<><C9BE>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>///////////////////////////////////
//4-<2D><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD>//////////////////////////////
2025-01-23 16:32:26 +08:00
//ӳ<><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ied<65><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD>
2025-01-17 17:10:18 +08:00
//4-<2D><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD>///////////////////////////////////
//5-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////////
2025-02-07 16:46:53 +08:00
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ied<65>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ա<EFBFBD><D5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ鱣<C6BF><E9B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õģ<C3B5><C4A3><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>͵<EFBFBD>ied<65><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ied<65><64>Ӧ<EFBFBD>Ŀ<EFBFBD><C4BF>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-01-17 17:10:18 +08:00
//5-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>///////////////////////////////////
//6-init_rem_dib_table//////////////////////////////
2025-02-07 16:46:53 +08:00
//rem_dib_table<6C><65><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><E1B1BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>̨<EFBFBD><CCA8>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>
2025-01-17 17:10:18 +08:00
//6-init_rem_dib_table///////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////////////////////////////////////////////////
2025-01-16 16:17:01 +08:00
}
2025-01-17 17:10:18 +08:00
}
2025-01-16 16:17:01 +08:00
2025-01-17 17:10:18 +08:00
if (!new_in_work_found) {
printf("modify_updates can not find ied!!!!!!\n");
}
}
//////////////////////////////////////////////////////////////////////////////
if (ledger_update_xml->modify_update_num || ledger_update_xml->new_update_num || ledger_update_xml->delete_update_num){
create_ledger_log(ledger_update_xml); //д<><D0B4><EFBFBD>ļ<EFBFBD>
}
2025-01-16 16:17:01 +08:00
2025-01-17 17:10:18 +08:00
}
2025-01-16 16:17:01 +08:00
//̨<>˸<EFBFBD><CBB8>µ<EFBFBD><C2B5>Դ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
// <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
int is_empty(const char* str) {
return (str == NULL || str[0] == '\0');
}
// <20><>ӡ monitor <20><EFBFBD><E1B9B9><EFBFBD><EFBFBD>Ϣ
void print_monitor(const monitor* mon) {
printf("Monitor ID: %s\n", is_empty(mon->monitor_id) ? "N/A" : mon->monitor_id);
printf("Terminal Code: %s\n", is_empty(mon->terminal_code) ? "N/A" : mon->terminal_code);
printf("Monitor Name: %s\n", is_empty(mon->monitor_name) ? "N/A" : mon->monitor_name);
printf("Logical Device Sequence: %s\n", is_empty(mon->logical_device_seq) ? "N/A" : mon->logical_device_seq);
printf("Voltage Level: %s\n", is_empty(mon->voltage_level) ? "N/A" : mon->voltage_level);
printf("Terminal Connect: %s\n", is_empty(mon->terminal_connect) ? "N/A" : mon->terminal_connect);
printf("Timestamp: %s\n", is_empty(mon->timestamp) ? "N/A" : mon->timestamp);
printf("Status: %s\n", is_empty(mon->status) ? "N/A" : mon->status);
}
// <20><>ӡ terminal <20><EFBFBD><E1B9B9><EFBFBD><EFBFBD>Ϣ
void print_terminal(const terminal* tmnl) {
printf("Terminal ID: %s\n", is_empty(tmnl->terminal_id) ? "N/A" : tmnl->terminal_id);
printf("Terminal Code: %s\n", is_empty(tmnl->terminal_code) ? "N/A" : tmnl->terminal_code);
printf("Organization Name: %s\n", is_empty(tmnl->org_name) ? "N/A" : tmnl->org_name);
printf("Maintenance Name: %s\n", is_empty(tmnl->maint_name) ? "N/A" : tmnl->maint_name);
printf("Station Name: %s\n", is_empty(tmnl->station_name) ? "N/A" : tmnl->station_name);
printf("Factory Name: %s\n", is_empty(tmnl->tmnl_factory) ? "N/A" : tmnl->tmnl_factory);
printf("Terminal Status: %s\n", is_empty(tmnl->tmnl_status) ? "N/A" : tmnl->tmnl_status);
printf("Device Type: %s\n", is_empty(tmnl->dev_type) ? "N/A" : tmnl->dev_type);
printf("Device Key: %s\n", is_empty(tmnl->dev_key) ? "N/A" : tmnl->dev_key);
printf("Device Series: %s\n", is_empty(tmnl->dev_series) ? "N/A" : tmnl->dev_series);
printf("Address: %s\n", is_empty(tmnl->addr_str) ? "N/A" : tmnl->addr_str);
printf("Port: %s\n", is_empty(tmnl->port) ? "N/A" : tmnl->port);
printf("Timestamp: %s\n", is_empty(tmnl->timestamp) ? "N/A" : tmnl->timestamp);
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD>ӡ N/A
int i;
for (i = 0; i < 10 && !is_empty(tmnl->line[i].monitor_id); ++i) {
printf(" Monitor %d:\n", i + 1);
print_monitor(&tmnl->line[i]);
}
}
// <20><>ӡ trigger_update_xml_t <20><EFBFBD><E1B9B9><EFBFBD><EFBFBD>Ϣ
void print_trigger_update_xml(const trigger_update_xml_t* trigger_update) {
printf("Work Updates Count: %d\n", trigger_update->work_update_num);
printf("New Updates Count: %d\n", trigger_update->new_update_num);
printf("Delete Updates Count: %d\n", trigger_update->delete_update_num);
printf("Modify Updates Count: %d\n", trigger_update->modify_update_num);
printf("\nWork Updates:\n");
int i;
for (i = 0; i < trigger_update->work_update_num; ++i) {
printf("Work Update %d:\n", i + 1);
print_terminal(&trigger_update->work_updates[i]);
}
printf("\nNew Updates:\n");
for (i = 0; i < trigger_update->new_update_num; ++i) {
printf("New Update %d:\n", i + 1);
print_terminal(&trigger_update->new_updates[i]);
}
printf("\nDelete Updates:\n");
for (i = 0; i < trigger_update->delete_update_num; ++i) {
printf("Delete Update %d:\n", i + 1);
print_terminal(&trigger_update->delete_updates[i]);
}
printf("\nModify Updates:\n");
for (i = 0; i < trigger_update->modify_update_num; ++i) {
printf("Modify Update %d:\n", i + 1);
print_terminal(&trigger_update->modify_updates[i]);
}
}
void check_ledger_update()//lnk20250113
{
double now;
static double last_check_3s_config_time = 0.0;//<2F><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>
now = sGetMsTime(); //<2F><>ǰʱ<C7B0><CAB1>
if ( fabs(now - last_check_3s_config_time) < 3*1000 ) //wait 3secs //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>ʱ<EFBFBD><EFBFBD><E9BFB4>ǰʱ<C7B0><CAB1><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>ִ<EFBFBD><D6B4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>3<EFBFBD>벻ִ<EBB2BB>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>
return;
2025-02-11 18:23:19 +08:00
// <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD> trigger_ledger_update_xml <20><EFBFBD><E1B9B9>
trigger_update_xml_t* trigger_ledger_update_xml = (trigger_update_xml_t*)malloc(sizeof(trigger_update_xml_t));
if (trigger_ledger_update_xml == NULL) {
printf("Memory allocation failed!\n");
return; // <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>
}
//ÿ<>ζ<EFBFBD><CEB6><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ֹ<EFBFBD>ظ<EFBFBD>
memset(trigger_ledger_update_xml, 0, sizeof(trigger_update_xml_t));
2025-01-16 16:17:01 +08:00
2025-02-11 18:23:19 +08:00
2025-02-27 16:28:04 +08:00
//printf("check ledger update...trigger_ledger_update_xml:%d\n",trigger_ledger_update_xml->modify_update_num);//<2F><><EFBFBD>ٲ<EFBFBD><D9B2><EFBFBD>Ҫ<EFBFBD>Ĵ<EFBFBD>ӡ
2025-01-16 19:16:26 +08:00
last_check_3s_config_time = now; //<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
2025-01-16 16:17:01 +08:00
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>նˣ<D5B6><CBA3><EFBFBD>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>ļ<EFBFBD>
2025-02-11 18:23:19 +08:00
if (APR_SUCCESS==parse_ledger_update_xml(trigger_ledger_update_xml)){ //<2F><><EFBFBD><EFBFBD>̨<EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD>ļ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF>Ը<EFBFBD><D4B8>»<EFBFBD><C2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>˵<EFBFBD>
2025-01-17 17:10:18 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-02-11 18:23:19 +08:00
print_trigger_update_xml(trigger_ledger_update_xml);
2025-01-17 17:10:18 +08:00
2025-01-16 16:17:01 +08:00
//<2F><><EFBFBD><EFBFBD>̨<EFBFBD>˸<EFBFBD><CBB8>¼<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>lnk20250114
2025-02-24 16:45:42 +08:00
//pthread_mutex_lock(&mtx); printf("ledgerupdate hold lock !!!!!!!!!!!");
2025-02-11 18:23:19 +08:00
process_ledger_update(trigger_ledger_update_xml); //̨<>˸<EFBFBD><CBB8><EFBFBD>
2025-02-24 16:45:42 +08:00
//pthread_mutex_unlock(&mtx); printf("ledgerupdate free lock !!!!!!!!!!!");
2025-01-17 17:10:18 +08:00
2025-01-16 16:17:01 +08:00
}
2025-02-11 18:23:19 +08:00
// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷŶ<CDB7>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
free(trigger_ledger_update_xml);
2025-01-16 16:17:01 +08:00
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifdef _OS_UNIX_
uint32_t get_freedisk_MB(uint32_t* totalSizeMB)
{
struct statfs diskInfo;
unsigned long long totalBlocks = 0;
unsigned long long totalSize = 0;
size_t mbTotalsize = 0;
size_t freeDisk=0;
size_t mbFreeDisk = 0;
statfs("/home/pq", &diskInfo);
totalBlocks = diskInfo.f_bsize;
totalSize = totalBlocks * diskInfo.f_blocks;
mbTotalsize = totalSize >> 20;
freeDisk = diskInfo.f_bfree*totalBlocks;
mbFreeDisk = freeDisk >> 20;
printf("/home/pq total=%dMB, free=%dMB \n", mbTotalsize, mbFreeDisk);
if (totalSizeMB)
*totalSizeMB = mbTotalsize;
return mbFreeDisk;
}
#else
uint32_t get_freedisk_MB(uint32_t* totalSizeMB) {
if (totalSizeMB)
*totalSizeMB = 1000;
return 5;
}
#endif
void check_disk_quota()
{
double now;
static double last_check_time = -10000000.0;
uint32_t freeSizeMB,totalSizeMB;
if(g_node_id != STAT_DATA_BASE_NODE_ID)
return;
now = sGetMsTime();
if ( fabs(now - last_check_time) < 15*1000 ) //wait 15 secs
return;
last_check_time = now;
freeSizeMB = get_freedisk_MB(&totalSizeMB);
//printf("Current user disk free size: %dMB ,total size: %dMB \n",freeSizeMB,totalSizeMB);
if (freeSizeMB<g_min_free_size)
echo_warn2("Current user disk free size: %dMB < %dMB, please check!\n",freeSizeMB,g_min_free_size);
if ((freeSizeMB/(totalSizeMB/100+1) )<10)
echo_warn2("Current user disk free size percent < 10%%, free size: %dMB ,total size: %dMB ,please check!\n",
freeSizeMB,totalSizeMB);
}
void create_recall_xml()
{
//<2F><><EFBFBD>ɴ<EFBFBD><C9B4><EFBFBD><EFBFBD><EFBFBD>xml<6D>ļ<EFBFBD>
if (g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID)) {
DeletcRecallXml();
CreateRecallXml();
}
}
void Delete_recall_Xml(char* id) {
if (g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID)) {
delete_recall_xml(id);
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
}
}
void Check_Recall_Config(char *id) //<2F><><EFBFBD><EFBFBD><E9B2B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>Recall.xml
{
if (g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID)) {
recall_xml_t recall_xml;
memset((char*)&recall_xml, 0, sizeof(recall_xml_t));
parse_recall_xml(&recall_xml,id); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
process_recall_config(&recall_xml); //<2F><><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ֵ<EFBFBD><D6B5>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>
}
}
void CheckAllConnectedChannel()
{
chnl_usr_t *chnl_usr;
static uint32_t chnl_sequence_no = 0;
2025-04-29 15:05:36 +08:00
//һ<>η<EFBFBD><CEB7><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ն<EFBFBD>
2025-01-16 16:17:01 +08:00
do {
chnl_usr = g_pt61850app->chnl_usr[chnl_sequence_no];
chnl_sequence_no = (chnl_sequence_no+1) % g_pt61850app->chnl_counts;
} while ( (g_onlyIP[0]!=0) && (strcmp(g_onlyIP,chnl_usr->ip_str)!=0) );
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if(chnl_usr->m_state == CHANNEL_CONNECTED)
{
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
ChannelCheckIECReports(chnl_usr);//<2F><><EFBFBD><EFBFBD>
if ( (g_node_id == SOE_COMTRADE_BASE_NODE_ID) || (g_node_id == HIS_DATA_BASE_NODE_ID) || (g_node_id == NEW_HIS_DATA_BASE_NODE_ID) || (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID))
ChannelCheckWaveFiles(chnl_usr);//¼<><C2BC><EFBFBD>ļ<EFBFBD>
if(g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID))
ChannelCheckIECLogs(chnl_usr);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
2025-03-12 14:33:55 +08:00
if ( (sGetMsTime() - chnl_usr->m_LastPosRespTime) > 15*1000 ) //wait 15 secs<63><73><EFBFBD><EFBFBD>15<31><35><EFBFBD><EFBFBD>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>Ӧ<EFBFBD><D3A6><EFBFBD>ر<EFBFBD>
2025-01-16 16:17:01 +08:00
{
char** varnames ;
int varnum;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
ST_RET ret = mms_mvla_getnam(chnl_usr->net_info, VMD_SPEC, NULL,MMS_CLASS_DOM,g_pt61850app->mmsOpTimeout,
&varnames,&varnum,g_pt61850app->tmp_pool);
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
chnl_usr->m_LastPosRespTime = sGetMsTime();
if (ret == SD_SUCCESS) {
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
chnl_usr->m_NegRespTimes = 0;
}else {
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
printf("%d--------------\n", chnl_usr->m_NegRespTimes);
chnl_usr->m_NegRespTimes++;
}
}
if ( chnl_usr->m_NegRespTimes >=2 ) {
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
closeChannel(chnl_usr);//???<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ mms_release_connection
chnl_usr->m_NegRespTimes = 0;
chnl_usr->m_LastPosRespTime = sGetMsTime();
}
}
}
void CheckNextNotConnectedChannel()
{
static uint32_t chnl_total_no = 0;
chnl_usr_t *chnl_usr;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
do {
chnl_usr = g_pt61850app->chnl_usr[chnl_total_no];
chnl_total_no = (chnl_total_no+1) % g_pt61850app->chnl_counts;
2025-02-11 18:23:19 +08:00
} while ( (g_onlyIP[0]!=0) && (strcmp(g_onlyIP,chnl_usr->ip_str)!=0) );
2025-01-16 16:17:01 +08:00
//10-11-01 22:03 beijing
if( ( (chnl_total_no+1)==g_pt61850app->chnl_counts) || (g_onlyIP[0]!=0) ){
if(g_pt61850app->initNum<255)
g_pt61850app->initNum++;
}
2025-02-11 18:23:19 +08:00
2025-01-16 16:17:01 +08:00
if(chnl_usr->m_state == CHANNEL_CONNECTING)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
2025-04-29 15:05:36 +08:00
2025-02-11 18:23:19 +08:00
MVL_REQ_PEND* reqCtrl= chnl_usr->m_reqCtrl ;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if( reqCtrl->done == SD_TRUE)
{
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if(reqCtrl->result == SD_SUCCESS)
{
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
ALL_RCB_INFO *all_rcb_info;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
echo_warn4("\nCHANNEL_CONNECTED %s:%d ,NetInfo= %x chnl_usr= %x \n",
chnl_usr->ip_str,chnl_usr->chnl->port,chnl_usr->net_info,chnl_usr);
mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
chnl_usr->m_reqCtrl = NULL;
chnl_usr->m_state = CHANNEL_CONNECTED;
chnl_usr->net_info->user_ext = chnl_usr;
all_rcb_info = (ALL_RCB_INFO *)chk_calloc(1, sizeof (ALL_RCB_INFO));
all_rcb_info->rpt_typeids = &g_rpt_typeids;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if (chnl_usr->net_info->user_info != NULL) {
echo_warn("chnl_usr->net_info->user_info is not NULL\n");
}
chnl_usr->net_info->user_info = all_rcb_info;
chnl_usr->chnl->ied->status = STATUS_NORMAL;
chnl_usr->chnl->status = STATUS_NORMAL;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
{
char comm_str[256];
memset(comm_str,0,256);
apr_snprintf(comm_str,sizeof(comm_str),"%16s:%d\t\tconnected",chnl_usr->ip_str,chnl_usr->chnl->port);
add_comm_log(comm_str);
FRONT_MP_NUM++;
}
//lnk202411-1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳɹ<D3B3><C9B9>ļ<EFBFBD>¼
ied_usr_t* ied_usr = (ied_usr_t*)chnl_usr->chnl->ied->usr_ext;
2025-03-12 11:45:53 +08:00
apr_time_t t_now = apr_time_now();
printf("msTime:%ld",t_now);
connectlog_pgsql(ied_usr->terminal_id,convertMsToDateTimeString(t_now),1);//1<>ɹ<EFBFBD>
2025-02-11 18:23:19 +08:00
2025-01-16 16:17:01 +08:00
}
else
{// solaris 9 <20><> 224<32><34>
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
int secsSince = (int)(sGetMsTime() - chnl_usr->m_StartConnectingTime)/1000 ;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
ied_usr_t* ied_usr = (ied_usr_t*)chnl_usr->chnl->ied->usr_ext;
2025-04-29 15:05:36 +08:00
2025-03-05 17:47:47 +08:00
printf( "reqCtrl->result == FAIL, Since StartConnecting %i sec ,channel IP %s:%d \n",secsSince,chnl_usr->ip_str,chnl_usr->chnl->port);
2025-01-16 16:17:01 +08:00
mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
chnl_usr->m_reqCtrl = NULL;
chnl_usr->net_info->rem_vmd = NULL;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = sGetMsTime();
}
}
else
2025-04-29 15:05:36 +08:00
{
if ( (sGetMsTime() - chnl_usr->m_StartConnectingTime) > 300*1000 ) //300*1000 ) //wait 300 secs
2025-01-16 16:17:01 +08:00
{
ied_usr_t* ied_usr = (ied_usr_t*)chnl_usr->chnl->ied->usr_ext;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
echo_warn2( "reqCtrl->doneδ<65><CEB4><EFBFBD><EFBFBD>,but time over 300 secs, close channel IP %s,NetInfo= %x ",chnl_usr->ip_str,chnl_usr->net_info);
if (chnl_usr->net_info->req_pend_list) {
echo_warn("reqCtrl->doneδ<65><CEB4><EFBFBD><EFBFBD>,but time over 300 secs!!!!!!!!\n");
mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
chnl_usr->m_reqCtrl = NULL;
}
mms_release_connection(chnl_usr->net_info);
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
chnl_usr->net_info->rem_vmd = NULL;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = sGetMsTime();
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
}
}
2025-04-29 15:05:36 +08:00
}
2025-01-16 16:17:01 +08:00
else if(chnl_usr->m_state == CHANNEL_DISCONNECTED)
{
2025-02-11 18:23:19 +08:00
2025-01-16 16:17:01 +08:00
if ( (sGetMsTime() - chnl_usr->m_ClosedMsTime) > NEXT_CONNECT_TIME ) //wait 10 secs
{
2025-02-11 18:23:19 +08:00
2025-01-16 16:17:01 +08:00
ST_RET ret;
ST_CHAR serverARName[32];
ied_usr_t *ied_usr = (ied_usr_t*)chnl_usr->chnl->ied->usr_ext;
apr_snprintf(serverARName,sizeof(serverARName),"%s:%d",chnl_usr->ip_str,chnl_usr->chnl->port);
2025-01-21 17:48:37 +08:00
if (chnl_usr->chnl->ied->cpucount != NULL && chnl_usr->chnl->ied->cpucount > 0 && ied_usr->dev_flag == ENABLE) {//2023-09-26 czy <20><><EFBFBD><EFBFBD>line count<0 <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>//lnk20250121<32><31><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-01-16 16:17:01 +08:00
ret = mms_connectToServer(ied_usr->dev_key, ied_usr->dev_series, serverARName, &(chnl_usr->net_info), &(chnl_usr->m_reqCtrl));
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
if (ret == SD_SUCCESS)
{
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
echo_msg3("mms_connectToServer IP %s:%d ,NetInfo= %x \n", chnl_usr->ip_str, chnl_usr->chnl->port, chnl_usr->net_info);
chnl_usr->m_state = CHANNEL_CONNECTING;
chnl_usr->m_StartConnectingTime = sGetMsTime();
}
else
{
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
chnl_usr->m_ClosedMsTime = sGetMsTime();
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
echo_warn3("FAILED: mms_connectToServer IP %s:%d ,NetInfo= %x \n", chnl_usr->ip_str, chnl_usr->chnl->port, chnl_usr->net_info);
}
}
}
2025-04-29 15:05:36 +08:00
}
else if(chnl_usr->m_state == CHANNEL_DISCONNECTING) //need check timeout?<3F><EFBFBD><E1B2BB><EFBFBD><EFBFBD>Զͣ<D4B6><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-01-16 16:17:01 +08:00
{
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
MVL_REQ_PEND* reqCtrl= chnl_usr->m_reqCtrl ;
if( reqCtrl->done == SD_TRUE)
2025-02-11 18:23:19 +08:00
{
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
echo_warn3( "CHANNEL_DISCONNECTING done %s:%d,NetInfo= %x ",chnl_usr->ip_str,chnl_usr->chnl->port,chnl_usr->net_info);
mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
if(chnl_usr->net_info)
chnl_usr->net_info->user_ext = NULL;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
chnl_usr->m_reqCtrl = NULL;
chnl_usr->net_info = NULL;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
2025-03-12 11:45:53 +08:00
chnl_usr->m_ClosedMsTime = sGetMsTime();
//<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
ied_usr_t* ied_usr = (ied_usr_t*)chnl_usr->chnl->ied->usr_ext;
apr_time_t t_now = apr_time_now();
connectlog_pgsql(ied_usr->terminal_id,convertMsToDateTimeString(t_now),0);
2025-01-16 16:17:01 +08:00
}
else
2025-04-29 15:05:36 +08:00
{
2025-01-16 16:17:01 +08:00
echo_warn2( "CHANNEL_DISCONNECTING waiting ... %s,NetInfo= %x ",chnl_usr->ip_str,chnl_usr->net_info);
if ( (sGetMsTime() - chnl_usr->m_StartDisconnectingTime) > 30*1000 ) // //wait 30 secs ?????
2025-02-24 16:45:42 +08:00
{
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
echo_warn2( "CHANNEL_DISCONNECTING reqCtrl->doneδ<65><CEB4><EFBFBD><EFBFBD>,but time over 180 secs, close channel IP %s,NetInfo= %x ",chnl_usr->ip_str,chnl_usr->net_info);
mvl_free_req_ctrl(chnl_usr->m_reqCtrl);
chnl_usr->net_info->user_ext = NULL;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
mms_release_connection(chnl_usr->net_info);
chnl_usr->net_info->rem_vmd = NULL;
chnl_usr->m_reqCtrl = NULL;
chnl_usr->net_info = NULL;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = sGetMsTime();
2025-03-12 11:45:53 +08:00
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
ied_usr_t* ied_usr = (ied_usr_t*)chnl_usr->chnl->ied->usr_ext;
apr_time_t t_now = apr_time_now();
connectlog_pgsql(ied_usr->terminal_id,convertMsToDateTimeString(t_now),0);
2025-01-16 16:17:01 +08:00
}
}
2025-04-29 15:05:36 +08:00
}
2025-01-16 16:17:01 +08:00
}
//////////////////////*********<2A><><EFBFBD>ؿ<EFBFBD><D8BF>Ʋ<EFBFBD><C6B2><EFBFBD>**********////////////////////////////////////////////////
static ST_RET Read_Named_Var(LD_info_t *LD_info,chnl_usr_t *chnl_usr,char* VarName,ST_INT type_id, ST_VOID *dataDest, ST_INT timeOut)
{
ST_RET ret= SD_FAILURE;
ST_CHAR *domName = LD_info->LD_name;
int Need_Destroy_Typeid = FALSE;
assert(chnl_usr && LD_info);
if (type_id==-1) {
Need_Destroy_Typeid = TRUE;
type_id= mms_var_type_id_create (chnl_usr->net_info,DOM_SPEC, domName, VarName,timeOut);
if (type_id==-1) ret = SD_FAILURE; else ret = SD_SUCCESS;
if (ret == SD_FAILURE) return SD_FAILURE;
}
ret=mms_named_var_read (chnl_usr->net_info,VarName,DOM_SPEC, domName,type_id, dataDest, timeOut);
if (Need_Destroy_Typeid)
if (type_id!=-1) mvl_type_id_destroy(type_id);
return ret;
}
static ST_RET Write_Named_Var(LD_info_t *LD_info,chnl_usr_t *chnl_usr,char* VarName,ST_INT type_id, ST_VOID *dataDest, ST_INT timeOut)
{
ST_RET ret= SD_FAILURE;
ST_CHAR *domName = LD_info->LD_name;
int Need_Destroy_Typeid = FALSE;
assert(chnl_usr && LD_info);
if (type_id==-1) {
Need_Destroy_Typeid = TRUE;
type_id= mms_var_type_id_create (chnl_usr->net_info,DOM_SPEC, domName, VarName,timeOut);
if (type_id==-1) ret = SD_FAILURE; else ret = SD_SUCCESS;
if (ret == SD_FAILURE) return SD_FAILURE;
}
ret=mms_named_var_write(chnl_usr->net_info,VarName,DOM_SPEC, domName,type_id, dataDest, timeOut);
if (Need_Destroy_Typeid)
if (type_id!=-1) mvl_type_id_destroy(type_id);
return ret;
}
/*
<EnumType id="ctlModelsEnum">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
*/
#define TICKS_PER_MIN 60LL*1000LL*1000LL
int pt61850_write_cn_file(chnl_usr_t *chnl_usr, ied_t *ied, char *rem_filename, char *only_filename_ret)
{
int ret ;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
char loc_filename[128], loc_file_fullname[256], rem_file_fullname[256],only_filename_str[256];
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
char *only_filename,*the_full_file;
memset(loc_filename,0,sizeof(loc_filename));
memset(only_filename_str,0,sizeof(only_filename_str) );
strcat(only_filename_str,rem_filename);
only_filename = only_filename_str;
the_full_file = only_filename_str;
while ( *the_full_file != 0 ) {
if (*the_full_file == '/')
only_filename=the_full_file+1;
the_full_file++;
}
memset(rem_file_fullname,0,sizeof(rem_file_fullname) );
if (strstr(rem_filename,"/")!= NULL) {
strcat(rem_file_fullname,rem_filename);
}
else {
strcat(rem_file_fullname,g_pt61850app->accPath);
strcat(rem_file_fullname,rem_filename);
}
memset(loc_file_fullname,0,sizeof(loc_file_fullname) );
apr_snprintf(loc_file_fullname,sizeof(loc_file_fullname),"../comtrade/%s",only_filename);
apr_snprintf(only_filename_ret,256,"%s",only_filename);
printf("\n >>>>>>>>>****** Get wave file : %s from %s\n",loc_file_fullname,rem_file_fullname);
ret = mms_getFile(chnl_usr->net_info,loc_file_fullname,rem_file_fullname,g_pt61850app->mmsOpTimeout);
if (ret==SD_SUCCESS) {
}
else {
echo_warn3(">>>>>**** Error!!! %s mms_getFile wave file : %s from %s\n",chnl_usr->ip_str ,loc_file_fullname,rem_file_fullname);
}
return ret;
}
apr_status_t prepare_call_cn_wavelist(LD_info_t *LD_info, int FltNum)
{
int i;
for (i=0;i<256;i++) {
if (LD_info->FltNum[i]<=0) {
LD_info->FltNum[i] = FltNum;
break;
}
}
return APR_SUCCESS;
}
apr_status_t call_cn_wavelist(LD_info_t *LD_info )
{
int ret ;
int chnl_no;
chnl_usr_t *chnl_usr = NULL;
char **filenames;
int filenum ;
int i;
char file_match_str[65];
char *ldstr;
ied_t *ied = LD_info->ied;
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
int have_new_files = FALSE;
for (i=0;i<256;i++) {
if (LD_info->FltNum[i]<=0)
continue;
//LD<4C><44><EFBFBD>ƹ淶<C6B9><E6B7B6><EFBFBD>ֽڣ<D6BD>PQMn, <20><><EFBFBD><EFBFBD>PQLDn ,<2C><>5<EFBFBD><35><EFBFBD>ֽڣ<D6BD> <20><>Ҳֻȡ4<C8A1><34><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
ldstr = LD_info->LD_name+strlen(LD_info->LD_name)-4;
apr_snprintf(file_match_str,sizeof(file_match_str),"%s_%06d",ldstr,LD_info->FltNum[i]);
printf(">>>>>>>> IED [%d]: %s is calling cn wavefile, !!!!!!!! file_match_str=%s \n",ied->id,ied->name,file_match_str);
ret = SD_FAILURE;
filenum = 0;
assert(ied->chncount);
for(chnl_no=0 ; chnl_no<ied->chncount; chnl_no++) {
chnl_usr = (chnl_usr_t*)ied->channel[chnl_no].connect;
if (chnl_usr->m_state!=CHANNEL_CONNECTED)
continue;
ret = mms_mvla_fdir(chnl_usr->net_info,g_pt61850app->accPath,3*g_pt61850app->mmsOpTimeout,&filenames,&filenum,g_pt61850app->tmp_pool);
if (ret==SD_SUCCESS)
break;
}
if (ret==SD_SUCCESS) {
int cfg_idx,dat_idx;
char file_base_name[128];
char file_yyyymm[128];
char cfg_only_filename_ret[256];
char dat_only_filename_ret[256];
int ret2,ret3;
//WW 2023-11-01<30><31>¼<EFBFBD><C2BC><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD>޸<EFBFBD>Ϊint<6E><74>fltnumƥ<6D><C6A5>
ret2 = parse_file_names_by_fltnum(LD_info->FltNum[i], ldstr, filenames, filenum, &cfg_idx, &dat_idx, file_base_name, file_yyyymm);
//WW 2023-11-01 end
if (ret2 !=APR_SUCCESS)
return ret2;
//<2F><><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>dat/cfg_only_filename_ret<65>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׺<EFBFBD><D7BA>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ҫ<EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
ret2 = pt61850_write_cn_file(chnl_usr,ied,filenames[cfg_idx],cfg_only_filename_ret);
ret3 = pt61850_write_cn_file(chnl_usr,ied,filenames[dat_idx],dat_only_filename_ret);
have_new_files = TRUE;
/////////////////////////////////////////////////////////////////////////////////////////////<2F>ϴ<EFBFBD><CFB4>ļ<EFBFBD>
if (ret2==SD_SUCCESS && ret3==SD_SUCCESS ) { //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
QVVR_t *qvvr; //<2F><>̬<EFBFBD>¼<EFBFBD>
long long start_tm,trig_tm,end_tm;
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
ret2 = extract_timestamp_from_cfg_file(filenames[cfg_idx],&start_tm,&trig_tm);//<2F><>ȡ<EFBFBD>ļ<EFBFBD><C4BC>Ŀ<EFBFBD>ʼʱ<CABC><CAB1><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>ʱ<EFBFBD><CAB1>
printf(">>>>>>>> extract_timestamp_from_cfg_file end \n");
if (ret2 ==APR_SUCCESS) {
//to find the paired qvvr by the time of trig_tm
2025-03-10 21:26:17 +08:00
printf(">>>>>>>> extract_timestamp_from_cfg_file success \n");
2025-01-16 16:17:01 +08:00
qvvr = find_qvvr_by_trig_tm(LD_info,trig_tm); //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>Ĵ<EFBFBD><C4B4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ƥ<EFBFBD><C6A5><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>̬<EFBFBD>¼<EFBFBD>
if (qvvr) {
char* uuid_cfg = (char*)malloc(65 * sizeof(char));//<2F>ϴ<EFBFBD><CFB4>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
char* uuid_dat = (char*)malloc(65 * sizeof(char));
char* filename_cfg = (char*)malloc(100 * sizeof(char));//<2F>ϴ<EFBFBD><CFB4>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
char* filename_dat = (char*)malloc(100 * sizeof(char));
//lnk202411-5 <20><>¼web<65><62><EFBFBD>ص<EFBFBD>·<EFBFBD><C2B7>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
2025-03-10 21:26:17 +08:00
char* wavepath_cfg = (char*)malloc(256 * sizeof(char));
char* wavepath_dat = (char*)malloc(256 * sizeof(char));
2025-01-16 16:17:01 +08:00
/*<2A>ϴ<EFBFBD>.cfg<66><67>.dat<61><74><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>*/
char linux_cmd[256] = {0};
printf(">>>>>>>> qvvr ok end \n");
apr_snprintf(linux_cmd,sizeof(linux_cmd),"./sftp_upload %s %s/%04d",cfg_only_filename_ret,file_yyyymm,LD_info->line_id);//û<><C3BB>ʹ<EFBFBD><CAB9>
char loc_file_fullname_cfg[256];//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
memset(loc_file_fullname_cfg, 0, sizeof(loc_file_fullname_cfg));
apr_snprintf(loc_file_fullname_cfg, sizeof(loc_file_fullname_cfg), "/home/pq/FeProject/comtrade/%s", cfg_only_filename_ret);
char oss_file_fullname_cfg[256];//Զ<><D4B6><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
memset(oss_file_fullname_cfg, 0, sizeof(oss_file_fullname_cfg));
apr_snprintf(oss_file_fullname_cfg, sizeof(oss_file_fullname_cfg), "comtrade/wave/%s/%s", LD_info->mp_id, cfg_only_filename_ret);
if (FILE_FLAG == 1) {
PutOSS(oss_file_fullname_cfg, loc_file_fullname_cfg);//ʹ<><CAB9>buffer<65><72><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
}
else if (FILE_FLAG == 2) {
OBSFile(loc_file_fullname_cfg, oss_file_fullname_cfg, "putObject");//<2F><><EFBFBD>ﲢû<EFB2A2><C3BB><EFBFBD>ϴ<EFBFBD><CFB4>ļ<EFBFBD><C4BC><EFBFBD>
}
else if(FILE_FLAG==3){
WebAPI_Uds_Upload(UDS_UPLOAD_URL, loc_file_fullname_cfg, uuid_cfg, filename_cfg);//ͨ<><CDA8>form-data<74>ϴ<EFBFBD><CFB4>ļ<EFBFBD>
}
//LNK20241031ʹ<31><CAB9>JSON<4F><4E><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ϴ<EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>л<EFBFBD>ȡ
else if (FILE_FLAG == 4) {
2025-03-10 21:26:17 +08:00
char mq_file_fullname_cfg[256]; // Զ<><D4B6><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
memset(mq_file_fullname_cfg, 0, sizeof(mq_file_fullname_cfg));
// ʹ<><CAB9><EFBFBD>޸ĺ<DEB8><C4BA><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> apr_snprintf
2025-03-11 11:29:24 +08:00
apr_snprintf(mq_file_fullname_cfg, sizeof(mq_file_fullname_cfg), "comtrade/%s/",
LD_info->ied->channel[0].addr_str);
2025-03-10 21:26:17 +08:00
SOEFileWeb(loc_file_fullname_cfg, mq_file_fullname_cfg, wavepath_cfg);
2025-03-11 11:29:24 +08:00
printf("\n>>>>>>!! %s %s...... \n", mq_file_fullname_cfg, loc_file_fullname_cfg);
2025-01-16 16:17:01 +08:00
}
2025-03-11 11:29:24 +08:00
if (FILE_FLAG == 4) {
2025-01-16 16:17:01 +08:00
}
2025-03-11 11:29:24 +08:00
else{
printf("\n>>>>>>!! %s %s...... \n", oss_file_fullname_cfg, loc_file_fullname_cfg);
}
2025-01-16 16:17:01 +08:00
apr_snprintf(linux_cmd,sizeof(linux_cmd),"./sftp_upload %s %s/%04d",dat_only_filename_ret,file_yyyymm,LD_info->line_id);//<2F><>ͨ<EFBFBD><CDA8>sftp<74>ϴ<EFBFBD><CFB4>ŷ<EFBFBD>json<6F><6E>ȥ
char loc_file_fullname_dat[256];
memset(loc_file_fullname_dat, 0, sizeof(loc_file_fullname_dat));
apr_snprintf(loc_file_fullname_dat, sizeof(loc_file_fullname_dat), "/home/pq/FeProject/comtrade/%s", dat_only_filename_ret);
char oss_file_fullname_dat[256];
memset(oss_file_fullname_dat, 0, sizeof(oss_file_fullname_dat));
apr_snprintf(oss_file_fullname_dat, sizeof(oss_file_fullname_dat), "comtrade/wave/%s/%s", LD_info->mp_id, dat_only_filename_ret);
if (FILE_FLAG == 1) {
PutOSS(oss_file_fullname_dat, loc_file_fullname_dat);//ʹ<><CAB9>buffer<65><72><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
}
else if (FILE_FLAG == 2) {
OBSFile(loc_file_fullname_dat, oss_file_fullname_dat, "putObject");//<2F><><EFBFBD>ﲢû<EFB2A2><C3BB><EFBFBD>ϴ<EFBFBD><CFB4>ļ<EFBFBD><C4BC><EFBFBD>
}
else if(FILE_FLAG==3){
WebAPI_Uds_Upload(UDS_UPLOAD_URL, loc_file_fullname_dat, uuid_dat, filename_dat);//ͨ<><CDA8>form-data<74>ϴ<EFBFBD><CFB4>ļ<EFBFBD>
}
//LNK20241031ʹ<31><CAB9>JSON<4F><4E><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ϴ<EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>л<EFBFBD>ȡ
else if (FILE_FLAG == 4) {
2025-03-10 21:26:17 +08:00
char mq_file_fullname_dat[256]; // Զ<><D4B6><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
memset(mq_file_fullname_dat, 0, sizeof(mq_file_fullname_dat));
// ʹ<><CAB9><EFBFBD>޸ĺ<DEB8><C4BA><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> apr_snprintf
2025-03-11 11:29:24 +08:00
apr_snprintf(mq_file_fullname_dat, sizeof(mq_file_fullname_dat), "comtrade/%s/",
LD_info->ied->channel[0].addr_str);
2025-03-10 21:26:17 +08:00
2025-03-11 11:29:24 +08:00
SOEFileWeb(loc_file_fullname_dat, mq_file_fullname_dat, wavepath_dat);
printf("\n>>>>>>!! %s %s...... \n", mq_file_fullname_dat, loc_file_fullname_dat);
}
if (FILE_FLAG == 4) {
}
else{
printf("\n>>>>>>!! %s %s...... \n", oss_file_fullname_dat, loc_file_fullname_dat);
2025-01-16 16:17:01 +08:00
}
2025-03-11 11:29:24 +08:00
2025-01-16 16:17:01 +08:00
/*<2A>ϴ<EFBFBD>.cfg<66><67>.dat<61><74><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>*/
/*<2A>ϴ<EFBFBD><CFB4><EFBFBD>Ϣ*/
//to send json of this qvvr and rdre
end_tm = (long long)(qvvr->QVVR_PerTime*1000) + trig_tm; //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>dz<EFBFBD><C7B3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>ʱ<EFBFBD><CAB1>
if (FILE_FLAG == 3) {
size_t cfg_len = strlen(uuid_cfg) + strlen(filename_cfg) + 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>"-"<22>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD><EFBFBD>'\0'
char* cfg_result = (char*)malloc(cfg_len * sizeof(char)); // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B9BB><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
size_t dat_len = strlen(uuid_dat) + strlen(filename_dat) + 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>"-"<22>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD><EFBFBD>'\0'
char* dat_result = (char*)malloc(dat_len * sizeof(char)); // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B9BB><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
if (cfg_result != NULL && dat_result != NULL) {
snprintf(cfg_result, cfg_len, "%s-%s", uuid_cfg, filename_cfg); // ƴ<><C6B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EABBBA><EFBFBD><EFBFBD>
snprintf(dat_result, dat_len, "%s-%s", uuid_dat, filename_dat); // ƴ<><C6B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EABBBA><EFBFBD><EFBFBD>
2025-03-11 21:07:17 +08:00
ret3 = transfer_json_qvvr_data(g_node_id, LD_info->line_id, (double)qvvr->QVVR_Amg, (double)qvvr->QVVR_PerTime, start_tm, end_tm, qvvr->QVVR_type, cfg_result, dat_result, LD_info->mp_id, qvvr->QVVR_Rptname, ied_usr->dev_type);
2025-01-16 16:17:01 +08:00
}
free(cfg_result); // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA>ͷŶ<CDB7>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
free(dat_result); // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA>ͷŶ<CDB7>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
}
else if(FILE_FLAG==4)//lnk20241031<33><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬web<65><62>Ϣ
{
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>䲿<EFBFBD>ֲ<EFBFBD><D6B2>޸<EFBFBD>
2025-03-10 21:26:17 +08:00
size_t cfg_len = strlen(wavepath_cfg) + 1;
2025-01-16 16:17:01 +08:00
char* cfg_result = (char*)malloc(cfg_len * sizeof(char)); // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B9BB><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
2025-03-10 21:26:17 +08:00
size_t dat_len = strlen(wavepath_dat) + 1;
2025-01-16 16:17:01 +08:00
char* dat_result = (char*)malloc(dat_len * sizeof(char)); // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B9BB><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
if (cfg_result != NULL && dat_result != NULL) {
snprintf(cfg_result, cfg_len, wavepath_cfg); // ƴ<><C6B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EABBBA><EFBFBD><EFBFBD>
snprintf(dat_result, dat_len, wavepath_dat); // ƴ<><C6B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EABBBA><EFBFBD><EFBFBD>
ret3 = transfer_json_qvvr_data(g_node_id, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ʹ<EFBFBD><CAB9>
LD_info->line_id, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-03-11 21:07:17 +08:00
(double)qvvr->QVVR_Amg, (double)qvvr->QVVR_PerTime,
qvvr->QVVR_time, //<2F><><EFBFBD>ʹ<EFB2BB><CAB9><EFBFBD>ļ<EFBFBD><C4BC>еĿ<D0B5>ʼʱ<CABC><CAB1>start_tm<74><6D><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ӱ<EFBFBD><D3B0>д<EFBFBD>ʹ<E2A3AC><CAB9>QVVR<56><52>ʱ<EFBFBD><CAB1>QVVR_time//lnk20250311
end_tm, qvvr->QVVR_type, //<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A1A2>ʼʱ<CABC><EFBFBD><E4A1A2><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A1A2>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>
2025-01-16 16:17:01 +08:00
cfg_result, dat_result, //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>
LD_info->mp_id, qvvr->QVVR_Rptname, ied_usr->dev_type);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3>ļ<EFBFBD><C4BC>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>¼<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD>
}
free(cfg_result); // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA>ͷŶ<CDB7>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
free(dat_result); // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA>ͷŶ<CDB7>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
}
else if (FILE_FLAG == 1 || FILE_FLAG == 2)
{
size_t cfg_len = strlen(oss_file_fullname_cfg) + strlen(cfg_only_filename_ret) + 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>"-"<22>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD><EFBFBD>'\0'
char* cfg_result = (char*)malloc(cfg_len * sizeof(char)); // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B9BB><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
size_t dat_len = strlen(oss_file_fullname_dat) + strlen(dat_only_filename_ret) + 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>"-"<22>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD><EFBFBD>'\0'
char* dat_result = (char*)malloc(dat_len * sizeof(char)); // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B9BB><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
if (cfg_result != NULL && dat_result != NULL) {
snprintf(cfg_result, cfg_len, "%s-%s", oss_file_fullname_cfg, cfg_only_filename_ret); // ƴ<><C6B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EABBBA><EFBFBD><EFBFBD>
snprintf(dat_result, dat_len, "%s-%s", oss_file_fullname_dat, dat_only_filename_ret); // ƴ<><C6B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EABBBA><EFBFBD><EFBFBD>
2025-03-11 21:07:17 +08:00
ret3 = transfer_json_qvvr_data(g_node_id, LD_info->line_id, (double)qvvr->QVVR_Amg, (double)qvvr->QVVR_PerTime, start_tm, end_tm, qvvr->QVVR_type, cfg_result, dat_result, LD_info->mp_id, qvvr->QVVR_Rptname, ied_usr->dev_type);
2025-01-16 16:17:01 +08:00
}
free(cfg_result); // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA>ͷŶ<CDB7>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
free(dat_result); // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA>ͷŶ<CDB7>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
}
/*<2A>ϴ<EFBFBD><CFB4><EFBFBD>Ϣ*/
2025-03-11 11:29:24 +08:00
qvvr->used_status = QVVR_DATA_NOT_USED;//<2F>ϴ<EFBFBD><CFB4><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>qvvr<76><72>״̬<D7B4><CCAC>Ϊδʹ<CEB4><CAB9>
2025-01-16 16:17:01 +08:00
free(uuid_cfg);
free(uuid_dat);
free(filename_cfg);
free(filename_dat);
//lnk 202411-5
free(wavepath_cfg);
free(wavepath_dat);
}
}
}
}
else {
if (ied && chnl_usr)
echo_warn2("mms_mvla_fdir Failed: IED [%d] %s \n", ied->id , chnl_usr->ip_str) ;
return APR_EAGAIN;
}
LD_info->FltNum[i]= -1;
}
if (have_new_files)
clear_old_comtrade_files();
return APR_SUCCESS;
}
//lnk 2024-11-4 <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-03-12 11:45:53 +08:00
char* convertMsToDateTimeString(int64_t usTime) {
// ȷ<><C8B7>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
if (usTime < 0) {
return "Invalid timestamp";
}
// <20><> `apr_time_t` ΢<>루us<75><73>ת<EFBFBD><D7AA>Ϊ `time_t` <20>루s<EBA3A8><73>
time_t seconds = usTime / 1000000;
2025-01-16 16:17:01 +08:00
2025-03-12 11:45:53 +08:00
// <20><> `struct tm` <20><><EFBFBD><EFBFBD><EFBFBD>洢ʱ<E6B4A2><CAB1>
struct tm timeInfo;
// **ʹ<><CAB9> `localtime_r()` <20><><EFBFBD><EFBFBD>ϵͳʱ<CDB3><CAB1>**
localtime_r(&seconds, &timeInfo);
2025-01-16 16:17:01 +08:00
// <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢ת<E6B4A2><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
2025-03-12 11:45:53 +08:00
static char buffer[30];
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &timeInfo);
2025-01-16 16:17:01 +08:00
return buffer;
}