#include "TestService.h" #include "pid.h" #include "valve.h" #include "ballvalve.h" #include "PressureSensor.h" #include #include #include #include #include #include #include #include #include TestService::TestService(QThread *parent) :QThread(parent) ,m_SerialUi3(nullptr) ,m_SerialUi4(nullptr) ,m_pTimer_1(nullptr) ,m_pTimer_2(nullptr) ,m_compartmentid(0) { m_bRunning=false; for(int i=0; i 0 && compartment_num <= MAX_COMPARTMENT_NUM){ int volume_sum =0; for(int i=0; igetStandard(standard_name, m_standard)){ for(int i=0; i= m_standard.item[j].oilcompartment_volume){ m_tank.m_comparts[i].m_standarditem = m_standard.item[j]; qDebug("setTankinfo: compart [%d]: volume[%d]", i, m_standard.item[j].oilcompartment_volume); qDebug("setTankinfo: compart [%d]: sys[%f]", i, m_standard.item[j].system_threshold); qDebug("setTankinfo: compart [%d]: valve[%f]", i, m_standard.item[j].valve_threshold); break; } } } }else{ QString str = "所选标准不存在!"; emit onNotice(str); ret_bool = false; } } return ret_bool; } bool TestService::tstart(int compartmentid, int direction) { if(m_bRunning){ QString str = "当前有任务正在进行中..."; emit onNotice(str); return false; } m_compartmentid = compartmentid-1; if(0 == direction) m_direction = Test_Direction_Positive; else m_direction = Test_Direction_Negative; m_stage = Test_Stage_SysTest; m_step = Test_Step_Start; m_pressuremutex.lock(); m_pressurelist.clear(); //用来计算平均压力 m_pressuremutex.unlock(); QMessageBox::StandardButton result = QMessageBox::information(NULL, "提示:", "请对油气回收系统相关部件进行检查", QMessageBox::Ok|QMessageBox::Abort, QMessageBox::Ok); switch (result) { case QMessageBox::Ok: qDebug()<<"Ok"; m_pTimer_1->start(1*1000); // 1s m_bRunning = true; start(); break; case QMessageBox::Abort: qDebug()<<"Abort"; return false; break; default: qDebug()<<"default"; return false; break; } return true; } bool TestService::tselfstart(int compartmentid, int direction) { if(m_bRunning){ QString str = "当前有任务正在进行中..."; emit onNotice(str); return false; } m_compartmentid = compartmentid-1; if(0 == direction) m_direction = Test_Direction_Positive; else m_direction = Test_Direction_Negative; m_stage = Test_Stage_SysTest; m_step = Test_Step_Start; m_pressuremutex.lock(); m_pressurelist.clear(); //用来计算平均压力 m_pressuremutex.unlock(); QMessageBox::StandardButton result = QMessageBox::question(NULL, "提示:", "系统即将自检,请确认所有部件都己接好", QMessageBox::Ok|QMessageBox::Abort, QMessageBox::Ok); switch (result) { case QMessageBox::Ok: qDebug()<<"Ok"; m_pTimer_1->start(1*500); // 1s m_bRunning = true; start(); break; case QMessageBox::Abort: qDebug()<<"Abort"; return false; break; default: qDebug()<<"default"; return false; break; } return true; } bool TestService::tstop(int compartmentid) { if(m_compartmentid != compartmentid-1){ return false; } if(m_pTimer_1->isActive()) m_pTimer_1->stop(); //if(m_pTimer_2->isActive()) // m_pTimer_2->stop(); if(m_bRunning){ //stop(); m_bRunning = false; } return true; } bool TestService::reportpic_Ready(int compartmentid) { Compartment& com = m_tank.get_compartment(compartmentid-1); com.m_bpicReady = true; return true; } bool TestService::check_alltest_ok() { bool ret_flag = true; for(int i=0; i< m_tank.compartment_num; i++){ Compartment& com = m_tank.get_compartment(i); if(com.m_bpicReady == false ){ ret_flag = false; break; } } if(false == ret_flag){ QMessageBox::StandardButton result = QMessageBox::question(NULL, "提示:", "有油仓还未进行检测,是否强制生成报告?", QMessageBox::Yes|QMessageBox::No, QMessageBox::No); switch (result) { case QMessageBox::Yes: ret_flag = true; break; case QMessageBox::No: break; default: break; } } return ret_flag; } void TestService::receive_reportprogress(QString qstr) { qDebug() << "TestService::receive_reportprogress "; qDebug() << qstr; emit onGenreportProgress(qstr); } bool TestService::genReport(QString word_path, QString pic_dir) { if(word_path.contains(".doc")){ return m_report.make_Word(m_tank, word_path, pic_dir); }else if(word_path.contains(".pdf")){ return m_report.make_PDF(m_tank, word_path, pic_dir); } QString str = "word_path invalid!"; qDebug() << str; return false; } QJsonObject TestService::get_vrs_items() { return m_tank.get_vrs_items(); } QJsonObject TestService::get_bls_items() { return m_tank.get_bls_items(); } bool TestService::set_item_result(const QString& jsonStr ) { return m_tank.set_item_result(jsonStr); } void TestService::push_pressurelist(float pressure) { m_pressuremutex.lock(); if(m_pressurelist.size() == AVERAGE_PRESSURE_COUNT){ m_pressurelist.removeAt(0); } m_pressurelist.append(pressure); m_pressuremutex.unlock(); } void TestService::clear_pressurelist() { m_pressuremutex.lock(); m_pressurelist.clear(); //用来计算平均压力 m_pressuremutex.unlock(); } float TestService::calculate_averagepressure() { float average = 0.0; m_pressuremutex.lock(); int n = m_pressurelist.size(); if(n>0){ float sum = 0.0; for(int i=0; i= AVERAGE_PRESSURE_COUNT){ //data is to old, clear clear_pressurelist(); qDebug("clear_pressurelist "); } } int _ipressure = pressure*100; pressure = _ipressure/100.0; QString pressure_str = QString("%1").arg(pressure, 4,'f',2,QLatin1Char('0')); return pressure_str; } bool TestService::pressure_zero() { PressureSensor ps(&m_SerialUi4); return ps.Set_Zero(); } bool TestService::ballvalve_control(QString position_str) { bool ok; ushort position = position_str.toUShort(&ok, 10); BallValve ball_v(&m_SerialUi4); return ball_v.SetPosition(position); } QJsonObject TestService::ballvalve_status() { unsigned char status; unsigned short value = 0; QJsonObject rootObj; BallValve ball_v(&m_SerialUi4); ball_v.GetSP(status, value); if(ball_v.GetSP(status, value)){ switch(status){ case BALLVALVE_STATUS_OPENING: rootObj.insert("status", "opening"); break; case BALLVALVE_STATUS_CLOSING: rootObj.insert("status", "closing"); break; case BALLVALVE_STATUS_OPENEND: rootObj.insert("status", "opened"); break; case BALLVALVE_STATUS_CLOSEEND: rootObj.insert("status", "closed"); break; case BALLVALVE_STATUS_BREAK: rootObj.insert("status", "break"); break; case BALLVALVE_STATUS_FAULT: rootObj.insert("status", "fault"); break; default: rootObj.insert("status", "unkown"); break; } rootObj.insert("position", value); }else{ rootObj.insert("status", "unkown"); rootObj.insert("position", 0); } return rootObj; } void TestService::dump_comstatistic() { QString filepath = "D:/VaporRecoverySystemTest/comstatistic.txt"; Valve in_v(&m_SerialUi3, VALVE_INTAKE); in_v.Dump_Statistics(filepath); PressureSensor ps(&m_SerialUi4); ps.Dump_Statistics(filepath); BallValve bv(&m_SerialUi4); bv.Dump_Statistics(filepath); } void TestService::OnTimer1() { float pressure = 0.00; static int timeout_count =0; PressureSensor ps(&m_SerialUi4); if(ps.Read(pressure)){ //int _ipressure = pressure*100; //if(_ipressure<100){ // _ipressure=0; //} //pressure = _ipressure/100.0; push_pressurelist(pressure); timeout_count=0; }else{ qDebug("Read_PressureValue failed"); pressure = calculate_averagepressure(); timeout_count++; if(timeout_count >= AVERAGE_PRESSURE_COUNT){ //data is to old, clear clear_pressurelist(); qDebug("clear_pressurelist "); } } int _ipressure = 0; //if(pressure >= 4.5){ // _ipressure = pressure*10; // pressure = _ipressure/10.0; //}else{ _ipressure = pressure*100; pressure = _ipressure/100.0; //} //int _ipressure = pressure*100; //pressure = _ipressure/100.0; QString pressure_str = QString("%1").arg(pressure, 4,'f',2,QLatin1Char('0')); PressureItem item; //item.m_pressure = pressure_str; item.m_testDirection = m_direction; item.m_testStage = m_stage; item.m_testStep = m_step; QVariantMap map; map.clear(); map.insert("pressure", pressure_str); map.insert("direction", item.m_testDirection); map.insert("stage", item.m_testStage); map.insert("step", item.m_testStep); //QString pressure_str = QString("%1").arg(pressure, 5,'f',3,QLatin1Char('0')); //m_tank.m_comparts[m_compartmentid].m_currentpressure= pressure_str.toFloat(); emit sigPressure(m_compartmentid+1, map); } void TestService::OnTimer2() { //qDebug("OnTimer2 >>>enter "); //float pressure; //Read_pressure(pressure); //QThread::sleep(5); //emit Pressure_changed(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); //qDebug("OnTimer2 >>>leave "); } Ret_Value TestService::PositivePressure_Add(const TestExpect& expect, bool bSavedata) { Ret_Value ret_v = Ret_OK; int count = 0; int stable_counts = 0; int exceed_times =0; QElapsedTimer timer; timer.start(); float prev_pressure = 0; float current_pressure = 0; double current_speed = 0; unsigned char bvstatus; unsigned short bvposition; unsigned short bvoffset = 100; int holding_time = 60; PressureSensor ps(&m_SerialUi4); BallValve bv(&m_SerialUi4); bool bv_ready = false; bv.SetPosition(bvoffset); PID* pPIDouter = NULL; PID* pPIDinner = NULL; double speed_target = 0.0; //pPIDouter = new PID(1, 0.2, 0, 0.2, 0, 0); if(expect.volume <= 500){ pPIDouter = new PID(0.5, 0.2, 0, 0.2, 0, 0); pPIDinner = new PID(0.5, 200, 0, 1000, 50, 20, 50, 2); holding_time = 30; }else if(expect.volume <= 5000){ pPIDouter = new PID(1, 0.2, 0, 0.2, 0, 0); pPIDinner = new PID(1, 900, 0, 3000, 50, 30, 60, 10); holding_time = 60; }else if(expect.volume <= 10000){ pPIDouter = new PID(1, 0.2, 0, 0.2, 0, 0); pPIDinner = new PID(1, 900, 0, 4500, 80, 60, 60, 20); holding_time = 60; }else{ pPIDouter = new PID(1, 0.2, 0, 0.2, 0, 0); pPIDinner = new PID(1, 900, 0, 4500, 40, 60, 50, 20); holding_time = 30; } prev_pressure = calculate_averagepressure(); Valve in_v(&m_SerialUi3, VALVE_INTAKE); bool bOpen_intake = false; //bOpen_intake = in_v.Open(); // QDateTime datetime = QDateTime::currentDateTime(); QString timestr = datetime.toString("ddHHmmzzz"); QString filepath = "D:/VaporRecoverySystemTest/"; QFile datafile(filepath+timestr+"_PIDdata.csv"); bool datafile_opened = false; if(true == bSavedata){ datafile_opened = datafile.open(QFile::WriteOnly | QFile::Truncate); } //等待压力达到目标值附近 while(m_bRunning){ //等待球阀,到达指定位置 100 if(false == bv_ready){ if(false == bv.GetSP(bvstatus, bvposition)){ qDebug(" PositivePressure_Add, bv.GetSP failed"); }else{ if(BALLVALVE_STATUS_FAULT == bvstatus){ ret_v = Ret_Failed; break; } if((BALLVALVE_STATUS_OPENEND == bvstatus) || (BALLVALVE_STATUS_CLOSEEND == bvstatus) ){ int ps_offset = bvoffset; int cu_position = bvposition; if(abs(cu_position-ps_offset) < 10){ bv_ready=true; } }else{ bv.SetPosition(bvoffset); } } }else{ current_pressure = calculate_averagepressure(); current_speed = current_pressure - prev_pressure; prev_pressure = current_pressure; qDebug(" PositivePressure_Add, current_pressure : %f target: %f", current_pressure, expect.target); if(current_pressure >= expect.target+0.01){ count++; if(bOpen_intake){ qDebug(" PositivePressure_Add, in_v.Close "); if(in_v.Close()){ bOpen_intake = false; exceed_times++; } //bOpen_intake = false; } if(exceed_times <= 1){ stable_counts = 15; }else if(2 == exceed_times){ stable_counts =10; }else{ stable_counts =5; } //stable_counts = 15; //系统自测及容积较小时,球阀最好归零,否则因球阀不太紧漏气, 进气阀与球阀之间的气体会压向系统,导致压力升高 //当容器过大时, 如果压力超出后又降下来或系统存在漏气,需要重新加压,设置 bvoffset,能让重新加压速度快起来。 if(expect.volume < 100){ if(bv.SetPosition(0)) bvposition = 0; qDebug(" PositivePressure_Add, bv.SetPosition 0"); }else { if(bvoffset != bvposition){ if(bv.SetPosition(bvoffset)) bvposition = bvoffset; qDebug(" PositivePressure_Add, bv.SetPosition bvoffset"); } } }else{ if(current_pressure >= expect.target && current_pressure < expect.target + 0.01){ count++; }else{ count=0; if(stable_counts > 0){ stable_counts--; } if(false == bOpen_intake && 0 == stable_counts){ bOpen_intake = in_v.Open(); qDebug(" PositivePressure_Add, in_v.Open 222 "); pPIDinner->reset(); } } if(NULL != pPIDouter && NULL != pPIDinner && 0 == stable_counts){ speed_target = pPIDouter->calculate(expect.target+0.01, current_pressure); qDebug(" PositivePressure_Add, pPIDinner speed_target:%f, current_speed:%f", speed_target, current_speed); double inc = pPIDinner->calculate(speed_target, current_speed); unsigned short position = bvoffset +inc; //qDebug(" PositivePressure_Add, position : %d", position); if(bvposition != position){ qDebug(" PositivePressure_Add, position : %d", position); if(bv.SetPosition(position)) bvposition = position; } }else{ if(0 == stable_counts){ qDebug(" PositivePressure_Add, NULL = pPIDouter NULL == pPIDinner "); } //qDebug(" PositivePressure_Add, NULL = pPIDouter NULL == pPIDinner "); } } } if(count >= holding_time){ //about 60s break; } if(true == bSavedata && true == datafile_opened){ QTextStream out(&datafile); // 输入流 QString str1 = QString("%1").arg(expect.target, 8,'f',6,QLatin1Char('0')); QString str2 = QString("%1").arg(current_pressure, 8,'f',6,QLatin1Char('0')); //out << QString::number(expect.target) << "," << QString::number(current_pressure) << ","; out << str1 << "," << str2 << ","; str1 = QString("%1").arg(speed_target, 8,'f',6,QLatin1Char('0')); str2 = QString("%1").arg(current_speed, 8,'f',6,QLatin1Char('0')); //out << QString::number(speed_target) << "," << QString::number(current_speed) << ","; out << str1 << "," << str2 << ","; out << QString::number(bvposition) << "\n"; } QThread::msleep(500); int remainingtime = expect.timeout*1000 - timer.elapsed(); if(remainingtime <= 0){ qDebug(" add_pressure timeout, Rough valve will colse"); ret_v = Ret_Timeout; break; } } if(!m_bRunning){ // be stoped ret_v = Ret_Exit; } if(NULL != pPIDouter){ delete pPIDouter; } if(NULL != pPIDinner){ delete pPIDinner; } in_v.Close(); bv.SetPosition(0); if(true == bSavedata && true == datafile_opened){ datafile.close(); } return ret_v; } Ret_Value TestService::PositivePressure_Add_V2(const TestExpect& expect) { Ret_Value ret_v = Ret_OK; int count = 0; QElapsedTimer timer; timer.start(); float current_pressure = 0; unsigned char bvstatus; unsigned short bvposition; unsigned short bvoffset = 120; int holding_time = 60; PressureSensor ps(&m_SerialUi4); BallValve bv(&m_SerialUi4); bool bv_ready = false; bv.SetPosition(bvoffset); PID* pPID = NULL; if(expect.volume <= 200){ pPID = new PID(1, 200, 0, 0, 2, 0.4); holding_time = 60; }else if(expect.volume <= 4000){ pPID = new PID(1, 500, 0, 0, 5, 0.6); holding_time = 60; }else if(expect.volume <= 6000){ pPID = new PID(1, 800, 0, 0, 6, 1.0); holding_time = 120; }else if(expect.volume <= 8000){ pPID = new PID(1, 800, 0, 0, 7, 2); holding_time = 180; }else{ pPID = new PID(1, 800, 0, 0, 8, 3); holding_time = 180; } Valve in_v(&m_SerialUi3, VALVE_INTAKE); bool bOpen_intake = false; //bOpen_intake = in_v.Open(); //等待压力达到目标值附近 while(m_bRunning){ //等待球阀,到达指定位置 100 if(false == bv_ready){ if(false == bv.GetSP(bvstatus, bvposition)){ qDebug(" PositivePressure_Add, bv.GetSP failed"); }else{ if(BALLVALVE_STATUS_FAULT == bvstatus){ ret_v = Ret_Failed; break; } if((BALLVALVE_STATUS_OPENEND == bvstatus) || (BALLVALVE_STATUS_CLOSEEND == bvstatus) ){ int ps_offset = bvoffset; int cu_position = bvposition; if(abs(cu_position-ps_offset) < 10){ bv_ready=true; } }else{ bv.SetPosition(bvoffset); } } }else{ current_pressure = calculate_averagepressure(); qDebug(" PositivePressure_Add, current_pressure : %f target: %f", current_pressure, expect.target); if(current_pressure >= expect.target+0.05){ count++; if(bOpen_intake){ qDebug(" PositivePressure_Add, in_v.Close "); if(in_v.Close()) bOpen_intake = false; } //系统自测及容积较小时,球阀最好归零,否则因球阀不太紧漏气, 进气阀与球阀之间的气体会压向系统,导致压力升高 //当容器过大时, 如果压力超出后又降下来或系统存在漏气,需要重新加压,设置 bvoffset,能让重新加压速度快起来。 if(expect.volume < 100){ if(bv.SetPosition(0)) bvposition = 0; qDebug(" PositivePressure_Add, bv.SetPosition 0"); }else { if(bvoffset != bvposition){ if(bv.SetPosition(bvoffset)) bvposition = bvoffset; qDebug(" PositivePressure_Add, bv.SetPosition bvoffset"); } } }else if((current_pressure < expect.target+0.05) & (current_pressure >= expect.target) ){ count++; }else{ count = 0; if(false == bOpen_intake){ bOpen_intake = in_v.Open(); qDebug(" PositivePressure_Add, in_v.Open "); pPID->reset(); }else{ if(NULL != pPID){ double inc = pPID->calculate_v2(expect.target+0.05, current_pressure); unsigned short position = bvoffset +inc; //qDebug(" PositivePressure_Add, position : %d", position); if(bvposition != position){ qDebug(" PositivePressure_Add, position : %d", position); if(bv.SetPosition(position)) bvposition = position; } }else{ qDebug(" PositivePressure_Add, NULL = pPID "); } } } } if(count >= holding_time){ //about 60s break; } QThread::msleep(1000); int remainingtime = expect.timeout*1000 - timer.elapsed(); if(remainingtime <= 0){ qDebug(" add_pressure timeout, Rough valve will colse"); ret_v = Ret_Timeout; break; } } if(!m_bRunning){ // be stoped ret_v = Ret_Exit; } if(NULL != pPID){ delete pPID; } in_v.Close(); bv.SetPosition(0); return ret_v; } Ret_Value TestService::Pressure_Relief(const TestExpect& expect) { Ret_Value ret_v = Ret_OK; bool bOpen_ventv = false; Valve vent_v(&m_SerialUi3, VALVE_VENT); float current_pressure; QElapsedTimer timer; timer.start(); int count = 0; //打开泄压阀 bOpen_ventv = vent_v.Open(); //等待压力清零 while(m_bRunning){ if(false == bOpen_ventv){ bOpen_ventv = vent_v.Open(); } current_pressure = calculate_averagepressure(); if(current_pressure <= 0.02){ qDebug(" Pressure_Relief 111 finished"); count++; }else{ count=0; } if(count > 10){ //关闭泄压阀 if(vent_v.Close()){ break; } } QThread::msleep(1000); int remainingtime = expect.timeout*1000 - timer.elapsed(); if(remainingtime < 0){ ret_v = Ret_Timeout; qDebug("timeout, Pressure_Relief Timeout"); break; } } if(!m_bRunning){ ret_v = Ret_Exit; } vent_v.Close(); return ret_v; } Ret_Value TestService::Pressure_Relief() { Ret_Value ret_v = Ret_OK; bool bOpen_ventv = false; Valve vent_v(&m_SerialUi3, VALVE_VENT); float current_pressure; QElapsedTimer timer; timer.start(); int count = 0; //打开泄压阀 bOpen_ventv = vent_v.Open(); //等待压力清零 while(1){ if(false == bOpen_ventv){ bOpen_ventv = vent_v.Open(); } if(false == m_pTimer_1->isActive()) OnTimer1(); current_pressure = calculate_averagepressure(); if(current_pressure < 0.1){ qDebug(" Pressure_Relief finished 222"); count++; }else{ count=0; } if(count > 5){ //关闭泄压阀 vent_v.Close(); break; } QThread::msleep(1000); int remainingtime = 200*1000 - timer.elapsed(); if(remainingtime < 0){ ret_v = Ret_Timeout; qDebug("timeout, Pressure_Relief Timeout"); break; } } vent_v.Close(); qDebug(" Pressure_Relief leave"); return ret_v; } Ret_Value TestService::Pressure_Keep(int keeptime, float& start_value, float& end_value) { int count = 0; Ret_Value ret_v = Ret_OK; start_value = calculate_averagepressure(); int _ipressure = start_value*10; start_value = _ipressure/10.0; while((count < keeptime) && m_bRunning){ QThread::msleep(1000); count++; } end_value = calculate_averagepressure(); _ipressure = end_value*10; end_value = _ipressure/10.0; if(!m_bRunning){ // be stoped ret_v = Ret_Exit; } return ret_v; } bool TestService::self_checking() { //读继电器状态 Valve all_v(&m_SerialUi3, ALL_VALVE); if(false == all_v.Close()){ return false; } //读取球阀状态 BallValve ball_v(&m_SerialUi4); unsigned char status; unsigned short value; if(false == ball_v.GetSP(status, value)){ return false; } if(status == BALLVALVE_STATUS_FAULT){ return false; } ball_v.SetPosition(0); PressureSensor ps(&m_SerialUi4); float pressure = 0.0; if(false == ps.Read(pressure)){ return false; } return true; } bool TestService::test_init() { //bool ret_v=true; Valve all_v(&m_SerialUi3, ALL_VALVE); all_v.Close(); BallValve ball_v(&m_SerialUi4); unsigned char status; unsigned short value; if(ball_v.GetSP(status, value)){ if(value > 20){ ball_v.SetPosition(0); int wait_time = (1+value/100); QThread::msleep(wait_time*1000); } }else{ return false; } return true; } int TestService::make_messagebox(Test_Direction direction, Test_Step step, Ret_Value ret_v) { int ret_btn = QMessageBox::NoButton; QString notice_str; if(Test_Direction_Positive == direction){ switch(step){ case Test_Step_AddPressure: if(Ret_Timeout == ret_v){ notice_str = "加压超时, 是否重试?"; ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Retry); }else if(Ret_Failed == ret_v){ notice_str = "继电器通信失败, 和序终止"; ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Ok, QMessageBox::Ok); } break; case Test_Step_AdjustPressure: if( Ret_Timeout == ret_v ){ notice_str = "比例阀调压精调超时, 是否重试?"; ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Retry); //emit onNotice(notice_str); }else if(Ret_Failed == ret_v){ notice_str = "继电器通信失败, 程序终止"; ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Ok, QMessageBox::Ok); //emit onNotice(notice_str); } break; default: break; } }else { } return ret_btn; } void TestService::run() { qDebug("doTest >>>enter "); QString notice_str; QElapsedTimer q_time; int ret_btn = QMessageBox::NoButton; TestExpect texpect; bool bQuit = false; q_time.start(); Ret_Value ret_v = Ret_OK; if(m_compartmentid >= 0){ if(m_direction == Test_Direction_Positive){ while(m_bRunning && (bQuit == false)){ switch(m_step){ case Test_Step_Start: { m_tank.get_compartment(m_compartmentid).clear_result(); if(false == self_checking()){ ret_btn = m_msgbox.information(NULL, "提示:", "通信故障,请终止程序", QMessageBox::Abort, QMessageBox::Abort); }else{ test_init(); ret_btn = m_msgbox.information(NULL, "提示:", "请确认已经打开旋拧阀", QMessageBox::Ok, QMessageBox::Ok); } switch (ret_btn) { case QMessageBox::Ok: m_step = Test_Step_AddPressure; break; default: break; } } break; case Test_Step_AddPressure: { if(m_stage == Test_Stage_SysTest){ emit sigState(m_compartmentid+1, "回收系统测试,开始加压", ""); }else{ emit sigState(m_compartmentid+1, "回收阀测试,开始加压", ""); } texpect.target = m_standard.positive_target; texpect.volume = m_tank.m_comparts[m_compartmentid].m_volume; texpect.timeout = m_tank.m_comparts[m_compartmentid].get_addpressure_timeout(); ret_v = PositivePressure_Add(texpect); if(Ret_OK == ret_v){ if(m_stage == Test_Stage_SysTest){ m_step = Test_Step_KeepPressure; }else if(m_stage == Test_Stage_ValveTest){ m_msgbox.information(NULL, "提示:", "即将泄压, 请确认已经关闭油气回收阀。", QMessageBox::Ok, QMessageBox::Ok); m_step = Test_Step_reliefPressure; } }else if(Ret_Exit == ret_v){ bQuit = true; }else{ ret_btn = make_messagebox(m_direction, m_step, ret_v); switch (ret_btn) { case QMessageBox::Retry: qDebug()<<"Retry"; break; case QMessageBox::Abort: qDebug()<<"Abort"; bQuit = true; break; case QMessageBox::Ok: qDebug()<<"OK"; bQuit = true; break; default: break; } } } break; case Test_Step_KeepPressure: { if(m_stage == Test_Stage_SysTest){ emit sigState(m_compartmentid+1, "油气回收系统测试,开始保压", ""); }else{ emit sigState(m_compartmentid+1, "油气回收阀测试,开始保压", ""); } // 检测 5分钟都没超限,就是通过了 //float delta = 0; //float threshold = 0.0; //bool bPassed = true; // 检测 5分钟都没超限,就是通过了 float delta = 0; float start_value = 0.0; float end_value = 0.0; bool bPassed = true; //ret_v = Pressure_Keep2(5*60, start_value, end_value); if(m_stage == Test_Stage_SysTest){ ret_v = Pressure_Keep(5*60, start_value, end_value); m_tank.m_comparts[m_compartmentid].m_result.sysstart_pressure = start_value; m_tank.m_comparts[m_compartmentid].m_result.sysend_pressure = end_value; delta = start_value - end_value; m_tank.m_comparts[m_compartmentid].m_result.delta_sys_pressure = delta; if(Ret_Exit == ret_v){ bQuit = true; } else { if(delta < m_tank.m_comparts[m_compartmentid].m_standarditem.system_threshold){ bPassed = true; m_tank.m_comparts[m_compartmentid].m_result.pass_sys_pressure = true; }else{ bPassed = false; m_tank.m_comparts[m_compartmentid].m_result.pass_sys_pressure = false; } m_tank.m_comparts[m_compartmentid].m_result.sys_test_finished = true; QString delta_str = QString("%1").arg(delta, 4,'f',2,QLatin1Char('0')); emit sigSystemResult(m_compartmentid+1, delta_str, bPassed); emit sigState(m_compartmentid+1, "油气回收系统检测,结束", ""); ret_btn = QMessageBox::NoButton; notice_str = "系统密闭性已经检测完成,是否进行阀门密闭性检测?"; ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes); switch (ret_btn) { case QMessageBox::Yes: m_stage = Test_Stage_ValveTest; if(calculate_averagepressure() < m_standard.positive_target){ m_step = Test_Step_AddPressure; }else{ m_msgbox.information(NULL, "提示:", "即将泄压, 请确认已经关闭油气回收阀。", QMessageBox::Ok, QMessageBox::Ok); m_step = Test_Step_reliefPressure; //如果压力还在4.5以上, 可以不调压 } break; case QMessageBox::No: m_step = Test_Step_End; break; default: break; } } }else{ ret_v = Pressure_Keep(5*60, start_value, end_value); m_tank.m_comparts[m_compartmentid].m_result.valvestart_pressure = start_value; m_tank.m_comparts[m_compartmentid].m_result.valveend_pressure = end_value; delta = end_value - start_value; m_tank.m_comparts[m_compartmentid].m_result.delta_valve_pressure = delta; if(Ret_Exit == ret_v){ bQuit = true; }else { if(delta <= m_tank.m_comparts[m_compartmentid].m_standarditem.valve_threshold){ m_tank.m_comparts[m_compartmentid].m_result.pass_valve_pressure = true; bPassed = true; }else{ m_tank.m_comparts[m_compartmentid].m_result.pass_valve_pressure = false; bPassed = false; } m_tank.m_comparts[m_compartmentid].m_result.valve_test_finished = true; QString delta_str = QString("%1").arg(delta, 4,'f',2,QLatin1Char('0')); emit sigValveResult(m_compartmentid+1, delta_str, bPassed); emit sigState(m_compartmentid+1, "油气回收阀测试,结束", ""); m_step = Test_Step_End; } } } break; case Test_Step_reliefPressure: { if(m_stage == Test_Stage_SysTest){ emit sigState(m_compartmentid+1, "油气回收系统测试结束,开始泄压", ""); }else if(m_stage == Test_Stage_ValveTest){ emit sigState(m_compartmentid+1, "油气回收阀测试,开始泄压", ""); } texpect.volume = 0; texpect.target = 0.0; texpect.timeout = 120;//m_tank.m_comparts[m_compartmentid].get_adjust_timeout(); ret_v = Pressure_Relief(texpect); if(Ret_Exit == ret_v){ bQuit = true; }else if(Ret_OK == ret_v){ m_step = Test_Step_KeepPressure; if(m_stage == Test_Stage_ValveTest){ m_step = Test_Step_KeepPressure; }else{ m_step = Test_Step_End; } }else{ ret_btn = QMessageBox::NoButton; notice_str = "泄压超时, 是否重试?"; ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Retry); switch (ret_btn) { case QMessageBox::Retry: break; case QMessageBox::Abort: bQuit = true; break; case QMessageBox::Ok: bQuit = true; break; default: break; } } } break; default: break; } if(Test_Step_End == m_step){ break; } } }else{ //负压测试, 暂不支持 m_stage = Test_Stage_SysTest; qDebug(" negative test is not support now "); } }else{ //self test if(m_direction == Test_Direction_Positive){ while(m_bRunning && (bQuit == false)){ switch(m_step){ case Test_Step_Start: { emit sigState(m_compartmentid+1, "开始", ""); if(false == self_checking()){ ret_btn = m_msgbox.information(NULL, "提示:", "通信故障,请终止程序", QMessageBox::Abort, QMessageBox::Abort); }else{ test_init(); ret_btn = m_msgbox.information(NULL, "提示:", "请确认已经打开旋拧阀", QMessageBox::Ok, QMessageBox::Ok); } switch (ret_btn) { case QMessageBox::Ok: qDebug()<<"Yes"; m_step = Test_Step_AddPressure; break; case QMessageBox::Abort: bQuit = true; break; } } break; case Test_Step_AddPressure: { emit sigState(m_compartmentid+1, "加压", ""); QThread::msleep(2000); texpect.volume = 0; texpect.target = 4.50; texpect.timeout = 3*60; //5分钟 ret_v = PositivePressure_Add(texpect, true); if(Ret_Exit == ret_v){ bQuit = true; }else if(Ret_OK == ret_v){ m_step = Test_Step_KeepPressure; }else{ ret_btn = QMessageBox::NoButton; if(Ret_Timeout == ret_v){ notice_str = "正压加压超时, 是否重试?"; ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Retry|QMessageBox::Abort, QMessageBox::Retry); }else{ notice_str = "继电器通信失败, 程序终止"; ret_btn = m_msgbox.information(NULL, "提示:", notice_str, QMessageBox::Ok, QMessageBox::Ok); } switch (ret_btn) { case QMessageBox::Retry: break; case QMessageBox::Abort: bQuit = true; break; case QMessageBox::Ok: bQuit = true; break; default: break; } } } break; case Test_Step_KeepPressure: { emit sigState(m_compartmentid+1, "保压", ""); // 检测 5分钟都没超限,就是通过了 float delta = 0; float start_value = 0.0; float end_value = 0.0; bool bPassed = true; ret_v = Pressure_Keep(5*60, start_value, end_value); if(Ret_Exit == ret_v){ bQuit = true; }else { delta = start_value - end_value; if(delta <= 0.5){ bPassed = true; }else{ bPassed = false; } //QString delta_str = QString("%1").arg(delta, 4,'f',2,QLatin1Char('0')); QString info_str = "初始压力:"; info_str += QString("%1").arg(start_value, 4,'f',2,QLatin1Char('0')); info_str += ", 结束压力:"; info_str += QString("%1").arg(end_value, 4,'f',2,QLatin1Char('0')); info_str += ", Deta:"; info_str += QString("%1").arg(delta, 4,'f',2,QLatin1Char('0')); emit sigSelfTestResult(m_compartmentid+1, info_str, bPassed); emit sigState(m_compartmentid+1, "结束", ""); m_step = Test_Step_reliefPressure; } } break; case Test_Step_reliefPressure: { ret_btn = m_msgbox.information(NULL, "提示:", "栓测任务结束,是否要泄压?", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes); m_step = Test_Step_End; switch (ret_btn) { case QMessageBox::Yes: qDebug()<<"Yes"; { TestExpect expect; expect.target = 0.0; expect.volume = 0; expect.timeout = 30; ret_v = Pressure_Relief(expect); if(Ret_Exit == ret_v){ bQuit = true; } } break; default: break; } } break; default: break; } if(Test_Step_End == m_step){ break; } } }else{ //negtive } } if(Test_Step_End == m_step){ ret_btn = QMessageBox::NoButton; }else{ if(true == bQuit){ if(Ret_Exit == ret_v){ // 主动退出 ret_btn = m_msgbox.information(NULL, "提示:", "程序退出,是否要泄压?", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes); }else if(Ret_Timeout == ret_v){ // 超时退出 ret_btn = m_msgbox.information(NULL, "提示:", "程序超时退出,是否要泄压?", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes); }else{//通信错误退出 ret_btn = m_msgbox.information(NULL, "提示:", "程序通信错误退出,是否要泄压?", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes); } } } switch (ret_btn) { case QMessageBox::Yes: Pressure_Relief(); break; default: break; } if(m_bRunning){ m_bRunning = false; emit sigStop(m_compartmentid+1); } Valve all_v(&m_SerialUi3, ALL_VALVE); all_v.Close(); dump_comstatistic(); qDebug("doTest >>>leave "); }