999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Qt5開發的面向工業控制的顯控軟件

2020-09-27 23:02:21曹策賀廣健付云博姜良旭
電腦知識與技術 2020年23期
關鍵詞:自動化

曹策 賀廣健 付云博 姜良旭

摘要:本文介紹了如何使用Qt5在x86計算機上開發面向工業控制的顯控軟件。本文在Qt Creater中利用C++語言進行了計算機串口通信與網口通信的開發,并利用Qt Creater內部集成的Qt Designer進行了人機交互界面的設計。本文開發的計算機軟件,通過串口與STM32微控制器完成通信,并基于自擬的通信協議利用人機交互界面對電磁閥、步進電機、舵機等常用的工業控制模塊進行控制;通過網口與UNIVERSAL ROBOTS協作型機器人完成通信,并基于TCP/IP通信協議對機器人發送控制指令,控制機器人的位置與姿態;通過網口與PLC完成通信,基于標準的Modbus TCP協議完成對PLC一個工作循環的啟停控制。通過本文中顯控軟件開發的過程可以看出,使用Qt5可以方便地在x86計算機上開發面向工業控制的顯控軟件。另外,開發者還可以自擬通信協議,進行功能更加復雜的串口、網口通信。

關鍵詞:Qt5;C++;顯控軟件;工業控制;自動化

中圖分類號:? TP311.1? ? ? ? ? ?文獻標識碼:A

文章編號:1009-3044(2020)23-0016-04

Abstract: The paper describes how to use Qt5 to develop display and control software for industrial control on x86 computers. The paper uses C ++ language in Qt Creater to develop computer serial communication and network communication, and uses Qt Designer which is integrated in Qt Creater to design the user interface. Based on a self-made communication protocol, the software developed in this paper communicates with the STM32 microcontroller through a serial port, and controls common industrial control modules such as solenoid valves, step motors, and servos through the user interface. The software communicates with UNIVERSAL ROBOTS collaborative robot through network port, and sends control commands to the robot based on the TCP / IP communication protocol to control the robot's position and posture. The software communicates with a PLC through network port, and controls the PLC to start and stop based on the Modbus TCP protocol. Through the development process of display and control software in the paper, it can be seen that using Qt5 can easily develop display and control software for industrial control on x86 computers. In addition, developers can also compose their own communication protocols to realize more complex functions through serial and network ports.

Key words: Qt5; C++; display and control software; industrial control; automation

當前我國制造業正快速發展,智能制造[1,2]、柔性制造[3,4]、物聯網[5]等概念已漸漸進入相關研究人員的視野中。高度自動化、智能化的設備正在逐步替代傳統的勞動密集型人工流水線,如生產PCB中常用的AOI(Auto Optical Inspection,自動光學檢測機)[6]、輕工業中常用的AGV(Automated Guided Vehicle,自動導航車)[7]、快遞行業中的自動分揀設備[8]等。在研發此類設備時,通常使用單片機、微控制器、PLC等作為系統的核心控制部件;而計算機作為人機交互的媒介,命令設備按照人的意圖完成不同的工作。本文針對這種架構的自動化設備,介紹了一種基于Qt5的計算機顯控軟件的開發方法。

Qt5隸屬于Qt跨平臺開發框架。Qt5中的Qt Creater是一個開源的、集成的軟件開發套件,僅需開發人員掌握C++語言,即可開發出高質量的軟件。Qt Creater有兩個特點:一是完全面向對象的編程方法;二是信號與槽的機制。所謂完全面向對象的編程是指在Qt Creater中,所有的界面控件、計算機外圍硬件、系統內部資源等都可以視為“對象”。此處“對象”的概念與C++語言中的“對象”基本一致。因此,開發人員可以方便快捷的使用計算機、操作系統中的各類資源,無須具體了解這些資源的底層實現方法。信號與槽的機制是Qt的特有機制,在Qt5中,每一個對象都可以發送“信號(Signal)”和執行“槽(Slot)”,而二者可以通過“連接(Connect)”進行關聯,通過“斷開(Disconnect)”取消關聯。比如開發人員連接了串口對象的“已接收到數據” 信號與界面對象的“顯示文本”槽,那么當該信號被觸發時(即計算機收到串口數據),界面對象會自動地執行對應的槽(即在計算機屏幕上顯示收到的數據)。Qt5支持一個對象擁有多個信號和多個槽,也支持多對多的連接方式。這種機制相對于傳統的回調函數的方法,其優點在于參數的類型安全與對象間的松散耦合;其缺點在于槽函數的響應速度遠低于回調函數,不過由于現在計算機硬件的高速發展,用戶幾乎感受不到二者響應時間的差異。

