中石油在油气产业自动化走在国内的前列,采用了标准的Zigbee无线协议,A11协议是多年前召集多家无线供应商共同研讨并制定的标准,中石油也对该协议的应用提出许多自己的要求。虽然中石油的数字化油田战略已经实施多年,有A11作为一种标准体系,但是由于各个厂家的技术水平,产品的可靠性和智能化水平不尽相同,在具体实施环节常会碰到一些障碍,容易发生不同厂家的数据互通问题,影响生产效率。具体而言,在无线仪表这块,由于有不同厂家的参与,虽然有A11标准确立了大方向,但各厂家的适配上有时仍需要相互协调,一般以RTU为主,不同厂家的传感器为辅。具体到项目环节,由于不同传感器厂家的自适应能力和兼容性测试验证做得不充分,在项目实施环节的表现差异较大。
目前能入围且批量部署并稳定运行的,大多是采用XBee无线模块的产品和方案。随着XBee系列产品的更新换代,能符合Zigbee 3.0标准的XBee3横空出世,慢慢地将替换原有的XBee S2C。A11协议并没有随时代变化而演进,而XBee3提供了许多新的特性,但也为向前兼容S2C 做了许多兼容优化。在实际应用中,不论是传感器还是RTU,XBee3都可以直接替换S2C部署在产品上。对于S2C和XBee3混合组网的场景,需要了解这两代产品的异同,以便尽可能在软件上实现无忧的混合组网智能部署,减少等待时间和丢包率以及人工干预的情况。本文试图从产品设计和兼容性验证,无线ZigBee协议的注意事项等方方面面来讨论如何让自家产品做到兼容百搭,智能部署。
一、初级篇
本节主要是针对初级用户,希望能简单地对无线模块进行配置,而不想在程序上做太多的智能部署设置的用户。虽然简单配置也能满足基本的项目实施和应用,但由于缺少程序的网络管理和智能部署功能,在参数和模块选型上要多下功夫。
1. 模块选型。
Digi XBee Zigbee模块是应用最为广泛的符合ZigBee联盟协议规范的无线模块。ZigBee系列模块从第一代的XBee S2B,演进到S2C,以及目前最新的XBee3,只要是ZigBee协议的模块,都可以相互兼容通信。
如果是新项目设计,尽量采用XBee3,老产品也应尽快升级,在PCB封装设计上尽量做到大小模块封装兼容,以应对供应链紧张时带来的风险。Digi的无线模块分为普通型和增强型,只有发射功率的区别,应尽量选择增强型版本,以在复杂的电磁环境中增强信号,减少丢包率。
2. 固件。
Digi会定期发布XBee模块的新固件,主要是增加功能特性并修复已知bug。如果没有解决bug或是新特性的需求,现有的模块并不需要升级到最新的固件版本。但XBee模块在生产时总是会以最新发布的固件来进行生产,反应到模块的标签上,就是不同的revision。一般情况下固件会在充分测试后发布,由于每个用户的应用配置不尽相同,很难保证某些特定配置下不会有一些bug出现,因此最好的方式是阅读Release Note,根据相关描述避开或绕过潜在的影响。建议客户在新的项目上马之前,对现用产品的当前可用的固件做充分测试,确保没问题后再量产。
下面列出近两年来一些中国区用户常碰到的固件问题和解决方案:
XBee S2C
问题固件:405F;主要问题:休眠节点的polling timeout异常。
问题固件:4061;主要问题:当休眠节点NJ<FF时,rejoin机制不可用,并且无法加回原父节点。
解决问题:回退或升级4059、4060、4062等固件版本。
XBee3
和XBee S2C混合组网时,协调器应至少用100B固件,不可用更早期的固件,以便真正兼容原S2C的协调器行为。
3. 参数配置。
中石油A11无线仪表规范在设立之初参考了当时Zigbee协议的标准和知名的XBee无线模块API标准,而ZigBee协议作为一种开放的无线物联网协议有许多优势,首先是安全性,中石油的物联网通信时需采用加密的ZigBee协议通信,因此各厂家的RTU和仪器仪表均需要开启加密模式。要做到互联互通,各厂家在加密参数上需要保持一致。传感器设备上,休眠参数上应尽量和协调器的休眠参数保持大致相同或接近。
有关XBee的休眠参数,许多人并未深刻理解其意义,可以参考附录1。
XBee3还应该设置C8=10,ET的值应该略大于休眠时长。此外,开启入网公告的功能有助于进阶用户的程序设计,因此通常JN=1。其它常见的参数请参考A11的协议要求。
值得注意的是,由于ZigBee 3.0的升级,XBee3和S2C中有些默认参数并不一样,通常您可以按S2C的参数来设置XBee3。但在ZigBee 3.0中引入分布式网络概念,其中EO默认是配置成2,也就是集中式网络;而在S2C上,并没有这个概念,因此S2C的EO默认值是0,而实际应用上也大多是使用S2C协调器来作为集中式网络的中心。因此通常在中石油的A11的加密网络中不用按S2C的EO值去设置XBee3,而是保持XBee3的EO=2,以防止在两种模块的混合网络中的出现协调器默认的0地址无效的情况。详情可以参考附录2。
二、进阶篇
ZigBee是一种无线网络协议,而ZigBee设备都必须支持ZigBee网络的基本功能。虽然XBee模块可以不需要应用程序配合来管理最基本的ZigBee网络,但在实际应用中,通常可以主动利用ZigBee协议的网络功能实现智能部署和安装调试。
设备列表:一个完备的ZigBee产品,是能够在程序空间建立一张通信设备的列表,它有一系列好处,比如可以记录并采用16位短地址的方式通信,减少出错机率。RTU可以对在网设备进行鉴权,主动剔除第三方设备,可以同时和多个目标设备通信,比如传感器不仅可以把数据传给RTU,还可以发给router设备等。通常可以在部署模式阶段主动扫描或是通过入网通知的API帧来添加设备到列表当中。对于设备列表,还应该有剔除的机制,毕竟有些设备会损坏,更新或替换,通常是以一定时间都无法成功通信上来作为设备已不在现场标志。
有两种API帧可作为设备入网通知来把设备添加到列表中,一种是利用ZigBee本身的Joining Announce,它的不依赖于JN参数,缺点是只有入网时有一次通知,并且不太好识别设备类型,因此这种方式通常还需要配合在部署时主动扫描。另一种是利用XBee的JN参数,当JN=1时,设备会在入网或reset后向网内其它设备公告自己的身份。油田上的设备经常有reset动作,即使错过了首次入网通知,还可以后续在对方设备reset后获取,因此这种方式添加设备列表比较容易。
运行模式:无线网络通常会有入网,离网等动作,因此在程序中制定产品的工作模式,有利于更高效组建好网络并保障可靠通信。比如在产品的部署阶段,可以定义为部署模式,此时以加快网络部署为目标,可以增加主动扫描的功能和一些握手鉴权等功能,在产品的正常工作模式下,可以关闭一些功能以便产品能无负担地专注于应用的实现。调试模式则可以开启一段调试代码,方便现场调试,虽然这些模式在产品设计中并非不可或缺,但合理安排仍可能最大化保障产品对各种异常环境的兼容能力。对于RTU来说,可以很方便通过按钮来切换模式;对于无按钮的传感器,则应该主要考虑在程序中智能实现各种模式的切换。
三、高级篇
XBee3已经推出有一段时间了,在许多项目上可以直接替换。但在一些特别的应用场景,仍可能存在一些尚未解决的兼容性bug。尽管由于zigbee 3.0协议的升级,一些兼容性的功能只能通过专用参数或在特定的参数组合下实现,Digi仍然会致力于让XBee3能完全取代和替换S2C,而不需要对传统使用S2C的产品作出修改。
最新发现的一个bug是在开启APS加密的情况下出现。XBee模块在开启EE后,网络包已经是加密了,但由于许多早期用户对ZigBee了解不深,在产品中还额外开启了APS加密。APS加密实际上是在加密网络包内对任意两点的应用层的payload再做进一步加密,意义不大,工业场景很少被使用。在XBee API模式中有个transmit option字段,默认为0x00,中石油不少RTU和传感器的早期用户就在XBee中采用了transmit option=0x60这种方式进行通讯。
下面做S2C和XBee3开启APS层加密通讯的兼容性测试。本次测试所用固件:100D和4061。
一、XBee3作为协调器, S2C作为路由器
方向:S2C –> XB3
刚开始时通讯正常,大约过5分钟后, S2C发不成功,错误代码:21 (Network ACK Failure)。
如果对S2C进行reset,仍不能修复,但错误代码变成:24 (Address not found)。
使用00作为协调器16位地址,结果仍一样。
方向:XB3 –> S2C
刚开始时通讯正常,大约过5分钟后,发不成功,错误代码:24 (Address not found)。
使用真实的16bit地址而不用FFFE,结果仍一样。
把S2C的EO改为和XBee3一样的0x2看看结果,要让双向通讯恢复,只有S2C发ATNR退网才行。
二、XBee3作为路由器,S2C作为协调器
奇怪的是,如果S2C作为协调器,XBee3作为路由器,并不会有这个bug。
初步结论:这是一个不常用的bug,只有当XBee3作为协调器时,S2C作为路由器时,并且API帧中的发送选项开启了APS加密(0x20或0x60),才会出现。
解决思路:
是否能在XBee3的配置中解决?很可能是NK或trust center的因素,需要测试以下几种临时解决方案:
1. 设置XBee3的EO=0。这个设置会导致地址0不能代表XBee3作为协调器了,S2C发XBee3只能用FFFE或是真实的16位短地址。如果用0作为短地址发不通,并且会阻塞后续的发送(除非退网)。
2. 固定NK的值。实验表明,NK即使双方配置成一样的默认值,这个bug也依然存在。
这个bug的解决要等Digi发布新版的XBee3固件。对于混合组网的设备产家来说,在程序中不盲目采用部分厂家的0x60发送选项的设备制造商,在S2C到XBee3换代升级过程中受到的影响最小。
补充:RTU为XBee S2C, 传感器为XBee3
1、因ET参数默认值产生传感器多次入网短地址发生变化的问题
问题描述:根据报告,当休眠参数SPSN的值大于ET定义的时间,则ET时间到后会有退网的现象。
用开发板重现:
S2C(4060固件)协调器配置:ZS=2, ID=58, CE=1, AP=1, AO=1,BD=7,SP=AF0,SN=7,SO=6,EE=1,EO=0,KY=11,NK=0, NI=end
XBee3(100B固件)休眠终端配置:ZS=2, ID=58, CE=0, AP=1, AO=1,BD=7,SP=AF0,SN=7,SO=6,EE=1,EO=0,KY=11,NK=0, NI=cord
测试时一般要记录一下MY的值,以观察是否有变化。
在XCTU上两个模块都可以观察到cluster 0013的入网通告,可见休眠节点有离网过程。由于重新加网,所以休眠节点的短地址会变化。这个问题可以归结于,ET比休眠周期小,它认为自己时间到了要重入网,而协调器为S2C只看休眠参数,并没有ET值。
解决方法:将ET值改为大于休眠周期的值,则这个问题消失。
2、更换协调器问题
参数配置同1,在S2C时,不论NJ<FF还是NJ=FF,都不需要发ATNR来离网,而是通讯不上时会自动离网,在XBee3时,需要发ATNR0, 通讯不上, polling没有时不会主动退网。
附录1:详解XBee ZigBee模块的休眠参数和相关意义
ZigBee设备可分为协调器,路由器和终端节点三种角色,其中只有终端节点可以休眠,在睡眠期间可以实现极低功耗,在醒来后又可获取休眠时期收到的数据。休眠参数不仅对终端节点有意义,在作为父节点的协调器或路由器,也同样有着重要的功能。
XCTU上,在配置界面的Sleep Modes区块,列出了所有的休眠参数:SP、SN、SM、ST、SO、WH、PO、ET,不同版本可用参数略有差异,下面详述:
SP:休眠周期。
休眠节点的SP代表休眠时间,也就是每隔SP*10ms的时间,休眠模块会醒来查询自己的数据。而在协调器或路由器上,它代表的是父节点收到数据后能为其子节点缓存多久。
SN:周期倍数。
这个参数用于设置polling timeout,算法是:3 * SN * (SP * 10ms)。休眠节点醒来时会向父节点查询自己的数据,这个过程叫polling。如果在polling timeout规定的时间内,父节点没有收到子节点查询请求,则父节点会把子节点从它的子节点列表中移除。XBee的协调器或路由器都能作为父节点为子节点缓存数据,每个模块最多可以挂20个子节点。当子节点从网络中移除,需要有个机制在父节点中也把该节点从列表中除名,也就是父节点不再为该子节点缓存数据,从而让出空间给其它节点,这个机制就叫polling timeout。值得注意的是,XBee3支持最新的ZigBee 3.0协议,支持休眠子节点设备入网时向父节点报告自己的polling timeout时间,也就是不同的设备可以有不同的超时时间,而不需要在父节点处统一设置。
ET:子节点超时时间。
这个ET是ZigBee 3.0后引入XBee3的,主要是用在休眠节点。对于混合组网的情况,当XBee3作为协调器或路由器,而网内有S2C的休眠节点时,应该把父节点的ET也配置得和休眠周期差不多,略大些即可。
ST:醒来时间。
该参数仅在周期休眠中使用(SM=4,5),其代表没数据活动多久后进入休眠。当XBee在收发数据时,模块不能立即进入休眠状态,它必须等待收发结束后一段空闲时间都再无数据,以保证收发数据能顺利完成。这个时间正是ST定义的。休眠节点醒来时polling父节点后,发现没有数据一般可以立即休眠,而无需等待ST时间,但有时模块不仅是接收,也需要外发信息,因此我们也可配置模块醒后保持ST时间,以有足够的时间通过串口来发送数据或命令,这是在后面的SO中配置。
SO:休眠选项。
这是两个字节的参数,注意bit0不用,目前仅bit1,bit2有定义。bit1: 在SN个休眠周期后,强制醒来ST时间。bit2: 启用扩展休眠周期,即休眠SN*SP时间。由于父节点在收到数据后只为子节点缓存SP定义的时间,而SP最大只能设置28秒,所以启用扩展休眠周期是有可能丢数据的。
WH:唤醒主机时间。
设备从睡眠中醒来,到发送数据到串口的允许时间。有些设备是通过XBee模块的信号唤醒或给处理器上电的,而主机醒来是需要时间,通过这个参数来确保从父节点收到的数据通过串口吐出给MCU时,MCU能准备好接收。
PO:查询时间。
这个参数定义模块醒着时,多久向父节点查询一次数据。默认是100ms。
通过理解模块的休眠参数,我们可很好的利用它的性能,灵活安排程序任务,最大少减少不必要的丢包。
附录2:从S2C升级到XBee3需要注意哪些问题
ZigBee 3.0对网络安全有着远比过去更严格的定义,为了适应这一变化,一些默认参数值在XBee3时代有了一些变化,在实际使用中,程序的逻辑应针对这些变化做相应的调整,特别是NJ参数和C8参数。
1、NJ
NJ是一个允许模块开放网络的参数。在S2C时代,它默认值是0xFF,表示任何时候都允许其它模块加入该网络;而在XBee3,它的默认值是0xFE,也就是在上电254秒后,会自动关闭加入功能。因此,如果和之前S2C混合组网,可以将该参数改为0xFF。必须注意的是,一个更安全的网络,应该是在适时开启加入,也就是一个网络出于安全考虑,应该只在开放部署时,才允许终端加入,应用程序设置有不同的模式(部署模式,开放部署维护模式,封网运作模式……),能更好地维护和管理无线网络。
2、C8
XBee3使用更新的zigbee协议栈,它计算LQI曲线和S2C不同,如果一个网络内全用XBee3,并不需要设置该参数,默认值就可以。如果一个网络内有S2C和XBee3混合组网,则需要把XBee3的C8设置成10,以便达到最好的效果。混合组网中,C8不设置的话,S2C会更容易成为router跳点。该参数在1009后引后,所有混合组网的用户,都建议把XBee3升级到1009之后的版本。
3、ET
在ZigBee 3.0中,子节点挂在父节点下的timeout时间可以自己申报,而不像以前一样由父节点的休眠参数来决定。这样会更灵活一些,在实际应用中,建议ET比休眠参数略大一些。
4、EO
在XBee3为了支持ZigBee 3.0的默认安全机制,参数中默认使用中心化的信任中心(EO=2),在S2C,默认是分布式的信任中心(EO=0). 在一个网络中,EO的bit1必须相同,以便它们知道如何做密钥交换。由于在S2C中,CE=1代表协调器,由它维护着集中式安全的网络。在ZigBee 3.0引入了分布式网络的概念,CE不再特指协调器。XBee3的Router为了加入之前S2C协调器维护的集中式网络,应该使用EO=2,而非和S2C一样配置为EO=0,该参数值在XBee3中无需更改。
5、DO
DO在S2C和XBee3有不同的定义,因此大多数情况下您无需更改它,使用默认值即可。
除了NJ参数外,其它一些参数默认值的不同也大多不会影响入网和通讯体验。如果您的应用程序在初始化时写入一些参数,请仔细检查程序是否将不适用的S2C参数值写入XBee3。
ZigBee 3.0在安全机制上做了一些修改。Digi为了保证和S2C老用户有一样的用户体验,在固件上做了一些适应。因此,在使用XBee3作为协调器的情况下,当有混合组网需求时,为了达到最好的向前兼容效果,需要使用100A以后的固件。