195 lines
6.7 KiB
C++
195 lines
6.7 KiB
C++
|
||
#include <base/BitTool.h>
|
||
#include <eqpalg/algs/roller2.h>
|
||
#include <eqpalg/exp_macro/get_macro_replaced_exp.h>
|
||
#include <eqpalg/feature_extraction/daa.h>
|
||
#include <eqpalg/utility/build_alarm_info.h>
|
||
#include <algorithm>
|
||
#include <limits>
|
||
#include <string>
|
||
#include <utility>
|
||
#include <vector>
|
||
#include "mix_cc/ihyper_db.h"
|
||
// 炉辊组算法无需额外的算法初始化步骤
|
||
int Roller2::init() {
|
||
int res = 0;
|
||
try {
|
||
res += AlgBase::init();
|
||
if (rule_json_.at("output").contains("error")) {
|
||
try {
|
||
error_str_ =
|
||
rule_json_.at("output").at("error").at("value").get<std::string>();
|
||
} catch (const std::exception& e) {
|
||
logger_->Error() << "output,error出错:" << e.what()
|
||
<< ",location:" << BOOST_CURRENT_LOCATION << endl;
|
||
error_message_str_ += "报警内容格式异常!";
|
||
return -1;
|
||
}
|
||
}
|
||
res += this->first_fill_mm_vars();
|
||
res += this->reload_config_data_source(); /*3.数据源*/
|
||
res += init_X_exp();
|
||
|
||
print_load_content();
|
||
} catch (const std::exception& e) {
|
||
std::throw_with_nested(
|
||
mix_cc::Exception(-1, "load error", BOOST_CURRENT_LOCATION));
|
||
}
|
||
if (res == 0) {
|
||
this->exp_is_wrong_ = false;
|
||
}
|
||
return res;
|
||
}
|
||
|
||
Roller2::Roller2(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("Roller2:" + rule_name_, AUTO_CATCH_PID));
|
||
}
|
||
|
||
Roller2::~Roller2() {
|
||
// AlgBase::~AlgBase();
|
||
}
|
||
|
||
AlarmInfo Roller2::mon_proc() {
|
||
refresh_var_result();
|
||
if (!pre_exp_flag_) {
|
||
return AlarmInfo{};
|
||
}
|
||
int Xsize = var_Xdouble_.size();
|
||
double avg = 0;
|
||
for (auto& exp_value : var_Xdouble_) {
|
||
avg += exp_value.second;
|
||
}
|
||
avg = avg / double(Xsize);
|
||
limit_down_ = avg - std::fabs(avg) * limit_over_;
|
||
limit_up_ = avg + std::fabs(avg) * limit_over_;
|
||
this->rule_stat_.limit_down = limit_down_;
|
||
this->rule_stat_.limit_up = limit_up_;
|
||
for (auto& exp_value : var_Xdouble_) {
|
||
rule_stat_.current_value = exp_value.second; ///<共享内存
|
||
logger_->Debug() << var_name_[exp_value.first] + ":" +
|
||
DAA::double2str(exp_value.second, 3) +
|
||
",合理区间:[" + DAA::double2str(limit_down_, 3) +
|
||
"," + DAA::double2str(limit_up_, 3) + "]"
|
||
<< std::endl;
|
||
if (exp_value.second > this->rule_stat_.limit_up ||
|
||
exp_value.second < this->rule_stat_.limit_down) {
|
||
std::string msg = "";
|
||
msg = error_str_ + "," + var_name_[exp_value.first] + ":" +
|
||
DAA::double2str(exp_value.second, 3) + ",合理区间:[" +
|
||
DAA::double2str(limit_down_, 3) + "," +
|
||
DAA::double2str(limit_up_, 3) + "]";
|
||
auto alarm_time = query_time_range_;
|
||
// if (alarm_time.get_right() - alarm_time.get_left() < minutes(2)) {
|
||
alarm_time.set_left(alarm_time.get_right() - minutes(2));
|
||
// }
|
||
return utility::build_alarm_info(
|
||
utility::get_msg_level(limit_down_, limit_up_, exp_value.second),
|
||
rule_id_, rule_name_, "EXP9", msg, alarm_time);
|
||
}
|
||
}
|
||
return AlarmInfo{};
|
||
}
|
||
std::vector<AlarmInfo> Roller2::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 Roller2::print_load_content() {
|
||
int exp_size = var_exp_str_.size();
|
||
for (auto& exp_str : var_exp_str_) {
|
||
logger_->Debug() << exp_str.first << ":" << exp_str.second << ",";
|
||
}
|
||
for (auto& name : var_name_) {
|
||
logger_->Debug() << name.first << ":" << name.second << ",";
|
||
}
|
||
logger_->Debug() << std::endl;
|
||
}
|
||
|
||
int Roller2::init_X_exp() {
|
||
int res = 0;
|
||
|
||
for (auto& exp_stri : ExpStr) {
|
||
if (rule_json_.at("function").contains(exp_stri)) {
|
||
auto tmp_exp =
|
||
rule_json_.at("function").at(exp_stri).at("value").get<std::string>();
|
||
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
||
var_exp_str_[exp_stri] = exp_str_;
|
||
res += init_hold_exp_str(exp_str_);
|
||
feedback_mode_ = true;
|
||
auto messy_code = exp_messy_code_check(exp_str_);
|
||
if (messy_code == -1) {
|
||
this->error_code_list_.push_back(
|
||
{ErrorType::EnCodeError, ErrorLocation::ActExp});
|
||
res += messy_code;
|
||
return -1;
|
||
}
|
||
try {
|
||
var_exp_[exp_stri] =
|
||
std::make_unique<mix_cc::matheval::Expression>(exp_str_, &mm_vars);
|
||
logger_->Debug() << "exp_stri:" << exp_str_ << "="
|
||
<< var_exp_[exp_stri]->evaluate() << endl;
|
||
} catch (const std::exception& e) {
|
||
logger_->Error() << "exp_stri:" << exp_str_ << "计算出错:" << e.what()
|
||
<< ",location:" << BOOST_CURRENT_LOCATION << endl;
|
||
this->error_code_list_.push_back(
|
||
{ErrorType::CalError, ErrorLocation::FBExp});
|
||
return -1;
|
||
}
|
||
if (rule_json_.at("function").at(exp_stri).at("param").contains("name")) {
|
||
var_name_[exp_stri] = rule_json_.at("function")
|
||
.at(exp_stri)
|
||
.at("param")
|
||
.at("name")
|
||
.at("value")
|
||
.get<std::string>();
|
||
} else if (rule_json_.at("function")
|
||
.at(exp_stri)
|
||
.at("param")
|
||
.contains("limit_over")) {
|
||
try {
|
||
limit_over_ = std::stod(rule_json_.at("function")
|
||
.at(exp_stri)
|
||
.at("param")
|
||
.at("limit_over")
|
||
.at("value")
|
||
.get<std::string>()) /
|
||
100.00;
|
||
} catch (const std::exception& e) {
|
||
logger_->Error() << "exp_stri:" << exp_stri
|
||
<< "param limit_over ERROR:" << e.what()
|
||
<< ",location:" << BOOST_CURRENT_LOCATION << endl;
|
||
return -1;
|
||
}
|
||
}
|
||
} else {
|
||
logger_->Debug() << "init_X_exp() 完成!" << std::endl;
|
||
break;
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
void Roller2::refresh_var_result() {
|
||
try {
|
||
for (auto& expi : var_exp_) {
|
||
if (expi.first == "pre_exp") {
|
||
pre_exp_flag_ = expi.second->evaluate();
|
||
} else {
|
||
var_Xdouble_[expi.first] = expi.second->evaluate();
|
||
}
|
||
}
|
||
} catch (const std::exception& e) {
|
||
logger_->Error() << "refresh_var_result ERROR:" << e.what()
|
||
<< ",location:" << BOOST_CURRENT_LOCATION << endl;
|
||
}
|
||
}
|