Qt编写可视化大屏电子看板系统25-模块3设备监控
生活随笔
收集整理的這篇文章主要介紹了
Qt编写可视化大屏电子看板系统25-模块3设备监控
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、前言
設備監控主要用來實時監測制造零件等使用的設備的工作運行狀態,每個設備都有對應的需要、分組名稱、分組編號、設備名稱、文字1、文字2、工作狀態(1-開機 2-待機 3-維護 4-空),不同的工作狀態不同顏色顯示,比如維護狀態紅色顯示,待機狀態黃色顯示。右側顯示對應設備分組的稼動率、開機數量、待機數量、維護數量。
Qt源自c++,類的思想非常強大,比如這個設備監控模塊,每個設備需要顯示設備名稱、多種文字等,還有不同狀態不用背景顏色,這就需要單獨寫個設備類,記錄存儲這些值,并根據設定的值做出反應,最后有多少個設備就new多少個這個類,放入面板中。
子模塊表名對應表:
| 設備運行狀態 | t_3_1_device_runtime |
| 稼動率 | t_3_2_oee |
1 設備運行狀態
表名:t_3_1_device_runtime
| internal_id | 序號 | INTEGER | 11 | 主鍵自增 |
| group_name | 分組名稱 | VARCHAR | 4 | 不為空 |
| no_id | 分組編號 | INTEGER | 11 | 不為空 |
| name | 名稱 | VARCHAR | 255 | 不為空 |
| text_1 | 文字1 | VARCHAR | 255 | |
| text_2 | 文字2 | VARCHAR | 255 | |
| status | 狀態 1-開機 2-待機 3-維護 4-空 | INTEGER | 1 | 不為空 |
默認數據:
| 1 | CNC | 1 | CNC1 | 190411 | PID11 | 1 |
| 2 | CNC | 2 | CNC2 | 190412 | PID12 | 1 |
| 3 | CNC | 3 | CNC3 | 190413 | PID13 | 1 |
| 4 | CNC | 4 | CNC4 | 190414 | PID14 | 2 |
| 5 | CNC | 5 | CNC5 | 190415 | PID15 | 1 |
| 6 | CNC | 6 | CNC6 | 190416 | PID16 | 2 |
| 7 | CNC | 7 | CNC7 | 190417 | PID17 | 1 |
| 8 | CNC | 8 | 4 | |||
| 9 | EDM | 1 | EDM1 | 190421 | PID21 | 1 |
| 10 | EDM | 2 | EDM2 | 190422 | PID23 | 2 |
| 11 | EDM | 3 | EDM3 | 190423 | PID23 | 1 |
| 12 | EDM | 4 | EDM4 | 190424 | PID24 | 3 |
| 13 | EDM | 5 | EDM5 | 190425 | PID25 | 1 |
| 14 | EDM | 6 | EDM6 | 190426 | PID26 | 1 |
| 15 | EDM | 7 | EDM7 | 190427 | PID27 | 1 |
| 16 | EDM | 8 | EDM8 | 190428 | PID28 | 2 |
| 17 | WEDM | 1 | WEDM1 | 190431 | PID28 | 1 |
| 18 | WEDM | 2 | WEDM2 | 190432 | PID28 | 3 |
| 19 | WEDM | 3 | WEDM3 | 190434 | PID29 | 2 |
| 20 | WEDM | 4 | WEDM4 | 190435 | PID30 | 1 |
| 21 | WEDM | 5 | WEDM5 | 190436 | PID36 | 1 |
| 22 | WEDM | 6 | WEDM6 | 190437 | PID37 | 3 |
| 23 | WEDM | 7 | 4 | |||
| 24 | WEDM | 8 | 4 |
2 稼動率
表名:t_3_2_oee
| internal_id | 序號 | INTEGER | 11 | 主鍵自增 |
| cnc | 類別-cnc | INTEGER | 3 | 不為空 |
| edm | 類別-edm | INTEGER | 3 | 不為空 |
| wedm | 類別-wedm | INTEGER | 3 | 不為空 |
默認數據:1 110 90 90
二、功能特點
三、體驗地址
四、效果圖
五、核心代碼
#include "frmmodule3.h" #include "ui_frmmodule3.h" #include "quihelper.h" #include "appinit.h"frmModule3::frmModule3(QWidget *parent) : QWidget(parent), ui(new Ui::frmModule3) {ui->setupUi(this);this->initForm();this->initDevice();this->loadDevice(); }frmModule3::~frmModule3() {delete ui; }void frmModule3::initForm() {//設置對應的屬性應用特定樣式ui->labTitle1->setProperty("flag", "title");ui->labTitle2->setProperty("flag", "title");ui->labTitle3->setProperty("flag", "title");ui->labTitle4->setProperty("flag", "title");ui->labTitle5->setProperty("flag", "title");ui->labTitle6->setProperty("flag", "title");ui->widgetSub1->setProperty("flag", "sub");ui->widgetSub2->setProperty("flag", "sub");ui->widgetSub3->setProperty("flag", "sub");ui->widgetSub4->setProperty("flag", "sub");ui->widgetResult1->setProperty("flag", "lab");ui->widgetResult2->setProperty("flag", "lab");ui->widgetResult3->setProperty("flag", "lab");//定時器模擬數據timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(loadDevice()));//綁定信號槽處理接收的數據+發送執查詢語句connect(DbData::DbLocal, SIGNAL(receiveData(QString, QStringList, int)),this, SLOT(receiveData(QString, QStringList, int)));connect(DbData::DbHttp, SIGNAL(receiveData(QString, QStringList, int)),this, SLOT(receiveData(QString, QStringList, int)));//綁定樣式改變信號重新設置顏色connect(AppEvent::Instance(), SIGNAL(changeStyle()), this, SLOT(changeStyle())); }void frmModule3::initStatus() {foreach (frmDevice *frm, device1) {frm->setStatus(frm->getStatus());}foreach (frmDevice *frm, device2) {frm->setStatus(frm->getStatus());}foreach (frmDevice *frm, device3) {frm->setStatus(frm->getStatus());} }void frmModule3::changeStyle() {//延時處理QTimer::singleShot(100, this, SLOT(initStatus())); }void frmModule3::receiveData(const QString &tag, const QStringList &data, int mesc) {int count = data.count();if (tag == "t_3_1_device_runtime") {if (count == 24 * 6) {QList<int> status1, status2, status3;QStringList taskID1, personID1, deviceID1;QStringList taskID2, personID2, deviceID2;QStringList taskID3, personID3, deviceID3;int max1 = 8 * 6, max2 = 16 * 6, max3 = 24 * 6;for (int i = 0; i < max1; i = i + 6) {deviceID1 << data.at(i + 2);taskID1 << data.at(i + 3);personID1 << data.at(i + 4);status1 << data.at(i + 5).toInt();}for (int i = max1; i < max2; i = i + 6) {deviceID2 << data.at(i + 2);taskID2 << data.at(i + 3);personID2 << data.at(i + 4);status2 << data.at(i + 5).toInt();}for (int i = max2; i < max3; i = i + 6) {deviceID3 << data.at(i + 2);taskID3 << data.at(i + 3);personID3 << data.at(i + 4);status3 << data.at(i + 5).toInt();}loadDevice1(taskID1, personID1, deviceID1, status1);loadDevice2(taskID2, personID2, deviceID2, status2);loadDevice3(taskID3, personID3, deviceID3, status3);}} else if (tag == "t_3_2_oee") {if (count == 3) {int value1 = data.at(0).toDouble();int value2 = data.at(1).toDouble();int value3 = data.at(2).toDouble();loadResult(value1, value2, value3);}} }void frmModule3::loadResult(int value1, int value2, int value3) {ui->labcnc1->setText(QString("稼 動 率: %1%").arg(value1));ui->labedm1->setText(QString("稼 動 率: %1%").arg(value2));ui->labwedm1->setText(QString("稼 動 率: %1%").arg(value3)); }void frmModule3::initDevice() {device1 << ui->devicecnc1 << ui->devicecnc2 << ui->devicecnc3 << ui->devicecnc4;device1 << ui->devicecnc5 << ui->devicecnc6 << ui->devicecnc7 << ui->devicecnc8;device2 << ui->deviceedm1 << ui->deviceedm2 << ui->deviceedm3 << ui->deviceedm4;device2 << ui->deviceedm5 << ui->deviceedm6 << ui->deviceedm7 << ui->deviceedm8;device3 << ui->devicewedm1 << ui->devicewedm2 << ui->devicewedm3 << ui->devicewedm4;device3 << ui->devicewedm5 << ui->devicewedm6 << ui->devicewedm7 << ui->devicewedm8;foreach (frmDevice *frm, device1) {frm->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);}foreach (frmDevice *frm, device2) {frm->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);}foreach (frmDevice *frm, device3) {frm->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);} }void frmModule3::loadDevice() {QString tableName = "t_3_1_device_runtime";QString columnName = "group_name,no_id,name,text_1,text_2,status";QString tableName2 = "t_3_2_oee";QString columnName2 = "cnc,edm,wedm";if (AppConfig::WorkMode == "timer") {QList<int> status1, status2, status3;QStringList taskID1, personID1, deviceID1;QStringList taskID2, personID2, deviceID2;QStringList taskID3, personID3, deviceID3;for (int i = 0; i < 8; i++) {taskID1 << QString("TID1%1").arg(i + 1);personID1 << QString("PID1%1").arg(i + 1);deviceID1 << QString("CNC%1").arg(i + 1);status1 << QUIHelper::getRandValue(1, 5);taskID2 << QString("TID2%1").arg(i + 1);personID2 << QString("PID2%1").arg(i + 1);deviceID2 << QString("EDM%1").arg(i + 1);status2 << QUIHelper::getRandValue(1, 5);taskID3 << QString("TID3%1").arg(i + 1);personID3 << QString("PID3%1").arg(i + 1);deviceID3 << QString("WEDM%1").arg(i + 1);status3 << QUIHelper::getRandValue(1, 5);}loadDevice1(taskID1, personID1, deviceID1, status1);loadDevice2(taskID2, personID2, deviceID2, status2);loadDevice3(taskID3, personID3, deviceID3, status3);loadResult(85, 90, 95);} else if (AppConfig::WorkMode == "db") { DbData::DbLocal->select(tableName, columnName, true);DbData::DbLocal->select(tableName2, columnName2, true);} else if (AppConfig::WorkMode == "http") { DbData::DbHttp->select(tableName, columnName, true);DbData::DbHttp->select(tableName2, columnName2, true);} }void frmModule3::loadDevice1(const QStringList &taskID, const QStringList &personID,const QStringList &deviceID, const QList<int> &status) {if (taskID.count() != 8 || personID.count() != 8 || deviceID.count() != 8 || status.count() != 8) {return;}//自動統計開機待機維護數量int count1 = 0, count2 = 0, count3 = 0;for (int i = 0; i < 8; i++) {device1.at(i)->setTaskID(taskID.at(i));device1.at(i)->setPersonID(personID.at(i));device1.at(i)->setDeviceID(deviceID.at(i));device1.at(i)->setStatus(status.at(i));switch (status.at(i)) {case 1:count1++;break;case 2:count2++;break;case 3:count3++;break;}}ui->labcnc2->setText(QString("開機數量: %1").arg(count1));ui->labcnc3->setText(QString("待機數量: %1").arg(count2));ui->labcnc4->setText(QString("維護數量: %1").arg(count3)); }void frmModule3::loadDevice2(const QStringList &taskID, const QStringList &personID,const QStringList &deviceID, const QList<int> &status) {if (taskID.count() != 8 || personID.count() != 8 || deviceID.count() != 8 || status.count() != 8) {return;}//自動統計開機待機維護數量int count1 = 0, count2 = 0, count3 = 0;for (int i = 0; i < 8; i++) {device2.at(i)->setTaskID(taskID.at(i));device2.at(i)->setPersonID(personID.at(i));device2.at(i)->setDeviceID(deviceID.at(i));device2.at(i)->setStatus(status.at(i));switch (status.at(i)) {case 1:count1++;break;case 2:count2++;break;case 3:count3++;break;}}ui->labedm2->setText(QString("開機數量: %1").arg(count1));ui->labedm3->setText(QString("待機數量: %1").arg(count2));ui->labedm4->setText(QString("維護數量: %1").arg(count3)); }void frmModule3::loadDevice3(const QStringList &taskID, const QStringList &personID,const QStringList &deviceID, const QList<int> &status) {if (taskID.count() != 8 || personID.count() != 8 || deviceID.count() != 8 || status.count() != 8) {return;}//自動統計開機待機維護數量int count1 = 0, count2 = 0, count3 = 0;for (int i = 0; i < 8; i++) {device3.at(i)->setTaskID(taskID.at(i));device3.at(i)->setPersonID(personID.at(i));device3.at(i)->setDeviceID(deviceID.at(i));device3.at(i)->setStatus(status.at(i));switch (status.at(i)) {case 1:count1++;break;case 2:count2++;break;case 3:count3++;break;}}ui->labwedm2->setText(QString("開機數量: %1").arg(count1));ui->labwedm3->setText(QString("待機數量: %1").arg(count2));ui->labwedm4->setText(QString("維護數量: %1").arg(count3)); }void frmModule3::start(int interval) {this->loadDevice();//如果間隔太短表示不需要刷新,執行一次即可if (interval > 2000) {timer->start(interval);} }void frmModule3::stop() {if (timer->isActive()) {timer->stop();} }總結
以上是生活随笔為你收集整理的Qt编写可视化大屏电子看板系统25-模块3设备监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS 7配置Hadoop3.X环
- 下一篇: 需求获取方法,系统分析师