refactor: 删除旧反馈状态方法和标志(已由 FbStateMachine 替代)

This commit is contained in:
Huamonarch 2026-05-15 13:57:20 +08:00
parent 0106e553a0
commit c4bcb6610b
2 changed files with 44 additions and 217 deletions

View File

@ -294,12 +294,12 @@ AlarmInfo ExpBase::mon_proc() {
}
}
act_triggered_ = static_cast<bool>(result_value);
bool act_triggered = static_cast<bool>(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<milliseconds>(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<bool>(result_value);
bool act_triggered = static_cast<bool>(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 =

View File

@ -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