宣 翔,劉 悅
(1.中國(guó)電子科技集團(tuán)公司第三十八研究所,安徽 合肥 230088;2.長(zhǎng)鑫存儲(chǔ)技術(shù)有限公司,安徽 合肥 230601)
隨著現(xiàn)代雷達(dá)指標(biāo)的不斷提升,雷達(dá)伺服系統(tǒng)朝著高精度、高響應(yīng)方向不斷發(fā)展,伺服系統(tǒng)性能的提升不僅對(duì)伺服系統(tǒng)配套的電氣元件性能提出更高的要求,也對(duì)系統(tǒng)調(diào)試發(fā)起了更大的挑戰(zhàn)。傳統(tǒng)的雷達(dá)伺服調(diào)試由于缺乏人機(jī)交互界面,調(diào)試過(guò)程中更多依賴(lài)于工程人員的項(xiàng)目經(jīng)驗(yàn)和對(duì)電氣元件的理解從而給出輸出變量,且被控元件相應(yīng)的反饋信號(hào)只能依賴(lài)于工程人員通過(guò)控制軟件中的數(shù)據(jù)記錄分析以及通過(guò)示波器在通信端點(diǎn)完成曲線記錄。
基于傳統(tǒng)雷達(dá)伺服調(diào)試過(guò)程中操作復(fù)雜、變量給定模糊不清且狀態(tài)反饋顯示困難等狀況,本文設(shè)計(jì)開(kāi)發(fā)的一種針對(duì)雷達(dá)伺服調(diào)試的系統(tǒng),通過(guò)控制器局域網(wǎng)絡(luò)(CAN)總線、串口通信等多種方式與外部元件進(jìn)行信息交互,繪制實(shí)時(shí)動(dòng)態(tài)曲線圖記錄電機(jī)轉(zhuǎn)速、電流等狀態(tài)信息,且在測(cè)試過(guò)程中實(shí)時(shí)編輯控制指令并發(fā)送。
用戶(hù)界面是否美觀以及易操作是衡量一個(gè)UI界面友好與否的重要標(biāo)準(zhǔn),用戶(hù)界面部分作為本系統(tǒng)重要的組成部分,布局和設(shè)計(jì)均基于以上兩點(diǎn)完成。
QT平臺(tái)作為當(dāng)今界面設(shè)計(jì)時(shí)常用的軟件平臺(tái),其采用的C++編程語(yǔ)言作為內(nèi)核語(yǔ)言,設(shè)計(jì)人員在編程時(shí)可以實(shí)時(shí)進(jìn)行效果仿真和調(diào)試。同時(shí),該平臺(tái)包含多種實(shí)用的外部庫(kù),設(shè)計(jì)人員通過(guò)庫(kù)的調(diào)用即可實(shí)現(xiàn)與計(jì)算機(jī)和驅(qū)動(dòng)之間的互連,并實(shí)現(xiàn)向程序添加圖片、多媒體等功能,操作簡(jiǎn)單。本系統(tǒng)基于QT平臺(tái)在界面開(kāi)發(fā)時(shí)的以上優(yōu)勢(shì),采用該平臺(tái)完成用戶(hù)界面的設(shè)計(jì)。本系統(tǒng)界面設(shè)計(jì)結(jié)構(gòu)主要包括如圖 1所示的部分,主頁(yè)面下包括測(cè)試模式和實(shí)驗(yàn)?zāi)J?種模式,測(cè)試模式主要包括用于顯示數(shù)字信號(hào)輸入輸出狀態(tài)的點(diǎn)燈模塊,曲線繪制模塊主要顯示如電流、電壓、速度等實(shí)時(shí)連續(xù)變化的變量用以記錄,而串口、CAN通信模塊則用于與外部元件實(shí)時(shí)通信,獲取對(duì)方狀態(tài)并下達(dá)相應(yīng)指令。實(shí)驗(yàn)?zāi)J较聟?shù)調(diào)整模塊用于改變用戶(hù)的自定義參數(shù),并通過(guò)指令下達(dá)模塊下達(dá)相應(yīng)的指令。
信號(hào)與槽機(jī)制作為QT平臺(tái)的核心機(jī)制,它的本質(zhì)是一種用于對(duì)象之間通信的機(jī)制,當(dāng)對(duì)象改變其狀態(tài)時(shí),信號(hào)就由該對(duì)象發(fā)射出去,槽用于接收信號(hào),并在收到信號(hào)后立即執(zhí)行相應(yīng)的成員函數(shù),信號(hào)與槽取代了函數(shù)指針,使得通信程序的編寫(xiě)變得更加簡(jiǎn)潔明了。其中,信號(hào)與槽之間的關(guān)系可以描述為:多個(gè)信號(hào)可以連接到1個(gè)槽,1個(gè)信號(hào)可以連接到多個(gè)槽,圖2展示了信號(hào)與槽之間的關(guān)系。
圖2 信號(hào)與槽關(guān)系模型
QT中標(biāo)準(zhǔn)的信號(hào)與槽格式為:
connect(Object1,Signal1,Object2,Slot1);
本文設(shè)計(jì)了點(diǎn)燈模塊用于直觀地顯示如速度到達(dá)等數(shù)字變量,如條件滿(mǎn)足,則顯示為綠色,如條件不滿(mǎn)足顯示為紅色,或其他的一些警告性情況,呈紅黃色交替顯示。
QT平臺(tái)常采用QpushButton類(lèi)按鈕用于變量狀態(tài)顯示,QpushButton本身為矩形,本文需要將其變?yōu)閳A形且顯示為特定的圖片,這里采用改變樣式表的方法,將需要顯示的圖片樣式添加到Button的樣式表中,并采用setStyleSheet函數(shù)進(jìn)行設(shè)定,例如setStyleSheet(“QpushButton{border-image:url(:/new/prefix1/green.ico);}”);即將Button設(shè)置為綠色圓形按鈕圖片。為實(shí)現(xiàn)數(shù)字變量改變時(shí)按鈕顯示狀態(tài)隨之改變的功能,本文采用了changeButtonico()函數(shù),代碼如下:
void Button::changeButtonico()
{
if(speedIsOK)
ui->button_speed->setStyleSheet(“QpushButton{border-image:url(:/new/prefix1/green.ico);}”);
else
ui->button_speed->setStyleSheet(“QpushButton{border-image:url(:/new/prefix1/red.ico);}”);
為實(shí)現(xiàn)警告性情況按鈕狀態(tài)呈紅黃交替顯示,速度到達(dá)模塊報(bào)警,本文采用了QTimer類(lèi)timeout函數(shù),通過(guò)信號(hào)與槽機(jī)制將QTimer計(jì)時(shí)器與用于圖片交替顯示的icoChange()函數(shù)相連,實(shí)現(xiàn)代碼如下:
connect(m_timer,SIGNAL(timeout()),this,SLOT(icoChange());
m_timer=new QTimer(this);m_timer->start(10);
在icoChange()函數(shù)中,采用了int m_count變量:
m_count+=1;
if(m_count%2)
ui->button_speed->setStyleSheet(“QpushButton{border-image:url(:/new/prefix1/red.ico);}”);
else
ui->button_speed->setStyleSheet(“QpushButton{border-image:url(:/new/prefix1/yellow.ico);}”);
if(m_count==100)
m_count=0;
通過(guò)整型變量隨時(shí)間計(jì)數(shù)器自加,并向2取余,實(shí)現(xiàn)交替改變,當(dāng)m_count到達(dá)既定數(shù)值時(shí)需要置位0,函數(shù)循環(huán)調(diào)用,從而實(shí)現(xiàn)狀態(tài)的循環(huán)顯示。
QT中采用QPainter類(lèi)繪制圖形,當(dāng)控件重繪頻繁時(shí),例如實(shí)時(shí)采集到變量數(shù)值變化并繪制成曲線圖時(shí),由于屏幕高頻率刷新,從而引起屏幕閃爍,重回頻率越高,閃爍越明顯[1]。雙緩沖機(jī)制的原理是繪制控件時(shí),首先將要繪制的內(nèi)容繪制在1個(gè)圖片中,再將圖片一次性繪制到控件上,通過(guò)這種方式,可以使圖片的擦寫(xiě)過(guò)程在幕后進(jìn)行,避免閃爍的效果,原理如圖3所示。本文數(shù)據(jù)采集后繪制的曲線圖使得屏幕刷新頻率較高,因此需要采用雙緩沖機(jī)制繪制圖形。
圖3 雙緩沖機(jī)制原理圖
代碼的實(shí)現(xiàn)主要通過(guò)refreshPixmap()函數(shù),首先將當(dāng)前的pix圖像賦值給一個(gè)臨時(shí)的tmpPix圖像,然后采用QPainter類(lèi)將采集到的圖像信息以及固有的一些屬性如坐標(biāo)軸、刻度等在該臨時(shí)圖像上進(jìn)行繪制,隨后通過(guò)drawPixmap()函數(shù)將臨時(shí)圖像繪制到painter上,再通過(guò)事件event調(diào)用painter,從而實(shí)現(xiàn)了實(shí)時(shí)繪制曲線圖,擦寫(xiě)過(guò)程均在幕后完成。
void Curve::refreshPixmap()
{
QPainter painter(this);
tmpPix=pix;
QPainter pp(&tmpPix);
QPen pen;
QColor color(Qt::white);
pen.setColor(color)
pen.setWidth(2);
pp.setPen(pen);
pp.senRenderHint(QPainter::Antialiasing,true);
int pointx=45,pointy=620;//確認(rèn)坐標(biāo)軸起點(diǎn)
int width=930-pointx,height=580;
pp.drawRect(5,5,950-10,650-10);
pp.drawLine(pointx,pointy,width+pointx,pointy);
pp.drawLine(pointx,pointy-height,pointx,pointy);
QPen penDegree;
…
painter.drawPixmap(900,700,tmpPix);
}
伺服調(diào)試過(guò)程中通常需要實(shí)時(shí)記錄實(shí)驗(yàn)數(shù)據(jù),如曲線圖、儀表值等等,為滿(mǎn)足調(diào)試過(guò)程的需求,本系統(tǒng)添加了工具欄,列出了如文件保存、圖片打印、文本打印以及放大、旋轉(zhuǎn)等常用工具,如圖4所示。
圖4 工具欄界面圖
例如圖像打印只需要調(diào)用QPrinter以及QPrintDialog 2個(gè)類(lèi)即可調(diào)用打印機(jī)及其屬性,并將圖像打印到文件中。
串口通信的概念是按位發(fā)送和接收字節(jié),其重要參數(shù)分為:波特率、數(shù)據(jù)位、奇偶校驗(yàn)位、停止位。串口調(diào)試模塊需要利用到計(jì)算機(jī)串口驅(qū)動(dòng),通過(guò)設(shè)置串口參數(shù)實(shí)現(xiàn)與外部端口的通信。QT平臺(tái)提供了第三方串口庫(kù),只需要在QTpro添加QT +=serialport代碼即可在相應(yīng)的子程序引用
foreach(const QSerial PortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->portNameBox->addItem(serial.PortName());
serial.close();
}
}
UI界面設(shè)計(jì)中,調(diào)用QpushButton以及QTextEdit類(lèi),可以繪制文本輸入和接收框以及相應(yīng)的按鈕。按鈕是否可用通過(guò)setEnabel(bool)函數(shù)進(jìn)行設(shè)置,例如發(fā)送數(shù)據(jù)按鈕與其他設(shè)置參數(shù)按鈕不能同時(shí)操作,因此應(yīng)設(shè)置相應(yīng)的邏輯關(guān)系,按鈕通過(guò)addItem()函數(shù)即可增加選項(xiàng)用于選擇,完成后的串口界面如圖5所示。
圖5 串口調(diào)試模塊界面圖
CAN通信模塊是基于CAN總線協(xié)議設(shè)計(jì)的,CAN總線的概念是控制器局域網(wǎng),其特點(diǎn)主要包括節(jié)點(diǎn)不分主從,通過(guò)報(bào)文ID進(jìn)行過(guò)濾,速度較快且具備錯(cuò)誤檢測(cè)功能。
CAN通信模塊通過(guò)QLineEidt類(lèi)進(jìn)行設(shè)計(jì),由于該類(lèi)采用的數(shù)據(jù)是QString類(lèi)型,而QString類(lèi)型數(shù)據(jù)為了清晰展示,通常采用空格符對(duì)數(shù)據(jù)進(jìn)行分割,從而增加了數(shù)據(jù)的長(zhǎng)度。本文為避免數(shù)據(jù)傳輸過(guò)程冗長(zhǎng),采用了將QString類(lèi)轉(zhuǎn)換為char型數(shù)據(jù)進(jìn)行傳輸,從而減少串口傳輸?shù)臄?shù)據(jù)量。
通過(guò)分析雷達(dá)伺服調(diào)試過(guò)程中可能要采集的數(shù)據(jù)以及需要下達(dá)的指令數(shù)據(jù),系統(tǒng)需要的有效數(shù)據(jù)可能多達(dá)10個(gè)字節(jié),包括電流、速度、電壓數(shù)值等等。因此,數(shù)據(jù)包結(jié)構(gòu)設(shè)計(jì)如表1所示。
表1 數(shù)據(jù)包結(jié)構(gòu)表
為保證數(shù)據(jù)完整性,CAN通信模塊通常采用一種算法對(duì)原始數(shù)據(jù)計(jì)算出1個(gè)校驗(yàn)值,并將校驗(yàn)值一同發(fā)出,接收方用相同的方法計(jì)算出校驗(yàn)值進(jìn)行數(shù)據(jù)校驗(yàn),本文采用了目前行業(yè)內(nèi)比較常用的CRC循環(huán)校驗(yàn)法,該方法具有偵錯(cuò)能力強(qiáng)、系統(tǒng)消耗小等優(yōu)點(diǎn),適用于本系統(tǒng),主要實(shí)現(xiàn)代碼如下:
void CAN_com::CRC_check()
{
if (enable==1)
{
for(int i=0;i { crc=data[i]^crc; for(int j=0;j<7;j++) { tmp1=crc &&0X 0001; if (tmp1=0X0001) crc=crc》1^0XA001; else crc=crc》1; } } } } 參數(shù)調(diào)整和指令下達(dá)模塊即變量輸入輸出模塊,根據(jù)雷達(dá)伺服系統(tǒng)常用的參數(shù),參數(shù)調(diào)整和指令下達(dá)模塊通常包括速度設(shè)定,電流門(mén)限、電壓門(mén)限、使能、比例、積分、微分(PID)參數(shù)調(diào)整等。本系統(tǒng)通過(guò)在界面上提供輸入框改變變量值,并通過(guò)串口或CAN通信方式送達(dá)可編程邏輯控制器(PLC)或其他被控元件,實(shí)現(xiàn)參數(shù)變更和指令下達(dá)的功能[3]。 在某項(xiàng)目中,采用本系統(tǒng)進(jìn)行雷達(dá)伺服系統(tǒng)調(diào)試,通過(guò)串口通信建立雷達(dá)伺服系統(tǒng)和本軟件調(diào)試系統(tǒng)的連接,計(jì)算機(jī)端采用USB轉(zhuǎn)串口模塊,PLC通過(guò)IO量與多種被控元件如接近開(kāi)關(guān)、水平傳感器等建立連接,通過(guò)CAN總線建立與伺服電機(jī)的連接從而接收伺服電機(jī)各項(xiàng)反饋量并向其下達(dá)控制指令,各被控元件及伺服電機(jī)結(jié)合傳動(dòng)結(jié)構(gòu)件集成為雷達(dá)伺服系統(tǒng),系統(tǒng)組成圖如圖6所示。 圖6 系統(tǒng)組成圖 系統(tǒng)上電后,打開(kāi)串口界面,搜索串口端口號(hào),建立串口連接。通過(guò)數(shù)據(jù)采集,接收到伺服電機(jī)電壓為380 V,通過(guò)加載使能,給定相應(yīng)速度,收集并繪制伺服系統(tǒng)某關(guān)節(jié)部分位置曲線,曲線顯示其完成循環(huán)往復(fù)運(yùn)動(dòng),與實(shí)際運(yùn)動(dòng)狀態(tài)擬合。同時(shí),調(diào)試系統(tǒng)采集到各被控元件的狀態(tài)信息,并通過(guò)伺服調(diào)試系統(tǒng)界面的各點(diǎn)燈模塊加以顯示。經(jīng)分析,本系統(tǒng)實(shí)時(shí)采集了被控元件的狀態(tài)信息,并繪制了相應(yīng)變量的狀態(tài)曲線,通過(guò)參數(shù)調(diào)整和指令下達(dá)模塊可以實(shí)時(shí)改變輸出變量的狀態(tài)從而實(shí)現(xiàn)控制被控元件的功能。系統(tǒng)簡(jiǎn)單明了,操作簡(jiǎn)易,適合伺服調(diào)試人員現(xiàn)場(chǎng)調(diào)試。系統(tǒng)調(diào)試界面如圖7所示。 圖7 雷達(dá)伺服調(diào)試系統(tǒng)界面 通過(guò)實(shí)際應(yīng)用可以發(fā)現(xiàn),本系統(tǒng)信息顯示和人工操作完全可以滿(mǎn)足雷達(dá)伺服系統(tǒng)調(diào)試的需要。 本文通過(guò)QT平臺(tái)設(shè)計(jì)了一款用于雷達(dá)伺服系統(tǒng)調(diào)試的系統(tǒng),該系統(tǒng)包含了伺服系統(tǒng)常用的參數(shù)設(shè)定、通信方式和狀態(tài)顯示,極大簡(jiǎn)化了伺服調(diào)試人員調(diào)試過(guò)程。此外,該系統(tǒng)性能穩(wěn)定且價(jià)格低廉,具有一定的發(fā)展前景。3.3 參數(shù)調(diào)整和指令下達(dá)模塊
4 應(yīng)用實(shí)例
5 結(jié)束語(yǔ)