顧俊卿,張福斌
(西北工業(yè)大學(xué) 航海學(xué)院,陜西 西安 710072)
隨著現(xiàn)代化城市建設(shè)的發(fā)展,出現(xiàn)了越來(lái)越多的高層建筑,如何統(tǒng)一管理和監(jiān)控建筑內(nèi)公用的機(jī)電設(shè)備,成為當(dāng)今樓宇自動(dòng)化研究的熱點(diǎn)方向之一 。以“分散控制,集中管理”為基本思想,設(shè)計(jì)了一種基于以太網(wǎng)和CAN總線(xiàn)的樓宇自動(dòng)化控制系統(tǒng)。采用分層管理和控制,與傳統(tǒng)控制結(jié)構(gòu)相比,每個(gè)現(xiàn)場(chǎng)設(shè)備節(jié)點(diǎn)都具有通信和控制能力,各自可以獨(dú)立控制而不依賴(lài)于主控計(jì)算機(jī),同時(shí)也具有簡(jiǎn)單的故障自動(dòng)修復(fù)功能,因而只要控制規(guī)律確定以后,平時(shí)主控機(jī)只需要監(jiān)視設(shè)備節(jié)點(diǎn)既可,這樣就提高了整個(gè)系統(tǒng)的自動(dòng)化水平。所選的以太網(wǎng)和CAN總線(xiàn)的組合,相比其他總線(xiàn),軟硬件技術(shù)成熟、安全可靠、傳輸速度快且成本低廉、易于擴(kuò)展和維護(hù)。
系統(tǒng)結(jié)構(gòu)如圖1所示。系統(tǒng)設(shè)計(jì)兩層網(wǎng)絡(luò),第1層是以太網(wǎng),由路由器和交換機(jī)組成,負(fù)責(zé)連接主控機(jī)和各個(gè)區(qū)域的上位機(jī),各上位機(jī)內(nèi)嵌簡(jiǎn)單的TCP/IP協(xié)議棧,通過(guò)以太網(wǎng)將其下的設(shè)備節(jié)點(diǎn)的狀態(tài)實(shí)時(shí)的反饋到主控機(jī)中,也可以接受主控機(jī)發(fā)送出的控制指令。以太網(wǎng)提供了冗余網(wǎng)絡(luò)結(jié)構(gòu),主控機(jī)的位置可以隨時(shí)移動(dòng),通過(guò)新的路由器接入網(wǎng)絡(luò)即可。第2層是CAN網(wǎng)絡(luò),由CAN控制器和收發(fā)器組成,負(fù)責(zé)連接設(shè)備節(jié)點(diǎn),將采集到的數(shù)據(jù)傳送至上位機(jī),并接收上位機(jī)的命令消息。由于上位機(jī)實(shí)際上起到了一個(gè)網(wǎng)關(guān)的作用,因此兩層網(wǎng)絡(luò)結(jié)構(gòu)擴(kuò)大了通信的帶寬,減輕了總線(xiàn)的負(fù)擔(dān)。再加上CAN特有的非破壞性總線(xiàn)仲裁技術(shù),即使在網(wǎng)絡(luò)負(fù)重很大的情況下,也不會(huì)出現(xiàn)網(wǎng)絡(luò)癱瘓情況。
上位機(jī)以NXP LPC2478為主芯片,由電源穩(wěn)壓模塊、以太網(wǎng)收發(fā)器,隔離變壓器、CAN收發(fā)器等組成。LPC2478以ARM7為內(nèi)核,它包括1個(gè)10/100以太網(wǎng)媒體訪(fǎng)問(wèn)控制器(MAC)、1個(gè)帶 4 kB終端 RAM的 USB全速設(shè)備/主機(jī)/OTG控制器、4個(gè)UART、兩路CAN通道、1個(gè)SPI接口、2個(gè)同步串行端口、3個(gè)I2C接口和1個(gè)I2S接口。同時(shí)還帶有1個(gè)4 MHz的片內(nèi)振蕩器、98 kB RAM、以及一個(gè)外部存儲(chǔ)器控制器來(lái)支持上述的各種串行通信接口[1]。電源穩(wěn)壓模塊將輸入電源電壓濾波并穩(wěn)定在3.3 V左右,可以防止電壓瞬時(shí)的下降導(dǎo)致的程序跑飛。CAN收發(fā)器采用PCA82C250,以太網(wǎng)接口用常見(jiàn)的的RJ45型網(wǎng)線(xiàn)接口。
設(shè)備節(jié)點(diǎn)使用STC89C52單片機(jī)作為微控制器,外擴(kuò)SJA1000為CAN控制器,為便于調(diào)試,擴(kuò)展電平轉(zhuǎn)換芯片MAX232作為備用調(diào)試通道。根據(jù)不同需要,還要連接不同的傳感器和其他執(zhí)行機(jī)構(gòu),比如中央空調(diào)系統(tǒng),可連接DS18B20溫度傳感器將溫度采集并以數(shù)字量直接傳送給STC89C52[2],STC89C52則按預(yù)先設(shè)置好的方案,控制壓縮機(jī)工作。必要時(shí)可以由主控機(jī)發(fā)送控制命令,修改預(yù)先設(shè)置的方案參數(shù)。
圖1 BAS網(wǎng)絡(luò)結(jié)構(gòu)Fig.1 BAS net layout
將上位機(jī)的網(wǎng)口連接至交換機(jī)網(wǎng)口,路由器的LAN口也和交換器連接,路由器的WAN口連接進(jìn)入樓宇局域網(wǎng)。
軟件由主控機(jī)人機(jī)接口界面、上位機(jī)軟件、設(shè)備節(jié)點(diǎn)軟件組成。上位機(jī)軟件包括嵌入式TCP/IP協(xié)議簇、以太網(wǎng)收發(fā)軟件包、CAN收發(fā)軟件包等,設(shè)備節(jié)點(diǎn)軟件包括CAN模塊、數(shù)據(jù)采集分析模塊等組成。
上位機(jī)既要和主控機(jī)通信,又要負(fù)責(zé)管理下屬的設(shè)備節(jié)點(diǎn),負(fù)載較大。移植μC/OS-Ⅱ操作系統(tǒng)可以使上位機(jī)具有多任務(wù)運(yùn)行的功能。μC/OS-Ⅱ是一個(gè)完整的,可移植、固化、裁剪的占先式實(shí)時(shí)多任務(wù)內(nèi)核。它包含了任務(wù)調(diào)度、任務(wù)管理、時(shí)間管理、內(nèi)存管理和任務(wù)間的通信和同步等基本功能。μC/OS-Ⅱ采用的是可剝奪型實(shí)時(shí)多任務(wù)內(nèi)核,可剝奪型的實(shí)時(shí)內(nèi)核在任何時(shí)候都運(yùn)行就緒了的最高優(yōu)先級(jí)的任務(wù)。
在ARM下移植μC/OS-Ⅱ操作系統(tǒng)主要是修改μC/OS-Ⅱ中一部分與CPU相關(guān)的匯編代碼,這里主要是任務(wù)上下文的切換代碼。
任務(wù)切換發(fā)生在任務(wù)調(diào)度的時(shí)候,μC/OS-Ⅱ下任務(wù)調(diào)度的時(shí)機(jī)主要有以下幾種情況:1)高優(yōu)先級(jí)的任務(wù)因?yàn)樾枰撤N臨界資源,主動(dòng)請(qǐng)求掛起,讓出處理器,此時(shí)將調(diào)度就緒狀態(tài)的最高優(yōu)先級(jí)任務(wù)并執(zhí)行。2)高優(yōu)先級(jí)的任務(wù)因?yàn)闀r(shí)鐘節(jié)拍到來(lái),在時(shí)鐘中斷的處理程序中,內(nèi)核發(fā)現(xiàn)更高優(yōu)先級(jí)的任務(wù)就緒,獲得了執(zhí)行條件,則在中斷后直接切換到更高優(yōu)先級(jí)任務(wù)執(zhí)行[3-5]。
任務(wù)切換就是保存前一個(gè)任務(wù)的基本信息,同時(shí)讀取新任務(wù)在上一次被切換時(shí)保存的這些信息。調(diào)度器將前一任務(wù)的上述信息保存在該任務(wù)的棧空間中,其目的是為了下次運(yùn)行時(shí)能夠恢復(fù)到被切換時(shí)的狀態(tài),調(diào)度器將從該任務(wù)的??臻g中讀取上述信息,從而從該任務(wù)上次被中斷的位置繼續(xù)執(zhí)行,其基本過(guò)程如下[3-5]:
1)將當(dāng)前任務(wù)的PC位置、通用寄存器數(shù)據(jù)、CPU狀態(tài)入棧。
2)將全局變量OSPrioCur(當(dāng)前任務(wù)優(yōu)先級(jí)變量)的值修改為全局變量OSPrioHighRdy(最高優(yōu)先級(jí)任務(wù)優(yōu)先級(jí))的值,即把最高就緒任務(wù)優(yōu)先級(jí)設(shè)置為新的當(dāng)前任務(wù)優(yōu)先級(jí)。
3)將原任務(wù)TCB的第一個(gè)成員(指向棧頂?shù)闹羔?OSTC B-StkPtr)的值修改為當(dāng)前SP寄存器的值,以便再次返回。
4)獲取最高優(yōu)先級(jí)的任務(wù)控制塊中第一個(gè)成員(指向堆棧棧頂指針*OSTCBStkPtr)的值并將其保存到SP寄存器中。
5)將OSTCBCur的值修改為新就緒最高優(yōu)先級(jí)任務(wù)的任務(wù)控制塊地址。
6)將新任務(wù)的PC地址、通用寄存器數(shù)據(jù)、CPU狀態(tài)出棧,開(kāi)始執(zhí)行新的任務(wù)。
因?yàn)槿蝿?wù)切換是將當(dāng)前任務(wù)的基本信息保存起來(lái)(入任務(wù)棧),并加載新任務(wù)的基本信息(出棧),而這些信息很大一部分都被存儲(chǔ)在CPU的寄存器中,因此根據(jù)處理器的不同,此函數(shù)在實(shí)現(xiàn)上略有差異,一般都采用匯編語(yǔ)言實(shí)現(xiàn)。
設(shè)備驅(qū)動(dòng)程序主要包括以太網(wǎng)和CAN軟件包,以太網(wǎng)驅(qū)動(dòng)主要是初始化LPC2478內(nèi)部以太網(wǎng)模塊的一些重要的寄存器如MAC配置寄存器、MAC地址寄存器、命令寄存器、狀態(tài)寄存器、中斷狀態(tài)寄存器等等。以太網(wǎng)模塊內(nèi)部采用DMA方式讀取數(shù)據(jù),分別使用接收、發(fā)送描述符數(shù)組來(lái)表示接收和發(fā)送的數(shù)據(jù)塊[6]。以太網(wǎng)模塊發(fā)送和接受數(shù)據(jù)的流程如圖2所示。
圖2 以太網(wǎng)模塊發(fā)送和接收數(shù)據(jù)流程Fig.2 Sending and receiving process of Ethernet module
CAN的初始化包括初始化時(shí)鐘分頻寄存器,同時(shí)選擇能支持?jǐn)U展幀的PeliCAN模式[7],設(shè)置接收中斷,采用中斷來(lái)接收數(shù)據(jù),設(shè)置總線(xiàn)時(shí)序寄存器、輸出控制寄存器等。初始化CAN流程圖如圖3所示。
圖3 初始化CANFig.3 Initialization of CAN
嵌入式TCP/IP協(xié)議棧同樣由套接字來(lái)實(shí)現(xiàn),主要包括IP、ARP、ICMP、TCP、UDP 協(xié)議等等。 TCP/IP 模型結(jié)構(gòu)分為 4層,由上到下分別是:應(yīng)用層、運(yùn)輸層、網(wǎng)絡(luò)層、物理和數(shù)據(jù)鏈路層[8-9]。數(shù)據(jù)從應(yīng)用層發(fā)出,經(jīng)過(guò)套接字封裝,傳輸至數(shù)據(jù)鏈路層,交由以太網(wǎng)發(fā)送模塊處理。同樣的,以太網(wǎng)接收模塊收到的數(shù)據(jù),經(jīng)過(guò)解包,最終交由應(yīng)用層接收??紤]到系統(tǒng)實(shí)時(shí)性,我們采用UDP傳輸協(xié)議進(jìn)行數(shù)據(jù)和命令的傳送。編寫(xiě)UDP通信的任務(wù)時(shí)分為服務(wù)器方式和客戶(hù)機(jī)方式兩種,服務(wù)器方式是先接收到數(shù)據(jù)再進(jìn)行處理,而客戶(hù)機(jī)則是先發(fā)生數(shù)據(jù),然后等待回應(yīng)處理[10]。UDP進(jìn)程的流程如圖4所示。
圖4 UDP進(jìn)程流程圖Fig.4 UDP process
數(shù)據(jù)報(bào)的接收是通過(guò)一個(gè)任務(wù)來(lái)進(jìn)行的。該任務(wù)優(yōu)先級(jí)較高,可以通過(guò)時(shí)間片來(lái)觸發(fā),也可以通過(guò)中斷來(lái)觸發(fā)。Rec_Packet()函數(shù)是底層的驅(qū)動(dòng)程序函數(shù),它在接收時(shí)調(diào)用了Rec_Ethernet_Packed()函數(shù)進(jìn)行以太網(wǎng)層處理,而Rec_Ethernet_Packed()函數(shù)又調(diào)用了 IP_PROCESS()函數(shù)。IP層的處理由IP_PROCESS()函數(shù)執(zhí)行,它將UDP報(bào)通過(guò)消息隊(duì)列交給UDP處理任務(wù)去執(zhí)行。
數(shù)據(jù)報(bào)的發(fā)送與數(shù)據(jù)報(bào)的接收是一個(gè)相反的過(guò)程,是由上層協(xié)議函數(shù)調(diào)用下層協(xié)議函數(shù)來(lái)進(jìn)行的。上層UDP處理函數(shù)或Socket接口函數(shù)都是通過(guò)調(diào)用Send_Ip_Frame()函數(shù)來(lái)發(fā)送IP報(bào)的,而Send_Ip_Frame()函數(shù)則調(diào)用Send_Ip_To_LLC()函數(shù)來(lái)處理IP地址對(duì)應(yīng)MAC地址的事情,然后 Send_Ip_To_LLC()再調(diào)用 Send_Ethernet_Frame()函數(shù),把對(duì)應(yīng)的MAC地址寫(xiě)入發(fā)送區(qū),最后調(diào)用驅(qū)動(dòng)程序的發(fā)送函數(shù) Send_Packet()。
設(shè)備節(jié)點(diǎn)樣機(jī)如圖5所示,它帶有一個(gè)DS18B20數(shù)字溫度傳感器,實(shí)時(shí)將溫度數(shù)據(jù)通過(guò)CAN傳輸至上位機(jī),再通過(guò)局域網(wǎng)傳至主控計(jì)算機(jī);具有多路I/O接口(可外接繼電器),能接收上位機(jī)命令改變I/O口的輸出。上位機(jī)使用ARM核心板外擴(kuò)通信接口作為實(shí)驗(yàn)板,主控機(jī)使用路由器接入,控制界面由VC++編寫(xiě)。實(shí)驗(yàn)時(shí)將IP地址設(shè)為一固定的私有IP,網(wǎng)關(guān)IP設(shè)為內(nèi)置交換機(jī)的TP-LINK路由器IP,設(shè)置好路由器工作方式后即可運(yùn)行。以溫度采集與繼電器控制為例,驗(yàn)證了主控機(jī)對(duì)設(shè)備節(jié)點(diǎn)的監(jiān)控和管理功能,表明該方案技術(shù)切實(shí)可行。
圖5 設(shè)備節(jié)點(diǎn)樣機(jī)Fig.5 Control node for test
提出了一種實(shí)時(shí)性較高、實(shí)用性較強(qiáng)的樓宇自動(dòng)化控制系統(tǒng)解決方案,并對(duì)關(guān)鍵技術(shù)進(jìn)行了驗(yàn)證。系統(tǒng)技術(shù)成熟,易于維護(hù)和擴(kuò)展,可以將建筑內(nèi)各種機(jī)電設(shè)備的信息進(jìn)行分析、歸類(lèi)、處理、判斷,對(duì)各系統(tǒng)設(shè)備進(jìn)行集中監(jiān)控和管理,使各下屬設(shè)備協(xié)調(diào)有序的工作,并及時(shí)處理故障。
[1]周立功.深入淺出ARM7—LPC2400[M].廣州:廣州致遠(yuǎn)電子有限公司,2008.
[2]鄭鋒,王巧芝,王鼎媛,等.51單片機(jī)應(yīng)用系統(tǒng)典型模塊開(kāi)發(fā)大全[M].北京:中國(guó)鐵道出版社,2010.
[3]楊宗德,張兵.μC/OS-Ⅱ標(biāo)準(zhǔn)教程[M].北京:人民郵電出版社,2009.
[4]Labrosse J J.MicroC/OS-Ⅱ The Real-Time Kernel[M].邵貝貝,譯.2版.北京:北京航空航天大學(xué)出版社,2003.
[5]陳是知.μC/OS-Ⅱ內(nèi)核分析、移植與驅(qū)動(dòng)程序開(kāi)發(fā)[M].北京:人民郵電出版社,2007.
[6]周立功.ARM嵌入式系統(tǒng)應(yīng)用技術(shù)筆記—基于LPC2400[M].廣州:廣州致遠(yuǎn)電子有限公司,2008.
[7]鐃運(yùn)濤,鄒繼軍,王進(jìn)宏,等.現(xiàn)場(chǎng)總線(xiàn)CAN原理與應(yīng)用技術(shù)[M].2版.北京:北京航空航天大學(xué)出版社,2007.
[8]Forouzan B A,F(xiàn)egan S C.TCP/IP協(xié)議族[M].3版.馬海軍,吳華等,譯.北京:清華大學(xué)出版社,2006.
[9]Chappell L A,Tittel E.TCP/IP協(xié)議原理與應(yīng)用[M].馬海軍,吳華等,譯.北京:清華大學(xué)出版社,2005.
[10]周立功.ARM嵌入式系統(tǒng)軟件開(kāi)發(fā)實(shí)例1[M].北京:北京航空航天大學(xué)出版社,2005.