硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1955|回复: 12
收起左侧

[有问必答] 硬汉哥,这个问题思考了挺久,项目比较急,还请您解答一下

  [复制链接]

2

主题

15

回帖

21

积分

新手上路

积分
21
发表于 2024-8-18 10:22:27 | 显示全部楼层 |阅读模式
有关MODBUS V6版本标准库移植到实际项目中的疑问?

最近项目比较急,熬夜了几晚,在移植硬汉哥的modbus协议时有一个困惑?

这里接收中断接收到字节流


这里RX_BUF_SIZE大小是255 这里处理的是g_tModS.RxCount < S_RX_BUF_SIZE的部分,那如果g_tModS.RxCount > S_RX_BUF_SIZE怎么处理
假设我在一定的时间内要获取多个保持寄存器的值,这个帧数大于S_RX_BUF_SIZE,或者连续发好几个帧数大于S_RX_BUF_SIZE,这里如何处理?
目前个人想法是开一个环形缓存,硬汉哥以及各位大佬觉得有必要吗 ? 感谢回复
回复

使用道具 举报

2

主题

15

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-8-18 10:24:22 | 显示全部楼层
我图片怎么没了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116223
QQ
发表于 2024-8-18 11:33:04 | 显示全部楼层

回帖奖励 +1 个金币

ask张 发表于 2024-8-18 10:24
我图片怎么没了

得手动上传,论坛不支持复制粘贴上传了。
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-8-19 08:45:25 | 显示全部楼层
标准modbus协议一帧长度不会超过256
The size of the MODBUS PDU is limited by the size constraint inherited from the first
MODBUS implementation on Serial Line network (max. RS485 ADU = 256 bytes).
回复

使用道具 举报

24

主题

195

回帖

267

积分

高级会员

积分
267
QQ
发表于 2024-8-19 09:24:45 | 显示全部楼层
https://www.modbus.cn/6756.html
结合modbus标准,先看一下标准帧格式和官方给的处理流吧
回复

使用道具 举报

33

主题

192

回帖

291

积分

高级会员

积分
291
发表于 2024-8-19 10:30:55 | 显示全部楼层
单次读寄存器数量不要太多
不行就让他去多读几次
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116223
QQ
发表于 2024-8-20 10:26:04 | 显示全部楼层
是这个限制了,得分批传输了

0F8996F4E5C4DE1E98A0B69FE6301965.png
回复

使用道具 举报

2

主题

15

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-8-21 13:41:06 | 显示全部楼层
我现在是分批传输的,用的DMA,接收最大开的是256字节的数组,然后用个环形fifo接收,如果短时间多帧传来就先存FIFO,取的时候一帧一帧取,考虑MODBUS是一问一答机制,处理完一帧再取下一帧,不过我用串口助手调试时发现,收发时间竟然相隔1S 我用硬汉哥的modbusV6跑了一下,收发时间差不多相隔1s 不知道这算不算问题
微信图片_20240821133928.png
回复

使用道具 举报

1

主题

76

回帖

79

积分

初级会员

积分
79
发表于 2024-11-19 10:36:12 | 显示全部楼层
个人表示很讨厌用modbus,设计很落后。没有长度信息,读写格式不统一,还使用大端
回复

使用道具 举报

24

主题

195

回帖

267

积分

高级会员

积分
267
QQ
发表于 2024-11-19 13:46:58 | 显示全部楼层
JIAYU 发表于 2024-11-19 10:36
个人表示很讨厌用modbus,设计很落后。没有长度信息,读写格式不统一,还使用大端

有没有哪种支持比较广泛的协议是天生小端?
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
发表于 2024-11-22 16:54:49 | 显示全部楼层
ask张 发表于 2024-8-21 13:41
我现在是分批传输的,用的DMA,接收最大开的是256字节的数组,然后用个环形fifo接收,如果短时间多帧传来就 ...

怎么会这么长,我也用的硬汉哥的从机,读取45个寄存器才50ms左右,不过我用的dma+空闲中断判断结束,没用fifo
回复

使用道具 举报

0

主题

51

回帖

51

积分

初级会员

积分
51
发表于 2024-11-22 23:13:40 | 显示全部楼层
我照着别人的代码重新写过,绑定硬件端口发送接收缓存各用了一个256字节的数组,MODBUS建立了一个结构体另外开辟了两个256字节的收发数据数组,实现MODBUSRTU和MODBUSTCP,01 02 03 04 05 06 0F 10功能都实现了,RTU跑过9600到460800波特率之间各种波特率,跑过几千万次收发无异常,TCP也跑了几千万次无异常,好像没什么难度吧,MODBUS的第一个特点不就是简单吗,比起CANOPEN和ETHERCAT什么来说都是小儿科的,自己重新写一遍比较好理解,而且出问题容易找。
回复

使用道具 举报

0

主题

51

回帖

51

积分

初级会员

积分
51
发表于 2024-11-22 23:16:46 | 显示全部楼层
另外软件FIFO对MODBUS来说完全没用,如果是串口的硬件FIFO应该很有用处,如果像H7有8-16字节的硬件FIFO,完全可以不用中断不用DMA实现115200波特率通信。还有通过modbus来OTA升级为什么大家都不用呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 11:09 , Processed in 0.362141 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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