本文使用的框架版本為Qt 5.6.1,編譯套件為MinGW 4.9.2。運行的平臺為標準x86計算機,使用的操作系統為Windows 10。下面本文借助Qt Creater作為開發工具,詳細介紹人機交互界面、串口、網口的開發方法與關鍵代碼,并在實際項目中進行應用。

1 人機交互界面

人機交互界面是設備操作者與設備之間的橋梁,操作者通過界面控制設備的運作,設備通過界面告知操作者設備的相關信息。因此人機交互界面的設計應該盡量直觀、簡潔。Qt Creater中集成了Qt Designer模塊,在建立Qt Widgets Application時,系統默認添加了一個.ui格式的文件,這個文件中記錄的就是人機交互界面。在Qt Creater中左上角的項目文件中雙擊這個.ui文件即可對界面進行編輯。

圖1中所示為通過Qt Designer創建的人機交互界面的設計,本項目中項目名為test,使用的基類為QWidget,派生類為Widget。人機交互界面使用的控件均為Qt Designer中的標準控件。Qt在創建項目時,在類的聲明中創建了一個指向自己的指針變量Ui::Widget *ui,利用這個指針即可使用C++代碼來操作界面中的所有控件對象。例如在界面中創建一個按鈕控件,通過右下角的屬性面板將其對象名改為btnTest,然后在Widget類的構造函數中添加以下代碼:

ui->btnTest->setCheckable(true);

ui->btnTest->setText("Test");

即可將該按鈕設置為自鎖按鈕,且按鈕上顯示的文本為Test。

在實際使用過程中,開發者往往需要點下某個按鈕,軟件執行相應的動作,此時就需要使用信號與槽的功能將按鈕的點擊信號與要執行的槽函數進行連接。此時需要先聲明一個槽函數,例如在Widget類的聲明中添加下列代碼:

private slots:

void mySlotFunc(bool checked);

即可聲明一個名為mySlotFunc的槽函數。

然后進行連接,在Widget的構造函數中添加下列代碼:

connect(ui-> btnTest, SIGNAL(chicked(bool)), this, SLOT(mySlotFunc(bool)));

這是最常用的一種連接方式,這里的connect函數有4個參數:第1個參數為信號發出者的指針;第2個為信號,SIGNAL()是一個能將函數名轉化為字符串的宏;第3個參數為信號接收者的指針,此處使用this指針指向Widget自己;第4個參數為槽函數,SLOT()是一個與SIGNAL()功能類似的宏。當Widget對象進行構建時,程序將執行這一句代碼,將指定的信號與槽進行關聯。此時用戶在界面上點擊btnTest按鈕即可執行mySlotFunc函數。在連接信號與槽時,可以發現有些對象的信號是帶參數的,這表示這個信號發出的同時,還會給槽函數傳遞一個該類型的變量。比如上文中的chicked(bool)信號,這個bool型變量表示的是自鎖按鈕的狀態,槽函數可以根據按鈕狀態實現不同的功能。開發者可以利用該特點進行信息的傳遞,實現部件間的通信。

2 串口通信

2.1 串口控制方式

本文在實際項目中使用的串口通信協議為自擬通信協議,主要為了控制電磁閥、直流電機、步進電機以及舵機。

