eric2013 发表于 2022-10-3 14:59:27

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

通过本期讲解,争取让大家都可以自己做一个Modbus主从协议,这样以后移植到其它平台,或者上位机开发,都会得心应手。

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

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

视频提纲:
https://img.alicdn.com/imgextra/i4/299314119/O1CN01YmBwog1gIYBEI8nRC_!!299314119.png


参考资料:
1、HAL库版案例下载:
https://www.armbbs.cn/static/image/filetype/zip.gifV7-084_Modbus RTU主站例程.7z (3.36MB)
https://www.armbbs.cn/static/image/filetype/zip.gifV7-083_Modbus RTU从站例程.7z (3.37MB)
https://www.armbbs.cn/static/image/filetype/zip.gifV6-029_Modbus RTU主站例程.7z (1.21MB)
https://www.armbbs.cn/static/image/filetype/zip.gifV6-028_Modbus RTU从站例程.7z (1.21MB)
https://www.armbbs.cn/static/image/filetype/zip.gifV5-022_Modbus RTU主站例程.7z (4.91MB)
https://www.armbbs.cn/static/image/filetype/zip.gifV5-021_Modbus RTU从站例程.7z (4.91MB)

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


eric2013 发表于 2022-10-3 15:19:44

更新完毕

missfox 发表于 2022-10-3 23:05:07

辛苦,{:34:}

yjvijfhvk 发表于 2022-10-3 23:38:30

辛苦,过节还更新!{:36:}

luis_13 发表于 2022-10-5 21:02:57

eric2013 发表于 2022-10-3 15:19
更新完毕

辛苦了。接下来会讲授什么主题呢?:P:lol

eric2013 发表于 2022-10-7 00:40:11

luis_13 发表于 2022-10-5 21:02
辛苦了。接下来会讲授什么主题呢?

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

庄永 发表于 2022-10-7 01:46:09

感谢硬汉大佬,看完发现关于Modbus又深入了很多

gnail092 发表于 2022-10-7 09:15:24

eric2013 发表于 2022-10-7 00:40
有可能是CAN专题,还没定。

接下来不应该是ModbusTcp吗,:lol

eric2013 发表于 2022-10-7 12:44:49

gnail092 发表于 2022-10-7 09:15
接下来不应该是ModbusTcp吗,
网络视频教程还没有开,直接撸TCP给谁看。。。视频教程必须得循序渐进,形成一个完整的系统。

honami520 发表于 2022-10-7 13:56:50

这个是真不错,虽然我自己也写过,但是看了还是有新的启发,真棒!

gnail092 发表于 2022-10-7 22:11:17

eric2013 发表于 2022-10-7 12:44
网络视频教程还没有开,直接撸TCP给谁看。。。视频教程必须得循序渐进,形成一个完整的系统。

嗯,有道理

eric2013 发表于 2022-10-8 00:46:22

gnail092 发表于 2022-10-7 22:11
嗯,有道理

这个不会鸽,一会跟大家分享的。{:33:}

CofMilk 发表于 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,然后发送。

eric2013 发表于 2022-10-8 09:46:00

CofMilk 发表于 2022-10-8 09:41
之前码了个MODBUS TCP的协议,发现协议也就是再RTU协议上套了一层皮,去掉了CRC校验。这样看的话,03 04 ...

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

CofMilk 发表于 2022-10-8 09:52:13

eric2013 发表于 2022-10-8 09:46
因为Modbus协议代码都比较简单,rtu和tcp都单独开个C文件,单独处理。用那个C,移植那个C即可。

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

CofMilk 发表于 2022-10-8 10:44:14

啊 还有一个问题,,这里说到不适合用空闲中断分包,因为空闲中断的时间不符合MODBUS协议规定。那如果用空闲中断加定时器可以么。就是在空闲中断里面开启一个规定时长的定时器。然后再定时器中断中,改变标志位。{:13:}

xudongqiang 发表于 2022-10-8 15:39:02

