eis/eqpalg/algs/exp_bound.cpp
Huamonarch 3f8d281596 fix: 清理 ExpBase 子类中的 exp_act_/exp_feedback_/exp_result_ 残留引用
将 exp_bound、exp_times、exp_sample2D 中对已删除成员的引用替换为
expr_engine_->evaluate()/evaluateBool() 调用。
exp_sample2D 中原来绑定 exp_feedback_ 和 exp_result_ 的 sample_X/sample_Y
表达式现在通过 expr_engine_->registerExpression() 注册。
2026-05-15 13:14:17 +08:00

143 lines
4.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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() {
}
AlarmInfo ExpBound::mon_proc() {
if (expr_engine_->evaluateBool("feedback") == false) {
logger_->Debug() << "前提条件不满足!" << std::endl;
return AlarmInfo{};
}
/*最新数据*/
double now_value = expr_engine_->evaluate("act");
rule_stat_.current_value = now_value;
/*报警检查*/
if (now_value > limit_warn_) {
std::string msg = "";
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;
}