CANopen如何在智嵌物联CAN产品中应用的-1DARA8A

一、CAN 和 CANopen 介绍

CAN(Controller Area Network)通信因其高效率和高稳定性被广泛应用于汽车电子、工业自动化和物联网通信系统。 CANopen 是基于 CAN 的通信子协议,是为产品组件的内部网络通信而开发的系统。其子协议 CiA401 规范了数字输入、数字输出和模拟采集的相关使用方法。 ZQWL的ZQWL开发的带有CAN通讯接口的采集与控制终端模块均实现CANopen CiA401协议,可以方便地接入现有的CAN控制网络系统,缩短开发周期,节省开发成本。本文以ZQWL开发的产品ZQWL-IO-1DARA8A为例,介绍CANopen在ZQWL CAN产品中的应用。

准备产品IO控制模块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极性控制:可在设备发生故障或收到停止命令后配置DO状态。

●可配置CAN波特率。

● 将整个对象字典保存到闪存并将整个对象字典恢复为出厂默认设置。

CANopen的CiA401设备子协议详细描述了对象字典的定义和功能。该模块实现了 DI/DO 部分。模块的对象字典如下:

注意下面所有的测试条件都是:Node ID是1; CAN 波特率和对象字典为默认值。

二、开机和心跳包测试

模块上电时会发送一条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的消息;

模块进入停止模式,心跳包数据变为04,如上图。进入停机模式时,继电器输出状态可通过索引6206和6207判断,具体请参考以下内容。

③复位指令

用can id 00和data 81 01发送消息:

模块复位并发送Boot up消息;心跳包数据变为7f,模块自动进入预运行模式(PreOperational),如上图所示。

其他模式的切换参考标准CANopen通讯协议。

四、DO 输出命令测试

模块通过RPDO1接收数据,控制DO的输出。根据RPDO1的通信参数可知,对端COB-ID为0x0200+Node ID,即0x0201。 DO的状态可以通过发送一个can id为0x0201、,数据长度为1字节的标准帧来控制。注意,该命令仅在模块处于工作模式时有效。 1字节数据与继电器的对应关系为:

例如打开第一个继电器DO,可以发送如下数据:

CAN 帧 ID:0x0201;

CAN 数据:0x01;

Bit值的含义:0为正逻辑; 0 为负逻辑。

图片[1]-CANopen如何在智嵌物联CAN产品中应用的-1DARA8A-老王博客

索引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),即未启用;

所以第一个条件是switch事件触发。

看第二个条件,根据对象字典的默认配置,DI全局中断为TRUE,即开启状态。

看第三个条件跑字典用服务器吗,根据对象字典的默认配置,在DI中断触发模式下,DI_any_change(索引6006,子索引01)的值为0xFF;Low_to_High(索引6007) , sub-index 0) 1) has value 0x00; How_to_Ligh (index 6008, sub-index 0 1) has value 0x00;

看第四个条件,TPDO1只有在模块处于工作模式时才能触发。

从上面的配置可以看出,在操作模式下,当DI有任何变化时,都会触发中断。

DI的状态值存储在索引6000的对象中,DI输入的极性存储在索引6002的对象中。下图为TPDO1的触发逻辑关系:

索引6003的对象处于禁用状态,即DI没有被过滤,因为在读取硬件输入状态时已经做了延迟去抖动处理。

TPDO1的数据(索引6000,子索引01)为1字节,与DI对应关系为

默认参数下,当DI变化时,模块输出如下:

上图中,序号000001是第一个通道DI有触发(低电平变为高电平);

序号000004是第一个DI的触发(高电平变为低电平)。

当然你也可以使用SDO命令读取对象索引6000和子索引01来获取DI的状态。

六、DI定时上传设置测试

可以使用SDO命令在通讯参数对象(索引1800,子索引05)中写入事件定时器,实现DI状态的定时上传,例如写入0x00c8(20< @0)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(十进制),表示模块接收到值同步帧会触发一次TPDO1,例如设置为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;模块收到后,将整个对象字典恢复为出厂默认参数:

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论