文章目录
- 写在前面
- 1 物理层
- 2 数据链路层
- MSTP的流程如下
- note
- MS/TP帧格式
- 3 网络层
写在前面
这周加更一篇,来弥补一下之前落下的进度。简单的说两句,之前讲应用层的时候,只是跟官方的手册来同步一下,但是从个人理解来说,自下而上的讲解和理解是更有好处的。因此,今天我就把物理层,数据链路层和网络层放在一起来讲,这样形成一个自下而上的知识体系,应该更适合各位看官的理解。
物理层有很多,比如MS/TP, IP等等,在产品中比较常用也是这两种,尤其是MS/TP,因此,在这里我就以MS/TP为例进行讲解。IP的东西如果有时间或者精力的话,我再加进来。这里强调一下,数据链路层也就是MS/TP还是很有用的,肯定要弄懂。它是整个BACnet通信的基础,也就是BACnet正常运行起来的前提条件就是MS/TP通信是正常的。调试BACnet的时候,先是确定物理层的RS485是否正常,然后用抓包工具看整个总线的MS/TP是否正常工作,最后再看BACnet运行的service或者object是否正常。
1 物理层
其实,正常说来,MS/TP是数据链路层,而物理层是RS485。RS485其实就是串口改成差分信号,因此传输距离相对于串口有了很大的提升。作为firmware工程师,我就不在这里说硬件隔离什么的东西,我也不是很懂的。但是,从firmware工程师的角度来,物理层就是RS485或者说串口加使能引脚。
2 数据链路层
在这里的数据链路层,就是在整个RS485拓扑里面的设备能够共同完整地进行通信。它采用的方式就MS/TP(MASTER-SLAVE/TOKEN-PASS),字面的意思就是主从设备的令牌传输。在整个RS485的总线中,令牌是在主设备之间进行传输的,而从设备只是对总线中的数据进行侦听而已。
在MS/TP的总线中,每个设备都必须有一个唯一的地址来标识自己。这个地址是一个无符号的8bit数据,其中以0xFF为目的地址的数据代表广播数据,而0xFF不能作为源地址出现在MS/TP协议中。0-127都可以作为主节点和从节点的地址,而128-254只能作为从节点的地址。
MSTP的流程如下
假如在整个MS/TP总线中存在地址分别为1、3、5的三个设备。我们分别叫它们为阿大,阿二,阿三。
- 阿大、阿二、阿三都在总线上等着收消息。
- 三个人等了半天都没收到消息,也不知道总线上都有谁
- 阿大等不及了(阿大先等不及的原因是address越小,timeout的时间越小),阿大就开始问2地址有人不(用的是Poll for Master消息)?没人回复
- 阿大又开始问,3地址有人不?这时候,阿二开始回复我在啊!(用的是Reply Poll for Master消息)
- 阿大知道阿二在了,就告诉阿二,我用完总线了,你可以用总线了(也就是把token传给了3地址)
- 阿二这时候也不知道他的令牌传给谁,因此也需要在总线上问4地址的人在不在?
- 5地址的人在不在?阿三开始回复说,我在了。
- 阿二就告诉阿三,你可以说话了
- 阿三按照同样的方法找到了阿大,此时,阿大、阿二、阿三就都知道它们的下一个设备了
- 阿三就把令牌传给了阿大,在阿大拥有令牌的这段时间,阿大可以主动发起对话,其它设备只能进行回复
- 这样阿大说完话,就让阿二说,再让阿三说,周而复始
- 同时阿大、阿二、阿三还会周期的在总线上问其它的地址在不在,这样就能保证新设备也能加入这个对话流程
note
需要注意的是:
- 当总线上没有令牌的时候,超时时间=Tno_token + 地址 * Tslot,其中Tno_token是500ms,Tslot是10ms。因此,阿大最先发现没有令牌。
- 当阿三问地址在不在的时候,肯定有一个最大值,才能问道阿大,这个最大值是device object的一个property,需要在初始化的时候进行设定(max_master)
- 阿大、阿二、阿三每个人在自己的对话窗口期或者说令牌持有期能说多少话,也是有限制的,也是device的一个property,需要在初始化的时候进行设定
- 需要说明的是,阿大、阿二、阿三都是MASTER,这里面没有SLAVE,首先在BACnet里面基本上没有SLAVE的使用了;其次,从字义上也可以理解,SLAVE是无法获取令牌的,也就是SLAVE无法主动发起对话,只能等待其他人的问询,从而进行回复
- 阿大、阿二、阿三这种传递话语权和询问加入者的过程,就是MS/TP的过程,也就是数据链路层的过程,它保证了总线上的节点或者设备能够相互完整顺畅的通信起来
- 看到这里,各位看官基本上应该理解了整个链路层或者说MS/TP的工作过程,但是就会有看官问了,BACnet的通信是在哪里的呢?就是在阿大、阿二、阿三获取令牌之后,每个人说的话就是BACnet相关的通信了
MS/TP帧格式
前导码 | 帧类型 | 目的地址 | 源地址 | 长度 | 帧头CRC | 数据 | 数据CRC |
---|---|---|---|---|---|---|---|
2*U8 | 1*U8 | 1*U8 | 1*U8 | 2*U8 | 1*U8 | 可以没有 | 2*U8(可以没有) |
-
前导码由0x55和0xFF组成
-
帧类型包括
- 00 ———— Token:用于将总线的主导权传递给目的地址
- 01 ———— Poll For Master:用于发现总线上的MASTER设备,并决定令牌环上的后续设备
- 02 ———— Reply To Poll For Master:用于表示发送设备想加入到令牌环
- 03 ———— Test_Request:用于回环测试
- 04 ———— Test_Response:用于回环测试
- 05 ———— BACnet Data Expecting Reply:用于发送需确认的BACnet消息,消息长度可以使0-501
- 06 ———— BACnet Data Not Expecting Reply:用于发送不需要确认的BACnet消息,消息长度可以是0-501
- 07 ———— Reply PostPoned:当设备接收到需确认的消息的时候,来不及处理这个消息,就会回复Reply PostPoned用于告诉发送者,回复的设备需要等一会才能回复
- 32 ———— BACnet Extended Data Expecting Reply
- 33 ———— BACnet Extended Data Not Expecting Reply
- 8-21和34-127预留下来
- 128-255是为开发者用作非BACnet的私有帧用的,数据区的前两个字符必须填写唯一的开发者的id,所以数据的长度最少应该是2个字节,最大到501个字节
3 网络层
从上图中可以看到,物理层和数据链路层有很多选择,比如IP, RS485, LonTalk等等。但是网络层就一个选择,那么网络层是干什么的呢?网络层就是将具有多种物理硬件和数据链路层的设备整合起来进行通信的层。咱们在数据链路层也就是第2部分简单讲述了MS/TP的通信过程,但这个MS/TP的通信过程能够完成的条件就是所有的设备都是以RS485为硬件进行通信。如果整个网络中,既有IP设备,又有RS485设备,那怎么进行通信呢?这时就需要BACnet的网络层的功能了。这部分的具体实现,我就不在这里说明了。首先,在开发的过程,这部分的功能基本都是在协议栈中包含,对于开发者来说就是个黑盒,不需要太多关注;其次,我对这方面的研究还不足以通俗地把它讲解出来,因为它的分支很多,不像一个MS/TP一样,能一个逻辑的把整套东西讲完。所以呢,有兴趣的同学可以去研究一下协议本身。但是我建议你还是不要了,除非开发的时候遇到什么问题,因为就单单是它的帧头就会因为不同的情况有很多种形态,看的时候有点难。