搜索
bottom↓
回复: 54

在CAN总线上跑Modbus的一种实现方法

  [复制链接]

出0入0汤圆

发表于 2012-6-20 18:36:20 | 显示全部楼层 |阅读模式
在一个项目中由于串口不够用,所以把CAN总线给用上了(自己的两个设备通信),在惨CAN上跑的协议还是比较多的,但是如CANopen之类的又太复杂,那么有没有一种简单的通信方案呢!答案是肯定的,我的首选就是modbus,在工业控制方面,很多的人都熟悉modbus,要把modbus从RS485移植到CAN总线上,还得做一些改变,毕竟RS485和CAN的拓扑结构不一样。附件的word文档中介绍了我关于在CAN总线上跑modbus协议的设计思路,只是思路,不包含源代码。没贴源代码的原因有两个,一个是这是初始版本,还有很多的改进地方,二是公司的东西没得到允许时不好贴出来的。我的口号是受之以鱼,不如受之以渔。毕竟个人思路有限,还望大家集思广议,多提意见!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-6-20 18:38:19 | 显示全部楼层
占楼  好东西 顶

出0入0汤圆

发表于 2012-6-20 19:04:50 | 显示全部楼层
好,下来学习学习

出0入0汤圆

发表于 2012-6-20 19:58:41 | 显示全部楼层
想法挺好,可惜can一帧只能传8字节!

出0入0汤圆

发表于 2012-6-20 20:17:28 | 显示全部楼层
想法挺好,可惜can一帧只能传8字节!而且CAN已经有校验了,再加MODBUS的CRC,有点。。。
实时性就没有体现,浪费啊

出0入0汤圆

发表于 2012-6-20 20:28:00 | 显示全部楼层
自己定义个协议就是了。。。

出0入0汤圆

发表于 2012-6-21 12:37:04 | 显示全部楼层
ljt80158015 发表于 2012-6-20 19:58
想法挺好,可惜can一帧只能传8字节!

不过可以想想,要是这8字节都用上的话,每一个位代表一个指令,想想,那是相当的可观了,速度也还可以的,两边通讯上了,想怎么就怎么,足够用了!

出300入477汤圆

发表于 2012-6-21 14:00:42 | 显示全部楼层
唉,可惜Modbus over CAN 不标准啊!
我也造过自己的Modbus over CAN,也有很多人造自己的Modbus over CAN,可惜这些"Modbus"之间互相却不能通讯,只能给自己系统内部用

大家来约定一个标准的Modbus over CAN的规范吧!

主要有如下几个要素:
发送和接收方的地址在CAN ID中怎么存放
超过1个CAN帧的数据怎么拆分
(Modbus的数据,去掉校验,其他部分在分段后直接作为CAN的数据,这一点应当没有异议)

只要大家约定一致,就可以互相用Modbus over CAN通讯了

出0入0汤圆

发表于 2012-6-21 14:02:17 | 显示全部楼层
这个东西好啊,谢谢分享啊!

出1070入962汤圆

发表于 2012-6-21 14:47:00 | 显示全部楼层
感谢楼主的工作!

这种工作比发几段代码有意义多了。初略的阅读了文档,楼主考虑的很细致。基本都能解决目前遇到的情况。8楼的提议也很好,需要大家去约定一个规范,哪怕这个规范还很初级,不完备,只要大家都去支持,慢慢的也就成熟了。

楼主描述的协议很细,只是仅仅用文字来描述,阅读比较累,也容易产生误解,不如用图表或者伪代码来解释协议的工作过程,这样也方便大多数人参照这个协议进行开发。

出300入477汤圆

发表于 2012-6-21 15:19:54 | 显示全部楼层
本帖最后由 redroof 于 2012-6-21 15:22 编辑
Appcat 发表于 2012-6-21 14:47
感谢楼主的工作!

这种工作比发几段代码有意义多了。初略的阅读了文档,楼主考虑的很细致。基本都能解决目 ...


我把我以前用过的一个协议规范发出来了,大家可以看一下。
我以前使用的Modbus over CAN

现在带CAN的单片机越来越多了,非常希望大家都用同一标准,否则CAN永远只能用在一个系统内部,不能跨系统,也不能做扩展IO...
(CanOpen和DeviceNet太复杂了,对简单的工业控制很不实用!)
网上modbus的扩展IO一抓一大把,但CAN的扩展IO太少了,除了几大PLC厂家做的以外...

出0入0汤圆

 楼主| 发表于 2012-6-22 11:38:28 | 显示全部楼层
CAN上跑modbus,原来的工程移植过来很方便,也便于理解,CAN支持多主机,这比RS485要好,试想,如果一个设备要接两台主控器,那么设备就要提供两个RS485的接口,如果是CAN的话,可以接在一个网路里面。对于CAN的可靠性,这个不用我说,看看CAN最初用在什么地方就知道,如果大家能定一个标准的Modbus over CAN的规范,即使只能在国内用,那是相当好的。要大家都承认这个协议,还需大家共同努力呀!

