打印
[程序源码]

论坛“最强”MODBUS-RTU从机程序,不服来战

[复制链接]
2862|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
oufuqiang|  楼主 | 2019-10-6 15:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 oufuqiang 于 2019-10-6 15:53 编辑

我就是标题党,但是是有点料的标题党当然,我的水平不能说算高,比起圈圈、程序匠人等大神,用单片机做VGA接口的示波器的这种,我完全就是一小码农了。但是……经常有人说串口数据不好处理,没办法及时很好响应串口数据。

本人也在网上购买别人的传感器、模块、LED控制卡等,这些商品化的产品,数据接口确实不能让我满意
1.抗错性不行,有一个LED控制卡,只要发一包不完整的数据过去,接口就死掉了,得重启,我是用无线传过去的,根本没法用。
2.不能很好兼容其他协议的设备,如买了一个雨量传感器,自有协议的,但是总线上还想挂其他的MODBUS协议的传感器,问这两个厂家,恢复均是不同协议的不能混用。
3.抗干扰性差(抗乱码差),一些传感器接口如果不小心发了点其他数据过去,就会丢掉后面一帧正常的数据,造成丢帧。
于是,我就想,这个小接口,为什么不写得足够强大和健壮?只要你有正常的数据帧过来,我随时保持响应,这样不行吗?
国庆这几天有点小空,于是就慢慢码一下,结果实现了我的目标。

主要实现的不同于一般的modbus的地方
系统构成:STC12C5A60S2,DS18B20,四位普通数码管模块(需要动态扫描)
注意:请留意你的DS18B20来源,我的手里三颗DS18B20,一颗不回应数据,一颗上电默认9位分辨率,一颗上电默认12位分辨率(这才正常)。
IO:DS18B20,P3.7。数码管字段:P1,低电平有效。数码管位选:P2低四位,低电平有效。
程序编译:data:62.1(RAM),code:1969(ROM)


效果:
1.23400bps波特率,11.0592MHz晶振频率下能达到的最高波特率,已超出modscan软件的范围,后续用游戏修改器强制修改modscan到230400bps测试。
2.正常帧绝对响应-这个不用说
3.数据断流正常响应,一帧数据,你可以任意长的时间内发送过来,比如8字节的帧,连续发7字节,过一年再发最后一个字节,100%响应。
4.混帧、叠帧正常响应,比如两个8字节的帧,前面一个帧后4个字节和后面一个帧前四个字节混叠,后一帧正常响应。相当于你前一帧发了4个字节,发了一半,你不发了,发下一帧正常帧,下一帧正常帧正常响应。
5.连帧正常响应,连续发几帧查询帧,我通通响应数据给你,不需要3.5字节的空闲,反正数据我给回你了,你能不能处理是你的事情了。
6.无限垃圾数据通吃,23400bps波特率下,你扔再多的垃圾数据给我,我也不会死掉。
7.无限长度垃圾数据里面插入正常帧、混帧、叠帧、连帧,230400bps波特率下连续发送,全部正常响应。
8.所有过程,数码管扫描正常,不闪烁。18B20温度采集正常,不中断。


视频1:23400bps正常帧混帧叠帧连帧响应测试视频
https://v.youku.com/v_show/id_XNDM4NzkxMTAyOA==.html?spm=a2h3j.8428770.3416059.1

视频2:23400bps连续大数据乱码不出错LED扫描温度采集正常
https://v.youku.com/v_show/id_XNDM4NzkwNTUyOA==.html?spm=a2h3j.8428770.3416059.1


视频3:在1MB乱码数据中插入正常帧叠帧连帧(数据编辑过程)
https://v.youku.com/v_show/id_XNDM4NzkxMjA1Mg==.html?spm=a2h3j.8428770.3416059.1

视频4:23400bps码率发送含有正常帧的乱码数据全部正常响应,乱码中的正常帧全部得到响应
https://v.youku.com/v_show/id_XNDM4NzkwOTI1Mg==.html?spm=a2h3j.8428770.3416059.1

以下是测试用的数据帧



HEX文件:免费提供测试。 S_modbus_rtu_node hex.rar (2.42 KB)

C源代码程序:付费或擂台形式公开,即如果你能写出性能更优的代码,RAM,code更小或者你认为的其他性能。贴上HEX,大家测试,确实超过我的,我3天内不能反超,我无条件公开我的源代码。反之同理。最好是同一内核的单片机,不同内核,不好比较。同内核,不同周期的,要慢慢看指令表比较。C语言源程序是单一的C文件,没有.H文件,没做过大项目,水平差,一个C搞定。


