wxqhit
发表于 2022-8-19 15:43:14
版主,modbus协议有HAL版本吗?
eric2013
发表于 2022-8-19 19:07:17
guoruo 发表于 2022-8-17 12:00
这的寄存器数量是不是错了
是的,有误。
eric2013
发表于 2022-8-19 19:07:44
wxqhit 发表于 2022-8-19 15:37
eric2013,
modbus协议,V4版本的在103上已经调通了。感谢~分享的福利。
现在正在调试V5版本的在407上的 ...
近期开整modbus专题视频教程,
HAL版将上线。
eric2013
发表于 2022-8-19 19:07:49
wxqhit 发表于 2022-8-19 15:43
版主,modbus协议有HAL版本吗?
近期开整modbus专题视频教程,
HAL版将上线。
snakeemail
发表于 2022-8-19 21:51:47
我刚把代码改完,就上线:'(
庄永
发表于 2022-9-28 00:44:19
硬汉大佬,打算使用modbus,简单看了下这玩意好像就是定义了一个数据格式而已,和平时自定义的协议性质差不多呀。它具有什么特别的地方吗?
eric2013
发表于 2022-9-28 13:27:07
庄永 发表于 2022-9-28 00:44
硬汉大佬,打算使用modbus,简单看了下这玩意好像就是定义了一个数据格式而已,和平时自定义的协议性质差不 ...
工控用的多,协议本身实现比较方便。
eric2013
发表于 2022-10-3 14:29:12
更新HAL库版主从机。
312456990
发表于 2022-10-26 08:27:23
老师 , 啥时候能出 DLT645 和 DLT698面向对象 协议 , 这块太难懂了
312456990
发表于 2022-10-26 08:30:08
老师好! 想请教一下 , 如何对Modbus 写入值做限制, 我目前是再初始化结构体时写好 某个寄存器的最大值 最小值, 但是实际应用中 , 这个范围是可变, 例如 A寄存器设置的值 不能大于 B寄存器当前的值 , 老师有没有啥好的思路?
eric2013
发表于 2022-10-27 00:46:24
312456990 发表于 2022-10-26 08:27
老师 , 啥时候能出 DLT645 和 DLT698面向对象 协议 , 这块太难懂了
好的,我了解下。
eric2013
发表于 2022-10-27 00:50:18
312456990 发表于 2022-10-26 08:30
老师好! 想请教一下 , 如何对Modbus 写入值做限制, 我目前是再初始化结构体时写好 某个寄存器的最大值 最小 ...
意思是值写入超出范围的话,发送消息应答错误?
312456990
发表于 2022-10-27 08:06:13
eric2013 发表于 2022-10-27 00:50
意思是值写入超出范围的话,发送消息应答错误?
老师是的,比如写入超限,返回错误码:06H ,异常码:03非法数值
eric2013
发表于 2022-10-27 09:38:18
312456990 发表于 2022-10-27 08:06
老师是的,比如写入超限,返回错误码:06H ,异常码:03非法数值
这个你的modbus里面做个解析处理就行。判断下值范围。
eric2013
发表于 2022-10-28 01:23:55
Modbus主从机数据量较大时,解析可以做成map映射表的形式,方便修改
https://www.armbbs.cn/forum.php?mod=viewthread&tid=116190&fromuid=58
(出处: 硬汉嵌入式论坛)
312456990
发表于 2022-10-29 15:21:08
eric2013 发表于 2022-10-28 01:23
Modbus主从机数据量较大时,解析可以做成map映射表的形式,方便修改
https://www.armbbs.cn/forum.php?mod ...
有道理阿, 做个map多省事
eric2013
发表于 2022-11-2 10:02:12
312456990 发表于 2022-10-29 15:21
有道理阿, 做个map多省事
是的,方便管理。
月华流照
发表于 2022-11-16 11:39:09
谢谢分享:D
小象
发表于 2022-12-2 16:16:55
悄悄的来,又悄悄的走了。。。
考拉
发表于 2023-2-20 13:58:14
学习一下,谢谢分享
huangy3545
发表于 2023-7-1 22:57:36
硬汉哥,您好!我看使用无校验的时候,一个数据帧不是要11位吗?通讯标准要求有2个停止位。为什么代码里设置的是无校验,1个停止位。谢谢~~~
eric2013
发表于 2023-7-2 09:47:12
huangy3545 发表于 2023-7-1 22:57
硬汉哥,您好!我看使用无校验的时候,一个数据帧不是要11位吗?通讯标准要求有2个停止位。为什么代码里设 ...
楼主位分享的HAL库都已经改成标准的11bit了。
早期的标准库版,没有管这个地方,实际上跟1bit的停止位的通信也是没问题的。
huangy3545
发表于 2023-7-2 11:20:16
eric2013 发表于 2023-7-2 09:47
楼主位分享的HAL库都已经改成标准的11bit了。
早期的标准库版,没有管这个地方,实际上跟1bit的停止位 ...
谢谢硬汉哥的耐心解答~~~:lol
BearRed
发表于 2023-10-31 09:41:56
请问要怎么实现每个字节通讯之间的1.5字符时间检查呢?
eric2013
发表于 2023-10-31 12:01:26
BearRed 发表于 2023-10-31 09:41
请问要怎么实现每个字节通讯之间的1.5字符时间检查呢?
这个不做处理,现在数据的收发都是连续的。
老尾
发表于 2023-11-28 20:18:54
最近遇到了一个问题,不知道什么原因造成的,设备跟上位机通信,奇校验跟偶校验可以正常通讯,不知道为什么,公司也不管,能用就行
eric2013
发表于 2023-11-29 08:33:40
老尾 发表于 2023-11-28 20:18
最近遇到了一个问题,不知道什么原因造成的,设备跟上位机通信,奇校验跟偶校验可以正常通讯,不知道为什么 ...
奇偶校验不影响数据部分,错误的时候会有个状态寄存器错误。
来了吗
发表于 2023-12-18 11:33:22
什么时候能出个modbus tcp的例程就好了
eric2013
发表于 2023-12-18 13:04:50
来了吗 发表于 2023-12-18 11:33
什么时候能出个modbus tcp的例程就好了
好的。
lihui163
发表于 2024-1-2 11:52:29
硬汉哥,我看modbus这块,从机接受这块,没有用到环形队列,超时后直接处理数据了
{
/* 从串口接收数据寄存器读取数据存放到接收FIFO */
uint8_t ch;
ch = READ_REG(_pUart->uart->RDR);//G0 接受寄存器 RDRF103 DR
_pUart->pRxBuf = 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解码程序处理字节流 */
}
}
}
eric2013
发表于 2024-1-2 12:03:35
lihui163 发表于 2024-1-2 11:52
硬汉哥,我看modbus这块,从机接受这块,没有用到环形队列,超时后直接处理数据了
{
...
对,485 modbus这个要实时处理,因为485有个超时判断和收发状态要及时切换
lihui163
发表于 2024-1-2 17:07:06
本帖最后由 lihui163 于 2024-1-3 08:34 编辑
eric2013 发表于 2024-1-2 12:03
对,485 modbus这个要实时处理,因为485有个超时判断和收发状态要及时切换
好的
lihui163
发表于 2024-1-3 09:09:39
eric2013 发表于 2024-1-2 12:03
对,485 modbus这个要实时处理,因为485有个超时判断和收发状态要及时切换
/* 处理发送缓冲区空中断 */
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->uart->TDR = _pUart->pTxBuf;
if (++_pUart->usTxRead >= _pUart->usTxBufSize)
{
_pUart->usTxRead = 0;
}
_pUart->usTxCount--;
}
}
我现在用的G0系列的单片机,485发送函数后,一直进串口中断,但是一直进不了发送空中断,数据也发送不出去
eric2013
发表于 2024-3-24 11:16:52
lovemydog2
发表于 2024-3-27 17:30:05
re 很好 , 有参考意义
eric2013
发表于 2024-4-30 17:01:39
V7的Modbus从机例子测试,确定没问题,备份个截图
lyglary
发表于 2024-5-20 13:41:00
谢谢大侠,这个要顶一个