《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux平臺(tái)下電力載波路由器的軟件設(shè)計(jì)
嵌入式Linux平臺(tái)下電力載波路由器的軟件設(shè)計(jì)
來(lái)源:電子技術(shù)應(yīng)用2010年第11期
田 霆, 郭前崗, 周西峰
南京郵電大學(xué) 自動(dòng)化學(xué)院, 江蘇 南京 210003
摘要: 針對(duì)載波電表集抄系統(tǒng)中,電力載波通信距離有限、抄收率低等問(wèn)題,提出了一種應(yīng)用于載波電表集抄系統(tǒng)的中繼轉(zhuǎn)發(fā)技術(shù),并設(shè)計(jì)出應(yīng)用此技術(shù)的電力載波通信路由器。采用多叉樹(shù)遍歷尋優(yōu)算法實(shí)現(xiàn)了用戶節(jié)點(diǎn)路徑的自動(dòng)尋優(yōu)及自動(dòng)更新,并在此基礎(chǔ)上提供了網(wǎng)絡(luò)和串口兩種通信方式,以方便采集站對(duì)用戶節(jié)點(diǎn)進(jìn)行快速、準(zhǔn)確、無(wú)誤的數(shù)據(jù)抄收。
中圖分類號(hào): TN925
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2010)10-0135-03
The software design of powerline communication route based on embedded Linux platform
TIAN Ting, GUO Qian Gang, ZHOU Xi Feng
Automation College, Nanjing University of Posts and Telecommunications, Nanjing 210003, China
Abstract: In the carrier meter reading system, the electric power carrier communication distance is Limited, and meter reading has low rates. This paper proposes a set of copy used in carrier-meter relay system technology and designs power line carrier communication routers to apply this technology. The user node, the path to achieve automatic optimization, each node of the routing path of automatic updates, and providing Ethernet and serial port pairs of nodes in the data fast, accurate and correct meter reading function.
Key words : relaying technology; DLT/645 protocol; embedded Linux; multi-branch tree traversal algorithm for optimizing; multi-threaded

    電力載波(PLC)是電力系統(tǒng)通信的一種基本方式,廣泛應(yīng)用于電力行業(yè)的自動(dòng)化抄表系統(tǒng)中。由于電力載波是利用電力線來(lái)作為傳輸媒介,因此,電力線路的距離長(zhǎng)短和用戶的用電負(fù)荷都會(huì)對(duì)電力載波通信效果造成影響,而通過(guò)載波模塊實(shí)現(xiàn)對(duì)一臺(tái)區(qū)下所有電表的直抄是不可能的。目前常用的解決方法是為每塊電表安裝帶中繼轉(zhuǎn)發(fā)功能的載波模塊,不能直抄的表可以通過(guò)距離遠(yuǎn)近或信號(hào)質(zhì)量較佳的表對(duì)其進(jìn)行中繼轉(zhuǎn)發(fā)抄收。電力載波通信信道,其載波通信信號(hào)衰減大、干擾嚴(yán)重、不穩(wěn)定,如何根據(jù)線路狀態(tài)以及通信距離的遠(yuǎn)近自動(dòng)分配各電表的中繼節(jié)點(diǎn)并動(dòng)態(tài)維護(hù)這些節(jié)點(diǎn)是進(jìn)行中繼轉(zhuǎn)發(fā)抄收時(shí)應(yīng)解決的問(wèn)題。因此有必要設(shè)計(jì)一種電力載波通信路由器以實(shí)現(xiàn)對(duì)一臺(tái)區(qū)下各節(jié)點(diǎn)中繼路徑的智能制定及其維護(hù),以方便其上級(jí)采集器對(duì)所有節(jié)點(diǎn)的抄收。
1 系統(tǒng)拓?fù)浣Y(jié)構(gòu)
    載波集抄系統(tǒng)拓?fù)鋱D如圖1所示。


