王 飛 裴海龍
(華南理工大學自動化科學與工程學院,廣東廣州 510640)
PLC是數控系統和數控機床間的常用接口,主要是處理各種開關量信息。它根據數控系統內部系統的狀態和外部行程開關、傳感器、按鈕等開關量的狀態,按照用戶預先規定的邏輯關系,對機床的冷卻、潤滑、主軸等進行控制[1-2]。本文中的軟 PLC系統基于RTLinux實時操作系統,采用IEC 1131-3標準,采用C語言和GTK語言進行代碼的編寫。該系統基于華南理工大學自動化學院的HL-B0408數控系統進行設計,并成功應用于該系統。實驗表明,該系統可以滿足現有數控系統的要求。
正如上面提到的該軟PLC系統是應用于HLB0408數控系統,在此對HL-B0408數控系統進行簡單介紹。HL-B0408數控系統是由華南理工大學自動化學院開發的一款高精度、高性能的數控系統,系統由多個功能模塊組成,分別為人機交互的圖形用戶接口模塊,任務解析和調度模塊,開關量傳輸模塊,開關量輸入輸出及運動控制模塊,各模塊之間的結構如圖1所示。
GUI(圖形用戶接口)的主要功能是提供一個友好的圖形畫面,顯示諸如位置、模式、刀跡模擬等信息;同時實現了人機交互功能,接受外部用戶指令,如文字輸入,開關、按鈕動作等。并且將用戶的動作轉化為相應的內部指令,然后傳送給數控軟件的主體程序并由主體程序來實現;同時,從圖1還可以看到NC代碼往任務解析模塊發送也是通過GUI部分實現。

任務解析和調度模塊由解析和調度兩部分組成。任務解析模塊主要由解析器組成,主要完成對GUI傳送過來的NC代碼隊列的解析,把NC代碼隊列轉化成開關量模塊和運動控制模塊能夠識別的命令隊列。任務調度模塊主要完成的功能是把任務解析模塊產生的開關量信息(冷卻、潤滑、回零等)和運動控制信息(進給量等)分別發到開關量模塊和運動控制模塊。
開關量輸出和運動控制模塊是一個實時模塊,主要實現開關量輸出和插補運算功能。根據插補運算和控制算法產生的加工軌跡,并通過驅動程序產生相應的脈沖信號驅動伺服電動機進行位置控制。
開關量輸出和運動控制模塊主要完成運動控制的功能,而運動控制要求很高的實時性,但原 HLB0408數控系統中因為加入了開關量的輸出而對實時性造成了一定程度的影響。所以本課題便提出了利用軟PLC實現開關量的輸出,從而在一定程度上解放運動控制模塊。改進前后系統軟硬件接口分別如圖2、3所示。


根據功能要求,該軟PLC系統應該由以下兩部分組成:梯形圖編輯界面和驅動模塊,下面分別介紹。
按照硬件PLC所具有的功能[1],筆者認為該軟件PLC梯形圖編輯界面應具有以下基本功能:
(1)實現梯形圖的繪制功能;
(2)實現新建、打開、保存和退出等功能;
(3)實現增加、刪除、修改編程頁面的功能;
(4)實現梯形圖中元器件的屬性修改功能;
(5)實現IO信號處理功能;
(6)實現手動控制觸點開斷功能。
根據以上功能要求,該平臺需有以下幾個功能模塊:梯形圖的繪制和顯示模塊,梯形圖編輯模塊,元器件屬性修改模塊,IO信號處理模塊和觸點控制模塊。這些模塊都由GTK實現其圖形界面顯示,并通過相應的存儲算法保存梯形圖信息。整個程序的流程如圖4所示。
各功能模塊的界面操作部分都是通過GTK+實現的。GTK+是一個圖形用戶編程的接口工具,可以和多種語言綁定,并且具有跨平臺移植的能力[3]。要實現繪制、修改、顯示梯形圖等功能,首先要解決的問題就是指令庫的問題。常用的PLC指令庫包括輸入觸點、輸出觸點、定時器、觸發器等,這些指令都是通過GTK+的畫圖功能畫出。
生成指令庫之后就可以在PLC編程頁面編制梯形圖,程序中把梯形圖編程頁面劃分為6×10個小格,指令器件的大小都和每個小格成倍數關系。除定時器和觸發器占用2×2個小格,比較器占用3×1個小格外,其他指令器件各占用一個小格。在后面我們將介紹之所以采用這種方式是為了方便存取梯形圖文件。
完成了梯形圖的繪制之后就要處理梯形圖的保存和打開功能,這也是編輯界面功能的核心。對于梯形圖文件的保存是采用寫文件的方式,即用fprintf()函數把梯形圖寫入指定文件,在文件中數據存儲時的順序按上面提到的6×10個小格(用兩層for循環實現)進行,數據存取的格式為data1-data2-data3-data4。其中data1代表元器件的類型,data2代表該元器件是否與上層元器件相連,data3代表該元器件的數據類型是bit還是word,data4則代表該類型元器件的編號。當然這樣的存取方式對于像輸入輸出觸點這樣的簡單元器件不會有任何問題,但是當存儲例如定時器和觸發器這樣的“大元器件”時則會出現以下兩個問題:
首先,對于像定時器和觸發器這些“大元器件”,除了上面提到的基本信息之外,還需要存儲另外的信息。以定時器為例,我們定義了如下結構體:

