本文主要作为本人的知识整理以及笔记,包括对DeviceNet的一些个人理解,后续若发现错误欢迎指出。
想要熟悉概念最好还是需要去看官方协议文档。DeviceNet最难的地方莫过于你看了协议之后,并不一定能理解它的报文,同时因为DeviceNet使用对象模型的方式,导致每个厂家有自己的设备对象表,而这个表是属于商业机密。因此,本文所用的例子仅仅为个人根据实际报文编造的数据,不涉及任何商业设备。
卷I: DeviceNet协议卷I
卷II: DeviceNet协议卷II
有关设备对象以及EDS说明需要参考卷II;
一、参考实例
某设备的启动报文:
序号 | CAN标识符(hex) | 长度 | 数据 |
---|---|---|---|
0 | 407 | 7 | 00 33 03 38 30 30 30 |
1 | 407 | 7 | 00 33 03 38 30 30 30 |
2 | 780 | 4 | 2a 4b 02 34 |
76a | 6 | 00 cb 02 03 0a 00 | |
3 | 700 | 8 | 2a 4b 03 00 01 00 02 00 |
6ea | 3 | 00 cb 02 |
|
4 | 700 | 7 | 2a 0e 01 00 01 00 01 |
6ea | 4 | 00 8e 33 03 | |
5 | 700 | 7 | 2a 0e 01 00 01 00 02 |
6ea | 4 | 00 8e 00 00 | |
6 | 700 | 7 | 2a 0e 01 00 01 00 03 |
6ea | 4 | 00 8e 01 00 | |
7 | 700 | 8 | aa 00 10 05 00 02 00 09 |
6ea | 2 | 80 c0 00 | |
8 | 700 | 3 | aa 81 4b 00 |
6ea | 3 | 80 c1 00 | |
6ea | 4 | 00 90 4c 00 | |
9 | 700 | 7 | 2a 0e 05 00 02 00 07 |
6ea | 4 | 00 8e 09 00 | |
10 | 700 | 7 | 2a 0e 05 00 02 00 08 |
6ea | 4 | 00 8e 05 00 | |
11 | 780 | 4 | 2a 4c 0a 00 |
76a | 2 | 00 cc |
某设备具有以下对象类(仅列举例子中所可能使用的项):
类属性 | ||||
---|---|---|---|---|
属性ID | 访问权限 | 名称 | 数据类型 | 默认值 |
0x01 | 只读 | 类版本号 | UINT | 1 |
0x02 | 只读 | 最大实例数 | UINT | 1 |
0x03 | 只读 | 实例值 | UINT | 1 |
实例属性 | ||||
---|---|---|---|---|
属性ID | 访问权限 | 名称 | 数据类型 | 默认值 |
0x01 | 只读 | Vendor ID | UINT | 819 |
0x02 | 只读 | DeviceType | UINT | 0x0C |
0x03 | 只读 | ProductCode | UINT | 0x01 |
类属性 | ||||
---|---|---|---|---|
属性ID | 访问权限 | 名称 | 数据类型 | 默认值 |
0x01 | 只读 | 前版本 | UINT | 1 |
实例属性 | ||||
---|---|---|---|---|
属性ID | 访问权限 | 名称 | 数据类型 | 默认值 |
0x01 | 读/写 | MAC ID | USINT | 63 |
0x02 | 读/写 | Baud Rate |
USINT | 2 |
0x03 | 只读 | Bus Off Interrupt |
BOOL | 0 |
0x04 | 读/写 | Bus-Off Counter | USINT | 0 |
0x05 | 只读 | Allocation Information | STRUCT of BYTE/USINT |
0~255 |
波特率 0 = 125K 1 = 250K 2 = 500K |
实例(该类没有类属性) | |
实例ID | 描述 |
0x01 | Explicit Message Connection for pre-defined connection set |
0x02 | I/O Poll Connection |
0x03 | I/O Strobe Connection |
0x04 | I/O COS/CYC Connection |
0x0A~0x0D | Explicit Message Servers |
0x14~0x15 | Explicit Message Clients |
实例属性 | ||||
---|---|---|---|---|
属性ID | 访问权限 | 名称 | 数据类型 | 默认值 |
0x09 | 读/写 | Expected Packet Rate | UINT | 定义连接定时器 |
后续所有解析的数据,均来自于该设备的启动通信报文,如果涉及到其他例子,会单独举例。
二、DeviceNet连接
DeviceNet是一个基于连接的网络系统,它主要以 ”生产者——消费者“ 的通信模型为主,同时它也支持 ”主——从“ 模型,以及点对点的模式。
对于DeviceNet而言CANID非常重要,DeviceNet对于CANID进行了区域定义,用来区分网络中的设备以及设备中对应的模块,通常来说DevcieNet的CAN标识符由设备的 MAC ID 以及 设备组 ID组成,DeviceNet把标识符区分成了4组:
位(bit) | ID范围 | 类别 | ||||||||||
10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
0 | 组1信息ID | 源 MAC ID | 0x000 ~ 0x3FF | 信息组1 | ||||||||
1 | 0 | 源/目的 MAC ID | 组2信息ID | 0x400 ~ 0x5FF | 信息组2 | |||||||
1 | 1 | 组3信息ID | 源 MAC ID | 0x600 ~ 0x7BF |
信息组3 | |||||||
1 | 1 | 1 | 1 | 1 | 组4信息ID | 0x7C0 ~ 0x7EF |
信息组4 | |||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | x | x | x | x | 0x7F0 ~ 0x7FF | 无效ID |
(该表非常重要,解析报文时需要经常用到)
由于DeviceNet只支持标准帧,因此第11位常为0。通常把本地对外发送请求的设备ID,称为源MAC ID,把接收请求的设备ID称为目的 MAC ID。由于CAN定义的仲裁关系,这里可以发现优先级排列为:信息组1 > 信息组2 > 信息组3 > 信息组4。
结合CAN的仲裁关系以及每组的标识符特征,通常的ID安排可以参考下表:
类别 | 作用 |
---|---|
信息组1 | 建立 I/O 连接 |
信息组2 | 建立预定义主/从连接,重名 MAC ID 检测 |
信息组3 | 建立显式连接 |
信息组4 | 建立离线连接组连接 |
除了建立离线连接组连接,其他的连接方式都需要在执行连接之前执行信息组2的重名MAC ID检测,确保在网络中MAC ID是唯一的。
2.1 显式连接(I/O信息 和 显式信息)
首先需要清楚的是,I/O信息传输与显式信息传输都是基于显式连接,他们是显式连接下不同的数据传输方式,也就是说明,他们都需要先建立显式连接之后才可以使用,显式连接建立后可以随意使用其中一种数据传输方式。
2.1.1 显式信息连接请求和响应(实例第2组数据)
显式信息传输格式为:信息头 + 信息体。如果该显式信息数据超过8个字节,则需要进行分段传输,分段传输的格式为:信息头 + 分段协议 + 信息体分段,分段传输的详情会在后续分段传输的章节详细说明,而信息头的格式是统一的。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字节 | ||||||||
0 | Frag | XID | MAC ID |
Frag:0表示该数据不需要分段,该帧包含完整的数据,1表示该数据不完整,下一个字节包含分段协议;
XID:该位通常会忽略,不包含实际逻辑意义;
MAC ID:根据CAN标识符的MAC ID来决定,如果CAN标识符已经定义源MAC ID,则该位为目的MAC ID,如果CAN标识符的MAC ID定义为目的MAC ID,则该部分为源MAC ID,以上情况仅会出现在信息组2数据,通常该位都为目的MAC ID。
显式信息连接请求对应实例中第2组指令。