打印
[485通信]

大家有没有人觉得 MODBUS 不好用

[复制链接]
13845|60
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jing43|  楼主 | 2015-9-2 14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家在做 485 通信的时候,一般采用什么软件协议,是自定义的协议还是直接用 MODBUS?

我们这里是做工业产品的,数字电源和采集板之类的,用 485 通信比较多。

现在大多采用两种通信协议,自定义通信协议或 MODBUS 通信协议,感觉 MODBUS 通信协议很不好用,主要体现在以下几个方面:

1,ASC2 模式时,一个 16 位数据将被分成 4 个 8 位数发送,这不仅浪费宽带,还给发送接收增加额外的逻辑

2,RTU 模式时,数据包用 CRC 校验验证数据的正确性,CRC 给低端 8 位 CPU 带来压力。数据包与数据包之间要相隔传送 3.5 个字节(可能是位)以上的时间,否则不认为这里是两个数据包的分界,当总线上不停的有数据在传送时,下位机要准确的判断两个数据包的分界,需要宝贵的实时处理能力。当波特率为 57600 时,3.5 字节的传送时间仅为半毫秒。我们可以自己约定据包之间的时间间隔大于 20ms 来解决这问题,但这样与通用设备通信时有丢包的风险。

3,modbus 可能出现得太早(1979),它的数据收发是以字节(8位数)为单位处理的,而我们当前使用的数据以 16位数为主,它的字节个数不是偶数个,难以在底层把它们拼接成 16 位数。我们在读取发送数据时,要关心读取到的缓冲区和发送出去的缓冲区的各个字节所代表的意义,像在写汇编,需要消耗更的的脑力,体验不好,出错的风险成倍增加。

4,modbus 用在工控行业,他们的固定常用命令我们没几条用得上。

5,modbus 不适用于做 DSP 的 bootloader。DSP 的 bootloader 必需运行于 ram 中,运行代码要越短越好。

大家有没有人研究替代 MODBUS 的通信协议?希望达到以下要求:
1,有包头包尾,更容易区分数据包
2,有校验,不能通过校验的数据包舍弃
3,有地址,地址为 0 时是广播命令,所有从机接收到后都认为是对自己的命令,地址不为 0  时是一对一命令。
4,有握手,从机对非广播命令做出响应
5,能发送完整的数据,也就是数据包有包头(EE)、包尾(EF)两个字节,数据包中间还是允许出现包头包尾字节。
6,在底层收发容易加工,单片机运算没有压力。
7,要有更好的数据结构,所有数据底层可以统一加工成 16 位数据格式,软件调用时,访问的是 16 位数据的数组或结构体。底层发送接收的,是以 8 位数据为最小单位的,大多数据串口都是这样的。
8,不容易出错,在 128 个节点的网络中,主机要可靠的通信到特定从机。有硬件干扰时,可以重试通信。

相关帖子

沙发
chunyang| | 2015-9-2 17:38 | 只看该作者
ModBus是非常典型的主从协议,如果不需要与其它厂家的产品兼容,当然可以自定协议,参考ModBus的协议思想即可。

使用特权

评论回复
板凳
hbzjt2011| | 2015-9-2 18:40 | 只看该作者
目前都有用到,感觉还是自由通信协议方便一些,当然,modbus在于支持其通信方式的仪器通信时有一定的优势。

使用特权

评论回复
地板
acguy| | 2015-9-2 21:46 | 只看该作者
1: ASCII模式除了老的仪表,现场已经很少见了。

使用特权

评论回复
5
acguy| | 2015-9-2 21:49 | 只看该作者
2: Crc16对8位MCU毫无压力,查表法要512bytes, 如果是简表只需64bytes.

使用特权

评论回复
6
acguy| | 2015-9-2 21:51 | 只看该作者
3: 认真读modbus规范,19200bps以上速率3.5t按19200bps计算。

使用特权

评论回复
7
acguy| | 2015-9-2 21:58 | 只看该作者
4: modbus协议实在太简单了,如果还觉得编程烦琐,有无数开源代码可以参考。

使用特权

评论回复
8
acguy| | 2015-9-2 22:03 | 只看该作者
5: 其实modbus最大的好处是通用,无数的设备;上位机都兼容。

使用特权

