请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
楼主: eric2013
收起左侧

[客户分享] 【年末福利】安富莱电子发布Modbus教程,配套STM32F103,F407,F429和H7主从机例子,含HAL和标准库两版(2022-10-03)

  [复制链接]

21

主题

47

回帖

110

积分

初级会员

积分
110
发表于 2022-8-19 15:43:14 | 显示全部楼层
版主,modbus协议有HAL版本吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2022-8-19 19:07:17 | 显示全部楼层
guoruo 发表于 2022-8-17 12:00
这的寄存器数量是不是错了

是的,有误。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2022-8-19 19:07:44 | 显示全部楼层
wxqhit 发表于 2022-8-19 15:37
eric2013,
modbus协议,V4版本的在103上已经调通了。感谢~分享的福利。
现在正在调试V5版本的在407上的 ...

近期开整modbus专题视频教程,

HAL版将上线。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2022-8-19 19:07:49 | 显示全部楼层
wxqhit 发表于 2022-8-19 15:43
版主,modbus协议有HAL版本吗?

近期开整modbus专题视频教程,

HAL版将上线。
回复

使用道具 举报

41

主题

214

回帖

337

积分

高级会员

积分
337
发表于 2022-8-19 21:51:47 | 显示全部楼层
我刚把代码改完,就上线
回复

使用道具 举报

73

主题

666

回帖

885

积分

金牌会员

积分
885
发表于 2022-9-28 00:44:19 | 显示全部楼层
硬汉大佬,打算使用modbus,简单看了下这玩意好像就是定义了一个数据格式而已,和平时自定义的协议性质差不多呀。它具有什么特别的地方吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2022-9-28 13:27:07 | 显示全部楼层
庄永 发表于 2022-9-28 00:44
硬汉大佬,打算使用modbus,简单看了下这玩意好像就是定义了一个数据格式而已,和平时自定义的协议性质差不 ...

工控用的多,协议本身实现比较方便。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2022-10-3 14:29:12 | 显示全部楼层
更新HAL库版主从机。
回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

H7 TOOL 大法好!

积分
179
发表于 2022-10-26 08:27:23 | 显示全部楼层
老师 , 啥时候能出 DLT645 和 DLT698面向对象 协议 , 这块太难懂了
回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

H7 TOOL 大法好!

积分
179
发表于 2022-10-26 08:30:08 | 显示全部楼层
老师好! 想请教一下 , 如何对Modbus 写入值做限制, 我目前是再初始化结构体时写好 某个寄存器的最大值 最小值, 但是实际应用中 , 这个范围是可变, 例如 A寄存器设置的值 不能大于 B寄存器当前的值 , 老师有没有啥好的思路?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2022-10-27 00:46:24 | 显示全部楼层
312456990 发表于 2022-10-26 08:27
老师 , 啥时候能出 DLT645 和 DLT698面向对象 协议 , 这块太难懂了

好的,我了解下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2022-10-27 00:50:18 | 显示全部楼层
312456990 发表于 2022-10-26 08:30
老师好! 想请教一下 , 如何对Modbus 写入值做限制, 我目前是再初始化结构体时写好 某个寄存器的最大值 最小 ...

意思是值写入超出范围的话,发送消息应答错误?
回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

H7 TOOL 大法好!

积分
179
发表于 2022-10-27 08:06:13 | 显示全部楼层
eric2013 发表于 2022-10-27 00:50
意思是值写入超出范围的话,发送消息应答错误?

老师是的,比如写入超限,返回错误码:06H ,异常码:03非法数值
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2022-10-27 09:38:18 | 显示全部楼层
312456990 发表于 2022-10-27 08:06
老师是的,比如写入超限,返回错误码:06H ,异常码:03非法数值

这个你的modbus里面做个解析处理就行。判断下值范围。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2022-10-28 01:23:55 | 显示全部楼层
Modbus主从机数据量较大时,解析可以做成map映射表的形式,方便修改
https://www.armbbs.cn/forum.php? ... 6190&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

H7 TOOL 大法好!

积分
179
发表于 2022-10-29 15:21:08 | 显示全部楼层
eric2013 发表于 2022-10-28 01:23
Modbus主从机数据量较大时,解析可以做成map映射表的形式,方便修改
https://www.armbbs.cn/forum.php?mod ...

有道理阿, 做个map多省事
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2022-11-2 10:02:12 | 显示全部楼层
312456990 发表于 2022-10-29 15:21
有道理阿, 做个map多省事

是的,方便管理。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2022-11-16 11:39:09 | 显示全部楼层
谢谢分享
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2022-12-2 16:16:55 | 显示全部楼层
悄悄的来,又悄悄的走了。。。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-2-20 13:58:14 | 显示全部楼层
学习一下,谢谢分享
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2023-7-1 22:57:36 | 显示全部楼层
硬汉哥,您好!我看使用无校验的时候,一个数据帧不是要11位吗?通讯标准要求有2个停止位。为什么代码里设置的是无校验,1个停止位。谢谢~~~
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2023-7-2 09:47:12 | 显示全部楼层
huangy3545 发表于 2023-7-1 22:57
硬汉哥,您好!我看使用无校验的时候,一个数据帧不是要11位吗?通讯标准要求有2个停止位。为什么代码里设 ...

楼主位分享的HAL库都已经改成标准的11bit了。

早期的标准库版,没有管这个地方,实际上跟1bit的停止位的通信也是没问题的。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2023-7-2 11:20:16 | 显示全部楼层
eric2013 发表于 2023-7-2 09:47
楼主位分享的HAL库都已经改成标准的11bit了。

