歐習(xí)洋,王新華,侯興哲,劉金濤,張進,陳堅
(1.國網(wǎng)重慶市電力公司電力科學(xué)研究院,重慶401123;2.深圳市中電電力技術(shù)股份有限公司,廣東 深圳518040)
作為智能電網(wǎng)最基礎(chǔ)、最關(guān)鍵的設(shè)備之一,電能表逐步從傳統(tǒng)意義上的單一功能的電能計量器具,發(fā)展成為集電能計量、用電信息上傳、費控、事件監(jiān)測與記錄、負荷記錄、防竊電、互動用電等多種功能于一體的智能終端設(shè)備。運行經(jīng)驗表明,軟件復(fù)雜度越高,其故障率也越高。據(jù)統(tǒng)計,多功能電表、負控終端的所有故障中,軟件方面的缺陷占到七成以上[1],給現(xiàn)場的運行管理帶來極大的困難。而且,未來隨著科技的發(fā)展及電網(wǎng)能源結(jié)構(gòu)調(diào)整的變化,電能表的智能化要求將會越來越高,導(dǎo)致軟件功能更為復(fù)雜、應(yīng)用更為靈活[2]。
電能表軟件可劃分為計量模塊與計量管理模塊,前者完成核心的計量及基本電量測量功能,后者完成數(shù)據(jù)儲存管理、費控、顯示、通信等功能。其中,計量模塊的功能相對穩(wěn)定,計量管理模塊則朝著智能化的方向發(fā)展,功能變得越來越復(fù)雜與靈活?,F(xiàn)有電能表計量模塊基本上采用簡單的單片機系統(tǒng)架構(gòu),由一個主循環(huán)加若干中斷組成,所有程序編譯成一個可執(zhí)行文件燒錄到單片機中執(zhí)行[3-4]。這種軟件架構(gòu)缺乏對各個功能模塊的有序管理,當(dāng)軟件功能較多時,無法保證主循環(huán)各個任務(wù)的實時響應(yīng)、優(yōu)先級管理,任務(wù)間數(shù)據(jù)配合處理出錯的概率也高;而且各個任務(wù)模塊高度耦合,任一模塊的變更或擴展對其它模塊影響很大,靈活性差。這些缺陷使其在應(yīng)對電能表智能化情況下功能越來越復(fù)雜、靈活性越來越高等要求方面愈加吃力。
為解決上述問題,本文利用嵌入式實時操作系統(tǒng)(RTOS)在任務(wù)調(diào)度管理等方面的優(yōu)勢,研究設(shè)計了一種新型的、基于嵌入式RTOS的電能表。
本文所設(shè)計的基于嵌入式RTOS的電能表,產(chǎn)品定位為高精度、帶電能質(zhì)量監(jiān)測功能的多功能智能電能表(以下簡稱電能表),硬件架構(gòu)采用ARM+DSP的雙CPU架構(gòu),其中DSP完成模擬通道采樣及計量、電能質(zhì)量的計算分析,ARM完成數(shù)據(jù)計算、數(shù)據(jù)存儲、顯示、通信等功能,軟件總體架構(gòu)如圖1所示。