圖2所示為實際項目中的串口控制框圖。用戶通過計算機上的顯控軟件操作設備,顯控軟件將用戶的指令按照事先約定的通信協議通過串口發送給STM32微控制器。STM32微控制器根據指令控制電磁閥、電機等模塊。

2.2 串口調試

首先為軟件添加串口模塊,在Qt Creater中左上角的項目文件中雙擊test.pro,在編輯器中找到QT += core gui這一行,在該行的下一行輸入QT += serialport,保存test.pro文件。然后在“widget.h”的最上方包含兩個頭文件:

#include //串口對象

#include //串口信息對象

隨后在QWidget類聲明中聲明一個公有串口對象及一個公有函數:

QSerialPort *serialPort = new QSerialPort(this);

void initPort();//串口初始化函數

Qt庫函數中為開發者提供了QSerialPort類,專門用于操作計算機的串口。上述聲明使用new關鍵字將該對象聲明到系統的堆上,同時指明了其父對象為this,即Widget。這樣聲明的好處是不占用系統的棧資源。而且在Qt中,若使用這種指明父對象的方法,當父對象銷毀時,會自動地先銷毀其子對象,無須開發者自行使用delete關鍵字銷毀堆上的對象,進而有效防止內存泄漏。

下面對initPort()函數進行實現:

void Widget::initPort(){

QList info = QSerialPortInfo::availablePorts();

for(int i=0;i

ui->cmbPortName->addItem(info[i].portName());

}

}

上述代碼利用QSerialPortInfo類中的靜態函數availablePorts()遍歷系統所有的可用串口,并將串口名排列至名為cmbPortName的下拉列表中。上述代碼編寫完成后,可在Widget對象的構造函數中調用,這就實現了軟件運行后,自動查找所有可用串口的功能。

在UI中右鍵點擊打開串口按鈕,選擇轉到槽,在彈出的對話框中選擇clicked(bool)。此時,Qt自動添加了一個名為on_btnOpen_clicked(bool checked)的函數,該函數為當btnOpen對象發出clicked(bool checked)信號時對應的槽函數。這種“on_對象_信號”形式的槽函數是連接Qt Designer控件的一種特殊用法,Qt會自動將該對象的信號與本函數連接,無須開發者手動使用connect函數。此函數的代碼如下:

void Widget::on_btnOpen_clicked(bool checked){

if(checked==true){

serialPort->setPortName(ui->cmbPortName->currentText());//選擇串口

serialPort->setBaudRate(115200);//波特率

serialPort->setDataBits(QSerialPort::Data8);

//8位數據位

serialPort->setStopBits(QSerialPort::OneStop);

//1位停止位

serialPort->setParity(QSerialPort::NoParity);

//無奇偶校驗

serialPort->setFlowControl(QSerialPort::NoFlowControl);

//不使用流控

serialPort->open(QIODevice::ReadWrite);

//打開串口

ui->btnOpen->setText(tr("關閉串口"));

//更新按鈕文本

}

if(checked==false){

serialPort->close();//關閉串口

ui->btnOpen->setText(tr("打開串口"));

//更新按鈕文本

}

}

上述代碼首先根據按鈕狀態,即checked的值,判斷按鈕是按下還是抬起。若按下則打開串口;若抬起則關閉串口。這里使用代碼直接對串口進行配置,開發者可以合理設計界面讓用戶可以選擇這些參數的值。

完成上述代碼的編輯后,計算機串口的通信通道已建立完成,下面開始編寫串口發送與串口接收函數,代碼如下:

int Widget::serialPortTXD(char *str, int num){

serialPort->write(str, num);//發送數據

return serialPort->waitForBytesWritten(100);

//確認數據發送完畢,100ms超時

}

