278 lines
8.1 KiB
C++
278 lines
8.1 KiB
C++
|
|
/**
|
|||
|
|
@file AnaWorkThread.cpp
|
|||
|
|
@brief 模拟量处理工作线程
|
|||
|
|
@author 周正龙
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "boost/program_options.hpp"
|
|||
|
|
#include "AnaWorkThread.h"
|
|||
|
|
#include "pub_logger_api/logger.h"
|
|||
|
|
#include "pub_utility_api/TimeUtil.h"
|
|||
|
|
|
|||
|
|
using namespace kbd_net;
|
|||
|
|
using namespace kbd_public;
|
|||
|
|
using namespace kbd_service;
|
|||
|
|
using namespace kbd_idlfile;
|
|||
|
|
using namespace kbd_dbms;
|
|||
|
|
using namespace std;
|
|||
|
|
|
|||
|
|
CAnaWorkThread::CAnaWorkThread(kbd_public::SRunAppInfo stRunAppInfo,CPacketQueuePtr ptrPacketQueue):
|
|||
|
|
CTimerThreadBase("CAnaWorkThread",15)
|
|||
|
|
{
|
|||
|
|
m_nMsgSeqNum = 0;
|
|||
|
|
m_lLastSendReqAllDataTime = 0;
|
|||
|
|
m_lLastProAlmTime = 0;
|
|||
|
|
m_lLastTime = 0;
|
|||
|
|
m_lLastAllDataTime = 0;
|
|||
|
|
m_ptrAnaProcess = nullptr;
|
|||
|
|
m_ptrDataProcApi = nullptr;
|
|||
|
|
m_ptrDataPublish = nullptr;
|
|||
|
|
|
|||
|
|
m_stRunAppInfo = stRunAppInfo ;
|
|||
|
|
m_lLastAllDataTime = 0 ;
|
|||
|
|
m_ptrPacketQueue = ptrPacketQueue ;
|
|||
|
|
m_lCurTime = getMonotonicMsec();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CAnaWorkThread::~CAnaWorkThread()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CAnaWorkThread::initialize()
|
|||
|
|
{
|
|||
|
|
//数据处理接口库实例
|
|||
|
|
//=============================================================================================
|
|||
|
|
m_ptrDataProcApi = getDataProcInstance(m_stRunAppInfo.strAppName);
|
|||
|
|
if (m_ptrDataProcApi == NULL)
|
|||
|
|
{
|
|||
|
|
LOGERROR("CAnaWorkThread::init(), getDataProcInstance error");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if(m_ptrDataProcApi->initialize() <0)
|
|||
|
|
{
|
|||
|
|
LOGERROR("CAnaWorkThread::init(), data_process_api initialize() error");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//数据发布实例
|
|||
|
|
//=============================================================================================
|
|||
|
|
m_ptrDataPublish = boost::make_shared<CSrvDataPublish>(m_stRunAppInfo);
|
|||
|
|
if (m_ptrDataPublish == NULL)
|
|||
|
|
{
|
|||
|
|
LOGERROR("CAnaWorkThread ::init(), make_shared<CSrvDataPublish> fail!\n");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if(m_ptrDataPublish->initialize() == false)
|
|||
|
|
{
|
|||
|
|
LOGERROR("CAnaWorkThread::init(), CSrvDataPublish initialize() error");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ai处理 实例
|
|||
|
|
//=============================================================================================
|
|||
|
|
m_ptrAnaProcess = boost::make_shared<CAnaProcess>(m_stRunAppInfo,m_ptrDataProcApi,\
|
|||
|
|
m_ptrDataPublish);
|
|||
|
|
if (m_ptrAnaProcess == NULL)
|
|||
|
|
{
|
|||
|
|
LOGERROR("CAnaWorkThread::init(), make_shared<CAnaProcess> fail!\n");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if(m_ptrAnaProcess->initialize() == false)
|
|||
|
|
{
|
|||
|
|
LOGERROR("CAnaWorkThread::init(), CAnaProcess initialize() error");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
@brief 主模块业务处理执行体
|
|||
|
|
@param 无
|
|||
|
|
@return 无
|
|||
|
|
@retval
|
|||
|
|
*/
|
|||
|
|
void CAnaWorkThread::execute()
|
|||
|
|
{
|
|||
|
|
m_lCurTime = getMonotonicMsec();
|
|||
|
|
|
|||
|
|
//1.消息处理
|
|||
|
|
//===================================================================
|
|||
|
|
processFesMessage();
|
|||
|
|
|
|||
|
|
requestAllDataFromFes() ;
|
|||
|
|
|
|||
|
|
processOptMessage();
|
|||
|
|
|
|||
|
|
//3.ANA 报警延迟处理
|
|||
|
|
//===================================================================
|
|||
|
|
processDelayTimeAlarm();
|
|||
|
|
|
|||
|
|
//发送变位产生的data/测点事件+SOE事件+越限事件
|
|||
|
|
//=============================================================================================================
|
|||
|
|
if(m_ptrDataPublish)
|
|||
|
|
{
|
|||
|
|
m_ptrDataPublish->sendChange();
|
|||
|
|
m_ptrDataPublish->sendAlarm();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
/**
|
|||
|
|
@brief 报警延迟处理
|
|||
|
|
@param mapDelayLimitType
|
|||
|
|
@return 无
|
|||
|
|
@retval
|
|||
|
|
*/
|
|||
|
|
int CAnaWorkThread::processDelayTimeAlarm()
|
|||
|
|
{
|
|||
|
|
if((m_lCurTime - m_lLastProAlmTime) >= 200)
|
|||
|
|
{
|
|||
|
|
m_lLastProAlmTime = m_lCurTime;
|
|||
|
|
int nRetCode = m_ptrAnaProcess->delayTimeProcess(m_stRunAppInfo.nDomainId);
|
|||
|
|
if (nRetCode == -1)
|
|||
|
|
{
|
|||
|
|
LOGERROR("CAnaWorkThread::execute, process analog delayTimeProcessAlgo error ");
|
|||
|
|
}
|
|||
|
|
LOGDEBUG("CAnaWorkThread::execute, end process of delayTimeProcess");
|
|||
|
|
}
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
int CAnaWorkThread::processOptMessage()
|
|||
|
|
{
|
|||
|
|
//处理标签操作
|
|||
|
|
//=============================================================================================================
|
|||
|
|
std::deque<kbd_idlfile::SOptSetDataPkg> deqOptManSetPkg;
|
|||
|
|
if(m_ptrPacketQueue->getOptManSetPkg(POINT_TYPE_ANA,deqOptManSetPkg))
|
|||
|
|
{
|
|||
|
|
std::deque<kbd_idlfile::SOptSetDataPkg>::iterator it = deqOptManSetPkg.begin();
|
|||
|
|
for( ;it!=deqOptManSetPkg.end();++it)
|
|||
|
|
{
|
|||
|
|
kbd_idlfile::SOptSetDataPkg &objOptManSetPkg = *it ;
|
|||
|
|
m_ptrAnaProcess->processOperate(objOptManSetPkg,OPERATE_TYPE );
|
|||
|
|
LOGINFO("processOptMessage:处理标签操作 num=%d .",objOptManSetPkg.seq_set_data_info_size());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//处理计算点
|
|||
|
|
//=============================================================================================================
|
|||
|
|
std::deque<kbd_idlfile::SOptSetDataPkg> deqOptCalSetPkg;
|
|||
|
|
if(m_ptrPacketQueue->getOptCalSetPkg(POINT_TYPE_ANA,deqOptCalSetPkg))
|
|||
|
|
{
|
|||
|
|
std::deque<kbd_idlfile::SOptSetDataPkg>::iterator it = deqOptCalSetPkg.begin();
|
|||
|
|
for( ;it!=deqOptCalSetPkg.end();++it)
|
|||
|
|
{
|
|||
|
|
kbd_idlfile::SOptSetDataPkg &objOptCalSetPkg = *it ;
|
|||
|
|
m_ptrAnaProcess->processOperate(objOptCalSetPkg,OPT_TYPE_CAL_SET);
|
|||
|
|
//LOGINFO("processOptMessage:处理计算点 num=%d .",objOptCalSetPkg.seq_set_data_info_size());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
@brief 前置实时数据处理(变化数据/全数据/报警/SOE/各种事件)
|
|||
|
|
@param 无
|
|||
|
|
@return 无
|
|||
|
|
@retval
|
|||
|
|
*/
|
|||
|
|
int CAnaWorkThread::processFesMessage()
|
|||
|
|
{
|
|||
|
|
int64 t1,t2;
|
|||
|
|
|
|||
|
|
//处理变化模拟量
|
|||
|
|
//=============================================================================================================
|
|||
|
|
std::deque<kbd_idlfile::SFesChangeAiPkg> deqFesChgAiPkg;
|
|||
|
|
if(m_ptrPacketQueue->getFesChangeAnaPkg(deqFesChgAiPkg)) //获得变化数据包队列
|
|||
|
|
{
|
|||
|
|
std::deque<kbd_idlfile::SFesChangeAiPkg>::iterator it = deqFesChgAiPkg.begin();
|
|||
|
|
for( ;it!=deqFesChgAiPkg.end();++it)
|
|||
|
|
{
|
|||
|
|
t1 = getMonotonicMsec() ;
|
|||
|
|
kbd_idlfile::SFesChangeAiPkg &objFesChangeAiPkg = *it ;
|
|||
|
|
m_ptrAnaProcess->procAnaChange(objFesChangeAiPkg);
|
|||
|
|
t2 = getMonotonicMsec() ;
|
|||
|
|
LOGDEBUG("processFesMessage:处理变化模拟量 num=%d,用时=%lld(ms)",objFesChangeAiPkg.staidata_size(),(long long)(t2-t1));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//处理全数据
|
|||
|
|
//=============================================================================================================
|
|||
|
|
kbd_idlfile::SFesUpdateAiPkg objFesUpdAiPkg;
|
|||
|
|
if(m_ptrPacketQueue->getFesUpdateAnaPkg(objFesUpdAiPkg)) //获得全数据
|
|||
|
|
{
|
|||
|
|
t1 = getMonotonicMsec() ;
|
|||
|
|
m_ptrAnaProcess->procAnaUpdate(objFesUpdAiPkg);
|
|||
|
|
t2 = getMonotonicMsec() ;
|
|||
|
|
LOGDEBUG("processFesMessage:处理模拟量全数据 num=%d,用时=%lld(ms)",objFesUpdAiPkg.staidata_size(),(long long)(t2-t1));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
@brief 挂起线程后的处理
|
|||
|
|
@param 无
|
|||
|
|
@return 无
|
|||
|
|
@retval
|
|||
|
|
*/
|
|||
|
|
void CAnaWorkThread::afterSuspend()
|
|||
|
|
{
|
|||
|
|
m_ptrDataPublish->suspend();
|
|||
|
|
|
|||
|
|
LOGINFO("CAnaWorkThread::Thread afterSuspend");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
@brief 恢复线程后的处理
|
|||
|
|
@param 无
|
|||
|
|
@return 无
|
|||
|
|
@retval
|
|||
|
|
*/
|
|||
|
|
void CAnaWorkThread::afterResume()
|
|||
|
|
{
|
|||
|
|
m_ptrDataPublish->resume();
|
|||
|
|
|
|||
|
|
LOGINFO("CAnaWorkThread::Thread afterResume");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CAnaWorkThread::release()
|
|||
|
|
{
|
|||
|
|
if(m_ptrAnaProcess!= NULL)
|
|||
|
|
{
|
|||
|
|
m_ptrAnaProcess.reset();
|
|||
|
|
m_ptrAnaProcess = NULL;
|
|||
|
|
LOGINFO("CAnaWorkThread::release(), 释放模拟量处理类成功!");
|
|||
|
|
}
|
|||
|
|
if(m_ptrDataPublish!= NULL)
|
|||
|
|
{
|
|||
|
|
m_ptrDataPublish->release();
|
|||
|
|
m_ptrDataPublish.reset();
|
|||
|
|
m_ptrDataPublish =NULL;
|
|||
|
|
LOGINFO("CAnaWorkThread::release(), 释放数据发布处理类成功!");
|
|||
|
|
}
|
|||
|
|
if(m_ptrDataProcApi!= NULL)
|
|||
|
|
{
|
|||
|
|
m_ptrDataProcApi.reset();
|
|||
|
|
m_ptrDataProcApi = NULL;
|
|||
|
|
LOGINFO("CAnaWorkThread::release(), 释放数据处理动态库成功!");
|
|||
|
|
}
|
|||
|
|
return ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int kbd_service::CAnaWorkThread::requestAllDataFromFes()
|
|||
|
|
{
|
|||
|
|
/*
|
|||
|
|
int64 lCurTimeMs = getMonotonicMsec();
|
|||
|
|
if (lCurTimeMs - m_lLastSendReqAllDataTime > CN_MinReqFesAllDataIntervalMs)
|
|||
|
|
{
|
|||
|
|
//TODO:发送请求
|
|||
|
|
//m_ptrDataPublish->SendFesDataRequest();
|
|||
|
|
}*/
|
|||
|
|
|
|||
|
|
return kbdSuccess;
|
|||
|
|
}
|