147 lines
4.6 KiB
C++
147 lines
4.6 KiB
C++
|
||
#include "mix_cc/ihyper_db.h"
|
||
#include <algorithm>
|
||
#include <base/BitTool.h>
|
||
#include <eqpalg/algs/exp_bound.h>>
|
||
#include <eqpalg/exp_macro/get_macro_replaced_exp.h>
|
||
#include <eqpalg/feature_extraction/daa.h>
|
||
#include <eqpalg/utility/build_alarm_info.h>
|
||
#include <limits>
|
||
#include <string>
|
||
#include <utility>
|
||
#include <vector>
|
||
int ExpBound::init() {
|
||
int res = 0;
|
||
try {
|
||
res += AlgBase::init();
|
||
this->con_monitor_.setThreshold(100);
|
||
logger_->Debug() << "res:" << res << std::endl;
|
||
if (res != 0) {
|
||
this->exp_is_wrong_ = true;
|
||
return -1;
|
||
}
|
||
res += this->reload_config_data_source(); /*3.数据源*/
|
||
logger_->Debug() << "数据来源,0:iHyperDB,1:memory:" << this->data_source_
|
||
<< ",单位unit_:" << unit_ << std::endl;
|
||
res += this->first_fill_mm_vars(); /*4.数据项*/
|
||
res += init_X_exp();
|
||
rule_stat_.unit = unit_;
|
||
rule_stat_.limit_down = -32768; ///<下限 无限制
|
||
limit_down_ = -32768;
|
||
limit_up_ = limit_warn_;
|
||
rule_stat_.limit_up = limit_warn_;
|
||
print_load_content();
|
||
} catch (const std::exception &e) {
|
||
std::throw_with_nested(
|
||
mix_cc::Exception(-1, "load error", BOOST_CURRENT_LOCATION));
|
||
}
|
||
if (res == 0 || limit_warn_ > limit_error_) {
|
||
this->exp_is_wrong_ = false;
|
||
}
|
||
return res;
|
||
}
|
||
|
||
ExpBound::ExpBound(const string &name, const mix_cc::json &rule_json,
|
||
const string &ruleId, size_t exp_type)
|
||
: ExpBase(name, rule_json, ruleId, exp_type) {
|
||
logger_.reset(new LOG("ExpBound:" + rule_name_, AUTO_CATCH_PID));
|
||
}
|
||
|
||
ExpBound::~ExpBound() {
|
||
// AlgBase::~AlgBase();
|
||
}
|
||
|
||
AlarmInfo ExpBound::mon_proc() {
|
||
|
||
if ((bool)exp_feedback_->evaluate() == false) {
|
||
logger_->Debug() << "前提条件不满足!" << std::endl;
|
||
return AlarmInfo{};
|
||
}
|
||
|
||
/*最新数据*/
|
||
double now_value = exp_act_->evaluate();
|
||
|
||
rule_stat_.current_value = now_value;
|
||
/*报警检查*/
|
||
if (now_value > limit_warn_) {
|
||
std::string msg = "";
|
||
// msg = error_str_ + ",当前值:" + DAA::double2str(now_value) + unit_ +
|
||
// ",合理区间:[" + DAA::double2strLimit(limit_down_) + "," +
|
||
// DAA::double2strLimit(limit_up_) + "] " + unit_;
|
||
msg = error_str_ + ",当前值:" + DAA::double2str(now_value) + unit_ + ",超";
|
||
auto alarm_time = get_alarm_time();
|
||
print_exp_vars();
|
||
|
||
if (now_value > limit_error_) {
|
||
msg += "报警值:" + DAA::double2str(limit_error_) + unit_;
|
||
logger_->Debug() << msg << endl;
|
||
return utility::build_alarm_info("ERROR", rule_id_, rule_name_, "EXP17",
|
||
msg, alarm_time);
|
||
}
|
||
msg += "警告值:" + DAA::double2str(limit_warn_) + unit_;
|
||
logger_->Debug() << msg << endl;
|
||
return utility::build_alarm_info("WARN", rule_id_, rule_name_, "EXP17", msg,
|
||
alarm_time);
|
||
}
|
||
|
||
return AlarmInfo{};
|
||
}
|
||
|
||
std::vector<AlarmInfo> ExpBound::exec_task(mix_cc::time_range_t time_range) {
|
||
std::vector<AlarmInfo> result;
|
||
for (auto now_time = time_range.get_left();
|
||
now_time <= time_range.get_right(); now_time += delay_time_) {
|
||
this->now_time_ = now_time;
|
||
auto rr1 = this->exec_mon();
|
||
result.push_back(rr1);
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
void ExpBound::print_load_content() {
|
||
logger_->Debug() << "limit_warn_:" << limit_warn_ << ",limit_error_"
|
||
<< limit_error_ << ",exp_str_:" << exp_str_
|
||
<< ",value_exp_str_:" << value_exp_str_ << std::endl;
|
||
}
|
||
|
||
int ExpBound::init_X_exp() {
|
||
int res = 0;
|
||
res = +ExpBase::reload_config_exp_act();
|
||
|
||
if (rule_json_.at("function")
|
||
.at("result")
|
||
.at("param")
|
||
.contains("limit_error")) {
|
||
|
||
limit_error_ = std::stod(rule_json_.at("function")
|
||
.at("result")
|
||
.at("param")
|
||
.at("limit_error")
|
||
.at("value")
|
||
.get<std::string>());
|
||
}
|
||
if (rule_json_.at("function")
|
||
.at("result")
|
||
.at("param")
|
||
.contains("limit_warn")) {
|
||
limit_warn_ = std::stod(rule_json_.at("function")
|
||
.at("result")
|
||
.at("param")
|
||
.at("limit_warn")
|
||
.at("value")
|
||
.get<std::string>());
|
||
}
|
||
|
||
if (rule_json_.at("function").at("result").at("param").contains("unit")) {
|
||
unit_ = rule_json_.at("function")
|
||
.at("result")
|
||
.at("param")
|
||
.at("unit")
|
||
.at("value")
|
||
.get<std::string>();
|
||
}
|
||
|
||
return res;
|
||
}
|