由上面的結構體就可以看出,對于定時器不但要存儲它的基本信息,還要存儲例如Base(基底即換算倍數)、Preset(預設值)、InputEnable(輸入使能端信息)等。因此我們建立了一個新的文件timers用來保存 Base和 Preset,則 Value=Base*Preset,用來顯示定時器的設定值。
其次對于“大元器件”它們占了不止一個小格,這就會導致存儲時的重復存儲,當下次讀取時就會出現問題,將會出現元器件重疊的現象。在此采取的方法是當檢測到“大元器件”時,只有左上角的小格保留信息,其它置空。
當進行加載已有梯形圖操作時,首先利用下面一段代碼讀取梯形圖信息:


其中FileName中保存著梯形圖信息,操作完成后,梯形圖信息存入指針Lineok中,接著再存入相應的結構體中即可。當然這要經過一系列的轉換,例如如何從數字信息得到元器件的信息。在此不贅述。
完成了梯形圖的繪制以后,如果沒有信號處理功能,也只是把一堆毫無聯系的東西放在了一起。下面就介紹該軟件中是如何處理信號的。首先看一下保存元器件信息的結構體:

在處理信號的過程中,是通過檢測上個元器件的輸出即DynamicOutput是否為1來決定該元器件的DynamicInput,是 1,則 DynamicInput=1,否則 DynamicInput=0。對于簡單的元器件DynamicOutput=DynamicInput,而對于定時器和觸發器等較復雜的器件,則還需檢測DynamicState和DynamicVarBak,才能確定輸出。
由圖3可以看到,該系統的驅動模塊主要是用來完成開關量的接收(來自數控系統上層模塊)和發送(發至底層硬件模塊)。
上層開關量信號的接收是通過RTLinux提供的mbuffer共享內存機制實現的。mbuffer實現了內核模塊和用戶空間之間內存的通信,在上層模塊和驅動模塊中分別定義一片起始地址相同的內存空間,即如下所示:

其中Commonbuffer是申請內存空間的起始標識,這樣當上層模塊向內存IO_buffer中寫入命令時,便可以相應的從Plc_buffer中讀出。
開關量的下發主要是讀寫總線的操作。該系統所用總線為PC104總線,在發數據時首先要發一個控制字,選通相應的寄存器,然后再發數據到寄存器,這兩個操作都是通過RTLinux提供的rtl_outb函數實現的。這個函數實現了字節的發送(發往并口),但是因為開關量操作都是位操作的,所以當發送數據時,首先要屏蔽其他沒有操作的位。這里使用以下代碼實現屏蔽位的操作:

其中:index是要發的IO信息處于一個發送字節的第幾位;value標示是發1還是發0;outByte是最終發往底層的數據。
對以上設計的軟PLC系統進行編譯,生成可執行程序(對應界面顯示部分)和可加載模塊(對應驅動部分),并在數控系統的啟動腳本中加入以上兩部分,就可以正常使用軟PLC系統了。正常啟動數控系統和軟PLC系統的梯形圖如圖5所示(因全圖比較大,這里只是顯示部分梯形圖)。

圖5中I對應數控系統是I/O輸出,對應該軟PLC系統則為I/O輸入,后面的數字是數控系統主板FPGA上為I/O輸出提供的端口號,它在一定范圍內是可變的,在這里44代表急停信號,45代表主軸制動信號,46為冷卻,50代表超程,當數控系統剛啟動時要求急停開(I44顯示紅色),主軸制動開(I45顯示紅色)。由圖5很明顯可以看到該軟PLC系統實現了正常啟動時I/O信號的發送。下面再做一個簡單的測試,在數控GUI上關閉急停按鈕,并輸入測試G代碼M8(代表冷卻),可以得到圖6所示結果。從圖中可以看到急停關閉(I44紅色消失),冷卻打開(I46顯示紅色)。

通過實際的檢驗,該軟PLC系統能準確、快速地實現I/O信號的處理,并且使原數控系統的實時性有了較大的提高。
PLC在處理數控機床開關量方面具有重要的作用,但由于其高昂的價格,再加上不同PLC廠家的產品通用性較差,導致其使用受到了一定的限制。但該軟PLC系統的提出解決了這一難題。該系統運用全軟件實現PLC的功能,可移植性較好,不但提高了數控系統的可靠性,并且充分降低了生產成本,具有很高的實際用途。
[1]謝克明.可編程序控制器原理與程序設計[M].北京:電子工業出版社,2002.
[2]周凱.PC數控原理、系統及應用[M].北京:機械工業出版社,2006.
[3](美)洛根編著,戰曉蘇,等譯.Gtk+程序設計(C語言版)[M].北京:清華大學出版社,2002.
[4]王強.基于RTLinux的軟件 PLC系統研究[D].成都:四川大學,2005.
[5]趙鴻玢.開放式數控系統軟PLC的設計與實現[D].沈陽:中國科學院沈陽計算機研究所.