国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊(cè)
搜索

基于QT的電力參數(shù)采集系統(tǒng) 課程設(shè)計(jì)文檔和C++源碼

[復(fù)制鏈接]
樓主
Jonsa 發(fā)表于 2022-5-31 01:30:35 | 只看該作者 |只看大圖 |倒序?yàn)g覽 |閱讀模式
完整文檔下載: 基于QT的電力參數(shù)采集系統(tǒng).doc (2.32 MB, 售價(jià): 5 E幣)
采集客戶端C++源碼: electricty.zip (6.75 KB)
文檔預(yù)覽截圖:
基于QT的電力參數(shù)采集系統(tǒng) 課程設(shè)計(jì)文檔和C++源碼 1.jpg
目錄
1. 設(shè)計(jì)的任務(wù)與要求        1
1.1. 課程設(shè)計(jì)的任務(wù)        1
1.2. 課程設(shè)計(jì)的要求        1
2. 設(shè)計(jì)方案制定        2
2.1. 設(shè)計(jì)的原理        2
2.2. 設(shè)計(jì)的方案        5
3. 設(shè)計(jì)方案實(shí)施        6
3.1. 開發(fā)環(huán)境        6
3.2. 主要模擬平臺(tái)        6
3.3. 設(shè)計(jì)功能的實(shí)施        8
4. 系統(tǒng)測(cè)試與數(shù)據(jù)分析        11
4.1. 系統(tǒng)測(cè)試        11
4.2. 數(shù)據(jù)分析        13
5. 總結(jié)及心得體會(huì)        14
6. 參考文獻(xiàn)        15

1.        設(shè)計(jì)的任務(wù)與要求
1.1.        課程設(shè)計(jì)的任務(wù)
在科技飛速發(fā)展與智能用電系統(tǒng)的普及的大背景下,高性能高要求的電力參數(shù)系統(tǒng)的相關(guān)研究也備受關(guān)注。計(jì)算機(jī)技術(shù)與無線傳輸技術(shù)的發(fā)展,為由普通功能型電力參數(shù)向多功能,高精度,高可靠,可移植,無線抄表的電力參數(shù)監(jiān)測(cè)系統(tǒng)的發(fā)展提供了充足的技術(shù)支持。電力參數(shù)采集技術(shù)不斷發(fā)展,朝著越來越智能,成本越來越低的方向發(fā)展。
本次實(shí)訓(xùn)項(xiàng)目,采用QT設(shè)計(jì)一個(gè)電力參數(shù)采集和控制系統(tǒng)。通過這次學(xué)習(xí),專業(yè)技能和實(shí)驗(yàn)技能,調(diào)試代碼能力得到有效鍛煉,不論對(duì)于知識(shí)系統(tǒng)的鞏固還是對(duì)以后走到未來崗位上都是起到很好的幫助作用。
此方案由資深講師向高校學(xué)生展示完整嵌入式項(xiàng)目設(shè)計(jì)開發(fā)流程及方法,以及嵌入式核心技術(shù)運(yùn)用等滿足企業(yè)真實(shí)崗位需求的實(shí)用內(nèi)容,幫助學(xué)生快速熟悉嵌入式項(xiàng)目開發(fā)的代碼編寫規(guī)范,并在行業(yè)專家的引導(dǎo)下,體驗(yàn)一個(gè)全真案例的模擬過程。
同時(shí)通過更多行業(yè)典型應(yīng)用的示范分析幫助學(xué)生更貼近企業(yè)的真實(shí)需求和行業(yè)的發(fā)展,為進(jìn)一步在嵌入式研發(fā)行業(yè)中發(fā)展打下堅(jiān)實(shí)基礎(chǔ)。
1.2.        課程設(shè)計(jì)的要求
(1)        使用Peacefail電力參數(shù)模塊(實(shí)訓(xùn)將采用軟件模擬的方式來實(shí)現(xiàn),不需要準(zhǔn)備硬件)。
(2)        測(cè)量電路電壓,頻率,功率,電能等參數(shù)。
(3)        發(fā)送至使用由C++的QT creator編制的上位機(jī)程序進(jìn)行數(shù)據(jù)的顯示。

2.        設(shè)計(jì)方案制定
2.1.        設(shè)計(jì)的原理
該項(xiàng)目使用的Modbus協(xié)議最初由施耐德公司為其PLC制定的一種通訊協(xié)議。在本項(xiàng)目中,下位機(jī)采用軟件模擬的方式來代替Peacefail電力參數(shù)模塊來實(shí)現(xiàn)采集交流電路中的電力參數(shù), 如電壓, 電流, 功率等, 并發(fā)送至使用由C++的QT creator編制的上位機(jī)程序進(jìn)行數(shù)據(jù)的顯示。
完整內(nèi)容請(qǐng)下載完整文檔附件參閱

基于QT的電力參數(shù)采集系統(tǒng) 課程設(shè)計(jì)文檔和C++源碼 2.jpg

