参考教程:https://www.bilibili.com/video/BV14q4y147PU?spm_id_from=333.788.videopod.episodes&vd_source=8f8a7bd7765d52551c498d7eaed8acd5
二、CANopen基础(下)
1、CANopen紧急报文
(1)紧急报文是事件触发型报文,仅当设备内部出现的致命错误时触发,以最高优先级发送到其它设备,适用于中断类型的错误报警信号。
(2)一个紧急报文的数据段包含8个字节,报文格式如下:
(3)16进制的应急错误代码如下表所示,应急错误代码中“xx”部分由相应的设备子协议定义。
(4)错误寄存器(Error Register)在设备的对象字典(索引0x1001)中有定义。下表说明了错误寄存器的位定义,设备可以将内部错误映射到这个状态字节中,快速查看当前错误。
2、SDO通讯
(1)SDO(Service Data Object,服务数据对象)概述:
①SDO主要用来在设备之间传输低优先级的对象,典型是用来对从设备进行配置、管理,比如修改速度环、位置环的PID参数,以及修改PDO配置参数等。
②通过使用索引和子索引,SDO使客户机能够访问(读或写)设备对象字典中的对象。
③通常情况下,传输的数据长度不超过4个字节,当数据长度超过4个字节时,需要分拆成几个报文。
④SDO协议是确认服务类型,每个请求消息都需要生成一个应答。SDO请求和应答报文总是包含8个字节。
(2)SDO的通讯对象标识符,使用中具体定义规则如下:
对象 | COB_ID | COB_ID范围 | 通讯对象 |
Tx-SDO(请求报文) | 0x600+节点地址 | 0x601-0x67F | / |
Rx-SDO(应答报文) | 0x580+节点地址 | 0x581-0x5FF | / |
(3)SDO读报文格式:
①SDO读报文的请求报文格式如下,其中命令字为0x40,Byte4-7为缺省内容,可填充0。
②SDO读报文的应答报文格式如下,Byte4-7为根据索引寻到的数据(最大4字节),根据数据的大小,命令字的选取如下:
如果数据为1字节,则命令字为0x4F
如果数据为2字节,则命令字为0x4B
如果数据为3字节,则命令字为0x47
如果数据为4字节,则命令字为0x43
如果失败,则命令字为0x80
(4)SDO读报文示例:
读取设备站号为0x01的伺服实际位置(Index为6063,Sub_Index为00,数据宽度为20bits),读到的数据是4个字节,CANopen数据低字节在前、高字节在后(小端模式),所以数据为FFFFFD113H(补码形式),转换成10进制即为-12013
请求(发送)报文的命令字为0x40,Bit4-Bit7缺省,以“0”填充;回应的数据长度为4个字节,所以应答(回应)报文的命令字为0x43
(5)SDO写报文格式:
①SDO写报文的请求报文格式如下,Byte4-7为请求写入对象索引指向对象的数据(最大4字节),根据数据的大小,命令字的选取如下:
如果数据为1字节,则命令字为0x2F
如果数据为2字节,则命令字为0x2B
如果数据为3字节,则命令字为0x27
如果数据为4字节,则命令字为0x23
②SDO写报文的请求报文格式如下,Byte4-7为缺省内容,可填充0或者主站请求写入的数据,如果写入成功,命令字为0x60,否则命令字为0x80。
(6)SDO写报文示例:
写设备站号为0x01的伺服目标位置(Index为607A,Sub_Index为00,数据宽度为20bits),请求写入的数据是4个字节,CANopen数据低字节在前、高字节在后(小端模式),所以数据为100000,转换成16进制即为000186A0H(补码形式)
请求的数据长度为4个字节,所以请求(发送)报文的命令字为0x23;应答(回应)报文的命令字为0x60,Bit4-Bit7缺省,以主站请求写入的数据填充
(7)如果SDO通讯失败,从站回复的报文格式如下,命令字为0x80,Bit4-Bit7为4字节的错误代码。