搜索
bottom↓
回复: 45

modbus stm32实时响应

[复制链接]

出0入0汤圆

发表于 2019-4-12 15:54:15 | 显示全部楼层 |阅读模式
本帖最后由 hy2515131 于 2019-4-13 09:43 编辑

目前使用一款别人开发的ADC采集系统,modbus-RTU通信实时采集ADC的数据,57600波特率下,采集系统收到modbus指令后间隔280us回传modbus指令,回传的指令还是经过滤波处理的ADC数据,求modbus实时通信算法。
STM32型号不限制,可以使用F1 F4系列都可以。
自己尝试使用STM32F429IGT6移植了freemodbus,也可以正常通信,不过实时性不高,用的是查询模式,
在while大循环中增加延时之后,发送指令和接收指令之间的时间变化明显,delay延时1秒就导致发送和接收的时间超过1秒,对于实时系统来说这是完全不能接收的。

freemodbus程序结构如下
while (1)
{
Delayms();
ADCAcquire();
//FreeMODBUS不断查询
eMBPoll();
}
想求一个实时性强的modbus stm32通信算法,不限于freemodbus,使用自己写的modbus程序也可以

拿逻辑分析仪测量过
单个字节时间长为176us,发送和接收的时间差为215us,前面说的280us是错误的。
因为图片太大,无法上传,只能图片处理之后上传

出10入0汤圆

发表于 2019-4-12 15:55:49 | 显示全部楼层

人民币今年升值幅度好大!!!

出0入0汤圆

发表于 2019-4-12 16:08:04 | 显示全部楼层
二楼神人也!把我要说的说出来了!

出0入0汤圆

 楼主| 发表于 2019-4-12 16:09:05 | 显示全部楼层

有想法可以提,有代码可以贴!

出10入0汤圆

发表于 2019-4-12 16:11:46 | 显示全部楼层
hy2515131 发表于 2019-4-12 16:09
有想法可以提,有代码可以贴!

加一个0没兴趣,加00也没兴趣。也不会搞!

出0入0汤圆

 楼主| 发表于 2019-4-12 16:12:19 | 显示全部楼层
niechao15 发表于 2019-4-12 16:08
二楼神人也!把我要说的说出来了!

那我改下吧

出0入0汤圆

 楼主| 发表于 2019-4-12 16:12:59 | 显示全部楼层
huike 发表于 2019-4-12 16:11
加一个0没兴趣,加00也没兴趣。也不会搞!

好了 这下没有0了

出0入0汤圆

 楼主| 发表于 2019-4-12 16:13:22 | 显示全部楼层
huike 发表于 2019-4-12 16:11
加一个0没兴趣,加00也没兴趣。也不会搞!

这下不存在有没有0的问题了

出0入8汤圆

发表于 2019-4-12 16:34:17 来自手机 | 显示全部楼层
1W?我有点兴趣。但是这个uS级真的有必要吗?

出0入0汤圆

 楼主| 发表于 2019-4-12 16:42:03 | 显示全部楼层
7ms完成通信一次,设备运行周期是38ms一个周期

出0入0汤圆

 楼主| 发表于 2019-4-12 16:49:10 | 显示全部楼层
icoyool 发表于 2019-4-12 16:34
1W?我有点兴趣。但是这个uS级真的有必要吗?

7ms完成通信一次,设备运行周期是38ms一个周期

出0入0汤圆

发表于 2019-4-12 16:58:22 | 显示全部楼层
280us挺快的了,你想做一个和他一样的?
另:你怎么知道他是280us后给你返回数据的?

出0入0汤圆

发表于 2019-4-12 17:14:21 | 显示全部楼层
280us是指解析完接受的数据+合成回包+发送的第一个字节的时间?

出0入0汤圆

发表于 2019-4-12 17:59:28 | 显示全部楼层
57600的波特率,发送一个字节的时间是173.6uS,假设通讯一问一答用20字节,光通讯就要耗时3mS多了,那个280uS有什么意义?

出0入0汤圆

发表于 2019-4-12 18:04:04 | 显示全部楼层
280us连3.5字节的超时时间都不到。

出0入8汤圆