出0入0汤圆

发表于 2012-6-22 14:52:47 | 显示全部楼层
CAN上有一个标准而且简单可靠的协议非常重要,如果能做到这一点,就很容易推广。

出300入477汤圆

发表于 2012-7-5 17:01:07 | 显示全部楼层
BSF_RL 发表于 2012-6-22 11:38
CAN上跑modbus,原来的工程移植过来很方便,也便于理解,CAN支持多主机,这比RS485要好,试想,如果一个设 ...

是啊,我以前设计这个Modbus Over Can就为了实现多主多从。实际上相当于一个对等网了。
每个机器同时既是主机又是从机,连在一起的所有机器彼此之间都可以互相访问。同时应用层完全保持了大家熟悉的Modbus。
如果要在485上面作出稳定的多主机网络,真的不是一件容易的事。

出0入0汤圆

发表于 2012-7-5 17:28:32 | 显示全部楼层
请问楼主,你用什么什么单片机,是在UCOS-II上用吗?

出0入0汤圆

 楼主| 发表于 2012-7-8 18:31:03 | 显示全部楼层
zhouyan 发表于 2012-7-5 17:28
请问楼主,你用什么什么单片机,是在UCOS-II上用吗?

我用的是LPC2292  是在UCOSII 上跑的

出0入0汤圆

发表于 2012-7-8 18:47:24 | 显示全部楼层
楼主很有才啊,
canOPEN 在以太网上跑叫PWOERLINK
modbus在以太网上跑叫MODBUS_TCP
modbus在CAN上跑不知道应该叫什么? 感觉没什么实用价值吧。

出300入477汤圆

发表于 2012-7-8 21:27:58 | 显示全部楼层
本帖最后由 redroof 于 2012-7-8 22:00 编辑
source.ant 发表于 2012-7-8 18:47
楼主很有才啊,
canOPEN 在以太网上跑叫PWOERLINK
modbus在以太网上跑叫MODBUS_TCP


怎么没价值呢?价值可大了!
现在的CortexM3以上的单片机几乎全部带有CAN,而CAN的物理层比485要优越的多。

如果要让你的带有CAN通讯接口的设备能与其他CAN设备通讯,你认为应当怎么办?
CanOpen那么复杂,为了做个扩展IO模块,或者供外部读写几个寄存器,里面要弄个CanOpen从站,还要求主机带个CanOpen主站才能用。
虽然有开源的CanOpen代码,但CanOpen协议栈比Modbus复杂10倍不止!
DeviceNet也一样,不仅复杂,而且用DeviceNet还要收费(虽然对公司来说费用很低,但对个人来说这个费用是不算低的)。

目前事实上的标准就是Modbus,有数不清的硬件和软件都支持Modbus。特别是国内,几乎所有的号称“带有通讯接口”的设备,都是用Modbus协议。
所以只要能有个标准的转换协议在Can上跑Modbus,就可以有人专门做Modbus485到CAN的转换器,并且能保证不同厂家的Modbus转CAN的转换器是彼此兼容的,这样以来,所有的Modbus用户都可以由此受益!

让Modbus在Can上跑,因为没有人做标准化,所以我发布了一个我自己使用过的规约,目前名字叫ModbusOverCan。这个规约是free的,任何人都可以任意使用。
我本人对这个协议的实现代码因为是商业产品,无法公开,我只能公开这个协议自身。
不过实现并不重要,这只是一个非常简单的Modbus到CAN的包装层。相信已经跑通Modbus协议和CAN的人在半天之内就可以跑通这个协议。没有任何难度。协议实现者要做的无非就是,发送Modbus帧的时候,把一帧Modbus数据按协议要求拆成若干个CAN帧,依次发出,收到CAN帧的时候,把多个CAN帧组合为一个Modbus帧,然后送给原有的Modbus代码处理即可。其他就是CAN协议底层和Modbus协议自身问题了。

ModbusOverCan协议规约在此: http://www.amobbs.com/thread-5482880-1-1.html

希望我们的ModbusOverCan可以形成一个生态链。有人做支持它的主机,有人做它的扩展IO,有人做它的转换器......
这样,所有CAN用户都可以方便的得到扩展IO,而所有的Modbus用户都可以方便的得到一个强大的支持多主多从的物理层......

出0入0汤圆

发表于 2012-7-8 21:34:27 | 显示全部楼层
谢谢楼主的工作!

出0入0汤圆

发表于 2012-7-10 13:11:21 | 显示全部楼层
学习了,多谢LZ

出0入0汤圆

发表于 2013-1-9 13:35:47 | 显示全部楼层
CAN总线上跑Modbus

出0入0汤圆

发表于 2013-3-7 17:03:53 | 显示全部楼层
谢谢lz分享!

出0入0汤圆