评论回复
9
974458642| | 2015-9-3 21:41 | 只看该作者
我这个项目用的激光传感器,也是MODBUS,485 ,波特率到937000,计算机延时1ms ,指令读取是一发一收,CRC16校验,每秒500个数据,丢包大概6个左右

使用特权

评论回复
10
974458642| | 2015-9-3 21:42 | 只看该作者
但是用ACII 方式就做不到每秒500个数据

使用特权

评论回复
11
acguy| | 2015-9-3 22:11 | 只看该作者
937kbps, 你已经不可能与其它modbus设备兼容了,为什么还要用modbus协议?

使用特权

评论回复
12
yhn1973| | 2015-9-3 23:09 | 只看该作者
CRC校验对8位单片机也不算个啥,帧间隔时间也很容易实现,相反那种包头包尾和转义字符方式处理起来才麻烦

使用特权

评论回复
13
yhn1973| | 2015-9-3 23:14 | 只看该作者
我波特率921.6K,Modbus-RTU协议,在办公室中连续测试运行几天也不丢一个包

使用特权

评论回复
14
jing43|  楼主 | 2015-9-4 08:57 | 只看该作者
hbzjt2011 发表于 2015-9-2 18:40
目前都有用到,感觉还是自由通信协议方便一些,当然,modbus在于支持其通信方式的仪器通信时有一定的优势。 ...

和我想的一样。

使用特权

评论回复
15
jing43|  楼主 | 2015-9-4 09:07 | 只看该作者
acguy 发表于 2015-9-2 21:49
2: Crc16对8位MCU毫无压力,查表法要512bytes, 如果是简表只需64bytes.

我们现在也是用 512bytes 方法,感觉运算量也还是比较大的。就是如果刚收到了一段数据 + 10ms 空白,这时进入 CRC 校验,校验过程中不接收数据(还有中断抢资源),这时有丢包的现象。上位机有时会把一包数据分分成两截发过来。我们这是用查询方式通信的,中断资源用于做更紧要的事情,而且整个中断要占用约 CPU 一半的运行时间。

使用特权

评论回复
16
acguy| | 2015-9-4 09:13 | 只看该作者
长报文分批计算CRC

使用特权

评论回复
17
acguy| | 2015-9-4 09:16 | 只看该作者
最后的3.5t前crc应该早算完了,只是确认是有效帧然后执行,不用等到3.5t后再算CRC.

使用特权

评论回复
18
jing43|  楼主 | 2015-9-4 09:23 | 只看该作者
acguy 发表于 2015-9-2 21:58
4: modbus协议实在太简单了,如果还觉得编程烦琐,有无数开源代码可以参考。 ...

是有点烦琐的。比如,0x10 写多个寄存器这个指令,既有寄存器数量,又有字节数这两个参数,感觉重复了;这条命令数据内容从缓冲区数组下标[7] 开始是数据,而 0x03 命令读取寄存器时,不与这个对称,数据内容从缓冲区数组下标[3] 开始是数据,还有 0x5 写单个线圈、 0xF 写多个线圈,数据结构都不相同,每一条指令,都自己做一套规则,在程序上,需要对每条指令的结构进行解析,这确实要消耗更多的脑力。

使用特权

评论回复
19
jing43|  楼主 | 2015-9-4 09:26 | 只看该作者
yhn1973 发表于 2015-9-3 23:09
CRC校验对8位单片机也不算个啥,帧间隔时间也很容易实现,相反那种包头包尾和转义字符方式处理起来才麻烦 ...

是啊,有包头包尾的通信协议里,如果发送数据包中不允许再出现包头包尾,那当要发送的数据正好就是包头或包尾时,麻烦就大了,这种通信协议,这个地方出问题最多。所以,数据包的中间部位,也是要允许出现包头包尾的。

使用特权

评论回复
20
jing43|  楼主 | 2015-9-4 09:37 | 只看该作者
974458642 发表于 2015-9-3 21:41
我这个项目用的激光传感器,也是MODBUS,485 ,波特率到937000,计算机延时1ms ,指令读取是一发一收,CRC1 ...

你这个速度确实是超出我的想象了,我们是认为,电脑延时 1ms,未必是 1ms,这种产品没有用过也希望不要用到。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

121

帖子

2

粉丝