以太網(wǎng)網(wǎng)關(guān)節(jié)點在節(jié)能計量系統(tǒng)中的設(shè)計
作者:北京博控自動化技術(shù)有限公司技術(shù)總監(jiān) 劉楷
背 景
能耗監(jiān)測系統(tǒng):指通過對建筑和大型公共建筑安裝分類和分項能耗計量裝置,采用遠程傳輸?shù)仁侄渭皶r采集能耗數(shù)據(jù),實現(xiàn)重點建筑能耗的在線監(jiān)測和動態(tài)分析功能的硬件系統(tǒng)和軟件系統(tǒng)的統(tǒng)稱。
能耗監(jiān)控的技術(shù)核心在于能耗優(yōu)化,而優(yōu)化的前提是準(zhǔn)確的能耗計量以及優(yōu)化過程中能耗的計量。這樣由傳統(tǒng)意義上的“抄表”這樣簡單的數(shù)據(jù)集中演變成了“在線數(shù)據(jù)匯總與控制”,這就對網(wǎng)絡(luò)提出了更高的要求。
首先,要求網(wǎng)絡(luò)雙向速度。其次,要求靈活的網(wǎng)絡(luò)架構(gòu)。第三要求網(wǎng)絡(luò)能容納足夠的節(jié)點。
下圖就是一個典型的網(wǎng)絡(luò)示意圖:
對于每個建筑或者相對獨立的WPAN內(nèi)部可以使用無線、PLC或者以太網(wǎng)和無線混合組網(wǎng)方式。WPAN內(nèi)部的結(jié)構(gòu)如下圖所示:
圖中采集節(jié)點隨著能耗采集和控制方式演變也有多種形式,從最開始的公共建筑和廠礦中的三項電表,到如下圖所示家用、辦公室用的采集插座和無線燈控,越來越多。
整個系統(tǒng)中計量的核心在于具有數(shù)據(jù)匯聚和處理功能,并且保證PAN和WAN連接的網(wǎng)關(guān)節(jié)點。
下面我們就重點討論網(wǎng)關(guān)的設(shè)計。
設(shè) 計
網(wǎng)關(guān)節(jié)點的內(nèi)部結(jié)構(gòu)如下:
這部分內(nèi)容從函數(shù)的級別詳細解釋了代碼。我們將分別解釋PAN Co-ordinator和End Device的代碼。
config.h頭文件將被引用到兩個源代碼文件中,同時兩個源代碼文件也引用了以下的頭文件:
jendefs.h, AppHardwareApi.h, AppQueueApi.h, mac_sap.h, mac_pib.h
coordinator.c的內(nèi)容
開發(fā)者最常問的問題之一就是為什么Jennic的程序都沒有Main函數(shù),這個熟悉的函數(shù)哪里去了呢?這是因為Jennic程序都由boot loader來啟動和引導(dǎo),boot loader引導(dǎo)完成后就將自動的調(diào)用AppColdStart函數(shù),您可以認為AppColdStart就是我們通常所說的Main()。
AppColdStart將進行下面的操作:
1.AppColdStart將調(diào)用函數(shù)vInitSystem(),這一函數(shù)將完成以下任務(wù):
初始化設(shè)備的IEEE 802.15.4的協(xié)議棧
設(shè)置PAN ID和PAN Co-ordinator的短地址,在這個應(yīng)用中這些參數(shù)都由我們預(yù)定義在config.h這個文件中
打開射頻接收器
使Co-ordinator可以接受其他的設(shè)備加入網(wǎng)絡(luò)
2.AppColdStart()會調(diào)用vStartEnergyScan(),這一函數(shù)將會開始在各個通道進行能量掃描以獲得各個通道的能量級別。所掃描的通道以及速率都定義在config.h中。掃描將通過初始化一個MLME請求并將其發(fā)送給IEEE 802.15.4的MAC層來實現(xiàn)。
3.AppColdStart()將通過調(diào)用vProcessEventQueues()的方式等待MLME的回應(yīng)。vProcessEventQueues()函數(shù)將檢查三個不同類型的事件隊列并將接到的事件交給不同的事件處理函數(shù)處理。比如這個函數(shù)將調(diào)用vProcessIncomingMlme()函數(shù)來處理MLME回應(yīng)。 而這個函數(shù)將調(diào)用vHandleEnergyScanResponse()來處理能量檢測掃描的回應(yīng)結(jié)果。這個函數(shù)將檢查所有通道的能量級別,并挑選一個最安靜的通道作為建立網(wǎng)絡(luò)的通道。接下來將調(diào)用vStartCoordinator()函數(shù),這個函數(shù)將設(shè)置必要的參數(shù)并且遞交MLME請求來啟動網(wǎng)絡(luò),啟動網(wǎng)絡(luò)的請求不需要處理任何的回復(fù)信息。
4.AppColdStart()循環(huán)調(diào)用vProcessEventQueues()來等待其他設(shè)備的加入網(wǎng)絡(luò)的請求,入網(wǎng)請求將以MLME請求的方式發(fā)送到codinator.當(dāng)請求到達的時候函數(shù)將調(diào)用vHandleNodeAssociaTIon來處理。接下來codinator將創(chuàng)建并發(fā)送入網(wǎng)請求回復(fù)。
5.AppColdStart將循環(huán)調(diào)用vProcessEventQueues來處理來自于MCPS的消息隊列和來自于硬件的消息隊列。
當(dāng)數(shù)據(jù)到達MCPS隊列后,vProcessEventQueues首先調(diào)用函數(shù)vProcessIncomingMcps()來接收到達的數(shù)據(jù)幀.vProcessIncomingMcps()調(diào)用vHandleMcpsDataInd(),這個函數(shù)將調(diào)用vProcessReceivedDataPacket,在這個函數(shù)里面您可以自定義您自己的數(shù)據(jù)處理過程。
當(dāng)硬件事件到達硬件隊列后,vProcessEventQueues將調(diào)用函數(shù)vProcessIncomingHwEvent來接收到來的事件。您需要在這個函數(shù)中自定義自己的事件處理過程。
您可以參考下面的示意圖來理解
圖4-4-9 Coordinator程序流程圖
enddevice.c的內(nèi)容介紹
End Device的運行過程仍然是從AppColdStart開始。這一函數(shù)和Co-ordinator的運行方式完全的不同,下面將詳細的講解這個過程。
1.AppColdStart調(diào)用vInitSystem,這個函數(shù)將初始化IEEE 802.15.4的協(xié)議棧
2.AppColdStart()調(diào)用vStartAcTIveScan()開始對于活動通道的掃描, End Device將向掃描的通道發(fā)送信標(biāo)請求,并接收PAN Co-ordinator的信標(biāo)請求回應(yīng)。需要掃描的通道和速率將在config.h中定義。掃描請求的初始化和發(fā)送的工作可以通過MLME請求的方式通過IEEE 802.15.4的MAC層發(fā)送。
3.AppColdStart()將通過vProcessEventQueues來檢查和處理MLME回應(yīng)。這個函數(shù)將調(diào)用vProcessIncomingMlme()來處理收到的MLME回應(yīng)。vHandleAcTIveScanResponse()會被調(diào)用處理返回的活動通道掃描結(jié)果:
如果找到PAN Co-ordinator,函數(shù)將保存相應(yīng)的Co-ordinator信息(比如 PAN ID,短地址,邏輯通道),并且調(diào)用vStartAssociate()向Co-ordinator來提交入網(wǎng)請求,這一請求將通過MLME請求的方式提交。
如果PAN Co-ordinator沒有被找到(可能是由于Co-ordinator還沒有初始化完成)。這一函數(shù)將重新調(diào)用vStartAcTIveScan()來重新啟動掃描。
4. AppColdStart將循環(huán)的調(diào)用vProcessEventQueues()等待來自Co-ordinator的入網(wǎng)回復(fù)。當(dāng)收到回復(fù)后就將調(diào)用vProcessIncomingMlme(),然后將調(diào)用vHandleAssociateResponse來處理回復(fù),接下來的函數(shù)將檢查回復(fù)的狀態(tài):
如果PAN Co-ordinator接受的入網(wǎng)請求,將設(shè)備置于聯(lián)網(wǎng)狀態(tài)。
如果PAN Co-ordinator拒絕了入網(wǎng)的請求,函數(shù)就將重新調(diào)用vStartActiveScan()來開始搜索另外一個PAN Co-ordinator。
5. AppColdStart()接下來將循環(huán)的調(diào)用vProcessEventQueues來等待來自于PAN Co-ordinator的MCPS信息或者硬件的隊列信息。
當(dāng)數(shù)據(jù)到達了MCPS隊列,vProcessEventQueue()首先使用函數(shù)vProcessIncomingMcps()來接收數(shù)據(jù)幀,接著調(diào)用vHandleMcpsDataInd(),接著調(diào)用vProcessReceivedDataPacket(),開發(fā)人員可以在這個函數(shù)里面編寫自己的數(shù)據(jù)處理過程。
當(dāng)硬件事件到達硬件事件隊列,vProcessEventQueues()將調(diào)用vProcessIncomingHwEvent()來接收到達的事件,您可以在這個過程中編寫自己的事件處理邏輯。
下面的圖表示了End Device的工作過程。
圖4-4-10 EndDevice程序流程
W5500驅(qū)動:
Coordinator作為網(wǎng)絡(luò)的中心,通常也是數(shù)據(jù)匯聚的中心。因為我們在Coor的代碼中加入W5500的操作。
硬件連接上W5500作為SPI Slave工作,使用IO管腳如下:
在系統(tǒng)的初始化vInitSystem()中加入W5500的初始化,
// 初始化和W5500連接的SPI
vAHI_SpiConfigure(1, E_AHI_SPIM_MSB_FIRST, E_AHI_SPIM_TXPOS_EDGE,
E_AHI_SPIM_RXPOS_EDGE, 1, E_AHI_SPIM_INT_DISABLE,
E_AHI_SPIM_AUTOSLAVE_DSABL);
使用Eclipse IDE環(huán)境,在工程文件中添加W5500的驅(qū)動:
圖4-4-11 Eclipse IDE
在工程導(dǎo)航欄可以看到:
圖4-4-12 工程導(dǎo)航
然后,把wizchip_conf.c中的接口代碼替換為JN5168的SPI函數(shù):
void wizchip_cs_select(void)
{
/* select slave 1*/
vAHI_SpiSelect(E_AHI_SPIM_SLAVE_ENBLE_1);
};
void wizchip_cs_deselect(void)
{
vAHI_SpiStop();
};
uint8_t wizchip_spi_readbyte(void)
{
u8AHI_SpiReadTransfer8();
return 0;
};
void wizchip_spi_writebyte(uint8_t wb)
{
vAHI_SpiStartTransfer8(wb);
};
這樣就完成了代碼,我們可以看到無線IEEE802.15.4和以太網(wǎng)W5500的數(shù)據(jù)轉(zhuǎn)接。
結(jié) 論
在使用W5500后我們極大的簡化了WPAN網(wǎng)關(guān)設(shè)計,這樣保證了通訊速率和可靠性的要求下,用簡單的結(jié)構(gòu)詮釋了“簡單就是可靠”的道理。
——本文選自電子發(fā)燒友網(wǎng)4月《物聯(lián)網(wǎng)技術(shù)特刊》透視新設(shè)計欄目,轉(zhuǎn)載請注明出處,違者必究!
評論