歐習洋,王新華,侯興哲,劉金濤,張進,陳堅
(1.國網重慶市電力公司電力科學研究院,重慶401123;2.深圳市中電電力技術股份有限公司,廣東 深圳518040)
作為智能電網最基礎、最關鍵的設備之一,電能表逐步從傳統(tǒng)意義上的單一功能的電能計量器具,發(fā)展成為集電能計量、用電信息上傳、費控、事件監(jiān)測與記錄、負荷記錄、防竊電、互動用電等多種功能于一體的智能終端設備。運行經驗表明,軟件復雜度越高,其故障率也越高。據(jù)統(tǒng)計,多功能電表、負控終端的所有故障中,軟件方面的缺陷占到七成以上[1],給現(xiàn)場的運行管理帶來極大的困難。而且,未來隨著科技的發(fā)展及電網能源結構調整的變化,電能表的智能化要求將會越來越高,導致軟件功能更為復雜、應用更為靈活[2]。
電能表軟件可劃分為計量模塊與計量管理模塊,前者完成核心的計量及基本電量測量功能,后者完成數(shù)據(jù)儲存管理、費控、顯示、通信等功能。其中,計量模塊的功能相對穩(wěn)定,計量管理模塊則朝著智能化的方向發(fā)展,功能變得越來越復雜與靈活。現(xiàn)有電能表計量模塊基本上采用簡單的單片機系統(tǒng)架構,由一個主循環(huán)加若干中斷組成,所有程序編譯成一個可執(zhí)行文件燒錄到單片機中執(zhí)行[3-4]。這種軟件架構缺乏對各個功能模塊的有序管理,當軟件功能較多時,無法保證主循環(huán)各個任務的實時響應、優(yōu)先級管理,任務間數(shù)據(jù)配合處理出錯的概率也高;而且各個任務模塊高度耦合,任一模塊的變更或擴展對其它模塊影響很大,靈活性差。這些缺陷使其在應對電能表智能化情況下功能越來越復雜、靈活性越來越高等要求方面愈加吃力。
為解決上述問題,本文利用嵌入式實時操作系統(tǒng)(RTOS)在任務調度管理等方面的優(yōu)勢,研究設計了一種新型的、基于嵌入式RTOS的電能表。
本文所設計的基于嵌入式RTOS的電能表,產品定位為高精度、帶電能質量監(jiān)測功能的多功能智能電能表(以下簡稱電能表),硬件架構采用ARM+DSP的雙CPU架構,其中DSP完成模擬通道采樣及計量、電能質量的計算分析,ARM完成數(shù)據(jù)計算、數(shù)據(jù)存儲、顯示、通信等功能,軟件總體架構如圖1所示。
圖1 軟件總體架構圖Fig.1 Overall structure diagram of software
計量模塊全部在DSP中運行,軟件上采用簡單的單片機系統(tǒng);其它內核模塊、主應用模塊、擴展應用模塊在ARM中運行,采用嵌入式實時操作系統(tǒng)。電能表上電后,內核模塊率先啟動運行,完成硬件初始化后,發(fā)送啟動命令給DSP中的計量模塊使其先行運行起來,之后啟動ARM的主應用模塊及擴展應用模塊。鑒于本文主要探討的是嵌入式RTOS的研究與應用,故以下對計量模塊的內容不進行細述。
在進行具體軟件設計之前,需要先選擇合適的嵌入式RTOS。目前業(yè)內廣泛使用的嵌入式RTOS有很多,典型如 VxWorks、uClinux、QNX、uC/OS-II、eCOS等[5-6],需要結合硬件平臺、電能表的功能及性能要求等方面來綜合考慮與選擇,主要考慮如下指標:
(1)任務實時調度管理。要求具備優(yōu)良的任務調度能力,能夠精確分配任務執(zhí)行時間,并根據(jù)優(yōu)先級要求合理調配不同任務的執(zhí)行順序;
(2)同步與通信機制。要求具備豐富的進程間通信機制,在保證各任務獨立執(zhí)行的同時,能夠精確控制任務間的同步與數(shù)據(jù)交互;
(3)內存管理。選擇具備支持MMU(存儲管理單元)的操作系統(tǒng),提供內存保護,將有效保證程序的可靠性和系統(tǒng)的穩(wěn)定性。
綜合上述要求,本設計選用的嵌入式RTOS為VxWorks,該操作系統(tǒng)是業(yè)內公認的實時性最好的嵌入式RTOS,以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中,在電力設備監(jiān)測、電力設備通信等場合也得到了廣泛的應用[7-8]。
基于以上軟件總體架構以及所選擇的嵌入式RTOS,以下詳細說明各模塊的內部軟件實現(xiàn)細節(jié),重點是闡述嵌入式RTOS在解決電能表復雜功能情況下如何去保證可靠性與靈活性的問題。
內核模塊是整個軟件系統(tǒng)運行的中樞,本設計方案中內核模塊實際整合了多個基礎模塊,包括引導模塊、操作系統(tǒng)內核、應用程序管理模塊、驅動支持模塊,這些基礎模塊均與硬件平臺相關,在產品的生命周期中,不論應用功能如何升級或擴展,這部分都是可以基本上維持不變的。各模塊說明如下:
(1)引導模塊。采用uboot實現(xiàn),完成上電初始化,并引導啟動操作系統(tǒng);
(2)操作系統(tǒng)內核。提供軟件系統(tǒng)運行基礎的內存管理、任務調度、中斷處理等功能,通過對Vx-Works內核裁剪得到;
(3)驅動支持模塊。提供對硬件資源的訪問接口,也就是俗稱的板級支持包(BSP),供其他模塊訪問底層硬件資源的接口;
(4)應用程序管理模塊。啟動計量模塊、主應用模塊、擴展應用模塊,并監(jiān)視這三個模塊的運行情況,當發(fā)現(xiàn)異常后重啟對應模塊。
內核模塊的上述設計方法,將軟件系統(tǒng)最底層的內容徹底獨立出來,其帶來的好處是,一方面,通過軟件分層,將底層的任務調度、硬件驅動等封裝起來,避免上層應用程序誤操作帶來的風險;另一方面,內核模塊作為一個整體與硬件平臺綁定,在單獨升級應用程序時該模塊并不需要更新,極大降低了程序維護的復雜度。
鑒于篇幅,以下僅對操作系統(tǒng)內核組件裁剪、驅動支持模塊的設計細節(jié)進行詳細說明。
VxWorks內部自帶豐富的軟件資源,除包含任務調度管理、任務間通信、內存管理、IO系統(tǒng)等操作系統(tǒng)基礎組件外,還包含網絡通信、文件系統(tǒng)、常見硬件驅動等高級組件,可以根據(jù)實際情況進行裁剪[9]。對于電能表而言,受上電啟動時間的限制,裁剪后的目標執(zhí)行文件應盡可能小,所需裁剪內容應盡可能更多,但裁剪太多又可能導致系統(tǒng)不穩(wěn)定。根據(jù)本設計的要求,裁剪內容及裁剪后的大小見表1所示。
表1 VxWorks組件裁剪表Tab.1 Exclusions of VxWorks components
經實測,裁剪后的VxWorks目標執(zhí)行文件,在300 MHz主頻ARM芯片上加載啟動時間為1 s,滿足設計要求。且經長時間運行實測,系統(tǒng)運行穩(wěn)定。
上述內容還可以根據(jù)實際需要進行進一步裁剪,例如一般電能表并不需要網絡通信,此時可以裁剪掉網絡組件,以及硬件類組件中的PHY、MII等,使整個內核容量更小。
驅動支持模塊包含了本設計電能表所需的各種硬件接口,為應用程序訪問硬件設備起到橋梁作用。每個硬件接口分配一個設備描述符,具備open、read、write、ioctl幾個控制接口,分別用于打開、讀取、寫入、配置操作[10]。本設計所包含的設備及其說明見表2所示。
表2 驅動設備表Tab.2 List of driver devices
主應用模塊完成電能表所有基本功能,包括各種電能的計算、需量計算、凍結、事件記錄、數(shù)據(jù)存儲、負荷記錄等。根據(jù)VxWorks的特點,將本模塊分為數(shù)據(jù)計算、參數(shù)管理、數(shù)據(jù)存儲、通信、顯示等幾個子模塊,每個子模塊通過一個獨立的實時任務進程(real time process,簡稱RTP)來實現(xiàn),每個進程的程序運行是相對獨立的,相互之間通過進程間通信的方式來交換數(shù)據(jù)[11]。
(1)數(shù)據(jù)計算模塊是所有數(shù)據(jù)來源的基礎,通過控制表2所述“/meas”設備來讀取計量模塊數(shù)據(jù),獲取總及分相的正向有功、反向有功、正向無功、反向無功等基礎電能數(shù)據(jù),以及當前電壓、電流、功率、相角、頻率等基礎實時數(shù)據(jù);然后,利用這些數(shù)據(jù)進行更深層次的計算處理,利用基礎電能數(shù)據(jù)計算得到組合有功電能、組合無功電能、四象限無功電能以及各費率電能,利用基礎實時數(shù)據(jù)進行需量計算、事件記錄、負荷記錄的分析處理,并通過操作系統(tǒng)的時鐘來控制結算、凍結數(shù)據(jù)的數(shù)據(jù)歸集匯總。數(shù)據(jù)計算模塊所生成的數(shù)據(jù),一方面直接提供給通信、顯示模塊進行對外呈現(xiàn),另一方面提供給數(shù)據(jù)存儲模塊進行固化保存;
(2)參數(shù)管理模塊提供對配置參數(shù)的集中管理,包括上電初始階段從數(shù)據(jù)存儲模塊獲取原始值,以及運行期間接受通信模塊的參數(shù)修改命令,將修改后的參數(shù)傳遞給數(shù)據(jù)存儲模塊固化保存;
(3)數(shù)據(jù)存儲模塊集中管理所有針對非易失性存儲器的讀寫操作,響應數(shù)據(jù)計算模塊、參數(shù)管理模塊的存儲要求,操作表2中的“/spifram”與“/spiflash”設備,完成電能、需量、事件記錄、凍結、負荷記錄等的存儲管理;
(4)通信、顯示模塊與常規(guī)非操作系統(tǒng)的軟件設計差異不大,只不過通信的收發(fā)操作需要使用表2中的“/comm”設備來完成,按鍵監(jiān)測、液晶顯示分別使用“/keyboard”、“/lcd”設備來完成。
上述模塊劃分方法帶來的好處是:其一,將復雜功能分解為簡單模塊,降低軟件難度;其二,每個模塊可以獨立開發(fā)維護,在完全不影響其它模塊的前提下可以單獨升級局部模塊的程序;最后,在擴展新功能時,舊有模塊無需做任何更改。這些優(yōu)勢從設計源頭降低了軟件出錯的風險,提高了軟件的健壯性、可靠性。
基于操作系統(tǒng)的應用程序設計與常規(guī)單片機系統(tǒng)不同,其各個模塊的任務是獨立運行的,通過操作系統(tǒng)的任務調度機制來實現(xiàn)任務的切換。
圖2 數(shù)據(jù)計算模塊流程圖Fig.2 Flowchart of data calculation module
模塊的流程設計包括兩種典型的方式,定時輪詢與中斷觸發(fā)。以數(shù)據(jù)計算模塊為例,采用定時輪詢方式,流程見圖2所示,該模塊完成數(shù)據(jù)初始化、注冊看門狗后,即進入定時等待狀態(tài),每1 s定時時間到后依次進行各項數(shù)據(jù)計算處理,處理完后再等待新的1 s定時,如此循環(huán)反復。
中斷觸發(fā)方式以數(shù)據(jù)存儲模塊為例,流程圖見圖3所示。常規(guī)情況下模塊處于等待狀態(tài),當收到外部存儲命令后才去執(zhí)行存儲操作。
圖3 數(shù)據(jù)存儲模塊流程圖Fig.3 Flowchart of data storage module
上述兩種典型流程設計方式,可以根據(jù)實際功能要求進行選擇。對于周期性、實時性要求低的任務,可選擇定時輪詢方式;對于突發(fā)性、實時性要求高的任務,可選擇中斷觸發(fā)方式。
從上一節(jié)執(zhí)行流程可知,采用嵌入式RTOS后,各模塊任務的運行相互獨立,要交互數(shù)據(jù),就需要使用進程間同步與通信來完成。VxWorks支持的通信方式有共享內存、消息隊列、信號量、互斥鎖、管道等[11],根據(jù)本項目模塊之間數(shù)據(jù)交換的特點,本文的設計采用了共享內存+消息隊列的方式來實現(xiàn),見圖4所示。圖中,“/sd_meas”、“/sd_params”為共享內存,前者存放數(shù)據(jù)計算模塊生成的電能、瞬時測量數(shù)據(jù),后者存放參數(shù)管理模塊處理后的參數(shù)數(shù)據(jù);“/msg_meas”、“/msg_params”為消息隊列,分別用作“/sd_meas”與“/sd_params”數(shù)據(jù)的通知處理。具體程序實現(xiàn)時,采用先寫入共享內存,再通過消息隊列通知的方式,以實現(xiàn)數(shù)據(jù)的異步處理。消息隊列內帶參數(shù),用于對消息的內部細節(jié)進行補充說明,例如圖3中的“收到數(shù)據(jù)存儲命令”,其命令即采用消息隊列的方式,其參數(shù)中包含了要存儲的數(shù)據(jù)類型。
圖4 進程間數(shù)據(jù)通信示意圖Fig.4 Schematic diagram of inter-process data communication
上述主應用模塊涵蓋了標準所要求的智能電能表的基本功能,而且由于采用模塊化的設計方法,也方便維護升級,但還需要解決如下問題:
(1)擴展通信模塊的軟件實現(xiàn)。電能表可擴展無線、藍牙、光纖等多種通信模塊,每一種通信模塊對應的程序不一樣,目前一般采用將各種通信方式程序糅合在一起,通過參數(shù)選擇對應通信程序的方式,使整個軟件系統(tǒng)非常復雜;
(2)定制化的軟件功能。隨著互動用電要求的提高,用戶需要選擇定制的數(shù)據(jù)服務,或由于地區(qū)上的差異,需要軟件上實現(xiàn)特殊的功能。如果針對每一種定制化需求開發(fā)一版程序,將導致大量人力物力浪費,且軟件本身因要兼容太多的情況,使得軟件質量不可控。
為了解決上述靈活性問題,本文的研究利用了嵌入式RTOS多任務機制、以及可以單獨加載模塊程序的特點,設計了擴展應用模塊。見圖1所示,擴展應用模塊與主應用模塊、內核模塊相連,一方面,該模塊是對主應用模塊的補充,可以利用其提供的數(shù)據(jù),進行新的運算處理,得到新的用戶所需要的數(shù)據(jù),或反向將外部數(shù)據(jù)更新到主應用模塊中;另一方面,該模塊可以操作底層內核模塊的資源,控制硬件實現(xiàn)對外接口功能。
上述軟件模塊上的隔離仍然不夠徹底,為了充分保證擴展應用模塊的獨立性,需要實現(xiàn)物理介質層次上的隔離。具體做法是,該模塊采用單獨編譯、單獨下載、單獨存儲的方式。見圖5所示,擴展應用程序固化在0x500000~0x600000的1 MB的空間內,與內核模塊、計量模塊、主應用模塊完全隔離。
圖5 程序存儲空間分配Fig.5 Storage space allocation of software parts
當不需要擴展通信模塊、或不需要定制化軟件功能時,擴展應用模塊部分為空;針對每一種擴展通信方式,開發(fā)單獨的擴展應用模塊,根據(jù)實際硬件配置自由選擇下載;當需要定制化軟件功能時,可以根據(jù)實際需求開發(fā)單獨的擴展應用程序。采用這種實現(xiàn)方式,既保持了傳統(tǒng)意義軟件功能的可靠性,又兼顧到了新技術、新需求應用的靈活性。
將本文設計的基于嵌入式RTOS的智能電能表與基于單片機系統(tǒng)的進行優(yōu)勢對比,列舉幾個典型項目見表3所述。對比可知,采用嵌入式RTOS在設計源頭上提升了軟件可靠性與應用靈活性。
表3 嵌入式RTOS的設計優(yōu)勢Tab.3 Design superiorities of embedded RTOS
以下通過幾個典型測試用例進一步說明嵌入式RTOS的優(yōu)勢:
(1)通過在局部軟件模塊中注入故障,測試其自動恢復的能力。軟件運行受環(huán)境條件的影響很大,測試時很難全部覆蓋,當特定條件發(fā)生時可能存在程序“跑飛”現(xiàn)象。通過在其中一個模塊(以通信模塊為例)強行注入軟件故障來測試。對比測試可知,采用本文設計的電能表,當故障發(fā)生時,其它模塊功能仍運行正常,例如顯示仍可正常查看,計量、測量數(shù)據(jù)正常,一段時間之后通信模塊被單獨重啟(通過軟件看門狗),此時如軟件故障的條件消失,則通信模塊恢復正常運行,否則繼續(xù)重啟,在此期間其它任務均不受影響;采用單片機系統(tǒng)實現(xiàn)的電能表,故障發(fā)生時,程序卡死,顯示無法操作,一段時間后整機重啟(通過硬件看門狗),在此期間計量、測量功能均失效;
(2)驗證測試新任務單獨加載與更新時,其它現(xiàn)有任務不受影響。具體測試方法是,編寫程序在初始化時先不加載某程序模塊,程序運行后通過rtpS-pawn命令在控制臺再啟動該模塊,測試加載期間其它任務功能均不受影響。這一點在單片機系統(tǒng)中是無法實現(xiàn)的。
本文提出了一種基于嵌入式RTOS的電能表軟件設計方案,將整個電能表軟件劃分為內核模塊、計量模塊、主應用模塊、擴展應用模塊幾個獨立的模塊,結合電能表的特點,將內核模塊進行精簡化設計,并采用模塊化、層次化的設計思路,使電能表內部軟件實現(xiàn)更加合理、有效。采用這種設計方式,既保證了電能表核心功能的穩(wěn)定、可靠性,同時也兼顧了軟件功能易于擴展的靈活性。這些設計方法對于提升電能表在功能復雜情況下的軟件可靠性、解決特殊應用場合的靈活性等方面提供了新的思路,并具有一定的參考價值。