陸鑫焱,楊洪濤*
(1. 遼寧科技大學(xué) 電子與信息工程學(xué)院,遼寧 鞍山 114051;2.遼寧科技大學(xué) 創(chuàng)新創(chuàng)業(yè)學(xué)院,遼寧 鞍山 114051)
本設(shè)計(jì)是一種基于LabView 的分揀機(jī)器人控制軟件,應(yīng)用虛擬儀器技術(shù)LabView 軟件中的數(shù)組操作、字符串操作、事件程序、狀態(tài)機(jī)及I/O 文件存儲(chǔ)等工具,采用狀態(tài)機(jī)實(shí)現(xiàn)串口的初始化、等待、數(shù)據(jù)操作和退出4 種狀態(tài),并分別對(duì)應(yīng)不同的事件程序?qū)崿F(xiàn)串口通訊控制分揀機(jī)器人,應(yīng)用字符串操作截取輸入命令行中的電機(jī)序號(hào)和轉(zhuǎn)角等信息傳輸給數(shù)組元素顯示,對(duì)調(diào)試好的命令行進(jìn)行I/O 文件存儲(chǔ)等操作[1-2]。
本設(shè)計(jì)采用虛擬儀器技術(shù),通過(guò)串口通信和I/O文件存儲(chǔ)等操作,快速實(shí)現(xiàn)分揀機(jī)器人控制軟件。串口通信是一種傳輸數(shù)據(jù)的通訊方式,該通信方式電路簡(jiǎn)單易于部署,穩(wěn)定性高且通信成本低,適合用于分揀機(jī)器人的控制[3-4]。軟件的總體設(shè)計(jì)見(jiàn)圖1。
圖1 總體設(shè)計(jì)圖
首先進(jìn)行通信模塊的設(shè)計(jì),通過(guò)串口傳輸和接收數(shù)據(jù)實(shí)現(xiàn)軟件與分揀機(jī)器人的通信[5]。創(chuàng)建一個(gè)VI 并切換到程序框圖界面,與串口相關(guān)的函數(shù)位于函數(shù)→儀器I/O→串口函數(shù)庫(kù)中。在虛擬儀器技術(shù)LabView軟件中,串口發(fā)送一次數(shù)據(jù)的過(guò)程為:應(yīng)用Configure Port 函數(shù)打開(kāi)串口,應(yīng)用Write 函數(shù)發(fā)送數(shù)據(jù)和應(yīng)用Close 函數(shù)關(guān)閉串口,實(shí)現(xiàn)過(guò)程如下:
(1) 切換到程序框圖,選擇函數(shù)→編程→結(jié)構(gòu)→while 循環(huán),完成循環(huán)結(jié)構(gòu)添加,在循環(huán)條件按鈕上點(diǎn)擊右鍵選擇創(chuàng)建輸入控件,生成停止按鈕。
(2) 選擇函數(shù)→編程→結(jié)構(gòu)→事件結(jié)構(gòu),在while 循環(huán)中放置事件結(jié)構(gòu)。
(3) 切換到前面板,選擇控件→布爾→確定按鈕→修改標(biāo)簽為serial_open,添加打開(kāi)串口的按鈕。
(4) 切換到程序框圖,在事件結(jié)構(gòu)中添加事件分支,在[0]超時(shí)處→右鍵→添加事件分支→事件源選擇serial_open。
(5) 將serial_open 按鈕放入事件結(jié)構(gòu)[1]“serial_open”值改變分支中。
(6) 在事件結(jié)構(gòu)[1]“serial_open”值改變分支中依次添加,函數(shù)→儀器I/O→串口→VISA 配置串口;在控件的資源名稱接口→右鍵→創(chuàng)建→輸入控件;函數(shù)→編程→簇→解除綁定;函數(shù)→編程→布爾→非;函數(shù)→編程→結(jié)構(gòu)→條件結(jié)構(gòu);在其條件假中添加單按鈕對(duì)話框。
(7) 切換到前面板中添加串口狀態(tài)顯示燈,選擇控件→布爾→圓形指示燈→修改標(biāo)簽為serial_state。
(8) 繼續(xù)進(jìn)行細(xì)節(jié)完善,切換到前面板選擇serial_open 按鈕→右鍵→屬性→選擇多字符串顯示→設(shè)置打開(kāi)(close)、關(guān)時(shí)(open);serial_open 按鈕→右鍵→機(jī)械動(dòng)作→單擊時(shí)轉(zhuǎn)換。
(9) 切換到程序框圖事件結(jié)構(gòu)中添加條件結(jié)構(gòu),選擇函數(shù)→編程→結(jié)構(gòu)→條件結(jié)構(gòu),連接serial_open 按鈕,判決按鍵的狀態(tài)執(zhí)行不同的條件結(jié)構(gòu)。
(10) 在條件結(jié)構(gòu)為假的框圖中添加關(guān)閉串口的程序,選擇函數(shù)→儀器I/O→串口→VISA 關(guān)閉。
(11) 返回到條件框圖真,在輸入控件VISA resourse name→右鍵→創(chuàng)建→局部變量,把創(chuàng)建的局部變量右鍵轉(zhuǎn)換為輸入,連接到VISA 關(guān)閉上。同樣把serial_state 狀態(tài)燈創(chuàng)建局部變量拖動(dòng)到條件結(jié)構(gòu)為假的框圖中。通信模塊設(shè)計(jì)見(jiàn)圖2。
圖2 通信模塊設(shè)計(jì)圖
軟件設(shè)計(jì)一般包括初始化、等待命令、執(zhí)行事件等功能,這些功能通過(guò)狀態(tài)機(jī)來(lái)統(tǒng)籌設(shè)計(jì)完成。實(shí)現(xiàn)過(guò)程:
(1) 切換到前面板,選擇控件→下拉列表與枚舉→枚舉,新建一個(gè)枚舉后,在枚舉上右鍵→制作自定義類型,然后再右鍵→打開(kāi)自定義類型并作為控件保存為狀態(tài)機(jī).ctl,這個(gè)狀態(tài)機(jī)可以像控件一樣拖動(dòng)到程序中使用。
(2) 在打開(kāi)的狀態(tài)機(jī)上→右鍵→編輯項(xiàng),插入Init、Wait、Get Data、Exit 四項(xiàng)。
(3) 將制作的狀態(tài)機(jī)拖動(dòng)到程序框圖界面,連接到while 循環(huán)上,并在連接點(diǎn)循環(huán)隧道上→右鍵→替換為移位寄存器,while 循環(huán)內(nèi)增加一個(gè)條件結(jié)構(gòu),將移位寄存器連接到條件結(jié)構(gòu)的分支選擇器用來(lái)讀取while 循環(huán)傳遞過(guò)來(lái)的狀態(tài)機(jī)中的值,在條件結(jié)構(gòu)的選擇器標(biāo)簽上→右鍵→為每個(gè)值添加分支建立標(biāo)簽。While 循環(huán)每執(zhí)行一次,讀取移位寄存器的值,下次循環(huán)用上次循環(huán)讀進(jìn)來(lái)的值。
設(shè)置條件結(jié)構(gòu)的選擇器標(biāo)簽為“Init”,將按鈕、狀態(tài)燈的初始化程序放入條件結(jié)構(gòu)中,選擇編程→字符串→空字符串常量賦值給read_buffer 清空顯示控件窗口,同樣清空write_buffer 輸入控件窗口,復(fù)制狀態(tài)機(jī)設(shè)置為Wait 狀態(tài)連接到移位寄存器。
(1) 在串口打開(kāi)失敗條件結(jié)構(gòu)中,增加狀態(tài)機(jī)并調(diào)整 為Wait 連接到移位寄存器。
(2) 在串口打開(kāi)成功(真)條件結(jié)構(gòu)中增加狀態(tài)機(jī)調(diào)整為GetData 連接到移位寄存器。
(3) 在關(guān)閉窗口條件結(jié)構(gòu)中,增加狀態(tài)機(jī)調(diào)整為Wait 連接到移位寄存器,在事件結(jié)構(gòu)中選擇器標(biāo)簽為[0]超時(shí)分支中,創(chuàng)建串口狀態(tài)局部變量和條件結(jié)構(gòu),檢測(cè)串口是否成功打開(kāi),如果打開(kāi)成功則轉(zhuǎn)到GetDate 狀態(tài),如果打開(kāi)失敗則轉(zhuǎn)到Wait 狀態(tài)。
在條件結(jié)構(gòu)接收數(shù)據(jù)GetData 程序框圖中,如果串口傳過(guò)來(lái)的數(shù)據(jù)不為0,則執(zhí)行條件結(jié)構(gòu)的“真”分支程序,將串口中的數(shù)據(jù)和字節(jié)總數(shù)傳輸給VISA 讀取控件,創(chuàng)建VISA 讀取控件的局部變量(其中存儲(chǔ)原有數(shù)據(jù))與新讀取的緩沖數(shù)據(jù)通過(guò)字符串連接控件連接后,傳輸給字符串顯示控件,狀態(tài)機(jī)Wait 狀態(tài)賦值給while 循環(huán)。程序運(yùn)行后實(shí)現(xiàn)接收數(shù)據(jù),見(jiàn)圖3。
圖3 數(shù)據(jù)接收模塊設(shè)計(jì)圖
(1) 在前面板增加發(fā)送按鈕send,在程序框圖事件結(jié)構(gòu)中增加[2]“send”值改變選擇器標(biāo)簽,當(dāng)串口狀態(tài)為真時(shí),將在寫(xiě)入控件write buffer 中輸入的字符串傳輸給VISA 寫(xiě)入控件,控制電機(jī)運(yùn)動(dòng)的字符串命令行格式為“電機(jī)序號(hào)”+“/”+“電機(jī)轉(zhuǎn)角”,實(shí)現(xiàn)串口發(fā)送。
(2) 進(jìn)行字符串操作,將寫(xiě)入控件write buffer中輸入的字符串命令行傳輸給字符串匹配模式控件,按照字符“/”截取出字符串命令行前端的電機(jī)序號(hào)用于控制相應(yīng)位置的狀態(tài)顯示燈亮滅,截取出字符串命令行前端的電機(jī)轉(zhuǎn)角數(shù)值顯示在相應(yīng)的數(shù)組元素,顯示電機(jī)目前的轉(zhuǎn)角;執(zhí)行操作后將狀態(tài)機(jī)GetData 狀態(tài)傳輸給while 循環(huán)。
(3) 當(dāng)串口狀態(tài)為假時(shí),執(zhí)行“請(qǐng)打開(kāi)串口”按鍵對(duì)話框,并將狀態(tài)機(jī)Wait 狀態(tài)傳輸給while 循環(huán)。
(4) 進(jìn)一步完善端口打開(kāi)模塊,在前面板增加波特率下拉菜單,右鍵→下拉列表→菜單下拉列表,右鍵→編輯項(xiàng),去掉有序值勾選框,修改數(shù)據(jù)類型表示法為U64,在編輯項(xiàng)增加9600、115200 等波特率選項(xiàng),見(jiàn)圖4。
圖4 數(shù)據(jù)發(fā)送模塊設(shè)計(jì)圖
該設(shè)計(jì)完整實(shí)現(xiàn)了項(xiàng)目任務(wù)的各項(xiàng)要求和目標(biāo)設(shè)定,測(cè)試過(guò)程如下:
(1) 使用虛擬串口軟件虛擬出兩個(gè)tw 串口,使用串口調(diào)試助手打開(kāi)com1,使用本分揀機(jī)器人控制軟件打開(kāi)com2,狀態(tài)燈點(diǎn)亮成功。
(2) 使用串口調(diào)試助手發(fā)送字符串“hello mainmotor!”,使用本設(shè)計(jì)發(fā)送字符串“3/1500”,雙方收發(fā)成功,表明串口通信功能測(cè)試成功,程序中的狀態(tài)機(jī)和事件結(jié)構(gòu)設(shè)計(jì)和運(yùn)行正確。
(3) 第三個(gè)顯示電機(jī)運(yùn)行狀態(tài)的指示燈點(diǎn)亮,第三個(gè)顯示電機(jī)轉(zhuǎn)角的數(shù)組顯示“1500”,表明程序該項(xiàng)功能測(cè)試成功,字符串操作和數(shù)組操作設(shè)計(jì)和運(yùn)行正確。
(4) 點(diǎn)擊“save”按鈕存儲(chǔ)write_buffer 中的字符串命令行到文件中,再點(diǎn)擊“open_txt”按鈕打開(kāi)該文件,內(nèi)容在txt_show 中正確顯示,表明本程序的I/O 文件功能測(cè)試成功。
采用Arduino 開(kāi)發(fā)板作為控制板通過(guò)USB 串口連接到電腦,應(yīng)用2 個(gè)TBS-K20 舵機(jī),1 個(gè)TBSNK15 舵機(jī),3 個(gè)42 行星減速步進(jìn)電機(jī),2 個(gè)DSP 數(shù)字式步進(jìn)電機(jī)驅(qū)動(dòng)器DM542,搭建分揀機(jī)器人,構(gòu)成測(cè)試硬件環(huán)境,見(jiàn)圖5。經(jīng)過(guò)測(cè)試后達(dá)到同軟件測(cè)試相同的效果,測(cè)試數(shù)據(jù)見(jiàn)表1。
表1 硬件環(huán)境測(cè)試數(shù)據(jù)
圖5 硬件環(huán)境測(cè)試
本文采用虛擬儀器技術(shù)的LabView 軟件設(shè)計(jì)工具,快速實(shí)現(xiàn)了分揀機(jī)器人的控制軟件,實(shí)現(xiàn)了物品抓取、分揀和工作流程數(shù)據(jù)存儲(chǔ)等功能,經(jīng)軟件和硬件雙重環(huán)境測(cè)試,本控制軟件操作簡(jiǎn)單、運(yùn)行狀態(tài)穩(wěn)定,達(dá)到了項(xiàng)目任務(wù)書(shū)的設(shè)計(jì)要求。面對(duì)目前需求多樣化的機(jī)器人市場(chǎng),通過(guò)該方法可以快速設(shè)計(jì)出符合項(xiàng)目要求的機(jī)器人配套操作軟件,提高控制軟件質(zhì)量和項(xiàng)目研發(fā)效率。