孫建業(yè),李法光,王朝偉
(沈陽(yáng)理工大學(xué)遼寧省高速切削工程技術(shù)研究中心,遼寧沈陽(yáng)110159)
組合機(jī)床是大批量生產(chǎn)機(jī)械產(chǎn)品的設(shè)備,具有高效率和經(jīng)濟(jì)性,應(yīng)用領(lǐng)域廣泛。組合機(jī)床一般采用多軸、多刀、多工序、多面或多工位同時(shí)加工的方式,生產(chǎn)效率比通用機(jī)床高幾倍至幾十倍。組合機(jī)床具有多個(gè)加工工位,同時(shí)對(duì)一個(gè)工件進(jìn)行加工,通常幾十秒可完成一個(gè)復(fù)雜零件的加工。多工位組合機(jī)每次開(kāi)機(jī)回零,不僅浪費(fèi)時(shí)間而且過(guò)程繁瑣,為此采用運(yùn)動(dòng)控制卡控制絕對(duì)值伺服電機(jī)。絕對(duì)值編碼器是一種直接編碼、絕對(duì)測(cè)量的檢測(cè)裝置,與增量脈沖編碼器不同,它是通過(guò)讀取絕對(duì)編碼盤(pán)、編碼尺的代碼信息指示絕對(duì)位置,電源斷電后,沒(méi)有積累差,所以位置信息不會(huì)丟失,不僅避免接線(xiàn)帶來(lái)的故障,提高機(jī)床的可靠性,而且減少輔助時(shí)間,具有高效性。
組合機(jī)專(zhuān)用數(shù)控系統(tǒng)為PC機(jī)與PMAC相結(jié)合形成并行雙CPU開(kāi)放式數(shù)控系統(tǒng)。MOTECα系列伺服驅(qū)動(dòng)器本身具備數(shù)據(jù)顯示、數(shù)據(jù)監(jiān)控、報(bào)警等基本功能,有兩個(gè)獨(dú)立的通訊接口,9針RS232/485串口JP3與控制器相連接,6針RS485串口JP4用于多個(gè)驅(qū)動(dòng)器之間的連接,如圖1所示。
圖1 控制器與多個(gè)驅(qū)動(dòng)器連接圖
MOTECα系列伺服驅(qū)動(dòng)器通信端口(9Px)RS485方式接線(xiàn)如表1所示。
表1 MOTECα(9Px)RS485方式接線(xiàn)
Modbus協(xié)議支持傳統(tǒng)的 RS-232、RS-422、RS-485和以太網(wǎng)設(shè)備等。ModBus協(xié)議有ASCII、RTU兩種模式,RTU模式因傳輸效率高而在工業(yè)領(lǐng)域中應(yīng)用較廣。RTU模式對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)時(shí),串行協(xié)議中除有奇偶校驗(yàn)外,還要采用16位CRC校驗(yàn)[2]。Modbus采用主從方式定時(shí)收發(fā)數(shù)據(jù),在實(shí)際使用中如果某Slave站點(diǎn)斷開(kāi)后(如故障或關(guān)機(jī)),Master端可診斷發(fā)現(xiàn),當(dāng)故障修復(fù)后,又可自動(dòng)接通。因此,Modbus協(xié)議的可靠性較好。
MOTECα系列伺服驅(qū)動(dòng)器底層軟件內(nèi)嵌標(biāo)準(zhǔn) ModBus通信協(xié)議。具有常用的01、02、03、05、06、0F、10號(hào)通信協(xié)議功能。當(dāng)伺服驅(qū)動(dòng)器與ModBus控制器成功連接后,控制器則很方便地利用通信協(xié)議對(duì)伺服驅(qū)動(dòng)器進(jìn)行參數(shù)設(shè)置和驅(qū)動(dòng)器狀態(tài)收取等,同時(shí)可采用RS-485方式進(jìn)行多機(jī)聯(lián)機(jī)控制。
Modbus RTU協(xié)議有24種命令,α系列伺服驅(qū)動(dòng)器只支持其中最常用的7種命令,這7種協(xié)議可滿(mǎn)足大多數(shù)控制器對(duì)伺服的控制。具體功能碼見(jiàn)表2。
表2 常用功能碼及其含義
本系統(tǒng)程序采用VB編寫(xiě),采用自上而下的模塊化設(shè)計(jì)方法,整個(gè)程序包括各種設(shè)備驅(qū)動(dòng)程序、通訊子模塊等[3]。Modbus協(xié)議要求區(qū)分設(shè)備的主從,主設(shè)備PC機(jī)與PMAC相結(jié)合的并行雙CPU開(kāi)放式組合機(jī)床數(shù)控系統(tǒng)作為上位機(jī),從設(shè)備絕對(duì)值式驅(qū)動(dòng)器作為下位機(jī),Modbus協(xié)議中包含CRC計(jì)算與驗(yàn)證、信息幀的編制和分解[4]。
通過(guò)RS485串口JP4用于多個(gè)驅(qū)動(dòng)器之間的連接,現(xiàn)以一個(gè)伺服驅(qū)動(dòng)和絕對(duì)值電機(jī)為例,介紹工控機(jī)和伺服驅(qū)動(dòng)之間的信息交換,詳細(xì)說(shuō)明編碼器位置的讀取方法。MOTECα系列伺服驅(qū)動(dòng)器通信數(shù)據(jù)格式為:半雙工方式、8個(gè)數(shù)據(jù)位、1個(gè)停止位、無(wú)校驗(yàn)位。通信波特率為 9600Bps、38400Bps、57600Bps、115200Bps 可選。為 方便Modbus控制器對(duì)伺服驅(qū)動(dòng)器進(jìn)行參數(shù)讀取和修改,α系列伺服驅(qū)動(dòng)器將參數(shù)號(hào)定義為地址,如參數(shù)PA60對(duì)應(yīng)參數(shù)地址為0x60,參數(shù)PA70對(duì)應(yīng)參數(shù)地址為0x70,其它參數(shù)同樣定義,即對(duì)伺服驅(qū)動(dòng)器地址如0x60的數(shù)據(jù)操作結(jié)果關(guān)聯(lián)到PA60號(hào)參數(shù)上,等同于對(duì)參數(shù)的操作。
(1)讀參數(shù)格式
發(fā)送:機(jī)號(hào)+功能碼+地址高8位+地址低8位+字個(gè)數(shù)高8位+字個(gè)數(shù)低8位+CRC低8位+CRC高8位
回發(fā):機(jī)號(hào)+功能碼+字節(jié)數(shù)+數(shù)據(jù)高8位+數(shù)據(jù)低8位+CRC低8位+CRC高8位
例:通過(guò)Modbus RTU 03號(hào)功能碼在α系列伺服驅(qū)動(dòng)器中讀取參數(shù),例當(dāng)前驅(qū)動(dòng)器參數(shù)PA50參數(shù)值為32,則讀取此參數(shù)通信格式為
發(fā)送:0x01 0x03 0x00 0x50 0x00 0x01 0x84 0x1B
回發(fā):0x01 0x03 0x02 0x00 0x20 0xB9 0x9C
(2)寫(xiě)參數(shù)格式
發(fā)送:機(jī)號(hào)+功能碼+地址高8位+地址低8位+字個(gè)數(shù)高8位+字個(gè)數(shù)低8位+字節(jié)數(shù)+字的值+CRC低8位+CRC高8位
回發(fā):機(jī)號(hào)+功能碼+字節(jié)數(shù)+數(shù)據(jù)高8位+數(shù)據(jù)低8位+CRC低8位+CRC高8位
例:Modbus RTU 06號(hào)功能碼為寫(xiě)單個(gè)寄存器功能協(xié)議,10號(hào)功能碼為寫(xiě)多個(gè)寄存器功能協(xié)議,在α系列伺服驅(qū)動(dòng)器中多數(shù)控制器采用10號(hào)功能碼進(jìn)行寄存器修改參數(shù),例將驅(qū)動(dòng)器PA50參數(shù)值修改為50,則寫(xiě)取此參數(shù)通信格式為
發(fā)送:0x01 0x10 0x00 0x50 0x00 0x01 0x02 0x00 0x32 0x2B 0xD5
回發(fā):0x01 0x10 0x00 0x50 0x00 0x01 0x01 0xD8
利用VB創(chuàng)建一個(gè)串口調(diào)試界面,如圖2所示。
圖2 串口調(diào)試界面
首先設(shè)置好串口、波特率、停止位、校驗(yàn)位等,定義發(fā)送和接收的格式都為16進(jìn)制格式。該絕對(duì)值電機(jī)為多圈電機(jī),圈數(shù)和單圈脈沖數(shù)分別存放在不同的地址0x8037、0x8026中,機(jī)床運(yùn)動(dòng)的實(shí)際位置是電機(jī)運(yùn)動(dòng)圈數(shù)乘以電機(jī)每轉(zhuǎn)的脈沖數(shù)再與單圈脈沖數(shù)求和的值。根據(jù)協(xié)議發(fā)送和接收的都是十六進(jìn)制的字符串,首先要在接收的字符串中提取電機(jī)轉(zhuǎn)數(shù)和單圈編碼器的十六進(jìn)制值,再轉(zhuǎn)化成十進(jìn)制值進(jìn)而計(jì)算得到機(jī)床實(shí)際的運(yùn)動(dòng)位置。
首先進(jìn)行串口初始化:
VB6.0MSComm控件是高級(jí)語(yǔ)言編寫(xiě)的串行通信程序和PC串口之間的橋梁,在應(yīng)用程序中嵌入MSComm控件,可完成串口的通信。使用MSComm控件時(shí),對(duì)輸入緩沖區(qū)或輸出緩沖區(qū)的數(shù)據(jù)進(jìn)行處理,可以是字符(comInputModeText)或Hex(comInputModeBinary)發(fā)送,字符方式是以Unicode碼發(fā)送,Hex是以二進(jìn)制流發(fā)送[5]。Mod-Bus RTU模式為十六進(jìn)制,發(fā)送接收都為 Hex(comInputModeBinary)方式,程序如:
圖3為以Hex方式進(jìn)行發(fā)送與接收時(shí)對(duì)應(yīng)程序流程圖[6]。
圖3 Hex方式進(jìn)行發(fā)送與接收時(shí)對(duì)應(yīng)程序流程圖
comInputModeBinary方式將Inputlen設(shè)為0,即全部讀入輸入緩沖區(qū)的內(nèi)容,對(duì)緩沖區(qū)中所有字節(jié)進(jìn)行計(jì)數(shù),將收到的字符進(jìn)行甄別,如果小于128數(shù),則不再讀入下一個(gè)字節(jié),如果大于128字節(jié)的數(shù),則繼續(xù)讀入下一個(gè)字節(jié),將前后兩個(gè)字節(jié)當(dāng)作一個(gè)字符處理,輸入的高字節(jié)放前,低字節(jié)放后。
通過(guò)StrHexToByteArray函數(shù)將字符串表示的十六進(jìn)制數(shù)據(jù)轉(zhuǎn)化為相應(yīng)的字節(jié)串,并返回轉(zhuǎn)化后的字節(jié)數(shù)。
通過(guò)MSComm1控件的OnComm函數(shù)將伺服驅(qū)動(dòng)回發(fā)的內(nèi)容顯示在接收區(qū)文本框。
首先設(shè)置串口調(diào)試窗口與絕對(duì)值式驅(qū)動(dòng)器相同的波特率,并將驅(qū)動(dòng)器PA90參數(shù)機(jī)器編號(hào)設(shè)定與代碼中機(jī)號(hào)相同。在發(fā)送區(qū)按Modbus協(xié)議發(fā)送一組規(guī)定的數(shù)據(jù)格式十六進(jìn)制數(shù)值,接收區(qū)回收到相應(yīng)的一組十六進(jìn)制值,按照格式發(fā)送一組十六進(jìn)制數(shù),讀取寄存器0x8026中單圈編碼器值,機(jī)號(hào)為1,采用03號(hào)功能碼讀取字地址,讀取從0x8026起的兩個(gè)字節(jié)值,CRC校驗(yàn)碼為0x000C。
如:發(fā)送區(qū):0x01 0x03 0x80 0x26 0x00 0x02 0x0C 0x00
接收區(qū):0x01 0x03 0x04 0x00 0x01 0x5F 0x90 0x8A 0x28
從接收區(qū)數(shù)據(jù)0x01 0x03 0x04 0x00 0x01 0x5F 0x90 0x8A 0x28看出單圈編碼器相對(duì)位置為0x00015F90,0x288A為CRC校驗(yàn)碼。
同樣對(duì)1號(hào)伺服驅(qū)動(dòng)器,用03號(hào)功能碼讀取地址0x8037的值,計(jì)算得到校驗(yàn)碼為0x041C。
如:發(fā)送區(qū):0x01 0x03 0x80 0x37 0x00 0x01 0x1C 0x04
接收區(qū):0x01 0x03 0x02 0x00 0x07 0xF9 0x86
從接收區(qū)數(shù)據(jù)0x01 0x03 0x02 0x03 0xE8 0xB8 0xFA看出多圈數(shù)為0x03E8,即自從上次驅(qū)動(dòng)器清零后電機(jī)總共轉(zhuǎn)了0x03E8圈,0xB8FA為校驗(yàn)碼。
這是對(duì)一個(gè)伺服驅(qū)動(dòng)器讀取編碼器絕對(duì)位置的方法,實(shí)際上包括多圈0x8037的值和單圈編碼器相對(duì)值0x8026,同理可用相同方法對(duì)其它伺服驅(qū)動(dòng)器的編碼器絕對(duì)位置進(jìn)行讀取。
通過(guò)VB編寫(xiě)的串口調(diào)試界面可以順利讀取驅(qū)動(dòng)器絕對(duì)位置,而組合機(jī)床數(shù)控系統(tǒng)開(kāi)機(jī)時(shí)就應(yīng)讀取到電機(jī)的絕對(duì)位置,所以把對(duì)伺服驅(qū)動(dòng)器讀取編碼器絕對(duì)位置的程序段,植入到組合機(jī)床數(shù)控系統(tǒng)主界面的加載程序中,即系統(tǒng)開(kāi)機(jī)時(shí)首先讀取絕對(duì)值位置。
組合機(jī)床數(shù)控系統(tǒng)的電機(jī)實(shí)際位置都存在PMAC卡的Mx62變量中,以1號(hào)電機(jī)為例,在系統(tǒng)啟動(dòng)時(shí)對(duì)伺服驅(qū)動(dòng)器讀取編碼器絕對(duì)位置并賦予變量M162中,使系統(tǒng)記憶當(dāng)前位置,即實(shí)現(xiàn)了電機(jī)1開(kāi)機(jī)無(wú)需回零,即可從當(dāng)前記憶的絕對(duì)值位置開(kāi)始加工。
在系統(tǒng)啟動(dòng)時(shí)讀取編碼器絕對(duì)位置的程序段[7-8]:
在系統(tǒng)主界面坐標(biāo)系顯示實(shí)際絕對(duì)值位置:
同樣方法,可實(shí)現(xiàn)其它工位的電機(jī)開(kāi)機(jī)讀到絕對(duì)值位置,并保存到系統(tǒng)變量Mx62地址中,完成組合機(jī)床自動(dòng)化加工。
組合機(jī)床采用自上而下的模塊化設(shè)計(jì)方法,使主設(shè)備PC機(jī)與PMAC相結(jié)合的并行雙CPU開(kāi)放式數(shù)控系統(tǒng)作為上位機(jī),從設(shè)備絕對(duì)值式驅(qū)動(dòng)器作為下位機(jī),完成上位機(jī)對(duì)下位機(jī)的絕對(duì)位置數(shù)值的讀取,并加載到系統(tǒng)加工程序中,實(shí)現(xiàn)了組合機(jī)床的無(wú)回零自動(dòng)化加工,進(jìn)一步提高了組合機(jī)床的效率及可靠性。
[1]王立紅.基于PLC的步進(jìn)電機(jī)行程控制[J].組合機(jī)與自動(dòng)化加工技術(shù)[J],2008(11):44-46.
[2]潘洪躍.基于MODBUS協(xié)議通信的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)量技術(shù),2002(4):37-38.
[3]李江全,湯智輝,朱東芹.VisualBasic數(shù)據(jù)采集與串口通信測(cè)控應(yīng)用實(shí)戰(zhàn)[M].北京:人民郵電出版社,2011.
[4]王念春.基于Modbus協(xié)議的PC與下位機(jī)PLC間的通信程序[J].自動(dòng)化儀表,2001,22(8):44-46.
[5]羅朝盛,余文芳.Visual Basic6.0程序設(shè)計(jì)基礎(chǔ)教程[M].北京:人民郵電出版社,2005.
[6]張輝,李榮利,王和平.Visual Basic串口通信及編程實(shí)例[M].北京:化學(xué)工業(yè)出版社,2011.
[7]DELTA TAU Data System Inc.PCOMM32PRO[M].USA:DELTA TAU Data System Inc,2003.
[8]DELTA TAU Data System Inc.PMAC SOFTWARE REFERENCE MANUAL[M].USA:DELTA TAU Data System Inc,2004.