圖1 軟件總體架構(gòu)圖Fig.1 Overall structure diagram of software
計量模塊全部在DSP中運行,軟件上采用簡單的單片機系統(tǒng);其它內(nèi)核模塊、主應(yīng)用模塊、擴展應(yīng)用模塊在ARM中運行,采用嵌入式實時操作系統(tǒng)。電能表上電后,內(nèi)核模塊率先啟動運行,完成硬件初始化后,發(fā)送啟動命令給DSP中的計量模塊使其先行運行起來,之后啟動ARM的主應(yīng)用模塊及擴展應(yīng)用模塊。鑒于本文主要探討的是嵌入式RTOS的研究與應(yīng)用,故以下對計量模塊的內(nèi)容不進行細述。
在進行具體軟件設(shè)計之前,需要先選擇合適的嵌入式RTOS。目前業(yè)內(nèi)廣泛使用的嵌入式RTOS有很多,典型如 VxWorks、uClinux、QNX、uC/OS-II、eCOS等[5-6],需要結(jié)合硬件平臺、電能表的功能及性能要求等方面來綜合考慮與選擇,主要考慮如下指標(biāo):
(1)任務(wù)實時調(diào)度管理。要求具備優(yōu)良的任務(wù)調(diào)度能力,能夠精確分配任務(wù)執(zhí)行時間,并根據(jù)優(yōu)先級要求合理調(diào)配不同任務(wù)的執(zhí)行順序;
(2)同步與通信機制。要求具備豐富的進程間通信機制,在保證各任務(wù)獨立執(zhí)行的同時,能夠精確控制任務(wù)間的同步與數(shù)據(jù)交互;
(3)內(nèi)存管理。選擇具備支持MMU(存儲管理單元)的操作系統(tǒng),提供內(nèi)存保護,將有效保證程序的可靠性和系統(tǒng)的穩(wěn)定性。
綜合上述要求,本設(shè)計選用的嵌入式RTOS為VxWorks,該操作系統(tǒng)是業(yè)內(nèi)公認的實時性最好的嵌入式RTOS,以其良好的可靠性和卓越的實時性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實時性要求極高的領(lǐng)域中,在電力設(shè)備監(jiān)測、電力設(shè)備通信等場合也得到了廣泛的應(yīng)用[7-8]。
基于以上軟件總體架構(gòu)以及所選擇的嵌入式RTOS,以下詳細說明各模塊的內(nèi)部軟件實現(xiàn)細節(jié),重點是闡述嵌入式RTOS在解決電能表復(fù)雜功能情況下如何去保證可靠性與靈活性的問題。
內(nèi)核模塊是整個軟件系統(tǒng)運行的中樞,本設(shè)計方案中內(nèi)核模塊實際整合了多個基礎(chǔ)模塊,包括引導(dǎo)模塊、操作系統(tǒng)內(nèi)核、應(yīng)用程序管理模塊、驅(qū)動支持模塊,這些基礎(chǔ)模塊均與硬件平臺相關(guān),在產(chǎn)品的生命周期中,不論應(yīng)用功能如何升級或擴展,這部分都是可以基本上維持不變的。各模塊說明如下:
(1)引導(dǎo)模塊。采用uboot實現(xiàn),完成上電初始化,并引導(dǎo)啟動操作系統(tǒng);
(2)操作系統(tǒng)內(nèi)核。提供軟件系統(tǒng)運行基礎(chǔ)的內(nèi)存管理、任務(wù)調(diào)度、中斷處理等功能,通過對Vx-Works內(nèi)核裁剪得到;
(3)驅(qū)動支持模塊。提供對硬件資源的訪問接口,也就是俗稱的板級支持包(BSP),供其他模塊訪問底層硬件資源的接口;
(4)應(yīng)用程序管理模塊。啟動計量模塊、主應(yīng)用模塊、擴展應(yīng)用模塊,并監(jiān)視這三個模塊的運行情況,當(dāng)發(fā)現(xiàn)異常后重啟對應(yīng)模塊。
內(nèi)核模塊的上述設(shè)計方法,將軟件系統(tǒng)最底層的內(nèi)容徹底獨立出來,其帶來的好處是,一方面,通過軟件分層,將底層的任務(wù)調(diào)度、硬件驅(qū)動等封裝起來,避免上層應(yīng)用程序誤操作帶來的風(fēng)險;另一方面,內(nèi)核模塊作為一個整體與硬件平臺綁定,在單獨升級應(yīng)用程序時該模塊并不需要更新,極大降低了程序維護的復(fù)雜度。
鑒于篇幅,以下僅對操作系統(tǒng)內(nèi)核組件裁剪、驅(qū)動支持模塊的設(shè)計細節(jié)進行詳細說明。
VxWorks內(nèi)部自帶豐富的軟件資源,除包含任務(wù)調(diào)度管理、任務(wù)間通信、內(nèi)存管理、IO系統(tǒng)等操作系統(tǒng)基礎(chǔ)組件外,還包含網(wǎng)絡(luò)通信、文件系統(tǒng)、常見硬件驅(qū)動等高級組件,可以根據(jù)實際情況進行裁剪[9]。對于電能表而言,受上電啟動時間的限制,裁剪后的目標(biāo)執(zhí)行文件應(yīng)盡可能小,所需裁剪內(nèi)容應(yīng)盡可能更多,但裁剪太多又可能導(dǎo)致系統(tǒng)不穩(wěn)定。根據(jù)本設(shè)計的要求,裁剪內(nèi)容及裁剪后的大小見表1所示。

