314 lines
9.7 KiB
C++
314 lines
9.7 KiB
C++
|
|
#include <zad/DataAlarm.h>
|
|||
|
|
#include <log4cplus/LOG.h>
|
|||
|
|
#include <common/L2Event.h>
|
|||
|
|
#include <glob/ProxyMag.h>
|
|||
|
|
#include <glob/GlobMem.h>
|
|||
|
|
#include <zlib/DB2Mem.hpp>
|
|||
|
|
#include <dao/DbStandardDBAX.h>
|
|||
|
|
#include <json/json.h>
|
|||
|
|
#include <glob/ConfigMag.h>
|
|||
|
|
#include <algorithm>
|
|||
|
|
//#include <zpub/MonitorI.h>
|
|||
|
|
#include "T_LOV_JUDGE.h"
|
|||
|
|
#include <string.h>
|
|||
|
|
#include <iDA/iDA.h>
|
|||
|
|
#include <zlib/MemVar.h>
|
|||
|
|
#include <sstream>
|
|||
|
|
|
|||
|
|
using namespace log4cplus;
|
|||
|
|
using namespace std;
|
|||
|
|
extern iDA::Connection cn;
|
|||
|
|
DataAlarm::DataAlarm()
|
|||
|
|
{
|
|||
|
|
LOG d("DataAlarm::DataAlarm");
|
|||
|
|
mqp_proxy = ProxyMag::GetAppICEPrx("baosight/zmqp");
|
|||
|
|
mp_restapi = new RestAPI();
|
|||
|
|
pt_pdo = new CMemTable<PDO>("TRKPDO",PDO_LIST_MAX);
|
|||
|
|
mp_coil = new CMemCoil();
|
|||
|
|
mp_trk = new CMemTrk();
|
|||
|
|
AlarmMsg = new T_ALARM_MSG();
|
|||
|
|
db_order = " ORDER BY id DESC";
|
|||
|
|
p_tele = new BinaryTele(2000, "T_LOV_FDAAITEM");
|
|||
|
|
ConfigMag configmag("CRGS");
|
|||
|
|
string server = configmag.ReadProperty("activemq", "server");
|
|||
|
|
|
|||
|
|
judge.clear();
|
|||
|
|
isBA(0);
|
|||
|
|
d.Info() << "END" << std::endl;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DataAlarm::~DataAlarm()
|
|||
|
|
{
|
|||
|
|
LOG d("DataAlarm::~DataAlarm");
|
|||
|
|
delete pt_pdo;
|
|||
|
|
delete mp_restapi;
|
|||
|
|
delete mp_coil;
|
|||
|
|
delete mp_trk;
|
|||
|
|
delete AlarmMsg;
|
|||
|
|
delete p_tele;
|
|||
|
|
}
|
|||
|
|
string DataAlarm::isBA(int zone)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
LOG d("DataAlarm::SteelGrade");
|
|||
|
|
string sql = "select * from T_LOV_JUDGE";
|
|||
|
|
iDA::Command cmd;
|
|||
|
|
cmd.SetConnection(&cn);
|
|||
|
|
//d.Info() << sql << endl;
|
|||
|
|
cmd.SetCommandText(sql);
|
|||
|
|
cmd.Execute();
|
|||
|
|
string setstr;
|
|||
|
|
T_LOV_JUDGE::STR_T_LOV_JUDGE singlejudge;
|
|||
|
|
while (cmd.FetchNext())
|
|||
|
|
{
|
|||
|
|
strcpy(singlejudge.CheckItem, cmd.Field("CheckItem").AsString().c_str());
|
|||
|
|
//d.Info() << singlejudge.CheckItem << endl;
|
|||
|
|
strcpy(singlejudge.CheckMode, cmd.Field("CheckMode").AsString().c_str());
|
|||
|
|
strcpy(singlejudge.checkItemNameMax, cmd.Field("checkItemNameMax").AsString().c_str());
|
|||
|
|
strcpy(singlejudge.checkItemNameMin, cmd.Field("checkItemNameMin").AsString().c_str());
|
|||
|
|
strcpy(singlejudge.AlarmMessage, cmd.Field("AlarmMessage").AsString().c_str());
|
|||
|
|
strcpy(singlejudge.AlarmTerm, cmd.Field("AlarmTerm").AsString().c_str());
|
|||
|
|
strcpy(singlejudge.AlarmPos, cmd.Field("AlarmPos").AsString().c_str());
|
|||
|
|
singlejudge.LowerLimit = cmd.Field("LowerLimit").AsDouble();
|
|||
|
|
singlejudge.UpperLimit = cmd.Field("UpperLimit").AsDouble();
|
|||
|
|
singlejudge.ZoneName = cmd.Field("ZoneName").AsDouble();
|
|||
|
|
for (int i = 0; i < 5; i++)
|
|||
|
|
{
|
|||
|
|
string name = "BoolQueryName_IND" + to_string(i);
|
|||
|
|
strcpy(singlejudge.BoolQueryName[i], cmd.Field(name.c_str()).AsString().c_str());
|
|||
|
|
string source = "BoolQuerySource_IND" + to_string(i);
|
|||
|
|
strcpy(singlejudge.BoolQuerySource[i], cmd.Field(source.c_str()).AsString().c_str());
|
|||
|
|
string valuemax = "DigitalQueryValueMax_IND" + to_string(i);
|
|||
|
|
string valuemin = "DigitalQueryValueMin_IND" + to_string(i);
|
|||
|
|
strcpy(singlejudge.DigitalQueryValueMax[i], cmd.Field(valuemax.c_str()).AsString().c_str());
|
|||
|
|
strcpy(singlejudge.DigitalQueryValueMin[i], cmd.Field(valuemin.c_str()).AsString().c_str());
|
|||
|
|
}
|
|||
|
|
judge.push_back(singlejudge);
|
|||
|
|
}
|
|||
|
|
d.Info() << "END" << std::endl;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string DataAlarm::SteelGrade(int zone)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
string DataAlarm::WorkDeal(int zone)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
int DataAlarm::baseAlarm()
|
|||
|
|
{
|
|||
|
|
LOG d("DataAlarm::baseAlarm");
|
|||
|
|
Json::Value jsonData;
|
|||
|
|
//中央段速度为0,停止报警
|
|||
|
|
float MainSpd=getItemValue("speed_tm_ext");
|
|||
|
|
if(MainSpd==0)
|
|||
|
|
return 0;
|
|||
|
|
|
|||
|
|
for (int i = 0; i < judge.size(); i++)
|
|||
|
|
{
|
|||
|
|
Json::Value singledata;
|
|||
|
|
string item = string(judge[i].CheckItem);
|
|||
|
|
string ItemSet = string(judge[i].BoolQueryName[0]);
|
|||
|
|
// d.Info()<<"报警项数据"<<item<<endl;
|
|||
|
|
int zone = judge[i].ZoneName, flag = 0;
|
|||
|
|
singledata["CheckItem"] = judge[i].CheckItem;
|
|||
|
|
singledata["ZONE"] = zone;
|
|||
|
|
singledata["AlarmMessage"] = string(judge[i].AlarmMessage);
|
|||
|
|
singledata["AlarmPos"]=string(judge[i].AlarmPos);
|
|||
|
|
singledata["AlarmTerm"]=string(judge[i].AlarmTerm);
|
|||
|
|
double value = 0;
|
|||
|
|
double valueset = 0;
|
|||
|
|
|
|||
|
|
string checkmode = judge[i].CheckMode;
|
|||
|
|
//string checknamemax = judge[i].checkItemNameMax;
|
|||
|
|
//string checknamemin = judge[i].checkItemNameMin;
|
|||
|
|
double lowvalue = judge[i].LowerLimit;
|
|||
|
|
double upvalue = judge[i].UpperLimit;
|
|||
|
|
value = getItemValue(item);
|
|||
|
|
singledata["level"] = 0;
|
|||
|
|
singledata["minvalue"] = lowvalue;
|
|||
|
|
singledata["maxvalue"] = upvalue;
|
|||
|
|
singledata["value"] = value;
|
|||
|
|
ostringstream os;
|
|||
|
|
//按照给出的上下限直接判断
|
|||
|
|
if (checkmode == "0")
|
|||
|
|
{
|
|||
|
|
if (value < lowvalue || value > upvalue)
|
|||
|
|
{
|
|||
|
|
singledata["level"] = 1;
|
|||
|
|
if(value < lowvalue)
|
|||
|
|
{
|
|||
|
|
os<<"低于下限--实时值: "<<value<<"--下限: "<<lowvalue;
|
|||
|
|
strcpy(judge[i].AlarmMessage,os.str().c_str());
|
|||
|
|
os.clear();
|
|||
|
|
}
|
|||
|
|
if(value > upvalue)
|
|||
|
|
{
|
|||
|
|
os<<"高于上限--实时值: "<<value<<"--上限: "<<upvalue;
|
|||
|
|
strcpy(judge[i].AlarmMessage,os.str().c_str());
|
|||
|
|
os.clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//判断实际值是否在设定值的误差值以内
|
|||
|
|
if (checkmode == "1" )
|
|||
|
|
{
|
|||
|
|
TRK_UNIT *trk_unit = (*mp_trk)(zone);
|
|||
|
|
// string sql = "select * from T_PDI_DATA where ENTID='" + string(trk_unit->entId) + "'";
|
|||
|
|
// iDA::Command cmd;
|
|||
|
|
// cmd.SetConnection(&cn);
|
|||
|
|
// cmd.SetCommandText(sql);
|
|||
|
|
// cmd.Execute();
|
|||
|
|
string ItemSet = string(judge[i].BoolQueryName[0]);
|
|||
|
|
valueset =getItemValue(ItemSet);
|
|||
|
|
double minset = 0, maxset = 0;
|
|||
|
|
|
|||
|
|
singledata["minvalue"] = valueset + lowvalue;
|
|||
|
|
singledata["maxvalue"] = valueset + upvalue;
|
|||
|
|
//d.Info()<<"item: "<<ItemSet<<" value: "<<valueset<<" min: "<<valueset + lowvalue<<" max: "<<valueset + upvalue<<endl;
|
|||
|
|
if (value < valueset + lowvalue || value > valueset + upvalue)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
singledata["level"] = 1;
|
|||
|
|
if(value < valueset + lowvalue)
|
|||
|
|
{
|
|||
|
|
os<<"低于下限--实时值: "<<value<<"--下限: "<<valueset - lowvalue;
|
|||
|
|
strcpy(judge[i].AlarmMessage,os.str().c_str());
|
|||
|
|
os.clear();
|
|||
|
|
}
|
|||
|
|
if(value > valueset + upvalue)
|
|||
|
|
{
|
|||
|
|
os<<"高于上限--实时值: "<<value<<"--上限: "<<valueset + upvalue;
|
|||
|
|
strcpy(judge[i].AlarmMessage,os.str().c_str());
|
|||
|
|
os.clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
jsonData.append(singledata);
|
|||
|
|
|
|||
|
|
//报警数据写入数据库
|
|||
|
|
if (singledata["level"] == 1)
|
|||
|
|
{
|
|||
|
|
db_where = " WHERE id is not null ";
|
|||
|
|
char *dbMsg = AlarmMsg->openSetDB(db_where.c_str(), db_order.c_str());
|
|||
|
|
if (dbMsg != NULL)
|
|||
|
|
{
|
|||
|
|
d.Error() << "Can not open T_AlARM_MSG dbMsg= " << dbMsg << endl;
|
|||
|
|
AlarmMsg->closeSetDB();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
int seq = 1;
|
|||
|
|
dbMsg = AlarmMsg->getSetDB();
|
|||
|
|
if (dbMsg == NULL)
|
|||
|
|
{
|
|||
|
|
seq = AlarmMsg->Id() + 1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
d.Error() << "填入序号报错, dbMsg=" << dbMsg << endl;
|
|||
|
|
}
|
|||
|
|
string coild = (*mp_trk)(judge[i].ZoneName)->entId;
|
|||
|
|
if(coild == "") continue;
|
|||
|
|
// d.Info()<<"ZoneName: "<<judge[i].ZoneName<<"entid: "<<coild<<endl;
|
|||
|
|
db_where = "where coilid = '" + coild + "' and MSG_ITEM like '" + judge[i].AlarmTerm + "%'";
|
|||
|
|
// d.Debug()<<"db_where:"<<db_where<<endl;
|
|||
|
|
dbMsg = AlarmMsg->openSetDB(db_where.c_str(), db_order.c_str());
|
|||
|
|
if (dbMsg != NULL)
|
|||
|
|
{
|
|||
|
|
d.Error() << "Can not open T_AlARM_MSG dbMsg= " << dbMsg << endl;
|
|||
|
|
AlarmMsg->closeSetDB();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
dbMsg = AlarmMsg->getSetDB();
|
|||
|
|
if(dbMsg != NULL)
|
|||
|
|
{
|
|||
|
|
d.Info()<<"dbmsg: "<<dbMsg<<endl;
|
|||
|
|
}
|
|||
|
|
TCMTime ptime(AlarmMsg->Time());
|
|||
|
|
time_t now = time(0);
|
|||
|
|
//d.Debug()<<"now:"<<now<<" ptime:"<<ptime.GetSec70()<<endl;
|
|||
|
|
if(dbMsg != NULL || now - ptime.GetSec70() > 60*4 )
|
|||
|
|
{
|
|||
|
|
AlarmMsg->initInsertKeys(seq);
|
|||
|
|
AlarmMsg->set_ZoneNo(judge[i].ZoneName);
|
|||
|
|
AlarmMsg->set_Text(judge[i].AlarmMessage);
|
|||
|
|
AlarmMsg->set_msg_item(judge[i].AlarmTerm);
|
|||
|
|
AlarmMsg->set_ZoneName(judge[i].AlarmPos);
|
|||
|
|
AlarmMsg->set_CoilId((*mp_trk)(judge[i].ZoneName)->entId);
|
|||
|
|
AlarmMsg->set_Spare1(judge[i].CheckItem);
|
|||
|
|
AlarmMsg->set_Time((char *)TCMTime::Now().ToString().c_str());
|
|||
|
|
AlarmMsg->set_wplenstart((*mp_trk)(judge[i].ZoneName)->wplen/1000);
|
|||
|
|
AlarmMsg->set_wplenstop((*mp_trk)(judge[i].ZoneName)->wplen/1000);
|
|||
|
|
dbMsg = AlarmMsg->insertDB();
|
|||
|
|
if (dbMsg != NULL)
|
|||
|
|
{
|
|||
|
|
d.Error() << "Insert T_AlARM_MSG failed, dbMsg=" << dbMsg << endl;
|
|||
|
|
AlarmMsg->closeSetDB();
|
|||
|
|
AlarmMsg->dbRollback();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AlarmMsg->closeSetDB();
|
|||
|
|
AlarmMsg->dbCommit();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AlarmMsg->closeSetDB();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} //报警项数据库处理结束
|
|||
|
|
}
|
|||
|
|
stringstream strs;
|
|||
|
|
strs << jsonData;
|
|||
|
|
// d.Debug() << strs.str() << std::endl;
|
|||
|
|
this->Proxy(EV_MQP_RULEMSG,"baosight/zmqp",strs.str().c_str(),strs.str().length());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
double DataAlarm::getItemValue(string item)
|
|||
|
|
{
|
|||
|
|
LOG d("DataAlarm::getItemValue");
|
|||
|
|
p_tele->ReBuild(2000);
|
|||
|
|
int index = p_tele->GetItemIndex(item);
|
|||
|
|
// d.Info()<<"index: "<<index<<endl;
|
|||
|
|
if(index != -1)
|
|||
|
|
{
|
|||
|
|
CMemTable<FDA_DATA> tele(StringHelper::ToString<int>(2000), 2);
|
|||
|
|
FDA_DATA *mp_data = tele();
|
|||
|
|
double value = (*mp_data)[index];
|
|||
|
|
//d.Debug() << "Item = " << item << ", value = " << value << std::endl;
|
|||
|
|
return value;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
d.Debug()<<"Don't find item"<<endl;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
short DataAlarm::Proxy(int eventNo,const string& proxyName, const char* keyValue,int length)
|
|||
|
|
{
|
|||
|
|
LOG d("DataAlarm::Proxy");
|
|||
|
|
if (keyValue == NULL)
|
|||
|
|
{
|
|||
|
|
d.Error()<<"NULL POINTER"<<endl;
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
::Ice::ByteSeq sendData(keyValue,keyValue+length);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
ProxyMag::GetAppICEPrx(proxyName)->SendDataShort(eventNo,sendData,sendData.size());
|
|||
|
|
d.Info("send to %s ok",proxyName.c_str());
|
|||
|
|
}
|
|||
|
|
catch( ::Ice::LocalException& e)
|
|||
|
|
{
|
|||
|
|
d.Error()<< "SendSeq error:"<<e<<endl;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|