一、CAN和CANopen介绍
CAN(Controller Area Network)通讯以其高效率高稳定的特性,被广泛应用在汽车电子、工业自动化以及物联网通讯系统中。CANopen是基于CAN的通讯子协议,是一种为用于产品部件内部网络通讯而开发的系统。其子协议CiA401,规范了数字量输入、数字量输出和模拟量采集相关的使用方法。智嵌物联ZQWL研发的带有CAN通讯接口的采集控制终端模块均实现了CANopen CiA401协议,可以非常方便的接入现有的CAN控制网络系统,缩短了开发周期,节省了开发费用。本文以智嵌物联ZQWL所研发的产品ZQWL-IO-1DARA8A为例,介绍CANopen如何在智嵌物联CAN产品中应用的。
先准备好产品1DARA8和USB-CAN调试器(ZQWL-UCAN-5C111):
该模块支持标准的CANopen(CiA401)协议,用户通过简单配置后可以直接将其接入CANopen通讯网络或替代原有的CANopen设备。模块主要功能包括:
●1个TPDO,用于传送开关量输入状态(DI)。
●1个RPDO,用于接收开关量输出状态(DO)。
●NMT服务器功能,处理NMT主机发来的命令。
●SDO功能,配置和读取CANopen字典。
●DI极性控制、全局中断控制、单个DI中断控制以及DI的电平触发方式控制(任意变化触发、Low to High触发或者High to Low触发)。
●DO极性控制;设备故障或收到stop命令后的DO状态可配置。
●CAN波特率可配置。
●保存整部对象字典到flash和恢复整部对象字典到出厂值。
CANopen的CiA401设备子协议详细描述了对象字典的定义以及功能,该模块实现了DI/DO部分,模块的对象字典如下表:
Index | 子索引 Subindex | 名称 name | 类型 Type | 属性 Attr. | 默认值 default | 说明 description |
1000 | 0 | 设备类型 | u32 | RO | 0x00030191 | 支持CiA401的DI和DO |
1003 | 0 | Errors Register | u8 | RO | 0 | 错误寄存器 |
1005 | 0 | Sync COB-ID | u32 | RW | 0 | 同步报文COB-ID |
1006 | 0 | Sync Period | u32 | RW | 0 | 同步周期 |
1008 | 0 | Manufacturer | string | RO | ZQWL | 制造商 |
1009 | 0 | Hard Version | string | RO | V3.0 | 硬件版本 |
100A | 0 | Soft Version | string | RO | V3.0 | 软件版本 |
1010 | 0 | Num ofSubindex | u8 | RO | 1 | 子索引数目 |
1 | Save all OD | u32 | W | 0x65766173 | 保存整部对象字典;读时,返回0x00000001 | |
1011 | 0 | Num ofSubindex | u8 | RO | 1 | 子索引数目 |
1 | Default all OD | u32 | W | 0x64616F6C | 恢复整部对象字典;读时,返回0x00000001 | |
1014 | 0 | Emnc COB-ID | u32 | RW | 0x80 | 紧急报文COB-ID |
1017 | 0 | Heart beat timer | u16 | RW | 0x0BB8 | 心跳包周期,单位ms |
1018 | 0 | Num ofSubindex | u8 | RO | 4 | 制造商信息 |
1 | Manufacturerid | u32 | RO | - | 制造商ID | |
2 | Product Code | u32 | RO | - | 产品代码 | |
3 | Revision Number | u32 | RO | - | 修订号 | |
4 | Serial Number | u32 | RO | - | 序列号 | |
1200 | 0 | Num ofSubindex | u8 | RO | 2 | SDO服务器信息 |
1 | SDO Rx COB-ID | u32 | RO | 0x0600+Node ID | SDO接收COB-ID | |
2 | SDO Tx COB-ID | u32 | RO | 0x0580+Node ID | SDO发送COB-ID | |
1400 | 0 | Num ofSubindex | u8 | RO | 6 | RPDO1通讯参数 |
1 | RPDO1 COB-ID | u32 | RO | RPDO1 COB-ID | ||
2 | Transmission Type | u8 | RW | 0xFF | 通讯类型 | |
3 | Inhibit Time | u16 | RW | 0 | 抑制时间 | |
4 | -- | -- | -- | -- | 保留 | |
5 | Event Timer | u16 | RW | 0 | 时间定时器 | |
6 | SYNC start value | u8 | RW | 0 | 同步初始值 | |
1401- 15FF | 0 | RPDOx禁用 | ||||
1600 | 0 | Num ofSubindex | u8 | RO | 1 | RPDO1映射参数 |
1 | RPDO1 mapping | u8 | RO | 0x62000108 | 映射地址 | |
1800 | 0 | Num ofSubindex | u8 | RO | 6 | TPDO1通讯参数 |
1 | TPDO1 COB-ID | u32 | RO | TPDO1 COB-ID | ||
2 | Transmission Type | u8 | RW | 0xFF | 通讯类型 | |
3 | Inhibit Time | u16 | RW | 0 | 抑制时间 | |
4 | -- | -- | -- | -- | 保留 | |
5 | Event Timer | u16 | RW | 0 | 时间定时器 | |
6 | SYNC start value | u8 | RW | 0 | 同步初始值 | |
1801- 19FF | 0 | TPDOx禁用 | ||||
1A00 | 0 | Num ofSubindex | u8 | RO | 1 | TPDO1映射参数 |
1 | TPDO1 mapping | u8 | RO | 0x60000108 | 映射地址 | |
2000 | 0 | Num ofSubindex | u8 | RO | 3 | 设备唯一序列号 |
1 | Serial id1 | u32 | RO | - | 序列号1 | |
2 | Serial id2 | u32 | RO | - | 序列号2 | |
3 | Serial id3 | u32 | RO | - | 序列号3 | |
2001 | 0 | Num ofSubindex | u8 | RO | 1 | CAN波特率寄存器 |
1 | CAN baud | u8 | RW | 0 | 见CAN波特率对应表 | |
6000 | 0 | Num ofSubindex | u8 | RO | 1 | DI状态信息 |
1 | DI status | u8 | RW | 0x00 | DI状态寄存器 | |
6002 | 0 | Num ofSubindex | u8 | RO | 1 | DI极性信息 |
1 | DI polarity | u8 | RW | 0x00 | DI极性寄存器 | |
6005 | 0 | Num ofSubindex | u8 | RO | 1 | DI全局中断使能 |
1 | DI global Interrupt | bool | RW | TRUE(1) | DI全局中断使能 | |
6006 | 0 | Num ofSubindex | u8 | RO | 1 | DI任意变化中断使能 |
1 | DI any change Interrupt | u8 | RW | 0xFF | DI任意变化中断使能 | |
6007 | 0 | Num ofSubindex | u8 | RO | 1 | DI由低到高中断使能 |
1 | DI Low to High Interrupt | u8 | RW | 0x00 | DI由低到高中断使能 | |
6007 | 0 | Num ofSubindex | u8 | RO | 1 | DI由高到低中断使能 |
1 | DI High to Low Interrupt | u8 | RW | 0x00 | DI由高到低中断使能 | |
6200 | 0 | Num ofSubindex | u8 | RO | 1 | DO状态信息 |
1 | DO status | u8 | RW | 0x00 | DO状态寄存器 | |
6202 | 0 | Num ofSubindex | u8 | RO | 1 | DO极性控制 |
1 | DO polarity | u8 | RW | 0x00 | DO极性控制 | |
6206 | 0 | Num ofSubindex | u8 | RO | 1 | DO错误模式使能 |
1 | DO error mode | u8 | RW | 0xFF | DO错误模式使能 | |
6207 | 0 | Num ofSubindex | u8 | RO | 1 | DO错误模式状态值 |
1 | DO error value | u8 | RW | 0x00 | DO错误模式状态值 |
注意下文所有的测试条件为:Node ID为1;CAN波特率以及对象字典均为默认值。
二、Boot up和心跳包测试
模块上电会发出一个Boot up报文:id为701数据为00。
该模块默认心跳时间为0X0BB8(3000ms)。模块上电后发送心跳报文如下(采用我司生产的usb-can调试器):
注意,上述修改后参数,参数并未保存到flash中,模块掉电或复位后心跳包时间仍然是原来的数值。如果用户想保存到flash中,可以利用索引1010,具体操作方法参见下文。
三、NMT命令测试
模块内置NMT服务器功能,可以根据NMT指令切换工作状态,模块上电初始化成功后自动进入到预操作模式(PreOperational),这时模块会发送数据为7f、CAN id为701的心跳报文,如上节所述。
按照NMT命令规范,演示如下:
①进入操作模式(Operational)
发送can id为00,数据为01 01的报文:
模块进入到stop模式,心跳包数据变为04,如上图。进入stop模式时,继电器输出状态可以通过索引6206和6207共同确定,具体可参考下文。
③复位命令
发送can id为00,数据为81 01的报文:
模块复位,发一条Boot up报文;心跳包数据变为7f,模块自动进入预操作模式(PreOperational),如上图。
其他模式的切换参考标准CANopen通讯协议。
四、DO输出命令测试
模块通过RPDO1接收数据,来控制DO的输出,根据RPDO1的通讯参数可知,对端的COB-ID为0x0200+Node ID,即0x0201。可以通过发can id为0x0201、数据长度为1字节的标准帧来控制DO的状态,注意模块只有在操作模式下时该指令有效。其中1字节的数据和继电器对应关系为:
DO继电器输出和数据bit对应关系 | ||||||||
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DO | DO-8 | DO-7 | DO-6 | DO-5 | DO-4 | DO-3 | DO-2 | DO-1 |
例如打开第一个继电器DO,可以发送如下数据:
CAN帧ID:0x0201;
CAN数据:0x01;
Bit位值的含义:0为正逻辑;0为反逻辑。
索引6202(子索引01)默认值为0x00,全部为正逻辑。用户可以通过SDO命令修改DO输出极性对象6202的值,来改变输出极性,如改成0xff,那么,模块收到上述数据后,将第一路继电器关闭,其余路打开。
当然也可以用SDO命令读取对象索引6200,子索引01来获取DO的状态。
五、DI默认参数测试
模块通过TPDO1发送DI开关量输入的状态。是否触发TPDO1的发送,由以下条件决定:
①TPDO1的通讯参数配置(索引1800);
②DI全局中断配置(索引6005,子索引01);
③DI中断触发方式(索引6006/6007/6008);
④模块当前的工作模式;
先看第一个条件,根据对象字典的默认配置可知,RPDO1的默认通讯参数为:
TPDO1的COB-ID为0x0180+Node ID(索引1800,子索引01),即0x0181;
TPDO1的通讯类型为0xFF(索引1800,子索引02),即为事件触发模式;
TPDO1的抑制时间为0x00(索引1800,子索引03),即不抑制;
TPDO1的事件定时器为0x00(索引1800,子索引05),即不启用;
所以第一个条件即为开关量事件触发。
再看第二个条件,根据对象字典的默认配置可知,DI全局中断为TURE,即打开状态。
再看第三个条件,根据对象字典的默认配置可知,DI中断触发方式中,DI_any_change(索引6006,子索引01)的值为0xFF;Low_to_High(索引6007,子索引01)的值为0x00;How_to_Ligh(索引6008,子索引01)的值为0x00;
再看第四个条件,只有模块在操作模式下时才能触发TPDO1。
由以上配置可知,在操作模式下,DI有任意变化时,就会触发中断。
DI的状态值在索引6000的对象中保存,DI输入的极性在索引6002的对象中保存,下图为TPDO1的触发逻辑关系:
其中索引6003对象为禁止状态,即不对DI做滤波处理,因为读取硬件输入状态时已经做了延时消抖动处理。
TPDO1的数据(索引6000,子索引01)为1个字节,其和DI对应关系为
DI开关量输入和数据bit对应关系 | ||||||||
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DI | DI-8 | DI-7 | DI-6 | DI-5 | DI-4 | DI-3 | DI-2 | DI-1 |
DI极性控制(索引6002子索引01)与DI的关系:
DO开关量输入极性和对象索引6002数据bit对应关系 | ||||||||
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DI | DI-8 | DI-7 | DI-6 | DI-5 | DI-4 | DI-3 | DI-2 | DI-1 |
在默认参数条件下,DI有变化时,模块输出如下:
上图,序号000001为第一路DI有触发(有低电平变成了高电平);
序号000004为第一路DI有触发(有高电平变成了低电平)。
当然也可以用SDO命令读取对象索引6000,子索引01来获取DI的状态。
六、DI定时上传设置测试
可以通过SDO命令写通讯参数对象中的事件定时器(索引1800,子索引05)来实现DI状态的定时上传,例如将该对象写0x00c8(200)ms:
发送CAN帧ID为0x0601,数据为:2b 00 18 05 c8 00 00 00
模块收到后,将按照200ms上传一次(触发TPDO1)。
也可以用同样的方式设置TPDO1的抑制时间。
七、DI同步上传设置测试
可以通过SDO命令写通讯参数对象中的通讯类型(索引1800,子索引02)和对象子索引1005(同步COB-ID)来实现DI状态的同步上传,注意通讯类型的值value必须为1~240(十进制),其含义是模块收到value个同步帧时就触发一次TPDO1,例如value设为0x01:
发送CAN帧ID为0x0601,数据为:2f 00 18 02 01 00 00 00
八、对象字典的恢复出厂测试
模块可以用过SDO命令操作索引1011对象来实现对整部对象字典的恢复出厂。
目前仅支持恢复整部对象字典功能。
发送:CAN帧ID为0x0601,数据为:23 11 10 01 64 61 6f 6c;模块收到后,将整部对象字典恢复到出厂默认参数:
-
工业控制系统
+关注
关注
3文章
109浏览量
16579
发布评论请先 登录
相关推荐
评论