CAN 通讯功能
本机 CAN 接口支持 Canopen SDO 数据传输协议,SDO 主要用来在设备之间传输低优先级的对象,这种数据传输跟 MODBUS 的方式类似, 即主站发出后, 需要从站返回数据响应:Client→Server/Server→Client.SDO 的基本结构。CAN 总线采用终端电阻匹配方式,需在总线两端节点的 CAN_H 与 CAN_L 之间各配置一个 120Ω 终端匹配电阻,以抑制信号反射、提高通信稳定性。总线中间节点不应增加终端电阻,否则会降低总线等效阻抗,影响通信可靠性。
| SDO 的基本结构 | |||
|---|---|---|---|
| Byte0 | Byte1-2 | Byte3 | Byte4-7 |
| SDO Command specifier | 对象索引(Index) | 对象子索引(SubIndex) | 最大 4 字节数据 |
对象索引的 2 个字节,最大 4 字节数据的 4 个字节都是低位在前,高位在后排列的。
比如说对象索引为 0x606C,那么 Byte1=6C,Byte2=60。
读取参数
| Identifier | DLC | Data | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
| 发送 SDO 报文 | 0x600+Node_ID | 8 | 发送命令字 | 对象索引 | 对象子索引 | 00 | ||||
| 接收 SDO 报文 | 0x580+Node_ID | 8 | 接收命令字 | 对象索引 | 对象子索引 | 最大 4 字节数据 | ||||
- 发送命令字:均为0x40
- 接收命令字:0x4F-接收数据为 1 个字节; 0x4B-接收数据为 2 个字节; 0x43-接收数据为 4 个字节
- 实例:通过 SDO 方式,发送以下命令读取 1 号电机的实际位置(0x606300)
实际位置 = 0x05D9(HEX)= 1497(DEC)Identifier 命令字 对象索引 对象子索引 最大 4 字节数据 发送报文 0x601 0x40 0x63 0x60 0x00 0x00 0x00 0x00 0x00 接收报文 0x581 0x43 0x63 0x60 0x00 0xD9 0x05 0x00 0x00 
修改参数
| Identifier | DLC | Data | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
| 发送 SDO 报文 | 0x600+Node_ID | 8 | 发送命令字 | 对象索引 | 对象子索引 | 最大 4 字节数据 | ||||
| 接收 SDO 报文 | 0x580+Node_ID | 8 | 接收命令字 | 对象索引 | 对象子索引 | 最大 4 字节数据 | ||||
- 发送命令字:0x2F-发送数据为 1 个字节; 0x2B-发送数据为 2 个字节; 0x23-发送数据为 4 个字节
- 接收命令字:0x60-发送报文发送成功; 0x80-发送报文发送失败
- 实例:通过SDO方式,控制1号电机的轴(0x604000),首次写入0x06令电机断电松轴,随后写入0x0F使电机上电并锁轴。
Identifier 命令字 对象索引 对象子索引 最大 4 字节数据 首次发送报文 0x601 0x2B 0x40 0x60 0x00 0x06 0x00 0x00 0x00 首次接收报文 0x581 0x60 0x40 0x60 0x00 0x06 0x00 0x00 0x00 第二次发送报文 0x601 0x2B 0x40 0x60 0x00 0x0F 0x00 0x00 0x00 第二次接收报文 0x581 0x60 0x40 0x60 0x00 0x0F 0x00 0x00 0x00 
PDO 功能
驱动器自带简易的 PDO 功能,不需要 CAN 主站进行配置。
| PDO1 报文格式 | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| Identifier | DLC | Data | |||||||
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
| 0x180+Node_ID | 8 | 映射到对象 0x60F919(实际速度_0.001rpm) | 映射到对象 0x606300(实际位置) | ||||||
CAN 通讯实例
实例1:读取电机实际电流 Iq
通过查阅常用对象列表中的"表 F1-3 测量数据"列表,可知"实际电流 Iq"对象地址为 0x607800,且是个 16 位有符号数。
假设当前电机实际电流为 1Arms通过单位转换[DEC]=[Arms] * 1.414 * 2048 / 15,1Arms=193(DEC)= C1(HEX)
| Identifier | 命令字 | 对象索引 | 对象子索引 | 最大 4 字节数据 | |||||
|---|---|---|---|---|---|---|---|---|---|
| 主机发送报文 | 0x601 | 0x40 | 0x78 | 0x60 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
| 本机回应报文 | 0x581 | 0x4B | 0x78 | 0x60 | 0x00 | 0xC1 | 0x00 | 0x00 | 0x00 |
实例2:写目标速度(更精细速度命令)
通过查阅常用对象列表中的"表 F1-2 基本模式及控制"列表,可知"目标速度"对象地址为0x60FF00,且是个 32 位有符号数。
假设要实现是 150rpm 速度命令,通过公式 U[y,x]:[DEC]=([rpm] * 512 * [反馈精度]) / 1875
计算出对应的 DEC 数值, 这里[反馈精度]是 4096, [DEC]=(150 * 512 * 4096) / 1875= 167772,即十六进制为 0x28F5C
| Identifier | 命令字 | 对象索引 | 对象子索引 | 最大 4 字节数据 | |||||
|---|---|---|---|---|---|---|---|---|---|
| 主机发送报文 | 0x601 | 0x23 | 0xFF | 0x60 | 0x00 | 0x5C | 0x8F | 0x02 | 0x00 |
| 本机回应报文 | 0x581 | 0x60 | 0xFF | 0x60 | 0x00 | 0x5C | 0x8F | 0x02 | 0x00 |
实例3:CAN PDO 通讯实例
-
开启 PDO
通过查阅常用对象列表中的"表 F1-5 通讯参数"列表,可知"开启 PDO"对象地址为0x470001,且是个 8 位无符号数。Identifier 命令字 对象索引 对象子索引 最大 4 字节数据 主机发送报文 0x601 0x2F 0x00 0x47 0x01 0x01 0x00 0x00 0x00 本机回应报文 0x581 0x60 0x00 0x47 0x01 0x01 0x00 0x00 0x00 -
从机将主动上报实际速度和实际位置
如果电机实际速度为 10rpm(转换 HEX 为 2710),实际位置为 1000 DEC(转换 HEX 为 3E8)
每隔禁止时间(默认 10ms)本机将主动发送Identifier 命令字 对象索引 对象子索引 最大 4 字节数据 本机主动发送报文 0x181 0x10 0x27 0x00 0x00 0xE8 0x03 0x00 0x00