CANopen协议在智嵌物联ZQWL采集控制终端产品中的应用

描述

一、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

10000设备类型u32RO0x00030191 支持CiA401的DI和DO
10030Errors Register u8RO0错误寄存器
10050Sync COB-IDu32RW0同步报文COB-ID
10060Sync Periodu32RW0同步周期
10080ManufacturerstringROZQWL制造商
10090Hard VersionstringROV3.0硬件版本
100A0Soft VersionstringROV3.0软件版本
10100Num of Subindexu8RO1子索引数目
1Save all ODu32W0x65766173保存整部对象字典;读时,返回0x00000001
10110Num of Subindexu8RO1子索引数目
 1Default all ODu32W0x64616F6C恢复整部对象字典;读时,返回0x00000001
10140Emnc COB-IDu32RW0x80紧急报文COB-ID
10170Heart beat timeru16RW0x0BB8心跳包周期,单位ms

 

 

1018

0Num of Subindexu8RO4制造商信息
1Manufacturer idu32RO-制造商ID
2Product Codeu32RO-产品代码
3Revision Numberu32RO-修订号
4Serial Numberu32RO-序列号

 

1200

0Num of Subindexu8RO2SDO服务器信息
1SDO Rx COB-IDu32RO0x0600+Node IDSDO接收COB-ID
2SDO Tx COB-IDu32RO0x0580+Node IDSDO发送COB-ID

 

 

1400

0Num of Subindexu8RO6RPDO1通讯参数
1RPDO1 COB-IDu32RO RPDO1 COB-ID
2Transmission Typeu8RW0xFF通讯类型
3Inhibit Timeu16RW0抑制时间
4--------保留
5Event Timeru16RW0时间定时器
6SYNC start valueu8RW0同步初始值

1401-

15FF

0

 

RPDOx禁用

16000Num of Subindexu8RO1RPDO1映射参数
1RPDO1 mappingu8RO0x62000108映射地址

 

 

1800

0Num of Subindexu8RO6TPDO1通讯参数
1TPDO1 COB-IDu32RO TPDO1 COB-ID
2Transmission Typeu8RW0xFF通讯类型
3Inhibit Timeu16RW0抑制时间
4--------保留
5Event Timeru16RW0时间定时器
6SYNC start valueu8RW0同步初始值

1801-

19FF

0

 

TPDOx 禁用

1A000Num of Subindexu8RO1TPDO1映射参数
 1TPDO1 mappingu8RO0x60000108映射地址

 

2000

0Num of Subindexu8RO3设备唯一序列号
1Serial id1u32RO-序列号1
2Serial id2u32RO-序列号2
3Serial id3u32RO-序列号3
20010Num of Subindexu8RO1CAN波特率寄存器
1CAN baudu8RW0CAN波特率对应表
60000Num of Subindexu8RO1DI状态信息
1DI statusu8RW0x00DI状态寄存器
60020Num of Subindexu8RO1DI极性信息
1DI polarity u8RW0x00DI极性寄存器
60050Num of Subindexu8RO1DI全局中断使能
1DI global Interrupt boolRWTRUE(1)DI全局中断使能
60060Num of Subindexu8RO1DI 任意变化中断使能
1DI any change Interrupt u8RW0xFFDI 任意变化中断使能
60070Num of Subindexu8RO1DI 由低到高中断使能
1DI Low to High Interrupt u8RW0x00DI 由低到高中断使能
60070Num of Subindexu8RO1DI 由高到低中断使能
1DI High to Low Interrupt u8RW0x00DI 由高到低中断使能
62000Num of Subindexu8RO1DO状态信息
1DO statusu8RW0x00DO状态寄存器
62020Num of Subindexu8RO1DO极性控制
1DO polarity u8RW0x00DO极性控制
62060Num of Subindexu8RO1DO错误模式使能
1DO error mode u8RW0xFFDO错误模式使能
62070Num of Subindexu8RO1DO错误模式状态值
1DO error value u8RW0x00DO错误模式状态值

 

注意下文所有的测试条件为: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对应关系

bit76543210
DODO-8DO-7DO-6DO-5DO-4DO-3DO-2DO-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对应关系

bit76543210
DIDI-8DI-7DI-6DI-5DI-4DI-3DI-2DI-1

DI极性控制(索引6002子索引01)与DI的关系:                                    

DO开关量输入极性和对象索引6002数据bit对应关系

bit76543210
DIDI-8DI-7DI-6DI-5DI-4DI-3DI-2DI-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;模块收到后,将整部对象字典恢复到出厂默认参数:

工业控制系统
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分