int Widget::serialPortRXD(char *str, int timeout){

QByteArray buffer;//臨時存儲接收數據

while(1){

if(serialPort->waitForReadyRead(timeout)){

buffer += serialPort->readAll();

if(buffer.size() == 13)

break;

}

else//超時返回

return -1;

}

memcpy(str, buffer.constData(), buffer.size());

return buffer.size();//返回接收的字節數

}

上述代碼分別為串口發送函數與串口接收函數。二者主要是利用了QSerialPort類中的write方法與readAll方法。另外由于實際項目中下位機不能主動向上位機發送信息,因此使用了waitForReadyRead進行阻塞式接收。如果開發者想要按照“中斷式”接收串口數據,可將該函數作為槽函數,并與serialPort對象中的readyRead信號連接,即可實現隨時接收串口傳來的數據。

至此串口通信的發送與接收的基礎代碼已全部完成,開發者可自行利用connect函數將界面中各種控件的信號與自己編寫的槽函數連接,實現用戶點擊界面,軟件產生相應串口數據的功能。如果開發者想通過串口控制標準的工業控制模塊,那么將通信協議修改為Modbus協議即可[9]。

在實際項目中,通過上文的方法編譯出的軟件可以完成與STM32微控制器的串口通信,可以正確控制16個電磁閥、2個直流電機、3個步進電機以及2個舵機。

3 網口通信

3.1 網口控制方式

當使用網絡通信進行工業控制時,通常使用Modbus TCP協議[10]。該協議可以看作是網絡通信中的TCP協議與串口通信的Modbus協議結合而成的協議。TCP協議是面向連接的協議,其要求通信雙方必須建立可靠的連接,然后再通信。TCP協議使用CS模型進行通信:通信的一方為客戶端(Client),另一方為服務器(Server)。使用Modbus TCP協議通信的雙方,先根據TCP協議進行連接,完成連接后按照Modbus協議的格式發送數據包。Modbus TCP協議中客戶端又稱為主站,服務器又稱為從站。一般一個控制系統中僅有一個主站,但是可以有多個從站;通信必須由主站發起,從站只能響應主站的指令,不能主動發起通信。

上圖所示為實際項目中網口相關的控制框圖。計算機同時建立服務器與客戶端,服務器用來控制UR機器人,客戶端用來控制PLC。

3.2 網口通信服務器的調試

由于項目中的計算機需要同時作為服務器與客戶端與不同的設備通信,因此代碼中將每個通信的套接字放在各自獨立的線程中以實現并行通信。

類似于調試串口,首先添加網絡模塊,在test.pro中添加QT += network。然后以QTcpServer為基類派生一個子類robotServer,以下為派生類的聲明。

class robotServer: public QTcpServer

{

Q_OBJECT

public:

robotServer (QObject *parent = 0) :QTcpServer(parent){}

~ robotServer (){}

QTcpSocket socket;//客戶端套接字

protected:

void incomingConnection(qintptr socketDescriptor){

socket.setSocketDescriptor(socketDescriptor);}

signals:

void robotDataReply(QString str);

private slots:

void serverInit(QString addr, uint port){

listen(QHostAddress(addr),port);}

void serverClose(){

socket.close();

close();}

void dataSend(QString str);

void dataRecv();

};

在上述類聲明中Q_OBJECT為Qt元對象宏,添加此宏才能使用信號、槽、對象樹等Qt特有的功能。serverInit槽用于創建服務器,監聽指定的端口。serverClose槽用于斷開套接字并關閉服務器。派生類中重新實現了incomingConnection(qintptr socketDescriptor)虛函數,當有新的客戶端連接服務器時,系統會自動調用此函數建立套接字。由于實際項目中僅有1個UR機器人作為客戶端與上位機通信,因此類的聲明中只聲明了1個套接字,即服務器僅能同時連接1個客戶端。當然開發者可以聲明多個套接字用來同時連接多個客戶端。由于篇幅所限,上述聲明中并沒有對收發函數進行實現,其實現過程與串口收發類似。另外類中還聲明了一個信號用來與UI界面通信,將機器人回傳的信息顯示在UI上。

