保持对技术的好奇心,拓宽知识的边界,提高认识的分辨率 —— Lizzy
1,背景介绍
控制器局域网总线(CAN,Controller AreaNetwork)是世界上应用最广泛的现场总线之一。CAN接口可能是性价比最高的总线接口,通讯速度可达1Mbps,百度搜索显示最便宜的CAN接口,含贴片式CAN微控制器和收发器,价格在10元以内。与此同时,CAN总线的实现也比绝大多数现场总线要简单,因此深得研发人员的青睐。在可选多种总线接口的自动化仪表或者设备中,通常CAN接口是最便宜甚至是免费的选项,而某些经济型产品甚至只支持CAN总线,尤其是一些新研发的国产设备,或者厂家开发的自用设备。
CAN通讯的最大特点是它工作于多主方式。CAN网络中没有主站从站的说法,统一叫做CAN节点。CAN节点也没有地址,每个节点都可以主动向总线发送数据。多节点同时发送数据时,根据报文标识符来竞争总线访问优先权。
CAN通讯还有一个特点:所有节点总是同时收到相同数据,所以各节点之间数据通信实时性强,并且容易构成冗余结构,提高系统可靠性和系统灵活性。相比于RS-485在实时性、可靠性方面优势明显,因为后者只能构成主从式结构系统,通信方式也只能以主站轮询的方式进行。
从发展历史来看,CAN总线诞生于1986年,没有查到CANopen的诞生年份,百度搜索到最早的CANopen文档发布于1996年。而Profibus成为欧洲标准现场总线也是在这一年。我个人理解是,CAN总线是针对RS485通讯的种种不足而推出的一种总线。其后的CanOpen、Profibus、DeviceNet,则分别在CAN和RS485的基础上,区分出了主站和从站,毕竟在自动化设备上,变频器和变频器之间不必通讯,而所有变频器都要和控制器通讯。用一个专门的硬件来实现与底层设备的数据通讯,而不必占用控制器的CPU来运行CAN或RS485通讯代码,这是现场总线分出主站和从站的根本目的。所以,CAN相对于RS485是先进的,相对于CANopen、Profibus等总线,自动化工程师使用起来就不那么方便了。因为今天的自动化工程师,已经熟悉了Profibus、Devicenet、CanOpen的使用,习惯了通过简单的参数配置,总线主站就能自行完成底层通讯,而不必深入了解这些通讯的底层协议。但在使用CAN通讯时,还必须自行编写PLC上的CAN通讯代码,所以有必要对CAN通讯做些常识性的了解。
2,倍福控制系统实现CAN2.0通讯的硬件准备
2.1 硬件模块
倍福控制系统要实现CAN2.0通讯,必须要有CANopen主站模块,即以下型号之一的硬件:
EL6751-0000:CANopen网关EL模块,适用于任何带EtherCAT总线的倍福控制系统。
CXxxxx-M510:CX控制器上扩展的CANopen主站,适用于CX嵌入式控制器。
FC51xx :PCI、PCIe或Mini 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再重新添加。
实际使用中发现:如果Rx和Tx的消息数量不相同,如果硬件是CX5020-M510,则数量只受Tx Queue Message控制,而EL6751就没有这个问题。至于其它CXxxxx-M510是否有这个现象,尚未测试。
CAN2.0A的消息和CAN2.0B的消息格式有所不同:
2.0A的Message中,包含cobid和data,其中cobid只有2字节16位,其Bit 0-3表示Data中实际发送的字节数,Bit4表示RTR,而Bit 5-15表示Message的cobid,所以CAN 2.0A的Cobid不会超过16#7FF。
2.0B的message中,包含cobid、data和Length,其中cobid有4字节,其Bit 31为False表示11位标识符,为True表示29位标志符,Bit 30表示RTR。Bit0-28表示cobid,所以CAN 2.0B的Cobid最大值为16# 3FFF FFFF。
Data中实际发送的字节数则由Length表示,虽然CAN 2.0B的Length是uint型,其值也不会大于8。因为Data总是8字节的数组,表示一个Message能够交换的数据最多不超过8字节。为了节省带宽,如果只交换一个Int整数型变量,就没必要把8个字节都发送出去。所以需要用Length或者Cobid的特定位来控制发送的字节长度。
消息(“Message”)是各个CAN节点之间通讯的基本单位。一个最小的通讯,就是在两个节点之间的CAN通讯,一个节点上配置一个TxMessage,而另一个节点上配置一个RxMessage。只要节点的RxMessage中收到的消息Cobid与发送方一致,就证明通讯成功了。
Can Interface的RxMessage和TxMessage结构完全相同,所以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数量;
实测发现,
TxQueue的TxCounter变化会触发硬件模块发送Message,最简单的变化是自累加1。
TxQueue的RxCounter与RxQueue的RxCounter不等时,表示有收到新的Message,
把输出的RxCounter置为与输入的RxCounter相等则会触发接收硬件缓存中的数据。
4.4 CAN Interface接口的诊断信息
诊断信息有两个变量:Node State和DiagFlag
正常通讯时二者都应为0,如果不为0,根据变量的Comment可以查到Node State的值对应含义,但对于CAN通讯,不一定全部适合。
4.5 关于Message过滤
CAN通讯接收Message时,可以设置只接收部份Cobid的信息,这就是Rx Filter,如图:
实际使用中发现,在TwinCAT2中,最新版本的EL6751只有CAN2.0 A模式下,可以设置过滤,此时只要降低EL6751的Firmware到EL6751-16-V0112.efw版本就可以。在TC3下没有问题。
5. 代码解释。
5.1CAN2.0 A和CAN2.0B的程序
两套PLC分别控制两个EL6751,仅仅是Cobid赋的初值不同。左按钮发送,右按钮接收。
而CAN2.0A的程序和CAN2.0B的程序,只有Cobid的赋值语句不同。在CAN2.0A的程序中:
而在CAN2.0B的程序中是这样的
本Demo程序都只是最基本的设置,没有对CAN协议中的RTR和29位中的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 H和CAN L不要接反等常识问题,本文虽然没有强调,但发现通讯不上的时候,也需要逐项检查。
6.5 关于倍福的CANopen从站耦合器,作为CAN2.0的节点,接受带CAN接口的控制系统时,最重要的一点是,要在初始化时修改对象字典0x6423的值为1,否则模拟量信号无法通讯。详细文档见《第三方CANopen主站与BK5120通讯设置》,作者刘工。
文档截图太多,如果你需要下载原文和示例程序的听众,可以到百度云盘 https://pan.baidu.com/s/1boRAVIf

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

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




