diff --git a/include/global.h b/include/global.h index ea246cd..bb46c32 100644 --- a/include/global.h +++ b/include/global.h @@ -2,7 +2,7 @@ #include #include #include -#include +#include ,。 #include #include #include @@ -11,7 +11,7 @@ #include #pragma execution_character_set("utf-8") -const std::string softwareVersion = "20251231-2.3.3"; +const std::string softwareVersion = "20260105-2.3.4"; const std::string euiJsonVersion = "1.0.6"; #define savePathToDataBase true #define GigaByte 1073741824 diff --git a/include/sxGlobal.h b/include/sxGlobal.h index 2f01ec5..7362462 100644 --- a/include/sxGlobal.h +++ b/include/sxGlobal.h @@ -7,19 +7,23 @@ #define CATCH_EXCEPTIONS \ catch (HDevEngineCpp::HDevEngineException& ex) { \ std::cout << "HDevEngineException: " << ex.Message() << std::endl; \ - qDebug() << "HDevEngineException: " << ex.Message(); \ + qCritical() << "HDevEngineException: " << ex.Message(); \ } \ catch (HalconCpp::HException& ex) { \ std::cout << "Halcon Exception Caught!" << std::endl; \ std::cout << "Error Code: " << ex.ErrorCode() << std::endl; \ std::cout << "Error Message: " << ex.ErrorMessage() << std::endl; \ - qDebug() << "Halcon Exception Caught!"; \ - qDebug() << "Error Code: " << ex.ErrorCode(); \ - qDebug() << "Error Message: " << ex.ErrorMessage(); \ + qCritical() << "Halcon Exception Caught!"; \ + qCritical() << "Error Code: " << ex.ErrorCode(); \ + qCritical() << "Error Message: " << ex.ErrorMessage(); \ } \ catch (const std::exception& e) { \ std::cout << "Caught exception: " << e.what() << std::endl; \ - qDebug() << "Caught exception: " << e.what(); \ + qCritical() << "Caught exception: " << e.what(); \ + }\ + catch (...) {\ + std::cout << "Caught exception: unexcepted"; \ + qCritical() << "Caught exception: unexcepted"; \ } struct sx_581_address { int triggerAddr = -1; @@ -112,7 +116,7 @@ public: address = addressIN; saveObjectName = saveObjectNameIN; oneTriggerCaptrueTimes = oneTriggerCaptrueTimesIN; - generalDet = new detCallbackChain(_serviceManager, _detParams, bridge, &_serviceManagerIn->_chainWatcher); + generalDet = new detCallbackChain(_serviceManager, _detParams, bridge); generalDet->registerProcessAlgoCallback(_processAlgoCallback); //单次触发器条件 for (int i = 0; i < addressIN.size(); i++) { @@ -122,12 +126,12 @@ public: } for (int i = 0; i < address.size(); i++) { _serviceManager->_triggerManager->registerPlcValueViewer(viewerNameIN + "_" + QString::number(i), - { {"触发",address[i].triggerAddr }, - {"反馈",address[i].completeAddr.toInt()}, - {"结果",address[i].resultAddr.toInt()}, - {"数值1",address[i].valueOffsetAddr}, - {"数值2",address[i].valueOffsetAddr + 2}, - {"数值3",address[i].valueOffsetAddr + 4} }); + { {QString::number(address[i].triggerAddr) + "触发",address[i].triggerAddr }, + {address[i].completeAddr + "反馈",address[i].completeAddr.toInt()}, + {address[i].resultAddr + "结果",address[i].resultAddr.toInt()}, + {QString::number(address[i].valueOffsetAddr) + "数值1",address[i].valueOffsetAddr}, + {QString::number(address[i].valueOffsetAddr + 2) + "数值2",address[i].valueOffsetAddr + 2}, + {QString::number(address[i].valueOffsetAddr + 4) + "数值3",address[i].valueOffsetAddr + 4} }); } } //获取图片并进行检测 diff --git a/include/yhGlobal.h b/include/yhGlobal.h index 9b19b11..6460249 100644 --- a/include/yhGlobal.h +++ b/include/yhGlobal.h @@ -8,19 +8,23 @@ #define CATCH_EXCEPTIONS \ catch (HDevEngineCpp::HDevEngineException& ex) { \ std::cout << "HDevEngineException: " << ex.Message() << std::endl; \ - qDebug() << "HDevEngineException: " << ex.Message(); \ + qCritical() << "HDevEngineException: " << ex.Message(); \ } \ catch (HalconCpp::HException& ex) { \ std::cout << "Halcon Exception Caught!" << std::endl; \ std::cout << "Error Code: " << ex.ErrorCode() << std::endl; \ std::cout << "Error Message: " << ex.ErrorMessage() << std::endl; \ - qDebug() << "Halcon Exception Caught!"; \ - qDebug() << "Error Code: " << ex.ErrorCode(); \ - qDebug() << "Error Message: " << ex.ErrorMessage(); \ + qCritical() << "Halcon Exception Caught!"; \ + qCritical() << "Error Code: " << ex.ErrorCode(); \ + qCritical() << "Error Message: " << ex.ErrorMessage(); \ } \ catch (const std::exception& e) { \ std::cout << "Caught exception: " << e.what() << std::endl; \ - qDebug() << "Caught exception: " << e.what(); \ + qCritical() << "Caught exception: " << e.what(); \ + }\ + catch (...) {\ + std::cout << "Caught exception: unexcepted"; \ + qCritical() << "Caught exception: unexcepted"; \ } struct yh_581_address { int triggerAddr = -1; @@ -153,7 +157,7 @@ public: oneTriggerCaptrueTimes = oneTriggerCaptrueTimesIN; saveObjectName = saveObjectNameIN; - generalDet = new detCallbackChain(_serviceManager, _detParams, bridge, &_serviceManagerIn->_chainWatcher); + generalDet = new detCallbackChain(_serviceManager, _detParams, bridge); generalDet->registerProcessAlgoCallback(_processAlgoCallback); address = generateYh581AddressMap(startAddr, triggerCount); //联合触发器条件 @@ -171,23 +175,22 @@ public: if (val.second == 1) evaluate(cnt, byteArray); else - captrueAndDiscard(cnt); + captrueAndDiscard(cnt, byteArray); cnt++; } }, ""); for (int i = 0; i < address.size(); i++) { _serviceManager->_triggerManager->registerPlcValueViewer(viewerNameIN + "_" + QString::number(i), - { {"触发",address[i].triggerAddr,finsShort }, - {"反馈",address[i].completeAddr.toInt(),finsShort}, - {"结果",address[i].resultAddr.toInt(),finsShort}, - {"数值1",address[i].valueOffsetAddr,finsFloat}, - {"数值2",address[i].valueOffsetAddr + 2,finsFloat}, - {"数值3",address[i].valueOffsetAddr + 4,finsFloat} }); + { {QString::number(address[i].triggerAddr) + "触发",address[i].triggerAddr,finsShort }, + {address[i].completeAddr + "反馈",address[i].completeAddr.toInt(),finsShort}, + {address[i].resultAddr + "结果",address[i].resultAddr.toInt(),finsShort}, + {QString::number(address[i].valueOffsetAddr) + "数值1",address[i].valueOffsetAddr,finsFloat}, + {QString::number(address[i].valueOffsetAddr + 2) + "数值2",address[i].valueOffsetAddr + 2,finsFloat}, + {QString::number(address[i].valueOffsetAddr + 4) + "数值3",address[i].valueOffsetAddr + 4,finsFloat} }); } } //获取图片并进行检测 void evaluate(int batteryOffset, QByteArray& byteArray) { - _serviceManager->_triggerManager->writeShort("D" + address[0].completeAddr + "_1");//完成信号 固定只发在第0位 std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, address[batteryOffset].snAddr, false, false, -1); auto camera = _serviceManager->_cameraManager->getCamera(cameraName); camera->clearCache(); @@ -199,15 +202,18 @@ public: generalDet->asyncProcess(data, address[batteryOffset]);//处理算法 data->resultImgShowSet.push_back(showImgPack(viewerName, "结果图")); + _serviceManager->_triggerManager->writeShort("D" + address[0].completeAddr + "_1");//完成信号 固定只发在第0位 } //获取图片然后废弃 - void captrueAndDiscard(int index) { - _serviceManager->_triggerManager->writeShort("D" + address[index].resultAddr + "_4");//发个4防止报警 + void captrueAndDiscard(int batteryOffset, QByteArray& byteArray) { + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, address[batteryOffset].snAddr, false, false, -1); auto camera = _serviceManager->_cameraManager->getCamera(cameraName); - std::shared_ptr data = _serviceManager->_detDataManager->createDetData();//创建数据包 + std::shared_ptr data = _serviceManager->_detDataManager->createDetData(QString::fromStdString(cameraName), sn, oneTriggerCaptrueTimes, camera->config.oriSaveFormat);//创建数据包 camera->captureImage(data);//拍照 - qDebug() << "uuid" << data->uuid << "将取图并丢弃"; + qDebug() <<"sn" << QString::fromStdString(sn) << "uuid" << data->uuid << "将取图并丢弃"; _serviceManager->_detDataManager->deleteDetDataLater(data->uuid); + _serviceManager->_triggerManager->writeShort("D" + address[0].completeAddr + "_1");//完成信号 固定只发在第0位 + _serviceManager->_triggerManager->writeShort("D" + address[batteryOffset].resultAddr + "_4");//发个4防止报警 } private: QString saveObjectName = ""; @@ -251,7 +257,7 @@ public: oneTriggerCaptrueTimes = oneTriggerCaptrueTimesIN; saveObjectName = saveObjectNameIN; - generalDet = new detCallbackChain(_serviceManager, _detParams, bridge, &_serviceManagerIn->_chainWatcher); + generalDet = new detCallbackChain(_serviceManager, _detParams, bridge); generalDet->registerProcessAlgoCallback(_processAlgoCallback); address = generateYh581AddressMap(startAddr, triggerCount); //单次触发器条件 @@ -265,18 +271,18 @@ public: } for (int i = 0; i < address.size(); i++) { _serviceManager->_triggerManager->registerPlcValueViewer(viewerNameIN + "_" + QString::number(i), - { {"触发",address[i].triggerAddr,finsShort }, - {"反馈",address[i].completeAddr.toInt(),finsShort}, - {"结果",address[i].resultAddr.toInt(),finsShort}, - {"数值1",address[i].valueOffsetAddr,finsFloat}, - {"数值2",address[i].valueOffsetAddr + 2,finsFloat}, - {"数值3",address[i].valueOffsetAddr + 4,finsFloat} }); + { {QString::number(address[i].triggerAddr) + "触发",address[i].triggerAddr,finsShort }, + {address[i].completeAddr + "反馈",address[i].completeAddr.toInt(),finsShort}, + {address[i].resultAddr + "结果",address[i].resultAddr.toInt(),finsShort}, + {QString::number(address[i].valueOffsetAddr) + "数值1",address[i].valueOffsetAddr,finsFloat}, + {QString::number(address[i].valueOffsetAddr + 2) + "数值2",address[i].valueOffsetAddr + 2,finsFloat}, + {QString::number(address[i].valueOffsetAddr + 4) + "数值3",address[i].valueOffsetAddr + 4,finsFloat} }); } } //获取图片并进行检测 void evaluate(int batteryOffset, QByteArray& byteArray) { - _serviceManager->_triggerManager->writeShort("D" + address[batteryOffset].completeAddr + "_1");//完成信号 根据偏移发送 + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, address[batteryOffset].snAddr, false, false, -1); auto camera = _serviceManager->_cameraManager->getCamera(cameraName); camera->clearCache(); @@ -288,6 +294,7 @@ public: generalDet->asyncProcess(data, address[batteryOffset]);//处理算法 data->resultImgShowSet.push_back(showImgPack(viewerName, "结果图")); + _serviceManager->_triggerManager->writeShort("D" + address[batteryOffset].completeAddr + "_1");//完成信号 根据偏移发送 } private: QString saveObjectName = ""; diff --git a/rpcModule/rpc_finsTcp_boost/json_rpc_server_1_1_0.exe b/rpcModule/rpc_finsTcp_boost/json_rpc_server_1_1_1.exe similarity index 85% rename from rpcModule/rpc_finsTcp_boost/json_rpc_server_1_1_0.exe rename to rpcModule/rpc_finsTcp_boost/json_rpc_server_1_1_1.exe index ad00ec9..8748f51 100644 Binary files a/rpcModule/rpc_finsTcp_boost/json_rpc_server_1_1_0.exe and b/rpcModule/rpc_finsTcp_boost/json_rpc_server_1_1_1.exe differ diff --git a/rpcModule/rpc_finsTcp_boost/rpc_finsTcp.cpp b/rpcModule/rpc_finsTcp_boost/rpc_finsTcp.cpp index a290762..51e657d 100644 --- a/rpcModule/rpc_finsTcp_boost/rpc_finsTcp.cpp +++ b/rpcModule/rpc_finsTcp_boost/rpc_finsTcp.cpp @@ -114,6 +114,7 @@ bool rpc_finsTcp::readData(std::vector& vec_mat, QByteArray& data){ JsonRpcClient* ptr = read_JsonRpcClient[data]; if(ptr == nullptr) { ptr = new JsonRpcClient("127.0.0.1", 9000); + ptr->writeCall("init", QJsonArray{ m_IP,m_port }, "finstcp"); read_JsonRpcClient[data] = ptr; } QByteArray resp = ptr->finsReadCall("excuteCli", QString(data), "finstcp"); @@ -264,7 +265,7 @@ void rpc_finsTcp::initHearBeatThread() { } bool rpc_finsTcp::initParas(QByteArray& data){ - startProcess("./json_rpc_server_1_1_0.exe"); + startProcess("./json_rpc_server_1_1_1.exe"); QThread::msleep(500); write_JsonRpcClients = std::vector>(threadCount); for (int i = 0; i < write_JsonRpcClients.size(); i++) { diff --git a/src/core/service/cameraManager.cpp b/src/core/service/cameraManager.cpp index e310810..34002b5 100644 --- a/src/core/service/cameraManager.cpp +++ b/src/core/service/cameraManager.cpp @@ -130,9 +130,6 @@ void cameraManager::run(){ MV_CC_DEVICE_INFO_LIST m_stDevList = searchMV_CC_DEVICE_INFO_LIST(); QByteArray mvDevices1 = "deviceList" + MV_CC_DeviceInfoListToQByteArray(m_stDevList); - MV_GENTL_IF_INFO_LIST m_stIFList = searchMV_GENTL_IF_INFO_LIST(); - QByteArray mvDevices2 = "deviceList" + MV_GENTL_IF_INFO_LISTToQByteArray(m_stIFList); - for (auto i = 0; i < _cameraStructs.size(); i++) { auto& m_module = _cameraStructs[i]; QString dllPath = QString::fromStdString(m_module.dllPath); @@ -161,14 +158,6 @@ void cameraManager::run(){ break; } } - for(int i = 0; i < m_stIFList.nInterfaceNum; i++) { - std::string serialNumber = static_cast((LPCSTR)m_stIFList.pIFInfo[i]->chInterfaceID); - std::string userDefineName = static_cast((LPCSTR)m_stIFList.pIFInfo[i]->chInterfaceID); - if (m_module.connectionName.find(serialNumber) != std::string::npos || m_module.connectionName.find(userDefineName) != std::string::npos) { - m_module.module_ptr->writeData(vec_mat, mvDevices1); - break; - } - } } status = NotInit; diff --git a/src/core/service/cameraManager.h b/src/core/service/cameraManager.h index a55368f..16aca55 100644 --- a/src/core/service/cameraManager.h +++ b/src/core/service/cameraManager.h @@ -94,9 +94,6 @@ public: inline void setExposureTime(float value){ writeData("exposure_" + std::to_string(value)); } - inline void setUserSet(int value){ - writeData("userset_" + std::to_string(value)); - } inline void clearCache() { writeData("clearCache"); } diff --git a/src/core/service/detCallbackChain.hpp b/src/core/service/detCallbackChain.hpp index 585bff6..36dc2e4 100644 --- a/src/core/service/detCallbackChain.hpp +++ b/src/core/service/detCallbackChain.hpp @@ -14,16 +14,16 @@ template class detCallbackChain { public: using processAlgoCallback = std::function, customTemplate*, addressTemplate)>; - - detCallbackChain(ServiceManager* _ServiceManagerIn, customTemplate* _customTemplateIn, bSignalHub* bridgeIn, detCallbackChainWatcher* _chainWatcherIn = nullptr) + detCallbackChain(ServiceManager* _ServiceManagerIn, customTemplate* _customTemplateIn, bSignalHub* bridgeIn) : _imgSaveThreadManager(_ServiceManagerIn->_imgSaveThreadManager), _handleAiModels(_customTemplateIn), _triggerManager(_ServiceManagerIn->_triggerManager), bridge(bridgeIn), _serviceManager(_ServiceManagerIn) { - int threadCount = 4 * QThread::idealThreadCount(); + + int threadCount = 10 * QThread::idealThreadCount(); QThreadPool::globalInstance()->setMaxThreadCount(threadCount); - _chainWatcher = _chainWatcherIn; + } //异步启动检测 void asyncProcess(std::shared_ptr data, addressTemplate address, QByteArray completeSignal = "") { @@ -34,15 +34,6 @@ public: QFuture future = QtConcurrent::run([this, data, address, completeSignal]() { process(data, address, completeSignal); }); - if (_chainWatcher != nullptr) { - // 构建任务名称:包含 UUID 和 SN 码便于追踪 - QString taskName = QString("DetTask_UUID[%1]_SN[%2]") - .arg(data->uuid) - .arg(QString::fromStdString(data->SNcode)); - - // 将任务添加到监控器 - int watcherId = _chainWatcher->addFeature(future, taskName); - } } //阻塞启动检测 void process(std::shared_ptr data, addressTemplate address, QByteArray completeSignal = "") { @@ -83,17 +74,20 @@ public: } catch (HDevEngineCpp::HDevEngineException& ex) { - qDebug() << "detChain catched->HDevEngineException: " << ex.Message(); + qCritical() << "detChain catched->HDevEngineException: " << ex.Message(); } catch (HalconCpp::HException& ex) { - qDebug() << "detChain catched->Halcon Exception Caught!"; - qDebug() << "detChain catched->Error Code: " << ex.ErrorCode(); - qDebug() << "detChain catched->Error Message: " << ex.ErrorMessage(); + qCritical() << "detChain catched->Halcon Exception Caught!"; + qCritical() << "detChain catched->Error Code: " << ex.ErrorCode(); + qCritical() << "detChain catched->Error Message: " << ex.ErrorMessage(); } catch (const std::exception& e) { - qDebug() << "detChain catched->Caught exception: " << e.what(); + qCritical() << "detChain catched->Caught exception: " << e.what(); + } + catch (...) { + qCritical() << "detChain catched->Caught exception: unexcepted"; } std::chrono::steady_clock::time_point algoEndTime = std::chrono::steady_clock::now(); data->algoTime = std::chrono::duration_cast(algoEndTime - algoStartTime).count(); @@ -124,14 +118,13 @@ public: // 异步保存检测图像 std::thread([this,data] {_imgSaveThreadManager->saveImage(data); }).detach(); } -#pragma region 注册回调函数 void registerProcessAlgoCallback(processAlgoCallback func) { _processAlgoCallback = func; } - + #pragma endregion - + private: int uiShowImgCompressThreshold = 5000; // 超过该宽或高就压缩 imgSaveThreadManager* _imgSaveThreadManager = nullptr; @@ -139,7 +132,6 @@ private: triggerManager* _triggerManager = nullptr; processAlgoCallback _processAlgoCallback; bSignalHub* bridge = nullptr; - detCallbackChainWatcher* _chainWatcher = nullptr; ServiceManager* _serviceManager = nullptr; }; diff --git a/src/core/service/triggerManager.cpp b/src/core/service/triggerManager.cpp index 2b88b21..faa2efb 100644 --- a/src/core/service/triggerManager.cpp +++ b/src/core/service/triggerManager.cpp @@ -32,20 +32,19 @@ triggerManager::triggerManager(ServiceManager* _serviceManager, bSignalHub* brid void triggerManager::run(){ if(connectHost() == false) return; - QThread::msleep(1000); + QThread::msleep(500); QElapsedTimer heartTimer, loopCounterCollectTimer,loopIntervalTimer; int loopCounter = 0,maxIntervalLog = 0,interval = 0; loopIntervalTimer.start(); while (runFlag){ reciveCommond(); - //心跳 - if (heartTimer.elapsed()> heartBeatIntervalMS) { + if (heartTimer.elapsed()> heartBeatIntervalMS) {//心跳 sendFinsMsg(heartBeatCmds[heartBeatCmdCnt++]); if(heartBeatCmdCnt >= heartBeatCmds.size()) heartBeatCmdCnt = 0; heartTimer.start(); } - if (loopCounterCollectTimer.elapsed() > 3000) { + if (loopCounterCollectTimer.elapsed() > 3000) {//发送性能数据 emit bridge->sendTriggerManagerLoopData(loopCounter / 3, maxIntervalLog); maxIntervalLog = 0; loopCounter = 0; diff --git a/src/core/service/triggerManager.h b/src/core/service/triggerManager.h index e91c6d6..94fd69f 100644 --- a/src/core/service/triggerManager.h +++ b/src/core/service/triggerManager.h @@ -137,18 +137,6 @@ public: return true; } //直接发送数据到模块的方法 - bool sendFinsMsg(const char* cmdx){ - QString str = cmdx; - if (trigger == nullptr) - return false; - if (!trigger->writeData(vec_mat, str.toUtf8())) - { - qCritical() << "[TCP Error] " << QString::fromUtf8("Fins数据发送失败!") << cmdx; - return false; - } - return true; - } - //直接发送数据到模块的方法 bool sendFinsMsg(const QByteArray& write_byte){ if (trigger == nullptr) return false; @@ -414,7 +402,7 @@ public: } std::map> unionTriggerCallbackFuncs; - //SUB + //监控指定地址的数值 void registerPlcValueViewer(const QString& groupName, const std::vector& viewerDatas) { QMutexLocker locer(&mutex); for (auto& data : viewerDatas) { diff --git a/src/mission/581-Dgh-CB-1/581-Dgh-CB-1.cpp b/src/mission/581-Dgh-CB-1/581-Dgh-CB-1.cpp new file mode 100644 index 0000000..13e314c --- /dev/null +++ b/src/mission/581-Dgh-CB-1/581-Dgh-CB-1.cpp @@ -0,0 +1,8 @@ +#include <581-Dgh-CB-1.h> + +mission* createMission() { + return new _581_Dgh(); +} +void destroyMission(mission* _mission) { + delete _mission; +} \ No newline at end of file diff --git a/src/mission/581-Dgh-CB-1/581-Dgh-CB-1.h b/src/mission/581-Dgh-CB-1/581-Dgh-CB-1.h new file mode 100644 index 0000000..5cbde25 --- /dev/null +++ b/src/mission/581-Dgh-CB-1/581-Dgh-CB-1.h @@ -0,0 +1,225 @@ +#include +#include +#include +#include +#include +#include +QByteArray getCameraIndex(QString cameraStr) { + QRegularExpression re("\\d+"); + auto match = re.match(cameraStr); + if (match.hasMatch()) { + return "_" + match.captured(0).toLocal8Bit(); + } + return "_-2"; +} +#pragma region 算法 + +using namespace HDevEngineCpp; + +#pragma endregion +void exceptionResume(std::shared_ptr data, detParams* _detParams, yh_581_address address, QString why = "") { + qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; + cv::Mat Paint; + data->getOriImg(0).copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + TextRendererZH textPainter(Paint.cols, Paint.rows, 300); + textPainter.putText(Paint, why.toStdString(), cv::Point(50, 50), cv::Scalar(0, 255, 0)); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->insertResultImg(Paint); + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_1,1,1,1,1,1,1,1,1,1,1,1,1,1"); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_3");//结果反馈//原来是异常发送NG-2,改成异常发送3,表示取图失败 +} +static bool yuHanQian3D(std::shared_ptr data, detParams* _detParams, yh_581_address address) { + try { + std::vector defects; + auto CameraIndex = getCameraIndex(QString::fromStdString(data->cameraKeyName)); + QDateTime createTime = QDateTime::currentDateTime(); + double heightThreshold = data->service->_paramSyncManager->get("预焊前检测", "高度/台阶差最大阈值", 0.3).toDouble(); + double widthThreshold = data->service->_paramSyncManager->get("预焊前检测", "缝隙值最大阈值", 0.1).toDouble(); + double MeasureNumber = data->service->_paramSyncManager->get("预焊前检测", "焊点的测量数量", 4).toDouble(); + /* data->oriImgs.clear(); + data->oriImgs.push_back(cv::imread("D:\\testimg\\04QCB82602000JFBN00063BN_45_Camera1_0.tiff", -1)); + data->oriImgs.push_back(cv::imread("D:\\testimg\\04QCB82602000JFBN00063BN_45_Camera1_1.tiff", -1));*/ + if (data->getOriImgSize() < 2) { + exceptionResume(data, _detParams, address, "NG"); + return true; + } + if (data->getOriImg(0).cols == 1000) { + exceptionResume(data, _detParams, address, "取图超时"); + return true; + } + cv::Mat heightImg = data->getOriImg(1); + cv::Mat lumImg = data->getOriImg(0); + cv::Mat Paint; + + HalconCpp::HObject in_imageH = MatToHObject(heightImg); + HalconCpp::HObject in_imageLum = MatToHObject(lumImg); + HDevEngineCpp::HDevProcedure proc("_6_detect_gap_width_height"); + HDevProcedureCall procedureCall(proc); + procedureCall.SetInputIconicParamObject("in_imageH", in_imageH); + procedureCall.SetInputIconicParamObject("in_imageLum", in_imageLum); + procedureCall.SetInputCtrlParamTuple("in_MeasureNumber", MeasureNumber); + + procedureCall.SetInputCtrlParamTuple("in_xResolution", 0.0025); + procedureCall.SetInputCtrlParamTuple("in_yResolution", data->service->_paramSyncManager->get("预焊前检测", "3D相机Y方向精度",0.177).toFloat()); + procedureCall.SetInputCtrlParamTuple("in_zResolution", 0.0004); + if(address.triggerAddr == 18000 || address.triggerAddr == 18002 || address.triggerAddr == 18400 || address.triggerAddr == 18402) + procedureCall.SetInputCtrlParamTuple("in_Location", "Right"); + else + procedureCall.SetInputCtrlParamTuple("in_Location", "Left"); + procedureCall.Execute(); + HObject out_DisplayImage = procedureCall.GetOutputIconicParamObject("out_DisplayImage"); + + HTuple out_MaxHeight = procedureCall.GetOutputCtrlParamTuple("out_MaxHeight"); + HTuple out_MaxWidth = procedureCall.GetOutputCtrlParamTuple("out_MaxWidth"); + HTuple out_ResultRow = procedureCall.GetOutputCtrlParamTuple("out_ResultRow"); + HTuple out_ResultColumn = procedureCall.GetOutputCtrlParamTuple("out_ResultColumn"); + HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); + HTuple out_NgTails = procedureCall.GetOutputCtrlParamTuple("out_NgTails"); + HTuple out_DisplayRows = procedureCall.GetOutputCtrlParamTuple("out_DisplayRows"); + HTuple out_DisplayCols = procedureCall.GetOutputCtrlParamTuple("out_DisplayCols"); + int flag = out_Flag.D(); + TextRendererZH textPainter(Paint.cols, Paint.rows, 75); + + textPainter.appendPaintJob(data->SNcode, cv::Point(1600,0), cv::Scalar(0, 255, 0)); + textPainter.appendPaintJob(data->cameraKeyName, cv::Point(1600, 50), cv::Scalar(0, 255, 0)); + if (address.triggerAddr == 18000 || address.triggerAddr == 18200 || address.triggerAddr == 18400 || address.triggerAddr == 18600) + textPainter.appendPaintJob("电池1", cv::Point(1600, 100), cv::Scalar(0, 255, 0)); + else + textPainter.appendPaintJob("电池2", cv::Point(1600, 100), cv::Scalar(0, 255, 0)); + bool isOK = true; + bool WidthOpen = data->service->_paramSyncManager->get("预焊前检测", "缝隙值检测开启", true).toBool(); + bool HeightOpen = data->service->_paramSyncManager->get("预焊前检测", "台阶差检测开启", true).toBool(); + QByteArray gaoDuChaSendText, fengXiSendText; + QByteArray extraDataSend; + if (flag == 1) { + int yStart = -25; + for (int i = 0; i < out_DisplayRows.Length(); i++) { + double MaxHeight = out_MaxHeight[i].D(); + double MaxWidth = out_MaxWidth[i].D(); + + cv::Point displayPos( 1000, out_DisplayRows[i].D() - 50); + textPainter.appendPaintJob("检测区域" + std::to_string(i + 1) + ":", displayPos, cv::Scalar(0, 255, 0)); + + displayPos.x += 280; + if (std::abs(MaxHeight) > std::abs(heightThreshold)) { + textPainter.appendPaintJob("高度/台阶差" + QString::number(MaxHeight, 'f', 3).toStdString() +"mm", displayPos, cv::Scalar(0, 0, 255)); + if(HeightOpen) isOK = false; + } + else + textPainter.appendPaintJob("高度/台阶差" + QString::number(MaxHeight, 'f', 3).toStdString() + "mm", displayPos, cv::Scalar(0, 255, 0)); + + displayPos.x += 600; + if (std::abs(MaxWidth) > std::abs(widthThreshold)) { + textPainter.appendPaintJob("缝隙值" + QString::number(MaxWidth, 'f', 3).toStdString() + "mm", displayPos, cv::Scalar(0, 0, 255)); + if(WidthOpen) isOK = false; + } + else + textPainter.appendPaintJob("缝隙值" + QString::number(MaxWidth, 'f', 3).toStdString() + "mm", displayPos, cv::Scalar(0, 255, 0)); + if (i == 3) { + extraDataSend += QByteArray::number(MaxWidth) + "," + QByteArray::number(MaxHeight); + } + else { + gaoDuChaSendText += QByteArray::number(MaxHeight) + ","; + fengXiSendText += QByteArray::number(MaxWidth) + ","; + } + } + } + else { + gaoDuChaSendText = "-1,-1,-1,"; + fengXiSendText = "-1,-1,-1,"; + std::string ngDetailStr = gbkToUtf8(out_NgTails.ToString().Text()); + ngDetailStr = ngDetailStr.substr(1, ngDetailStr.length() - 2); + textPainter.appendPaintJob(ngDetailStr, cv::Point(50, 450), cv::Scalar(0, 0, 255)); + for (int i = 0; i < out_ResultRow.Length(); i++) { + textPainter.appendPaintJob(cv::Point(out_ResultRow[i].D(), out_ResultColumn[i].D()),1, cv::Scalar(0, 0, 255), 1,0); + } + data->halconOK = false; + isOK = false; + } + QByteArray plcResult = "1"; + if (isOK == false) { + textPainter.appendPaintJob("NG", cv::Point(50, 50), cv::Scalar(0, 0, 255)); + plcResult = "2"; + data->halconOK = false; + defects.push_back("台阶/间隙不良"); + } + else + textPainter.appendPaintJob("OK", cv::Point(50, 50), cv::Scalar(0, 255, 0)); + if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool()) + plcResult = "1"; + + //发送参数1 + data->service->_triggerManager->writeFloat("D" + + QByteArray::number(address.valueOffsetAddr) + "_" + + fengXiSendText + "1,1," + + gaoDuChaSendText + plcResult + "," + plcResult + "," + plcResult + "," + plcResult +"," + plcResult + "," + plcResult + "," + extraDataSend+ CameraIndex);//数值1 + + //发送结果 + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult + CameraIndex);//结果反馈 + + data->service->_missionResultHandle->toBarChart(data->SNcode, defects); + Paint = HObject2Mat(out_DisplayImage); + textPainter.excusePaintJobs(Paint); + int rate = MIN(Paint.rows, Paint.cols) / 20; + TextRendererZH textPainter1(Paint.cols, Paint.rows, rate); + textPainter1.putText(Paint, "当前条码:" + data->SNcode, cv::Point(50, Paint.rows - (rate * 2)), cv::Scalar(0, 255, 255)); + textPainter1.putText(Paint, "获取图像时间:" + createTime.toString("yyyy/MM/dd hh:mm:ss").toStdString(), cv::Point(50, Paint.rows - rate), cv::Scalar(0, 255, 255)); + data->insertResultImg(Paint); + return true; + } + CATCH_EXCEPTIONS + exceptionResume(data, _detParams, address, "NG"); + return true; +} +class _581_Dgh : public mission { +public: + using generalTrigger = _581_Union_triggerTemplate; + generalTrigger dgh_cb_yh_3d_1; + generalTrigger dgh_cb_yh_3d_2; + generalTrigger dgh_cb_yh_3d_3; + generalTrigger dgh_cb_yh_3d_4; + + generalTrigger dgh_cb_mh_3d_1; + generalTrigger dgh_cb_mh_3d_2; + generalTrigger dgh_cb_mh_3d_3; + generalTrigger dgh_cb_mh_3d_4; + detParams _params; + + void onConfigReloaded() { + HDevEngineCpp::HDevEngine myEngine; + myEngine.SetProcedurePath(""); + myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); + } + bool initCustom() { +#pragma region 注册触发器回调 + dgh_cb_yh_3d_1.init("Camera1", "长边预焊前3D-1", 18000,2,1, &_params, _serviceManager, bridge, yuHanQian3D); + dgh_cb_yh_3d_1.address[1].valueOffsetAddr += 20; + dgh_cb_yh_3d_2.init("Camera2", "长边预焊前3D-2", 18200,2,1, &_params, _serviceManager, bridge, yuHanQian3D); + dgh_cb_yh_3d_2.address[1].valueOffsetAddr += 20; + dgh_cb_yh_3d_3.init("Camera3", "长边预焊前3D-3", 18400,2,1, &_params, _serviceManager, bridge, yuHanQian3D); + dgh_cb_yh_3d_3.address[1].valueOffsetAddr += 20; + dgh_cb_yh_3d_4.init("Camera4", "长边预焊前3D-4", 18600,2,1, &_params, _serviceManager, bridge, yuHanQian3D); + dgh_cb_yh_3d_4.address[1].valueOffsetAddr += 20; + + dgh_cb_mh_3d_1.init("Camera5", "长边满焊前3D-1", 19600,2,1, &_params, _serviceManager, bridge, generalAlgoTest); + dgh_cb_mh_3d_1.address[1].valueOffsetAddr += 20; + dgh_cb_mh_3d_2.init("Camera6", "长边满焊前3D-2", 19800,2,1, &_params, _serviceManager, bridge, generalAlgoTest); + dgh_cb_mh_3d_2.address[1].valueOffsetAddr += 20; + dgh_cb_mh_3d_3.init("Camera7", "长边满焊前3D-3", 20000,2,1, &_params, _serviceManager, bridge, generalAlgoTest); + dgh_cb_mh_3d_3.address[1].valueOffsetAddr += 20; + dgh_cb_mh_3d_4.init("Camera8", "长边满焊前3D-4", 20200,2,1, &_params, _serviceManager, bridge, generalAlgoTest); + dgh_cb_mh_3d_4.address[1].valueOffsetAddr += 20; +#pragma endregion + return true; + } + +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/581-Dgh-CB-1/CMakeLists.txt b/src/mission/581-Dgh-CB-1/CMakeLists.txt new file mode 100644 index 0000000..76e9200 --- /dev/null +++ b/src/mission/581-Dgh-CB-1/CMakeLists.txt @@ -0,0 +1,77 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "opencv" "halcon" "handdleAI") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + ${PROJECT_ROOT_PATH}/src/core + ${PROJECT_ROOT_PATH}/src/core/handleAi + ${PROJECT_ROOT_PATH}/src/core/service + ${PROJECT_ROOT_PATH}/src/core/sql + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) +add_compile_options(/utf-8) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC OFF) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ${PROJECT_ROOT_PATH}/include/interface.h + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Network + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME}) +message( " header files "${HEAD_FILES}) diff --git a/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.cpp b/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.cpp new file mode 100644 index 0000000..04bdf79 --- /dev/null +++ b/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.cpp @@ -0,0 +1,552 @@ +#include <581_Ruanlianjie_hanqian_hanhou.h> +#include +#define switchToNew 1 +QByteArray getCameraIndex(QString cameraStr) { + QRegularExpression re("\\d+"); + auto match = re.match(cameraStr); + if (match.hasMatch()) { + return "_" + match.captured(0).toLocal8Bit(); + } + return "_-2"; +} +void exceptionResume(std::shared_ptr data, hanHouJianCe* _detParams, sx_581_address address, QString why = "") { + qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; + cv::Mat Paint; + data->getOriImg(0).copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + TextRendererZH textPainter(Paint.cols, Paint.rows, 300); + textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->insertResultImg(Paint); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 + +} +void exceptionResume(std::shared_ptr data, hanQianDingWeiParams* _detParams, sx_581_address address, QString why = "") { + qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode) << why; + cv::Mat Paint; + data->getOriImg(0).copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + TextRendererZH textPainter(Paint.cols, Paint.rows, 300); + textPainter.putText(Paint, why.toStdString(), cv::Point(500, 50), cv::Scalar(0, 255, 0)); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->insertResultImg(Paint); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈 + +} +bool HanQianDingWei(std::shared_ptr data, hanQianDingWeiParams* _detParams, sx_581_address address){ + try + { + auto cameraThreadIndex = getCameraIndex(QString::fromStdString(data->cameraKeyName)); + bool zuoLJPtoGaiBanEnable = data->service->_paramSyncManager->get("焊前定位", "左侧连接片和盖板距离判定启用", false).toBool(); + double zuoLJPtoGaiBanMaxThreshold = data->service->_paramSyncManager->get("焊前定位", "左侧连接片和盖板距离(上限)", 1.8).toDouble(); + double zuoLJPtoGaiBanMinThreshold = data->service->_paramSyncManager->get("焊前定位", "左侧连接片和盖板距离(下限)", 0.0).toDouble(); + + bool youLJPtoGaiBanEnable = data->service->_paramSyncManager->get("焊前定位", "右侧连接片和盖板距离判定启用", false).toBool(); + double youLJPtoGaiBanMaxThreshold = data->service->_paramSyncManager->get("焊前定位", "右侧连接片和盖板距离(上限)", 1.8).toDouble(); + double youLJPtoGaiBanMinThreshold = data->service->_paramSyncManager->get("焊前定位", "右侧连接片和盖板距离(下限)", 0.0).toDouble(); + + bool ljpYuanXinJuEnable = data->service->_paramSyncManager->get("焊前定位", "连接片圆心距离判定启用", false).toBool(); + double ljpYuanXinJuMaxThreshold = data->service->_paramSyncManager->get("焊前定位", "连接片圆心距离(上限)", 1.8).toDouble(); + double ljpYuanXinJuMinThreshold = data->service->_paramSyncManager->get("焊前定位", "连接片圆心距离(下限)", 0.0).toDouble(); + std::vector defects; + QByteArray plcResult = "1"; + //data->getOriImg(0) = cv::imread("D://testImage//hqdw.bmp",-1); + cv::Mat sourceImg = data->getOriImg(0); + cv::Mat Paint; + sourceImg.copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + HDevEngineCpp::HDevProcedure proc("_3_HQDW_Inspection"); + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + + HTuple in_Resolution(data->service->_paramSyncManager->get("相机精度", "焊前定位" + QString::fromStdString(data->cameraKeyName) + "精度", 0.0349425).toDouble()), in_FilePath("./halconFiles/"); + HObject inputImage = MatToHObject(sourceImg); + + procedureCall.SetInputIconicParamObject("in_Image", inputImage); + procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); + procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath); + procedureCall.Execute();//执行halcon程序 + HTuple out_ColorType; + HTuple out_Distance; + HTuple out_CCDistance; + HTuple make; + HObject out_DisplayImage; + out_ColorType = procedureCall.GetOutputCtrlParamTuple("out_ColorType");//获取输出控制类变量 + out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量 + out_CCDistance = procedureCall.GetOutputCtrlParamTuple("out_CCDistance");//获取输出控制类变量 + make = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 + out_DisplayImage = procedureCall.GetOutputIconicParamObject("out_DisplayImage");//获取输出控制类变量 + int flag = make.D(); + + // Output(HTuple): out_ColorType, 1, 铜; 2,铝 + + //正确的应该左边铝 右边铜 + double value1_1 = 0, value1_2 = 0, value2_1 = 0, value2_2 = 0; + bool jiXingEnable = data->service->_paramSyncManager->get("焊前定位", "焊前极性判定启用", false).toBool(); + TextRendererZH textPainter(Paint.cols, Paint.rows, 200); + TextRendererZH textPainter2(Paint.cols, Paint.rows, 600); + TextRendererZH textPainter3(Paint.cols, Paint.rows, 800); + if (flag == 1){ + + bool isNg = false; + + Paint = HObject2Mat(out_DisplayImage); + int l = out_Distance.Length(); + if (out_Distance.Length() >= 3) { + value1_1 = out_Distance[1].D(); + value1_2 = out_Distance[2].D(); + textPainter.appendPaintJob("线段夹角:" + std::to_string(out_Distance[3].D()) + "°", cv::Point(0, 10), cv::Scalar(0, 255, 0)); + + + //判断圆心距 + double yuanXinJu = out_Distance[0].D(); + if (ljpYuanXinJuMaxThreshold < yuanXinJu || ljpYuanXinJuMinThreshold > yuanXinJu) {//NG + textPainter.appendPaintJob("铜极+铝极连接片中心距离:" + std::to_string(yuanXinJu) + "mm", cv::Point(0, sourceImg.rows - 950), cv::Scalar(0, 0, 255)); + defects.push_back("圆心距NG"); + if (ljpYuanXinJuEnable == true) + isNg = true; + } + else//OK + textPainter.appendPaintJob("铜极+铝极连接片中心距离:" + std::to_string(yuanXinJu) + "mm", cv::Point(0, sourceImg.rows - 950), cv::Scalar(0, 255, 0)); + + textPainter.appendPaintJob("电芯上水平边缘和注液孔的中心圆的距离:" + std::to_string(out_Distance[1].D()) + "mm", cv::Point(0, sourceImg.rows - 750), cv::Scalar(0, 255, 0)); + textPainter.appendPaintJob("电芯下水平边缘和注液孔的中心圆的距离:" + std::to_string(out_Distance[2].D()) + "mm", cv::Point(0, sourceImg.rows - 550), cv::Scalar(0, 255, 0)); +#if switchToNew + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(out_Distance[0].D()) + cameraThreadIndex); + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr+2) + "_" + QByteArray::number(out_Distance[1].D()) + cameraThreadIndex); +#else + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(out_Distance[0].D())); + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_" + QByteArray::number(out_Distance[1].D())); +#endif + + data->sqlVec.insert({ "电芯上水平边缘和注液孔的中心圆的距离", out_Distance[1].D() }); + data->sqlVec.insert({ "电芯下水平边缘和注液孔的中心圆的距离", out_Distance[2].D() }); + } + if (out_CCDistance.Length() == 2) { + value2_1 = out_CCDistance[0].D(); + if (zuoLJPtoGaiBanMaxThreshold < value2_1 || zuoLJPtoGaiBanMinThreshold > value2_1) {//NG + textPainter.appendPaintJob("左侧连接片圆心和盖板圆心的距离:" + std::to_string(value2_1) + "mm", cv::Point(0, sourceImg.rows - 350), cv::Scalar(0, 0, 255)); + defects.push_back("左连接片距离NG"); + if (zuoLJPtoGaiBanEnable == true) + isNg = true; + } + else//OK + textPainter.appendPaintJob("左侧连接片圆心和盖板圆心的距离:" + std::to_string(value2_1) + "mm", cv::Point(0, sourceImg.rows - 350), cv::Scalar(0, 255, 0)); + + value2_2 = out_CCDistance[1].D(); + if (youLJPtoGaiBanMaxThreshold < value2_2 || youLJPtoGaiBanMinThreshold > value2_2) {//NG + defects.push_back("右连接片距离NG"); + textPainter.appendPaintJob("右侧连接片圆心和盖板圆心的距离:" + std::to_string(value2_2) + "mm", cv::Point(0, sourceImg.rows - 150), cv::Scalar(0, 0, 255)); + if(youLJPtoGaiBanEnable == true) + isNg = true; + } + else + textPainter.appendPaintJob("右侧连接片圆心和盖板圆心的距离:" + std::to_string(value2_2) + "mm", cv::Point(0, sourceImg.rows - 150), cv::Scalar(0, 255, 0)); +#if switchToNew + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(out_CCDistance[0].D()) + cameraThreadIndex); + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_" + QByteArray::number(out_Distance[1].D()) + cameraThreadIndex); +#else + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_" + QByteArray::number(out_CCDistance[0].D())); + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_" + QByteArray::number(out_Distance[1].D())); +#endif + + data->sqlVec.insert({ "左侧连接片圆心和盖板圆心的距离", out_CCDistance[0].D() }); + data->sqlVec.insert({ "右侧连接片圆心和盖板圆心的距离", out_CCDistance[1].D() }); + } + + int left = out_ColorType[0].D(); + //结果判定,铜在左边,铝在右边 + if (left == 2) + textPainter2.appendPaintJob("铜",cv::Point(0, 1500), cv::Scalar(0, 255, 0)); + else if (left == 1) + textPainter2.appendPaintJob("铝",cv::Point(0, 1500), cv::Scalar(0, 0, 255)); + else + textPainter2.appendPaintJob("异常",cv::Point(0, 1500), cv::Scalar(0, 0, 255)); + + int right = out_ColorType[1].D(); + if (right == 2) + textPainter2.appendPaintJob("铜",cv::Point(Paint.cols - 600, 1500), cv::Scalar(0, 0, 255)); + else if (right == 1) + textPainter2.appendPaintJob("铝",cv::Point(Paint.cols - 600, 1500), cv::Scalar(0, 255, 0)); + else + textPainter2.appendPaintJob("异常",cv::Point(Paint.cols - 600, 1500), cv::Scalar(0, 0, 255)); + + if (left == 1 || right == 2) { + defects.push_back("极性NG"); + if (jiXingEnable) + isNg = true; + } + + + if(isNg == true){ + textPainter3.appendPaintJob("NG", cv::Point(0, 50), cv::Scalar(0, 0, 255)); + plcResult = "2"; + data->halconOK = false; + } + else { + textPainter3.appendPaintJob("OK", cv::Point(0, 50), cv::Scalar(0, 255, 0)); + } + } + else + { + TextRendererZH textPainter4(Paint.cols, Paint.rows, 500); + textPainter4.putText(Paint, "NG", cv::Point(0, 50), cv::Scalar(0, 0, 255));//调机 + plcResult = "2"; + data->halconOK = false; + } + if (data->service->_paramSyncManager->get("通用设置","强制OK", false).toBool()) + plcResult = "1"; +#if switchToNew + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult + cameraThreadIndex);//结果反馈 +#else + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈 +#endif + data->service->_missionResultHandle->toBarChart(data->SNcode, defects); + + textPainter.excusePaintJobs(Paint); + textPainter2.excusePaintJobs(Paint); + textPainter3.excusePaintJobs(Paint); + data->insertResultImg(Paint); + return true; + } + CATCH_EXCEPTIONS + exceptionResume(data, _detParams, address, "检测失败"); + qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); + return false; +} + +bool HanHou2D_halconEvaluate(std::shared_ptr data, const cv::Mat& sourceImg,const cv::Mat& segImg, TextRendererZH* textPainter, double& hanHouTongXingDu, int times) { + double tongXingDuLimitHigh = data->service->_paramSyncManager->get("焊后", "焊后同心度mm(上限)", 1.8).toDouble(); + double tongXingDuLimitLow = data->service->_paramSyncManager->get("焊后", "焊后同心度mm(下限)", 0).toDouble(); + bool tongXingDuLimitEnable = data->service->_paramSyncManager->get("焊后", "焊后同心度判定启用", true).toBool(); + HDevEngineCpp::HDevProcedure proc("_3_Cal_HY_CC_Distance"); + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + + HObject in_Image = MatToHObject(sourceImg); + HObject in_ImageSeg = MatToHObject(segImg); + double resolution = 0.013736; + HalconCpp::HTuple in_FliePath("./halconFiles/"), in_Resolution(resolution); + procedureCall.SetInputIconicParamObject("in_Image", in_Image); + procedureCall.SetInputIconicParamObject("in_ImageSeg", in_ImageSeg); + procedureCall.SetInputCtrlParamTuple("in_FliePath", in_FliePath); + procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution); + procedureCall.Execute();//执行halcon程序 + HalconCpp::HTuple out_CCDistance = procedureCall.GetOutputCtrlParamTuple("out_CCDistance");//获取输出控制类变量 + HalconCpp::HTuple out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量 + HalconCpp::HTuple out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量 + HalconCpp::HTuple out_NgTails = procedureCall.GetOutputCtrlParamTuple("out_NgTails");//获取输出控制类变量 + HalconCpp::HTuple InnerCircle_offset = procedureCall.GetOutputCtrlParamTuple("InnerCircle_offset");//获取输出控制类变量 + HalconCpp::HTuple OuterCircle_offset = procedureCall.GetOutputCtrlParamTuple("OuterCircle_offset");//外圆偏移(X向偏移,Y向偏移) + int flag = out_Flag.D(); + bool isNg = false; + if (flag == 1){ + + + double CCDistance = out_CCDistance.D(); + textPainter->appendPaintJob("焊印同心度:" + std::to_string(CCDistance), cv::Point(0, 50), cv::Scalar(0, 255, 0)); + + std::string x1Text = std::to_string(InnerCircle_offset[0].D()); + x1Text = x1Text.substr(0, x1Text.find(".") + 4); + std::string y1Text = std::to_string(InnerCircle_offset[1].D()); + y1Text = y1Text.substr(0, y1Text.find(".") + 4); + std::string txd1Text = std::to_string(std::sqrtf(std::powf(InnerCircle_offset[0].D(), 2) + std::powf(InnerCircle_offset[1].D(), 2))); + txd1Text = txd1Text.substr(0, txd1Text.find(".") + 4); + textPainter->appendPaintJob("内圆偏移X:" + x1Text + "mm Y:" + y1Text + "mm 同心度" + txd1Text, cv::Point(0, 250), cv::Scalar(0, 255, 0)); + + std::string x2Text = std::to_string(OuterCircle_offset[0].D()); + x2Text = x2Text.substr(0, x2Text.find(".") + 4); + std::string y2Text = std::to_string(OuterCircle_offset[1].D()); + y2Text = y2Text.substr(0, y2Text.find(".") + 4); + std::string txd2Text = std::to_string(std::sqrtf(std::powf(OuterCircle_offset[0].D(), 2) + std::powf(OuterCircle_offset[1].D(), 2))); + txd2Text = txd2Text.substr(0, txd2Text.find(".") + 4); + textPainter->appendPaintJob("外圆偏移X:" + x2Text + "mm Y:" + y2Text + "mm 同心度:" + txd2Text, cv::Point(0, 450), cv::Scalar(0, 255, 0)); + + for (int i = 0; i < out_Circle.Length() / 3; i++) { + textPainter->appendPaintJob(cv::Point(out_Circle[i * 3 + 1].D(), out_Circle[i * 3].D()), out_Circle[i * 3 + 2].D(), cv::Scalar(0, 255, 0), 15,0); + } + if (CCDistance > tongXingDuLimitHigh || CCDistance < tongXingDuLimitLow){ + textPainter->appendPaintJob("同心度NG", cv::Point(10, 650), cv::Scalar(0, 0, 255)); + data->halconOK = false; + if(tongXingDuLimitEnable == true) + isNg = true; + } + } + else{ + textPainter->appendPaintJob("焊印抓取NG", cv::Point(10, 50), cv::Scalar(0, 0, 255)); + textPainter->appendPaintJob(gbkToUtf8(out_NgTails.ToString().Text()), cv::Point(10, 450), cv::Scalar(0, 0, 255)); + if (tongXingDuLimitEnable == true) + isNg = true; + data->halconOK = false; + } + return isNg; +} +bool HanHou2D_handleAiEvaluate(std::shared_ptr data, hanHouJianCe* _detParams,const cv::Mat& sourceImg, TextRendererZH* textPainter,handdleAI::pSegmentation* seg,handdleAI::pClassification* cls) { + double hanZhaFillterWidth = data->service->_paramSyncManager->get("焊后", "焊渣过滤值宽mm(上限)", 0.1).toDouble()/ 0.013736; + double hanZhaFillterHeight = data->service->_paramSyncManager->get("焊后", "焊渣过滤值高mm(上限)", 0.1).toDouble()/ 0.013736; + bool hanZhaEnable = data->service->_paramSyncManager->get("焊后", "焊渣判定启用", false).toBool(); + + cv::Mat forSeg; + sourceImg.copyTo(forSeg); + cv::resize(sourceImg, forSeg, cv::Size(), 0.5, 0.5); + + cv::Mat SegResult = ~seg->Evaluate(forSeg); + std::vector> contours; + cv::findContours(SegResult, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + std::vector PaintRects; + std::vector>clsImgTmp; + bool isNg = false;; + for (int i = 0; i < contours.size(); i++) { + cv::Rect rect = cv::boundingRect(contours[i]); + if (rect.width > hanZhaFillterWidth || rect.height > hanZhaFillterHeight) { + cv::Mat clsImg; + cv::resize(forSeg(rect), clsImg, cv::Size(128, 128)); + bool clsIsNg = false; + int clsRes = cls->Evaluate(clsImg); + if (clsRes == 1) + clsIsNg = true; + if (clsIsNg == true) { + rect.x *= 2; rect.y *= 2; rect.width *= 2; rect.height *= 2; + PaintRects.push_back(rect); + isNg = true; + } + clsImgTmp.push_back({ clsIsNg == true ? "NG" : "OK",clsImg }); + } + } + for (auto& rect : PaintRects) { + textPainter->appendPaintJob(cv::Rect(rect.x + rect.width / 2 -64, rect.y + rect.height / 2 -64, 128, 128), cv::Scalar(0, 0, 255), 3); + } + data->insertClsOriginImg(clsImgTmp); + return isNg; +} +QByteArray getHanHouJianCe2DSendResult(bool isNg1,bool isNg2) { + if (isNg1 == false && isNg2 == false) //都OK发1 + return "1"; + else if (isNg1 == true && isNg2 == false)//第一次NG发2 + return "2"; + else if (isNg1 == false && isNg2 == true)//第二次NG发3 + return "3"; + else if (isNg1 == true && isNg2 == true)//两次都NG发4 + return "4"; + else//为了DEBUG + return "5"; +} +bool HanHouJianCe2D(std::shared_ptr data, hanHouJianCe* _detParams, sx_581_address address){ + try + { + auto cameraThreadIndex = getCameraIndex(QString::fromStdString(data->cameraKeyName)); + //data->SNcode = "test"; + //data->oriImgs.clear(); + //data->oriImgs.push_back(cv::imread("D:\\testImage\\T.bmp",-1)); + //data->oriImgs.push_back(cv::imread("D:\\testImage\\L_OK.bmp", -1)); +#pragma region 错误处理 + + if (data->getOriImgSize() < 2) { + exceptionResume(data, _detParams, address, "图片数量不满足"); + return true; + } + if (data->getOriImg(0).cols == 200 || (data->getOriImg(1).cols == 200)) { + data->halconOK = false; + cv::Mat Paint; + data->getOriImg(0).copyTo(Paint); + if (Paint.channels() == 1) { + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + } + TextRendererZH textPainter(Paint.cols, Paint.rows, 40); + textPainter.putText(Paint, "图片数量不满足", cv::Point(0, 0), cv::Scalar(0, 255, 0)); + data->insertResultImg(Paint); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_4");//结果反馈 + return true; + } +#pragma endregion + cv::Mat Paint1, Paint2; + data->getOriImg(0).copyTo(Paint1); + data->getOriImg(1).copyTo(Paint2); + if (Paint1.channels() == 1) { + cvtColor(Paint1, Paint1, cv::COLOR_GRAY2BGR); + } + if (Paint2.channels() == 1) { + cvtColor(Paint2, Paint2, cv::COLOR_GRAY2BGR); + } + std::vector defects; + QByteArray plcResult = "1"; + double hanHouTongXingDu1 = -1; + double hanHouTongXingDu2 = -1; + cv::Mat forSeg1, forSeg2; + double resizeRate = 0.25; + bool isNg1 = false, isNg2 = false; + QMutex mutex1, mutex2; + + cv::resize(data->getOriImg(0), forSeg1, cv::Size(), resizeRate, resizeRate); + cv::Mat seg1 = _detParams->seg_rljHanYinZhuaQu->Evaluate(forSeg1); + data->insertSegOriginImg(seg1); + cv::Rect tongRect = findMaxAreaContour(~seg1); + if (tongRect.width < 100 || tongRect.height < 100) { + isNg1 = true; + } + + cv::resize(data->getOriImg(1), forSeg2, cv::Size(), resizeRate, resizeRate); + cv::Mat seg2 = _detParams->seg_rljHanYinZhuaQu->Evaluate(forSeg2); + data->insertSegOriginImg(seg2); + cv::Rect lvRect = findMaxAreaContour(~seg2); + if (lvRect.width < 100 || lvRect.height < 100) { + isNg2 = true; + } + TextRendererZH textPainter1(Paint1.cols, Paint1.rows, 200), textPainter2(Paint2.cols, Paint2.rows, 200); + //判斷焊印結果 + if (isNg1 == true || isNg2 == true) {//判断存图 + data->halconOK = false; + plcResult = getHanHouJianCe2DSendResult(isNg1, isNg2); + if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool()) + plcResult = "1"; + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult); + if (isNg1 == true) textPainter1.appendPaintJob("焊印抓取失败", cv::Point(0, 0), cv::Scalar(0, 0, 255)); + if (isNg2 == true) textPainter2.appendPaintJob("焊印抓取失败", cv::Point(0, 0), cv::Scalar(0, 0, 255)); + cv::Mat PaintSum; + cv::vconcat(Paint1, Paint2, PaintSum); + data->insertResultImg(PaintSum); + return true; + } + + auto futrue1 = std::async(std::launch::async, &HanHou2D_halconEvaluate, data, data->getOriImg(0), seg1, &textPainter1, std::ref(hanHouTongXingDu1), 0); + auto futrue2 = std::async(std::launch::async, &HanHou2D_halconEvaluate, data, data->getOriImg(1), seg2, &textPainter2, std::ref(hanHouTongXingDu2), 2); + auto futrue3 = std::async(std::launch::async, &HanHou2D_handleAiEvaluate, data, _detParams, data->getOriImg(0), &textPainter1, _detParams->seg_rljHanZha1, _detParams->cls_rljHanZha1); + auto futrue4 = std::async(std::launch::async, &HanHou2D_handleAiEvaluate, data, _detParams, data->getOriImg(1), &textPainter2, _detParams->seg_rljHanZha2, _detParams->cls_rljHanZha2); + + futrue1.wait(); + futrue2.wait(); + isNg1 = futrue1.get(); + isNg2 = futrue2.get(); + + futrue3.wait(); + futrue4.wait(); + + futrue3.get(); + futrue4.get(); + + std::vector> hanYinClsImg; + + int tongClsRes = 0, lvClsRes = 0; + if (isNg1 == true || isNg2 == true) {//同心度是否NG + defects.push_back({ "焊后同心度NG" }); + } + { + auto tongClsImg = cutImg2Cls(tongRect, forSeg1, cv::Size(256, 256)); + tongClsRes = _detParams->cls_hanYinTong->Evaluate(tongClsImg); + double prob = _detParams->cls_hanYinTong->getProbability(); + hanYinClsImg.push_back({ "tongHY_Res" + std::to_string(tongClsRes) + "_prob" + std::to_string(prob),tongClsImg }); + if (tongClsRes == 1) { + defects.push_back({ "铜焊印CLS-NG" }); + textPainter1.appendPaintJob("焊印CLS-NG(测试)", cv::Point(0, 850), cv::Scalar(0, 0, 255)); + /* if (data->service->_paramSyncManager->get("焊后", "焊印CLS判定启用", true).toBool()) { + isNg1 = true; + }*/ + } + else + textPainter1.appendPaintJob("焊印CLS-OK(测试)", cv::Point(0, 850), cv::Scalar(0, 255, 0)); + } + + { + auto lvClsImg = cutImg2Cls(lvRect, forSeg2, cv::Size(256, 256)); + lvClsRes = _detParams->cls_hanYinLv->Evaluate(lvClsImg); + double prob = _detParams->cls_hanYinLv->getProbability(); + hanYinClsImg.push_back({ "lvHY" + std::to_string(tongClsRes) + "_prob" + std::to_string(prob),lvClsImg }); + if (lvClsRes == 1) { + defects.push_back({ "铝焊印CLS-NG" }); + textPainter2.appendPaintJob("焊印CLS-NG", cv::Point(0, 850), cv::Scalar(0, 0, 255)); + if (data->service->_paramSyncManager->get("焊后", "焊印CLS判定启用", true).toBool()) { + isNg2 = true; + } + } + else + textPainter2.appendPaintJob("焊印CLS-OK", cv::Point(0, 850), cv::Scalar(0, 255, 0)); + } + + + + data->service->_triggerManager->writeFloat("D" + QByteArray::number(address.valueOffsetAddr) + "_" + QByteArray::number(hanHouTongXingDu1) + "," + QByteArray::number(hanHouTongXingDu2) + cameraThreadIndex); + + if (isNg1 == true || isNg2 == true) {//判断存图 + data->halconOK = false; + } + + plcResult = getHanHouJianCe2DSendResult(isNg1, isNg2); + if (data->service->_paramSyncManager->get("通用设置", "强制OK", false).toBool()) + plcResult = "1"; + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult + cameraThreadIndex); + if (data->cameraKeyName == "Camera3") + data->service->_triggerManager->writeShort("D5504_1"); + else + data->service->_triggerManager->writeShort("D5704_1"); + data->insertClsOriginImg(hanYinClsImg); + data->service->_missionResultHandle->toBarChart(data->SNcode, defects); + + textPainter1.excusePaintJobs(Paint1); + textPainter2.excusePaintJobs(Paint2); + //拼装结果图 + cv::Mat PaintSum; + cv::vconcat(Paint1, Paint2, PaintSum); + data->insertResultImg(PaintSum); + + return true; + } + CATCH_EXCEPTIONS + exceptionResume(data, _detParams, address, "检测失败"); + qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); + return false; + +} + +bool HanHouJianCe3D(std::shared_ptr data, hanHouJianCe* _detParams, sx_581_address address) { + try { + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果 + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + std::vector < std::string> defects = { }; + ///////////////////取图//处理////////////////// + if (data->getOriImgSize() < 1) + { + qCritical() << "图片数量不满足要求:" << data->getOriImgSize(); + return false; + } + if (data->getOriImg(0).rows == 100) { + cv::Mat Paint; + data->getOriImg(0).copyTo(Paint); + cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); + return false; + } + + + QMutex paintMutex; + clock_t start, finish; + start = clock(); + cv::Mat src1 = data->getOriImg(0); + cv::Mat src2 = data->getOriImg(2); + cv::Mat Paint; + cv::vconcat(src1, src2, Paint); + if (src1.channels() != 3) + cv::cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + + TextRendererZH textPainter(Paint.cols, Paint.rows, 300); + textPainter.putText(Paint, "OK", cv::Point(10, 10), cv::Scalar(0, 255, 0)); + //cv::putText(Paint, "pos:" + data->additional["触发地址"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); + //data->service->_missionResultHandle->toBarChart(data->SNcode, !defects.size() > 0, defects);//发送图标操作 + data->insertResultImg(Paint); + return true; + } + CATCH_EXCEPTIONS + exceptionResume(data, _detParams, address, "检测失败"); + return false; + + +} + + +mission* createMission() { + return new _581_Ruanlianjie_hanqian_hanhou(); +} +void destroyMission(mission* _mission) { + delete _mission; +} diff --git a/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.h b/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.h new file mode 100644 index 0000000..591e235 --- /dev/null +++ b/src/mission/581_Ruanlianjie_hanqian_hanhou/581_Ruanlianjie_hanqian_hanhou.h @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace HDevEngineCpp; +using namespace HalconCpp; +class hanQianDingWeiParams { + +}; +class hanHouJianCe { +public: + handdleAI::pSegmentation* seg_rljHanYinZhuaQu = nullptr; + handdleAI::pSegmentation* seg_rljHanZha1 = nullptr; + handdleAI::pClassification* cls_rljHanZha1 = nullptr; + handdleAI::pSegmentation* seg_rljHanZha2 = nullptr; + handdleAI::pClassification* cls_rljHanZha2 = nullptr; + handdleAI::pClassification* cls_hanYinTong = nullptr; + handdleAI::pClassification* cls_hanYinLv = nullptr; + int ngCnt = 0; +}; + +bool HanQianDingWei(std::shared_ptr data, hanQianDingWeiParams* _detParams, sx_581_address address); +bool HanHouJianCe2D(std::shared_ptr data, hanHouJianCe* _detParams, sx_581_address address); +bool HanHouJianCe3D(std::shared_ptr data, hanHouJianCe* _detParams, sx_581_address address); + +class _581_Ruanlianjie_hanqian_hanhou : public mission { +public: + + _581_SX_Single_triggerTemplate dingwei_1; + _581_SX_Single_triggerTemplate dingwei_2; + + _581_SX_Single_triggerTemplate jiance_2d_1; + _581_SX_Single_triggerTemplate jiance_2d_2; + _581_SX_Single_triggerTemplate jiance_3d_1; + _581_SX_Single_triggerTemplate jiance_3d_2; + + hanQianDingWeiParams hanqiandingweiparams; + std::vectorhanhoujiance2dparams = std::vector(2); + hanHouJianCe hanhoujiance3dparams; + + bool initOnce = false; + void onConfigReloaded() { + HDevEngineCpp::HDevEngine myEngine; + myEngine.SetProcedurePath(""); + myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl"); + + if (initOnce == false) { + + hanhoujiance2dparams[0].seg_rljHanYinZhuaQu = handdleAI::CreateSegObjS("./handleAiModels/seg_rljHanYinZhuaQu.BHD", 64, 0); + hanhoujiance2dparams[1].seg_rljHanYinZhuaQu = handdleAI::CreateSegObjS("./handleAiModels/seg_rljHanYinZhuaQu.BHD", 64, 1); + + hanhoujiance2dparams[0].seg_rljHanZha1 = handdleAI::CreateSegObjS("./handleAiModels/seg_rljHanZha.BHD", 64, 0); + hanhoujiance2dparams[1].seg_rljHanZha1 = handdleAI::CreateSegObjS("./handleAiModels/seg_rljHanZha.BHD", 64, 1); + hanhoujiance2dparams[0].seg_rljHanZha2 = handdleAI::CreateSegObjS("./handleAiModels/seg_rljHanZha.BHD", 64, 0); + hanhoujiance2dparams[1].seg_rljHanZha2 = handdleAI::CreateSegObjS("./handleAiModels/seg_rljHanZha.BHD", 64, 1); + + hanhoujiance2dparams[0].cls_rljHanZha1 = handdleAI::CreateClsObjV3("./handleAiModels/cls_rljHanZha.BHD", 0, 1); + hanhoujiance2dparams[1].cls_rljHanZha1 = handdleAI::CreateClsObjV3("./handleAiModels/cls_rljHanZha.BHD", 1, 1); + hanhoujiance2dparams[0].cls_rljHanZha2 = handdleAI::CreateClsObjV3("./handleAiModels/cls_rljHanZha.BHD", 0, 1); + hanhoujiance2dparams[1].cls_rljHanZha2 = handdleAI::CreateClsObjV3("./handleAiModels/cls_rljHanZha.BHD", 1, 1); + + hanhoujiance2dparams[0].cls_hanYinTong = handdleAI::CreateClsObjV3("./handleAiModels/cls_hanYinTong.BHD", 0, 1); + hanhoujiance2dparams[1].cls_hanYinTong = handdleAI::CreateClsObjV3("./handleAiModels/cls_hanYinTong.BHD", 1, 1); + + hanhoujiance2dparams[0].cls_hanYinLv = handdleAI::CreateClsObjV3("./handleAiModels/cls_hanYinLv.BHD", 0, 1); + hanhoujiance2dparams[1].cls_hanYinLv = handdleAI::CreateClsObjV3("./handleAiModels/cls_hanYinLv.BHD", 1, 1); + initOnce = true; + } + } + bool initCustom() { +#pragma region 注册触发器回调 + dingwei_1.init("Camera1", "焊前定位-相机1(左)", { { 4900, 1,{4910},"4902","4904",4930} }, 1, &hanqiandingweiparams, _serviceManager, bridge, HanQianDingWei,"焊前定位CCD"); + dingwei_2.init("Camera2", "焊前定位-相机2(右)", { { 5800, 1,{5810},"5802","5804",5830} }, 1, &hanqiandingweiparams, _serviceManager, bridge, HanQianDingWei,"焊前定位CCD"); + + jiance_2d_1.init("Camera3", "焊后检测2D-相机1(前)", { { 5400, 1,{5410},"5402","5404",5430} }, 2, &hanhoujiance2dparams[0], _serviceManager, bridge, HanHouJianCe2D, "焊后检测CCD"); + jiance_3d_1.init("Camera4", "焊后检测3D-相机1(前)", { { 5500, 1,{5510},"5502","5504",5530} }, 4, &hanhoujiance3dparams, _serviceManager, bridge, HanHouJianCe3D,"焊后检测CCD"); + jiance_2d_2.init("Camera5", "焊后检测2D-相机2(后)", { { 5600, 1,{5610},"5602","5604",5630} }, 2, &hanhoujiance2dparams[1], _serviceManager, bridge, HanHouJianCe2D, "焊后检测CCD"); + jiance_3d_2.init("Camera6", "焊后检测3D-相机2(后)", { { 5700, 1,{5710},"5702","5704",5730} }, 4, &hanhoujiance3dparams, _serviceManager, bridge, HanHouJianCe3D,"焊后检测CCD"); +#pragma endregion + return true; + } +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/581_Ruanlianjie_hanqian_hanhou/CMakeLists.txt b/src/mission/581_Ruanlianjie_hanqian_hanhou/CMakeLists.txt new file mode 100644 index 0000000..76e9200 --- /dev/null +++ b/src/mission/581_Ruanlianjie_hanqian_hanhou/CMakeLists.txt @@ -0,0 +1,77 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "opencv" "halcon" "handdleAI") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + ${PROJECT_ROOT_PATH}/src/core + ${PROJECT_ROOT_PATH}/src/core/handleAi + ${PROJECT_ROOT_PATH}/src/core/service + ${PROJECT_ROOT_PATH}/src/core/sql + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) +add_compile_options(/utf-8) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC OFF) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ${PROJECT_ROOT_PATH}/include/interface.h + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Network + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME}) +message( " header files "${HEAD_FILES}) diff --git a/subModule/Hd_CameraModule_HIK_General/Hd_CameraModule_HIK_General.cpp b/subModule/Hd_CameraModule_HIK_General/Hd_CameraModule_HIK_General.cpp index 97d833f..f76c59e 100644 --- a/subModule/Hd_CameraModule_HIK_General/Hd_CameraModule_HIK_General.cpp +++ b/subModule/Hd_CameraModule_HIK_General/Hd_CameraModule_HIK_General.cpp @@ -333,9 +333,16 @@ bool Hd_CameraModule_HIK_General::writeData(std::vector& mat, QByteArra return true; } if (data == "clearCache") { + QMutexLocker locker(n_mutex); queuepic.clear(); return true; } + if (data.contains("exposure")){ + auto commandList = data.split('_'); + QMutexLocker locker(n_mutex); + SetExposureTime(commandList[1].toFloat()); + return true; + } return true; } //传入initParas函数,格式为:相机key+参数名1#参数值1#参数值2+参数名2#参数值1... diff --git a/subModule/Hd_CameraModule_HIK_General_debouncing/Hd_CameraModule_HIK_General.cpp b/subModule/Hd_CameraModule_HIK_General_debouncing/Hd_CameraModule_HIK_General.cpp index fd7e320..8786bc3 100644 --- a/subModule/Hd_CameraModule_HIK_General_debouncing/Hd_CameraModule_HIK_General.cpp +++ b/subModule/Hd_CameraModule_HIK_General_debouncing/Hd_CameraModule_HIK_General.cpp @@ -333,7 +333,7 @@ bool Hd_CameraModule_HIK_General::writeData(std::vector& mat, QByteArra auto result = QByteArrayToMV_CC_DeviceInfoList(data.mid(10)); if (result.nDeviceNum != 0) { m_stDevList = result; - return true; + return true; } } if (data == "getStatus") { @@ -341,9 +341,16 @@ bool Hd_CameraModule_HIK_General::writeData(std::vector& mat, QByteArra return true; } if (data == "clearCache") { + QMutexLocker locker(n_mutex); queuepic.clear(); return true; } + if (data.contains("exposure")) { + auto commandList = data.split('_'); + QMutexLocker locker(n_mutex); + SetExposureTime(commandList[1].toFloat()); + return true; + } return true; } //传入initParas函数,格式为:相机key+参数名1#参数值1#参数值2+参数名2#参数值1... diff --git a/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp b/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp index 9506ca6..52773d0 100644 --- a/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp +++ b/subModule/Hd_CameraModule_HIK_PCIE/Hd_CameraModule_HIK_PCIE.cpp @@ -317,6 +317,15 @@ bool Hd_CameraModule_HIK_hard_PCIE::writeData(std::vector& mat, QByteAr return true; } } + if (data == "getStatus") { + data = lastError.toUtf8(); + return true; + } + if (data == "clearCache") { + QMutexLocker locker(n_mutex); + queuepic.clear(); + return true; + } return true; }