基于 CAN 总线的 modbus 通信设计
摘要:CAN 总线是由德国 BOSCH 公司开发了的,其主要用于汽车计算机控制系
统,而在工业控制领域较少适用,在工业领域用的最多的是 RS485 总线.CAN 总
线较 RS485 总线具有网络各节点之间的数据通信实时性强,开发周期短,已形
成国际标准的现场总线等优点.因此 CAN 总线是比较有前途的现场总线之
一,在工业控制领域代替 RS485 是有可能的。
为了能简单地应用 CAN 总线代替 RS485 总线,如果采用比如 CANopen
等协议使得设备变得复杂化,那么有没有简单点的协议?很多做过工业设
备的工程师都熟悉 MODBUS 协 议 ,在 RS485 总 线 上跑的最多的协议就是
MODBUS,如果我们在 CAN 总线上运行 MODBUS 协议,那么做过 RS485
的工程师就能很快地转移过来,减少了开发难度.所以本文就以 CAN 总线上
跑 MODBUS 协议为目的对数据网络层协议进行设计。
概念:MODBUS 有主从概念,CAN 总线支持多主,在这里我们把主机叫做客户端,
从机叫做服务器。在 CAN 总线上采用客户端服务器的概念.
在进行协议介绍前先对 CAN MODBUS 进行简单的介绍.
MODBUS:阅读过 MODBUS 协议的人都知道 modbus 有 ASCII 和 RTU 模
式,其中 RTU 模式用的较多,一个数据包在网络上传输我们必须知道包的
开始和结束,在 RTU 模式中数据包是以至少 3.5 个字符的静默时间开始和
结束的,如果信息结束前存在超过 1。5 个字符以上的间隔时间则出错.为
了检测这些时间间隔,在程序上将变得很被动。ASCII 虽然有专用的开始结
束标志符,但是 ASCII 需要把一个字节数据传换为两个字符发送所以其效
率低。所以还是得采用 RTU 模式,但得根据 CAN 总线的特点解决数据包
开始结束标志的定义。
CAN 总线:CAN 总线的数据传输是以帧为单位的,一个帧包含标识符、数
据段 CRC 等,标识符表示该帧的发送优先级,数据段包含实际的数据,数据
长度从 1 到 8 字节,CRC 对该帧进行校验,因为帧中包含了数据校验功能,所
以在 CAN 上跑 modbus 就不需要再对数据进行 CRC 校验。在这里我们看到
CAN 总线是有优先级这个概念,但是没有出现像 modbus 这样有地址的概
念 ,CAN 总 线 上 标 识 符 段 表 示 的 是 该 帧 的 优 先 级 , 它 面 向 的 是 数 据 , 而
modbus 面向的是设备,每个数据包中都有地址,如果我们把地址放在 CAN
帧的数据段中那么所有设备都必须接收每一帧,然后对数据进行解析,如
果网络负载比较大的是时候,这对设备不利。CAN 控制器一般都能对特定
的标识符段进行过滤,那么我们为什么不能把标识符段作为设备的地址,然
后设备对特定的标 识符进行过滤,这样就减少了设备的负担.但是如果标识
符段作为目的地址,那么 CAN 总线上就不能有两个主机,应为 CAN 总线规
定不能有两个相同标识符的帧同时发送。既然标识符符不能作为目的地址,
那么就实现不了设备对数据的过滤.我的解决办法是把帧的标识符段分为两
部分,一部分为发送方地址,另一部分为接收方地址,其中接收方地址在
标识符的高端。这样我们就能通过表标识符段知道这帧数据是谁发给谁的,
对于接收方它通过设置过滤器只接收表识符高端数据为自己地址的帧,这样
就解决了 CAN 总线中地址的概念。这个地址还表示的设备的优先级,地址越
小优先级就越高,接收方地址和发送方地址就决定这帧的发送优先级。标
识符段分为标准帧和扩展帧,标准帧的标识符为 11bit,扩展帧的标识符为
评论0