2  電力載波路由器的軟件設(shè)計(jì)
2.1 DLT/645—2007多功能電表通信規(guī)約

    本通信規(guī)約規(guī)定了多功能電表與手持單元(HHU)或其他數(shù)據(jù)終端設(shè)備之間的物理連接、通信鏈路及應(yīng)用技術(shù)規(guī)范,適用于本地系統(tǒng)中多功能電表與手持單元或其他數(shù)據(jù)終端設(shè)備進(jìn)行點(diǎn)對(duì)點(diǎn)或一主多從的數(shù)據(jù)交換方式[1]。645協(xié)議規(guī)定了通信采用異步串行的通信方式,其每個(gè)字節(jié)包含有1個(gè)起始位、8個(gè)數(shù)據(jù)位、1個(gè)偶校驗(yàn)位及1個(gè)停止位,缺省通信速率為2 400 b/s,傳輸時(shí)先傳低位,后傳高位。應(yīng)用規(guī)定了如圖2所示的每一幀的信息格式。

    在圖2中,68H為幀的起始符;A0~A5為通信端的物理地址,一共是6個(gè)字節(jié);L為數(shù)據(jù)域的長(zhǎng)度;DATA為數(shù)據(jù)域;16H為幀的結(jié)束符;CS表示校驗(yàn)碼,校驗(yàn)碼是從第1幀起始符開(kāi)始到校驗(yàn)碼之前的所有各字節(jié)的模256的和,即各字節(jié)二進(jìn)制算術(shù)和,不計(jì)超過(guò)256的算術(shù)值;C為控制碼,控制碼一共有8位,在保留645協(xié)議中對(duì)控制碼各位定義的基礎(chǔ)上,本設(shè)計(jì)針對(duì)中繼功能的使用重新定義了控制碼。同時(shí)為了保障載波通信的可靠性,還省去了645協(xié)議中關(guān)于后續(xù)幀的定義??刂拼a的格式[2]如圖3所示。