表1 VxWorks組件裁剪表Tab.1 Exclusions of VxWorks components
經(jīng)實測,裁剪后的VxWorks目標(biāo)執(zhí)行文件,在300 MHz主頻ARM芯片上加載啟動時間為1 s,滿足設(shè)計要求。且經(jīng)長時間運行實測,系統(tǒng)運行穩(wěn)定。
上述內(nèi)容還可以根據(jù)實際需要進行進一步裁剪,例如一般電能表并不需要網(wǎng)絡(luò)通信,此時可以裁剪掉網(wǎng)絡(luò)組件,以及硬件類組件中的PHY、MII等,使整個內(nèi)核容量更小。
驅(qū)動支持模塊包含了本設(shè)計電能表所需的各種硬件接口,為應(yīng)用程序訪問硬件設(shè)備起到橋梁作用。每個硬件接口分配一個設(shè)備描述符,具備open、read、write、ioctl幾個控制接口,分別用于打開、讀取、寫入、配置操作[10]。本設(shè)計所包含的設(shè)備及其說明見表2所示。

表2 驅(qū)動設(shè)備表Tab.2 List of driver devices
主應(yīng)用模塊完成電能表所有基本功能,包括各種電能的計算、需量計算、凍結(jié)、事件記錄、數(shù)據(jù)存儲、負荷記錄等。根據(jù)VxWorks的特點,將本模塊分為數(shù)據(jù)計算、參數(shù)管理、數(shù)據(jù)存儲、通信、顯示等幾個子模塊,每個子模塊通過一個獨立的實時任務(wù)進程(real time process,簡稱RTP)來實現(xiàn),每個進程的程序運行是相對獨立的,相互之間通過進程間通信的方式來交換數(shù)據(jù)[11]。
(1)數(shù)據(jù)計算模塊是所有數(shù)據(jù)來源的基礎(chǔ),通過控制表2所述“/meas”設(shè)備來讀取計量模塊數(shù)據(jù),獲取總及分相的正向有功、反向有功、正向無功、反向無功等基礎(chǔ)電能數(shù)據(jù),以及當(dāng)前電壓、電流、功率、相角、頻率等基礎(chǔ)實時數(shù)據(jù);然后,利用這些數(shù)據(jù)進行更深層次的計算處理,利用基礎(chǔ)電能數(shù)據(jù)計算得到組合有功電能、組合無功電能、四象限無功電能以及各費率電能,利用基礎(chǔ)實時數(shù)據(jù)進行需量計算、事件記錄、負荷記錄的分析處理,并通過操作系統(tǒng)的時鐘來控制結(jié)算、凍結(jié)數(shù)據(jù)的數(shù)據(jù)歸集匯總。數(shù)據(jù)計算模塊所生成的數(shù)據(jù),一方面直接提供給通信、顯示模塊進行對外呈現(xiàn),另一方面提供給數(shù)據(jù)存儲模塊進行固化保存;
(2)參數(shù)管理模塊提供對配置參數(shù)的集中管理,包括上電初始階段從數(shù)據(jù)存儲模塊獲取原始值,以及運行期間接受通信模塊的參數(shù)修改命令,將修改后的參數(shù)傳遞給數(shù)據(jù)存儲模塊固化保存;
(3)數(shù)據(jù)存儲模塊集中管理所有針對非易失性存儲器的讀寫操作,響應(yīng)數(shù)據(jù)計算模塊、參數(shù)管理模塊的存儲要求,操作表2中的“/spifram”與“/spiflash”設(shè)備,完成電能、需量、事件記錄、凍結(jié)、負荷記錄等的存儲管理;
(4)通信、顯示模塊與常規(guī)非操作系統(tǒng)的軟件設(shè)計差異不大,只不過通信的收發(fā)操作需要使用表2中的“/comm”設(shè)備來完成,按鍵監(jiān)測、液晶顯示分別使用“/keyboard”、“/lcd”設(shè)備來完成。
上述模塊劃分方法帶來的好處是:其一,將復(fù)雜功能分解為簡單模塊,降低軟件難度;其二,每個模塊可以獨立開發(fā)維護,在完全不影響其它模塊的前提下可以單獨升級局部模塊的程序;最后,在擴展新功能時,舊有模塊無需做任何更改。這些優(yōu)勢從設(shè)計源頭降低了軟件出錯的風(fēng)險,提高了軟件的健壯性、可靠性。
基于操作系統(tǒng)的應(yīng)用程序設(shè)計與常規(guī)單片機系統(tǒng)不同,其各個模塊的任務(wù)是獨立運行的,通過操作系統(tǒng)的任務(wù)調(diào)度機制來實現(xiàn)任務(wù)的切換。

