,,
(國(guó)電南京自動(dòng)化股份有限公司,南京210032)
隨著電力系統(tǒng)智能化的不斷發(fā)展,對(duì)自動(dòng)化裝置的通信技術(shù)要求也越來越高,除了要求通信穩(wěn)定可靠外,還要求通信接口冗余、網(wǎng)絡(luò)接口盡量多等,而傳統(tǒng)的通信模件一般是利用CPU自帶的MAC控制器外加獨(dú)立PHY的方式實(shí)現(xiàn)網(wǎng)絡(luò)通信,由于資源的限制通常一個(gè)CPU僅提供2個(gè)MAC控制器,限制了對(duì)通網(wǎng)絡(luò)信口的擴(kuò)展,而通過采用網(wǎng)絡(luò)交換芯片88e6060可以很方便地設(shè)計(jì)出5網(wǎng)口甚至以上的通信模組,能最大化滿足電力系統(tǒng)通信需求。
QNX是類UNIX操作系統(tǒng),由加拿大QSSL公司(QNX Software System Ltd)開發(fā)的分布式實(shí)時(shí)操作系統(tǒng)。它采用獨(dú)特的微內(nèi)核結(jié)構(gòu),由內(nèi)核實(shí)現(xiàn)進(jìn)程通信、進(jìn)程調(diào)度、中斷處理和底層網(wǎng)絡(luò)通信,因此內(nèi)核非常小,運(yùn)行速度極快。將驅(qū)動(dòng)程序、應(yīng)用程序、網(wǎng)絡(luò)協(xié)議、文件系統(tǒng)存放的地址空間和內(nèi)核存放的地址空間分離,應(yīng)用程序無法直接訪問內(nèi)核空間,這種封閉的微內(nèi)核結(jié)構(gòu)使得任何外部模塊的故障都不會(huì)影響內(nèi)核的運(yùn)行,系統(tǒng)穩(wěn)定性大大提高,同時(shí)QNX支持裁剪和擴(kuò)展,能針對(duì)用戶需求定制不同的功能模塊,實(shí)現(xiàn)靈活的嵌入式開發(fā)。
圖1 交換芯片與CPU的連接示意圖
通信模件采用AM3352為主控CPU,它是一款基于ARM Cortex-A8內(nèi)核的微處理器,主頻最高支持720 MHz,運(yùn)算能力高達(dá)1600 DMIPS,具有豐富的外圍接口,能搭配DDR3,支持大容量的eMMC和NAND Flash。圖1給出了網(wǎng)絡(luò)交換芯片88e6060與CPU的連接示意圖,交換芯片作為10/100 BaseT網(wǎng)絡(luò)收發(fā)器,其端口P5設(shè)計(jì)成MII-PHY模式與CPU連接,P0、P1、P2、P3、P4用于與信息子站、DCS、錄波器等網(wǎng)絡(luò)通信。
QNX網(wǎng)絡(luò)模塊采用層次化結(jié)構(gòu)設(shè)計(jì),如圖2所示,網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)模塊處于最底層,接受io-pkt的調(diào)度和管理,負(fù)責(zé)向io-pkt報(bào)告數(shù)據(jù)收發(fā)情況,接收和傳遞數(shù)據(jù)。中間層是底層和頂層的數(shù)據(jù)橋梁,它提供統(tǒng)一接口給協(xié)議模塊。頂層resource manager提供了Socket API調(diào)用的open、write、read等函數(shù),通過read應(yīng)用層接收來自io-pkt的數(shù)據(jù),通過write應(yīng)用層發(fā)送數(shù)據(jù)到io-pkt,由io-pkt調(diào)用協(xié)議模塊實(shí)現(xiàn)IP、TCP、UDP等網(wǎng)絡(luò)傳輸協(xié)議。
圖2 網(wǎng)絡(luò)模塊層次結(jié)構(gòu)圖
網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序按功能可劃分為初始化模塊、中斷處理模塊、接收數(shù)據(jù)模塊、發(fā)送數(shù)據(jù)模塊、網(wǎng)絡(luò)設(shè)備信息統(tǒng)計(jì)模塊。
3.2.1 初始化
初始化模塊對(duì)寄存器地址空間進(jìn)行映射,完成對(duì)寄存器的配置,向系統(tǒng)注冊(cè)中斷處理函數(shù)、收包函數(shù)、發(fā)包函數(shù),讓系統(tǒng)知道網(wǎng)絡(luò)設(shè)備存在網(wǎng)絡(luò)通信的能力,并最終由io-pkt調(diào)用收包函數(shù)、發(fā)包函數(shù)實(shí)現(xiàn)數(shù)據(jù)的收發(fā)。程序首先清空RX_HDP和TX_HDP,將CPPI前4 KB空間分配給接收隊(duì)列描述字Rx_Descriptors,后4 KB空間分配給發(fā)送隊(duì)列描述字Tx_Descriptors。Rx_Descriptors是按下面結(jié)構(gòu)體定義的數(shù)組,其成員Next指向下一個(gè)Rx_Descriptor,成員Buffer指向數(shù)據(jù)體存放的RAM空間, 成員off_len存放Buffer中有效數(shù)據(jù)的長(zhǎng)度,成員flag_len存儲(chǔ)Buffer狀態(tài)信息和數(shù)據(jù)包的有效長(zhǎng)度。
typedef struct{
uint32_t next; /*Pointer to next descriptor*/
uint32_t buffer; /*Pointer to data buffer*/
uint32_t off_len; /*Buffer offset and length*/
uint32_t flag_len; /*Packet flag and length*/
} cppi_desc_t;
建立Rx_Descriptors的單向鏈接表,使RX_HDP指向鏈表的首端。建立起的鏈表如圖3所示。
圖3 接收隊(duì)列鏈表圖
隊(duì)列描述表建立好后,驅(qū)動(dòng)需要調(diào)用設(shè)備綁定函數(shù)dev_attach為每個(gè)端口分配一個(gè)網(wǎng)絡(luò)設(shè)備dev,dev封裝了網(wǎng)絡(luò)接口ifnet用于網(wǎng)絡(luò)設(shè)備的管理,ifnet定義了啟動(dòng)分組的傳輸函數(shù)if_start、初始化接口函數(shù)if_init、控制命令函數(shù)if_ioctl。QNX下的網(wǎng)絡(luò)驅(qū)動(dòng)不直接響應(yīng)中斷處理,而是由io-pkt接管中斷間接調(diào)用驅(qū)動(dòng)提供的process_interrupt函數(shù)處理中斷,為此需要對(duì)結(jié)構(gòu)體iopkt_inter定義中斷處理函數(shù)process_interrupt和中斷使能函數(shù)enable_interrupt,最后調(diào)用interrupt_entry_init、if_attach、ether_ifattach將上述函數(shù)注冊(cè)進(jìn)io-pkt。
為了保證網(wǎng)絡(luò)上網(wǎng)絡(luò)設(shè)備MAC地址的唯一性,采取了將IP地址映射到MAC地址的方法,由初始化程序讀配置文件獲取各網(wǎng)絡(luò)設(shè)備的IP地址,然后將MAC[3:0]設(shè)置成IP[3:0],從而實(shí)現(xiàn)了網(wǎng)絡(luò)設(shè)備MAC地址與IP地址的同步。
電力系統(tǒng)通信的主要特點(diǎn)是正常運(yùn)行流量較小,突發(fā)流量較大[1]。不同特點(diǎn)的報(bào)文在網(wǎng)絡(luò)上傳輸會(huì)產(chǎn)生不同流量特征,如果網(wǎng)絡(luò)配置不當(dāng),將會(huì)產(chǎn)生不合理的報(bào)文傳輸,造成網(wǎng)絡(luò)風(fēng)暴[2],使網(wǎng)絡(luò)通信系統(tǒng)癱瘓,因此要求通信裝置有抵御網(wǎng)絡(luò)風(fēng)暴的能力。為此可以通過配置AM335X的RX_IMAX和INT_CONTROL寄存器,對(duì)每毫秒接收中斷次數(shù)加以限制,風(fēng)暴來臨時(shí)能控制系統(tǒng)資源消耗,風(fēng)暴消失后能快速恢復(fù)通信能力。
接下來需要配置DMA引擎,開放DMA接收使能和發(fā)送使能,使能DMA中斷。最后通過SMI對(duì)交換芯片進(jìn)行配置,配置PHY為全雙工速率的自動(dòng)協(xié)商工作模式。將P5口設(shè)置成egress trailer模式,出該端口的數(shù)據(jù)尾端都會(huì)被88e6060打上4字節(jié)的trailer標(biāo)簽。同樣CPU發(fā)往該端口的數(shù)據(jù)由驅(qū)動(dòng)程序在數(shù)據(jù)尾端打上4字節(jié)trailer標(biāo)簽,通知88e6060數(shù)據(jù)要發(fā)到哪個(gè)端口。trailer標(biāo)簽的格式如圖4所示,DPV[5:0]標(biāo)識(shí)了數(shù)據(jù)要發(fā)往哪個(gè)端口。P0、P1、P2、P3、P4設(shè)置成普通模式,進(jìn)出該端口的數(shù)據(jù)是不被修改的未標(biāo)記幀。
圖4 Marvell trailer標(biāo)簽格式
為了實(shí)現(xiàn)多網(wǎng)口的網(wǎng)絡(luò)通信,需要按表1配置交換機(jī)路由表。
表1 VLANTable設(shè)置
配置完成后形成圖5所示的連接關(guān)系,P0、P1、P2、P3、P4同P5保持雙向的連接,P0、P1、P2、P3、P4接收外部請(qǐng)求后通過P5接口把請(qǐng)求數(shù)據(jù)轉(zhuǎn)發(fā)給CPU,CPU處理完畢后,由P5接口把數(shù)據(jù)轉(zhuǎn)發(fā)給請(qǐng)求端口。
圖5 路由圖連接關(guān)系
由于P5接口收到的包可能來自P0~P4中的任意一個(gè)端口,所以需要在收包函數(shù)Receive里告訴io-pkt收到的數(shù)據(jù)來自哪一個(gè)端口,為此在網(wǎng)絡(luò)設(shè)備dev里定義了數(shù)組成員common_ecom[0~5]用于存儲(chǔ)各網(wǎng)絡(luò)設(shè)備和各網(wǎng)絡(luò)接口的對(duì)應(yīng)關(guān)系,從而通過網(wǎng)絡(luò)設(shè)備可以快速找到網(wǎng)絡(luò)接口ifnet。
3.2.2 中斷處理
當(dāng)網(wǎng)絡(luò)數(shù)據(jù)到來時(shí),由DMA控制器將數(shù)據(jù)放到外部Buffer,CPU更新Rx_descriptor的Buffer 域、off_len域和flag_len域,同時(shí)中斷控制器產(chǎn)生中斷信號(hào),io-pkt接管中斷,間接調(diào)用驅(qū)動(dòng)提供的process_interrupt函數(shù),通過process_interrupt函數(shù)調(diào)用Receive函數(shù)接收數(shù)據(jù)。
3.2.3 接收數(shù)據(jù)
Receive函數(shù)從接收隊(duì)列描述字獲取有效數(shù)據(jù)長(zhǎng)度,用這個(gè)長(zhǎng)度更新接收數(shù)據(jù)鏈mbuf的m_pkthdr.len域和mlen域。由于通過RMMI收到的來自交換芯片P5接口的數(shù)據(jù)是尾部被打上4字節(jié)tailer標(biāo)簽的標(biāo)記幀,所以數(shù)據(jù)送到io-pkt前需要去掉tailer標(biāo)簽,為此只需要對(duì)mbuf的m_pkthdr.len域和mlen域做減4操作,同時(shí)要告知io-pkt數(shù)據(jù)是來自哪一個(gè)網(wǎng)絡(luò)接口。標(biāo)記幀的tailer標(biāo)簽DPV[5:0]域指明了數(shù)據(jù)是來自哪一個(gè)端口,通過DPV[5:0]可以找到網(wǎng)絡(luò)設(shè)備dev對(duì)應(yīng)的common_ecom[]數(shù)組成員,從而確定網(wǎng)絡(luò)接口ifnet,將ifnet作為參數(shù)傳入ip_input,這樣io-pkt就知道數(shù)據(jù)來自哪一個(gè)網(wǎng)絡(luò)接口以及應(yīng)答數(shù)據(jù)要送往哪一個(gè)網(wǎng)絡(luò)接口。
3.2.4 發(fā)送數(shù)據(jù)
由io-pkt啟動(dòng)分組傳輸函數(shù)if_start將應(yīng)答數(shù)據(jù)發(fā)往對(duì)應(yīng)的網(wǎng)絡(luò)接口。由于P5接口設(shè)置成了egress trailer模式,需要由驅(qū)動(dòng)在應(yīng)答數(shù)據(jù)末尾加上4字節(jié)的tailer標(biāo)簽,為此,通過m_get函數(shù)從系統(tǒng)空間分配數(shù)據(jù)區(qū)m3用于存放tailer標(biāo)簽。通過if_start函數(shù)的ifnet參數(shù)可以找到對(duì)應(yīng)的網(wǎng)絡(luò)設(shè)備,網(wǎng)絡(luò)設(shè)備的device_index成員存儲(chǔ)了設(shè)備ID即數(shù)據(jù)要發(fā)往的端口號(hào),把1左移device_index位后寫到m3的數(shù)據(jù)成員m_data[1],用于通知88e6060數(shù)據(jù)要發(fā)往哪個(gè)端口,然后將m3鏈接到m2的尾端形成如圖6所示的鏈表。因?yàn)樵黾恿?字節(jié)的tailer標(biāo)簽,m1成員m_pkthdr.len需要加4。最后更新發(fā)送隊(duì)列描述字,向TX_HDP寫入發(fā)送隊(duì)列描述字首地址啟動(dòng)TX DMA發(fā)送數(shù)據(jù)。
驅(qū)動(dòng)程序編寫好后需要配置腳本文件,通過腳本啟動(dòng)網(wǎng)絡(luò)設(shè)備。腳本配置如下:
io-pkt-v4-hc-dam335x deviceindex=0
ifconfig dm0 172.20.6.220 up
ifconfig dm1 172.30.6.220 up
……
利用交換芯片88e6060可以很方便、容易地?cái)U(kuò)展網(wǎng)絡(luò)接口,能滿足電力系統(tǒng)自動(dòng)化裝置對(duì)多通信口的需求。對(duì)利用88e6060設(shè)計(jì)出來的通信模件進(jìn)行了實(shí)測(cè),
其網(wǎng)絡(luò)通信可靠、穩(wěn)定,能抵御網(wǎng)絡(luò)風(fēng)暴,將其應(yīng)用于電力系統(tǒng)能大大提高電力系統(tǒng)的穩(wěn)定性。
圖6 添加tailer標(biāo)簽示意圖