在構建好服務器后,新建一個子線程。以QThread為基類派生一個子類serverThread。派生類的目的是重構QThread基類中的虛函數run()。以下為派生類的聲明。

class serverThread : public QThread

{

Q_OBJECT

public:

serverThread(QObject *parent = 0): QThread (parent){}

~serverThread(){

requestInterruption();

quit();

wait();}

protected:

void run(){

robotServer server;

connect((Widget *)this->parent(),SIGNAL(serverOpen(QString,uint)),&server,SLOT(serverInit(QString,uint)));

while(!isInterruptionRequested()){

QCoreApplication::processEvents (QEventLoop::AllEvents, 100);//保持線程的事件循環

msleep(1);}}

};

虛函數run()相當于線程的主函數,重新實現此函數相當于對線程的主函數進行編程。另外在Qt中,任何子線程都禁止訪問UI界面中的對象,但可以通過信號和槽的方式與UI通信,間接操作UI界面中的對象。析構函數中的requestInterruption()與線程主函數中的isInterruptionRequested()配合使用,可以保證線程安全退出。

完成上述兩個對象的派生后,在Widget對象的聲明里添加一個子線程對象,代碼如下:

serverThread *robotThread = new serverThread (this);

在Widget對象的構造函數里啟動線程,代碼如下:

robotThread->start();

Qt5中的信號與槽也支持跨線程的連接方式,例如上述上文run()函數中的連接方式。這種連接方式是利用了Qt對象樹的特性,由于Widget對象(即UI界面)創建robotThread對象時,使用this指針聲明了父子關系,因此在子線程內,用this->parent()返回的指針即為Widget的對象指針。

在實際項目中,使用UR機器人作為客戶端成功與本文構建的服務器相連接。通過發送特定的控制指令實現了對UR機器人的遠程控制。

3.3 網口通信客戶端的調試

客戶端的調試與服務器的調試過程類似,只需從QTcpSocket派生一個子類即可,創建線程的方法與創建服務器線程完全一致,此處不再贅述。

在實際項目中,本文構建的客戶端成功與PLC相連接。通過標準的Modbus TCP協議讀、寫PLC的線圈狀態,完成對PLC流水線的控制。

4 結論

(1)使用Qt5可以在x86計算機上開發面向工業控制的顯控軟件。使用Qt5自帶的QSerialPort類可以完成計算機串口通信、Modbus串口通信;使用QTcpServer類、QTcpSocket類以及他們的派生類可以完成TCP網絡通信、Modbus TCP網絡通信;使用QThread的派生類可以進行多線程操作。使用這些Qt5標準類進行軟件開發,能快速實現預期功能而不必關心具體實現方法,從而大幅提高軟件開發的效率。

(2)本文使用Qt 5.6.1 和C++語言編寫的顯控軟件在實際項目中成功控制了16個電磁閥、2個直流電機、3個步進電機、2個舵機、1個UR5協作型機器人以及某型流水線。且該軟件還可以繼續擴展,實現對更多工業模塊的復雜控制,進一步提高系統的自動化程度。

參考文獻:

[1] 張肅,許慧,黃蕊.我國人工智能產業發展問題研究[J].長春理工大學學報,2018,31(5):1-6.

[2] 鐘義信.人工智能:概念·方法·機遇[J].科學通報,2017,62(22):2473-2479.

[3] 倪珉.柔性制造系統在中小企業中的應用和未來的發展[J].機械管理開發,2018,33(8):227-229.

[4] 任永杰,尹仕斌,邾繼貴.面向現代柔性制造的工業機器人高精度控制方法[J].航空制造技術,2018(5):16-21.

[5] 王銳,吳紫薇.基于物聯網技術的列車環境監測系統設計[J].長春理工大學學報(自然科學版),2019,42(3):133-137.

[6] 馬曉波. 一種印刷電路板(PCB)AOI假缺點的修復方法[D]. 蘇州: 蘇州大學, 2016: 1-7.

