完整文檔下載:
基于QT的電力參數(shù)采集系統(tǒng).doc
(2.32 MB, 售價(jià): 5 E幣)
2022-5-31 01:16 上傳
點(diǎn)擊文件名下載附件
售價(jià): 5 E幣 [記錄]
[ 購買]
采集客戶端C++源碼:
electricty.zip
(6.75 KB)
2022-5-31 01:23 上傳
點(diǎn)擊文件名下載附件
文檔預(yù)覽截圖:
1.jpg (123.6 KB)
下載附件
2022-5-31 01:16 上傳
目錄
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)下載完整文檔附件參閱。
2.jpg (22.98 KB)
下載附件
2022-5-31 01:28 上傳
部分源碼:完整源碼請(qǐng)下載附件
- void MainWindow::on_btnOpenSerial_clicked()
- {
- QPushButton* btn = findChild<QPushButton*>("btnOpenSerial", Qt::FindChildOption::FindChildrenRecursively);
- if(btn->text() == "打開串口"){//打開
- if(m_serialPort->isOpen())//如果串口已經(jīng)打開了 先給他關(guān)閉了
- {
- m_serialPort->clear();
- m_serialPort->close();
- }
- //設(shè)置串口名字 假設(shè)我們上面已經(jīng)成功獲取到了 并且使用第一個(gè)
- QComboBox* serialCbo = findChild<QComboBox*>("cboSerial", Qt::FindChildOption::FindChildrenRecursively);
- m_serialPort->setPortName(serialCbo->currentText());
- QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
- if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式嘗試打開串口
- {
- serialState->setText(serialCbo->currentText() + "打開失敗!");
- return;
- }
- //打開成功
- serialState->setText(serialCbo->currentText() + "打開成功!");
- m_serialPort->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//設(shè)置波特率和讀寫方向
- m_serialPort->setDataBits(QSerialPort::Data8); //數(shù)據(jù)位為8位
- m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//無流控制
- m_serialPort->setParity(QSerialPort::NoParity); //無校驗(yàn)位
- m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位
- //連接信號(hào)槽 當(dāng)下位機(jī)發(fā)送數(shù)據(jù)QSerialPortInfo 會(huì)發(fā)送個(gè) readyRead 信號(hào),我們定義個(gè)槽void receiveInfo()解析數(shù)據(jù)
- connect(m_serialPort,SIGNAL(readyRead()),this, SLOT(receiveInfo()));
- connect(m_timer,SIGNAL(timeout()),this, SLOT(timeUpdate()));
- btn->setText("關(guān)閉串口");
- }else {//關(guān)閉
- QComboBox* serialCbo = findChild<QComboBox*>("cboSerial", Qt::FindChildOption::FindChildrenRecursively);
- QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
- if (m_serialPort->isOpen())
- {
- m_serialPort->close();
- serialState->setText(serialCbo->currentText() + "關(guān)閉成功!");
- btn->setText("打開串口");
- return;
- }
- serialState->setText(serialCbo->currentText() + "不能重復(fù)關(guān)閉!");
- }
- }
- float power;
- int i = 1;
- QByteArray buf;
- void MainWindow::receiveInfo()
- {
- m_timer->start(100);
- buf.append(m_serialPort->readAll());
- }
- void MainWindow::timeUpdate(){
- m_timer->stop();
- if(buf.length() > 0){
- qDebug() << "receive..." << buf.length();
- //上述方法不是每次都返回21,每次可能不能完全讀完,分幾次讀取,或一次讀完的都有
- if(buf.length() != 25){//只對(duì)正確的情況做處理,其余數(shù)據(jù)不全的忽略
- return;
- }
- //buf[17] 返回類型為 QByteRef 類型,并非char,不能用它
- //而應(yīng)該用at()
- //取電壓
- qDebug("volt %02x-%02x", buf.at(3), buf.at(4));
- float volt = ((unsigned char)buf.at(3) << 8) + (unsigned char)buf.at(4);
- qDebug() << volt;
- volt *= 0.1;
- QString data = QString("電壓:%1 V").arg(volt);
- QLabel* lblVolt = findChild<QLabel*>("lblVolt", Qt::FindChildOption::FindChildrenRecursively);
- lblVolt->setText(data);
- //取電流
- float circuit = (buf.at(5) << 8) + buf.at(6);
- circuit += ((buf.at(7) << 8) + buf.at(8)) << 16;
- data = QString("電流:%1 mA").arg(circuit);
- QLabel* lblCircut = findChild<QLabel*>("lblCircut", Qt::FindChildOption::FindChildrenRecursively);
- lblCircut->setText(data);
- //取功率
- power = (buf.at(9) << 8) + buf.at(10);
- power += ((buf.at(11) << 8) + buf.at(12)) << 16;
- power *= 0.1;
- data = QString("功率:%1 W").arg(power);
- QLabel* lblPower = findChild<QLabel*>("lblPower", Qt::FindChildOption::FindChildrenRecursively);
- lblPower->setText(data);
- //取頻率
- qDebug("%02x-%02x", buf.at(17), buf.at(18));
- float freq = ((unsigned char)buf.at(17) << 8) + (unsigned char)buf.at(18);
- freq *= 0.1;
- data = QString("頻率:%1 Hz").arg(freq);
- QLabel* lblFreq = findChild<QLabel*>("lblFreq", Qt::FindChildOption::FindChildrenRecursively);
- lblFreq->setText(data);
- QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
- QString statebuf = QString("正在采集 %1 次").arg(i);
- serialState->setText(statebuf);
- //update 圖形
- //PaintFrame* frame = findChild<PaintFrame*>("frame", Qt::FindChildOption::FindChildrenRecursively);
- //frame->update(i, 140-(int)power, i, 140);
- }
- buf.clear();
- }
復(fù)制代碼
【必讀】版權(quán)免責(zé)聲明
1、本主題所有言論和內(nèi)容純屬會(huì)員個(gè)人意見,與本論壇立場(chǎng)無關(guān)。2、本站對(duì)所發(fā)內(nèi)容真實(shí)性、客觀性、可用性不做任何保證也不負(fù)任何責(zé)任,網(wǎng)友之間僅出于學(xué)習(xí)目的進(jìn)行交流。3、對(duì)提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請(qǐng)勿將該數(shù)字內(nèi)容進(jìn)行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學(xué)習(xí)所提供,使用后發(fā)生的一切問題與本站無關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準(zhǔn)確性、安全性和完整性;同時(shí)本網(wǎng)站也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來,僅供學(xué)習(xí)用途使用,請(qǐng)務(wù)必下載后兩小時(shí)內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請(qǐng)及時(shí)聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|
|