2.2 路由算法的設(shè)計(jì)
     路由的目的是要建立一張各節(jié)點(diǎn)的最優(yōu)路徑表,此表記錄了臺(tái)區(qū)下每個(gè)節(jié)點(diǎn)的中繼級(jí)別、各級(jí)的中繼地址及目的地址。這種路由表是動(dòng)態(tài)的,存放在RAM中,每隔5 min會(huì)自動(dòng)更新一次。路由表的初始值各項(xiàng)均為0,其格式如圖4所示。

    路由表的建立是軟件中最核心的部分,本設(shè)計(jì)采用了多叉樹(shù)遍歷尋優(yōu)[3]算法,從路由器節(jié)點(diǎn)開(kāi)始逐層搜索。其算法描述如下:
    (1)路由器先將網(wǎng)絡(luò)中的所有節(jié)點(diǎn)建成一個(gè)帶有頭節(jié)點(diǎn)的單向鏈表,然后開(kāi)始向網(wǎng)絡(luò)中所有節(jié)點(diǎn)依次發(fā)送直抄查詢命令,并等待回應(yīng)。若能在規(guī)定時(shí)間內(nèi)(10 s)收到節(jié)點(diǎn)的應(yīng)答信息,則表明該節(jié)點(diǎn)可以進(jìn)行直抄;然后將可以進(jìn)行直抄的電表從鏈表中刪除,并將刪除的節(jié)點(diǎn)重新組成一個(gè)新的鏈表。路由表建立示意圖如圖5所示。

    單個(gè)節(jié)點(diǎn)的屬性如下:
    struct mac_list
    {
    U8_t mac[6];                        //節(jié)點(diǎn)的MAC地址
    U8_t flag;
              //flag表示路由表中已建立該MAC對(duì)應(yīng)的路由項(xiàng)
    int use_tim;
  //此項(xiàng)只在中繼轉(zhuǎn)發(fā)時(shí)有用,表示轉(zhuǎn)發(fā)過(guò)程所花費(fèi)的時(shí)間
    U8_t num;                                            //節(jié)點(diǎn)的序號(hào)
    U8_t respond_num[10];
                            //記錄可以與自身進(jìn)行通信的電表序號(hào)
    struct mac_list *next;
    };
     完成第一次遍歷直抄搜索后,建立了以Head 1為首的單向鏈表(稱為第一層)。第一層中的各節(jié)點(diǎn)都可以直抄,它們?cè)诼酚杀碇兄灰顚?xiě)中繼級(jí)別和目的地址即可。由于是可以直抄的節(jié)點(diǎn),所以中繼級(jí)別填為0;
    (2)對(duì)剩下的節(jié)點(diǎn)進(jìn)行一級(jí)中繼遍歷搜索,依照鏈表中各節(jié)點(diǎn)的序列順序,依次選取第一層中單個(gè)節(jié)點(diǎn)作為剩下節(jié)點(diǎn)的一級(jí)中繼,對(duì)余下的節(jié)點(diǎn)進(jìn)行轉(zhuǎn)發(fā)抄收測(cè)試,如圖6所示。

    在一級(jí)中繼節(jié)點(diǎn)確定的過(guò)程中,第一層中的每個(gè)節(jié)點(diǎn)都會(huì)嘗試對(duì)剩下的節(jié)點(diǎn)進(jìn)行一級(jí)中繼轉(zhuǎn)發(fā),若剩下的節(jié)點(diǎn)中,存在能對(duì)中繼轉(zhuǎn)發(fā)幀作出回應(yīng)的節(jié)點(diǎn),則表明該節(jié)點(diǎn)可以進(jìn)行一級(jí)中繼抄收。通常一個(gè)節(jié)點(diǎn)的中繼抄收路徑存在好幾條,這時(shí)需要通過(guò)計(jì)算中繼抄收時(shí)間來(lái)選擇一條用時(shí)最短的路徑,這樣才能保證采集器抄收時(shí)用時(shí)最短。經(jīng)過(guò)對(duì)剩下節(jié)點(diǎn)進(jìn)行一級(jí)中繼遍歷抄收搜索后,剩下的節(jié)點(diǎn)中可以進(jìn)行一級(jí)中繼抄收的節(jié)點(diǎn)將會(huì)組成第二層。同樣,第二層由從Head中刪除的一級(jí)中繼抄收節(jié)點(diǎn)組成,并順序存儲(chǔ)在以Head2為頭節(jié)點(diǎn)的鏈表中,建立好的第二層結(jié)構(gòu)如圖7所示。

    (3)對(duì)剩下的節(jié)點(diǎn)進(jìn)行二級(jí)中繼遍歷搜索。一般而言,二級(jí)中繼可以做到對(duì)一臺(tái)區(qū)下所有節(jié)點(diǎn)的覆蓋。剩下的節(jié)點(diǎn)要進(jìn)行中繼路徑的確定,首先要確定它的父節(jié)點(diǎn)(二級(jí)中繼節(jié)點(diǎn)),父節(jié)點(diǎn)是從建立好的第二層來(lái)選擇的;然后確定它的一級(jí)中繼節(jié)點(diǎn),而一級(jí)中繼節(jié)點(diǎn)是從第一層中選擇的。由圖7可知,一級(jí)中繼路由建立完成之后,第一層與第二層有著確定的連接關(guān)系,所以在節(jié)點(diǎn)的屬性中設(shè)置了respond_num數(shù)組來(lái)記錄可以與自身進(jìn)行通信的電表序號(hào)。這樣,建立二級(jí)中繼時(shí)可通過(guò)比較從路由器發(fā)送二級(jí)中繼轉(zhuǎn)發(fā)命令到目的節(jié)點(diǎn)作出的響應(yīng),即這個(gè)通信過(guò)程所花費(fèi)的時(shí)間來(lái)確定中繼路徑。建立二級(jí)中繼的過(guò)程示意圖如圖8所示。

