转载:以太网网关节点在节能计量系统中的设计

Home / 博客 / 转载:以太网网关节点在节能计量系统中的设计

转载自:电子发烧友网4月《物联网技术特刊》透视新设计栏目

背 景

能耗监测系统:指通过对建筑和大型公共建筑安装分类和分项能耗计量装置,采用远程传输等手段及时采集能耗数据,实现重点建筑能耗的在线监测和动态分析功能的硬件系统和软件系统的统称。

能耗监控的技术核心在于能耗优化,而优化的前提是准确的能耗计量以及优化过程中能耗的计量。这样由传统意义上的“抄表”这样简单的数据集中演变成了“在线数据汇总与控制”,这就对网络提出了更高的要求。

首先,要求网络双向速度。其次,要求灵活的网络架构。第三要求网络能容纳足够的节点。

下图就是一个典型的网络示意图:

网络示意图

对于每个建筑或者相对独立的WPAN内部可以使用无线、PLC或者以太网和无线混合组网方式。WPAN内部的结构如下图所示:

WPAN内部结构图

图中采集节点随着能耗采集和控制方式演变也有多种形式,从最开始的公共建筑和厂矿中的三项电表,到如下图所示家用、办公室用的采集插座和无线灯控,越来越多。

电流检测插座

无线灯控装置

整个系统中计量的核心在于具有数据汇聚和处理功能,并且保证PAN和WAN连接的网关节点。

下面我们就重点讨论网关的设计。

设 计

网关节点的内部结构如下:

网关节点的内部结构

这部分内容从函数的级别详细解释了代码。我们将分别解释PAN Co-ordinator和End Device的代码。

config.h头文件将被引用到两个源代码文件中,同时两个源代码文件也引用了以下的头文件:

jendefs.h, AppHardwareApi.h, AppQueueApi.h, mac_sap.h, mac_pib.h

coordinator.c的内容

开发者最常问的问题之一就是为什么Jennic的程序都没有Main函数,这个熟悉的函数哪里去了呢?这是因为Jennic程序都由boot loader来启动和引导,boot loader引导完成后就将自动的调用AppColdStart函数,您可以认为AppColdStart就是我们通常所说的Main()。

  AppColdStart将进行下面的操作:

1.AppColdStart将调用函数vInitSystem(),这一函数将完成以下任务:

初始化设备的IEEE 802.15.4的协议栈

设置PAN ID和PAN Co-ordinator的短地址,在这个应用中这些参数都由我们预定义在config.h这个文件中

打开射频接收器

使Co-ordinator可以接受其他的设备加入网络

2.AppColdStart()会调用vStartEnergyScan(),这一函数将会开始在各个通道进行能量扫描以获得各个通道的能量级别。所扫描的通道以及速率都定义在config.h中。扫描将通过初始化一个MLME请求并将其发送给IEEE 802.15.4的MAC层来实现。

3.AppColdStart()将通过调用vProcessEventQueues()的方式等待MLME的回应。vProcessEventQueues()函数将检查三个不同类型的事件队列并将接到的事件交给不同的事件处理函数处理。比如这个函数将调用vProcessIncomingMlme()函数来处理MLME回应。 而这个函数将调用vHandleEnergyScanResponse()来处理能量检测扫描的回应结果。这个函数将检查所有通道的能量级别,并挑选一个最安静的通道作为建立网络的通道。接下来将调用vStartCoordinator()函数,这个函数将设置必要的参数并且递交MLME请求来启动网络,启动网络的请求不需要处理任何的回复信息。

4.AppColdStart()循环调用vProcessEventQueues()来等待其他设备的加入网络的请求,入网请求将以MLME请求的方式发送到codinator.当请求到达的时候函数将调用vHandleNodeAssociation来处理。接下来codinator将创建并发送入网请求回复。

5.AppColdStart将循环调用vProcessEventQueues来处理来自于MCPS的消息队列和来自于硬件的消息队列。