此部分内容已被设置为付费内容,您可以在支付 9.9 元 人民币后浏览本楼层全部付费内容点击购买

本楼层付费信息已有4人购买

使用特权

评论回复

相关帖子

沙发
oufuqiang|  楼主 | 2019-10-6 16:08 | 只看该作者
本帖最后由 oufuqiang 于 2019-10-6 16:10 编辑

modscan 230400bps


https://v.youku.com/v_show/id_XNDM4Nzk5Mjk4NA==.html?spm=a2h3j.8428770.3416059.1
modscan 数据核对
https://v.youku.com/v_show/id_XNDM4Nzk5MzgwOA==.html?spm=a2h3j.8428770.3416059.1

使用特权

评论回复
板凳
mjs0528| | 2019-10-6 16:18 | 只看该作者
看起来很不错,modbus在串口中用的比较多,不错,下来看看

使用特权

评论回复
地板
nbiot| | 2019-10-7 17:40 | 只看该作者
想问一下,这个软件模块,在源码或功能上经过什么测试吗?

论坛上”最强“,我认为是很厉害的了,但这种称号,最好是别的工程师给的,如果是自封的,总感觉有点太骄傲了。

弄个HEX文件,给人免费下载?我觉得应该收费,至少要1000元才对得起你这种大侠。

使用特权

评论回复
5
oufuqiang|  楼主 | 2019-10-7 21:34 | 只看该作者
nbiot 发表于 2019-10-7 17:40
想问一下,这个软件模块,在源码或功能上经过什么测试吗?

论坛上”最强“,我认为是很厉害的了,但这种称 ...

这么多个测试视频了解一下行不行?
视频信不过自己下HEX自己测试一下行不行?
你更强你贴HEX就好了,我有不需要你承认
至于收费问题,我也可以免费给啊,你私聊我我发给你

使用特权

评论回复
6
JLennon| | 2019-10-8 08:16 | 只看该作者
问下楼主,我写过modbus-rtu程序,c#的.有这样一个问题,有时会发出数据,mcu不返回数据.
我是用的定时器,定时发送接收,实现自动测试用的.你是否遇到过这样的情况?谢谢指教.

使用特权

评论回复
7
xuyaqi| | 2019-10-8 10:23 | 只看该作者
希望说明:
1 数码管,18b20 在系统中用途。2 程序有MODBUS指令处理功能吗?

使用特权

评论回复
8
oufuqiang|  楼主 | 2019-10-8 20:38 | 只看该作者
JLennon 发表于 2019-10-8 08:16
问下楼主,我写过modbus-rtu程序,c#的.有这样一个问题,有时会发出数据,mcu不返回数据.
我是用的定时器,定时 ...

你首先要确认到底是你的上位机没有正确发出查询帧,还是从机MCU没有回应你的查询。
用串口助手或者串口监视软件看看数据交互的情况。

使用特权

评论回复
9
oufuqiang|  楼主 | 2019-10-8 20:43 | 只看该作者
xuyaqi 发表于 2019-10-8 10:23
希望说明:
1 数码管,18b20 在系统中用途。2 程序有MODBUS指令处理功能吗?

1.数码管,数码管需要连续不停的扫描。在此只用作实时性的演示,如果数据量大了,CPU忙不过来,数码管就会闪烁。我的程序基本看不出数码管有什么闪烁。也就是,任意长度的垃圾数据扔过来,我数码管仍然一直得到均匀的扫描。
2.DS18B20是1wire器件,大家都知道1wire总线对时序的要求很高,也是为了演示实时性。在满串口负荷230400bps状态下连续处理垃圾数据,还能兼顾数码管的扫描和1wire的时序,说明CPU还可以有很多空闲时间做其他的任务,并不是被modbus rtu服务程序占满CPU。是有实用价值的。
3.目前只做了03码,5个寄存器。可以加入其他码,性能不会有显著下降,但是下降是肯定的,下降到什么程度,要测试才知道了。个人乐观认为能保持230400bps不掉速。

使用特权

评论回复
10
ztb| | 2019-10-8 21:13 | 只看该作者
3.数据断流正常响应,一帧数据,你可以任意长的时间内发送过来,比如8字节的帧,连续发7字节,过一年再发最后一个字节,100%响应。
----根据MODBUS标准,数据字节间停顿时间最多不能超过1.5t。超过时认为数据帧错误!