发表于 2019-4-12 18:17:10 来自手机 | 显示全部楼层
MasterPhi 发表于 2019-4-12 18:04
280us连3.5字节的超时时间都不到。

modbus标准是2个字节长度。要速度spi不行吗?

出0入0汤圆

发表于 2019-4-12 18:47:54 | 显示全部楼层
要遵循3.5T这个ModBus标准

出100入85汤圆

发表于 2019-4-12 18:48:43 来自手机 | 显示全部楼层
dma 好些,不然如果有高频率的中断就会出现响应不了。

出10入0汤圆

发表于 2019-4-12 19:15:46 | 显示全部楼层
niechao15 发表于 2019-4-12 16:08
二楼神人也!把我要说的说出来了!

商业用途,开价100真的不好看。我的性格要不苦B自己,要不就最少开个1000咨询一下有经验的人。人家要不要是他的事,我们的态度要正确。
回想起那一年半年两点陪一个老抠画电路板得200元,我真是疯了!

出0入0汤圆

发表于 2019-4-12 19:45:05 来自手机 | 显示全部楼层
是不是看到100莫元反倒没兴趣了 还不如不挂悬赏 说不定正好有经验的网友倒是愿意热心解答一下

出0入4汤圆

发表于 2019-4-12 20:36:51 | 显示全部楼层
本帖最后由 carefree1986 于 2019-4-12 20:39 编辑

楼主的程序绝对有问题,什么样的算法能占用1S的时间,1秒就是72M个机器周期

大循环的实时性系统里面基本就不允许有大一点的阻塞延时,比如100us就等于浪费了就等于浪费了100*72个周期的计算能力

出0入0汤圆

发表于 2019-4-12 21:03:24 | 显示全部楼层
楼主 用ethercat吧!串口完不成的!

出0入4汤圆

发表于 2019-4-12 23:01:03 | 显示全部楼层
只有DMA能满足

出5入42汤圆

发表于 2019-4-12 23:23:29 | 显示全部楼层
while里面为什么还要加延时?
Freemodbus发送和接收都是中断完成的。把ADC的滤波优化一下,采集放DMA,能做到多少就到头了

出0入20汤圆

发表于 2019-4-13 01:09:19 | 显示全部楼层
LZ这个系统里面,极限带宽是可以算出来的,有了极限带宽这个边界然后再去谈优化才有意义。
然后,LZ描述的实时性从根儿上就不对,实时性不是快就实时了,实时是一种确定性。

最后是这个程序的写法,freemodbus内部是一个典型的状态机写法,本身是非阻塞的,从这一点上来说协议栈在软件上是没有瓶颈的。
换句话说,让我来写这个程序,延时也好,重载任务也罢都不会对“实时性”或者说高优先级任务产生影响,虽然只有一个CPU,但是也完全可以做成非阻塞的模式。
By the way,主循环里面用一个阻塞的delay真的是小学生写法,哪里都不推荐这么搞的~

出110入170汤圆

发表于 2019-4-13 01:49:32 来自手机 | 显示全部楼层
要不了10000,五千就给你搞一个标快响应的。

他那个57600/280uS根本就不标准。

最起码需要600多uS,当然你实在需要280uS也行。

出0入0汤圆

发表于 2019-4-13 06:07:28 | 显示全部楼层
不到3.5T,不是标准modbus

出0入8汤圆

发表于 2019-4-13 08:21:26 来自手机 | 显示全部楼层
5000块可以弄,低于这个就不弄了

出1310入193汤圆

发表于 2019-4-13 08:24:26 | 显示全部楼层
3.5字节  modbus 这个绕不开\啊

出0入0汤圆

 楼主| 发表于 2019-4-13 09:05:07 | 显示全部楼层
huike 发表于 2019-4-12 19:15
商业用途,开价100真的不好看。我的性格要不苦B自己,要不就最少开个1000咨询一下有经验的人。人家要不要 ...

这100也是个人出,公司也不会给我报销, 能做就做,做不了就算了

出0入0汤圆

 楼主| 发表于 2019-4-13 09:08:00 | 显示全部楼层
