refactor: ExpBase 表达式管理迁移到 ExpressionEngine
This commit is contained in:
parent
96ca4d02bb
commit
7c2fe7f7bb
@ -16,7 +16,6 @@ extern ProcessType glob_process_type;
|
|||||||
ExpBase::ExpBase(const string &name, const mix_cc::json &rule_json,
|
ExpBase::ExpBase(const string &name, const mix_cc::json &rule_json,
|
||||||
const string &ruleId, size_t exp_type)
|
const string &ruleId, size_t exp_type)
|
||||||
: AlgBase(name, rule_json, ruleId), exp_type_(exp_type) {
|
: AlgBase(name, rule_json, ruleId), exp_type_(exp_type) {
|
||||||
is_exp_alg_ = true;
|
|
||||||
logger_.reset(
|
logger_.reset(
|
||||||
new LOG("ExpBase-" + std::to_string(exp_type) + ":" + rule_name_,
|
new LOG("ExpBase-" + std::to_string(exp_type) + ":" + rule_name_,
|
||||||
AUTO_CATCH_PID));
|
AUTO_CATCH_PID));
|
||||||
@ -29,14 +28,13 @@ int ExpBase::init() {
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
try {
|
try {
|
||||||
ret += AlgBase::init(); /*1.tag点;2.执行周期*/
|
ret += AlgBase::init(); /*1.tag点;2.执行周期*/
|
||||||
fun_vars_init();
|
|
||||||
this->con_monitor_.setThreshold(100);
|
this->con_monitor_.setThreshold(100);
|
||||||
// 重新载入数据源配置信息
|
// 重新载入数据源配置信息
|
||||||
ret += this->reload_config_data_source(); /*3.数据源*/
|
ret += this->reload_config_data_source(); /*3.数据源*/
|
||||||
// 在载入数据源信息完成后,载入表达式配置之前,必须刷新变量,把变量信息初始化到mm_vars内
|
// 在载入数据源信息完成后,载入表达式配置之前,必须刷新变量,把变量信息初始化到mm_vars内
|
||||||
if (glob_process_type == ProcessType::kMon ||
|
if (glob_process_type == ProcessType::kMon ||
|
||||||
glob_process_type == ProcessType::kTask) {
|
glob_process_type == ProcessType::kTask) {
|
||||||
ret += this->first_fill_mm_vars(); /*4.数据项*/
|
ret += expr_engine_->firstFill(data_source_, now_time_, query_time_range_); /*4.数据项*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// 必须在刷新变量后,才可以初始化表达式
|
// 必须在刷新变量后,才可以初始化表达式
|
||||||
@ -110,9 +108,9 @@ AlarmInfo ExpBase::exec_mon() {
|
|||||||
// 并判断是否报警
|
// 并判断是否报警
|
||||||
case DataSource::MEMORY: {
|
case DataSource::MEMORY: {
|
||||||
try {
|
try {
|
||||||
refresh_exp_vars_mem();
|
expr_engine_->refreshFromMemory(now_time_, query_time_range_);
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
logger_->Error() << rule_id_ << ":refresh_exp_vars_mem()异常!"
|
logger_->Error() << rule_id_ << ":refreshFromMemory()异常!"
|
||||||
<< e.what() << ",location:" << BOOST_CURRENT_LOCATION
|
<< e.what() << ",location:" << BOOST_CURRENT_LOCATION
|
||||||
<< endl;
|
<< endl;
|
||||||
return out_alarm;
|
return out_alarm;
|
||||||
@ -130,7 +128,7 @@ AlarmInfo ExpBase::exec_mon() {
|
|||||||
refresh_ihd_cache();
|
refresh_ihd_cache();
|
||||||
// 然后刷以此把缓存中的数据取出
|
// 然后刷以此把缓存中的数据取出
|
||||||
for (auto i = 0; i < queried_data_.rows(); i++) {
|
for (auto i = 0; i < queried_data_.rows(); i++) {
|
||||||
refresh_exp_vars_ihd(i);
|
expr_engine_->refreshFromIhdRow(i, queried_data_, queried_time_, now_time_, query_time_range_);
|
||||||
if (!out_alarm.alarmed) {
|
if (!out_alarm.alarmed) {
|
||||||
auto tmp = mon_proc();
|
auto tmp = mon_proc();
|
||||||
if (tmp.alarmed) {
|
if (tmp.alarmed) {
|
||||||
@ -234,7 +232,7 @@ std::vector<AlarmInfo> ExpBase::exec_task(mix_cc::time_range_t time_range) {
|
|||||||
refresh_ihd_cache();
|
refresh_ihd_cache();
|
||||||
}
|
}
|
||||||
for (auto i = 0; i < queried_data_.rows(); i++) {
|
for (auto i = 0; i < queried_data_.rows(); i++) {
|
||||||
refresh_exp_vars_ihd(i);
|
expr_engine_->refreshFromIhdRow(i, queried_data_, queried_time_, now_time_, query_time_range_);
|
||||||
}
|
}
|
||||||
// 对每个ihdb 查询周期的数据,进行处理
|
// 对每个ihdb 查询周期的数据,进行处理
|
||||||
for (auto now_time = time_range.get_left();
|
for (auto now_time = time_range.get_left();
|
||||||
@ -248,7 +246,7 @@ std::vector<AlarmInfo> ExpBase::exec_task(mix_cc::time_range_t time_range) {
|
|||||||
refresh_ihd_cache();
|
refresh_ihd_cache();
|
||||||
}
|
}
|
||||||
for (auto i = 0; i < queried_data_.rows(); i++) {
|
for (auto i = 0; i < queried_data_.rows(); i++) {
|
||||||
refresh_exp_vars_ihd(i);
|
expr_engine_->refreshFromIhdRow(i, queried_data_, queried_time_, now_time_, query_time_range_);
|
||||||
auto tmp = mon_proc();
|
auto tmp = mon_proc();
|
||||||
if (tmp.alarmed) {
|
if (tmp.alarmed) {
|
||||||
out_alarms.push_back(tmp);
|
out_alarms.push_back(tmp);
|
||||||
@ -274,23 +272,18 @@ AlarmInfo ExpBase::mon_proc() {
|
|||||||
// 监控基本过程
|
// 监控基本过程
|
||||||
double result_value;
|
double result_value;
|
||||||
filter_flag_ = false;
|
filter_flag_ = false;
|
||||||
auto_fun_vars_reset();
|
expr_engine_->autoResetFunVars();
|
||||||
try {
|
try {
|
||||||
// 获得是否满足前提条件表达式
|
// 获得是否满足前提条件表达式
|
||||||
result_value = exp_act_->evaluate();
|
result_value = expr_engine_->evaluate("act");
|
||||||
if (exp_type_ == ExpType::Bound || exp_type_ == ExpType::BoundHoldTime) {
|
if (exp_type_ == ExpType::Bound || exp_type_ == ExpType::BoundHoldTime) {
|
||||||
if (exp_feedback_ != nullptr) {
|
|
||||||
/*有数据筛选*/
|
|
||||||
try {
|
try {
|
||||||
if (exp_feedback_->evaluate()) {
|
/*有数据筛选*/
|
||||||
filter_flag_ = true;
|
filter_flag_ = expr_engine_->evaluateBool("feedback");
|
||||||
}
|
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
logger_->Debug() << "ruleid:" << rule_id_ << ",exp_feedback_ ERROR!"
|
|
||||||
<< endl;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/*无数据筛选*/
|
/*无数据筛选*/
|
||||||
|
logger_->Debug() << "ruleid:" << rule_id_ << ",feedback evaluate ERROR!"
|
||||||
|
<< endl;
|
||||||
filter_flag_ = true;
|
filter_flag_ = true;
|
||||||
}
|
}
|
||||||
if (is_learning_ && filter_flag_ == true) {
|
if (is_learning_ && filter_flag_ == true) {
|
||||||
@ -307,7 +300,7 @@ AlarmInfo ExpBase::mon_proc() {
|
|||||||
if (act_start_done()) {
|
if (act_start_done()) {
|
||||||
if (rule_id_ == string(CMemVar::Const()->printRuleid)) {
|
if (rule_id_ == string(CMemVar::Const()->printRuleid)) {
|
||||||
logger_->Debug() << "act_start_done!" << std::endl;
|
logger_->Debug() << "act_start_done!" << std::endl;
|
||||||
print_exp_vars();
|
expr_engine_->printVars();
|
||||||
}
|
}
|
||||||
return AlarmInfo{};
|
return AlarmInfo{};
|
||||||
}
|
}
|
||||||
@ -317,9 +310,9 @@ AlarmInfo ExpBase::mon_proc() {
|
|||||||
logger_->Debug()
|
logger_->Debug()
|
||||||
<< "act_not_hold!---fun_vars_.refresh_fun_vars---start"
|
<< "act_not_hold!---fun_vars_.refresh_fun_vars---start"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
print_exp_vars();
|
expr_engine_->printVars();
|
||||||
}
|
}
|
||||||
is_fun_vars_need_reset_ = true;
|
expr_engine_->markFunVarsNeedReset();
|
||||||
return AlarmInfo{};
|
return AlarmInfo{};
|
||||||
}
|
}
|
||||||
if (act_done()) {
|
if (act_done()) {
|
||||||
@ -327,12 +320,12 @@ AlarmInfo ExpBase::mon_proc() {
|
|||||||
this->query_time_range_.set_left(
|
this->query_time_range_.set_left(
|
||||||
query_time_range_.get_right() -
|
query_time_range_.get_right() -
|
||||||
milliseconds(int(mm_vars["time"])));
|
milliseconds(int(mm_vars["time"])));
|
||||||
result_value = exp_result_->evaluate();
|
result_value = expr_engine_->evaluate("result");
|
||||||
is_fun_vars_need_reset_ = true;
|
expr_engine_->markFunVarsNeedReset();
|
||||||
this->rule_stat_.limit_down = limit_down_;
|
this->rule_stat_.limit_down = limit_down_;
|
||||||
this->rule_stat_.limit_up = limit_up_;
|
this->rule_stat_.limit_up = limit_up_;
|
||||||
rule_stat_.current_value = result_value;
|
rule_stat_.current_value = result_value;
|
||||||
print_exp_vars();
|
expr_engine_->printVars();
|
||||||
logger_->Debug() << " action end:"
|
logger_->Debug() << " action end:"
|
||||||
<< mix_cc::mix_time_t(query_time_range_.get_right())
|
<< mix_cc::mix_time_t(query_time_range_.get_right())
|
||||||
.to_formatted_time()
|
.to_formatted_time()
|
||||||
@ -380,7 +373,7 @@ AlarmInfo ExpBase::mon_proc() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else if (act_timeout()) {
|
} else if (act_timeout()) {
|
||||||
is_fun_vars_need_reset_ = true;
|
expr_engine_->markFunVarsNeedReset();
|
||||||
return this->get_timeout_alarm();
|
return this->get_timeout_alarm();
|
||||||
return AlarmInfo{};
|
return AlarmInfo{};
|
||||||
}
|
}
|
||||||
@ -396,7 +389,7 @@ AlarmInfo ExpBase::mon_proc() {
|
|||||||
logger_->Debug() << msg << endl;
|
logger_->Debug() << msg << endl;
|
||||||
this->query_time_range_.set_left(query_time_range_.get_right() -
|
this->query_time_range_.set_left(query_time_range_.get_right() -
|
||||||
delay_time_);
|
delay_time_);
|
||||||
is_fun_vars_need_reset_ = true;
|
expr_engine_->markFunVarsNeedReset();
|
||||||
return utility::build_alarm_info(MsgLevel::ERROR, rule_id_,
|
return utility::build_alarm_info(MsgLevel::ERROR, rule_id_,
|
||||||
rule_name_, "EXP2", msg,
|
rule_name_, "EXP2", msg,
|
||||||
this->get_alarm_time());
|
this->get_alarm_time());
|
||||||
@ -428,10 +421,10 @@ AlarmInfo ExpBase::mon_proc() {
|
|||||||
unit_ + ",合理区间:[" +
|
unit_ + ",合理区间:[" +
|
||||||
DAA::double2strLimit(limit_down_) + "," +
|
DAA::double2strLimit(limit_down_) + "," +
|
||||||
DAA::double2strLimit(limit_up_) + "]" + unit_;
|
DAA::double2strLimit(limit_up_) + "]" + unit_;
|
||||||
print_exp_vars();
|
expr_engine_->printVars();
|
||||||
this->query_time_range_.set_left(query_time_range_.get_right() -
|
this->query_time_range_.set_left(query_time_range_.get_right() -
|
||||||
delay_time_);
|
delay_time_);
|
||||||
is_fun_vars_need_reset_ = true;
|
expr_engine_->markFunVarsNeedReset();
|
||||||
act_start_time_ =
|
act_start_time_ =
|
||||||
this->now_time_;
|
this->now_time_;
|
||||||
act_started_ = false;
|
act_started_ = false;
|
||||||
@ -448,12 +441,12 @@ AlarmInfo ExpBase::mon_proc() {
|
|||||||
else {
|
else {
|
||||||
if (act_triggered_) {
|
if (act_triggered_) {
|
||||||
rule_stat_.alarm_value = act_triggered_;
|
rule_stat_.alarm_value = act_triggered_;
|
||||||
print_exp_vars();
|
expr_engine_->printVars();
|
||||||
auto msg = rule_name_ + " " + error_str_;
|
auto msg = rule_name_ + " " + error_str_;
|
||||||
logger_->Debug() << msg << endl;
|
logger_->Debug() << msg << endl;
|
||||||
this->query_time_range_.set_left(query_time_range_.get_right() -
|
this->query_time_range_.set_left(query_time_range_.get_right() -
|
||||||
delay_time_);
|
delay_time_);
|
||||||
is_fun_vars_need_reset_ = true;
|
expr_engine_->markFunVarsNeedReset();
|
||||||
return utility::build_alarm_info(MsgLevel::ERROR, rule_id_,
|
return utility::build_alarm_info(MsgLevel::ERROR, rule_id_,
|
||||||
rule_name_, "EXP1", msg,
|
rule_name_, "EXP1", msg,
|
||||||
this->get_alarm_time());
|
this->get_alarm_time());
|
||||||
@ -534,7 +527,7 @@ bool ExpBase::act_start_done() {
|
|||||||
<< endl;
|
<< endl;
|
||||||
return true;
|
return true;
|
||||||
} else if (!act_started_ && !act_triggered_) {
|
} else if (!act_started_ && !act_triggered_) {
|
||||||
is_fun_vars_need_reset_ = true;
|
expr_engine_->markFunVarsNeedReset();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -633,7 +626,7 @@ bool ExpBase::act_done() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-----------根据最新变量,计算feedback结果-----------*/
|
/*-----------根据最新变量,计算feedback结果-----------*/
|
||||||
feedback_triggered_ = static_cast<bool>(exp_feedback_->evaluate());
|
feedback_triggered_ = expr_engine_->evaluateBool("feedback");
|
||||||
/*-----------根据最新变量,计算feedback结果-----------*/
|
/*-----------根据最新变量,计算feedback结果-----------*/
|
||||||
|
|
||||||
// 如果动作处于开始状态,且反馈模式触发
|
// 如果动作处于开始状态,且反馈模式触发
|
||||||
@ -730,32 +723,10 @@ int ExpBase::reload_config_exp_feedback() {
|
|||||||
.at("value")
|
.at("value")
|
||||||
.get<std::string>());
|
.get<std::string>());
|
||||||
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
||||||
res += init_hold_exp_str(exp_str_);
|
|
||||||
|
|
||||||
auto fun_res = fun_vars_.add_exp_str(exp_str_, &mm_vars);
|
if (exp_str_ != "") {
|
||||||
res += fun_res.first ? 0 : -1;
|
int reg_ret = expr_engine_->registerExpression("feedback", exp_str_);
|
||||||
exp_str_ = fun_res.second;
|
if (reg_ret != 0) {
|
||||||
if (rule_id_ == "28c1d627-1a8a-426b-9070-eea3c906c53c") {
|
|
||||||
logger_->Debug() << exp_str_ << ",fun_res first:" << fun_res.first
|
|
||||||
<< ",second:" << fun_res.second << std::endl;
|
|
||||||
}
|
|
||||||
auto messy_code = exp_messy_code_check(exp_str_);
|
|
||||||
if (messy_code == -1) {
|
|
||||||
this->error_code_list_.push_back(
|
|
||||||
{ErrorType::EnCodeError, ErrorLocation::FBExp});
|
|
||||||
res += messy_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 构建feedback表达式
|
|
||||||
if (exp_feedback_ == nullptr && exp_str_ != "") {
|
|
||||||
try {
|
|
||||||
exp_feedback_ =
|
|
||||||
std::make_unique<mix_cc::matheval::Expression>(exp_str_, &mm_vars);
|
|
||||||
logger_->Debug() << exp_str_ << ":" << exp_feedback_->evaluate()
|
|
||||||
<< endl;
|
|
||||||
} catch (const std::exception &e) {
|
|
||||||
logger_->Error() << exp_str_ << "计算错误:" << e.what()
|
|
||||||
<< ",location:" << BOOST_CURRENT_LOCATION << endl;
|
|
||||||
this->error_code_list_.push_back(
|
this->error_code_list_.push_back(
|
||||||
{ErrorType::CalError, ErrorLocation::FBExp});
|
{ErrorType::CalError, ErrorLocation::FBExp});
|
||||||
return -1;
|
return -1;
|
||||||
@ -769,29 +740,13 @@ int ExpBase::reload_config_exp_feedback() {
|
|||||||
auto tmp_exp =
|
auto tmp_exp =
|
||||||
rule_json_.at("function").at("result").at("value").get<std::string>();
|
rule_json_.at("function").at("result").at("value").get<std::string>();
|
||||||
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
||||||
res += init_hold_exp_str(exp_str_);
|
|
||||||
|
|
||||||
auto fun_res = fun_vars_.add_exp_str(exp_str_, &mm_vars);
|
if (exp_str_ != "") {
|
||||||
res += fun_res.first ? 0 : -1;
|
int reg_ret = expr_engine_->registerExpression("result", exp_str_);
|
||||||
exp_str_ = fun_res.second;
|
if (reg_ret != 0) {
|
||||||
auto messy_code = exp_messy_code_check(exp_str_);
|
|
||||||
if (messy_code == -1) {
|
|
||||||
this->error_code_list_.push_back(
|
|
||||||
{ErrorType::EnCodeError, ErrorLocation::ResultExp});
|
|
||||||
res += messy_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果结果表达式没有初始化,则初始化之后再次使用
|
|
||||||
if (exp_result_ == nullptr && exp_str_ != "") {
|
|
||||||
try {
|
|
||||||
exp_result_ =
|
|
||||||
std::make_unique<mix_cc::matheval::Expression>(exp_str_, &mm_vars);
|
|
||||||
logger_->Debug() << exp_str_ << ":" << exp_result_->evaluate() << endl;
|
|
||||||
} catch (const std::exception &e) {
|
|
||||||
logger_->Error() << exp_result_ << "计算错误:" << e.what()
|
|
||||||
<< ",location:" << BOOST_CURRENT_LOCATION << endl;
|
|
||||||
this->error_code_list_.push_back(
|
this->error_code_list_.push_back(
|
||||||
{ErrorType::CalError, ErrorLocation::ResultExp});
|
{ErrorType::CalError, ErrorLocation::ResultExp});
|
||||||
|
res += reg_ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -805,31 +760,6 @@ int ExpBase::reload_config_exp_feedback() {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 刷新共享内存所对应的变量
|
|
||||||
int ExpBase::refresh_exp_vars_mem() {
|
|
||||||
refresh_now_time();
|
|
||||||
for (unsigned int i = 0; i < m_tags.size(); i++) {
|
|
||||||
// s[n] 表示tag[n]在动作开始时刻的起始值
|
|
||||||
// p[n] 表示tag[n]在上一个动作周期的数值
|
|
||||||
double current =
|
|
||||||
SingletonTemplate<GlobaltemSharedMemory>::GetInstance()[m_tags[i]];
|
|
||||||
mm_vars[var_cache_.p_keys[i]] = mm_vars[var_cache_.tag_keys[i]];
|
|
||||||
mm_vars[var_cache_.tag_keys[i]] = current;
|
|
||||||
for (size_t j = pv_num_ - 1; j > 0; j--) {
|
|
||||||
mm_vars[var_cache_.pv_keys[i][j]] = mm_vars[var_cache_.pv_keys[i][j - 1]];
|
|
||||||
}
|
|
||||||
mm_vars[var_cache_.pv_keys[i][0]] = current;
|
|
||||||
|
|
||||||
}
|
|
||||||
mm_vars["now"] =
|
|
||||||
duration_cast<milliseconds>(now_time_.time_since_epoch()).count();
|
|
||||||
// 设置right的时间
|
|
||||||
this->fun_vars_.refresh_fun_vars(false, &mm_vars);
|
|
||||||
this->query_time_range_.set_right(now_time_);
|
|
||||||
refresh_hold_var();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 重新载入数据源配置
|
// 重新载入数据源配置
|
||||||
int ExpBase::reload_config_data_source() {
|
int ExpBase::reload_config_data_source() {
|
||||||
int res = 0;
|
int res = 0;
|
||||||
@ -856,167 +786,6 @@ int ExpBase::reload_config_data_source() {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 刷新对应ihd cache内第row行的数据变量
|
|
||||||
int ExpBase::refresh_exp_vars_ihd(int row) {
|
|
||||||
// modify 20260107
|
|
||||||
// 检查矩阵大小和索引有效性
|
|
||||||
if (queried_data_.rows() == 0 || queried_data_.cols() == 0) {
|
|
||||||
logger_->Error() << "refresh_exp_vars_ihd: queried_data_ 为空!" << endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (row < 0 || row >= queried_data_.rows()) {
|
|
||||||
logger_->Error() << "refresh_exp_vars_ihd: row索引 " << row
|
|
||||||
<< " 超出范围 [0, " << queried_data_.rows() - 1 << "]"
|
|
||||||
<< endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (static_cast<int>(m_tags.size()) > queried_data_.cols()) {
|
|
||||||
logger_->Error() << "refresh_exp_vars_ihd: m_tags.size() " << m_tags.size()
|
|
||||||
<< " 超出列数 " << queried_data_.cols() << endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// i <= row 原本查询时间对应的是[t1,t2)
|
|
||||||
// 则queried_time_内部的时间也一定是[t1,t2)
|
|
||||||
for (unsigned int i = 0; i < m_tags.size(); i++) {
|
|
||||||
mm_vars["p" + std::to_string(i + 1)] =
|
|
||||||
mm_vars["tag" + std::to_string(i + 1)];
|
|
||||||
mm_vars["tag" + std::to_string(i + 1)] = queried_data_(row, i);
|
|
||||||
auto pv_str = "pv" + std::to_string(i + 1);
|
|
||||||
mm_vars[pv_str + "_5"] = mm_vars[pv_str + "_4"];
|
|
||||||
mm_vars[pv_str + "_4"] = mm_vars[pv_str + "_3"];
|
|
||||||
mm_vars[pv_str + "_3"] = mm_vars[pv_str + "_2"];
|
|
||||||
mm_vars[pv_str + "_2"] = mm_vars[pv_str + "_1"];
|
|
||||||
mm_vars[pv_str + "_1"] = mm_vars[pv_str + "_0"];
|
|
||||||
mm_vars[pv_str + "_0"] = mm_vars["tag" + std::to_string(i + 1)];
|
|
||||||
//
|
|
||||||
mm_vars["now"] = mix_cc::mix_time_t(queried_time_[row]).to_milliseconds();
|
|
||||||
// right一定小于t2
|
|
||||||
this->query_time_range_.set_right(queried_time_[row]);
|
|
||||||
// 当前时间 == 上次执行的结束时间
|
|
||||||
this->now_time_ = queried_time_[row];
|
|
||||||
}
|
|
||||||
this->fun_vars_.refresh_fun_vars(false, &mm_vars);
|
|
||||||
refresh_hold_var();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 程序启动时刻的,首次刷新变量数据
|
|
||||||
// 防止程序因为p1 pv1类似的变量,导致程序的变量差值信息错误
|
|
||||||
int ExpBase::first_fill_mm_vars() {
|
|
||||||
/*-------动作反馈标记-重置------*/
|
|
||||||
logger_->Debug() << "-first_fill_mm_vars()-----mm_vars,size:"
|
|
||||||
<< mm_vars.size() << ",mm_vars..empty():" << mm_vars.empty()
|
|
||||||
<< std::endl;
|
|
||||||
this->act_started_ = false;
|
|
||||||
this->act_triggered_ = false;
|
|
||||||
this->feedback_triggered_ = false;
|
|
||||||
/*-------动作反馈标记-重置------*/
|
|
||||||
if (data_source_ == DataSource::MEMORY) {
|
|
||||||
for (unsigned int i = 0; i < m_tags.size(); i++) {
|
|
||||||
auto pv_str = "pv" + std::to_string(i + 1);
|
|
||||||
if (this->rule_id_ == "fba8df61-8a16-4a0e-80de-6e25aaf3d037") {
|
|
||||||
logger_->Debug() << "m_tags[" << i << "]:" << m_tags[i]
|
|
||||||
<< ",m_tags.size():" << m_tags.size() << "-----0------"
|
|
||||||
<< std::endl;
|
|
||||||
}
|
|
||||||
double value =
|
|
||||||
SingletonTemplate<GlobaltemSharedMemory>::GetInstance()[m_tags[i]];
|
|
||||||
if (this->rule_id_ == "fba8df61-8a16-4a0e-80de-6e25aaf3d037") {
|
|
||||||
logger_->Debug() << "m_tags[" << i << "]:" << m_tags[i]
|
|
||||||
<< ",m_tags.size():" << m_tags.size() << "-----1------"
|
|
||||||
<< ",value:" << value
|
|
||||||
<< "mm_vars.size:" << mm_vars.size() << std::endl;
|
|
||||||
}
|
|
||||||
if (this->rule_id_ == "fba8df61-8a16-4a0e-80de-6e25aaf3d037") {
|
|
||||||
logger_->Debug() << "s" + std::to_string(i + 1) << ",m_tags[" << i
|
|
||||||
<< "]:" << m_tags[i]
|
|
||||||
<< ",m_tags.size():" << m_tags.size() << "-----2-----"
|
|
||||||
<< std::endl;
|
|
||||||
}
|
|
||||||
mm_vars["s" + std::to_string(i + 1)] = value;
|
|
||||||
|
|
||||||
mm_vars["p" + std::to_string(i + 1)] = value;
|
|
||||||
mm_vars["tag" + std::to_string(i + 1)] = value;
|
|
||||||
mm_vars["mv2_tag" + std::to_string(i + 1)] = 0;
|
|
||||||
mm_vars["mv2_p" + std::to_string(i + 1)] = 0;
|
|
||||||
mm_vars["up_tag" + std::to_string(i + 1)] = 0;
|
|
||||||
mm_vars["dw_tag" + std::to_string(i + 1)] = 0;
|
|
||||||
mm_vars["mx_tag" + std::to_string(i + 1)] =
|
|
||||||
mm_vars["tag" + std::to_string(i + 1)];
|
|
||||||
mm_vars["mi_tag" + std::to_string(i + 1)] =
|
|
||||||
mm_vars["tag" + std::to_string(i + 1)];
|
|
||||||
mm_vars[pv_str + "_0"] = value;
|
|
||||||
mm_vars[pv_str + "_1"] = value;
|
|
||||||
mm_vars[pv_str + "_2"] = value;
|
|
||||||
mm_vars[pv_str + "_3"] = value;
|
|
||||||
mm_vars[pv_str + "_4"] = value;
|
|
||||||
mm_vars[pv_str + "_5"] = value;
|
|
||||||
if (this->exp_type_ == -1) {
|
|
||||||
logger_->Debug() << "m_tags[" << i << "]:" << m_tags[i]
|
|
||||||
<< ",m_tags.size():" << m_tags.size() << "-----3-----"
|
|
||||||
<< "mm_vars.size:" << mm_vars.size() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mm_vars["stime"] = 0;
|
|
||||||
mm_vars["now"] = 0;
|
|
||||||
mm_vars["etime"] = 0;
|
|
||||||
mm_vars["time"] = 0;
|
|
||||||
} else if (data_source_ == DataSource::IHDB) {
|
|
||||||
this->refresh_now_time();
|
|
||||||
query_time_range_.set_left(now_time_ - 10s);
|
|
||||||
query_time_range_.set_right(now_time_ - 5s);
|
|
||||||
this->refresh_ihd_cache();
|
|
||||||
if (queried_data_.rows() == 0) {
|
|
||||||
logger_->Debug() << "time:"
|
|
||||||
<< mix_cc::mix_time_t(this->query_time_range_.get_left())
|
|
||||||
.to_formatted_time()
|
|
||||||
<< "~"
|
|
||||||
<< mix_cc::mix_time_t(
|
|
||||||
this->query_time_range_.get_right())
|
|
||||||
.to_formatted_time()
|
|
||||||
<< ",diff_time:"
|
|
||||||
<< std::chrono::duration_cast<milliseconds>(
|
|
||||||
query_time_range_.get_right() -
|
|
||||||
query_time_range_.get_left())
|
|
||||||
.count()
|
|
||||||
<< endl;
|
|
||||||
logger_->Error() << "first_fill_mm_vars(),IHDB查询异常,未查到数据!"
|
|
||||||
<< endl;
|
|
||||||
this->error_code_list_.push_back(
|
|
||||||
{ErrorType::Empty, ErrorLocation::DataValue});
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
for (unsigned int i = 0; i < m_tags.size(); i++) {
|
|
||||||
auto pv_str = "pv" + std::to_string(i + 1);
|
|
||||||
auto rows = queried_data_.rows() - 1;
|
|
||||||
auto tmp_val = queried_data_(rows, i);
|
|
||||||
mm_vars["s" + std::to_string(i + 1)] = tmp_val;
|
|
||||||
mm_vars["p" + std::to_string(i + 1)] = tmp_val;
|
|
||||||
mm_vars["tag" + std::to_string(i + 1)] = tmp_val;
|
|
||||||
mm_vars["mv2_tag" + std::to_string(i + 1)] = 0;
|
|
||||||
mm_vars["mv2_p" + std::to_string(i + 1)] = 0;
|
|
||||||
mm_vars["up_tag" + std::to_string(i + 1)] = 0;
|
|
||||||
mm_vars["dw_tag" + std::to_string(i + 1)] = 0;
|
|
||||||
mm_vars["mx_tag" + std::to_string(i + 1)] =
|
|
||||||
mm_vars["tag" + std::to_string(i + 1)];
|
|
||||||
mm_vars["mi_tag" + std::to_string(i + 1)] =
|
|
||||||
mm_vars["tag" + std::to_string(i + 1)];
|
|
||||||
mm_vars[pv_str + "_0"] = tmp_val;
|
|
||||||
mm_vars[pv_str + "_1"] = tmp_val;
|
|
||||||
mm_vars[pv_str + "_2"] = tmp_val;
|
|
||||||
mm_vars[pv_str + "_3"] = tmp_val;
|
|
||||||
mm_vars[pv_str + "_4"] = tmp_val;
|
|
||||||
mm_vars[pv_str + "_5"] = tmp_val;
|
|
||||||
mm_vars["stime"] = 0;
|
|
||||||
mm_vars["now"] = 0;
|
|
||||||
mm_vars["etime"] = 0;
|
|
||||||
mm_vars["time"] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ExpBase::reload_config_exp_act() {
|
int ExpBase::reload_config_exp_act() {
|
||||||
// 根据key,对不同版本的算法都进行取值
|
// 根据key,对不同版本的算法都进行取值
|
||||||
int res = 0;
|
int res = 0;
|
||||||
@ -1026,17 +795,7 @@ int ExpBase::reload_config_exp_act() {
|
|||||||
.at("value")
|
.at("value")
|
||||||
.get<std::string>();
|
.get<std::string>();
|
||||||
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
||||||
res += init_hold_exp_str(exp_str_);
|
|
||||||
auto fun_res = fun_vars_.add_exp_str(exp_str_, &mm_vars);
|
|
||||||
res += fun_res.first ? 0 : -1;
|
|
||||||
exp_str_ = fun_res.second;
|
|
||||||
feedback_mode_ = true;
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (rule_json_.at("function").contains("result")) {
|
} else if (rule_json_.at("function").contains("result")) {
|
||||||
if (rule_json_.at("function").contains("filter_exp")) {
|
if (rule_json_.at("function").contains("filter_exp")) {
|
||||||
@ -1045,27 +804,10 @@ int ExpBase::reload_config_exp_act() {
|
|||||||
.at("value")
|
.at("value")
|
||||||
.get<std::string>();
|
.get<std::string>();
|
||||||
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
||||||
res += init_hold_exp_str(exp_str_);
|
|
||||||
auto fun_res = fun_vars_.add_exp_str(exp_str_, &mm_vars);
|
|
||||||
res += fun_res.first ? 0 : -1;
|
|
||||||
exp_str_ = fun_res.second;
|
|
||||||
feedback_mode_ = false;
|
feedback_mode_ = false;
|
||||||
auto messy_code = exp_messy_code_check(exp_str_);
|
if (exp_str_ != "") {
|
||||||
if (messy_code == -1) {
|
int reg_ret = expr_engine_->registerExpression("feedback", exp_str_);
|
||||||
this->error_code_list_.push_back(
|
if (reg_ret != 0) {
|
||||||
{ErrorType::EnCodeError, ErrorLocation::ActExp});
|
|
||||||
res += messy_code;
|
|
||||||
}
|
|
||||||
if (exp_feedback_ == nullptr && exp_str_ != "") {
|
|
||||||
try {
|
|
||||||
exp_feedback_ = std::make_unique<mix_cc::matheval::Expression>(
|
|
||||||
exp_str_, &mm_vars);
|
|
||||||
logger_->Debug() << "filter_exp exp_feedback_:" << exp_str_ << "="
|
|
||||||
<< exp_feedback_->evaluate() << endl;
|
|
||||||
} catch (const std::exception &e) {
|
|
||||||
logger_->Error() << "filter_exp exp_feedback_:" << exp_str_
|
|
||||||
<< "计算出错:" << e.what()
|
|
||||||
<< ",location:" << BOOST_CURRENT_LOCATION << endl;
|
|
||||||
this->error_code_list_.push_back(
|
this->error_code_list_.push_back(
|
||||||
{ErrorType::CalError, ErrorLocation::FBExp});
|
{ErrorType::CalError, ErrorLocation::FBExp});
|
||||||
return -1;
|
return -1;
|
||||||
@ -1082,30 +824,13 @@ int ExpBase::reload_config_exp_act() {
|
|||||||
auto tmp_exp =
|
auto tmp_exp =
|
||||||
rule_json_.at("function").at("result").at("value").get<std::string>();
|
rule_json_.at("function").at("result").at("value").get<std::string>();
|
||||||
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
exp_str_ = get_macro_replaced_exp(tmp_exp);
|
||||||
res += init_hold_exp_str(exp_str_);
|
|
||||||
|
|
||||||
auto fun_res = fun_vars_.add_exp_str(exp_str_, &mm_vars);
|
|
||||||
res += fun_res.first ? 0 : -1;
|
|
||||||
exp_str_ = fun_res.second;
|
|
||||||
|
|
||||||
feedback_mode_ = false;
|
feedback_mode_ = false;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exp_act_ == nullptr && exp_str_ != "") {
|
if (exp_str_ != "") {
|
||||||
try {
|
int reg_ret = expr_engine_->registerExpression("act", exp_str_);
|
||||||
exp_act_ =
|
if (reg_ret != 0) {
|
||||||
std::make_unique<mix_cc::matheval::Expression>(exp_str_, &mm_vars);
|
|
||||||
logger_->Debug() << "exp_act:" << exp_str_ << "=" << exp_act_->evaluate()
|
|
||||||
<< endl;
|
|
||||||
} catch (const std::exception &e) {
|
|
||||||
logger_->Error() << "exp_act:" << exp_str_ << "计算出错:" << e.what()
|
|
||||||
<< ",location:" << BOOST_CURRENT_LOCATION << endl;
|
|
||||||
this->error_code_list_.push_back(
|
this->error_code_list_.push_back(
|
||||||
{ErrorType::CalError, ErrorLocation::ActExp});
|
{ErrorType::CalError, ErrorLocation::ActExp});
|
||||||
return -1;
|
return -1;
|
||||||
@ -1207,20 +932,10 @@ int ExpBase::reload_config_up_down_hold_time() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 打印表达式信息
|
|
||||||
void ExpBase::print_exp_vars(const string &expstr) {
|
|
||||||
std::map<std::string, double>::iterator it;
|
|
||||||
logger_->Debug() << "exp:" << expstr << " parameter:";
|
|
||||||
for (it = mm_vars.begin(); it != mm_vars.end(); it++) {
|
|
||||||
logger_->Debug() << " " << it->first << ":" << it->second;
|
|
||||||
}
|
|
||||||
logger_->Debug() << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExpBase::set_last_alarm_time(TimePoint time_point) {
|
void ExpBase::set_last_alarm_time(TimePoint time_point) {
|
||||||
this->refresh_counts_ = 0;
|
this->refresh_counts_ = 0;
|
||||||
if (this->is_usable_) {
|
if (this->is_usable_) {
|
||||||
this->first_fill_mm_vars();
|
expr_engine_->firstFill(data_source_, now_time_, query_time_range_);
|
||||||
}
|
}
|
||||||
AlgBase::set_last_alarm_time(time_point);
|
AlgBase::set_last_alarm_time(time_point);
|
||||||
}
|
}
|
||||||
@ -1228,68 +943,11 @@ void ExpBase::set_last_alarm_time(TimePoint time_point) {
|
|||||||
void ExpBase::set_usable(bool usable) {
|
void ExpBase::set_usable(bool usable) {
|
||||||
this->refresh_counts_ = 0;
|
this->refresh_counts_ = 0;
|
||||||
if (this->is_usable_) {
|
if (this->is_usable_) {
|
||||||
this->first_fill_mm_vars();
|
expr_engine_->firstFill(data_source_, now_time_, query_time_range_);
|
||||||
}
|
}
|
||||||
AlgBase::set_usable(usable);
|
AlgBase::set_usable(usable);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ExpBase::refresh_hold_var() {
|
|
||||||
if (hold_times_.empty()) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
for (map<std::string, std::unique_ptr<HoldTime>>::iterator iter =
|
|
||||||
hold_times_.begin();
|
|
||||||
iter != hold_times_.end(); iter++) {
|
|
||||||
mm_vars[iter->first] =
|
|
||||||
double(iter->second->update_value(mm_vars[iter->second->tagi]));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int ExpBase::init_hold_exp_str(const std::string &exp_str) {
|
|
||||||
int res = 0;
|
|
||||||
try {
|
|
||||||
auto hold_sub_strs = HoldTime::find_substr(exp_str, "_HE");
|
|
||||||
bool flag;
|
|
||||||
double timeM;
|
|
||||||
std::string tagi;
|
|
||||||
std::string var_name;
|
|
||||||
for (auto sub_str : hold_sub_strs) {
|
|
||||||
std::tie(flag, timeM, tagi, var_name) = HoldTime::find_hold(sub_str);
|
|
||||||
if (flag) {
|
|
||||||
if (hold_times_.find(var_name) == hold_times_.end()) {
|
|
||||||
hold_times_.emplace(std::make_pair(
|
|
||||||
var_name, std::make_unique<HoldTime>(timeM, tagi, var_name)));
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (timeM) {
|
|
||||||
logger_->Error() << "hold结构结构不正确," << tagi << std::endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
refresh_hold_var();
|
|
||||||
|
|
||||||
} catch (const std::exception &e) {
|
|
||||||
logger_->Debug() << "ExpBase::init_hold_exp_str:" << e.what()
|
|
||||||
<< ",location:" << BOOST_CURRENT_LOCATION << endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
int ExpBase::exp_messy_code_check(const std::string &exp_str) {
|
|
||||||
for (char e_char : exp_str) {
|
|
||||||
if (e_char > 127 || e_char < 0) {
|
|
||||||
this->logger_->Error() << "表达式存在中文字符或乱码 tmp_exp:" << exp_str
|
|
||||||
<< " :" << e_char << ":" << int(e_char) << endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ExpBase::reload_ci_dist() {
|
int ExpBase::reload_ci_dist() {
|
||||||
if (this->exp_type_ != ExpType::Bound &&
|
if (this->exp_type_ != ExpType::Bound &&
|
||||||
this->exp_type_ != ExpType::CondBound &&
|
this->exp_type_ != ExpType::CondBound &&
|
||||||
@ -1355,7 +1013,7 @@ void ExpBase::task_mon_pro() {
|
|||||||
logger_->Debug() << rule_name_ << ",ihd size:" << queried_data_.size()
|
logger_->Debug() << rule_name_ << ",ihd size:" << queried_data_.size()
|
||||||
<< endl;
|
<< endl;
|
||||||
for (auto i = 0; i < queried_data_.rows(); i++) {
|
for (auto i = 0; i < queried_data_.rows(); i++) {
|
||||||
refresh_exp_vars_ihd(i);
|
expr_engine_->refreshFromIhdRow(i, queried_data_, queried_time_, now_time_, query_time_range_);
|
||||||
if (this->refresh_counts_ < 3) {
|
if (this->refresh_counts_ < 3) {
|
||||||
this->refresh_counts_++;
|
this->refresh_counts_++;
|
||||||
} else {
|
} else {
|
||||||
@ -1388,7 +1046,7 @@ TaskReturnType ExpBase::task_base_proc() {
|
|||||||
double result_value = 0;
|
double result_value = 0;
|
||||||
try {
|
try {
|
||||||
// 获得是否满足前提条件表达式
|
// 获得是否满足前提条件表达式
|
||||||
result_value = exp_act_->evaluate();
|
result_value = expr_engine_->evaluate("act");
|
||||||
act_triggered_ = static_cast<bool>(result_value);
|
act_triggered_ = static_cast<bool>(result_value);
|
||||||
// 检测是否是表达式-反馈模式
|
// 检测是否是表达式-反馈模式
|
||||||
if (feedback_mode_) {
|
if (feedback_mode_) {
|
||||||
@ -1397,8 +1055,8 @@ TaskReturnType ExpBase::task_base_proc() {
|
|||||||
return task_return_data;
|
return task_return_data;
|
||||||
}
|
}
|
||||||
if (act_done()) {
|
if (act_done()) {
|
||||||
result_value = exp_result_->evaluate();
|
result_value = expr_engine_->evaluate("result");
|
||||||
print_exp_vars();
|
expr_engine_->printVars();
|
||||||
// 并且数据合法
|
// 并且数据合法
|
||||||
if (!std::isnan(result_value)) {
|
if (!std::isnan(result_value)) {
|
||||||
task_return_data.is_valid = true;
|
task_return_data.is_valid = true;
|
||||||
@ -1411,14 +1069,14 @@ TaskReturnType ExpBase::task_base_proc() {
|
|||||||
}
|
}
|
||||||
// 表达式-样本,无需反馈
|
// 表达式-样本,无需反馈
|
||||||
else if (!std::isnan(result_value)) {
|
else if (!std::isnan(result_value)) {
|
||||||
if (exp_feedback_ != nullptr) {
|
try {
|
||||||
if (exp_feedback_->evaluate()) {
|
if (expr_engine_->evaluateBool("feedback")) {
|
||||||
task_return_data.is_valid = true;
|
task_return_data.is_valid = true;
|
||||||
task_return_data.value = result_value;
|
task_return_data.value = result_value;
|
||||||
logger_->Debug() << "实时值:" << result_value << endl;
|
logger_->Debug() << "实时值:" << result_value << endl;
|
||||||
print_exp_vars();
|
expr_engine_->printVars();
|
||||||
}
|
}
|
||||||
} else {
|
} catch (...) {
|
||||||
task_return_data.is_valid = true;
|
task_return_data.is_valid = true;
|
||||||
task_return_data.value = result_value;
|
task_return_data.value = result_value;
|
||||||
}
|
}
|
||||||
@ -1496,8 +1154,8 @@ bool ExpBase::detect_up_down(const double &value) {
|
|||||||
|
|
||||||
bool ExpBase::task_prr(int row) {
|
bool ExpBase::task_prr(int row) {
|
||||||
if (this->prr_ == 1) {
|
if (this->prr_ == 1) {
|
||||||
exp_mpdule_ptr_->update(queried_data_, queried_time_, row);
|
expr_engine_->refreshFromIhdRow(row, queried_data_, queried_time_, now_time_, query_time_range_);
|
||||||
bool prr_result = (bool)exp_mpdule_ptr_->get_value("pre_result");
|
bool prr_result = expr_engine_->evaluateBool("pre_result");
|
||||||
return prr_result;
|
return prr_result;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -1542,23 +1200,11 @@ void ExpBase::save_rule_norm_data() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExpBase::fun_vars_init() {
|
|
||||||
string prr_exp = this->exp_mpdule_ptr_->get_exp_str("pre_result");
|
|
||||||
if (prr_exp == "") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto fun_res = fun_vars_.add_exp_str(prr_exp, &mm_vars);
|
|
||||||
}
|
|
||||||
bool ExpBase::get_prr() {
|
bool ExpBase::get_prr() {
|
||||||
if (this->prr_ == 1) {
|
if (this->prr_ == 1) {
|
||||||
exp_mpdule_ptr_->update();
|
// 变量刷新已由 exec_mon() 中的 refreshFromMemory 完成,此处只需求值
|
||||||
bool prr_result = (bool)exp_mpdule_ptr_->get_value("pre_result");
|
bool prr_result = expr_engine_->evaluateBool("pre_result");
|
||||||
this->now_prr_ = prr_result;
|
this->now_prr_ = prr_result;
|
||||||
if (rule_id_ == string(CMemVar::Const()->printRuleid)) {
|
|
||||||
logger_->Debug() << "ruleid:" << this->rule_id_
|
|
||||||
<< ",rulename:" << this->rule_name_
|
|
||||||
<< " get_prr():" << prr_result << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this->now_prr_) {
|
if (!this->now_prr_) {
|
||||||
/*-------动作反馈标记-重置------*/
|
/*-------动作反馈标记-重置------*/
|
||||||
@ -1571,19 +1217,3 @@ bool ExpBase::get_prr() {
|
|||||||
now_prr_ = true;
|
now_prr_ = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void ExpBase::auto_fun_vars_reset() {
|
|
||||||
if (is_fun_vars_need_reset_) {
|
|
||||||
if (rule_id_ == string(CMemVar::Const()->printRuleid)) {
|
|
||||||
logger_->Debug() << "auto_fun_vars_reset,重置fun_vars_状态!--start"
|
|
||||||
<< std::endl;
|
|
||||||
print_exp_vars();
|
|
||||||
}
|
|
||||||
this->fun_vars_.refresh_fun_vars(true, &mm_vars);
|
|
||||||
if (rule_id_ == string(CMemVar::Const()->printRuleid)) {
|
|
||||||
logger_->Debug() << "auto_fun_vars_reset,重置fun_vars_状态!--end"
|
|
||||||
<< std::endl;
|
|
||||||
print_exp_vars();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is_fun_vars_need_reset_ = false;
|
|
||||||
}
|
|
||||||
@ -137,37 +137,6 @@ private:
|
|||||||
*/
|
*/
|
||||||
int reload_config_exp_feedback();
|
int reload_config_exp_feedback();
|
||||||
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* @brief 把从共享内存查询到的数据载入到表达式变量中
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
int refresh_exp_vars_mem();
|
|
||||||
/**
|
|
||||||
* @brief 把从ihyperDB查询到的数据载入到表达式变量中
|
|
||||||
* @param row 数据矩阵的行数
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
int refresh_exp_vars_ihd(int row);
|
|
||||||
/**
|
|
||||||
* @brief 首次运行,载入默认变量至表达式系统变量map
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
int first_fill_mm_vars();
|
|
||||||
/**
|
|
||||||
* @brief 刷新hold变量,hold变量有hold(n,T)解析所得
|
|
||||||
* hold(n,T),n——tag的序号,T——保持的时间,单位分钟
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
int refresh_hold_var();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* @brief 打印表达式和它的变量值
|
|
||||||
* @param expstr My Param doc
|
|
||||||
*/
|
|
||||||
void print_exp_vars(const string &expstr = "");
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
string exp_str_;
|
string exp_str_;
|
||||||
|
|
||||||
@ -176,20 +145,6 @@ protected:
|
|||||||
bool feedback_done_ = false;
|
bool feedback_done_ = false;
|
||||||
|
|
||||||
string unit_;
|
string unit_;
|
||||||
/**
|
|
||||||
* @brief 自定义带状态函数
|
|
||||||
* KeepT , ///< 保持时间
|
|
||||||
* KeepC, ///<出现次数
|
|
||||||
* RiseEdge, ///<上升沿出现次数
|
|
||||||
* Detect ///<为真检测次数
|
|
||||||
*/
|
|
||||||
StatExp::FunVars fun_vars_;
|
|
||||||
|
|
||||||
std::unique_ptr<mix_cc::matheval::Expression> exp_act_;
|
|
||||||
|
|
||||||
std::unique_ptr<mix_cc::matheval::Expression> exp_feedback_;
|
|
||||||
|
|
||||||
std::unique_ptr<mix_cc::matheval::Expression> exp_result_;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const size_t
|
const size_t
|
||||||
@ -247,8 +202,6 @@ protected:
|
|||||||
|
|
||||||
bool filter_flag_ = false;
|
bool filter_flag_ = false;
|
||||||
|
|
||||||
bool is_fun_vars_need_reset_ = false;
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
@ -296,18 +249,6 @@ protected:
|
|||||||
*/
|
*/
|
||||||
AlarmInfo get_timeout_alarm();
|
AlarmInfo get_timeout_alarm();
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 从hold(n,T)解析出hold变量,并表达式系统变量map初始化
|
|
||||||
* @param exp_str My Param doc
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
int init_hold_exp_str(const std::string &exp_str);
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
* @param exp_str My Param doc
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
int exp_messy_code_check(const std::string &exp_str);
|
|
||||||
/**
|
/**
|
||||||
* @brief 重新载入置信区间
|
* @brief 重新载入置信区间
|
||||||
* @return int
|
* @return int
|
||||||
@ -355,14 +296,5 @@ protected:
|
|||||||
*/
|
*/
|
||||||
bool task_prr(int row);
|
bool task_prr(int row);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 初始化fun_vars_
|
|
||||||
* 将前提表达式的fun_vars_替换
|
|
||||||
*/
|
|
||||||
void fun_vars_init();
|
|
||||||
/**
|
|
||||||
* @brief 自动判断重置状态
|
|
||||||
* 依据 is_fun_vars_need_reset_
|
|
||||||
*/
|
|
||||||
void auto_fun_vars_reset();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user