当数据到达MCPS队列后,vProcessEventQueues首先调用函数vProcessIncomingMcps()来接收到达的数据帧.vProcessIncomingMcps()调用vHandleMcpsDataInd(),这个函数将调用vProcessReceivedDataPacket,在这个函数里面您可以自定义您自己的数据处理过程。

当硬件事件到达硬件队列后,vProcessEventQueues将调用函数vProcessIncomingHwEvent来接收到来的事件。您需要在这个函数中自定义自己的事件处理过程。

您可以参考下面的示意图来理解

Coordinator程序流程图

  图4-4-9 Coordinator程序流程图

 

 

enddevice.c的内容介绍

End Device的运行过程仍然是从AppColdStart开始。这一函数和Co-ordinator的运行方式完全的不同,下面将详细的讲解这个过程。

1.AppColdStart调用vInitSystem,这个函数将初始化IEEE 802.15.4的协议栈

2.AppColdStart()调用vStartActiveScan()开始对于活动通道的扫描, End Device将向扫描的通道发送信标请求,并接收PAN Co-ordinator的信标请求回应。需要扫描的通道和速率将在config.h中定义。扫描请求的初始化和发送的工作可以通过MLME请求的方式通过IEEE 802.15.4的MAC层发送。

3.AppColdStart()将通过vProcessEventQueues来检查和处理MLME回应。这个函数将调用vProcessIncomingMlme()来处理收到的MLME回应。vHandleActiveScanResponse()会被调用处理返回的活动通道扫描结果:

如果找到PAN Co-ordinator,函数将保存相应的Co-ordinator信息(比如 PAN ID,短地址,逻辑通道),并且调用vStartAssociate()向Co-ordinator来提交入网请求,这一请求将通过MLME请求的方式提交。

如果PAN Co-ordinator没有被找到(可能是由于Co-ordinator还没有初始化完成)。这一函数将重新调用vStartActiveScan()来重新启动扫描。

4. AppColdStart将循环的调用vProcessEventQueues()等待来自Co-ordinator的入网回复。当收到回复后就将调用vProcessIncomingMlme(),然后将调用vHandleAssociateResponse来处理回复,接下来的函数将检查回复的状态:

如果PAN Co-ordinator接受的入网请求,将设备置于联网状态。

如果PAN Co-ordinator拒绝了入网的请求,函数就将重新调用vStartActiveScan()来开始搜索另外一个PAN Co-ordinator。

5. AppColdStart()接下来将循环的调用vProcessEventQueues来等待来自于PAN Co-ordinator的MCPS信息或者硬件的队列信息。

当数据到达了MCPS队列,vProcessEventQueue()首先使用函数vProcessIncomingMcps()来接收数据帧,接着调用vHandleMcpsDataInd(),接着调用vProcessReceivedDataPacket(),开发人员可以在这个函数里面编写自己的数据处理过程。

当硬件事件到达硬件事件队列,vProcessEventQueues()将调用vProcessIncomingHwEvent()来接收到达的事件,您可以在这个过程中编写自己的事件处理逻辑。

下面的图表示了End Device的工作过程。

EndDevice程序流程

图4-4-10 EndDevice程序流程

  W5500驱动:

Coordinator作为网络的中心,通常也是数据汇聚的中心。因为我们在Coor的代码中加入W5500的操作。

硬件连接上W5500作为SPI Slave工作,使用IO管脚如下:

IO管脚说明

在系统的初始化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环境,在工程文件中添加W5500的驱动:

Eclipse IDE

  图4-4-11 Eclipse IDE

  在工程导航栏可以看到:

工程导航

  图4-4-12 工程导航

  然后,把wizchip_conf.c中的接口代码替换为JN5168的SPI函数:

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和以太网W5500的数据转接。

 结 论

在使用W5500后我们极大的简化了WPAN网关设计,这样保证了通讯速率和可靠性的要求下,用简单的结构诠释了“简单就是可靠”的道理。