发表于 2013-3-9 09:33:51 | 显示全部楼层
目前正在用NUC130开发CAN产品。了解一下、

出0入0汤圆

发表于 2013-4-28 10:22:56 | 显示全部楼层
mark-!                             

出10入95汤圆

发表于 2013-4-28 11:31:23 | 显示全部楼层
试试看看

出0入0汤圆

发表于 2013-4-28 11:35:25 | 显示全部楼层
怎么下不了呢?

出0入0汤圆

发表于 2013-4-28 11:42:18 | 显示全部楼层
Modbus over CAN   


出0入0汤圆

发表于 2013-4-28 11:48:54 | 显示全部楼层
我怎么觉得意义不大呢,CAN是多主通信带硬件CRC校验的总线,而MODBUS天生就是个单主多从的协议,用在CAN总线上面效率大打折扣啊,感觉就跟骑个自行车上高速公路一样。

出0入0汤圆

发表于 2013-8-14 08:38:25 来自手机 | 显示全部楼层
mark……
顶一个…

出0入0汤圆

发表于 2013-10-21 14:03:56 | 显示全部楼层
mark 下

出0入0汤圆

发表于 2013-11-12 10:15:37 | 显示全部楼层
thanks a lot

出0入4汤圆

发表于 2013-11-12 13:21:25 | 显示全部楼层
看来很多人都在这样做,真需要一个通用的协议了

出0入0汤圆

发表于 2013-12-12 22:18:15 | 显示全部楼层
顶起,我也需要这个了!

出0入0汤圆

发表于 2013-12-13 12:15:22 | 显示全部楼层
正用上这个

出0入0汤圆

发表于 2013-12-13 18:46:47 | 显示全部楼层
支持一下,但是小白,还没用过can,有机会一定用的时候一定学了。

出30入0汤圆

发表于 2013-12-13 18:58:46 来自手机 | 显示全部楼层
这个可以有

出0入0汤圆

发表于 2013-12-13 22:11:43 | 显示全部楼层
想法不错!!

出0入0汤圆

发表于 2013-12-13 22:12:05 | 显示全部楼层
想法不错!!。。。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2013-12-25 16:49:32 | 显示全部楼层
受益匪浅

出0入0汤圆

发表于 2014-1-4 14:21:15 | 显示全部楼层
谢谢分享,学习中。

出0入0汤圆

发表于 2014-3-11 22:54:56 | 显示全部楼层
楼主的想法很有现实意义!顶

出0入0汤圆

发表于 2014-3-18 16:35:27 | 显示全部楼层
thanks for share

出0入0汤圆

发表于 2014-4-9 16:47:11 | 显示全部楼层
谢谢分享,收藏

出0入0汤圆

发表于 2014-4-25 14:56:22 | 显示全部楼层
mark,。。。

出0入0汤圆

发表于 2014-11-26 17:03:25 | 显示全部楼层
谢谢楼主~

出0入0汤圆

发表于 2014-11-29 18:26:28 | 显示全部楼层
一些标准通讯协议,由于历史原因, 以及要兼容很多我们根本用不到的玩艺, 搞得复杂无比...

出0入0汤圆

发表于 2015-1-26 23:56:13 | 显示全部楼层
我是这样想的,虽然can感觉很火,但是大多数厂家还是使用modbus,因为成熟,can还是小圈子相对来讲

出0入0汤圆

发表于 2015-3-27 21:48:24 | 显示全部楼层
好东西,参考下

出0入0汤圆

发表于 2015-3-29 21:21:56 | 显示全部楼层
以前接触过一点

出0入0汤圆

发表于 2018-5-14 18:50:14 | 显示全部楼层
一直在找哦!终于找到了,哈哈!

出0入0汤圆

发表于 2018-5-14 18:57:49 | 显示全部楼层
这也可以!   好好学习一下;

出0入0汤圆

发表于 2018-5-14 20:12:05 | 显示全部楼层
不一定要完全和Modbus一样,只要和Modbus一样简单可靠,面向寄存器操作即可。要简单可靠,首先要做到上下文无关(Modbus就是上下文无关的),另外只用扩展帧。
比如寄存器块读写,就规定一次最多4个字(8个字节),每帧都包含寄存器地址、数量、数据,这样就可做到上下文无关,事实上很多Modbus设备一次寄存器块读写的字数也不一样,有的厂家最多16个字,有的32个字,等等。

出0入0汤圆

发表于 2018-5-14 20:14:42 | 显示全部楼层
Modbus简单可靠易实现,最重要一点就是做到了上下文无关

出0入0汤圆

发表于 2018-5-16 20:54:14 | 显示全部楼层
Modbus over CAN 学习了

出0入0汤圆

发表于 2018-6-16 18:03:14 | 显示全部楼层
CAN,ModBus。一个是多主机,另一个是只能独立主机
能整到一起,倒是挺好。但是“通用性”上是个问题。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 12:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表