暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

倍福系统的CAN2.0通讯解决方案

Lizzy的倍福园地 2021-07-13
4559

保持对技术的好奇心,拓宽知识的边界,提高认识的分辨率 —— Lizzy 


1,背景介绍

控制器局域网总线(CANController AreaNetwork)是世界上应用最广泛的现场总线之一。CAN接口可能是性价比最高的总线接口,通讯速度可达1Mbps,百度搜索显示最便宜的CAN接口,含贴片式CAN微控制器和收发器,价格在10元以内。与此同时,CAN总线的实现也比绝大多数现场总线要简单,因此深得研发人员的青睐。在可选多种总线接口的自动化仪表或者设备中,通常CAN接口是最便宜甚至是免费的选项,而某些经济型产品甚至只支持CAN总线,尤其是一些新研发的国产设备,或者厂家开发的自用设备。

 

CAN通讯的最大特点是它工作于多主方式。CAN网络没有主站从站的说法,统一叫做CAN节点。CAN节点也没有地址,每个节点都可以主动向总线发送数据。多节点同时发送数据时,根据报文标识符来竞争总线访问优先权。

 

CAN通讯还有一个特点:所有节点总是同时收到相同数据,所以各节点之间数据通信实时性强,并且容易构成冗余结构,提高系统可靠性和系统灵活性。相比于RS-485在实时性、可靠性方面优势明显,因为后者只能构成主从式结构系统,通信方式也只能以主站轮询的方式进行。

 

从发展历史来看,CAN总线诞生于1986年,没有查到CANopen的诞生年份,百度搜索到最早的CANopen文档发布于1996年。而Profibus成为欧洲标准现场总线也是在这一年。我个人理解是,CAN总线是针对RS485通讯的种种不足而推出的一种总线。其后的CanOpenProfibusDeviceNet,则分别在CANRS485的基础上,区分出了主站和从站,毕竟在自动化设备上,变频器和变频器之间不必通讯,而所有变频器都要和控制器通讯。用一个专门的硬件来实现与底层设备的数据通讯,而不必占用控制器的CPU来运行CANRS485通讯代码,这是现场总线分出主站和从站的根本目的。所以,CAN相对于RS485是先进的,相对于CANopenProfibus等总线,自动化工程师使用起来就不那么方便了。因为今天的自动化工程师,已经熟悉了ProfibusDevicenetCanOpen的使用,习惯了通过简单的参数配置,总线主站就能自行完成底层通讯,而不必深入了解这些通讯的底层协议。但在使用CAN通讯时,还必须自行编写PLC上的CAN通讯代码,所以有必要对CAN通讯做些常识性的了解


2,倍福控制系统实现CAN2.0通讯的硬件准备

2.1 硬件模块

倍福控制系统要实现CAN2.0通讯,必须要有CANopen主站模块,即以下型号之一的硬件:

EL6751-0000CANopen网关EL模块,适用于任何带EtherCAT总线的倍福控制系统。

CXxxxx-M510CX控制器上扩展的CANopen主站,适用于CX嵌入式控制器。

FC51xx   PCIPCIeMini PCI接口的CANopen主站卡,适用于带相应插槽的IPC

BXxxxx  :倍福早期的BX系列控制器上集成的SSB接口。


至于倍福产品作为CAN节点集成到第三方的控制系统,最典型的应用就是BK51xx耦合器的CAN通讯。由于BK51xx只是一个耦合器,不能编程,所以只能作为CAN节点在事件触发的方式下主动发送数据。


2.2 CAN网络接线

3.      测试归档文件

       归档文件应包含PLC程序、硬件配置,用两个EL6751来做CAN通讯,以说明使用方法。

Can Interface 通讯_2.0AB_By_Lizzy.zip

其中包括CAN 2.0A即(11位标识符)和CAN 2.0B(即29位标识符)两种代码。例中的两个EL6751分别由一套PLC程序控制,实际项目中参考任一程序均可。


4.      参数配置

4.1 扫描或者手动添加CANopen主站设备后,手动添加CAN Interface。注意一个主站模块只能添加一个CAN Interface

4.2 设置CAN Interface的传输队列

       如果勾选“29 Bit Identifier supported”,则使用CAN 2.0B,否则使用11位标识符的CAN2.0A

Tx Queue Messages”和“Rx Queue Messages”直接使用默认值“10”,这表示一个控制周期最多缓存10条接收消息,而一个周期发送的消息数量也最多10条。

4.3 CAN Interface接口消息(“Message”)的构成

发送和接收消息的数量:默认都为10个,在TwinCAT 2中,如果需要修改消息数量,必须删除CAN Interface再重新添加。

实际使用中发现:如果RxTx的消息数量不相同,如果硬件是CX5020-M510,则数量只受Tx Queue Message控制,而EL6751就没有这个问题。至于其它CXxxxx-M510是否有这个现象,尚未测试。

CAN2.0A的消息和CAN2.0B的消息格式有所不同:

2.0AMessage中,包含cobiddata,其中cobid只有2字节16位,其Bit 0-3表示Data中实际发送的字节数,Bit4表示RTR,而Bit 5-15表示Messagecobid,所以CAN 2.0ACobid不会超过16#7FF

