175 lines
6.7 KiB
C++
175 lines
6.7 KiB
C++
|
|
#include <base/BitTool.h>
|
|
#include <eqpalg/algs/AlgCommon.h>
|
|
#include <utility/StringHelper.h>
|
|
int AlgCommon::init() {
|
|
LOG d("AlgCommon::init", AUTO_CATCH_PID);
|
|
int ret = 0;
|
|
try {
|
|
} catch (const std::exception &e) {
|
|
d.Error() << mix_cc::get_nested_exception(e) << std::endl;
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
AlgCommon::AlgCommon(const string name, const Json::Value rulejson,
|
|
const string ruleId)
|
|
: AlgBase(name, rulejson, ruleId) {
|
|
// CMemTable<MOD_CACHE> mod1("ZONE0",1);
|
|
// gb_data = mod1();
|
|
LOG d("AlgCommon::AlgCommon", AUTO_CATCH_PID);
|
|
this->init();
|
|
memset(&timeRegion, 0, sizeof(timeRegion));
|
|
timeRegion.bLeftClosed = true;
|
|
timeRegion.bRightClosed = true;
|
|
this->set_cycle_time(max(50, m_json_param["check"]["time"][1].asInt()));
|
|
records_queried_ = new HD3Record *[m_tags.size()];
|
|
for (unsigned int i = 0; i < m_tags.size(); i++) {
|
|
string tag = "tag" + std::to_string(i + 1);
|
|
m_vars[tag] = 0.0;
|
|
}
|
|
string expdata(m_json_param["action_condition"]["str"][1].asString());
|
|
mp_exp = new MathExpression(expdata.c_str(), m_vars);
|
|
// d.Debug() << "mp_exp: " << expdata << ",ret:"<<mp_exp->evaluate()<< endl;
|
|
}
|
|
|
|
AlgCommon::~AlgCommon() {
|
|
delete[] records_queried_;
|
|
delete mp_exp;
|
|
}
|
|
|
|
int AlgCommon::calculate(string &outjson) {
|
|
LOG d("AlgCommon::calculate", AUTO_CATCH_PID);
|
|
outjson = "";
|
|
|
|
int ret = 0;
|
|
try {
|
|
time_t m_curr = this->mstime();
|
|
int dltime = m_json_param["check"]["time"][1].asInt();
|
|
time_t m_start = m_curr - dltime;
|
|
time_t m_end = m_curr;
|
|
timeRegion.left.nSec = m_start / 1000;
|
|
timeRegion.left.nMsec = m_start % 1000;
|
|
timeRegion.right.nSec = m_end / 1000;
|
|
timeRegion.right.nMsec = m_end % 1000;
|
|
int min_tagCnt = INT_MAX;
|
|
for (unsigned int i = 0; i < m_tags.size(); i++) {
|
|
int tagcnt = ihd_tools_->GetDataCount(m_tags[i], timeRegion);
|
|
// records_queried_[i] = new HD3Record[tagcnt];
|
|
if (tagcnt < 1) {
|
|
d.Debug() << rule_name_ << " : " << m_tags[i] << " tagcnt = 0 ! " << endl;
|
|
return 0;
|
|
}
|
|
min_tagCnt = min(min_tagCnt, tagcnt);
|
|
}
|
|
// d.Debug() << rule_name_ << " diff: " << m_end - m_start << " cnt: " <<
|
|
// min_tagCnt << " v: " << (m_end - m_start) / (min_tagCnt + 1) << endl;
|
|
// if((m_end - m_start) / (min_tagCnt + 1) > IHD_FREQUENCY * 1.1){
|
|
// //d.Debug() << " 该时间段内IHDB数据不完整! " << endl;
|
|
// //d.Debug() << rule_name_ << " 该时间段内IHDB数据不完整! " << " diff: " <<
|
|
// m_end - m_start << " cnt: " << min_tagCnt << " v: " << (m_end -
|
|
// m_start) / (min_tagCnt + 1) << endl; return 0;
|
|
// }
|
|
for (unsigned int i = 0; i < m_tags.size(); i++) {
|
|
records_queried_[i] = new HD3Record[min_tagCnt];
|
|
ret = ihd_tools_->QueryDataByTime(m_tags[i], records_queried_[i],
|
|
timeRegion, &min_tagCnt);
|
|
}
|
|
string str_changed = m_json_param["changed_parm"]["list"][1].asString();
|
|
string str_unchanged = m_json_param["unchanged_parm"]["list"][1].asString();
|
|
string msg = m_json_param["limit_error"]["content"][1].asString() + " ";
|
|
bool m_flag = false;
|
|
for (int j = 0; j < min_tagCnt; j++) {
|
|
for (unsigned int i = 0; i < m_tags.size(); i++) {
|
|
string tag = "tag" + std::to_string(i + 1);
|
|
m_vars[tag] = ((records_queried_[i][j].nTagType == 0)
|
|
? records_queried_[i][j].value.nInt8
|
|
: records_queried_[i][j].value.fFloat32);
|
|
}
|
|
double ret = mp_exp->evaluate();
|
|
// d.Debug() << "exp: " << mp_exp->Disassemble() << " ret: " << ret <<
|
|
// endl; d.Debug() << " ret: " << ret << endl;
|
|
if (fabs(ret - m_json_param["action_condition"]["result"][1].asDouble()) > EPS) {
|
|
//表达式条件不满足
|
|
m_flag = true;
|
|
break;
|
|
}
|
|
}
|
|
for (unsigned int i = 0; i < m_tags.size(); i++) {
|
|
delete[] records_queried_[i];
|
|
}
|
|
if (m_flag) {
|
|
return 0;
|
|
}
|
|
if (!str_changed.empty()) {
|
|
for (int i = m_tags.size() - 1; i >= 0; i--) {
|
|
string tag = "tag" + std::to_string(i + 1);
|
|
string::size_type pos = 0;
|
|
if ((pos = str_changed.find(tag)) != string::npos) {
|
|
//检测变量的最大最小值
|
|
double m_max =
|
|
ihd_tools_->StatsTag(m_tags[i], m_start, m_end, HD3_STATS_TYPE_MAX);
|
|
double m_min =
|
|
ihd_tools_->StatsTag(m_tags[i], m_start, m_end, HD3_STATS_TYPE_MIN);
|
|
if (m_max - m_min >
|
|
m_json_param["changed_parm"]["range"][1].asDouble()) {
|
|
string tagname = m_json_param["tags"][tag][2].asString();
|
|
msg = msg + " " + tagname + "有变化" +
|
|
" max: " + std::to_string(m_max) +
|
|
" min: " + std::to_string(m_min) +
|
|
",差值: " + std::to_string(m_max - m_min);
|
|
// msg = msg + " " + tagname + "有变化";
|
|
} else {
|
|
// d.Debug() << rule_name_ << " 数据正常! " << endl;
|
|
return 0;
|
|
}
|
|
// str_changed = str_changed.replace(pos,
|
|
// tag.size(),"",AUTO_CATCH_PID);
|
|
}
|
|
}
|
|
}
|
|
if (!str_unchanged.empty()) {
|
|
for (int i = m_tags.size() - 1; i >= 0; i--) {
|
|
string tag = "tag" + std::to_string(i + 1);
|
|
string::size_type pos = 0;
|
|
if ((pos = str_unchanged.find(tag)) != string::npos) {
|
|
//检测变量的最大最小值
|
|
double m_max =
|
|
ihd_tools_->StatsTag(m_tags[i], m_start, m_end, HD3_STATS_TYPE_MAX);
|
|
double m_min =
|
|
ihd_tools_->StatsTag(m_tags[i], m_start, m_end, HD3_STATS_TYPE_MIN);
|
|
// d.Debug() << rule_name_ << " max: " << m_max << " min: " << m_min <<
|
|
// endl;
|
|
if (fabs(m_max - m_min -
|
|
m_json_param["unchanged_parm"]["range"][1].asDouble()) <
|
|
EPS) {
|
|
string tagname = m_json_param["tags"][tag][2].asString();
|
|
// msg = msg + " " + tagname + "在" +
|
|
// std::to_string(dltime) + "ms内" + "未发生变化! ";
|
|
msg = msg + " " + tagname + "在" +
|
|
std::to_string(dltime) + "ms内" +
|
|
"未发生变化! " +
|
|
",值为: " + std::to_string(m_max);
|
|
} else {
|
|
// d.Debug() << rule_name_ << " 数据正常! " << endl;
|
|
return 0;
|
|
}
|
|
// str_unchanged = str_unchanged.replace(pos,
|
|
// tag.size(),"",AUTO_CATCH_PID);
|
|
}
|
|
}
|
|
}
|
|
// d.Debug() << msg << endl;
|
|
string tmp = this->build_alarm_info(MsgLevel::ERROR, rule_id_, rule_name_, "COMMON",
|
|
msg, timeRegion);
|
|
if (!tmp.empty())
|
|
outjson = tmp;
|
|
|
|
} catch (const std::exception &e) {
|
|
d.Error() << mix_cc::get_nested_exception(e) << std::endl;
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|