#include "serialdevicetest.h" #include #include #include #include "deviceinfo.h" #include "deviceproxy.h" #include "rs_settings.h" #include bool bReadApFlag{false}; struct PID_PARAM { float SetValue; //定义设定值 float ActualValue; //定义实际值 float err; //定义偏差值 float err_last; //定义上一个偏差值 float Kp, Ki, Kd; //定义比例、积分、微分系数 //float voltage; //定义电压值(控制执行器的变量) float err_next; }; PID_PARAM gtPid = { 0 }; SerialDeviceTest::SerialDeviceTest(QWidget *parent): QFrame(parent), ui(new Ui::SerialDeviceTest) { ui->setupUi(this); // 获取文本光标(不是鼠标光标) int brightness; RS_SETTINGS->beginGroup("device/LightSource"); brightness = RS_SETTINGS->readNumEntry("/brightnessFind"); //Strobe = RS_SETTINGS->readNumEntry("/StrobeFind"); RS_SETTINGS->endGroup(); ui->spBrightness->setValue(brightness); //ui->spStrobe->setValue(Strobe); LIGHTSOURCEFIND->getSerialSet("lightsource"); LIGHTSOURCEFIND->getChnId("lightsource"); MODBUSTCP->getModbusPara("ModbusTCP"); //POWERMATT->getSerialSet("gonglvshuaijianqi"); POWERMETERLIGHT->getSerialSet("guanglugonglvji"); POWERMETERMACH->getSerialSet("jiagonggonglvji"); if (POWERMETERMACH->m_hComm == nullptr) { POWERMETERMACH->OpenComm(); } if (POWERMETERLIGHT->m_hComm == nullptr) { POWERMETERLIGHT->OpenComm(); } // if (POWERMATT->m_hComm == nullptr) // { // POWERMATT->OpenComm(); // } // POWERMATT->setPos(-5485); // gtPid.Kp = POWERMATT->pidP; // gtPid.SetValue = POWERMATT->dstPower; IPGLASER->getIPGLaerPara("IPGLaser"); if (IPGLASER->m_hComm == nullptr) { IPGLASER->OpenComm(); IPGLASER->SetParam(1); } HeartBeat(); HeartBeat_fl(); ReadApValue(); //PID_proc(); ui->grpCuHeightFind->setHidden(true); connect(DEV,SIGNAL(PowerMeterValueSGL(float,float)),this,SLOT(updatePowerMeterValue(float,float))); } SerialDeviceTest::~SerialDeviceTest() { delete ui; } void SerialDeviceTest::updatePowerMeterValue(float value,float average_value) { QString strValue = QString::number(static_cast(value),'f', 3) + " " + QString::number(static_cast(average_value),'f', 3); ui->lbPowerValue->setText(strValue); } void SerialDeviceTest::on_pbPowerRead_clicked() { float value = 0; if (ui->cmbPowerMeterID->currentText() == "加工功率计") { // if (POWERMETERMACH->m_hComm == nullptr) // { // POWERMETERMACH->getSerialSet("jiagonggonglvji"); // bool ret = POWERMETERMACH->OpenComm(); // if (!ret) // { // showExceptionInfoDialog("加工功率计串口打开错误!"); // DEVICE_INFO->printDeviceSystemInfo("加工功率计串口打开错误!"); // return; // } // } // int ret = POWERMETERMACH->GetValue(&value); // if (ret != 0) // { // showExceptionInfoDialog("加工功率计数据读取失败!"); // DEVICE_INFO->printDeviceSystemInfo("加工功率计数据读取失败!"); // return; // } // POWERMETERMACH->CloseComm(); bReadApFlag = true; } if (ui->cmbPowerMeterID->currentText() == "光路功率计") { if (POWERMETERLIGHT->m_hComm == nullptr) { POWERMETERLIGHT->getSerialSet("guanglugonglvji"); bool ret = POWERMETERLIGHT->OpenComm(); if (!ret) { showExceptionInfoDialog("光路功率计串口打开错误!"); DEVICE_INFO->printDeviceSystemInfo("光路功率计串口打开错误!"); return; } } int ret = POWERMETERLIGHT->GetValue(&value); if (ret != 0) { showExceptionInfoDialog("光路功率计数据读取失败!"); DEVICE_INFO->printDeviceSystemInfo("光路功率计数据读取失败!"); return; } } QString strValue = QString::number(static_cast(value),'f', 4); ui->lbPowerValue->setText(strValue); } void SerialDeviceTest::on_pbBarometer_clicked() { short value = 0; if (BAROMETER->m_hComm == nullptr) { BAROMETER->getSerialSet("barometer"); bool ret = BAROMETER->OpenComm(); if (!ret) { showExceptionInfoDialog("气压计串口打开错误!"); DEVICE_INFO->printDeviceSystemInfo("气压计串口打开错误!"); return; } } int ret = BAROMETER->GetHeightValue(18,1,&value); if (ret != 0) { showExceptionInfoDialog("气压计数据读取失败!"); DEVICE_INFO->printDeviceSystemInfo("气压计数据读取失败!"); return; } double tmp = value / 10.0; QString strValue = QString::number(tmp,'f', 4); ui->lbBarometer->setText(strValue+ " Kpa"); } void SerialDeviceTest::on_pbCuHeightFind_clicked() { double value = 0; if (PANHEIGHTFIND->m_hComm == nullptr) { PANHEIGHTFIND->getSerialSet("cucegaotou"); bool ret = PANHEIGHTFIND->OpenComm(); if (!ret) { showExceptionInfoDialog("粗测高头串口打开错误!"); return; } } int ret = PANHEIGHTFIND->GetHeightValue(1,&value); if (ret != 0) { showExceptionInfoDialog("粗测高头数据读取失败!"); return; } QString strValue = QString::number(value,'f', 4); ui->lbCuHeightFind->setText(strValue); } void SerialDeviceTest::showExceptionInfoDialog(const QString& text,QMessageBox::Icon value) { QMessageBox msg(this); DEVICE_INFO->printDeviceSalamInfo(text); msg.setWindowTitle("异常提示"); msg.setText(text); msg.setIcon(value); msg.exec(); return; } float PID_increment(float temp_val) { /*传入目标值*/ gtPid.ActualValue = temp_val; /*计算目标值与实际值的误差*/ gtPid.err = (gtPid.SetValue - gtPid.ActualValue); if (fabs(gtPid.err) < 0.001) { return 0; } /*PID算法实现*/ //float increment_val = gtPid.Kp*(gtPid.err - gtPid.err_next) + gtPid.Ki*gtPid.err + gtPid.Kd*(gtPid.err - 2 * gtPid.err_next + gtPid.err_last); /*累加*/ /*传递误差*/ gtPid.err_last = gtPid.err_next; gtPid.err_next = gtPid.err; /*返回当前实际值*/ //return increment_val; return gtPid.err * gtPid.Kp; } int writepidfile(QString strFileName, float power,int pos,float apValue) { QFile filePid(strFileName); if(filePid.open(QFile::WriteOnly|QFile::Append)) { QTextStream filePidOut(&filePid); filePidOut << power<<","<beginGroup("device/SSCS"); // QString path = RS_SETTINGS->readEntry("/dataSavePath"); // RS_SETTINGS->endGroup(); // if(path.right(1)!=QString("/")) // { // path+=QString("/"); // } // filename = path+"LookupTable_"+timestr+"_pid.csv"; // while (1) // { // if ((DEV->PidFlag) && (DEV->devLaserState == 1)) // { // count++; // if (count > 2) // { // ret = POWERMATT->GetSts(&sts); // if (sts == 0) // { // POWERMETERLIGHT->GetValue(&power); // if (power > 0.05) // { // ApValue = PID_increment(power); // int pos; // POWERMATT->GetPos(&pos); // writepidfile(filename, power,pos,ApValue); // if(fabs((pos + 5485) / 5485) > 0.2) // { // POWERMATT->setPos(-5485); // } // else // POWERMATT->setRPos(ApValue); // } // else // { // count = 0; // } // } // } // Sleep(5000); // } // else // { // count = 0; // Sleep(200); // } // } //} #include "deviceproxy.h" void myReadPowerValue() { float power = 0; float powerP2 = 0; QString filename; QDateTime datetime = QDateTime::currentDateTime(); QString timestr = datetime.toString("yyyyMMddHHmmss"); //QString timestr = datetime.toString("ddHHmmzzz"); RS_SETTINGS->beginGroup("device/SSCS"); QString path = RS_SETTINGS->readEntry("/dataSavePath"); RS_SETTINGS->endGroup(); if(path.right(1)!=QString("/")) { path+=QString("/"); } filename = path+DEV->ingotNumber+"_LookupTable_"+timestr+"_laser_test.csv"; RS_SETTINGS->beginGroup("device/Rposition"); double p1k = RS_SETTINGS->readNumDEntry("/p1k"); double p1b = RS_SETTINGS->readNumDEntry("/p1b"); RS_SETTINGS->endGroup(); RS_SETTINGS->beginGroup("device/SSCS"); double PowerThreshold = RS_SETTINGS->readNumDEntry("/PowerThreshold"); RS_SETTINGS->endGroup(); unsigned int checkCount = 0; while (1) { if ((DEV->PidFlag) && (DEV->devLaserState == 1) && (DEV->devLaserCheck)) { if (checkCount > 6) { POWERMETERLIGHT->GetValue(&power); if (DEV->LaserApValueP1 > 0.005) { double piancha = (DEV->ApPercentage*p1k + p1b - power) / (DEV->ApPercentage*p1k + p1b) * 100;//lihongchang if ((abs(piancha) > PowerThreshold)) //if (DEV->PidFlag) 这里自动调节?还是报警。调节范围是多少?这里要记录成文件。怎么调节,调节要关激光的!?下一次调节? { emit DEV->AutoExceptSGL(MyException(QString("P1光路异常 ")+ QString::number(piancha,'f', 3)+QString(",是否停止当前加工激光偏差提示?"))); if (DEV->DataCheckFlag) { DEV->devLaserCheck = false; } } } } checkCount++; Sleep(5000); } else { Sleep(200); checkCount = 0; } } } void myPidProc() { float power = 0; float powerP2 = 0; QString filename; QDateTime datetime = QDateTime::currentDateTime(); QString timestr = datetime.toString("yyyyMMddHHmmss"); //QString timestr = datetime.toString("ddHHmmzzz"); RS_SETTINGS->beginGroup("device/SSCS"); QString path = RS_SETTINGS->readEntry("/dataSavePath"); RS_SETTINGS->endGroup(); if(path.right(1)!=QString("/")) { path+=QString("/"); } filename = path+DEV->ingotNumber+"_LookupTable_"+timestr+"_laser_test.csv"; RS_SETTINGS->beginGroup("device/Rposition"); double p1kt = RS_SETTINGS->readNumDEntry("/p1k_t"); double p1bt = RS_SETTINGS->readNumDEntry("/p1b_t"); double p1ks = RS_SETTINGS->readNumDEntry("/p1k_s"); double p1bs = RS_SETTINGS->readNumDEntry("/p1b_s"); RS_SETTINGS->endGroup(); RS_SETTINGS->beginGroup("device/SSCS"); double PowerThreshold = RS_SETTINGS->readNumDEntry("/PowerThreshold"); RS_SETTINGS->endGroup(); unsigned int checkCount = 0; while (1) { if ((DEV->PidFlag) && (DEV->devLaserState == 1) && (DEV->devLaserCheck)) { if (checkCount > 6) { POWERMETERLIGHT->GetValue(&power); if (DEV->LaserApValueP1 > 0.005) { double piancha; if (DEV->Mach_T_S_flag == 1) { power = p1kt * power + p1bt; piancha = abs((DEV->R_detection_pt - power) * 100);//lihongchang } else { power = p1ks * power + p1bs; piancha = abs((DEV->R_detection_ps - power) * 100);//lihongchang } if ((abs(piancha) > PowerThreshold)) //if (DEV->PidFlag) 这里自动调节?还是报警。调节范围是多少?这里要记录成文件。怎么调节,调节要关激光的!?下一次调节? { emit DEV->AutoExceptSGL(MyException(QString("P1光路异常 ")+ QString::number(piancha,'f', 3)+QString(",是否停止当前加工激光偏差提示?"))); if (DEV->DataCheckFlag) { DEV->devLaserCheck = false; } } } } checkCount++; Sleep(5000); } else { Sleep(200); checkCount = 0; } // if ((DEV->PidFlag) && (DEV->devLaserState == 1) && (DEV->devLaserCheck)) // { // //if (checkCount > 2) // { // POWERMETERMACH->GetValue(&powerP2); // POWERMETERLIGHT->GetValue(&power); // writePowerfile(filename, power,powerP2); // } // checkCount++; // Sleep(2000); // } // else // { // Sleep(2000); // checkCount = 0; // } } } int readPowerValueThread() { float value = 0; float average_value = 0; float average[10]; int index = 0; while(1) { if (bReadApFlag) { if (POWERMETERMACH->m_hComm == nullptr) { POWERMETERMACH->getSerialSet("jiagonggonglvji"); bool ret = POWERMETERMACH->OpenComm(); if (!ret) { DEVICE_INFO->printDeviceSystemInfo("加工功率计串口打开错误!"); emit DEV->AutoExceptSGL(MyException(QString("加工功率计串口打开错误, ")+QString(",是否停止当前功率计读取?"))); if (DEV->DataCheckFlag) { bReadApFlag = false; } } } int ret = POWERMETERMACH->GetValue(&value); if (ret != 0) { DEVICE_INFO->printDeviceSystemInfo("加工功率计数据读取失败!"); emit DEV->AutoExceptSGL(MyException(QString("加工功率计数据读取失败, ")+QString(",是否停止当前功率计读取?"))); if (DEV->DataCheckFlag) { bReadApFlag = false; } //return -1; } average[index] = value; index++; if (index >= 10) index = 0; average_value = 0; for (int i=0;i<10;i++) { average_value = average_value + average[i]; } average_value = average_value / 10; emit DEV->PowerMeterValueSGL(value,average_value); } else { memset(average,0,10*4); index = 0; } Sleep(500); } } void myHeartBeat() { MODBUSTCP->Heartbeat(); } void myReadApValue() { readPowerValueThread(); } void myHeartBeat_fl() { MODBUSTCP->Heartbeat_fl(); } void SerialDeviceTest::readPowerValue() { //HeartBeat(); CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)myReadPowerValue, this, 0, NULL); } void SerialDeviceTest::PID_proc() { //HeartBeat(); CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)myPidProc, this, 0, NULL); } void SerialDeviceTest::HeartBeat() { //HeartBeat(); CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)myHeartBeat, this, 0, NULL); } void SerialDeviceTest::ReadApValue() { //HeartBeat(); CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)myReadApValue, this, 0, NULL); } void SerialDeviceTest::HeartBeat_fl() { //HeartBeat(); CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)myHeartBeat_fl, this, 0, NULL); } void ShangProc() { int ret; // if (MODBUSTCP->TransferPLCSts != 0) // { // DEVICE_INFO->printDeviceSystemInfo("横移模块已在上下料中,上料失败!"); // DEV->lastTaskIsFinish= true; // DEV->ShangLiaoFSGL(false); // return; // } DEVICE_INFO->printDeviceSystemInfo("上料开始..."); if(1) { ret = DEV->ShangProc(); } if (ret == 0) { DEVICE_INFO->printDeviceSystemInfo("上料完成"); DEV->ShangLiaoFSGL(true); } else { DEVICE_INFO->printDeviceSystemInfo("上料失败!"); DEV->ShangLiaoFSGL(false); } DEV->lastTaskIsFinish= true; return; } void XiaProc() { int ret; // if (MODBUSTCP->TransferPLCSts != 0) // { // DEVICE_INFO->printDeviceSystemInfo("横移模块已在上下料中,下料失败!"); // DEV->XiaLiaoFSGL(false); // DEV->lastTaskIsFinish= true; // return; // } DEVICE_INFO->printDeviceSystemInfo("下料开始..."); if(1) { ret = DEV->XiaProc(); } if (ret == 0) { DEVICE_INFO->printDeviceSystemInfo("下料完成"); DEV->XiaLiaoFSGL(true); } else { DEV->XiaLiaoFSGL(false); DEVICE_INFO->printDeviceSystemInfo("下料失败!"); } DEV->lastTaskIsFinish= true; return; } void SerialDeviceTest::on_pbXiaLiao_clicked() { DWORD ThreadID; HANDLE thrdHandle; if(!DEV->getDevIsReset()) { DEV->emit exceptSGL(MyException(QString("设备未初始化,未复位,无法执行寻边定位。请先完成复位。"),MY_WARN)); return; } if(!DEV->getLastTaskIsFinish()) { DEV->emit exceptSGL(MyException(QString("任务执行中,无法执行寻边定位。请先停止运动或等待任务结束。"),MY_WARN)); return; } if(DEV->bRunning) { DEV->emit exceptSGL(MyException(QString("自动运行执行中,请等待运行结束。"),MY_WARN)); return; } DEV->lastTaskIsFinish=false; DEV->lastTaskName="下料"; thrdHandle = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)XiaProc, this, 0, &ThreadID); } void SerialDeviceTest::on_pbShangLiao_clicked() { DWORD ThreadID; HANDLE thrdHandle; //这里是不是应该先运行到上下料位? if(!DEV->getDevIsReset()) { DEV->emit exceptSGL(MyException(QString("设备未初始化,未复位,无法执行寻边定位。请先完成复位。"),MY_WARN)); return; } if(!DEV->getLastTaskIsFinish()) { DEV->emit exceptSGL(MyException(QString("任务执行中,无法执行寻边定位。请先停止运动或等待任务结束。"),MY_WARN)); return; } if(DEV->bRunning) { DEV->emit exceptSGL(MyException(QString("自动运行执行中,请等待运行结束。"),MY_WARN)); return; } DEV->lastTaskIsFinish=false; DEV->lastTaskName="上料"; thrdHandle = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)ShangProc, this, 0, &ThreadID); } void SerialDeviceTest::on_spBrightness_valueChanged(int value) { if (ui->cmbCameraID->currentIndex() == 0) { RS_SETTINGS->beginGroup("device/LightSource"); RS_SETTINGS->writeEntry("/brightnessFind", value); RS_SETTINGS->endGroup(); DEVICE_INFO->printDeviceSystemInfo(QString("相机亮度设置完成,当前亮度为:%1/s").arg(value)); } else { RS_SETTINGS->beginGroup("device/LightSource"); RS_SETTINGS->writeEntry("/brightnessGlobal", value); RS_SETTINGS->endGroup(); DEVICE_INFO->printDeviceSystemInfo(QString("相机亮度设置完成,当前亮度为:%1/s").arg(value)); } } void SerialDeviceTest::on_cmbCameraID_currentIndexChanged(int index) { int brightness; //int Strobe; if (index == 0) { RS_SETTINGS->beginGroup("device/LightSource"); brightness = RS_SETTINGS->readNumEntry("/brightnessFind"); //Strobe = RS_SETTINGS->readNumEntry("/StrobeFind"); RS_SETTINGS->endGroup(); } else { RS_SETTINGS->beginGroup("device/LightSource"); brightness = RS_SETTINGS->readNumEntry("/brightnessGlobal"); //Strobe = RS_SETTINGS->readNumEntry("/StrobeGlobal"); RS_SETTINGS->endGroup(); } ui->spBrightness->setValue(brightness); //ui->spStrobe->setValue(Strobe); } void SerialDeviceTest::on_pbBrightness_clicked() { if (LIGHTSOURCEFIND->m_hComm == nullptr) { bool ret = LIGHTSOURCEFIND->OpenComm(); if (!ret) { showExceptionInfoDialog("光源串口打开错误!"); DEVICE_INFO->printDeviceSystemInfo("光源串口打开错误!"); return; } } int ret = LIGHTSOURCEFIND->LightOn(ui->cmbCameraID->currentIndex()+1); if (ret != 0) { showExceptionInfoDialog("光源打开失败!"); DEVICE_INFO->printDeviceSystemInfo("光源打开失败!"); return; } } void SerialDeviceTest::on_pbLightOff_clicked() { if (LIGHTSOURCEFIND->m_hComm == nullptr) { bool ret = LIGHTSOURCEFIND->OpenComm(); if (!ret) { showExceptionInfoDialog("光源串口打开错误!"); DEVICE_INFO->printDeviceSystemInfo("光源串口打开错误!"); return; } } int ret = LIGHTSOURCEFIND->LightOff(ui->cmbCameraID->currentIndex()+1); if (ret != 0) { showExceptionInfoDialog("光源关闭失败!"); DEVICE_INFO->printDeviceSystemInfo("光源关闭失败!"); return; } } void SerialDeviceTest::on_spBrightness_editingFinished() { if(!ui->spBrightness->hasFocus()) return; // ui->spBrightness->text(); // int value = ui->spBrightness->text().toInt(); if (LIGHTSOURCEFIND->m_hComm == nullptr) { bool ret = LIGHTSOURCEFIND->OpenComm(); if (!ret) { showExceptionInfoDialog("光源串口打开错误!"); DEVICE_INFO->printDeviceSystemInfo("光源串口打开错误!"); return; } } int ret = LIGHTSOURCEFIND->LightOn(ui->cmbCameraID->currentIndex()+1); if (ret != 0) { showExceptionInfoDialog("光源打开失败!"); DEVICE_INFO->printDeviceSystemInfo("光源打开失败!"); return; } } void SerialDeviceTest::on_pbStopRead_clicked() { bReadApFlag = false; } void SerialDeviceTest::on_cmbPowerMeterID_currentTextChanged(const QString &arg1) { if (ui->cmbPowerMeterID->currentText() == "光路功率计") { bReadApFlag = false; } }