CAN OPEN协议
最近项目上用到了CAN OPEN协议的电机驱动器,结合驱动器手册研究一下CAN OPEN协议。学以致用,记录一下。
协议介绍
CAN OPEN协议在ISO 7层网络模型中处于应用层,CAN现场总线处于物理层,CAN OPEN协议是建立在CAN物理层基础上,对器帧ID和数据内容的含义进行重新定义。
CAN OPEN协议通常分为:
- 应用层:用户根据实际应用编写的应用对象。
- 对象字典:描述了应用对象和CAN OPEN报文之间的关系。
- 通讯:数据交互部分,本文重点。
CAN OPEN协议特点
小网络,控制信号的实时通讯协议。可以突发发送数据。
- 报文采用CAN标准帧,有11bit的ID域。
- 网络控制报文均采用数据最小字节数。比如心跳报文,只有 1 个字节数据。
- 需要接收方确认的配置参数一般都是采用快速单字传输。即 1 个报文最多传送 1 个 32 字节的参数变量,避免了分帧引起的实时性降低。
网络管理(NMT)与特殊协议(Special protocols)报文 ID 分类
为了稳定可靠可控,都需要设置一个网络管理主机,所有节点的启动、停止都是由他进行指挥。又称为 CANopen
主站。
NMT 主机和 NMT 从机之间通讯的报文就称为 NMT 网络管理报文
。管理报文负责层管理、网络管理和 ID 分配服务。例如,初始化、配置和网络管理(其中包括节点保护)。网络管理中,同一个网络中只允许有一个主节点、一个或多个从节点,并遵循主从模式。
为了协调各个节点的同步、心跳、时间、错误提示等通讯控制,CANopen 还定义了一系列特殊协议(Special protocols)报文。
NMT网络管理命令
CANopen 主节点通过发送 NMT 报文控制从节点的启动、停止、运行等状态切换,主节点发送 NMT 控制命令功能码为 000。
- demo
ID: 0x0000 数据:01 01 00 00 00 00 00 00 //启动1号子节点
报文ID分类
CANopen 协议中的各种通讯对象通过 11 位标识符中的功能码部分(10-7 位)进行分别,CAN 网络中各个从节点的 ID 用 Node-ID(6-0 位)表示,最多可以有 127 个从节点。
过程数据对象(PDO)和服务数据对象(SDO)
用户应用 CANopen 时,需要传递的配置信息和应用信息都是放在过程数据对象 PDO(Process data object)和服务数据对象 SDO (Service data object)里面。
PDO 和 SDO 的通讯区别:
- PDO 属于过程数据,即单向传输,无需接收节点回应CAN 报文来确认,从通讯术语上来说是属于“生产消费”模型。
- 而 SDO 属于服务数据,有指定被接收节点的地址(Node-ID),并且需要指定的接收节点回应 CAN 报文来确认已经接收,如果超时没有确认,则发送节点将会重新发送原报文。这种通讯方式属于常见的“服务器客户端”的通信模型,即我们通常所说的轮询式。
过程数据对象(PDO)
PDO 分为 TPDO(发送 PDO)和(接收 RPDO),发送和接收是以 CANopen 节点自身为参考(如果 CAN 主站或者其他从站就相反)。
PDO传输形式
- 同步传输
- 异步传输
服务数据对象(SDO)
SDO 用来访问一个设备的对象字典。访问者被称作客户(client),对象字典被访问且提供所请求服务的 CANopen 设备被称作服务器(server)。客户的 CAN 报文和服务器的应答 CAN 报文总是包含 8 字节数据(尽管不是所有的数据字节都一定有意义)。一个客户的请求一定有来自服务器的应答。
通讯原则
SDO 的通讯原则非常单一,发送方(客户端)发送 CAN-ID 为 600h+Node-ID 的报文,其中 Node-ID 为接收方(服务器)的节点地址,数据长度均为 8 字节;
接收方(服务器)成功接收后,回应 CAN-ID 为 580h+Node-ID 的报文。这里的 Node-ID依然是接收方(服务器)的节点地址,数据长度均为 8 字节。
- 报文基本格式
byte0 | byte1 | byte2 | byte4~7 |
---|---|---|---|
SDO命令字 | 索引 | 子索引 | 数据 |
快速SDO协议
SDO中最常见的就是快速SDO模式。所谓快速,就是 1 次来回就搞定。前提是读取和写入的值不能大于 32 位。如图 8.3 所示,为快速 SDO 协议的示意图。命令中直接包含了 要读写的索引、子索引、数据。
- demo
设备子节点ID:0x01,对象字典如下:
ID 数据
601 2F 60 60 00 01 00 00 00 //设置驱动为位置模式,1:位置模式 3:速度模式 4:力矩模式
601 2B 40 60 00 06 00 00 00 //驱动器切换至 ready to switch on 状态
601 2B 40 60 00 07 00 00 00 //驱动器切换至switch on 状态
601 2B 40 60 00 0F 00 00 00 //驱动器切换至 operation enable 电机伺服使能
601 23 81 60 00 88 13 00 00 //设置位置模式下速度 500r/min,单位0.1r/min。
601 23 7A 60 00 FF 7F 0F 00 //设置电机转动15.5圈,65535个脉冲转一圈。1015807
601 23 83 60 00 F4 01 00 00 //设置加减速时间500ms
601 2B 40 60 00 1F 00 00 00 //驱动器执行指令