硬汉嵌入式论坛

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

[BSP视频教程] BSP视频教程第24期:应用实战,设计一款属于自己的Modbus RTU主从协议栈(2022-10-03)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2022-10-3 14:59:27 | 显示全部楼层 |阅读模式
通过本期讲解,争取让大家都可以自己做一个Modbus主从协议,这样以后移植到其它平台,或者上位机开发,都会得心应手。

视频:
https://www.bilibili.com/video/BV11t4y1F71h



视频提纲:



参考资料:
1、HAL库版案例下载:
V7-084_Modbus RTU主站例程.7z (3.36MB)
V7-083_Modbus RTU从站例程.7z (3.37MB)
V6-029_Modbus RTU主站例程.7z (1.21MB)
V6-028_Modbus RTU从站例程.7z (1.21MB)
V5-022_Modbus RTU主站例程.7z (4.91MB)
V5-021_Modbus RTU从站例程.7z (4.91MB)

2、标准库版下载:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=16989


评分

参与人数 2金币 +30 收起 理由
查询无结果 + 10 很给力!
missfox + 20 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-10-3 15:19:44 | 显示全部楼层
更新完毕
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2022-10-3 23:05:07 | 显示全部楼层
辛苦,
代码不规范,亲人两行泪!
回复

使用道具 举报

4

主题

25

回帖

37

积分

新手上路

积分
37
发表于 2022-10-3 23:38:30 | 显示全部楼层
辛苦,过节还更新!
回复

使用道具 举报

7

主题

42

回帖

63

积分

初级会员

积分
63
发表于 2022-10-5 21:02:57 | 显示全部楼层

辛苦了。接下来会讲授什么主题呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-10-7 00:40:11 | 显示全部楼层
luis_13 发表于 2022-10-5 21:02
辛苦了。接下来会讲授什么主题呢?

有可能是CAN专题,还没定。
回复

使用道具 举报

75

主题

681

回帖

906

积分

金牌会员

积分
906
发表于 2022-10-7 01:46:09 | 显示全部楼层
感谢硬汉大佬,看完发现关于Modbus又深入了很多
回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
发表于 2022-10-7 09:15:24 | 显示全部楼层
eric2013 发表于 2022-10-7 00:40
有可能是CAN专题,还没定。

接下来不应该是ModbusTcp吗,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-10-7 12:44:49 | 显示全部楼层
gnail092 发表于 2022-10-7 09:15
接下来不应该是ModbusTcp吗,

网络视频教程还没有开,直接撸TCP给谁看。。。视频教程必须得循序渐进,形成一个完整的系统。
回复

使用道具 举报

5

主题

201

回帖

216

积分

高级会员

积分
216
发表于 2022-10-7 13:56:50 | 显示全部楼层
这个是真不错,虽然我自己也写过,但是看了还是有新的启发,真棒!
回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
发表于 2022-10-7 22:11:17 | 显示全部楼层
eric2013 发表于 2022-10-7 12:44
网络视频教程还没有开,直接撸TCP给谁看。。。视频教程必须得循序渐进,形成一个完整的系统。

嗯,有道理
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-10-8 00:46:22 | 显示全部楼层

这个不会鸽,一会跟大家分享的。
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2022-10-8 09:41:22 | 显示全部楼层
eric2013 发表于 2022-10-7 12:44
网络视频教程还没有开,直接撸TCP给谁看。。。视频教程必须得循序渐进,形成一个完整的系统。

之前码了个MODBUS TCP的协议,发现协议也就是再RTU协议上套了一层皮,去掉了CRC校验。这样看的话,03 04之类的功能码还能一样的用。如果像UP这里把发送函数写入到功能码这里是不是就有点不合适了。个人觉得功能码这里就只是一个纯软件的东西,只是负责提取相应缓冲区(寄存器)数据即可。输入 寄存器地址偏移、寄存器读取个数、寄存器缓冲区。输出的话 就是把寄存器数据存放到串口发送的缓冲区中。最后在功能码函数之外的地方发送协议包。发送前可以根据是什么协议来判断加不加CRC校验。RTU的话就加上CRC校验 然后发送。TCP的话就不加,但是还需要加上TCP的MBAP,然后发送。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-10-8 09:46:00 | 显示全部楼层
CofMilk 发表于 2022-10-8 09:41
之前码了个MODBUS TCP的协议,发现协议也就是再RTU协议上套了一层皮,去掉了CRC校验。这样看的话,03 04 ...