早期的标准库版,没有管这个地方,实际上跟1bit的停止位 ...

谢谢硬汉哥的耐心解答~~~
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2023-10-31 09:41:56 | 显示全部楼层
请问要怎么实现每个字节通讯之间的1.5字符时间检查呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2023-10-31 12:01:26 | 显示全部楼层
BearRed 发表于 2023-10-31 09:41
请问要怎么实现每个字节通讯之间的1.5字符时间检查呢?

这个不做处理,现在数据的收发都是连续的。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-11-28 20:18:54 | 显示全部楼层
最近遇到了一个问题,不知道什么原因造成的,设备跟上位机通信,奇校验跟偶校验可以正常通讯,不知道为什么,公司也不管,能用就行
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2023-11-29 08:33:40 | 显示全部楼层
老尾 发表于 2023-11-28 20:18
最近遇到了一个问题,不知道什么原因造成的,设备跟上位机通信,奇校验跟偶校验可以正常通讯,不知道为什么 ...

奇偶校验不影响数据部分,错误的时候会有个状态寄存器错误。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-12-18 11:33:22 | 显示全部楼层
什么时候能出个modbus tcp的例程就好了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2023-12-18 13:04:50 | 显示全部楼层
来了吗 发表于 2023-12-18 11:33
什么时候能出个modbus tcp的例程就好了

好的。
回复

使用道具 举报

16

主题

66

回帖

114

积分

初级会员

积分
114
发表于 2024-1-2 11:52:29 | 显示全部楼层
硬汉哥,我看modbus这块,从机接受这块,没有用到环形队列,超时后直接处理数据了
[C] 纯文本查看 复制代码
{
		/* 从串口接收数据寄存器读取数据存放到接收FIFO */
		uint8_t ch;

		ch = READ_REG(_pUart->uart->RDR);//G0 接受寄存器 RDR  F103 DR 
		_pUart->pRxBuf[_pUart->usRxWrite] = ch;
		if (++_pUart->usRxWrite >= _pUart->usRxBufSize)
		{
			_pUart->usRxWrite = 0;
		}
		if (_pUart->usRxCount < _pUart->usRxBufSize)
		{
			_pUart->usRxCount++;
		}

		/* 回调函数,通知应用程序收到新数据,一般是发送1个消息或者设置一个标记 */
		//if (_pUart->usRxWrite == _pUart->usRxRead)
		//if (_pUart->usRxCount == 1)
		{
			if (_pUart->ReciveNew)
			{
				_pUart->ReciveNew(ch); /* 比如,交给MODBUS解码程序处理字节流 */
			}
		}
	}



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 2024-1-2 12:03:35 | 显示全部楼层
lihui163 发表于 2024-1-2 11:52
硬汉哥,我看modbus这块,从机接受这块,没有用到环形队列,超时后直接处理数据了
[mw_shl_code=c,true]{
...

对,485 modbus这个要实时处理,因为485有个超时判断和收发状态要及时切换
回复

使用道具 举报

16

主题

66

回帖

114

积分

初级会员

积分
114
发表于 2024-1-2 17:07:06 | 显示全部楼层
本帖最后由 lihui163 于 2024-1-3 08:34 编辑
eric2013 发表于 2024-1-2 12:03
对,485 modbus这个要实时处理,因为485有个超时判断和收发状态要及时切换

好的
回复

使用道具 举报

16

主题

66

回帖

114

积分

初级会员

积分
114
发表于 2024-1-3 09:09:39 | 显示全部楼层
eric2013 发表于 2024-1-2 12:03
对,485 modbus这个要实时处理,因为485有个超时判断和收发状态要及时切换

[C] 纯文本查看 复制代码
/* 处理发送缓冲区空中断 */
	if ( ((isrflags & USART_ISR_TXE_TXFNF) != RESET) && (cr1its & USART_CR1_TXFEIE) != RESET)//G0系列寄存器名字不一样
	{
		//if (_pUart->usTxRead == _pUart->usTxWrite)
		if (_pUart->usTxCount == 0)
		{
			/* 发送缓冲区的数据已取完时, 禁止发送缓冲区空中断 (注意:此时最后1个数据还未真正发送完毕)*/
			//USART_ITConfig(_pUart->uart, USART_IT_TXE, DISABLE);
			CLEAR_BIT(_pUart->uart->CR1, USART_CR1_TXEIE_TXFNFIE);//USART_CR1_TXEIE_TXFNFIE

			/* 使能数据发送完毕中断 */
			//USART_ITConfig(_pUart->uart, USART_IT_TC, ENABLE);
			SET_BIT(_pUart->uart->CR1, USART_CR1_TCIE);
		}
		else
		{
			_pUart->Sending = 1;
			
			/* 从发送FIFO取1个字节写入串口发送数据寄存器 */
			//USART_SendData(_pUart->uart, _pUart->pTxBuf[_pUart->usTxRead]);
			_pUart->uart->TDR = _pUart->pTxBuf[_pUart->usTxRead];
			if (++_pUart->usTxRead >= _pUart->usTxBufSize)
			{
				_pUart->usTxRead = 0;
			}
			_pUart->usTxCount--;
		}

	}



我现在用的G0系列的单片机,485发送函数后,一直进串口中断,但是一直进不了发送空中断,数据也发送不出去

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
 楼主| 发表于 5 天前 | 显示全部楼层
234.jpg
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 前天 17:30 | 显示全部楼层
re 很好 , 有参考意义
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 01:36 , Processed in 0.283110 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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