1 引言
近年來,嵌入式系統在工業控制領域的應用越來越廣泛。隨著嵌入式控制系統的發展,嵌入式控制系統將在一定程度上取代現有的工業PC控制系統,在微型TDCS(集散控制系統)、現場總線系統、PLC控制系統、智能化儀表等領域得到廣泛的應用。由于其相對于大型的TDCS系統來說具有較強的成本優勢和靈活性,其應用領域正在進一步擴大。本文建立了一套完整的嵌入式控制系統軟件平臺,該平臺建構于嵌入式硬件系統之上,包括嵌入式實時操作系統、軟PLC系統、嵌入式組態軟件等。
平臺包括運行環境和開發環境兩部分。使用開發環境,用戶可以方便組態和二次開發,而將開發重點集中到具體的控制系統應用上,而諸如系統的軟件架構設計、實時性保證、通用的控制系統軟件如網絡通信、控制算法等復雜而繁瑣的軟件工作,則交由平臺完成。
2.3平臺的總體框架
嵌入式控制系統平臺是以嵌入式實時操作系統為核心,包括硬件平臺、硬件驅動、圖形庫運行環境、實時數據庫管理與通信、人機界面、軟PLC、網絡通信、用戶應用程序等。
嵌入式控制系統平臺總體框架如圖1所示。
圖1嵌入式控制系統軟件平臺總體框架
由圖1可知,嵌入式控制系統軟件平臺主要包括以下部分:
(1) 嵌入式硬件平臺? (2) 嵌入式實時操作系統? (3) 硬件驅動程序 (4) 圖形庫與運行環境? (5) 實時數據庫管理與通信? (6) 人機界面 (7) 軟PLC? (8) 網絡通信? (9) 用戶應用程序
3嵌入式控制系統軟件平臺主要模塊的實現
嵌入式控制系統軟件平臺是個非常復雜的系統,從總體框架圖可以看出平臺包括實時操作系統、實時數據庫管理與通信、圖形庫與運行環境、人機界面等許多模塊,本章著重介紹嵌入式實時操作系統、實時數據庫管理與通信等模塊的實現。
3.1嵌入式Linux實時操作系統
Linux是一種能運行于多種平臺、功能強大、源代碼公開、免費的操作系統,基于Linux開發一個開放的、標準的、高效廉價的實時操作系統是完全可行的。本文介紹的嵌入式控制系統軟件平臺就采用嵌入式Linux實時操作系統,使用雙內核RTAI解決方案。RTAI的實現方案類似于RT-Linux,是雙內核系統,即利用Linux內核,同時增加一個實時內核,兩個內核共同工作。RTAI利用Linux提供的內核模塊機制完成實時任務,提供實時服務。模塊是內核的一部分,但是沒有被編譯到內核里去。模塊被編譯成一組目標文件,根據需要,這些文件能夠被插入到正在運行的內核中,也可以從正在運行的內核中移去。RTAI實現的主要模塊有RTAI核心模塊、RTAI調度器模塊、RTAI先進先出模塊、RTAI共享內存模塊和LXRT模塊等。
3.1.3基于RTAI的Linux實時操作系統的實現
我們實現基于RTAI的Linux實時操作系統的過程是:在標準Linux的基礎上,打上RTAI的實時補丁包,根據特定硬件條件和運行環境的要求進行適當的配置,再對內核進行裁剪后編譯成一個支持實時性的內核。
3.1.4基于RTAI-Linux的應用程序開發
在編寫基于RTAI-Linux的應用程序時,根據實時系統的具體要求,將應用程序分為實時任務和非實時任務。實時任務是實時模塊,作為Linux核心可加載模塊運行在核心態。一般地,定義init_module()函數,它在執行insmod命令裝載模塊時被調用,在該函數中一般是作一些初試化工作,并且啟動實時任務。同樣的,還需要定義cleanup_module()函數,它在執行rmmod卸載模塊時被調用,在該函數中一般是做一些資源釋放工作。實時任務的設計應該盡可能簡單,僅包含那些有強實時要求的處理模塊,如實時數據采集、外部設備控制等。
非實時任務是普通的Linux進程,它在用戶態運行,運行那些對實時要求不高的任務,如數據處理、圖形顯示等。
實時任務(RTAI核心態)并不能直接調用系統調用,它必須通過特定的方法和非實時任務(Linux進程)進行通信。它們可以通過共享內存和FIFO等方法通信。
基于RTAI應用程序的結構圖如圖2所示。
圖2 RTAI應用程序結構圖
3.2實時數據庫管理與通信
本系統的實時數據庫管理著全局I/O數據。通過硬件驅動程序,將數據采集,并放入到實時數據庫中,同時,上層軟件從實時數據庫中獲得數據。
3.2.1數據結構設計
實時數據庫與其他一般數據庫一樣,包含一組對象及其結構,由于目前對實時數據庫還沒有提出統一的數據模型,所以不同廠家開發的數據庫的數據結構都有很大差別。本系統的實時數據庫,一個基本的數據對象為“數據”,一個數據包含若干信息,如數據名稱、數據類型、數據位置、數據長度等。
考慮到數據的存取效率,程序運行一開始,我們將在內存區開辟一段緩沖區,緩沖區中只存放數據,如果緩沖區大小不夠,即緩沖區的數據較多,可以自動擴展緩沖區大小。實時數據存放在緩沖區時,我們采取這種思想:如果不是bit型數據,由于數據長度都是字節的整數倍,存入緩沖區中以字節來進行存儲,該數據的長度length是以字節來計算。如果是bit型數據,存入緩沖區中,該數據的長度length是以位來計算,接著再存儲一個實時數據,若為非bit型數據,則從下一個字節開始存放,即原來的bit型數據占用一個字節,若為bit型數據,根據此數據的長度來判斷其存放位置,這里又分兩種情況,如果這兩個bit型數據的長度沒有超過8位,則緊接著前一個bit型數據后存儲這個bit型數據,如果兩個bit型數據的長度超過8位,則從下一個字節開始存放,即原來的bit型數據占用一個字節。
3.2.2數據存取設計
為了存取方便,我們將所有的實時數據組成一個鏈表,鏈表的節點類型為上述的rtdb_data_t結構。當向實時緩沖區中加入一條數據時,就自動會計算出數據存儲位置、長度等信息,并在實時數據庫鏈表中加上一個節點。這樣,取實時數據就非常靈活和方便,如果知道實時數據的名稱,則可以遍歷鏈表得到數據,如果知道數據的存儲位置和長度,則可以利用實時數據庫提供的接口直接從緩沖區中獲得數據,而不必遍歷鏈表,因為遍歷鏈表需要花費一些時間,這在實時性要求較高的本系統中不太適合,所以本系統常常采用后一種方法存取數據。實時數據庫鏈表結構如圖3所示。
圖3實時數據庫鏈表結構
3.3人機界面軟件
人機界面模塊是本系統重要的部分,它提供用戶與底層控制的交互平臺。
3.3.1人機界面數據庫
人機界面數據是指與界面相關的數據,包括全局I/O數據和內存數據。I/O數據指的是需要系統和其它應用程序(包括I/O服務程序)交換數據的變量,與實時數據庫中的全局I/O數據相似。內存變量是只在系統內需要的變量,比如計算過程的中間變量。為了存取方便,我們使用鏈表來組織人機界面數據,形成兩個鏈表:I/O數據鏈和內存數據鏈。人機界面數據庫也是依據XML配置文件hmidb.xml來填充的,XML配置文件來自于開發環境。
3.2.2界面圖元
圖元是構成畫面的基本元素,包括基本圖元,如線條、矩形、橢圓等,以及組合圖元,如油罐、閥門等,它們是由基本圖元組合而成。本系統提供了大量的圖元,這些圖元的繪制將調用特定系統下的平臺函數,如Linux系統和Windows CE系統,即對于用戶來說,不管使用哪個系統,這一層是相同的。
描述人機界面需要一個XML配置文件,如hmiwidget.xml,這個配置文件是用戶在開發環境中設計界面時生成的。系統還支持圖元的變化,即動態屬性,以及事件響應。因此人機界面圖元還有動態屬性和事件屬性,解析配置文件hmiwidget.xml時,會分析這些屬性,并將其鏈起來。
在系統初始化時,MiniGUI分為兩種情況:服務器(Server)和客戶端(Client)。這主要取決于全局變量mgServer的值,如果為TRUE,表示為服務端,如果為FALSE,表示為客戶端。我們將MiniGUI應用程序名改為mginit,則該應用程序為服務端,如果MiniGUI應用程序名作為客戶端運行,則必須先運行MiniGUI提供的服務端程序mginit。
圖4 MiniGUI應用程序流程
本文作者創新點:
本文討論的嵌入式控制系統軟件平臺是一個復雜、龐大的系統,而且每個組成部分其內部結構和實現也非常復雜。我在此課題中做了很多研究,提出了系統設計的框架,如今已經實現部分為: 嵌入式Linux實時操作系統、實時數據庫管理與通信、圖形庫與運行環境等,取得了優秀的成果。
評論