Qt编写可视化大屏电子看板系统25-模块3设备监控
一、前言
設(shè)備監(jiān)控主要用來實(shí)時(shí)監(jiān)測(cè)制造零件等使用的設(shè)備的工作運(yùn)行狀態(tài),每個(gè)設(shè)備都有對(duì)應(yīng)的需要、分組名稱、分組編號(hào)、設(shè)備名稱、文字1、文字2、工作狀態(tài)(1-開機(jī) 2-待機(jī) 3-維護(hù) 4-空),不同的工作狀態(tài)不同顏色顯示,比如維護(hù)狀態(tài)紅色顯示,待機(jī)狀態(tài)黃色顯示。右側(cè)顯示對(duì)應(yīng)設(shè)備分組的稼動(dòng)率、開機(jī)數(shù)量、待機(jī)數(shù)量、維護(hù)數(shù)量。
Qt源自c++,類的思想非常強(qiáng)大,比如這個(gè)設(shè)備監(jiān)控模塊,每個(gè)設(shè)備需要顯示設(shè)備名稱、多種文字等,還有不同狀態(tài)不用背景顏色,這就需要單獨(dú)寫個(gè)設(shè)備類,記錄存儲(chǔ)這些值,并根據(jù)設(shè)定的值做出反應(yīng),最后有多少個(gè)設(shè)備就new多少個(gè)這個(gè)類,放入面板中。
子模塊表名對(duì)應(yīng)表:
| 設(shè)備運(yùn)行狀態(tài) | t_3_1_device_runtime |
| 稼動(dòng)率 | t_3_2_oee |
1 設(shè)備運(yùn)行狀態(tài)
表名:t_3_1_device_runtime
| internal_id | 序號(hào) | INTEGER | 11 | 主鍵自增 |
| group_name | 分組名稱 | VARCHAR | 4 | 不為空 |
| no_id | 分組編號(hào) | INTEGER | 11 | 不為空 |
| name | 名稱 | VARCHAR | 255 | 不為空 |
| text_1 | 文字1 | VARCHAR | 255 | |
| text_2 | 文字2 | VARCHAR | 255 | |
| status | 狀態(tài) 1-開機(jī) 2-待機(jī) 3-維護(hù) 4-空 | INTEGER | 1 | 不為空 |
默認(rèn)數(shù)據(jù):
| 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 稼動(dòng)率
表名:t_3_2_oee
| internal_id | 序號(hào) | INTEGER | 11 | 主鍵自增 |
| cnc | 類別-cnc | INTEGER | 3 | 不為空 |
| edm | 類別-edm | INTEGER | 3 | 不為空 |
| wedm | 類別-wedm | INTEGER | 3 | 不為空 |
默認(rèn)數(shù)據(jù):1 110 90 90
二、功能特點(diǎn)
三、體驗(yàn)地址
四、效果圖
五、核心代碼
#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() {//設(shè)置對(duì)應(yīng)的屬性應(yīng)用特定樣式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");//定時(shí)器模擬數(shù)據(jù)timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(loadDevice()));//綁定信號(hào)槽處理接收的數(shù)據(jù)+發(fā)送執(zhí)查詢語句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)));//綁定樣式改變信號(hào)重新設(shè)置顏色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() {//延時(shí)處理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("稼 動(dòng) 率: %1%").arg(value1));ui->labedm1->setText(QString("稼 動(dòng) 率: %1%").arg(value2));ui->labwedm1->setText(QString("稼 動(dòng) 率: %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;}//自動(dòng)統(tǒng)計(jì)開機(jī)待機(jī)維護(hù)數(shù)量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("開機(jī)數(shù)量: %1").arg(count1));ui->labcnc3->setText(QString("待機(jī)數(shù)量: %1").arg(count2));ui->labcnc4->setText(QString("維護(hù)數(shù)量: %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;}//自動(dòng)統(tǒng)計(jì)開機(jī)待機(jī)維護(hù)數(shù)量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("開機(jī)數(shù)量: %1").arg(count1));ui->labedm3->setText(QString("待機(jī)數(shù)量: %1").arg(count2));ui->labedm4->setText(QString("維護(hù)數(shù)量: %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;}//自動(dòng)統(tǒng)計(jì)開機(jī)待機(jī)維護(hù)數(shù)量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("開機(jī)數(shù)量: %1").arg(count1));ui->labwedm3->setText(QString("待機(jī)數(shù)量: %1").arg(count2));ui->labwedm4->setText(QString("維護(hù)數(shù)量: %1").arg(count3)); }void frmModule3::start(int interval) {this->loadDevice();//如果間隔太短表示不需要刷新,執(zhí)行一次即可if (interval > 2000) {timer->start(interval);} }void frmModule3::stop() {if (timer->isActive()) {timer->stop();} }總結(jié)
以上是生活随笔為你收集整理的Qt编写可视化大屏电子看板系统25-模块3设备监控的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS 7配置Hadoop3.X环
- 下一篇: 需求获取方法,系统分析师