圖2 數(shù)據(jù)計算模塊流程圖Fig.2 Flowchart of data calculation module
模塊的流程設(shè)計包括兩種典型的方式,定時輪詢與中斷觸發(fā)。以數(shù)據(jù)計算模塊為例,采用定時輪詢方式,流程見圖2所示,該模塊完成數(shù)據(jù)初始化、注冊看門狗后,即進入定時等待狀態(tài),每1 s定時時間到后依次進行各項數(shù)據(jù)計算處理,處理完后再等待新的1 s定時,如此循環(huán)反復(fù)。
中斷觸發(fā)方式以數(shù)據(jù)存儲模塊為例,流程圖見圖3所示。常規(guī)情況下模塊處于等待狀態(tài),當(dāng)收到外部存儲命令后才去執(zhí)行存儲操作。

圖3 數(shù)據(jù)存儲模塊流程圖Fig.3 Flowchart of data storage module
上述兩種典型流程設(shè)計方式,可以根據(jù)實際功能要求進行選擇。對于周期性、實時性要求低的任務(wù),可選擇定時輪詢方式;對于突發(fā)性、實時性要求高的任務(wù),可選擇中斷觸發(fā)方式。
從上一節(jié)執(zhí)行流程可知,采用嵌入式RTOS后,各模塊任務(wù)的運行相互獨立,要交互數(shù)據(jù),就需要使用進程間同步與通信來完成。VxWorks支持的通信方式有共享內(nèi)存、消息隊列、信號量、互斥鎖、管道等[11],根據(jù)本項目模塊之間數(shù)據(jù)交換的特點,本文的設(shè)計采用了共享內(nèi)存+消息隊列的方式來實現(xiàn),見圖4所示。圖中,“/sd_meas”、“/sd_params”為共享內(nèi)存,前者存放數(shù)據(jù)計算模塊生成的電能、瞬時測量數(shù)據(jù),后者存放參數(shù)管理模塊處理后的參數(shù)數(shù)據(jù);“/msg_meas”、“/msg_params”為消息隊列,分別用作“/sd_meas”與“/sd_params”數(shù)據(jù)的通知處理。具體程序?qū)崿F(xiàn)時,采用先寫入共享內(nèi)存,再通過消息隊列通知的方式,以實現(xiàn)數(shù)據(jù)的異步處理。消息隊列內(nèi)帶參數(shù),用于對消息的內(nèi)部細節(jié)進行補充說明,例如圖3中的“收到數(shù)據(jù)存儲命令”,其命令即采用消息隊列的方式,其參數(shù)中包含了要存儲的數(shù)據(jù)類型。

圖4 進程間數(shù)據(jù)通信示意圖Fig.4 Schematic diagram of inter-process data communication
上述主應(yīng)用模塊涵蓋了標(biāo)準(zhǔn)所要求的智能電能表的基本功能,而且由于采用模塊化的設(shè)計方法,也方便維護升級,但還需要解決如下問題:
(1)擴展通信模塊的軟件實現(xiàn)。電能表可擴展無線、藍牙、光纖等多種通信模塊,每一種通信模塊對應(yīng)的程序不一樣,目前一般采用將各種通信方式程序糅合在一起,通過參數(shù)選擇對應(yīng)通信程序的方式,使整個軟件系統(tǒng)非常復(fù)雜;
(2)定制化的軟件功能。隨著互動用電要求的提高,用戶需要選擇定制的數(shù)據(jù)服務(wù),或由于地區(qū)上的差異,需要軟件上實現(xiàn)特殊的功能。如果針對每一種定制化需求開發(fā)一版程序,將導(dǎo)致大量人力物力浪費,且軟件本身因要兼容太多的情況,使得軟件質(zhì)量不可控。
為了解決上述靈活性問題,本文的研究利用了嵌入式RTOS多任務(wù)機制、以及可以單獨加載模塊程序的特點,設(shè)計了擴展應(yīng)用模塊。見圖1所示,擴展應(yīng)用模塊與主應(yīng)用模塊、內(nèi)核模塊相連,一方面,該模塊是對主應(yīng)用模塊的補充,可以利用其提供的數(shù)據(jù),進行新的運算處理,得到新的用戶所需要的數(shù)據(jù),或反向?qū)⑼獠繑?shù)據(jù)更新到主應(yīng)用模塊中;另一方面,該模塊可以操作底層內(nèi)核模塊的資源,控制硬件實現(xiàn)對外接口功能。
上述軟件模塊上的隔離仍然不夠徹底,為了充分保證擴展應(yīng)用模塊的獨立性,需要實現(xiàn)物理介質(zhì)層次上的隔離。具體做法是,該模塊采用單獨編譯、單獨下載、單獨存儲的方式。見圖5所示,擴展應(yīng)用程序固化在0x500000~0x600000的1 MB的空間內(nèi),與內(nèi)核模塊、計量模塊、主應(yīng)用模塊完全隔離。

