@@ -33,6 +33,9 @@ extern std::string WEB_EVENT;
extern std : : string WEB_FILEDOWNLOAD ;
extern std : : string WEB_FILEDOWNLOAD ;
extern std : : string G_CONNECT_TOPIC ;
extern std : : string G_CONNECT_TOPIC ;
//lnk20250115添加台账锁
extern pthread_mutex_t mtx ;
bool DEBUGOPEN = 0 ;
bool DEBUGOPEN = 0 ;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -57,6 +60,9 @@ public:
QString type ; //参数等级type类型: 0-DataType 1-监测点 2-剔除标记 3-发生时刻,毫秒 4-数据链表 5-相位 6-值索引 9-实时SOE事件
QString type ; //参数等级type类型: 0-DataType 1-监测点 2-剔除标记 3-发生时刻,毫秒 4-数据链表 5-相位 6-值索引 9-实时SOE事件
QString triggerFlag ; //告警SOE事件触发指标名称
QString triggerFlag ; //告警SOE事件触发指标名称
int nIndex ; //数据在每条线路LineInfo值数组中的位置
int nIndex ; //数据在每条线路LineInfo值数组中的位置
QString desc ; //soe事件描述
QString DO ; //数据对象名
QString DO ; //数据对象名
QString DA ; //数据属性名
QString DA ; //数据属性名
QString strFullName ; //数据对象名 $ 数据属性名
QString strFullName ; //数据对象名 $ 数据属性名
@@ -145,7 +151,8 @@ public:
QString WavePhasicA ;
QString WavePhasicA ;
QString WavePhasicB ;
QString WavePhasicB ;
QString WavePhasicC ;
QString WavePhasicC ;
QString UnitOfTimeUnit ; //暂态事件持续事件单位: 0 - 毫秒 1 - 秒
QString TypeOfData ; //闪变和统计是否合并 0-分开 1-合并
QString UnitOfTimeUnit ; //暂态事件持续事件单位: 0 - 毫秒 1 - 秒 lnk20260127
QString ValueOfTimeUnit ; //上送值的时间: UTC-UTC时间 beijing-北京时间
QString ValueOfTimeUnit ; //上送值的时间: UTC-UTC时间 beijing-北京时间
QString WaveTimeFlag ; //录波文件的时间: UTC-UTC时间 beijing-北京时间
QString WaveTimeFlag ; //录波文件的时间: UTC-UTC时间 beijing-北京时间
QString IEDname ; //例: PQMonitor
QString IEDname ; //例: PQMonitor
@@ -244,6 +251,8 @@ bool get_xml_config_by_dev_type(const char* dev_type, XmlConfigC* out_cfg) {
return false ;
return false ;
}
}
memset ( out_cfg , 0 , sizeof ( * out_cfg ) ) ;
QString dev_type_q = QString : : fromUtf8 ( dev_type ) ;
QString dev_type_q = QString : : fromUtf8 ( dev_type ) ;
QMap < QString , Xmldata * > : : iterator it = xmlinfo_list . find ( dev_type_q ) ;
QMap < QString , Xmldata * > : : iterator it = xmlinfo_list . find ( dev_type_q ) ;
if ( it = = xmlinfo_list . end ( ) | | it . value ( ) = = nullptr ) {
if ( it = = xmlinfo_list . end ( ) | | it . value ( ) = = nullptr ) {
@@ -259,6 +268,7 @@ bool get_xml_config_by_dev_type(const char* dev_type, XmlConfigC* out_cfg) {
strncpy ( out_cfg - > WavePhasicB , cfg . WavePhasicB . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > WavePhasicB ) - 1 ) ;
strncpy ( out_cfg - > WavePhasicB , cfg . WavePhasicB . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > WavePhasicB ) - 1 ) ;
strncpy ( out_cfg - > WavePhasicC , cfg . WavePhasicC . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > WavePhasicC ) - 1 ) ;
strncpy ( out_cfg - > WavePhasicC , cfg . WavePhasicC . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > WavePhasicC ) - 1 ) ;
strncpy ( out_cfg - > UnitOfTimeUnit , cfg . UnitOfTimeUnit . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > UnitOfTimeUnit ) - 1 ) ;
strncpy ( out_cfg - > UnitOfTimeUnit , cfg . UnitOfTimeUnit . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > UnitOfTimeUnit ) - 1 ) ;
strncpy ( out_cfg - > TypeOfData , cfg . TypeOfData . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > TypeOfData ) - 1 ) ; out_cfg - > TypeOfData [ sizeof ( out_cfg - > TypeOfData ) - 1 ] = ' \0 ' ; //lnk20260127
strncpy ( out_cfg - > ValueOfTimeUnit , cfg . ValueOfTimeUnit . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > ValueOfTimeUnit ) - 1 ) ;
strncpy ( out_cfg - > ValueOfTimeUnit , cfg . ValueOfTimeUnit . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > ValueOfTimeUnit ) - 1 ) ;
strncpy ( out_cfg - > WaveTimeFlag , cfg . WaveTimeFlag . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > WaveTimeFlag ) - 1 ) ;
strncpy ( out_cfg - > WaveTimeFlag , cfg . WaveTimeFlag . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > WaveTimeFlag ) - 1 ) ;
strncpy ( out_cfg - > IEDname , cfg . IEDname . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > IEDname ) - 1 ) ;
strncpy ( out_cfg - > IEDname , cfg . IEDname . toUtf8 ( ) . constData ( ) , sizeof ( out_cfg - > IEDname ) - 1 ) ;
@@ -865,6 +875,7 @@ bool ParseXMLConfig2(int xml_flag, XmlConfig *cfg, list<CTopic*> *ctopiclist,QSt
{
{
CEventData * ed = new CEventData ( ) ; //SOE事件类指针
CEventData * ed = new CEventData ( ) ; //SOE事件类指针
ed - > triggerFlag = node . toElement ( ) . attribute ( " name " ) ; //SOE名称
ed - > triggerFlag = node . toElement ( ) . attribute ( " name " ) ; //SOE名称
ed - > desc = node . toElement ( ) . attribute ( " desc " ) ; //SOE描述
ed - > DO = node . toElement ( ) . attribute ( " DO " ) ; //数据对象名
ed - > DO = node . toElement ( ) . attribute ( " DO " ) ; //数据对象名
ed - > DA = node . toElement ( ) . attribute ( " DA " ) ; //数据属性名
ed - > DA = node . toElement ( ) . attribute ( " DA " ) ; //数据属性名
ed - > type = node . toElement ( ) . attribute ( " type " ) ; //参数等级type类型: 0-DataType 1-监测点 2-剔除标记 3-发生时刻,毫秒 4-数据链表 5-相位 6-值索引 9-实时SOE事件
ed - > type = node . toElement ( ) . attribute ( " type " ) ; //参数等级type类型: 0-DataType 1-监测点 2-剔除标记 3-发生时刻,毫秒 4-数据链表 5-相位 6-值索引 9-实时SOE事件
@@ -898,6 +909,11 @@ bool ParseXMLConfig2(int xml_flag, XmlConfig *cfg, list<CTopic*> *ctopiclist,QSt
{
{
cfg - > UnitOfTimeUnit . append ( e . attribute ( " Unit " ) ) ;
cfg - > UnitOfTimeUnit . append ( e . attribute ( " Unit " ) ) ;
}
}
//lnk 20260127
if ( " TypeOfData " = = strTag )
{
cfg - > TypeOfData . append ( e . attribute ( " Unit " ) ) ;
}
if ( " ValueOfTime " = = strTag )
if ( " ValueOfTime " = = strTag )
{
{
cfg - > ValueOfTimeUnit . append ( e . attribute ( " Unit " ) ) ;
cfg - > ValueOfTimeUnit . append ( e . attribute ( " Unit " ) ) ;
@@ -1029,9 +1045,46 @@ void printCTopicList(const std::list<CTopic*>& ctopic_list) {
}
}
}
}
// ===== DEBUG 打印: mms_str_map (属性名 -> 值) =====
static void print_mms_str_map ( const json_block_data * data )
{
if ( ! data ) {
std : : cout < < " [DBG] json_block_data is NULL \n " ;
return ;
}
std : : cout < < " \n ========== [DBG] json_block_data.mms_str_map ========== \n " ;
std : : cout < < " [DBG] monitorId= " < < data - > monitorId
< < " func_type= " < < data - > func_type
< < " flag= " < < data - > flag
< < " time(ms)= " < < data - > time
< < " voltage_level= " < < data - > voltage_level
< < " \n " ;
std : : cout < < " [DBG] mp_id= " < < data - > mp_id . toStdString ( )
< < " dev_type= " < < data - > dev_type . toStdString ( )
< < " \n " ;
std : : cout < < " [DBG] mms_str_map size= " < < data - > mms_str_map . size ( ) < < " \n " ;
// Qt4/Qt5 都稳: QMapIterator
QMapIterator < QString , double > it ( data - > mms_str_map ) ;
while ( it . hasNext ( ) ) {
it . next ( ) ;
std : : cout < < " " < < it . key ( ) . toStdString ( ) < < " = " < < it . value ( ) < < " \n " ;
}
std : : cout < < " ====================================================== \n \n " ;
}
//20250214添加角型接线处理
//20250214添加角型接线处理
int transfer_json_block_data ( char v_wiring_type [ ] , json_block_data * data ) //json生成函数 zw修改 2023-8-11 调整传送json结构 目前仅限历史稳态数据
int transfer_json_block_data ( char v_wiring_type [ ] , json_block_data * data ) //json生成函数 zw修改 2023-8-11 调整传送json结构 目前仅限历史稳态数据
{
{
// 刚进函数就打印 mms_str_map
if ( DEBUGOPEN ) {
print_mms_str_map ( data ) ;
}
list < CTopic * > ctopic_list ;
list < CTopic * > ctopic_list ;
////lnk2024-8-15 区分星型,角型接线
////lnk2024-8-15 区分星型,角型接线
@@ -1054,7 +1107,7 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
cout < < " transfer_json_block_data contain data->dev_type " < < endl ;
cout < < " transfer_json_block_data contain data->dev_type " < < endl ;
ctopic_list = xmlinfo_list2 [ data - > dev_type ] - > topicList ;
ctopic_list = xmlinfo_list2 [ data - > dev_type ] - > topicList ;
if ( DEBUGOPEN ) printCTopicList ( ctopic_list ) ;
}
}
else {
else {
cout < < " transfer_json_block_data not contain data->dev_type: " < < data - > dev_type . toStdString ( ) < < " !!!! " < < endl ;
cout < < " transfer_json_block_data not contain data->dev_type: " < < data - > dev_type . toStdString ( ) < < " !!!! " < < endl ;
@@ -1063,6 +1116,43 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
}
}
}
}
if ( DEBUGOPEN ) printCTopicList ( ctopic_list ) ;
//lnk20260127 添加数据类型区分
bool typeofdata = false ;
bool data_have_static = data - > data_have_statistic ;
QString devType = data - > dev_type ;
QByteArray devTypeBytes = devType . toUtf8 ( ) ;
const char * dev_type_cstr = devTypeBytes . constData ( ) ;
qDebug ( ) < < " [DBG] devType (QString) = " < < devType ;
qDebug ( ) < < " [DBG] devType length = " < < devType . length ( ) ;
qDebug ( ) < < " [DBG] devTypeBytes = " < < devTypeBytes ;
qDebug ( ) < < " [DBG] devTypeBytes size = " < < devTypeBytes . size ( ) ;
printf ( " [DBG] dev_type_cstr = '%s' \n " , dev_type_cstr ) ;
XmlConfigC cfg1 ;
if ( get_xml_config_by_dev_type ( dev_type_cstr , & cfg1 ) ) {
printf ( " ========== XmlConfigC dump ========== \n " ) ;
printf ( " WavePhasicFlag = '%s' \n " , cfg1 . WavePhasicFlag ) ;
printf ( " WavePhasicA = '%s' \n " , cfg1 . WavePhasicA ) ;
printf ( " WavePhasicB = '%s' \n " , cfg1 . WavePhasicB ) ;
printf ( " WavePhasicC = '%s' \n " , cfg1 . WavePhasicC ) ;
printf ( " UnitOfTimeUnit = '%s' \n " , cfg1 . UnitOfTimeUnit ) ;
printf ( " TypeOfData = '%s' \n " , cfg1 . TypeOfData ) ;
printf ( " ValueOfTimeUnit = '%s' \n " , cfg1 . ValueOfTimeUnit ) ;
printf ( " WaveTimeFlag = '%s' \n " , cfg1 . WaveTimeFlag ) ;
printf ( " IEDname = '%s' \n " , cfg1 . IEDname ) ;
printf ( " LDevicePrefix = '%s' \n " , cfg1 . LDevicePrefix ) ;
printf ( " ===================================== \n " ) ;
// 如果 TypeOfData == "1",则置 true
if ( strcmp ( cfg1 . TypeOfData , " 1 " ) = = 0 ) {
typeofdata = true ;
}
} else {
printf ( " not find this dev_type \n " ) ;
}
bool shortjumpflag = false ;
bool shortjumpflag = false ;
bool longjumpflag = false ;
bool longjumpflag = false ;
@@ -1336,11 +1426,16 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
kafka_data_list_mutex . unlock ( ) ; //解锁
kafka_data_list_mutex . unlock ( ) ; //解锁
longjumpflag = true ;
longjumpflag = true ;
}
}
if ( longjumpflag = = true | | shortjumpflag = = true ) {
return 1 ;
//lnk20260127
if ( typeofdata = = false | | data_have_static = = false ) { //不合并则处理完闪变就不处理其他数据,如果有统计数据或者数据类型区分了就继续处理其他数据
if ( longjumpflag = = true | | shortjumpflag = = true ) {
return 1 ;
}
}
}
} //②-②历史闪变数据解析结束!--------------------------------
} //②-②历史闪变数据解析结束!--------------------------------
//合并则继续处理其他数据
if ( 1 = = pDataType - > iDataType ) //②-①历史稳态数据-----------------------------------------------------------
if ( 1 = = pDataType - > iDataType ) //②-①历史稳态数据-----------------------------------------------------------
{
{
Ckafka_data_t KafkaData ; //kafka发送数据结构类对象
Ckafka_data_t KafkaData ; //kafka发送数据结构类对象
@@ -2240,8 +2335,10 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
kafka_data_list_mutex . unlock ( ) ; //解锁
kafka_data_list_mutex . unlock ( ) ; //解锁
longjumpflag = true ;
longjumpflag = true ;
}
}
if ( longjumpflag = = tru e | | shortjumpflag = = tru e) {
if ( typeofdata = = fals e | | data_have_static = = fals e) { //不合并则处理完闪变就不处理其他数据
return 1 ;
if ( longjumpflag = = true | | shortjumpflag = = true ) {
return 1 ;
}
}
}
//return 1; //结束该函数,停止后续代码执行
//return 1; //结束该函数,停止后续代码执行
} //②-②历史闪变数据解析结束!--------------------------------
} //②-②历史闪变数据解析结束!--------------------------------
@@ -2561,8 +2658,35 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
return 1 ;
return 1 ;
}
}
static void format_time_ms ( long long ms , char * buf , size_t buf_len )
{
time_t sec = ms / 1000 ;
int milli = ms % 1000 ;
struct tm tm_time ;
localtime_r ( & sec , & tm_time ) ; // 线程安全
snprintf ( buf , buf_len ,
" %04d-%02d-%02d %02d:%02d:%02d.%03d " ,
tm_time . tm_year + 1900 ,
tm_time . tm_mon + 1 ,
tm_time . tm_mday ,
tm_time . tm_hour ,
tm_time . tm_min ,
tm_time . tm_sec ,
milli ) ;
}
void processGGIO_start_data_end ( char * mp_id , char * fullname , double v , long long time , char * devtype , int monitor_id )
void processGGIO_start_data_end ( char * mp_id , char * fullname , double v , long long time , char * devtype , int monitor_id )
{
{
//监测点日志的key,lnk20250526
char full_key_m_c [ 256 ] ; // 分配足够空间
char full_key_m_d [ 256 ] ; // 分配足够空间
snprintf ( full_key_m_c , sizeof ( full_key_m_c ) , " monitor.%s.COM " , mp_id ) ;
snprintf ( full_key_m_d , sizeof ( full_key_m_d ) , " monitor.%s.DATA " , mp_id ) ;
//监测点日志的key,lnk20250526
XmlConfig c_xmlcfg ;
XmlConfig c_xmlcfg ;
if ( xmlinfo_list . contains ( devtype ) ) {
if ( xmlinfo_list . contains ( devtype ) ) {
c_xmlcfg = xmlinfo_list [ devtype ] - > xmlcfg ;
c_xmlcfg = xmlinfo_list [ devtype ] - > xmlcfg ;
@@ -2594,6 +2718,28 @@ void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long ti
if ( pEventData - > strFullName . indexOf ( Full_name ) ! = - 1 )
if ( pEventData - > strFullName . indexOf ( Full_name ) ! = - 1 )
{
{
KafkaData . strText . append ( QString ( " \" %1 \" " ) . arg ( pEventData - > triggerFlag ) ) ;
KafkaData . strText . append ( QString ( " \" %1 \" " ) . arg ( pEventData - > triggerFlag ) ) ;
//使用日志接口记录日志
char time_str [ 64 ] ;
format_time_ms ( time , time_str , sizeof ( time_str ) ) ;
QByteArray descBa = pEventData - > desc . toLocal8Bit ( ) ;
pthread_mutex_lock ( & mtx ) ; std : : cout < < " ggio hold lock !!!!!!!!!!! " < < std : : endl ;
const char * mp_name_raw = find_mp_name_from_mp_id ( mp_id ) ;
pthread_mutex_unlock ( & mtx ) ; std : : cout < < " ggio unlock lock !!!!!!!!!!! " < < std : : endl ;
char mp_name [ 128 ] ;
if ( mp_name_raw & & mp_name_raw [ 0 ] ! = ' \0 ' ) {
snprintf ( mp_name , sizeof ( mp_name ) , " %s " , mp_name_raw ) ;
} else {
snprintf ( mp_name , sizeof ( mp_name ) , " unknown " ) ;
}
DIY_WARNLOG_CODE ( full_key_m_d , LOG_CODE_REPORT ,
" 监测点:%s(%s),在%s发生事件:%s,事件值:%.2f " ,
mp_name , mp_id , time_str , descBa . constData ( ) , v ) ;
break ;
break ;
}
}
}
}
@@ -2606,6 +2752,7 @@ void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long ti
kafka_data_list_mutex . lock ( ) ; //加锁
kafka_data_list_mutex . lock ( ) ; //加锁
kafka_data_list . append ( KafkaData ) ; //添加 kafka发送链表
kafka_data_list . append ( KafkaData ) ; //添加 kafka发送链表
kafka_data_list_mutex . unlock ( ) ; //解锁
kafka_data_list_mutex . unlock ( ) ; //解锁
}
}
//zw修改 2023-8-31 新增或更新list队列 写入xml数据库信息 模型编码 终端型号 终端厂家 oss存储路径 时间
//zw修改 2023-8-31 新增或更新list队列 写入xml数据库信息 模型编码 终端型号 终端厂家 oss存储路径 时间