2.3 嵌入式Linux平臺(tái)下路由器的多線程程序設(shè)計(jì)
    Linux是一種完全開(kāi)源的32位操作系統(tǒng),它幾乎支持所有體系架構(gòu)的處理器。由于它具有開(kāi)源、可定制、安全、穩(wěn)定等特征,所以可對(duì)其進(jìn)行裁剪、修改使之能夠穩(wěn)定運(yùn)行在嵌入式開(kāi)發(fā)平臺(tái)上。針對(duì)電力載波通信路由器的實(shí)際應(yīng)用需求,本設(shè)計(jì)移植了Linux-2.6.29.4內(nèi)核至ARM9平臺(tái)上,并配置了EXT2/VFAT/NFS文件系統(tǒng)及串口和網(wǎng)絡(luò)通信驅(qū)動(dòng)。為了使路由器能夠更快速和穩(wěn)定地進(jìn)行路由、路由表動(dòng)態(tài)維護(hù)、抄表查詢等工作,本文提出了一種多線程的解決方案,利用Linux對(duì)多線程的支持很好地解決了各項(xiàng)任務(wù)的快速切換、相互通信等問(wèn)題。
    Linux系統(tǒng)下的多線程遵循POSIX線程接口,稱為pthread。編寫(xiě)Linux下的多線程程序,需要使用頭文件pthread.h,鏈接時(shí)需要使用庫(kù)libpthread.a[4]。在程序中,本文給路由表的建立分配了id_route線程,為串口2和網(wǎng)絡(luò)UDP通信分別分配了id_com和id_net線程。這三個(gè)線程是相互獨(dú)立的,其中串口2和網(wǎng)絡(luò)UDP線程以阻塞的方式來(lái)等待采集器發(fā)出的抄表查詢指令。線程的初始化工作均由pthread_creat函數(shù)來(lái)開(kāi)啟,id_route線程開(kāi)啟后,串口1開(kāi)始對(duì)外發(fā)送直抄、一級(jí)中繼抄表、二級(jí)中繼抄表的數(shù)據(jù)命令幀并根據(jù)接收到的節(jié)點(diǎn)響應(yīng)數(shù)據(jù)幀來(lái)建立臺(tái)區(qū)下相應(yīng)節(jié)點(diǎn)的路由信息。id_route線程結(jié)束后會(huì)激活id_reroute線程,這個(gè)線程主要是為下次路由表更新進(jìn)行定時(shí),定時(shí)時(shí)間設(shè)為20 min,即每隔20 min,更新一次路由表。id_route線程的主要功能就是不停地查詢20 min定時(shí)有沒(méi)有到,如果定時(shí)到,則關(guān)閉20 min定時(shí)器,并開(kāi)啟id_route線程。程序多線程化后,就要考慮線程間的同步問(wèn)題,如線程id_route正從文本文件中讀取當(dāng)中記錄的各個(gè)節(jié)點(diǎn)的MAC地址、id_net線程正試圖向文本文件中添加某一節(jié)點(diǎn)的MAC地址。如果兩個(gè)線程不加以同步,必會(huì)導(dǎo)致節(jié)點(diǎn)MAC地址的混亂。本設(shè)計(jì)采用一種稱為“互斥鎖”的同步方式,它可以保證任一時(shí)刻只有一個(gè)線程能訪問(wèn)它,利用這一性質(zhì)可以保護(hù)共享數(shù)據(jù)。建立路由表的線程流程圖如圖9所示。

    本文提出了一種路由路徑尋優(yōu)算法并在嵌入式Linux平臺(tái)下實(shí)現(xiàn)了這種路由算法,該算法可以保證節(jié)點(diǎn)搜索的不重復(fù)性、路由建立的快速性和數(shù)據(jù)抄收的正確性。利用Linux對(duì)多線程編程的支持及強(qiáng)大的網(wǎng)絡(luò)通信功能,實(shí)現(xiàn)了路由維護(hù)與網(wǎng)絡(luò)、串口通信的并發(fā)運(yùn)行,很好地滿足了自動(dòng)化抄表系統(tǒng)中對(duì)網(wǎng)絡(luò)通信和抄表實(shí)時(shí)性的要求。
參考文獻(xiàn)
[1]    DL/T 645-2007.多功能電能表通信規(guī)約[S].2008.
[2]    青島東軟電腦技術(shù)有限公司.PLCI36G-III-E電力載波芯片通信協(xié)議指南, 2010.
[3]    彭啟偉,張浩.基于多叉樹(shù)遍歷的中壓配電線載波自適應(yīng)中繼算法[M].電力系統(tǒng)通信, 2009(197):21-27.
[4]    童永清.Linux C編程實(shí)戰(zhàn)[J].北京:人民郵電出版社,2008.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。