因为Modbus协议代码都比较简单,rtu和tcp都单独开个C文件,单独处理。用那个C,移植那个C即可。
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2022-10-8 09:52:13 | 显示全部楼层
eric2013 发表于 2022-10-8 09:46
因为Modbus协议代码都比较简单,rtu和tcp都单独开个C文件,单独处理。用那个C,移植那个C即可。

啊 这个确实。。
只不过我这里把这两个协议整合了。可以通过一个私有命令更改MODBUS协议栈,自由选择使用RUT还是TCP。。
所以就有了上述的内容。就是将发送函数剥离出功能码(以前也是像楼主这样编写0...0,然后就发现 现有的框架不能满足需求了)。
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2022-10-8 10:44:14 | 显示全部楼层
啊 还有一个问题,,这里说到不适合用空闲中断分包,因为空闲中断的时间不符合MODBUS协议规定。那如果用空闲中断加定时器可以么。就是在空闲中断里面开启一个规定时长的定时器。然后再定时器中断中,改变标志位。
回复

使用道具 举报

6

主题

106

回帖

124

积分

初级会员

积分
124
发表于 2022-10-8 15:39:02 | 显示全部楼层
有对应的文档吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-10-8 15:40:25 | 显示全部楼层
xudongqiang 发表于 2022-10-8 15:39
有对应的文档吗?

【年末福利】安富莱电子发布Modbus教程,配套STM32F103,F407,F429和H7主从机例子,含HAL和标准库两版(2022-10-03)
https://www.armbbs.cn/forum.php? ... 6989&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2022-10-17 23:53:08 | 显示全部楼层
硬汉老师,看了你的教程深受启发,可在我的项目中会用到多个串口同时跑modbus的情况,比如UART1做为主机,UART2,UART3,UART4做为从机,各自连接不同的设备。这种情况软件架构怎么设计才更合理。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-10-18 12:59:20 | 显示全部楼层
jia_xuan 发表于 2022-10-17 23:53
硬汉老师,看了你的教程深受启发,可在我的项目中会用到多个串口同时跑modbus的情况,比如UART1做为主机,U ...

我们的文件里面所有函数全部做成static,只有供外部调用的单独换个名字,然后多份驱动文件实现即可。
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2022-10-18 14:31:10 | 显示全部楼层
eric2013 发表于 2022-10-18 12:59
我们的文件里面所有函数全部做成static,只有供外部调用的单独换个名字,然后多份驱动文件实现即可。

明白了,谢谢
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2022-11-7 17:28:14 | 显示全部楼层
eric2013 发表于 2022-10-8 09:46
因为Modbus协议代码都比较简单,rtu和tcp都单独开个C文件,单独处理。用那个C,移植那个C即可。

等Modbus TCP,大概啥时候出?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-11-8 09:34:35 | 显示全部楼层
sy373466062 发表于 2022-11-7 17:28
等Modbus TCP,大概啥时候出?

开始录制网络视频教程了搞。
回复

使用道具 举报

44

主题

562

回帖

699

积分

金牌会员

积分
699
发表于 2022-12-20 11:24:21 | 显示全部楼层
eric2013 发表于 2022-11-8 09:34
开始录制网络视频教程了搞。

项目要求整Modbus RTU和TCP,Modbus都没有学过,还在学习中,同问一下Modbus TCP(LWIP)啥时候能放出来,或能不能先放个demo溜溜。
另外请教一下,由于串口支持两种协议SCPI和Modbus,SCPI是不定长。STM32H串口空闲中断+DMA接收不定长数据,教程中提到Modbus不建议使用串口空闲中断,不太理解这个是为什么。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-12-20 14:11:34 | 显示全部楼层
ou513 发表于 2022-12-20 11:24
项目要求整Modbus RTU和TCP,Modbus都没有学过,还在学习中,同问一下Modbus TCP(LWIP)啥时候能放出来 ...

