refactor: 删除旧反馈状态方法和标志(已由 FbStateMachine 替代)
This commit is contained in:
parent
0106e553a0
commit
c4bcb6610b
@ -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_) {
|
if (feedback_mode_) {
|
||||||
// === 使用 FbStateMachine ===
|
// === 使用 FbStateMachine ===
|
||||||
auto [fbState, needFunReset] = fb_fsm_.update(
|
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) {
|
if (needFunReset) {
|
||||||
expr_engine_->markFunVarsNeedReset();
|
expr_engine_->markFunVarsNeedReset();
|
||||||
@ -366,7 +366,14 @@ AlarmInfo ExpBase::mon_proc() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fbState == FbState::Timeout) {
|
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
|
// Idle state (from terminal auto-reset) — nothing to do
|
||||||
@ -433,8 +440,8 @@ AlarmInfo ExpBase::mon_proc() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (act_triggered_) {
|
if (act_triggered) {
|
||||||
rule_stat_.alarm_value = act_triggered_;
|
rule_stat_.alarm_value = act_triggered;
|
||||||
expr_engine_->printVars();
|
expr_engine_->printVars();
|
||||||
auto msg = rule_name_ + " " + error_str_;
|
auto msg = rule_name_ + " " + error_str_;
|
||||||
logger_->Debug() << msg << endl;
|
logger_->Debug() << msg << endl;
|
||||||
@ -476,55 +483,6 @@ mix_cc::json ExpBase::exec_cron() {
|
|||||||
return {};
|
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 ExpBase::cron_proc() {
|
||||||
int size_data = 0;
|
int size_data = 0;
|
||||||
this->refresh_now_time();
|
this->refresh_now_time();
|
||||||
@ -582,110 +540,6 @@ int ExpBase::cron_proc() {
|
|||||||
return size_data;
|
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 ExpBase::reload_config_exp_feedback() {
|
||||||
int res = 0;
|
int res = 0;
|
||||||
// 获取feedback信息
|
// 获取feedback信息
|
||||||
@ -1041,25 +895,44 @@ TaskReturnType ExpBase::task_base_proc() {
|
|||||||
try {
|
try {
|
||||||
// 获得是否满足前提条件表达式
|
// 获得是否满足前提条件表达式
|
||||||
result_value = expr_engine_->evaluate("act");
|
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 (feedback_mode_) {
|
||||||
// 如果是表达式反馈-模式,检测是否满足反馈条件
|
// 使用 FbStateMachine 替代旧的手动状态管理
|
||||||
if (act_start_done() || act_not_hold()) {
|
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;
|
return task_return_data;
|
||||||
}
|
}
|
||||||
if (act_done()) {
|
|
||||||
result_value = expr_engine_->evaluate("result");
|
if (fbState == FbState::InProgress) {
|
||||||
expr_engine_->printVars();
|
bool fbCond = expr_engine_->evaluateBool("feedback");
|
||||||
// 并且数据合法
|
bool done =
|
||||||
if (!std::isnan(result_value)) {
|
fb_fsm_.checkFeedback(fbCond, now_time_, expr_engine_->vars());
|
||||||
task_return_data.is_valid = true;
|
if (done) {
|
||||||
task_return_data.value = result_value;
|
result_value = expr_engine_->evaluate("result");
|
||||||
return task_return_data;
|
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;
|
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)) {
|
else if (!std::isnan(result_value)) {
|
||||||
@ -1175,7 +1048,7 @@ void ExpBase::reset_dev_data() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ExpBase::save_rule_norm_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) &&
|
((exp_type_ == ExpType::Bound || exp_type_ == ExpType::BoundHoldTime) &&
|
||||||
filter_flag_ == true)) {
|
filter_flag_ == true)) {
|
||||||
int64_t default_lt =
|
int64_t default_lt =
|
||||||
|
|||||||
@ -143,8 +143,6 @@ protected:
|
|||||||
|
|
||||||
string error_str_;
|
string error_str_;
|
||||||
|
|
||||||
bool feedback_done_ = false;
|
|
||||||
|
|
||||||
string unit_;
|
string unit_;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -155,13 +153,9 @@ protected:
|
|||||||
|
|
||||||
TimePoint act_start_time_;
|
TimePoint act_start_time_;
|
||||||
|
|
||||||
bool act_triggered_ = false;
|
|
||||||
|
|
||||||
bool act_started_ =
|
bool act_started_ =
|
||||||
false;
|
false;
|
||||||
|
|
||||||
bool feedback_triggered_ = false;
|
|
||||||
|
|
||||||
FbStateMachine fb_fsm_;
|
FbStateMachine fb_fsm_;
|
||||||
|
|
||||||
int refresh_counts_ = 0;
|
int refresh_counts_ = 0;
|
||||||
@ -204,52 +198,12 @@ protected:
|
|||||||
bool filter_flag_ = false;
|
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:
|
protected:
|
||||||
/**
|
/**
|
||||||
* @brief 从ihd查询数据--task用
|
* @brief 从ihd查询数据--task用
|
||||||
*/
|
*/
|
||||||
void query_ihd_data();
|
void query_ihd_data();
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 获得超时报警
|
|
||||||
* @return AlarmInfo
|
|
||||||
*/
|
|
||||||
AlarmInfo get_timeout_alarm();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 重新载入置信区间
|
* @brief 重新载入置信区间
|
||||||
* @return int
|
* @return int
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user