◆傅遷
(遼寧廣播電視大學(xué)丹東分校 遼寧 118000)
隨著持續(xù)的智能化電力系統(tǒng)不斷發(fā)展,對(duì)自動(dòng)化設(shè)備的通信技術(shù)提出了更高的要求。在要求穩(wěn)定可靠的通信同時(shí),它還需要盡可能多的網(wǎng)絡(luò)接口以及冗余的通信接口。傳統(tǒng)的通信中,模塊通常使用特定于CPU 的MAC 控制器以及獨(dú)立的PHY 來(lái)進(jìn)行網(wǎng)絡(luò)通信。受到資源的桎梏,CPU 通常僅設(shè)計(jì)有兩個(gè)MAC 控制器,從而對(duì)擴(kuò)展通信網(wǎng)絡(luò)的端口產(chǎn)生了限制。通過(guò)網(wǎng)絡(luò)交換芯片的88e6060 來(lái)設(shè)計(jì)具有五個(gè)或更多網(wǎng)絡(luò)端口的通信模塊比較容易,并且可以最大限度地滿(mǎn)足。電源系統(tǒng)關(guān)于通信的要求。
QNX 是一種類(lèi)似于UNIX 的操作系統(tǒng),也是實(shí)時(shí)的分布式操作系統(tǒng)。它通過(guò)特定微內(nèi)核的結(jié)構(gòu),可以通過(guò)內(nèi)核來(lái)、進(jìn)程通信、底層的網(wǎng)絡(luò)通信以及中斷處理,所以具有較小的內(nèi)核以及較快的運(yùn)行速度。把內(nèi)核中存儲(chǔ)的地址空間和文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議、應(yīng)用程序以及驅(qū)動(dòng)程序中存儲(chǔ)的地址空間分開(kāi)。應(yīng)用程序難以對(duì)內(nèi)核的空間進(jìn)行直接的訪(fǎng)問(wèn)。由于此類(lèi)微內(nèi)核的結(jié)構(gòu)較為封閉,外部模塊故障對(duì)內(nèi)核不能造成影響,大幅度地提升了系統(tǒng)的穩(wěn)定性。此外,QNX 支持?jǐn)U展以及調(diào)整,并且可以根據(jù)用戶(hù)需求對(duì)各種功能的模塊進(jìn)行定制,以開(kāi)發(fā)靈活的嵌入式模塊。
通信模塊通過(guò)AM3352 作為主控制的CPU。這是在A(yíng)RM Cortex-A8 內(nèi)核的微處理器基礎(chǔ)上,支持720MHz 的高主頻率,具有1600 DMIPS 的高計(jì)算能力,并且外圍的接口較為豐富??梢耘cDDR3結(jié)合使用以支持NAND 閃存以及eMM 的高容量。圖1 顯示了CPU和交換芯片之間連接情況。交換芯片是10/100 BaseT 的網(wǎng)絡(luò)收發(fā)器。端口P5 可以設(shè)計(jì)為以MII-PHY 模式連接到CPU。P0 到P4 可以與錄波器、DCS、信息子系統(tǒng)站以及其他網(wǎng)絡(luò)進(jìn)行通信。
圖1 CPU 和交換芯片之間連接情況
QNX 網(wǎng)絡(luò)模塊的實(shí)際使用分層的機(jī)構(gòu)。網(wǎng)絡(luò)設(shè)備的驅(qū)動(dòng)程序模塊位于最低級(jí)別,受到io-pkt 的管理以及調(diào)度,需要將數(shù)據(jù)的發(fā)送、傳遞以及接收情況向io-pkt 報(bào)告。中間層作為頂層以及底層之間搭建的數(shù)據(jù)橋,并為協(xié)議模塊提供較為一致的接口。頂層的資源管理器允許Socket API 調(diào)用的read、write 以及open 以及其他函數(shù)。利用讀取應(yīng)用程序?qū)訉?shù)據(jù)發(fā)送給io-pkt,并利用read 的應(yīng)用程序?qū)訉⒃从趇o-pkt 的數(shù)據(jù)進(jìn)行接收,利用write 這一應(yīng)用層將數(shù)據(jù)發(fā)送給io-pkt,而io-pkt 用于進(jìn)行UDP、TCP、IP 這類(lèi)的網(wǎng)絡(luò)傳輸協(xié)議。
3.2.1 初始化模塊的設(shè)計(jì)
初始化模塊映射寄存器的地址空間,對(duì)寄存器進(jìn)行配置,并向系統(tǒng)提供寄存器的中斷處理、數(shù)據(jù)包接收以及數(shù)據(jù)包發(fā)送等功能。這使系統(tǒng)能夠識(shí)別網(wǎng)絡(luò)設(shè)備,可以與網(wǎng)絡(luò)通信。最后,使用io-pkt 對(duì)數(shù)據(jù)包發(fā)送、接收進(jìn)行調(diào)用。程序先要清除TX_HDP 以及RX_HDP,把CPPI 空間的前4KB 分給接收隊(duì)列的描述字Rx_Descriptors,并將最后4KB 空間用于發(fā)送隊(duì)列的描述字Tx_Descriptors。 Rx_Descriptors是使用以下結(jié)構(gòu)界定的數(shù)組。它的Next 指向接下來(lái)的Rx_Descriptor,其Buffer 指向存儲(chǔ)數(shù)據(jù)主體儲(chǔ)存的RAM 空間,off_len 將有效數(shù)據(jù)的長(zhǎng)度存儲(chǔ)在Buffer 中。flag_len 對(duì)數(shù)據(jù)包的有效長(zhǎng)度以及緩沖區(qū)的狀態(tài)信息進(jìn)行存儲(chǔ)。
為Rx_Descriptor 建立單一方向的鏈接列表,以便RX_HDP 能指向鏈接的列表開(kāi)頭。列表詳見(jiàn)圖2。
圖2 接收隊(duì)列鏈表圖
建立隊(duì)列的描述表之后,驅(qū)動(dòng)程序必須調(diào)用設(shè)備的函數(shù)dev_attach,以將網(wǎng)絡(luò)設(shè)備 dev 分配給每個(gè)端口。必須為結(jié)構(gòu)iopkt_inter 對(duì)中斷使能函數(shù)以及中斷處理的函數(shù)進(jìn)行定義,并最終在io-pkt 中注冊(cè)名為ether_ifattach、if_attach 以及interrupt_entry_init 的函數(shù)。
將IP 地址對(duì)MAC 地址進(jìn)行映射,實(shí)現(xiàn)網(wǎng)絡(luò)中網(wǎng)絡(luò)設(shè)備的MAC地址是唯一的。初始化的程序進(jìn)行配置文件的讀取,并得到每個(gè)網(wǎng)絡(luò)設(shè)備具有的IP 地址。接下來(lái),將MAC[3:0]調(diào)整成IP[3:0],以對(duì)網(wǎng)絡(luò)設(shè)備的IP 地址以及MAC 地址進(jìn)行同步。
在正常工作中,電網(wǎng)通信的特征大體是流量較小,但突發(fā)的流量大。通過(guò)網(wǎng)絡(luò)發(fā)送具有各種特征的數(shù)據(jù)包會(huì)產(chǎn)生各種的流量特點(diǎn)。不正確的網(wǎng)絡(luò)配置可能導(dǎo)致不正確的數(shù)據(jù)包傳輸、網(wǎng)絡(luò)風(fēng)暴以及網(wǎng)絡(luò)通信系統(tǒng)運(yùn)行異常。所以,通信設(shè)備需要一項(xiàng)功能,可以抵御網(wǎng)絡(luò)的風(fēng)暴。所以,能夠?qū)M335X 的INT_CONTROL 以及RX_IMAX 寄存器配置為限制每毫秒可接收到的中斷數(shù)??梢钥刂瓢l(fā)生風(fēng)暴時(shí)消耗的系統(tǒng)資源,并在風(fēng)暴消失之后對(duì)通信的功能進(jìn)行快速地恢復(fù)。
下一步要對(duì)DMA 引擎進(jìn)行配置,打開(kāi)DMA 的發(fā)送以及接收使能,并中斷使能DMA 中。最后,利用SMI 配置交換機(jī)的芯片,并將PHY 配置為自動(dòng)協(xié)商操作的全雙工速率這一模式。為了實(shí)現(xiàn)網(wǎng)絡(luò)通信具有多個(gè)的網(wǎng)絡(luò)端口,應(yīng)根據(jù)表1 對(duì)交換機(jī)路由表進(jìn)行配置。
表1 VLANTable 的設(shè)置情況
配置成功之后,便呈現(xiàn)圖3 中連接情況。P0 至P4 與P5 是雙向的連接狀態(tài)。P0-P4 的接口收到源于外部的請(qǐng)求之后,經(jīng)由P5 接口將這些數(shù)據(jù)傳輸?shù)紺PU,CPU 完成處理后,P5 接口把數(shù)據(jù)傳輸?shù)秸?qǐng)求的端口。
圖3 路由圖的連接情況
3.2.2 中斷處理的設(shè)計(jì)
在網(wǎng)絡(luò)數(shù)據(jù)到達(dá)的時(shí)候,DMA 控制器將數(shù)據(jù)放置在外部的緩沖區(qū)中,并且CPU 對(duì)Rx_descriptor 中的flag_len、off_len 以及Buffer區(qū)域進(jìn)行更新。此外,中斷控制器生成一個(gè)中斷的信號(hào),然后io-pkt對(duì)該中斷進(jìn)行接管,并間接地調(diào)用驅(qū)動(dòng)程序中的函數(shù)process_interrupt。使用函數(shù)process_interrupt 調(diào)對(duì)函數(shù)Receive=進(jìn)行調(diào)用,并完成數(shù)據(jù)的接收。
3.2.3 接收數(shù)據(jù)的設(shè)計(jì)
接收函數(shù)利用接收隊(duì)列的描述字,進(jìn)而得到有效的數(shù)據(jù)長(zhǎng)度,并使用該長(zhǎng)度來(lái)對(duì)接收到的mbuf 數(shù)據(jù)鏈的mlen 以及m_pkthdr.len 域進(jìn)行更新。利用RMMI 從P5 接口接收的數(shù)據(jù)是帶有標(biāo)記的幀,在尾部帶有4 字節(jié)的定制標(biāo)簽,進(jìn)而在將數(shù)據(jù)發(fā)送給io-pkt 之前必須刪除其標(biāo)簽。在mlen 上執(zhí)行減號(hào)4 的運(yùn)算,同時(shí)通知源于哪個(gè)網(wǎng)絡(luò)接口的io-pkt 數(shù)據(jù)。標(biāo)記幀的定制標(biāo)簽的DPV[5:0]指示數(shù)據(jù)所源自的端口??梢允褂肈PV[5:0]對(duì)與網(wǎng)絡(luò)設(shè)備dev 有關(guān)的common_ecom[]的數(shù)組成員進(jìn)行確定。對(duì)網(wǎng)絡(luò)接口ifnet 進(jìn)行確定并將ifnet 參數(shù)在ip_input中傳遞,所以io-pkt 明白數(shù)據(jù)來(lái)自的網(wǎng)絡(luò)接口以及響應(yīng)數(shù)據(jù)將到達(dá)的網(wǎng)絡(luò)接口。
3.2.4 發(fā)送數(shù)據(jù)的設(shè)計(jì)
啟動(dòng)iif_start 這一分組傳輸?shù)暮瘮?shù)需要經(jīng)過(guò)io-pkt,并將響應(yīng)數(shù)據(jù)發(fā)給有關(guān)相的網(wǎng)絡(luò)接口。因?yàn)镻5 接口設(shè)計(jì)為egress trailer 的模式,所以驅(qū)動(dòng)程序必須在響應(yīng)數(shù)據(jù)的末尾之處添加一個(gè)tailer 標(biāo)簽,具體為4 字節(jié)。所以,數(shù)據(jù)區(qū)域m3 通過(guò)m_get 函數(shù)對(duì)數(shù)據(jù)區(qū)m3 進(jìn)行分配,用于tailer 標(biāo)簽的存儲(chǔ)??梢越?jīng)由if_start 函數(shù)中ifnet 這一參數(shù),確定其網(wǎng)絡(luò)的設(shè)備。網(wǎng)絡(luò)設(shè)備當(dāng)中,device_index 成對(duì)設(shè)備的ID 進(jìn)行存儲(chǔ),設(shè)備 ID 是數(shù)據(jù)發(fā)送到的端口序號(hào)。將 1 向左移動(dòng)device_index 位之后,然后將其寫(xiě)入m3 中的m_data 數(shù)據(jù)成員中。要告知88e6060 將數(shù)據(jù)發(fā)送到何處,把m3 與m2 的末尾進(jìn)行鏈接,進(jìn)而創(chuàng)建鏈接列表。由于添加了tailer 標(biāo)簽(大小為4 個(gè)字節(jié)),需要將成員m1 當(dāng)中的m_pkthdr.len 一直增加到4。最后,對(duì)發(fā)送隊(duì)列的描述字進(jìn)行更新,將發(fā)送隊(duì)列描述字的起始地址寫(xiě)入TX_HDP,并啟動(dòng)TXDMA 進(jìn)行數(shù)據(jù)的發(fā)送。
交換芯片88e6060 允許輕松、方便地對(duì)網(wǎng)絡(luò)的接口進(jìn)行擴(kuò)展,以實(shí)現(xiàn)電力系統(tǒng)中自動(dòng)化設(shè)備具有多個(gè)通信端口。88e6060 設(shè)計(jì)的通信模塊已完成實(shí)際測(cè)試。它的網(wǎng)絡(luò)通信穩(wěn)定、可靠并且能對(duì)抗網(wǎng)絡(luò)的風(fēng)暴。將其用在電力系統(tǒng)領(lǐng)域,可以確保電力系統(tǒng)的性能穩(wěn)定。