5.连帧正常响应,连续发几帧查询帧,我通通响应数据给你,不需要3.5字节的空闲,反正数据我给回你了,你能不能处理是你的事情了。
----根据MODBUS标准,数据帧开始和结束的标志都是3.5t的空闲,不要这个时间必然导致数据无法透明传送。

使用特权

评论回复
11
ztb| | 2019-10-8 21:25 | 只看该作者

使用特权

评论回复
12
JLennon| | 2019-10-9 09:04 | 只看该作者
oufuqiang 发表于 2019-10-8 20:38
你首先要确认到底是你的上位机没有正确发出查询帧,还是从机MCU没有回应你的查询。
用串口助手或者串口监 ...

上位机发出的数据帧是对的,MCU不回应.只有关闭串口重头开始发送查询才可以.
生产应用中,测10个产品左右会卡住一次.每次测试1分钟.
我用的是定时器发送命令给MCU,请问你是如何操作的?谢谢.

使用特权

评论回复
13
JLennon| | 2019-10-9 09:05 | 只看该作者

请问你这个资料可以发一份给我学习吗?谢谢.

使用特权

评论回复
14
ztb| | 2019-10-9 09:19 | 只看该作者
JLennon 发表于 2019-10-9 09:05
请问你这个资料可以发一份给我学习吗?谢谢.

MODBUS通信协议.rar (10.5 MB)
GB/T19582.1-2008 基于Modbus协议的工业自动化网络规范 第1部分:Modbus应用协议.pdf
GB/T19582.2-2008_基于Modbus协议的工业自动化网络规范 第2部分:Modbus协议在串行链路上的实现指南.pdf
GB/T19582.3-2008_基于Modbus协议的工业自动化网络规范 第3部分:Modbus协议在TCP/IP上的实现指南.pdf



使用特权

评论回复
15
JLennon| | 2019-10-9 14:18 | 只看该作者
ztb 发表于 2019-10-9 09:19
GB/T19582.1-2008 基于Modbus协议的工业自动化网络规范 第1部分:Modbus应用协议.pdf
GB/T19582.2-2008_ ...

非常感谢.

使用特权

评论回复
16
oufuqiang|  楼主 | 2019-10-9 15:41 | 只看该作者
ztb 发表于 2019-10-8 21:13
3.数据断流正常响应,一帧数据,你可以任意长的时间内发送过来,比如8字节的帧,连续发7字节,过一年再发最 ...

这个不影响我响应正常的帧
你断流,按标准modbus协议,丢弃该帧,不回应。你不发最后一个字节我也没回应,跟丢弃一样的效果。你后面发正常帧,我还是能正常响应。

必然导致数据无法透明传送  这个是什么意思,没明白

使用特权

评论回复
17
lihui567| | 2019-10-10 12:37 | 只看该作者
这个modbus协议在PLC中经常用到,在stm32上也有应用,资料看着挺不错的

使用特权

评论回复
18
ztb| | 2019-10-10 22:27 | 只看该作者
oufuqiang 发表于 2019-10-9 15:41
这个不影响我响应正常的帧
你断流,按标准modbus协议,丢弃该帧,不回应。你不发最后一个字节我也没回应 ...

井底之蛙的悲剧就是仅活在自己眼前的世界里,以为天空就只有头顶看到的就这么大。
MODBUS是长时间集体智慧的结晶,是经过比你想象的多得多的情况下精炼出来的。所以才得到众多厂家的认同并成为业界标准。对于这些“条条框框”在能真正能做到知其然并知其所以然之前还是完整的遵从标准吧!

使用特权

评论回复
19
oufuqiang|  楼主 | 2019-10-10 22:51 | 只看该作者
ztb 发表于 2019-10-10 22:27
井底之蛙的悲剧就是仅活在自己眼前的世界里,以为天空就只有头顶看到的就这么大。
MODBUS是长时间集体智 ...

讨论技术就讨论技术,你是大牛你就给我们科普一下

按标准modbus发过来的帧我通通正确响应了,有什么问题吗?

使用特权

评论回复
20
lzm2008| | 2019-10-10 23:50 | 只看该作者
还好不是很贵,要不就亏大了,不好拓展Modbus完整的协议。

使用特权

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

本版积分规则

106

主题

1406

帖子

20

粉丝