圖5 程序存儲空間分配Fig.5 Storage space allocation of software parts
當(dāng)不需要擴展通信模塊、或不需要定制化軟件功能時,擴展應(yīng)用模塊部分為空;針對每一種擴展通信方式,開發(fā)單獨的擴展應(yīng)用模塊,根據(jù)實際硬件配置自由選擇下載;當(dāng)需要定制化軟件功能時,可以根據(jù)實際需求開發(fā)單獨的擴展應(yīng)用程序。采用這種實現(xiàn)方式,既保持了傳統(tǒng)意義軟件功能的可靠性,又兼顧到了新技術(shù)、新需求應(yīng)用的靈活性。
將本文設(shè)計的基于嵌入式RTOS的智能電能表與基于單片機系統(tǒng)的進行優(yōu)勢對比,列舉幾個典型項目見表3所述。對比可知,采用嵌入式RTOS在設(shè)計源頭上提升了軟件可靠性與應(yīng)用靈活性。

表3 嵌入式RTOS的設(shè)計優(yōu)勢Tab.3 Design superiorities of embedded RTOS
以下通過幾個典型測試用例進一步說明嵌入式RTOS的優(yōu)勢:
(1)通過在局部軟件模塊中注入故障,測試其自動恢復(fù)的能力。軟件運行受環(huán)境條件的影響很大,測試時很難全部覆蓋,當(dāng)特定條件發(fā)生時可能存在程序“跑飛”現(xiàn)象。通過在其中一個模塊(以通信模塊為例)強行注入軟件故障來測試。對比測試可知,采用本文設(shè)計的電能表,當(dāng)故障發(fā)生時,其它模塊功能仍運行正常,例如顯示仍可正常查看,計量、測量數(shù)據(jù)正常,一段時間之后通信模塊被單獨重啟(通過軟件看門狗),此時如軟件故障的條件消失,則通信模塊恢復(fù)正常運行,否則繼續(xù)重啟,在此期間其它任務(wù)均不受影響;采用單片機系統(tǒng)實現(xiàn)的電能表,故障發(fā)生時,程序卡死,顯示無法操作,一段時間后整機重啟(通過硬件看門狗),在此期間計量、測量功能均失效;
(2)驗證測試新任務(wù)單獨加載與更新時,其它現(xiàn)有任務(wù)不受影響。具體測試方法是,編寫程序在初始化時先不加載某程序模塊,程序運行后通過rtpS-pawn命令在控制臺再啟動該模塊,測試加載期間其它任務(wù)功能均不受影響。這一點在單片機系統(tǒng)中是無法實現(xiàn)的。
本文提出了一種基于嵌入式RTOS的電能表軟件設(shè)計方案,將整個電能表軟件劃分為內(nèi)核模塊、計量模塊、主應(yīng)用模塊、擴展應(yīng)用模塊幾個獨立的模塊,結(jié)合電能表的特點,將內(nèi)核模塊進行精簡化設(shè)計,并采用模塊化、層次化的設(shè)計思路,使電能表內(nèi)部軟件實現(xiàn)更加合理、有效。采用這種設(shè)計方式,既保證了電能表核心功能的穩(wěn)定、可靠性,同時也兼顧了軟件功能易于擴展的靈活性。這些設(shè)計方法對于提升電能表在功能復(fù)雜情況下的軟件可靠性、解決特殊應(yīng)用場合的靈活性等方面提供了新的思路,并具有一定的參考價值。