diff --git a/.gitignore b/.gitignore index f1a0bd8..2e7532b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ build release debug .qtc_clangd -Makefile* +Makefile.* *.pro.user* *.pro.user .idea diff --git a/camera.cpp b/camera.cpp index 65c975f..a7c6d0a 100644 --- a/camera.cpp +++ b/camera.cpp @@ -159,17 +159,22 @@ MIL_INT ProcessingFunction0(MIL_INT HookType, MIL_ID HookId, void *HookDataPtr) } - if(SaveImg_Flag) + if (SaveImg_Flag) { - //拷贝存图图像 - MbufCopy(ModifiedBufferId0,MilImage0); - //Mil保存路径 - QString MilImgPath = QString("C:/Users/Administrator/Desktop/1/%1.bmp").arg(FuncCount0); - MIL_STRING MilImagePath = MilImgPath.toStdWString(); - MbufExport(MilImagePath,M_BMP,MilImage0); - qDebug()<<"回调1成功存储照片:"< #include - #include "globals.h" #include "img_utils.h" diff --git a/cotton_double2.pro b/cotton_double2.pro index e0a22d4..5d34fe9 100644 --- a/cotton_double2.pro +++ b/cotton_double2.pro @@ -14,6 +14,7 @@ SOURCES += \ img_utils.cpp \ main.cpp \ onnxrunner.cpp \ + storageworker.cpp \ widget.cpp HEADERS += \ @@ -21,6 +22,7 @@ HEADERS += \ globals.h \ img_utils.h \ onnxrunner.h \ + storageworker.h \ widget.h FORMS += \ diff --git a/globals.cpp b/globals.cpp index 2677c3e..ce3fe4c 100644 --- a/globals.cpp +++ b/globals.cpp @@ -39,3 +39,5 @@ QString getConfigDirectory() { return saveDir; } + +ThreadSafeQueue g_storageQueue; diff --git a/globals.h b/globals.h index 1d06267..6c4b425 100644 --- a/globals.h +++ b/globals.h @@ -28,4 +28,55 @@ extern QSemaphore detection_ready; QString getSaveDirectory(); QString getConfigDirectory(); +// 定义一个结构体来存储图像数据及其来源相机ID +struct ImageData +{ + int camera_id; + cv::Mat image; +}; + +template +class ThreadSafeQueue{ +public: + // 添加元素到队列 + void enqueue(const T& item) + { + std::unique_lock lock(mutex_); + queue_.push(item); + cond_var_.notify_one(); + } + + // 从队列中移除并获取元素 + bool dequeue(T& item) + { + std::unique_lock lock(mutex_); + while (queue_.empty() && !stop_) + { + cond_var_.wait(lock); + } + if (queue_.empty()) + return false; + item = std::move(queue_.front()); + queue_.pop(); + return true; + } + + // 停止队列,唤醒所有等待的线程 + void stop() + { + std::unique_lock lock(mutex_); + stop_ = true; + cond_var_.notify_all(); + } + +private: + std::queue queue_; + std::mutex mutex_; + std::condition_variable cond_var_; + bool stop_ = false; +}; + + +// 定义全局存储队列 +extern ThreadSafeQueue g_storageQueue; #endif // GLOBALS_H diff --git a/ui_widget.h b/ui_widget.h index f23f17f..3c727b5 100644 --- a/ui_widget.h +++ b/ui_widget.h @@ -11,11 +11,15 @@ #include #include +#include #include +#include #include #include +#include #include #include +#include #include QT_BEGIN_NAMESPACE @@ -23,24 +27,35 @@ QT_BEGIN_NAMESPACE class Ui_Widget { public: + QHBoxLayout *horizontalLayout; QTabWidget *tabWidget; QWidget *tab; - QPushButton *pushButtonStart; + QVBoxLayout *verticalLayout; + QGroupBox *groupBox_5; + QGridLayout *gridLayout; QPushButton *pushButton_2; QPushButton *btn_goto_sort; QPushButton *btn_0to3; + QPushButton *pushButtonStart; QGroupBox *groupBox; + QHBoxLayout *horizontalLayout_2; QLabel *label; QLabel *lab_lowermachine_isconnect; QPushButton *btn_reconnect; QWidget *tab_2; + QHBoxLayout *horizontalLayout_3; + QGroupBox *groupBox_7; + QVBoxLayout *verticalLayout_3; QLabel *lab_info; QPushButton *btn_start; QPushButton *btn_stop; - QLabel *camera_1_img; - QLabel *label_2; + QSpacerItem *verticalSpacer; + QGroupBox *groupBox_6; + QVBoxLayout *verticalLayout_2; QLabel *label_3; QLabel *camera_0_img; + QLabel *label_2; + QLabel *camera_1_img; QWidget *tab_3; QLabel *label_title_3; QGroupBox *groupBox_4; @@ -68,32 +83,53 @@ public: if (Widget->objectName().isEmpty()) Widget->setObjectName("Widget"); Widget->resize(800, 600); + horizontalLayout = new QHBoxLayout(Widget); + horizontalLayout->setObjectName("horizontalLayout"); tabWidget = new QTabWidget(Widget); tabWidget->setObjectName("tabWidget"); - tabWidget->setGeometry(QRect(0, 0, 801, 601)); tab = new QWidget(); tab->setObjectName("tab"); - pushButtonStart = new QPushButton(tab); - pushButtonStart->setObjectName("pushButtonStart"); - pushButtonStart->setGeometry(QRect(100, 130, 201, 61)); - pushButton_2 = new QPushButton(tab); + verticalLayout = new QVBoxLayout(tab); + verticalLayout->setObjectName("verticalLayout"); + groupBox_5 = new QGroupBox(tab); + groupBox_5->setObjectName("groupBox_5"); + gridLayout = new QGridLayout(groupBox_5); + gridLayout->setObjectName("gridLayout"); + pushButton_2 = new QPushButton(groupBox_5); pushButton_2->setObjectName("pushButton_2"); - pushButton_2->setGeometry(QRect(400, 120, 181, 71)); - btn_goto_sort = new QPushButton(tab); + + gridLayout->addWidget(pushButton_2, 1, 1, 1, 1); + + btn_goto_sort = new QPushButton(groupBox_5); btn_goto_sort->setObjectName("btn_goto_sort"); - btn_goto_sort->setGeometry(QRect(120, 290, 121, 61)); - btn_0to3 = new QPushButton(tab); + + gridLayout->addWidget(btn_goto_sort, 2, 0, 1, 1); + + btn_0to3 = new QPushButton(groupBox_5); btn_0to3->setObjectName("btn_0to3"); - btn_0to3->setGeometry(QRect(410, 290, 141, 61)); + + gridLayout->addWidget(btn_0to3, 2, 1, 1, 1); + + pushButtonStart = new QPushButton(groupBox_5); + pushButtonStart->setObjectName("pushButtonStart"); + + gridLayout->addWidget(pushButtonStart, 1, 0, 1, 1); + + + verticalLayout->addWidget(groupBox_5); + groupBox = new QGroupBox(tab); groupBox->setObjectName("groupBox"); - groupBox->setGeometry(QRect(160, 390, 401, 131)); + horizontalLayout_2 = new QHBoxLayout(groupBox); + horizontalLayout_2->setObjectName("horizontalLayout_2"); + horizontalLayout_2->setSizeConstraint(QLayout::SizeConstraint::SetDefaultConstraint); label = new QLabel(groupBox); label->setObjectName("label"); - label->setGeometry(QRect(40, 70, 41, 16)); + + horizontalLayout_2->addWidget(label); + lab_lowermachine_isconnect = new QLabel(groupBox); lab_lowermachine_isconnect->setObjectName("lab_lowermachine_isconnect"); - lab_lowermachine_isconnect->setGeometry(QRect(90, 60, 31, 31)); QPalette palette; QBrush brush(QColor(237, 212, 0, 255)); brush.setStyle(Qt::SolidPattern); @@ -112,42 +148,101 @@ public: palette.setBrush(QPalette::Disabled, QPalette::Window, brush); palette.setBrush(QPalette::Disabled, QPalette::AlternateBase, brush1); lab_lowermachine_isconnect->setPalette(palette); - btn_reconnect = new QPushButton(tab); + + horizontalLayout_2->addWidget(lab_lowermachine_isconnect); + + btn_reconnect = new QPushButton(groupBox); btn_reconnect->setObjectName("btn_reconnect"); - btn_reconnect->setGeometry(QRect(590, 440, 101, 41)); + + horizontalLayout_2->addWidget(btn_reconnect); + + + verticalLayout->addWidget(groupBox); + + verticalLayout->setStretch(0, 5); + verticalLayout->setStretch(1, 1); tabWidget->addTab(tab, QString()); tab_2 = new QWidget(); tab_2->setObjectName("tab_2"); - lab_info = new QLabel(tab_2); + horizontalLayout_3 = new QHBoxLayout(tab_2); + horizontalLayout_3->setObjectName("horizontalLayout_3"); + groupBox_7 = new QGroupBox(tab_2); + groupBox_7->setObjectName("groupBox_7"); + verticalLayout_3 = new QVBoxLayout(groupBox_7); + verticalLayout_3->setSpacing(20); + verticalLayout_3->setObjectName("verticalLayout_3"); + verticalLayout_3->setContentsMargins(9, 9, 9, -1); + lab_info = new QLabel(groupBox_7); lab_info->setObjectName("lab_info"); - lab_info->setGeometry(QRect(20, 50, 151, 81)); QFont font; font.setPointSize(28); lab_info->setFont(font); - btn_start = new QPushButton(tab_2); + + verticalLayout_3->addWidget(lab_info); + + btn_start = new QPushButton(groupBox_7); btn_start->setObjectName("btn_start"); - btn_start->setGeometry(QRect(20, 130, 101, 41)); - btn_stop = new QPushButton(tab_2); + btn_start->setMinimumSize(QSize(70, 70)); + + verticalLayout_3->addWidget(btn_start); + + btn_stop = new QPushButton(groupBox_7); btn_stop->setObjectName("btn_stop"); - btn_stop->setGeometry(QRect(20, 190, 101, 41)); - camera_1_img = new QLabel(tab_2); - camera_1_img->setObjectName("camera_1_img"); - camera_1_img->setGeometry(QRect(160, 290, 591, 191)); - camera_1_img->setStyleSheet(QString::fromUtf8("background-color: rgb(129, 129, 129);\n" -"border: 4px solid black;")); - camera_1_img->setLineWidth(1); - label_2 = new QLabel(tab_2); - label_2->setObjectName("label_2"); - label_2->setGeometry(QRect(160, 270, 141, 16)); - label_3 = new QLabel(tab_2); + btn_stop->setMinimumSize(QSize(70, 70)); + + verticalLayout_3->addWidget(btn_stop); + + verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Policy::Minimum, QSizePolicy::Policy::Expanding); + + verticalLayout_3->addItem(verticalSpacer); + + + horizontalLayout_3->addWidget(groupBox_7); + + groupBox_6 = new QGroupBox(tab_2); + groupBox_6->setObjectName("groupBox_6"); + verticalLayout_2 = new QVBoxLayout(groupBox_6); + verticalLayout_2->setObjectName("verticalLayout_2"); + label_3 = new QLabel(groupBox_6); label_3->setObjectName("label_3"); - label_3->setGeometry(QRect(160, 20, 141, 16)); - camera_0_img = new QLabel(tab_2); + + verticalLayout_2->addWidget(label_3); + + camera_0_img = new QLabel(groupBox_6); camera_0_img->setObjectName("camera_0_img"); - camera_0_img->setGeometry(QRect(160, 50, 591, 191)); + QSizePolicy sizePolicy(QSizePolicy::Policy::Ignored, QSizePolicy::Policy::Ignored); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(camera_0_img->sizePolicy().hasHeightForWidth()); + camera_0_img->setSizePolicy(sizePolicy); camera_0_img->setStyleSheet(QString::fromUtf8("background-color: rgb(129, 129, 129);\n" "border: 4px solid black;")); camera_0_img->setLineWidth(1); + + verticalLayout_2->addWidget(camera_0_img); + + label_2 = new QLabel(groupBox_6); + label_2->setObjectName("label_2"); + + verticalLayout_2->addWidget(label_2); + + camera_1_img = new QLabel(groupBox_6); + camera_1_img->setObjectName("camera_1_img"); + sizePolicy.setHeightForWidth(camera_1_img->sizePolicy().hasHeightForWidth()); + camera_1_img->setSizePolicy(sizePolicy); + camera_1_img->setStyleSheet(QString::fromUtf8("background-color: rgb(129, 129, 129);\n" +"border: 4px solid black;")); + camera_1_img->setLineWidth(1); + + verticalLayout_2->addWidget(camera_1_img); + + verticalLayout_2->setStretch(1, 5); + verticalLayout_2->setStretch(3, 5); + + horizontalLayout_3->addWidget(groupBox_6); + + horizontalLayout_3->setStretch(0, 3); + horizontalLayout_3->setStretch(1, 10); tabWidget->addTab(tab_2, QString()); tab_3 = new QWidget(); tab_3->setObjectName("tab_3"); @@ -216,6 +311,9 @@ public: btn_stop_test->setGeometry(QRect(210, 40, 75, 23)); tabWidget->addTab(tab_4, QString()); + horizontalLayout->addWidget(tabWidget); + + retranslateUi(Widget); tabWidget->setCurrentIndex(1); @@ -227,22 +325,25 @@ public: void retranslateUi(QWidget *Widget) { Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr)); - pushButtonStart->setText(QCoreApplication::translate("Widget", "\345\274\200\345\247\213", nullptr)); + groupBox_5->setTitle(QCoreApplication::translate("Widget", "GroupBox", nullptr)); pushButton_2->setText(QCoreApplication::translate("Widget", "\344\277\235\345\255\230\345\233\276\347\211\207", nullptr)); btn_goto_sort->setText(QCoreApplication::translate("Widget", "\345\201\234\346\255\242", nullptr)); btn_0to3->setText(QCoreApplication::translate("Widget", "\345\226\267\351\230\200\346\265\213\350\257\225", nullptr)); + pushButtonStart->setText(QCoreApplication::translate("Widget", "\345\274\200\345\247\213", nullptr)); groupBox->setTitle(QCoreApplication::translate("Widget", "\350\277\236\346\216\245\347\212\266\346\200\201\357\274\232", nullptr)); label->setText(QCoreApplication::translate("Widget", "\344\270\213\344\275\215\346\234\272", nullptr)); lab_lowermachine_isconnect->setText(QString()); btn_reconnect->setText(QCoreApplication::translate("Widget", "\351\207\215\346\226\260\350\277\236\346\216\245", nullptr)); tabWidget->setTabText(tabWidget->indexOf(tab), QCoreApplication::translate("Widget", "Tab 1", nullptr)); - lab_info->setText(QCoreApplication::translate("Widget", "\345\207\206\345\244\207\344\270\255", nullptr)); + groupBox_7->setTitle(QCoreApplication::translate("Widget", "\346\216\247\345\210\266\345\217\212\347\212\266\346\200\201", nullptr)); + lab_info->setText(QCoreApplication::translate("Widget", "\347\212\266\346\200\201", nullptr)); btn_start->setText(QCoreApplication::translate("Widget", "\345\274\200\345\247\213\345\210\206\351\200\211", nullptr)); btn_stop->setText(QCoreApplication::translate("Widget", "\345\201\234\346\255\242\345\210\206\351\200\211", nullptr)); - camera_1_img->setText(QString()); - label_2->setText(QCoreApplication::translate("Widget", "\347\233\270\346\234\2721\357\274\210\351\253\230\344\276\247/\346\260\224\347\275\220\344\276\247\357\274\211", nullptr)); + groupBox_6->setTitle(QCoreApplication::translate("Widget", "\347\233\270\346\234\272\346\230\276\347\244\272", nullptr)); label_3->setText(QCoreApplication::translate("Widget", "\347\233\270\346\234\2720\357\274\210\344\275\216\344\276\247/\345\207\272\351\243\216\345\217\243\344\276\247\357\274\211", nullptr)); camera_0_img->setText(QString()); + label_2->setText(QCoreApplication::translate("Widget", "\347\233\270\346\234\2721\357\274\210\351\253\230\344\276\247/\346\260\224\347\275\220\344\276\247\357\274\211", nullptr)); + camera_1_img->setText(QString()); tabWidget->setTabText(tabWidget->indexOf(tab_2), QCoreApplication::translate("Widget", "Tab 2", nullptr)); label_title_3->setText(QCoreApplication::translate("Widget", "\345\217\202\346\225\260\350\256\276\347\275\256\347\225\214\351\235\242", nullptr)); groupBox_4->setTitle(QCoreApplication::translate("Widget", "\344\270\213\344\275\215\346\234\272\345\217\202\346\225\260", nullptr)); diff --git a/widget.cpp b/widget.cpp index ae4475b..0d5aafa 100644 --- a/widget.cpp +++ b/widget.cpp @@ -14,13 +14,14 @@ #include #include - using namespace std; + // 硬编码参数值 int file_delay = 1270; // 延迟时间(毫秒) int file_encoder = 12000; // 编码器值++ int file_valve = 200; // 阀门通道 + Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) @@ -28,13 +29,23 @@ Widget::Widget(QWidget *parent) this->isCamRunning = false; ui->setupUi(this); - ui->camera_0_img->setScaledContents(true); - ui->camera_1_img->setScaledContents(true); + ui->camera_0_img->setScaledContents(false); + ui->camera_1_img->setScaledContents(false); iniColor(); iniLowMac(); iniCamera(); + // 初始化存储工作者和线程 + storageWorker = new StorageWorker(); + storageWorker->moveToThread(&storageThread); + + connect(&storageThread, &QThread::started, storageWorker, &StorageWorker::process); + connect(this, &Widget::destroyed, &storageThread, &QThread::quit); + connect(&storageThread, &QThread::finished, storageWorker, &QObject::deleteLater); + + storageThread.start(); + // 启动显示定时器,每秒检查一次 QTimer* timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &Widget::refreshImage); @@ -43,7 +54,16 @@ Widget::Widget(QWidget *parent) Widget::~Widget() { - // DestoryCamera(); + // 停止存储线程 + g_storageQueue.stop(); + storageThread.quit(); + storageThread.wait(); + + // 现有清理代码... + DestoryCamera(); + DestoryLowMac(); + + delete ui; } @@ -55,8 +75,11 @@ void Widget::refreshImage() // refresh buttons this->ui->btn_start->setEnabled(!this->isCamRunning); this->ui->btn_stop->setEnabled(this->isCamRunning); + // refresh info + this->ui->lab_info->setText(this->isCamRunning? "运行": "停止"); } + void Widget::refreshSingleImage(int camera_id, bool overlay_result) { // 更新当前的图片0 @@ -85,6 +108,7 @@ void Widget::refreshSingleImage(int camera_id, bool overlay_result) QPixmap pixmap0 = ImageUtils::mat2QPixmap(img); if (!pixmap0.isNull()) { + pixmap0 = pixmap0.scaled(ui->camera_0_img->width(), ui->camera_0_img->height()); ui->camera_0_img->setPixmap(pixmap0); } } @@ -113,6 +137,7 @@ void Widget::refreshSingleImage(int camera_id, bool overlay_result) QPixmap pixmap1 = ImageUtils::mat2QPixmap(img); if (!pixmap1.isNull()) { + pixmap1 = pixmap1.scaled(ui->camera_1_img->width(), ui->camera_1_img->height()); ui->camera_1_img->setPixmap(pixmap1); } } @@ -123,7 +148,6 @@ void Widget::refreshSingleImage(int camera_id, bool overlay_result) } - void Widget::on_pushButton_2_clicked() { SaveImg_Flag = 1; diff --git a/widget.h b/widget.h index 774952b..1217106 100644 --- a/widget.h +++ b/widget.h @@ -1,11 +1,12 @@ #ifndef WIDGET_H #define WIDGET_H - +#include #include #include #include #include #include "globals.h" +#include "storageworker.h" QT_BEGIN_NAMESPACE namespace Ui { @@ -41,5 +42,8 @@ private: bool isCamRunning; + QThread storageThread; // 存储线程 + StorageWorker* storageWorker; // 存储工作者 + }; #endif // WIDGET_H diff --git a/widget.ui b/widget.ui index cfb17d8..f29cad0 100644 --- a/widget.ui +++ b/widget.ui @@ -13,611 +13,602 @@ Widget - - - - 0 - 0 - 801 - 601 - - - - 1 - - - - Tab 1 - - - - - 100 - 130 - 201 - 61 - - - - 开始 - - - - - - 400 - 120 - 181 - 71 - - - - 保存图片 - - - - - - 120 - 290 - 121 - 61 - - - - 停止 - - - - - - 410 - 290 - 141 - 61 - - - - 喷阀测试 - - - - - - 160 - 390 - 401 - 131 - - - - 连接状态: - - - - - 40 - 70 - 41 - 16 - - - - 下位机 - - - - - - 90 - 60 - 31 - 31 - - - - - - - - - 237 - 212 - 0 - - - - - - - 237 - 212 - 0 - - - - - - - 237 - 212 - 0 - - - - - - - 246 - 233 - 127 - - - - - - - - - 237 - 212 - 0 - - - - - - - 237 - 212 - 0 - - - - - - - 237 - 212 - 0 - - - - - - - 246 - 233 - 127 - - - - - - - - - 237 - 212 - 0 - - - - - - - 237 - 212 - 0 - - - - - - - 237 - 212 - 0 - - - - - - - 246 - 233 - 127 - - - - - - - - - - - - - - - 590 - 440 - 101 - 41 - - - - 重新连接 - - - - - - Tab 2 - - - - - 20 - 50 - 151 - 81 - - - - - 28 - - - - 准备中 - - - - - - 20 - 130 - 101 - 41 - - - - 开始分选 - - - - - - 20 - 190 - 101 - 41 - - - - 停止分选 - - - - - - 160 - 290 - 591 - 191 - - - - background-color: rgb(129, 129, 129); -border: 4px solid black; - - + + + + 1 - - - - - - - - 160 - 270 - 141 - 16 - - - - 相机1(高侧/气罐侧) - - - - - - 160 - 20 - 141 - 16 - - - - 相机0(低侧/出风口侧) - - - - - - 160 - 50 - 591 - 191 - - - - background-color: rgb(129, 129, 129); + + + Tab 1 + + + + + + GroupBox + + + + + + 保存图片 + + + + + + + 停止 + + + + + + + 喷阀测试 + + + + + + + 开始 + + + + + + + + + + 连接状态: + + + + QLayout::SizeConstraint::SetDefaultConstraint + + + + + 下位机 + + + + + + + + + + + + 237 + 212 + 0 + + + + + + + 237 + 212 + 0 + + + + + + + 237 + 212 + 0 + + + + + + + 246 + 233 + 127 + + + + + + + + + 237 + 212 + 0 + + + + + + + 237 + 212 + 0 + + + + + + + 237 + 212 + 0 + + + + + + + 246 + 233 + 127 + + + + + + + + + 237 + 212 + 0 + + + + + + + 237 + 212 + 0 + + + + + + + 237 + 212 + 0 + + + + + + + 246 + 233 + 127 + + + + + + + + + + + + + + + 重新连接 + + + + + + + + + + + Tab 2 + + + + + + 控制及状态 + + + + 20 + + + 9 + + + 9 + + + 9 + + + + + + 28 + + + + 状态 + + + + + + + + 70 + 70 + + + + 开始分选 + + + + + + + + 70 + 70 + + + + 停止分选 + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + 相机显示 + + + + + + 相机0(低侧/出风口侧) + + + + + + + + 0 + 0 + + + + background-color: rgb(129, 129, 129); border: 4px solid black; - - - 1 - - - - - - - - - Tab 3 - - - - - 0 - 10 - 171 - 41 - - - - - 20 - - - - 参数设置界面 - - - - - - 10 - 60 - 341 - 191 - - - - 下位机参数 - - - - - 40 - 40 - 53 - 15 - - - - 延迟时间 - + + + 1 + + + + + + + + + + 相机1(高侧/气罐侧) + + + + + + + + 0 + 0 + + + + background-color: rgb(129, 129, 129); +border: 4px solid black; + + + 1 + + + + + + + + + + - - - - 40 - 80 - 81 - 16 - - - - 相机分频系数 - + + + Tab 3 + + + + + 0 + 10 + 171 + 41 + + + + + 20 + + + + 参数设置界面 + + + + + + 10 + 60 + 341 + 191 + + + + 下位机参数 + + + + + 40 + 40 + 53 + 15 + + + + 延迟时间 + + + + + + 40 + 80 + 81 + 16 + + + + 相机分频系数 + + + + + + 40 + 120 + 71 + 16 + + + + 喷阀分频系数 + + + + + + 120 + 40 + 81 + 22 + + + + + + + 120 + 80 + 81 + 22 + + + + + + + 120 + 120 + 81 + 22 + + + + + + + 250 + 160 + 61 + 23 + + + + 确定 + + + + + + + 660 + 490 + 75 + 23 + + + + 关机 + + - - - - 40 - 120 - 71 - 16 - - - - 喷阀分频系数 - - - - - - 120 - 40 - 81 - 22 - - - - - - - 120 - 80 - 81 - 22 - - - - - - - 120 - 120 - 81 - 22 - - - - - - - 250 - 160 - 61 - 23 - - - - 确定 - + + + Tab 4 + + + + + 50 + 30 + 91 + 21 + + + + 喷阀测试界面 + + + + + + 110 + 120 + 331 + 91 + + + + 手动喷阀测试 + + + + + 30 + 40 + 31 + 16 + + + + 通道 + + + + + + 60 + 40 + 42 + 22 + + + + + + + 150 + 40 + 75 + 23 + + + + 测试 + + + + + + 240 + 40 + 75 + 23 + + + + 停止测试 + + + + + + + 110 + 270 + 331 + 91 + + + + 自动喷阀测试 + + + + + 60 + 40 + 75 + 23 + + + + 开始测试 + + + + + + 210 + 40 + 75 + 23 + + + + 停止测试 + + + - - - - 660 - 490 - 75 - 23 - - - - 关机 - - - - - - Tab 4 - - - - - 50 - 30 - 91 - 21 - - - - 喷阀测试界面 - - - - - - 110 - 120 - 331 - 91 - - - - 手动喷阀测试 - - - - - 30 - 40 - 31 - 16 - - - - 通道 - - - - - - 60 - 40 - 42 - 22 - - - - - - - 150 - 40 - 75 - 23 - - - - 测试 - - - - - - 240 - 40 - 75 - 23 - - - - 停止测试 - - - - - - - 110 - 270 - 331 - 91 - - - - 自动喷阀测试 - - - - - 60 - 40 - 75 - 23 - - - - 开始测试 - - - - - - 210 - 40 - 75 - 23 - - - - 停止测试 - - - - - + +