#include #include #include int AlgCommon::init() { LOG d("AlgCommon::init", AUTO_CATCH_PID); int ret = 0; try { } catch (const std::exception &e) { d.Error() << mix_cc::get_nested_exception(e) << std::endl; ret = -1; } return ret; } AlgCommon::AlgCommon(const string name, const Json::Value rulejson, const string ruleId) : AlgBase(name, rulejson, ruleId) { // CMemTable mod1("ZONE0",1); // gb_data = mod1(); LOG d("AlgCommon::AlgCommon", AUTO_CATCH_PID); this->init(); memset(&timeRegion, 0, sizeof(timeRegion)); timeRegion.bLeftClosed = true; timeRegion.bRightClosed = true; this->set_cycle_time(max(50, m_json_param["check"]["time"][1].asInt())); records_queried_ = new HD3Record *[m_tags.size()]; for (unsigned int i = 0; i < m_tags.size(); i++) { string tag = "tag" + std::to_string(i + 1); m_vars[tag] = 0.0; } string expdata(m_json_param["action_condition"]["str"][1].asString()); mp_exp = new MathExpression(expdata.c_str(), m_vars); // d.Debug() << "mp_exp: " << expdata << ",ret:"<evaluate()<< endl; } AlgCommon::~AlgCommon() { delete[] records_queried_; delete mp_exp; } int AlgCommon::calculate(string &outjson) { LOG d("AlgCommon::calculate", AUTO_CATCH_PID); outjson = ""; int ret = 0; try { time_t m_curr = this->mstime(); int dltime = m_json_param["check"]["time"][1].asInt(); time_t m_start = m_curr - dltime; time_t m_end = m_curr; timeRegion.left.nSec = m_start / 1000; timeRegion.left.nMsec = m_start % 1000; timeRegion.right.nSec = m_end / 1000; timeRegion.right.nMsec = m_end % 1000; int min_tagCnt = INT_MAX; for (unsigned int i = 0; i < m_tags.size(); i++) { int tagcnt = ihd_tools_->GetDataCount(m_tags[i], timeRegion); // records_queried_[i] = new HD3Record[tagcnt]; if (tagcnt < 1) { d.Debug() << rule_name_ << " : " << m_tags[i] << " tagcnt = 0 ! " << endl; return 0; } min_tagCnt = min(min_tagCnt, tagcnt); } // d.Debug() << rule_name_ << " diff: " << m_end - m_start << " cnt: " << // min_tagCnt << " v: " << (m_end - m_start) / (min_tagCnt + 1) << endl; // if((m_end - m_start) / (min_tagCnt + 1) > IHD_FREQUENCY * 1.1){ // //d.Debug() << " 该时间段内IHDB数据不完整! " << endl; // //d.Debug() << rule_name_ << " 该时间段内IHDB数据不完整! " << " diff: " << // m_end - m_start << " cnt: " << min_tagCnt << " v: " << (m_end - // m_start) / (min_tagCnt + 1) << endl; return 0; // } for (unsigned int i = 0; i < m_tags.size(); i++) { records_queried_[i] = new HD3Record[min_tagCnt]; ret = ihd_tools_->QueryDataByTime(m_tags[i], records_queried_[i], timeRegion, &min_tagCnt); } string str_changed = m_json_param["changed_parm"]["list"][1].asString(); string str_unchanged = m_json_param["unchanged_parm"]["list"][1].asString(); string msg = m_json_param["limit_error"]["content"][1].asString() + " "; bool m_flag = false; for (int j = 0; j < min_tagCnt; j++) { for (unsigned int i = 0; i < m_tags.size(); i++) { string tag = "tag" + std::to_string(i + 1); m_vars[tag] = ((records_queried_[i][j].nTagType == 0) ? records_queried_[i][j].value.nInt8 : records_queried_[i][j].value.fFloat32); } double ret = mp_exp->evaluate(); // d.Debug() << "exp: " << mp_exp->Disassemble() << " ret: " << ret << // endl; d.Debug() << " ret: " << ret << endl; if (fabs(ret - m_json_param["action_condition"]["result"][1].asDouble()) > EPS) { //表达式条件不满足 m_flag = true; break; } } for (unsigned int i = 0; i < m_tags.size(); i++) { delete[] records_queried_[i]; } if (m_flag) { return 0; } if (!str_changed.empty()) { for (int i = m_tags.size() - 1; i >= 0; i--) { string tag = "tag" + std::to_string(i + 1); string::size_type pos = 0; if ((pos = str_changed.find(tag)) != string::npos) { //检测变量的最大最小值 double m_max = ihd_tools_->StatsTag(m_tags[i], m_start, m_end, HD3_STATS_TYPE_MAX); double m_min = ihd_tools_->StatsTag(m_tags[i], m_start, m_end, HD3_STATS_TYPE_MIN); if (m_max - m_min > m_json_param["changed_parm"]["range"][1].asDouble()) { string tagname = m_json_param["tags"][tag][2].asString(); msg = msg + " " + tagname + "有变化" + " max: " + std::to_string(m_max) + " min: " + std::to_string(m_min) + ",差值: " + std::to_string(m_max - m_min); // msg = msg + " " + tagname + "有变化"; } else { // d.Debug() << rule_name_ << " 数据正常! " << endl; return 0; } // str_changed = str_changed.replace(pos, // tag.size(),"",AUTO_CATCH_PID); } } } if (!str_unchanged.empty()) { for (int i = m_tags.size() - 1; i >= 0; i--) { string tag = "tag" + std::to_string(i + 1); string::size_type pos = 0; if ((pos = str_unchanged.find(tag)) != string::npos) { //检测变量的最大最小值 double m_max = ihd_tools_->StatsTag(m_tags[i], m_start, m_end, HD3_STATS_TYPE_MAX); double m_min = ihd_tools_->StatsTag(m_tags[i], m_start, m_end, HD3_STATS_TYPE_MIN); // d.Debug() << rule_name_ << " max: " << m_max << " min: " << m_min << // endl; if (fabs(m_max - m_min - m_json_param["unchanged_parm"]["range"][1].asDouble()) < EPS) { string tagname = m_json_param["tags"][tag][2].asString(); // msg = msg + " " + tagname + "在" + // std::to_string(dltime) + "ms内" + "未发生变化! "; msg = msg + " " + tagname + "在" + std::to_string(dltime) + "ms内" + "未发生变化! " + ",值为: " + std::to_string(m_max); } else { // d.Debug() << rule_name_ << " 数据正常! " << endl; return 0; } // str_unchanged = str_unchanged.replace(pos, // tag.size(),"",AUTO_CATCH_PID); } } } // d.Debug() << msg << endl; string tmp = this->build_alarm_info(MsgLevel::ERROR, rule_id_, rule_name_, "COMMON", msg, timeRegion); if (!tmp.empty()) outjson = tmp; } catch (const std::exception &e) { d.Error() << mix_cc::get_nested_exception(e) << std::endl; ret = -1; } return ret; }