carefree1986 发表于 2019-4-12 20:36
楼主的程序绝对有问题,什么样的算法能占用1S的时间,1秒就是72M个机器周期

大循环的实时性系统里面基本就 ...

我只是想表达主循环会影响串口发送和接收的时间差,想找一个中断的方法

出0入0汤圆

 楼主| 发表于 2019-4-13 09:14:14 | 显示全部楼层
kevinchen026 发表于 2019-4-12 19:45
是不是看到100莫元反倒没兴趣了 还不如不挂悬赏 说不定正好有经验的网友倒是愿意热心解答一下 ...

好的 下次注意

出0入0汤圆

 楼主| 发表于 2019-4-13 09:15:50 | 显示全部楼层
18161319737 发表于 2019-4-13 01:49
要不了10000,五千就给你搞一个标快响应的。

他那个57600/280uS根本就不标准。

如果公司能报销 多少钱无所谓 关键是不报销

出0入0汤圆

发表于 2019-4-13 09:25:36 | 显示全部楼层
本来modbus轮询通信就不是很快,中间时间间隔也是必要的。  要求高可以自定义协议

出0入0汤圆

 楼主| 发表于 2019-4-13 09:28:22 | 显示全部楼层
Feeling_MCU 发表于 2019-4-13 09:25
本来modbus轮询通信就不是很快,中间时间间隔也是必要的。  要求高可以自定义协议 ...

谢谢你的思路

出0入0汤圆

发表于 2019-4-13 10:37:31 | 显示全部楼层
其实你要想清楚 ADC 滤波值是什么时候的值。  如果ADC一直在采样 一直在滤波  modbus 拿走的可能是上一个值。这样就会很快,modbus 拿走就行了。如果是modbus命令来触发ADC采样然后滤波。。。。。 那,你这个设计有点问题啊感觉  

出615入1076汤圆

发表于 2019-4-13 13:02:43 | 显示全部楼层
追求性能的話,可以用我簽名的方案,採集終端可以讓對方定制,也可以你自己做。
多点採集的場合,可以通過一次廣播同步採集(各節點以光速同步);不要求同步的話,也可以支持終端主動上報數據,可以最快得到最新數據。
而且,你的代碼也可以簡化很多,中斷直接取數據即可。

出0入0汤圆

发表于 2019-4-13 13:42:19 来自手机 | 显示全部楼层
哈哈,我这里有DMA Modbus 485 RTU的方案,楼主有需要的话可以联系,但价格不会低

出0入0汤圆

发表于 2019-4-13 13:53:14 | 显示全部楼层
modbus是串口的吧  最简单用串口中断收dma发  中断里解析完数据填充数据发  原理上收发间隔100us都用不到  纯取决于填数数量

出0入0汤圆

发表于 2019-4-13 14:02:28 | 显示全部楼层
楼主这结构还实时个毛线  反正波特率低  串口中断手写个状态机解析一个小时也完了  自己赚这100墨渊吧

出0入0汤圆

发表于 2019-4-13 17:15:49 | 显示全部楼层
用can吧,跑个modbus_on_can

出0入0汤圆

 楼主| 发表于 2019-5-11 08:05:20 | 显示全部楼层
砂山老妖 发表于 2019-4-13 17:15
用can吧,跑个modbus_on_can

这个程序好写吗?还没有用过can

出0入89汤圆

发表于 2019-5-11 11:10:57 来自手机 | 显示全部楼层
如果只有一个设备,自定义协议其实很方便

出255入0汤圆

发表于 2019-5-11 11:19:27 | 显示全部楼层
所有通信回传也不可能这么快的响应速度。最好理清你具体需要什么?

出0入0汤圆

发表于 2019-5-11 15:40:27 | 显示全部楼层
其实我没看明白需求

出0入0汤圆

发表于 2019-5-11 15:59:28 | 显示全部楼层
hy2515131 发表于 2019-5-11 08:05
这个程序好写吗?还没有用过can

好写,参考ican的分包组包,使用扩展29bit id分配,论坛里大侠redroof发布过
https://www.amobbs.com/forum.php ... ighlight=CAN+modbus
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-9 00:13

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

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