#include #include #include #include #include #include namespace { typedef char CoilID[32]; double limit_precision(double data, int precision) { double factor = std::pow(10, precision); return std::round(data * factor) / factor; } float limit_precision(float data, int precision) { float factor = std::pow(10, precision); return std::round(data * factor) / factor; } string double2str(double data, int precision) { std::stringstream ss; ss << std::fixed << std::setprecision(precision) << data; return ss.str(); } string float2str(float data, int precision) { std::stringstream ss; ss << std::fixed << std::setprecision(precision) << data; return ss.str(); } } // namespace EqpStatus::EqpStatus() { logger_ = std::make_unique("EqpStatus"); init(); p_btel = new BinaryTele(1002, "T_LOV_TELEITEM"); update_alarm_info(); update_coil_info(); } EqpStatus::~EqpStatus() {} void EqpStatus::init() { /*数据模板*/ string file_path = "/users/dsc/code/eqpm/json/eqp_status.json"; if (!JsonHelper::jsonReader(file_path, eqp_status_json_)) { logger_->Error() << "文件读取失败" << endl; } string config_file_path = "/users/dsc/code/eqpm/json/eqp_status_config.json"; if (!JsonHelper::jsonReader(config_file_path, eqp_status_config_json_)) { logger_->Error() << "文件读取失败" << endl; } } string EqpStatus::get_eqp_status() { return eqp_status_json_.dump(); } void EqpStatus::dispose(int event_no, const ::Ice::ByteSeq &seq, ::Ice::Int length) { p_btel->ReBuild(event_no, (char *)&seq[0]); int p_btel_size = p_btel->size(); // p_btel->Print(); // logger_->Debug() << eqp_status_config_json_.dump() << std::endl; /*------status_data------*/ mix_cc::json &status_data = eqp_status_json_["status_data"]; mix_cc::json &status_data_conf = eqp_status_config_json_["status_data"]; for (auto & [ key, value ] : status_data_conf.items()) { float now_value = p_btel->operator[]((int)(value.get() - 1)); status_data[key] = float2str( (int)now_value * p_btel->operator[]((int)(value.get() - 1)).factor, 1); if (tolower(p_btel->operator[]((int)(value.get() - 1)).type[0]) == 'b') { bool bv = p_btel->operator[]((int)(value.get() - 1)); status_data[key] = std::to_string(bv); } } /*-----tension-----*/ if (eqp_status_json_.contains("tension") && eqp_status_json_["tension"].is_array() && eqp_status_config_json_.contains("tension") && eqp_status_config_json_["tension"].is_array()) { mix_cc::json &tension_data = eqp_status_json_["tension"]; mix_cc::json &tension_data_conf = eqp_status_config_json_["tension"]; int td_size = tension_data.size(); int tdc_size = tension_data_conf.size(); if (td_size == tdc_size && td_size == 2) { for (int i = 0; i < td_size; i++) { mix_cc::json &tdi = tension_data[i]; mix_cc::json &tdci = tension_data_conf[i]; int tdi_size = tdi.size(); int tdci_size = tdci.size(); if (tdi_size == tdci_size) { for (int j = 0; j < tdi_size; j++) { float now_value = p_btel->operator[]((int)(tdci[j].get() - 1)); tdi[j] = float2str( now_value * p_btel->operator[]((int)(tdci[j].get() - 1)).factor, 2); // logger_->Debug() << "i:" << i << ",j:" << j // << ",value:" << now_value << std::endl; } } else { logger_->Error() << "tdi_size == tdci ERROR" << ",tdi_szie:" << tdi_size << ",tdci_size:" << tdci_size << std::endl; } } } else { logger_->Error() << "tdi_size == tdci ERROR" << ",td_size:" << td_size << ",tdc_size:" << tdc_size << std::endl; } } /*-----cpc----*/ mix_cc::json &cpc_data = eqp_status_json_["cpc"]; mix_cc::json &cpc_data_conf = eqp_status_config_json_["cpc"]; int cpc_size = cpc_data.size(); int cpcc_size = cpc_data_conf.size(); if (cpc_size == cpcc_size && cpcc_size == 3) { for (int i = 0; i < cpc_size; i++) { mix_cc::json &cpci = cpc_data[i]; mix_cc::json &cpcci = cpc_data_conf[i]; int cpci_size = cpci.size(); int cpcci_size = cpcci.size(); if (cpci_size == cpcci_size && cpci_size == 10) { for (int j = 0; j < cpci_size; j++) { int indexj_cpc = (int)(cpcci[j].get() - 1); if (p_btel->operator[](indexj_cpc).length == 2) { float now_value = p_btel->operator[](indexj_cpc); // if (indexj_cpc == 117) { if (indexj_cpc <= 117 && indexj_cpc >= 110) { now_value = (short)now_value & 1; logger_->Debug() << "now_value:" << now_value << endl; } cpci[j] = float2str( (float)now_value * p_btel->operator[]((int)(cpcci[j].get() - 1)).factor, 1); } else { bool now_value = p_btel->operator[](indexj_cpc); cpci[j] = (int)now_value; } } } else { logger_->Debug() << " cpci_size :" << cpci_size << ", cpcci_size:" << cpcci_size << std::endl; } } } else { logger_->Debug() << " cpc_size :" << cpc_size << ",cpcc_size:" << cpcc_size << std::endl; } /*---------TR-----------*/ mix_cc::json &TR_data = eqp_status_json_["TR"]; mix_cc::json &TR_data_conf = eqp_status_config_json_["TR"]; int TR_size = TR_data.size(); int TRc_size = TR_data_conf.size(); if (TR_size == TRc_size && TR_size == 6) { /*-----coildid-----*/ int start = TR_data_conf[0][0].get() - 1; int end = TR_data_conf[0][1].get() - 1; int char_len = (end - start + 1) * 2; CoilID tr_coild_id; int bg = 0; for (int i = 0; i < start; i++) { bg += p_btel->operator[](i).length; } memset(&tr_coild_id, 0, sizeof(CoilID)); memcpy(&tr_coild_id, (char *)&seq[0] + bg, char_len); // logger_->Debug() << "bg:" << bg << ",char_len:" << char_len // << ",tr_coild_id:" << tr_coild_id << std::endl; TR_data[0] = std::string(tr_coild_id); /*-----其他数据*/ for (int j = 1; j < TR_size; j++) { int indexj = (int)(TR_data_conf[j].get() - 1); float now_value = p_btel->operator[](indexj); if (j < 3) { TR_data[j] = float2str(now_value * p_btel->operator[](indexj).factor, 2); } else { TR_data[j] = float2str(now_value * p_btel->operator[](indexj).factor, 0); } // logger_->Debug() << "indexj:" << indexj << ",value:" << now_value // << std::endl; } } /*-------POR-------*/ mix_cc::json &por_data = eqp_status_json_["POR"]; mix_cc::json &por_data_conf = eqp_status_config_json_["POR"]; int POR_size = por_data.size(); int PORc_size = por_data_conf.size(); if (POR_size == PORc_size && POR_size == 2) { for (int i = 0; i < POR_size; i++) { mix_cc::json &pori_data = por_data[i]; mix_cc::json &pori_data_conf = por_data_conf[i]; int pori_size = pori_data.size(); int porci_size = pori_data_conf.size(); if (pori_size == porci_size && pori_size == 5) { /*---------coild_id--*/ int start = pori_data_conf[0][0].get() - 1; int end = pori_data_conf[0][1].get() - 1; int char_len = (end - start + 1) * 2; CoilID por_coild_id; int bg = 0; for (int j = 0; j < start; j++) { bg += p_btel->operator[](j).length; } // for (int k = 0; k < char_len / 2; k++) { // short vl = p_btel->operator[](start + k); // logger_->Debug() << "start:" << start + 1 // << ",now index:" << start + 1 + k // << ",coidid int data:" << vl << std::endl; // } memset(&por_coild_id, 0, sizeof(CoilID)); memcpy(&por_coild_id, (char *)&seq[0] + bg , char_len); // logger_->Debug() << "bg:" << bg << ",char_len:" << char_len // << ",por_coild_id:" << por_coild_id << std::endl; pori_data[0] = std::string(por_coild_id); /*-----其他数据*/ for (int k = 1; k < pori_size; k++) { float now_value = p_btel->operator[]((int)(pori_data_conf[k].get() - 1)); pori_data[k] = (int)now_value; } int mt = pori_data[pori_size - 1].get() / 60; int sed = pori_data[pori_size - 1].get() % 60; string rm = std::to_string(mt) + ":" + std::to_string(sed); pori_data[pori_size - 1] = rm; } else { logger_->Debug() << "pori_size:" << pori_size << ",porci_size:" << porci_size << std::endl; } } } else { logger_->Debug() << "POR_size:" << POR_size << ",PORc_size:" << PORc_size << std::endl; } } void EqpStatus::update_alarm_info() { logger_->Debug() << "update_alarm_info()" << std::endl; mix_cc::json &eqp_status = eqp_status_json_["eqp_status"]; mix_cc::json &eqpid = eqp_status["eqpid"]; mix_cc::json &isAlarm = eqp_status["isAlarm"]; int epqid_size = eqpid.size(); short statuscode1 = 100; short statuscode2 = 200; for (int i = 0; i < epqid_size; i++) { string eqpidi = eqpid[i].get(); // int res = select_alarm_count(eqpidi, 0); int res1 = select_alarm_count(eqpidi, statuscode1); logger_->Debug() << "first---eqpid:" << eqpidi << ",未处理报警数量:" << res1 << std::endl; int res2 = select_alarm_count(eqpidi, statuscode2); logger_->Debug() << "second--eqpid:" << eqpidi << ",未处理报警跟踪数量:" << res2 << std::endl; int isAlarmNow = res2 == 0 ? 0 : 2; isAlarm[i] = res1 == 0 ? isAlarmNow : 1; } // for (int i = 0; i < epqid_size; i++) { // string eqpidi = eqpid[i].get(); // int res = select_alarm_count(eqpidi, 0); // logger_->Debug() << "eqpid:" << eqpidi << ",报警数量:" << res << // std::endl; isAlarm[i] = res == 0 ? res : 1; // } } int EqpStatus::select_alarm_count(string eqpid, int dealresult) { FV_RESULT_JOIN_EQPID frje; auto min_time = mix_cc::mix_time_t(chrono::system_clock::now() - chrono::days(3)); auto sql_statement = select(frje.ruleid()) .from(frje) .where(frje.eqpid().like(eqpid + "%"), frje.alarmtime() > min_time, frje.dealresult() == dealresult, frje.rank() == 1); logger_->Debug() << "sql_str:" << sql_statement.get_command() << std::endl; auto sql_rsult_maybe = exec(sql_statement); if (sql_rsult_maybe.is_just()) { auto sql_rsult = sql_rsult_maybe.unsafe_get_just(); if (sql_rsult.empty()) { logger_->Debug() << "FV_RESULT_JOIN_EQPID 未查到数据,设备id:" << eqpid << ",dealresult:" << dealresult << std::endl; return 0; } else { logger_->Debug() << "FV_RESULT_JOIN_EQPID 查询到数据数量:" << sql_rsult.size() << ",设备id:" << eqpid << ",dealresult:" << dealresult << std::endl; return sql_rsult.size(); } } else { logger_->Error() << "EqpStatus::update_alarm_info()查询失败!" << std::endl; return 0; } return 0; } int EqpStatus::select_alarm_count(string eqpid, short statuscode) { FV_RESULT_JOIN_EQPID frje; auto min_time = mix_cc::mix_time_t(chrono::system_clock::now() - chrono::days(3)); auto sql_statement = select(frje.ruleid()) .from(frje) .where(frje.eqpid().like(eqpid + "%"), frje.alarmtime() > min_time, frje.statuscode() == statuscode, frje.rank() == 1); logger_->Debug() << "sql_str:" << sql_statement.get_command() << std::endl; auto sql_rsult_maybe = exec(sql_statement); if (sql_rsult_maybe.is_just()) { auto sql_rsult = sql_rsult_maybe.unsafe_get_just(); if (sql_rsult.empty()) { logger_->Debug() << "FV_RESULT_JOIN_EQPID 未查到数据,设备id:" << eqpid << ",statuscode:" << statuscode << std::endl; return 0; } else { logger_->Debug() << "FV_RESULT_JOIN_EQPID 查询到数据数量:" << sql_rsult.size() << ",设备id:" << eqpid << ",statuscode:" << statuscode << std::endl; return sql_rsult.size(); } } else { logger_->Error() << "EqpStatus::update_alarm_info()查询失败!" << std::endl; return 0; } return 0; } void EqpStatus::update_coil_info() { FV_DSC_PDI_DATA fdpd; auto sql_statement = select(fdpd.entid(), fdpd.extid(), fdpd.hentry(), fdpd.exthickave(), fdpd.width(), fdpd.weightcoil(), fdpd.diameterinside(), fdpd.diameteroutside(), fdpd.steelgrade()) .from(fdpd); auto sql_rsult_maybe = exec(sql_statement); if (sql_rsult_maybe.is_just()) { auto sql_rsult = sql_rsult_maybe.unsafe_get_just(); if (sql_rsult.empty()) { logger_->Debug() << "FV_DSC_PDI_DATA 未查到数据,设备id:" << std::endl; return; } else { mix_cc::json &js1 = this->eqp_status_json_["steel_coil_info"]["data"]; int rt_size = sql_rsult.size(); logger_->Debug() << "FV_DSC_PDI_DATA 查询到数据数量:" << rt_size << std::endl; for (int i = 0; i < rt_size; i++) { js1[i][0] = sql_rsult[i].entid; js1[i][1] = sql_rsult[i].extid; js1[i][2] = sql_rsult[i].hentry; js1[i][3] = sql_rsult[i].exthickave; js1[i][4] = sql_rsult[i].width; js1[i][5] = sql_rsult[i].weightcoil; js1[i][6] = sql_rsult[i].diameterinside; js1[i][7] = sql_rsult[i].diameteroutside; js1[i][8] = sql_rsult[i].steelgrade; } } } else { logger_->Error() << "EqpStatus::update_coil_info()查询失败!" << std::endl; return; } }