[7] 賀冰倩. 倉庫智能AGV路徑設計及調度研究[D]. 武漢: 華中科技大學, 2019: 16-19.

[8] 吳星峰. 小包郵件自動分揀系統的設計與實現[D]. 長春: 吉林大學, 2015: 1-3.

[9] 戴振民.基于Qt5的MODBUS協議編程與實現[J].電子技術與軟件工程,2018(17):55.

[10] 羅旋,李永忠.Modbus TCP安全協議的研究與設計[J].數據采集與處理,2019,34(6):1110-1117.

【通聯編輯:梁書】

猜你喜歡
自動化
國內焊接設備市場現狀及發展趨勢研究
經營者(2016年12期)2016-10-21 07:39:01
供電企業電力自動化主站系統研究
錦界煤礦連采膠帶機集控系統的介紹
供熱站自動控制系統中PLC的應用
AGV小車在白酒行業自動化立體倉庫中的應用
中國市場(2016年36期)2016-10-19 03:40:15
電氣工程及其自動化問題與對策
我國機械設計制造及其自動化的現狀及發展趨勢
淺論節能設計理念在機械制造與自動化中的應用
簡析火力發電廠熱工自動化儀表應用及故障排除方法
配網自動化實用化模式建設及系統運行
主站蜘蛛池模板: 国产高清色视频免费看的网址| 97久久免费视频| 欧美成人手机在线观看网址| 久久国产精品夜色| 国产小视频在线高清播放| 午夜精品久久久久久久99热下载 | 日本国产在线| 在线无码九区| 亚洲伦理一区二区| 精品国产成人a在线观看| 国产微拍一区| 久久综合色视频| 日韩中文字幕免费在线观看| 一级全免费视频播放| 最新精品久久精品| 亚洲午夜国产片在线观看| 亚洲成人手机在线| 日韩精品无码免费一区二区三区| 亚洲精品视频免费观看| 无码人妻热线精品视频| 日韩欧美中文亚洲高清在线| 真人高潮娇喘嗯啊在线观看| 欧美日本二区| 老司机久久99久久精品播放| 国产免费好大好硬视频| 九色视频线上播放| 精品福利网| 9啪在线视频| 精品久久久久久久久久久| 青青青视频蜜桃一区二区| 国产精品开放后亚洲| 国产一区在线观看无码| 亚洲日韩AV无码一区二区三区人| 亚洲日韩精品伊甸| 国产69精品久久| 亚洲最新在线| 秋霞一区二区三区| 欧美第一页在线| www.91中文字幕| 国产成人综合日韩精品无码首页| 波多野结衣在线se| 99在线国产| 亚洲中文字幕国产av| 538国产视频| 国产在线视频自拍| 五月天在线网站| 亚洲一区色| 永久在线播放| 91视频青青草| 国产成人精品一区二区三区| 国产无码精品在线播放| 国产h视频免费观看| 69精品在线观看| 亚洲中文精品久久久久久不卡| 国产全黄a一级毛片| 91精品啪在线观看国产| 国产成人毛片| 秘书高跟黑色丝袜国产91在线 | 成人国产三级在线播放| 一本无码在线观看| 91小视频在线观看免费版高清| 久久中文无码精品| 99re这里只有国产中文精品国产精品 | 农村乱人伦一区二区| 久久亚洲综合伊人| 老司机精品一区在线视频| 九月婷婷亚洲综合在线| 亚洲 欧美 偷自乱 图片| 精品一区国产精品| 2019国产在线| 久久99精品久久久大学生| 色哟哟精品无码网站在线播放视频| 亚洲综合经典在线一区二区| 久久大香香蕉国产免费网站| 国产Av无码精品色午夜| 亚洲系列无码专区偷窥无码| 极品性荡少妇一区二区色欲 | 国产永久在线视频| 久久毛片网| 88国产经典欧美一区二区三区| 国产亚洲日韩av在线| 四虎成人在线视频|