794 lines
33 KiB
C++
Raw Normal View History

2025-03-12 11:08:50 +08:00

#include "AnaProcess.h"
using namespace std;
2025-03-12 14:17:01 +08:00
using namespace iot_service;
using namespace iot_idl;
using namespace iot_public;
using namespace iot_dbms;
2025-03-12 11:08:50 +08:00
2025-03-12 14:17:01 +08:00
CAnaProcess::CAnaProcess(iot_public::SRunAppInfo stRunAppInfo,
2025-03-12 11:08:50 +08:00
CDataProcessApiPtr ptrDataProcApi,\
CSrvDataPublishPtr ptrDataPublish)
{
m_lCurTime = 0;
m_strSourceTagLocal = "";
m_strSrcTagRecv = "";
m_strSourceTag = "";
m_ptrLimitProcess = nullptr;
m_stSysInfo.nAppNo = stRunAppInfo.nAppId;
m_stSysInfo.bIsCommApp = false;
m_stRunAppInfo = stRunAppInfo ;
m_ptrDataProcApi = ptrDataProcApi;
m_ptrDataPublish = ptrDataPublish;
}
CAnaProcess::~CAnaProcess()
{
}
bool CAnaProcess::initialize()
{
m_mapDelayLimitType.clear();
//初始化模拟量越线处理-先不考虑累计量越限
//=============================================================================================
m_ptrLimitProcess = boost::make_shared<CLimitProcess>(m_stRunAppInfo,m_ptrDataProcApi,\
m_ptrDataPublish);
if (m_ptrLimitProcess == NULL)
{
LOGERROR("CAnaProcess::initialize(), make_shared<CLimitProcess> fail!\n");
return false;
}
if(m_ptrLimitProcess->initialize() == false)
{
LOGERROR("CAnaProcess::initialize(), initialize CLimitProcess fail!\n");
return false;
}
return CPointBase::initialize();
}
//初始化参数
int CAnaProcess::initPara()
{
m_lCurTime = getUTCTimeMsec() ;
//LOGDEBUG("CAnaProcess::initPara(), m_ulCurTime = %ul", m_ulCurTime);
return true;
}
/**
@brief
@param const SFesUpdatePiPkg &stChgAnaPkg
@return
@retval
*/
int CAnaProcess::procAnaChange(const SFesChangeAiPkg &stChgAnaPkg)
{
initPara();
int nChangeNum = 0;
int nLoop = 0;
int nRetCode = 0;
int nTmpStatus = 0;
SNewValueStatus stNewValueStatus;
SOldValueStatus stOldValueStatus;
SChangeAiData stOneAiLimit;
m_strSrcTagRecv = stChgAnaPkg.sthead().strfessource();
m_strSourceTag = m_strSrcTagRecv ;
m_strSourceTag +=":";
m_strSourceTag +=m_strSourceTagLocal;
m_strSourceTag +=":AiChange";
m_stSysInfo.strSrcTagRecv = m_strSrcTagRecv;
m_stSysInfo.strSourceTag = m_strSourceTag;
nChangeNum = stChgAnaPkg.staidata_size();
if(nChangeNum>0)
{
LOGDEBUG("procAnaChange:收到变化数据报文,数目[%d],时间[%" PRId64 "].",nChangeNum,(int64)stChgAnaPkg.staidata(0).ultime());
}
for (nLoop = 0; nLoop < nChangeNum; ++nLoop)
{
initChangeAnaInfo(); //Clear stOneAiLimit;
SFesAiDataWithTm objAiData = stChgAnaPkg.staidata().Get(nLoop);
m_stChangeAiInfo.strTableName = objAiData.strapptablename();
m_stChangeAiInfo.strColumnName = objAiData.strappcolumnname();
m_stChangeAiInfo.strPointName = objAiData.strapptagname();
stOneAiLimit.strTableName = objAiData.strapptablename();
stOneAiLimit.strColumnName = objAiData.strappcolumnname();
stOneAiLimit.strPointName = objAiData.strapptagname();
stOneAiLimit.lTime = objAiData.ultime();
stOneAiLimit.dValue = objAiData.fvalue();
//1.根据前置送来点值和状态;判断收到的数据和状态是否有效
//====================================================================================
nTmpStatus = 0xffff & objAiData.ustatus();
m_ptrDataProcApi->changeAnaStatusRawToRipe(stOneAiLimit.uStatus, nTmpStatus);
/*
if (stOneAiLimit.uStatus & (1 <<(m_mapAiState["MENU_STATE_AI_NOT_CHANGE"]))) //变化报文不应该包含不刷新
{
LOGINFO("::aiChange, stOneAiLimit.strPointName = %s, value=%d,second=%d,msecond=%d, include of MENU_STATE_AI_NOT_CHANGE!",
stOneAiLimit.strPointName.c_str(), stOneAiLimit.dValue, stOneAiLimit.ulTime, stOneAiLimit.ulTime);
}
stOneAiLimit.uStatus &= ~(1 << (m_mapAiState["MENU_STATE_AI_NOT_CHANGE"] ));//清掉不刷新
if (stOneAiLimit.uStatus & (1 <<(m_mapAiState["MENU_STATE_AI_GK_OFF"] ))) //变化报文不应该包含工况退出
{
LOGINFO("::aiChange, stOneAiLimit.strPointName = %s, value=%d,msecond=%d, include of MENU_STATE_AI_GK_OFF!",
stOneAiLimit.strPointName.c_str(), stOneAiLimit.dValue, stOneAiLimit.ulTime);
}
stOneAiLimit.uStatus &= ~(1 << (m_mapAiState["MENU_STATE_AI_GK_OFF"]));//清掉工况退出
*/
if (stOneAiLimit.uStatus ==0)//清掉工况退出和不刷新后如果为0则添加个正常状态add_status(procOneAi.uStatus)
{
stOneAiLimit.uStatus = 1 << (m_mapAiState["MENU_STATE_AI_NORMAL"]);
}
//LOGDEBUG("CAnaProcess::aiChange, point_name= %s, value = %f, status = %d, times = %lld, source_tag = %s",
// stOneAiLimit.strPointName.c_str(), stOneAiLimit.dValue, stOneAiLimit.uStatus, stOneAiLimit.ulTime, m_strSrcTagRecv.c_str());
initAnaValueStatus(stOldValueStatus, stNewValueStatus);
nRetCode = procOneAnaChange(stOneAiLimit,stNewValueStatus,stOldValueStatus,CHANGE_TYPE);
if (nRetCode < 0)
{
LOGWARN("CAnaProcess::procAnaChange, tableName = %s, tagName=%s procOneAnaChange error!",
stOneAiLimit.strTableName.c_str(), stOneAiLimit.strPointName.c_str());
continue;
}
//AO CONTROL 表
//=============================================================================================
} //end for
return 1;
}
/**
@brief +*
@param
@return
@retval
*/
int CAnaProcess:: dealFertValue(SChangeAiData &stOneAiLimit)
{
//<< 后台系数处理
//============================================================================================
string strKeyIdTag = RT_ANA_TBL;
strKeyIdTag += ".";
strKeyIdTag += stOneAiLimit.strPointName;
strKeyIdTag.resize(128);
int nIndex = m_ptrRdbTableMng->searchRecordByKey(RT_ANA_MAP_TO_FES,strKeyIdTag.c_str());
if( nIndex >=0 )
{
SAnaMapToFes* pAnaMaptoFes = (SAnaMapToFes*)m_ptrRdbTableMng->getRecordAllColumnByIndex(RT_ANA_MAP_TO_FES,nIndex);
if(pAnaMaptoFes)
{
stOneAiLimit.dValue = pAnaMaptoFes->base + (stOneAiLimit.dValue * pAnaMaptoFes->coeff); //基码+前置值*系数
}
else
{
LOGDEBUG("dealFertValue, PointName = %s 获取测点内存地址失败 !",stOneAiLimit.strPointName.c_str());
return -1;
}
}
else
{
LOGDEBUG("dealFertValue, PointName = %s 获取测点前置参数失败 !",stOneAiLimit.strPointName.c_str());
return -1;
}
return 1;
}
/**
@brief One PI变化量
@param SChangeAiData &stChangeAnaData, /<-fes
SAnaNewValueStatus stNewValueStatus, /fbd_server
SAnaOldValueStatus stOldValueStatus, <-rdb
const int nChangeType
@return
@retval
*/
int CAnaProcess::procOneAnaChange(SChangeAiData &stOneAiLimit,SNewValueStatus stNewValueStatus,\
SOldValueStatus stOldValueStatus,const int nChangeType,const bool bInit)
{
int nRetCode = 0;
if (!strcmp(stOneAiLimit.strTableName.c_str(), RT_ANA_TBL)) //AI点
{
SAnaPointAll stAiPoint;
//获取测点全信息参数;
//=============================================================================================================
string strKeyTagName = stOneAiLimit.strPointName;
strKeyTagName.resize(64);
nRetCode = m_ptrRdbTableMng->getRecordAllColumnByKey(RT_ANA_TBL,strKeyTagName.c_str() ,stAiPoint);
if (nRetCode <=0)
{
LOGERROR("CAnaProcess::procOneAnaChange, nRetCode = %d, appNo = %d, tableName = %s, getRecordAllColumnByKey\
(key_tag_name=%s) error!", nRetCode, m_stRunAppInfo.nAppId,
stOneAiLimit.strTableName.c_str(), stOneAiLimit.strPointName.c_str());
return -1;
}
//<< 处理前置数据,遥测系数处理 基码+前置值*系数
//=============================================================================================================
if(dealFertValue(stOneAiLimit)<0)//处理前置数据,遥测系数处理 基码+前置值*系数
{
LOGERROR("CAnaProcess::procOneAnaChange, tag_name = %s, dealFertValue error!", stOneAiLimit.strPointName.c_str());
return -1;
}
//从RDB获得上一次的值
stOldValueStatus.oldvalue = stAiPoint.value;
stOldValueStatus.oldstatus = stAiPoint.status;
m_stChangeAiInfo.dValue = stOldValueStatus.oldvalue;
m_stChangeAiInfo.uStatus = stOldValueStatus.oldstatus;
stOneAiLimit.nLocation = stAiPoint.location_id;
stOneAiLimit.nSubSystem = stAiPoint.sub_system;
UTagValue unSetValue;
unSetValue.dValue = stOneAiLimit.dValue ;//
//变化数据/全数据+计算点->return
if(((stAiPoint.point_property & (1<<0)) == 1) &&
(UPDATE_TYPE == nChangeType || CHANGE_TYPE == nChangeType) ) //计算点&前置数据(变化+全数据)
{
LOGDEBUG("procOneAnaChange::计算点[%s],nChangeType=%d return 1",stAiPoint.tag_name,nChangeType);
return 1;
}
//LOGDEBUG("CAnaProcess::procOneAnaChange, table_name=%s,point_name = %s, value = %f, status = %d, msecond = %lld,
// oldValue = %f, oldStatus = %d,point_class = %d,source_tag = %s",
// stOneAiLimit.strTableName.c_str(), stOneAiLimit.strPointName.c_str() , stOneAiLimit.dValue, stOneAiLimit.uStatus,
// stOneAiLimit.ulTime, stOldValueStatus.oldvalue,stOldValueStatus.oldstatus, stAiPoint.point_class, m_strSrcTagRecv.c_str());
//< 变化数据,全数据,fes
//=============================================================================================================
if(UPDATE_TYPE == nChangeType || CHANGE_TYPE == nChangeType )
{
//禁止刷新/人工置数-> 保存旧的值;同时返回
nRetCode = checkTagStatus(stAiPoint.tag_name,stOldValueStatus.oldstatus,
unSetValue,stAiPoint.last_change_time, POINT_TYPE_ANA);
if (nRetCode == false)
{
LOGDEBUG( "CAnaProcess::procOneAnaChange, nRetCode = %d, point_name = %s, value = %f, status = %d, time = [%" PRId64 "],\
oldStatus = %d, checkOldStatus return false! source_tag = %s",
nRetCode, stOneAiLimit.strPointName.c_str(), stOneAiLimit.dValue, stOneAiLimit.uStatus,
stOneAiLimit.lTime, stOldValueStatus.oldstatus, m_strSrcTagRecv.c_str());
return 1;
}
stNewValueStatus.newvalue = stOneAiLimit.dValue;
stNewValueStatus.addstatus = stOneAiLimit.uStatus;
stNewValueStatus.delstatus = 0 ;
}
//< 计算服务计算点处理,fbd_server
//=============================================================================================================
else if(OPT_TYPE_CAL_SET == nChangeType)
{
if((stAiPoint.point_property & (1<<0)) == 0) //采集点
{
LOGDEBUG("processOperate::操作错误,对采集点[%s]人工置数,请检查配置!",stAiPoint.tag_name);
return 1;
}
//禁止刷新/人工置数-> 保存旧的值;同时返回
nRetCode = checkTagStatus(stAiPoint.tag_name,stOldValueStatus.oldstatus,
unSetValue,stAiPoint.last_change_time, POINT_TYPE_ANA);
if (nRetCode == false)
{
LOGDEBUG( "CAnaProcess::procOneAnaChange, nRetCode = %d, point_name = %s, value = %f, status = %d, time = [%" PRId64 "],\
oldStatus = %d, checkOldStatus return false! source_tag = %s",
nRetCode, stOneAiLimit.strPointName.c_str(), stOneAiLimit.dValue, stOneAiLimit.uStatus,
stOneAiLimit.lTime, stOldValueStatus.oldstatus, m_strSrcTagRecv.c_str());
return 1;
}
}
//< 人工操作-标签操作,operate_server
//=============================================================================================================
else if(OPERATE_TYPE == nChangeType) //人工操作-标签操作
{
STagStatusValue stTagInfo ; //获得测点原先的值和状态
stTagInfo.strTagName = stAiPoint.tag_name;
stTagInfo.lTimes = stAiPoint.last_change_time;
stTagInfo.unValue.dValue = stAiPoint.value ;
stTagInfo.nStatus = stAiPoint.status;
//如果禁止刷新,保存标签数据 ;否则,还原标签数据
if(procTagOperate(stNewValueStatus.addstatus ,stNewValueStatus.delstatus,
unSetValue,stTagInfo,POINT_TYPE_ANA)== false)
{
LOGERROR("CAnaProcess::procOneAnaChange,procTagOperate Error tagname=%s ",stAiPoint.tag_name);
}
stNewValueStatus.newvalue = stTagInfo.unValue.dValue ;
}
//得到新状态stNewValueStatus更新 变化时间到RDB ;更新成员m_stChangeAiInfo 状态+值
//=============================================================================================================
nRetCode = writeAnaRtdb(stOneAiLimit.strPointName, stOldValueStatus, stNewValueStatus, m_lCurTime,nChangeType);
if (nRetCode < 0)
{
LOGWARN("CAnaProcess::procOneAnaChange, nRetCode = %d, point_name= %s, value = %f, addstatus = %d, msecond = [%" PRId64 "], \
oldValue = %f, oldStatus = %d, occTime = [%" PRId64 "], writeAnaRtdb error! ",
nRetCode, stOneAiLimit.strPointName.c_str(), stNewValueStatus.newvalue, stNewValueStatus.addstatus,
stOneAiLimit.lTime, stOldValueStatus.oldvalue,stOldValueStatus.oldstatus, m_lCurTime);
return -1;
}
stOneAiLimit.uStatus = stNewValueStatus.newstatus;
//2.点值发生变化,调用越限动态库做越限判断,遥测越线要判断状态OK
//=============================================================================================================
bool bAlarmDisable = checkAlarmDisable(stNewValueStatus.newstatus ,POINT_TYPE_ANA,false) ;
if (m_stChangeAiInfo.bIfNeedLimit && (bInit == false) && stAiPoint.is_limit)//现在改为只有值变化才做做越线处理
{
int nRetProcss = 0;
nRetProcss = m_ptrLimitProcess->limitProcess(stOneAiLimit, m_mapDelayLimitType, m_stChangeAiInfo,\
m_stSysInfo, bAlarmDisable); //处理原来AI_LIMIT越限
if (nRetProcss < 0)
{
LOGWARN("CAnaProcess::procOneAnaChange, ret_process = %d, key_id= %s, value = %f, status = %d, \
msecond = [%" PRId64 "], oldValue = %f, oldStatus = %d, m_ulCurTime = [%" PRId64 "], limitProcess error! ",
nRetProcss, stOneAiLimit.strPointName.c_str(), stOneAiLimit.dValue, stOneAiLimit.uStatus,
stOneAiLimit.lTime, stOldValueStatus.oldvalue,
stOldValueStatus.oldstatus, m_lCurTime);
}//限值出错时候只写AICHANGE变化的VALUE OR STATUS
}
//3.根据最新的点值变化以及状态信息更新实时库值变化才作最做最后的更新状态和实时值
//=============================================================================================================
if (m_stChangeAiInfo.bIfProcess)
{
m_stChangeAiInfo.bIfProcess = false;
int nRet = 0;
nRet = writeRdbAndSendMsg(stOneAiLimit, nChangeType); //将产生变化的点组包变化报文
if (nRet < 0)
{
LOGWARN("CAnaProcess::procOneAnaChange, ret = %d, point_name= %s, value = %f, status = %d, \
msecond = [%" PRId64 "], m_ulCurTime = [%" PRId64 "], writeRdbAndSendMsg error! source_tag = %s",
nRet, stOneAiLimit.strPointName.c_str(), stOneAiLimit.dValue, stOneAiLimit.uStatus,
stOneAiLimit.lTime, m_lCurTime, m_strSrcTagRecv.c_str());
return -1;
}
}
}
else //NOT FOUND POINT TYPE
{
LOGWARN("aichange, tablename[%s] is not analog error! ",stOneAiLimit.strTableName.c_str());
return -1;
}
return 1;
}
/**
@brief
@param const SFesUpdatePiPkg &stUpPiPkg
@return
@retval
*/
int CAnaProcess::procAnaUpdate(const SFesUpdateAiPkg &stUpAnaPkg)
{
initPara();
int nUpdateNum = 0;
int nLoop = 0;
int nRetCode = 0;
int nTmpStatus = 0;
SChangeAiData stOneAiLimit;
SNewValueStatus stNewValueStatus;
SOldValueStatus stOldValueStatus;
m_strSrcTagRecv = stUpAnaPkg.sthead().strfessource();
m_strSourceTag = m_strSrcTagRecv ;
m_strSourceTag +=":";
m_strSourceTag +=m_strSourceTagLocal;
m_strSourceTag +=":optLockData";
m_stSysInfo.strSrcTagRecv = m_strSrcTagRecv;
m_stSysInfo.strSourceTag = m_strSourceTag;
nUpdateNum = stUpAnaPkg.staidata_size();
LOGDEBUG("procAnaUpdate:收到全数据报文,数目[%d],时间[%" PRId64 "].",nUpdateNum,(int64)stUpAnaPkg.ultime());
for (nLoop = 0; nLoop < nUpdateNum; ++nLoop)
{
initChangeAnaInfo();
m_stChangeAiInfo.strTableName = stUpAnaPkg.staidata(nLoop).strapptablename();
m_stChangeAiInfo.strPointName = stUpAnaPkg.staidata(nLoop).strapptagname(); //点名
m_stChangeAiInfo.strColumnName = stUpAnaPkg.staidata(nLoop).strappcolumnname(); //列名
stOneAiLimit.strTableName = stUpAnaPkg.staidata(nLoop).strapptablename(); //表名
stOneAiLimit.strPointName = stUpAnaPkg.staidata(nLoop).strapptagname(); //点名
stOneAiLimit.strColumnName = stUpAnaPkg.staidata(nLoop).strappcolumnname(); //列名
stOneAiLimit.dValue = stUpAnaPkg.staidata(nLoop).fvalue();
stOneAiLimit.lTime = m_lCurTime;
nTmpStatus = 0xffff & stUpAnaPkg.staidata(nLoop).ustatus();
m_ptrDataProcApi->changeAnaStatusRawToRipe(stOneAiLimit.uStatus, nTmpStatus);
//LOGDEBUG("CAnaProcess::procAnaUpdate,tablename=%s,tag_name=%s,colum_name=%s,
// value=%f,nTmpStatus =%d,stOneAiLimit.uStatus=%d,sec=%d,msec=%d ",
// stOneAiLimit.strTableName.c_str(), stOneAiLimit.strPointName.c_str(), stOneAiLimit.strColumnName.c_str(),
// stOneAiLimit.dValue, nTmpStatus, stOneAiLimit.uStatus, stOneAiLimit.ulTime/1000,
// stOneAiLimit.ulTime%1000);
if (stOneAiLimit.uStatus == 0)
{
stOneAiLimit.uStatus = 1 << (m_mapAiState["MENU_STATE_AI_NORMAL"]);
}
//LOGDEBUG("CAnaProcess::aiUpdate,table_name = %s, point_name = %s,column_name = %s, value = %f, status = %d, source_tag = %s",
// stOneAiLimit.strTableName.c_str(), stOneAiLimit.strPointName.c_str(), stOneAiLimit.strColumnName.c_str(),
// stOneAiLimit.dValue, stOneAiLimit.uStatus, m_strSrcTagRecv.c_str());
initAnaValueStatus(stOldValueStatus, stNewValueStatus);
nRetCode = procOneAnaChange(stOneAiLimit,stNewValueStatus,stOldValueStatus,UPDATE_TYPE);
if (nRetCode < 0)
{
LOGWARN("CAnaProcess::procAnaChange, tableName = %s, tagName=%s procOneAnaChange error!",
stOneAiLimit.strTableName.c_str(), stOneAiLimit.strPointName.c_str());
continue;
}
}//endfor
return 1;
}
/**
@brief
@param const SChangeAiData &stOneAiLimit AI量结构
float newValue
int newStatus
int domain
@return
@retval
*/
bool CAnaProcess::checkNewValue(const double &/*fNewValue*/)
{
//LOGDEBUG("checkNewValue, fNewValue = %f !", fNewValue);
return true;
}
/**
@brief
@param
@return
@retval
*/
int CAnaProcess:: writeAnaRtdb(const string &strPointName, SOldValueStatus &stOldValueStatus,
SNewValueStatus &stNewValueStatus, int64 &occurTime, char updateType)
{
int nRetCode = 0;
int nOriType = STATUS_ORI_RECV ;
string strKeyTagName = strPointName;
strKeyTagName.resize(64);
//LOGDEBUG("CAnaProcess::writeAnaRtdb, tag_name = %s, newValue = %lf, addStatus = %d,oldvalue=%lf,oldStatus = %d, occurTime = %lld, updateType = %d",
// strKeyTagName.c_str(), stNewValueStatus.newvalue, stNewValueStatus.addstatus, stOldValueStatus.oldvalue,
// stOldValueStatus.oldstatus, occurTime, updateType);
//更新变化数据时间
//=======================================================================================
if (updateType == UPDATE_TYPE) // 全数据
{
if ((fabs(stOldValueStatus.oldvalue - stNewValueStatus.newvalue) > EPSINON) //HAVE CHANGE, INCLUDE VALUE OR STATUS
|| (stOldValueStatus.oldstatus != stNewValueStatus.newstatus))
{
nRetCode = m_ptrRdbTableMng->updateRecordOneValueByKey(RT_ANA_TBL,strKeyTagName.c_str(), "last_update_time",occurTime);
if (nRetCode == false)
{
LOGERROR("CAnaProcess::writeAnaRtdb, nRetCode = %d, point_name=%s, occurTime = [%" PRId64 "], 更新参数错误!",
nRetCode, strPointName.c_str(), occurTime);
}
}
}
else if(updateType == CHANGE_TYPE) // 变化数据
{
nRetCode = m_ptrRdbTableMng->updateRecordOneValueByKey(RT_ANA_TBL,strKeyTagName.c_str(), "last_change_time",occurTime);
if (nRetCode == false)
{
LOGERROR("CAnaProcess::writeAnaRtdb, nRetCode = %d, point_name = %s, occurTime = [%" PRId64 "],更新参数错误!",
nRetCode, strPointName.c_str(), occurTime);
}
}
else // OPT置数数据
{
nOriType = STATUS_ORI_OPT ;
nRetCode = m_ptrRdbTableMng->updateRecordOneValueByKey(RT_ANA_TBL,strKeyTagName.c_str(), "last_change_time",occurTime);
if (nRetCode == false)
{
LOGERROR("CAnaProcess::writeAnaRtdb, nRetCode = %d, point_name = %s, occurTime = [%" PRId64 "]更新参数错误!",
nRetCode, strPointName.c_str(), occurTime);
}
}
//根据原来status和新加入的几位进行一些与或运算得到newstatus
//======================================================================================
nRetCode = m_ptrDataProcApi->getNewStatus(TYPE_STATUS_AI, stNewValueStatus.newstatus,\
stOldValueStatus.oldstatus, stNewValueStatus.addstatus, stNewValueStatus.delstatus, nOriType,\
updateType);
if (nRetCode < 0)
{
LOGINFO("CAnaProcess::writeAnaRtdb, nRetCode = %d, strPointName= %s, addStatus = %d, oldStatus = %d, new_status =%d,\
occurTime = [%" PRId64 "], updateType = %d, m_ptrDataProcApi->GetNewStatus error!",\
nRetCode, strPointName.c_str(), stNewValueStatus.addstatus, stOldValueStatus.oldstatus,
stNewValueStatus.newstatus, occurTime, updateType);
return -1;
}
//LOGDEBUG("CAnaProcess::writeAnaRtdb:GetNewStatus newstatus = %d", stNewValueStatus.newstatus);
//新状态工况退出只修改状态
//======================================================================================
if ( (stNewValueStatus.newstatus & (1 << (m_mapAiState["MENU_STATE_AI_GK_OFF"])))
&& (stNewValueStatus.newstatus != stOldValueStatus.oldstatus) )
{
m_stChangeAiInfo.bIfProcess = true;
m_stChangeAiInfo.dValue = stOldValueStatus.oldvalue;
m_stChangeAiInfo.uStatus = stNewValueStatus.newstatus;
m_stChangeAiInfo.bIfLimitChange = false;
LOGINFO("CAnaProcess::writeAnaRtdb MENU_STATE_AI_GK_OFF!,ifprocess =%d,strPointName =%s,value =%f,status =%d,iflimitchange =%d",
m_stChangeAiInfo.bIfProcess, m_stChangeAiInfo.strPointName.c_str(), m_stChangeAiInfo.dValue, m_stChangeAiInfo.uStatus,
m_stChangeAiInfo.bIfLimitChange);
return 2;
}
//1值变化才作最做最后的更新状态和实时值 2值变化后面需要做越限处理,
//======================================================================================
if ((fabs(stOldValueStatus.oldvalue - stNewValueStatus.newvalue) > EPSINON)
|| (stOldValueStatus.oldstatus != stNewValueStatus.newstatus))
{
m_stChangeAiInfo.bIfProcess = true; //值变化才作最做最后的更新状态和实时值
m_stChangeAiInfo.dValue = stNewValueStatus.newvalue;
m_stChangeAiInfo.uStatus = stNewValueStatus.newstatus;
m_stChangeAiInfo.bIfLimitChange = false;
if ((fabs(stOldValueStatus.oldvalue - stNewValueStatus.newvalue) >EPSINON))//值变化后面需要做越限处理
{
m_stChangeAiInfo.bIfNeedLimit = true;
}
//LOGDEBUG("CAnaProcess::writeAnaRtdb value status all change,ifprocess =%d,point_id =%s,value =%f,status =%d,iflimitchange =%d",
// m_stChangeAiInfo.bIfProcess, m_stChangeAiInfo.strPointName.c_str(), m_stChangeAiInfo.dValue, m_stChangeAiInfo.uStatus,
// m_stChangeAiInfo.bIfLimitChange);
}
return 1;
}
/**
@brief //传入点表关键字
@param
@return
@retval
*/
/*
bool CAnaProcess::findAoCtrl(const char *strPointName, const float &curValue, const int &reportType)
{
LOGINFO("CAnaProcess::findAoCtrl begin, strPointName = %s,curvalue =%f,reportType =%d " , strPointName, curValue,
reportType);
AiContralInfoStruct stAiCtrlInfo;
std::vector<std::string>vecSelColumn ={"nRetCode","msg_type","target_value", "ctrl_tolerance","is_tagt_state"};
int nRetCode = m_ptrRdbTableMng->getRecordSelColumnByKey(RT_ANA_CTRL_TBL, strPointName , vecSelColumn,stAiCtrlInfo);
if (nRetCode == false)
{
LOGERROR( "CAnaProcess::findAoCtrl,ret_code=%d, strPointName = %s, rdb error!" , nRetCode, strPointName);
return false;
}
else
{
if (!stAiCtrlInfo.is_tagt_state)
{
LOGINFO("CAnaProcess::findAoCtrl,is_tagt_state==0");
return false;
}
if ((stAiCtrlInfo.ctrl_tolerance - fabs(curValue - stAiCtrlInfo.target_value)) < 0)
{
LOGERROR("CAnaProcess::findAoCtrl, strPointName = %s, curValue = %f, targetValue = %f, ctrl_tolerance = %f,\
reportType = %d, ctrl_tolerance < fabs(curValue - targetValue) error!",\
strPointName, curValue, stAiCtrlInfo.target_value, stAiCtrlInfo.ctrl_tolerance, reportType);
return false;
}
if ((stAiCtrlInfo.msg_type == reportType))
{
LOGINFO( "CAnaProcess::findAoCtrl, strPointName= %s, reportType = %d, findAoCtrlNodeToShm success!",
strPointName, reportType);
return true;
}
}
LOGERROR("CAnaProcess::findAoCtrl, strPointName = %s, reportType = %d, findAoCtrlNodeToShm fail!",
strPointName, reportType);
return false;
}
*/
/**
@brief ,
@param const SLockDataPkg &stTransDataPkg
@return
@retval
*/
int CAnaProcess::processOperate(const SOptSetDataPkg &stOptSetDataPkg,const int nOperateType)
{
int nNum = 0;
int nRetCode = 0;
nNum = stOptSetDataPkg.seq_set_data_info_size();
int64 lTimes = stOptSetDataPkg.package_head().n_opt_time();
bool bNotAlarm = stOptSetDataPkg.package_head().b_not_alarm() ;
for (int nLoop = 0; nLoop < nNum; nLoop++)
{
SChangeAiData stChangeAnaData;
SNewValueStatus stNewValueStatus;
SOldValueStatus stOldValueStatus;
SOptSetDataMsg stOptSetData = stOptSetDataPkg.seq_set_data_info(nLoop);
stChangeAnaData.strTableName = RT_ANA_TBL;
stChangeAnaData.strPointName = stOptSetData.str_tag_name();
stChangeAnaData.strColumnName = "value";
stChangeAnaData.dValue = stOptSetData.var_value().dvalue();
stChangeAnaData.lTime = lTimes ;
initAnaValueStatus(stOldValueStatus, stNewValueStatus);
stNewValueStatus.addstatus = stOptSetData.u_add_status();
stNewValueStatus.delstatus = stOptSetData.u_del_status();
stNewValueStatus.newvalue = stChangeAnaData.dValue ;
LOGDEBUG("CAnaProcess::processOperate,bInit=%d,tableName =%s,tagName=%s ,addstatus =%d,delstatus=%d,newValue=%f !",
bNotAlarm,stChangeAnaData.strTableName.c_str(),stChangeAnaData.strPointName.c_str(),stNewValueStatus.addstatus,\
stNewValueStatus.delstatus,stChangeAnaData.dValue );
nRetCode = procOneAnaChange(stChangeAnaData,stNewValueStatus,stOldValueStatus, nOperateType,bNotAlarm);
if (nRetCode < 0)
{
LOGWARN("CAnaProcess::processOperate, tableName = %s, tagName=%s procOneAnaChange error!",
stChangeAnaData.strTableName.c_str(), stChangeAnaData.strPointName.c_str());
continue;
}
}
return 1;
}
/**
@brief initChangeAnaInfo
@param
@return
@retval
*/
void CAnaProcess::initChangeAnaInfo()
{
m_stChangeAiInfo.bIfProcess = false;
m_stChangeAiInfo.strTableName.clear();
m_stChangeAiInfo.strPointName.clear() ;
m_stChangeAiInfo.strColumnName.clear();
m_stChangeAiInfo.dValue = 0;
m_stChangeAiInfo.uStatus = 0;
m_stChangeAiInfo.bIfLimitChange = false;
m_stChangeAiInfo.bIfNeedLimit = false;
return;
}
/**
@brief AI/PI报警延时处理
@param
@return
@retval
*/
int CAnaProcess::delayTimeProcess(int nDomain)
{
int nRetCode;
int64 lCurTime = getMonotonicMsec();
nRetCode = m_ptrLimitProcess->delayProcess(m_mapDelayLimitType, nDomain, lCurTime);
if (nRetCode <0 )
{
LOGERROR("CAnaProcess::delayTimeProcess, nRetCode = %d, delayProcess error!",nRetCode);
return -1;
}
return 1;
}
/**
@brief RDBaddAiChange()线
@param stOneAiLimit: IN
@return
@retval
*/
int CAnaProcess::writeRdbAndSendMsg(const SChangeAiData &stOneAiLimit, int /*style*/)
{
int nRetCode = -1 ;
string strKeyTagName = stOneAiLimit.strPointName;
//<< 后台系数处理
/*
//============================================================================================
string strKeyIdTag = RT_ANA_TBL;
strKeyIdTag += ".";
strKeyIdTag += strKeyTagName;
strKeyIdTag.resize(128);
int nIndex = m_ptrRdbTableMng->searchRecordByKey(RT_ANA_MAP_TO_FES,strKeyIdTag.c_str());
if( nIndex >=0 )
{
SAnaMapToFes* pAnaMaptoFes = (SAnaMapToFes*)m_ptrRdbTableMng->getRecordAllColumnByIndex(RT_ANA_MAP_TO_FES,nIndex);
if(pAnaMaptoFes)
{
double dAccOldValue = m_stChangeAiInfo.dValue ;
m_stChangeAiInfo.dValue = pAnaMaptoFes->base + dAccOldValue * pAnaMaptoFes->coeff;
}
}
else
{
LOGDEBUG("writeAnaRtdbAndSendMsg, PointName = %s 获取测点前置参数失败 !",stOneAiLimit.strPointName.c_str());
}*/
//<< 实时值写入数据库中同时发布到 HMI
//============================================================================================
strKeyTagName.resize(64);
nRetCode = m_ptrRdbTableMng->updateRecordTwoValueByKey(stOneAiLimit.strTableName,strKeyTagName.c_str(),\
"status",m_stChangeAiInfo.uStatus, "value", m_stChangeAiInfo.dValue);
if (nRetCode == false)
{
LOGERROR("CAnaProcess::writeRdbAndSendMsg, nRetCode = %d, point_id = %s, updateRecordTwoValueByKey value and status error!",
nRetCode, stOneAiLimit.strPointName.c_str());
return -3;
}
m_ptrDataPublish->addOneChangeFloat( stOneAiLimit.nLocation,stOneAiLimit.nSubSystem,stOneAiLimit.strTableName,stOneAiLimit.strPointName,\
stOneAiLimit.strColumnName, m_stChangeAiInfo.dValue, m_stChangeAiInfo.uStatus);
//LOGDEBUG( "CAnaProcess::writeRdbAndSendMsg,not optlock" );
return 1;
}
/**
@brief SOldValueStatusSNewValueStatusSMiOldValueStatusSMiNewValueStatus并清空
@param
@return
@retval
*/
2025-03-12 14:17:01 +08:00
void CAnaProcess::initAnaValueStatus(iot_service::SOldValueStatus &stOldValueStatus,
iot_service::SNewValueStatus &stNewValueStatus)
2025-03-12 11:08:50 +08:00
{
stOldValueStatus.oldstatus = 0;
stOldValueStatus.oldvalue = 0;
stNewValueStatus.addstatus = 0;
stNewValueStatus.newstatus = 0;
stNewValueStatus.newvalue = 0;
}