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

谢谢大侠,这个要顶一个
页: 1 2 3 4 [5]
查看完整版本: 【年末福利】安富莱电子发布Modbus教程,配套STM32F103,F407,F429和H7主从机例子,含HAL和标准库两版(2022-10-03)