李飛江,李翔龍
(四川大學(xué) 制造科學(xué)與工程學(xué)院,成都 610065)
隨著人們對(duì)工業(yè)生產(chǎn)中的自動(dòng)化程度要求越來(lái)越高,運(yùn)動(dòng)控制器的發(fā)展得到了越來(lái)越廣泛的重視。如今,國(guó)內(nèi)外的運(yùn)動(dòng)控制器種類(lèi)已是多種多樣。雖然運(yùn)動(dòng)控制器的多樣化給用戶帶來(lái)了一定的好處,方便用戶在構(gòu)建運(yùn)動(dòng)控制系統(tǒng)時(shí),可以選擇合適的控制器。然而長(zhǎng)期以來(lái),運(yùn)動(dòng)控制市場(chǎng)缺乏統(tǒng)一的編程標(biāo)準(zhǔn)[1],各個(gè)廠商的提供的控制器編程語(yǔ)言大多基于類(lèi)Basic語(yǔ)言、C語(yǔ)言等高級(jí)編程語(yǔ)言,也有部分廠商采用G代碼作為編程語(yǔ)言[2]。這些復(fù)雜的編程語(yǔ)言一方面限制了運(yùn)動(dòng)控制器的通用性,另一方面提高了對(duì)編程人員的要求,大多程序的開(kāi)發(fā)只能由高水平的編程人員才能完成,嚴(yán)重影響了程序的開(kāi)發(fā)效率。本系統(tǒng)以IEC61131-3標(biāo)準(zhǔn)定義的5種PLC編程語(yǔ)言中為基礎(chǔ)[3-4],采用符合該標(biāo)準(zhǔn)的PLCopen功能塊,成功實(shí)現(xiàn)了運(yùn)動(dòng)控制器的圖形化編程,大大降低了程序的開(kāi)發(fā)效率。即使在加工需求易變和專(zhuān)用運(yùn)動(dòng)控制行業(yè)中,用戶只需要學(xué)習(xí)簡(jiǎn)單的PLC編程,便能對(duì)控制系統(tǒng)的程序進(jìn)行自主開(kāi)發(fā)。
文獻(xiàn)[1]采用PLCopen功能塊,提出一種圖形化編程的運(yùn)動(dòng)控制系統(tǒng),但該系統(tǒng)是基于beremiz開(kāi)源開(kāi)發(fā)平臺(tái)實(shí)現(xiàn)的,導(dǎo)致其存在操作復(fù)雜,與window系統(tǒng)存在不兼容等問(wèn)題。同時(shí)該文獻(xiàn)最終只驗(yàn)證了單軸功能塊的可行性,并沒(méi)有對(duì)多軸功能塊進(jìn)行研究。本文使用德國(guó)KW-Software公司開(kāi)發(fā)的符合IEC61131-3標(biāo)準(zhǔn)的MLUTIPROG軟件作為控制系統(tǒng)開(kāi)發(fā)平臺(tái),該軟件使用方便[5-7],配合自行研發(fā)的“Assistnt”軟件,成功實(shí)現(xiàn)PLCopen規(guī)范中的多軸功能塊。最后利用該控制器完成了對(duì)貼標(biāo)機(jī)的運(yùn)動(dòng)控制,證明了該控制器具有極大的市場(chǎng)應(yīng)用空間,值得推廣。
整個(gè)控制系統(tǒng)由人機(jī)界面交互層、應(yīng)用指令層、運(yùn)動(dòng)控制層、設(shè)備驅(qū)動(dòng)層4大部分組成,如圖1所示。
圖1 控制系統(tǒng)的整體構(gòu)成
人機(jī)界面交互層包括MLUTIPROG軟件和自主研發(fā)的Assistant軟件,其中MLUTIPROG用來(lái)調(diào)用PLCopen標(biāo)準(zhǔn)運(yùn)動(dòng)功能塊,Assistant則用來(lái)為控制器連接的電機(jī)設(shè)置軸號(hào)、軸組號(hào)等參數(shù)。二者相互配合才能實(shí)現(xiàn)多軸控制和多軸功能塊的功能。應(yīng)用指令層包含了所有PLCopen標(biāo)準(zhǔn)的單軸和多軸功能塊,每個(gè)功能塊根據(jù)功能的不同,有的用來(lái)實(shí)現(xiàn)電機(jī)的運(yùn)動(dòng)控制(MC_Home),有的用來(lái)設(shè)置和查詢電機(jī)的狀態(tài)(MC_ReadActualPosition)。運(yùn)動(dòng)控制層用來(lái)處理運(yùn)動(dòng)相關(guān)的參數(shù),如:位移、速度加速度等。通過(guò)內(nèi)部算法,實(shí)現(xiàn)電機(jī)的S型和T型升降速,防止電機(jī)速度出現(xiàn)大的波動(dòng)和位置出現(xiàn)偏差,保證電機(jī)運(yùn)動(dòng)的精確性。同時(shí)運(yùn)動(dòng)控制層還根據(jù)所調(diào)用運(yùn)動(dòng)功能塊的不同,自動(dòng)切換電機(jī)工作于位移模式、速度模式或周期同步模式。設(shè)備驅(qū)動(dòng)層用來(lái)接收從運(yùn)動(dòng)控制層傳遞下來(lái)的數(shù)據(jù),然后將這些數(shù)據(jù)映射至不同的控制器硬件設(shè)備及現(xiàn)場(chǎng)總線設(shè)備中。4個(gè)部分協(xié)調(diào)工作,最終實(shí)現(xiàn)通過(guò)上層調(diào)用的圖形化指令就能完成對(duì)電機(jī)的控制。
PLCopen規(guī)范功能塊按其功能可分為管理型功能塊和運(yùn)動(dòng)型功能塊,管理型功能塊主要用來(lái)檢查軸的狀態(tài)和設(shè)置軸的運(yùn)動(dòng)參數(shù),運(yùn)動(dòng)型功能塊主要是根據(jù)設(shè)置的速度、位置、加速度等實(shí)現(xiàn)軸的運(yùn)動(dòng)。按其操作軸的數(shù)量則可以分為單軸功能塊和多軸功能塊,單軸功能塊只能控制一個(gè)軸,而多軸功能塊能控制2~4軸。
所有功能塊均由輸入/輸出變量、輸入變量、輸出變量、內(nèi)部算法、功能塊類(lèi)型名5大部分組成[8-9],其模型如圖2所示。每個(gè)變量的作用和數(shù)據(jù)類(lèi)型都是確定的,其中輸入/輸出變量是一個(gè)用來(lái)保存軸參數(shù)的結(jié)構(gòu)體。在單軸功能塊中,它是一個(gè)名為AXIS_REF的結(jié)構(gòu)體。系統(tǒng)在該結(jié)構(gòu)體中定義了一個(gè)成員AxisNo(軸號(hào)),用來(lái)確定功能塊的控制對(duì)象,它具有唯一性,且程序運(yùn)行過(guò)程中不能被更改。一旦功能塊的該參數(shù)被賦值,此功能塊就只能控制具有相同軸號(hào)的電機(jī)。在多軸功能塊中,它是一個(gè)名為AXIS_GROUP_REF的結(jié)構(gòu)體,系統(tǒng)在該結(jié)構(gòu)體中定義了軸組號(hào)(AxisGroupNo)、軸的數(shù)量(AxisNum)、各軸軸號(hào)(AxisNoArray)三個(gè)成員。通過(guò)這三個(gè)參數(shù)就能在調(diào)用多軸功能塊時(shí),確定被控電機(jī)的對(duì)象,順利實(shí)現(xiàn)多軸功能塊。內(nèi)部算法和功能塊的接口是兩個(gè)獨(dú)立的部分,不僅能為上層提供統(tǒng)一的編程接口,而且實(shí)現(xiàn)功能塊的跨平臺(tái)移植時(shí),只需要更改不同硬件平臺(tái)的操作硬件部分的代碼,使移植變得簡(jiǎn)單。本控制器的內(nèi)部算法是被封裝起來(lái)的,用戶不需知道其具體內(nèi)容,只需操作功能塊的輸入接口便能實(shí)現(xiàn)相應(yīng)的功能。
圖2 PLCopen標(biāo)準(zhǔn)功能塊模型
本系統(tǒng)使用嵌入在VS2012中的C#模板完成各功能塊輸入輸出接口的定義,經(jīng)過(guò)編譯后會(huì)生成一個(gè)保存有功能塊接口信息的FWL格式固件庫(kù)文件和3個(gè)C++文件。其中一個(gè)C++文件是用來(lái)編寫(xiě)內(nèi)部算法的重要文件,它是連接功能塊外部接口和內(nèi)部算法的橋梁。以MC_Power為例,在該C++文件中會(huì)生成void __PInvoke__MS_PLCopen_LIB::M C_Power::__Init()和void __PInvoke__MS_ PLCopen_LIB::MC_Power::__Process()兩個(gè)函數(shù)。前者的函數(shù)內(nèi)部是不能更改的,而后者的函數(shù)內(nèi)部則用來(lái)編寫(xiě)功能塊的內(nèi)部算法,內(nèi)部算法的編寫(xiě)以實(shí)現(xiàn)PLCopen標(biāo)準(zhǔn)所規(guī)定的功能塊的功能為目的,其設(shè)計(jì)流程圖如圖3所示。3個(gè)C++文件在定制的ProConOS eCLR工程中被編譯后,會(huì)生成一個(gè)exe文件,將該文件下載到控制器中。然后只要將FWL文件添加MLUTIPROG軟件的固件庫(kù)中,便完成了PLCopen功能塊庫(kù)的開(kāi)發(fā)。開(kāi)發(fā)完成的功能塊不僅和PLCopen標(biāo)準(zhǔn)功能塊的模型、功能完全一樣。同時(shí)使用方便,只需將其拖動(dòng)至MLUTIPGOG工程的編程界面,然后設(shè)置實(shí)例名、輸入?yún)?shù)、輸出參數(shù),就能通過(guò)輸入引腳Enable或Execute啟動(dòng)功能塊。
圖3 內(nèi)部算法流程圖
調(diào)用多軸功能塊前,必須先通過(guò)Assistant軟件為控制器上連接的被控對(duì)象電機(jī)的軸號(hào)參數(shù)賦值。將設(shè)置了軸號(hào)的電機(jī)添加到一個(gè)軸組中,并為該軸組的軸組號(hào)賦值,就能通過(guò)多軸功能塊實(shí)現(xiàn)該軸組2~4軸直線或圓弧插補(bǔ)運(yùn)動(dòng)。編譯MLUTIPROG工程后,“Assistant”軟件會(huì)生成一個(gè)XML格式的文件,該文件保存了所有單軸和軸組參數(shù)的信息,將該文件和PLC工程一起下載到控制器便能完成這些參數(shù)的配置。
單軸功能塊在對(duì)一個(gè)電機(jī)進(jìn)行操作前,如果控制器只連接了一臺(tái)電機(jī),功能塊則判斷結(jié)構(gòu)體AXIS_REF中的AxisNo和硬件設(shè)備上連接的電機(jī)軸號(hào)(該軸號(hào)如果不通過(guò)Assistant設(shè)置,則默認(rèn)為0)是否相同,如果不相同,功能塊則無(wú)法實(shí)現(xiàn)對(duì)該軸的控制并報(bào)錯(cuò)。當(dāng)控制器上連接了多臺(tái)電機(jī)時(shí),系統(tǒng)會(huì)逐一判斷軸號(hào)是否相同,找到軸號(hào)相同的電機(jī)后停止判斷。如果找不到軸號(hào)相同的電機(jī)則會(huì)報(bào)錯(cuò)。當(dāng)多軸功能塊接收到啟動(dòng)命令時(shí),將根據(jù)存儲(chǔ)在AXIS_GROUP_REF中的參數(shù)AxisNum、AxisNoArray先找到連接在運(yùn)動(dòng)控制器上的被控電機(jī)。如果找不到相匹配的電機(jī),功能塊的輸出引腳Error則會(huì)給出錯(cuò)誤信號(hào)。當(dāng)找到相匹配的電機(jī)后,功能塊則會(huì)判斷這些電機(jī)的軸組號(hào)和結(jié)構(gòu)體AXIS_GROUP_REF中的AxisGroupNo是否相同,確認(rèn)軸組號(hào)相同后才會(huì)啟動(dòng)該功能塊,然后執(zhí)行功能塊的功能。因?yàn)镸LUTIPROG軟件中無(wú)法完成對(duì)電機(jī)相關(guān)參數(shù)的配置,所以僅僅依靠該軟件無(wú)法實(shí)現(xiàn)多軸控制和多軸功能塊的功能。自主研發(fā)的“Assistant”軟件則彌補(bǔ)這一缺陷。通過(guò)該軟件,不僅能為控制器上連接的電機(jī)軸號(hào)、軸組號(hào)賦值,還能為軸的部分運(yùn)動(dòng)參數(shù)賦值,例如,單位換算設(shè)置、操作設(shè)置、限位設(shè)置等,功能十分強(qiáng)大。
使用簡(jiǎn)單的梯形圖編程方法,就能在MLUTIPROG中驗(yàn)證多軸功能塊MC_MoveLinear_ Absolute。連接好硬件設(shè)備后,先在MLUTIPROG工程中編寫(xiě)好具體的PLC程序,然后在“Assistant”軟件中配置好單軸和軸組相關(guān)參數(shù)。編譯完成后,將其下載到控制器進(jìn)行測(cè)試。啟動(dòng)功能塊MC_MoveLinearAbsolute前,先設(shè)置它的輸入變量,令目標(biāo)位值Position=[100000,150000],目標(biāo)速度Velcity=20000(該速度為兩個(gè)軸的合速度),加速度Accelration =30000,減速帶Decelaratiion=30000,加加速度Jerk=50000,因?yàn)槠渌鼌?shù)的值對(duì)運(yùn)動(dòng)沒(méi)有影響,所以設(shè)置為默認(rèn)值(注意:本控制器中所有功能塊中的運(yùn)動(dòng)參數(shù)的計(jì)量單位均為脈沖P)。完成參數(shù)設(shè)置后,便通過(guò)引腳Execute啟動(dòng)該功能塊。在功能塊的執(zhí)行過(guò)程中采用MLUTIPROG軟件中的邏輯分析器繪制兩個(gè)軸的位移曲線(見(jiàn)圖4)和合速度曲線(見(jiàn)圖5)。由兩圖可知,兩個(gè)軸在相同的時(shí)間內(nèi),根據(jù)設(shè)置的的目標(biāo)位置和速度準(zhǔn)確平穩(wěn)的完成了運(yùn)動(dòng),成功實(shí)現(xiàn)了該多軸功能塊。
圖4 兩軸的位移曲線
圖5 合速度曲線
貼標(biāo)機(jī)的核心部分是將標(biāo)簽貼到傳送帶上的工件的貼標(biāo)機(jī)構(gòu)。標(biāo)簽輸送軸是間歇性運(yùn)動(dòng),當(dāng)傳感器檢測(cè)到工件即將到達(dá)貼標(biāo)位置,先啟動(dòng)延時(shí),延時(shí)結(jié)束后軸開(kāi)始轉(zhuǎn)動(dòng)。當(dāng)移動(dòng)距離達(dá)到標(biāo)簽的長(zhǎng)度距離后便停止,等待下一次觸發(fā)信號(hào)。為了保證標(biāo)簽整齊有效的貼在工件上,工件輸送軸的速度和標(biāo)簽輸送軸的速度必須相同,否則會(huì)出現(xiàn)標(biāo)簽錯(cuò)位和漏貼等現(xiàn)象。因?yàn)橘N標(biāo)簽的過(guò)程中涉及2個(gè)軸的運(yùn)動(dòng),屬于多軸控制,先使用Assistant軟件為兩軸賦值,標(biāo)簽輸送軸的軸號(hào)為1,工件輸送軸的軸號(hào)為2。程序中使用一個(gè)定時(shí)器(TON_1)來(lái)觸發(fā)標(biāo)簽輸送軸運(yùn)動(dòng),定時(shí)器的定時(shí)時(shí)間為傳感器與貼標(biāo)位置的距離(SensorDistance)除以軸的速度(Velocity)所得的值,這樣就能保證工件到達(dá)貼標(biāo)位置時(shí)標(biāo)簽軸剛好啟動(dòng)。工件輸送軸的運(yùn)動(dòng)由PLCopen標(biāo)準(zhǔn)功能塊MC_Velocity實(shí)現(xiàn),而標(biāo)簽輸送軸的運(yùn)動(dòng)由PLCopen標(biāo)準(zhǔn)功能塊MC_MoveReltive實(shí)現(xiàn),設(shè)置其輸入引腳Distance的值為標(biāo)簽的長(zhǎng)度(LableLength)。詳細(xì)的PLC程序執(zhí)行流程如圖6所示??梢?jiàn),采用本控制系統(tǒng)編寫(xiě)的PLC程序十分簡(jiǎn)單,只需調(diào)用幾個(gè)功能塊便能完成復(fù)雜的運(yùn)動(dòng)控制。即便是沒(méi)有任何開(kāi)發(fā)經(jīng)驗(yàn)的人,學(xué)習(xí)簡(jiǎn)單的PLC編程后,就能進(jìn)行獨(dú)立的程序開(kāi)發(fā)控制。
圖6 PLC程序流程圖
根據(jù)得到的MC_MoveLinearAbsolute功能塊的兩軸位移和合速度圖,充分證明了在Assistant的配合下,電機(jī)運(yùn)行平穩(wěn),成功實(shí)現(xiàn)了PLCopen標(biāo)準(zhǔn)功能塊中的多軸功能塊,展示了控制系統(tǒng)優(yōu)越的性能。最后開(kāi)發(fā)的貼標(biāo)機(jī)控制程序,則證明了本控制系統(tǒng)圖形化編程的優(yōu)勢(shì),不僅編程簡(jiǎn)單,大大提高了程序的開(kāi)發(fā)效率。同時(shí)多軸控制功能強(qiáng)大,只需對(duì)結(jié)構(gòu)體AXIS_REF中的AxisNo賦予不同的值,便能同時(shí)控制多達(dá)32個(gè)軸。但本控制系統(tǒng)只在ZYNQ-Soc(2個(gè)A9內(nèi)核+1個(gè)FPGA)+DDR3+EMMC為核心[10]構(gòu)成的運(yùn)動(dòng)控制器上驗(yàn)證了其可行性,下一步將對(duì)本控制系統(tǒng)的跨平臺(tái)移植進(jìn)行研究。