2.0Bmessage中,包含cobiddataLength,其中cobid4字节,其Bit 31False表示11位标识符,为True表示29位标志符,Bit 30表示RTRBit0-28表示cobid,所以CAN 2.0BCobid最大值为16# 3FFF FFFF

Data中实际发送的字节数则由Length表示,虽然CAN 2.0BLengthuint型,其值也不会大于8。因为Data总是8字节的数组,表示一个Message能够交换的数据最多不超过8字节。为了节省带宽,如果只交换一个Int整数型变量,就没必要把8个字节都发送出去。所以需要用Length或者Cobid的特定位来控制发送的字节长度。

 

消息(“Message”)是各个CAN节点之间通讯的基本单位。一个最小的通讯,就是在两个节点之间的CAN通讯,一个节点上配置一个TxMessage,而另一个节点上配置一个RxMessage。只要节点的RxMessage中收到的消息Cobid与发送方一致,就证明通讯成功了。

 

Can InterfaceRxMessageTxMessage结构完全相同,所以CAN网络中要么全部用CAN2.0 A,要么全部用CAN 2.0B


 4.4 CAN Interface接口中消息队列的状态的控制

RxQueue(接收队列)和TxQueue(发送队列)中,都有同样的3个变量: 

RxQueue下的变量含义:

TxCounter:已发送计数,发送一次自动加1

RxCounter:已接收计数,接收一次自动加1

NoOfRxMessages:本周期接收到缓存区的Message数量

 

TxQueue下的变量含义:

TxCounter:发送计数,数值加1,发送一次,

RxCounter:接收计数,数值小于RxQueue中的RxCounter时,可加1再接收一次;

NoOfTxMessages:本周期计划发送的Message数量;

 

实测发现,

TxQueueTxCounter变化会触发硬件模块发送Message,最简单的变化是自累加1

TxQueueRxCounterRxQueueRxCounter不等时,表示有收到新的Message

把输出的RxCounter置为与输入的RxCounter相等则会触发接收硬件缓存中的数据。

 

4.4 CAN Interface接口的诊断信息

诊断信息有两个变量:Node StateDiagFlag

正常通讯时二者都应为0,如果不为0,根据变量的Comment可以查到Node State的值对应含义,但对于CAN通讯,不一定全部适合。


4.5 关于Message过滤

CAN通讯接收Message时,可以设置只接收部份Cobid的信息,这就是Rx Filter,如图:

实际使用中发现,在TwinCAT2中,最新版本的EL6751只有CAN2.0 A模式下,可以设置过滤,此时只要降低EL6751FirmwareEL6751-16-V0112.efw版本就可以。在TC3下没有问题。


5.      代码解释。

5.1CAN2.0 ACAN2.0B的程序

两套PLC分别控制两个EL6751,仅仅是Cobid赋的初值不同。左按钮发送,右按钮接收。


CAN2.0A的程序和CAN2.0B的程序,只有Cobid的赋值语句不同。在CAN2.0A的程序中:


而在CAN2.0B的程序中是这样的


Demo程序都只是最基本的设置,没有对CAN协议中的RTR29位中的Bit31进行处理。

 

Main中判断是否成功发送或者接收数据,然后进行简单处理。其中注释掉的代码用于自动连续发送和连续接收。

 

Action_hmi中,是从界面按钮触发接收和发送的程序代码:


6.     注意事项

6.1 为了避免没有允许接收Message时,硬件缓存里接收的消息超出Rx Queue Message设置的数量,比如10个,应尽可能频繁地接收数据。特别是CAN设备不经握手,无条件快速连续发送消息时,或者网络中有多个CAN节点不受调度随机发送消息时,如果接收消息不及时,就容易漏掉部分信息。

 

6.2 发送数量则刚好相反,如果每个周期都改变输出的TxCounter就会出现每个周期都向总线发送数据的情况,考虑到这一点之后,如果不是你想要效果,就应该给触发条件加一个上升沿。

 

6.3   关键要记住触发“Send”“Receive”的规则:发送的条件是输出的TxCounter要不同,接收的条件是:输出的RxCounter要置与输入的RxCounter相同。

 

6.4  关于波特率要一致、CobID不能重复、要接终端电阻、屏蔽接地、CAN HCAN L不要接反等常识问题,本文虽然没有强调,但发现通讯不上的时候,也需要逐项检查。

 

6.5 关于倍福的CANopen从站耦合器,作为CAN2.0的节点,接受带CAN接口的控制系统时,最重要的一点是,要在初始化时修改对象字典0x6423的值为1,否则模拟量信号无法通讯。详细文档见《第三方CANopen主站与BK5120通讯设置》,作者刘工


文档截图太多,如果你需要下载原文和示例程序的听众,可以到百度云盘 https://pan.baidu.com/s/1boRAVIf




(******************************)


喜欢本文?识别二维码,关注公众号


-技术区

前人趟过的雷

Lizzy Chen的系列教材

使用倍福系统做项目开发的检查清单

关于EtherCAT和TSN的对比

见闻:初识锂电行业

TwinCAT与Step7编程的异同

数字量输入输出电路




文章转载自Lizzy的倍福园地,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论