From c4bcb6610bbcacd1c823413387a46aaee97feb80 Mon Sep 17 00:00:00 2001 From: Huamonarch Date: Fri, 15 May 2026 13:57:20 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=88=A0=E9=99=A4=E6=97=A7?= =?UTF-8?q?=E5=8F=8D=E9=A6=88=E7=8A=B6=E6=80=81=E6=96=B9=E6=B3=95=E5=92=8C?= =?UTF-8?q?=E6=A0=87=E5=BF=97=EF=BC=88=E5=B7=B2=E7=94=B1=20FbStateMachine?= =?UTF-8?q?=20=E6=9B=BF=E4=BB=A3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eqpalg/algs/exp_base.cpp | 215 ++++++++------------------------------- eqpalg/algs/exp_base.h | 46 --------- 2 files changed, 44 insertions(+), 217 deletions(-) diff --git a/eqpalg/algs/exp_base.cpp b/eqpalg/algs/exp_base.cpp index 710d0e1..6eea46e 100644 --- a/eqpalg/algs/exp_base.cpp +++ b/eqpalg/algs/exp_base.cpp @@ -294,12 +294,12 @@ AlarmInfo ExpBase::mon_proc() { } } - act_triggered_ = static_cast(result_value); + bool act_triggered = static_cast(result_value); // 如果是反馈模式 if (feedback_mode_) { // === 使用 FbStateMachine === auto [fbState, needFunReset] = fb_fsm_.update( - act_triggered_, now_time_, expr_engine_->vars(), m_tags.size()); + act_triggered, now_time_, expr_engine_->vars(), m_tags.size()); if (needFunReset) { expr_engine_->markFunVarsNeedReset(); @@ -366,7 +366,14 @@ AlarmInfo ExpBase::mon_proc() { } if (fbState == FbState::Timeout) { - return get_timeout_alarm(); + if (!fb_fsm_.isTimeMode()) { + return AlarmInfo{}; + } + string msg = + rule_name_ + " 反馈超时:" + std::to_string(time_out_.count()) + " ms"; + logger_->Debug() << msg << endl; + return utility::build_alarm_info(MsgLevel::ERROR, rule_id_, rule_name_, + "EXPACT", msg, query_time_range_); } // Idle state (from terminal auto-reset) — nothing to do @@ -433,8 +440,8 @@ AlarmInfo ExpBase::mon_proc() { } } else { - if (act_triggered_) { - rule_stat_.alarm_value = act_triggered_; + if (act_triggered) { + rule_stat_.alarm_value = act_triggered; expr_engine_->printVars(); auto msg = rule_name_ + " " + error_str_; logger_->Debug() << msg << endl; @@ -476,55 +483,6 @@ mix_cc::json ExpBase::exec_cron() { return {}; } -bool ExpBase::act_start_done() { - // 如果动作未开始且前提条件满足 - if (!act_started_ && act_triggered_) { - // 则认为动作开始,并置动作开始时间为当前时间 - act_started_ = true; - act_start_time_ = this->now_time_; - mm_vars["stime"] = - duration_cast(now_time_.time_since_epoch()).count(); - mm_vars["time"] = 0; - for (unsigned int i = 0; i < m_tags.size(); i++) { - // s[n] 表示tag[n]在动作开始时刻的起始值 - mm_vars["s" + std::to_string(i + 1)] = - mm_vars["tag" + std::to_string(i + 1)]; - - // mv2 变量 - 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["up_tag" + std::to_string(i + 1)] = 0; - mm_vars["dw_tag" + std::to_string(i + 1)] = 0; - 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 + (int)(mm_vars["p" + std::to_string(i + 1)] == 0 && - mm_vars["tag" + std::to_string(i + 1)] == 1); - mm_vars["dw_tag" + std::to_string(i + 1)] = - 0 + (int)(mm_vars["p" + std::to_string(i + 1)] == 1 && - mm_vars["tag" + std::to_string(i + 1)] == 0); - if (mm_vars["tag" + std::to_string(i + 1)] == 1) { - mm_vars["mv2_tag" + std::to_string(i + 1)] = 1; - } - if (mm_vars["p" + std::to_string(i + 1)] == 1) { - mm_vars["mv2_p" + std::to_string(i + 1)] = 1; - } - } - // 重设query time range 的 left,使得时间下限为报警的时间开始 - this->query_time_range_.set_left(now_time_); - - // 检查动作开时间条件是否错误 - logger_->Debug() << " action start:" - << mix_cc::mix_time_t(act_start_time_).to_formatted_time() - << endl; - return true; - } else if (!act_started_ && !act_triggered_) { - expr_engine_->markFunVarsNeedReset(); - } - return false; -} int ExpBase::cron_proc() { int size_data = 0; this->refresh_now_time(); @@ -582,110 +540,6 @@ int ExpBase::cron_proc() { return size_data; } -bool ExpBase::act_not_hold() { - // 如果动作开始,且需要保持,且动作开始没有被触发, - if (act_started_ && keep_mode_ && !act_triggered_) { - // 开始条件act_started置为假,即动作停止 - act_started_ = false; - logger_->Debug() << " action signal is not holding " << endl; - return true; - } - return false; -} - -bool ExpBase::act_done() { - // 如果动作已开始 刷新 mv2_tag[n] - if (act_started_) { - /*time :动作开始-当前时刻 的时间*/ - mm_vars["time"] = mm_vars["now"] - mm_vars["stime"]; - for (unsigned int i = 0; i < m_tags.size(); i++) { - mm_vars["mx_tag" + std::to_string(i + 1)] = - std::max(mm_vars["tag" + std::to_string(i + 1)], - mm_vars["mx_tag" + std::to_string(i + 1)]); - mm_vars["mi_tag" + std::to_string(i + 1)] = - std::min(mm_vars["tag" + std::to_string(i + 1)], - mm_vars["mi_tag" + std::to_string(i + 1)]); - if (mm_vars["tag" + std::to_string(i + 1)] == 1) { - mm_vars["mv2_tag" + std::to_string(i + 1)] += 1; - } - if (mm_vars["p" + std::to_string(i + 1)] == 1) { - mm_vars["mv2_p" + std::to_string(i + 1)] += 1; - } - mm_vars["up_tag" + std::to_string(i + 1)] += - (int)(mm_vars["p" + std::to_string(i + 1)] == 0 && - mm_vars["tag" + std::to_string(i + 1)] == 1); - mm_vars["dw_tag" + std::to_string(i + 1)] += - (int)(mm_vars["p" + std::to_string(i + 1)] == 1 && - mm_vars["tag" + std::to_string(i + 1)] == 0); - } - } - /*-----------根据最新变量,计算feedback结果-----------*/ - feedback_triggered_ = expr_engine_->evaluateBool("feedback"); - /*-----------根据最新变量,计算feedback结果-----------*/ - - // 如果动作处于开始状态,且反馈模式触发 - if (act_started_ && feedback_triggered_) { - // 则记录下结束时间 - mm_vars["etime"] = mm_vars["now"]; - act_started_ = false; - return true; - } - return false; -} - -// 表达式系统触发-反馈动作超时 -bool ExpBase::act_timeout() { - //-32768 无限制 - if (time_out_ == milliseconds(-32768)) { - // 重置mv_tag 防止崩溃 - for (unsigned int i = 0; i < m_tags.size(); i++) { - if (abs(mm_vars["mv2_tag" + std::to_string(i + 1)] - DBL_MAX) < 2.0) { - 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; - - this->logger_->Debug() - << "mv2_tag" + std::to_string(i + 1) - << ",up_tag" + std::to_string(i + 1) - << ",dw_tag" + std::to_string(i + 1) << "已达上限,被清空" << endl; - act_started_ = false; - return true; //不再继续 - } - } - return false; - } - // 如果当动作处于开始状态 当前时间减去开始时间大于超时时间,则认为超时 - if (act_started_ && (now_time_ - act_start_time_) > time_out_) { - act_started_ = false; - // 超时 重置 防止崩溃 - logger_->Debug() << "动作反馈超时,mv2_tag将被重置" << endl; - for (unsigned int i = 0; i < m_tags.size(); i++) { - logger_->Debug() << "当前mv2_tag" << i + 1 << "=" - << mm_vars["mv2_tag" + std::to_string(i + 1)] << endl; - 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; - } - return true; - } - return false; -} - -// 得到报警超时信息 -AlarmInfo ExpBase::get_timeout_alarm() { - if (!fb_fsm_.isTimeMode()) { - return AlarmInfo{}; - } - string msg = - rule_name_ + " 反馈超时:" + std::to_string(time_out_.count()) + " ms"; - logger_->Debug() << msg << endl; - return utility::build_alarm_info(MsgLevel::ERROR, rule_id_, rule_name_, - "EXPACT", msg, query_time_range_); -} - int ExpBase::reload_config_exp_feedback() { int res = 0; // 获取feedback信息 @@ -1041,25 +895,44 @@ TaskReturnType ExpBase::task_base_proc() { try { // 获得是否满足前提条件表达式 result_value = expr_engine_->evaluate("act"); - act_triggered_ = static_cast(result_value); + bool act_triggered = static_cast(result_value); // 检测是否是表达式-反馈模式 if (feedback_mode_) { - // 如果是表达式反馈-模式,检测是否满足反馈条件 - if (act_start_done() || act_not_hold()) { + // 使用 FbStateMachine 替代旧的手动状态管理 + auto [fbState, needFunReset] = fb_fsm_.update( + act_triggered, now_time_, expr_engine_->vars(), m_tags.size()); + + if (needFunReset) { + expr_engine_->markFunVarsNeedReset(); + } + + if (fbState == FbState::Started || fbState == FbState::NotHold) { return task_return_data; } - if (act_done()) { - result_value = expr_engine_->evaluate("result"); - expr_engine_->printVars(); - // 并且数据合法 - if (!std::isnan(result_value)) { - task_return_data.is_valid = true; - task_return_data.value = result_value; - return task_return_data; + + if (fbState == FbState::InProgress) { + bool fbCond = expr_engine_->evaluateBool("feedback"); + bool done = + fb_fsm_.checkFeedback(fbCond, now_time_, expr_engine_->vars()); + if (done) { + result_value = expr_engine_->evaluate("result"); + expr_engine_->printVars(); + // 并且数据合法 + if (!std::isnan(result_value)) { + task_return_data.is_valid = true; + task_return_data.value = result_value; + return task_return_data; + } } - } else if (act_timeout()) { return task_return_data; } + + if (fbState == FbState::Timeout) { + return task_return_data; + } + + // Idle or Done (terminal states that auto-reset) — nothing to do + return task_return_data; } // 表达式-样本,无需反馈 else if (!std::isnan(result_value)) { @@ -1175,7 +1048,7 @@ void ExpBase::reset_dev_data() { } void ExpBase::save_rule_norm_data() { - if (feedback_mode_ && feedback_done_ || + if (feedback_mode_ && fb_fsm_.currentState() == FbState::Done || ((exp_type_ == ExpType::Bound || exp_type_ == ExpType::BoundHoldTime) && filter_flag_ == true)) { int64_t default_lt = diff --git a/eqpalg/algs/exp_base.h b/eqpalg/algs/exp_base.h index dd5a5a6..9a243d5 100644 --- a/eqpalg/algs/exp_base.h +++ b/eqpalg/algs/exp_base.h @@ -143,8 +143,6 @@ protected: string error_str_; - bool feedback_done_ = false; - string unit_; protected: @@ -155,13 +153,9 @@ protected: TimePoint act_start_time_; - bool act_triggered_ = false; - bool act_started_ = false; - bool feedback_triggered_ = false; - FbStateMachine fb_fsm_; int refresh_counts_ = 0; @@ -204,52 +198,12 @@ protected: bool filter_flag_ = false; -protected: - /** - * @brief 表达式开始动作更新 - * 更新动作开始时间和s{tagN} - * 使程序进入到开始动作满足状态 - * @return true - * @return false - */ - bool act_start_done(); - - /** - * @brief 表达式开始动作未保持 - * 使得程序退出开始动作满足状态 - * @return true - * @return false - */ - bool act_not_hold(); - - /** - * @brief 满足表达式终止条件 - * 需要开始动作满足状态作为前提条件 - * @return true - * @return false - */ - bool act_done(); - - /** - * @brief 开始动作是否超时 - * 使得表达式推出满足开始动作状态 - * @return true - * @return false - */ - bool act_timeout(); - protected: /** * @brief 从ihd查询数据--task用 */ void query_ihd_data(); - /** - * @brief 获得超时报警 - * @return AlarmInfo - */ - AlarmInfo get_timeout_alarm(); - /** * @brief 重新载入置信区间 * @return int