有对应的文档吗?

eric2013 发表于 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?mod=viewthread&tid=16989&fromuid=58
(出处: 硬汉嵌入式论坛)

jia_xuan 发表于 2022-10-17 23:53:08

硬汉老师,看了你的教程深受启发,可在我的项目中会用到多个串口同时跑modbus的情况,比如UART1做为主机,UART2,UART3,UART4做为从机,各自连接不同的设备。这种情况软件架构怎么设计才更合理。

eric2013 发表于 2022-10-18 12:59:20

jia_xuan 发表于 2022-10-17 23:53
硬汉老师,看了你的教程深受启发,可在我的项目中会用到多个串口同时跑modbus的情况,比如UART1做为主机,U ...

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

jia_xuan 发表于 2022-10-18 14:31:10

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

明白了,谢谢

sy373466062 发表于 2022-11-7 17:28:14

eric2013 发表于 2022-10-8 09:46
因为Modbus协议代码都比较简单,rtu和tcp都单独开个C文件,单独处理。用那个C,移植那个C即可。

等Modbus TCP,大概啥时候出?

eric2013 发表于 2022-11-8 09:34:35

sy373466062 发表于 2022-11-7 17:28
等Modbus TCP,大概啥时候出?

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

ou513 发表于 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不建议使用串口空闲中断,不太理解这个是为什么。

eric2013 发表于 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

ou513 发表于 2022-12-20 21:13:46

eric2013 发表于 2022-12-20 14:11
网络Modbus还没有开始整理。

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

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

eric2013 发表于 2022-12-20 21:41:50

ou513 发表于 2022-12-20 21:13
哦,刚刚开始看资料和学习,原来还有这样的要求。那就有个新的疑惑,这个超指的是帧数据接收时间呢,还是 ...

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

向北 发表于 2023-4-1 10:30:51

01~~10H指令都支持了,没有17我好难受呀,我正好用modbus,还正好用了17指令码(读写多个寄存器)。。。:'(

eric2013 发表于 2023-4-1 11:20:28

向北 发表于 2023-4-1 10:30
01~~10H指令都支持了,没有17我好难受呀,我正好用modbus,还正好用了17指令码(读写多个寄存器)。。。

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

向北 发表于 2023-4-1 11:39:30

eric2013 发表于 2023-4-1 11:20
方便的话,看下视频,自己手动添加就行,比较简单。

谢谢老师,我马上去看:$

ldd69arm 发表于 2023-10-16 15:20:34

硬汉哥,我使用的modbus从站的校验位没有,停止位1位,是不是需要改下你提供的协议栈里的配置。

单片机与PLC 发表于 2023-11-2 22:38:46

感谢分享,谢谢!

咸菜稀粥 发表于 2023-11-21 20:46:42

发现一个 bug, 在主站的
void ModbusHost_Send10H(uint8_t _addr, uint16_t _reg, uint8_t _num, uint8_t *_buf)

函数中缺少一句
g_tModbusHost.fAck10H = 0;

没有做清接收标志操作。

eric2013 发表于 2023-11-22 08:14:00

咸菜稀粥 发表于 2023-11-21 20:46
发现一个 bug, 在主站的
void ModbusHost_Send10H(uint8_t _addr, uint16_t _reg,...

清除合理。

eric2013 发表于 2023-11-22 08:15:17

ldd69arm 发表于 2023-10-16 15:20
硬汉哥,我使用的modbus从站的校验位没有,停止位1位,是不是需要改下你提供的协议栈里的配置。

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

define 发表于 2024-3-11 12:14:31

用这个例程,如何发送float类型的数据啊?

eric2013 发表于 2024-3-12 08:41:57

define 发表于 2024-3-11 12:14
用这个例程,如何发送float类型的数据啊?

弄个联合体就可以方便字节方式发送了。
页: [1]
查看完整版本: BSP视频教程第24期:应用实战,设计一款属于自己的Modbus RTU主从协议栈(2022-10-03)