网络Modbus还没有开始整理。

空闲中断是单个字节超时就空闲了,并不符合modbus规范的超时时间,这个帖子有说明

Modbus RTU的3.5字符间隔,在波特率从38400开始,都是固定的1.75ms
https://www.armbbs.cn/forum.php?mod=viewthread&tid=115633
回复

使用道具 举报

44

主题

562

回帖

699

积分

金牌会员

积分
699
发表于 2022-12-20 21:13:46 | 显示全部楼层
eric2013 发表于 2022-12-20 14:11
网络Modbus还没有开始整理。

空闲中断是单个字节超时就空闲了,并不符合modbus规范的超时时间,这个帖 ...

哦,刚刚开始看资料和学习,原来还有这样的要求。那就有个新的疑惑,这个超指的是帧数据接收时间呢,还是要完成处理指令时间,即1.75ms返回处理数据。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-12-20 21:41:50 | 显示全部楼层
ou513 发表于 2022-12-20 21:13
哦,刚刚开始看资料和学习,原来还有这样的要求。那就有个新的疑惑,这个超指的是帧数据接收时间呢,还是 ...

一帧数据接收超过3.5字节时间还没有收到新数据,来指示此帧数据结束。
回复

使用道具 举报

4

主题

20

回帖

32

积分

新手上路

积分
32
发表于 2023-4-1 10:30:51 | 显示全部楼层
01~~10H指令都支持了,没有17我好难受呀,我正好用modbus,还正好用了17指令码(读写多个寄存器)。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2023-4-1 11:20:28 | 显示全部楼层
向北 发表于 2023-4-1 10:30
01~~10H指令都支持了,没有17我好难受呀,我正好用modbus,还正好用了17指令码(读写多个寄存器)。。。

方便的话,看下视频,自己手动添加就行,比较简单。
回复

使用道具 举报

4

主题

20

回帖

32

积分

新手上路

积分
32
发表于 2023-4-1 11:39:30 | 显示全部楼层
eric2013 发表于 2023-4-1 11:20
方便的话,看下视频,自己手动添加就行,比较简单。

谢谢老师,我马上去看
回复

使用道具 举报

1

主题

30

回帖

33

积分

新手上路

积分
33
发表于 2023-10-16 15:20:34 | 显示全部楼层
硬汉哥,我使用的modbus从站的校验位没有,停止位1位,是不是需要改下你提供的协议栈里的配置。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-11-2 22:38:46 | 显示全部楼层
感谢分享,谢谢!
回复

使用道具 举报

0

主题

11

回帖

11

积分

新手上路

积分
11
发表于 2023-11-21 20:46:42 | 显示全部楼层
发现一个 bug, 在主站的
[C] 纯文本查看 复制代码
void ModbusHost_Send10H(uint8_t _addr, uint16_t _reg, uint8_t _num, uint8_t *_buf)


函数中缺少一句
[C] 纯文本查看 复制代码
g_tModbusHost.fAck10H = 0;


没有做清接收标志操作。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2023-11-22 08:14:00 | 显示全部楼层
咸菜稀粥 发表于 2023-11-21 20:46
发现一个 bug, 在主站的
[mw_shl_code=c,true]void ModbusHost_Send10H(uint8_t _addr, uint16_t _reg,  ...

清除合理。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2023-11-22 08:15:17 | 显示全部楼层
ldd69arm 发表于 2023-10-16 15:20
硬汉哥,我使用的modbus从站的校验位没有,停止位1位,是不是需要改下你提供的协议栈里的配置。

对,主从站这个地方匹配下即可。
回复

使用道具 举报

3

主题

8

回帖

17

积分

新手上路

积分
17
发表于 2024-3-11 12:14:31 | 显示全部楼层
用这个例程,如何发送float类型的数据啊?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2024-3-12 08:41:57 | 显示全部楼层
define 发表于 2024-3-11 12:14
用这个例程,如何发送float类型的数据啊?

弄个联合体就可以方便字节方式发送了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 03:23 , Processed in 0.413528 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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