部分源碼:完整源碼請(qǐng)下載附件
  1. void MainWindow::on_btnOpenSerial_clicked()
  2. {
  3.     QPushButton* btn = findChild<QPushButton*>("btnOpenSerial", Qt::FindChildOption::FindChildrenRecursively);
  4.     if(btn->text() == "打開串口"){//打開
  5.         if(m_serialPort->isOpen())//如果串口已經(jīng)打開了 先給他關(guān)閉了
  6.         {
  7.             m_serialPort->clear();
  8.             m_serialPort->close();
  9.         }

  10.         //設(shè)置串口名字 假設(shè)我們上面已經(jīng)成功獲取到了 并且使用第一個(gè)
  11.         QComboBox* serialCbo = findChild<QComboBox*>("cboSerial", Qt::FindChildOption::FindChildrenRecursively);
  12.         m_serialPort->setPortName(serialCbo->currentText());

  13.         QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
  14.         if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式嘗試打開串口
  15.         {
  16.             serialState->setText(serialCbo->currentText() + "打開失敗!");
  17.             return;
  18.         }
  19.         //打開成功
  20.         serialState->setText(serialCbo->currentText() + "打開成功!");

  21.         m_serialPort->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//設(shè)置波特率和讀寫方向
  22.         m_serialPort->setDataBits(QSerialPort::Data8);        //數(shù)據(jù)位為8位
  23.         m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//無流控制
  24.         m_serialPort->setParity(QSerialPort::NoParity);    //無校驗(yàn)位
  25.         m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位

  26.         //連接信號(hào)槽 當(dāng)下位機(jī)發(fā)送數(shù)據(jù)QSerialPortInfo 會(huì)發(fā)送個(gè) readyRead 信號(hào),我們定義個(gè)槽void receiveInfo()解析數(shù)據(jù)
  27.         connect(m_serialPort,SIGNAL(readyRead()),this, SLOT(receiveInfo()));
  28.         connect(m_timer,SIGNAL(timeout()),this, SLOT(timeUpdate()));
  29.         btn->setText("關(guān)閉串口");
  30.     }else {//關(guān)閉
  31.         QComboBox* serialCbo = findChild<QComboBox*>("cboSerial", Qt::FindChildOption::FindChildrenRecursively);
  32.         QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
  33.         if (m_serialPort->isOpen())
  34.         {
  35.             m_serialPort->close();
  36.             serialState->setText(serialCbo->currentText() + "關(guān)閉成功!");
  37.             btn->setText("打開串口");
  38.             return;
  39.         }
  40.         serialState->setText(serialCbo->currentText() + "不能重復(fù)關(guān)閉!");
  41.     }
  42. }

  43. float power;
  44. int i = 1;

  45. QByteArray buf;

  46. void MainWindow::receiveInfo()
  47. {
  48.     m_timer->start(100);
  49.     buf.append(m_serialPort->readAll());
  50. }

  51. void MainWindow::timeUpdate(){
  52.     m_timer->stop();
  53.     if(buf.length() > 0){
  54.         qDebug() << "receive..." << buf.length();
  55.         //上述方法不是每次都返回21,每次可能不能完全讀完,分幾次讀取,或一次讀完的都有
  56.         if(buf.length() != 25){//只對(duì)正確的情況做處理,其余數(shù)據(jù)不全的忽略
  57.             return;
  58.         }

  59.         //buf[17] 返回類型為 QByteRef 類型,并非char,不能用它
  60.         //而應(yīng)該用at()

  61.         //取電壓
  62.         qDebug("volt %02x-%02x", buf.at(3), buf.at(4));
  63.         float volt = ((unsigned char)buf.at(3) << 8) + (unsigned char)buf.at(4);
  64.         qDebug() << volt;
  65.         volt *= 0.1;
  66.         QString data = QString("電壓:%1 V").arg(volt);
  67.         QLabel* lblVolt = findChild<QLabel*>("lblVolt", Qt::FindChildOption::FindChildrenRecursively);
  68.         lblVolt->setText(data);

  69.         //取電流
  70.         float circuit = (buf.at(5) << 8) + buf.at(6);
  71.         circuit += ((buf.at(7) << 8) + buf.at(8)) << 16;

  72.         data = QString("電流:%1 mA").arg(circuit);
  73.         QLabel* lblCircut = findChild<QLabel*>("lblCircut", Qt::FindChildOption::FindChildrenRecursively);
  74.         lblCircut->setText(data);

  75.         //取功率
  76.         power = (buf.at(9) << 8) + buf.at(10);
  77.         power += ((buf.at(11) << 8) + buf.at(12)) << 16;
  78.         power *= 0.1;

  79.         data = QString("功率:%1 W").arg(power);
  80.         QLabel* lblPower = findChild<QLabel*>("lblPower", Qt::FindChildOption::FindChildrenRecursively);
  81.         lblPower->setText(data);

  82.         //取頻率
  83.         qDebug("%02x-%02x", buf.at(17), buf.at(18));
  84.         float freq = ((unsigned char)buf.at(17) << 8) + (unsigned char)buf.at(18);

  85.         freq *= 0.1;
  86.         data = QString("頻率:%1 Hz").arg(freq);
  87.         QLabel* lblFreq = findChild<QLabel*>("lblFreq", Qt::FindChildOption::FindChildrenRecursively);
  88.         lblFreq->setText(data);

  89.         QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
  90.         QString statebuf = QString("正在采集 %1 次").arg(i);
  91.         serialState->setText(statebuf);

  92.         //update 圖形
  93.         //PaintFrame* frame = findChild<PaintFrame*>("frame", Qt::FindChildOption::FindChildrenRecursively);
  94.         //frame->update(i, 140-(int)power, i, 140);
  95.     }
  96.     buf.clear();
  97. }
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

手機(jī)版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 01:07

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復(fù) 返回頂部 返回列表