打印

MODBUS 协议的困惑?

[复制链接]
4930|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cahwlx1982|  楼主 | 2007-12-6 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在移植modbus协议到自己的系统中,在网上下载了freemodbus协议的源代码,但有两个地方一直觉得很困惑:
1.关于从地址的设置问题:
在函数eMBErrorCode eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity )中,我们看到已经代入了从地址参数"UCHAR ucSlaveAddress",但是函数中只是"( void )ucSlaveAddress;"一行调用了该参数,我不理解这句是什么意思,难道这样就算设置好了从设备的地址了吗?感觉怪怪的,找了很多资料都没有找到答案;
2.关于定时器的问题:
也是在这个初始化函数中,我们可以看到这样的一段代码:
        /* If baudrate > 19200 then we should use the fixed timer values
         * t35 = 1750us. Otherwise t35 must be 3.5 times the character time.
         */
        if( ulBaudRate > 19200 )
        {
            usTimerT35_50us = 35;       /* 1800us. */
        }
        else
        {
            /* The timer reload value for a character is given by:
             *
             * ChTimeValue = Ticks_per_1s / ( Baudrate / 11 )
             *             = 11 * Ticks_per_1s / Baudrate
             *             = 220000 / Baudrate
             * The reload for t3.5 is 1.5 times this value and similary
             * for t3.5.
             */
            usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate );
        }
        if( xMBPortTimersInit( ( USHORT ) usTimerT35_50us ) != TRUE )
        {
            eStatus = MB_EPORTERR;
        }
其中"usTimerT35_50us"就是3.5个字节的延时时间,让我感觉困惑的是,为什么用公式usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate );计算??其中Ticks_per_1s 是什么东西?是不是所有的系统这个3.5字节的延时都是这样定义的啊?

希望用过MODBUS的朋友能帮我解释以下,没有做项目的朋友也能一同讨论一下这两个问题,非常感谢!

相关帖子

沙发
cahwlx1982|  楼主 | 2007-12-7 09:46 | 只看该作者

自己顶一下

自己顶一下,有哪位朋友能否帮个忙?

使用特权

评论回复
板凳
jinshan2000| | 2009-3-30 21:46 | 只看该作者

同样疑惑

我做了测试,自己用软件测试的。没有做这个延时不能成功通信吗?这是什么决定的呢?

使用特权

评论回复
地板
部史蒂夫| | 2011-4-13 20:32 | 只看该作者
继续顶顶

使用特权

评论回复
5
yangjichun| | 2011-4-18 09:33 | 只看该作者
个人觉得用延时+计时中断是判断帧结束通用的方式,这种方式可靠,省去中断中的耗时,也可以用接受数据个数来判断帧结束,这种方式通讯没问题,不过觉得如果波特率很高的情况下,是否因耗时问题使得接收数据出现丢失情况

使用特权

评论回复
6
yangjichun| | 2011-4-18 09:35 | 只看该作者
持续发送多帧,那么延时+中断接收方式非常好,发送单帧,不考虑处理速度,无所谓了

使用特权

评论回复
7
yangjichun| | 2011-4-18 09:37 | 只看该作者
那个freemodbus协议,你用那个学习485通讯是不行的,找个简单的USART程序调试硬件,感觉一下。

使用特权

评论回复
8
yangjichun| | 2011-4-18 14:36 | 只看该作者
延时判断帧结束方式,可避免帧错位无法自我校正情况,用计数方式判断帧结束,一旦帧错位,这个方法就会失效。
另外,也不见得用3.5字符间隔作为帧结束条件,帧结束时间间隔满足条件,只要小于主机发送帧时间间隔-中断处理时间,大于3.5字符时间间隔,就可以了

使用特权

评论回复
9
king3306| | 2012-12-23 15:05 | 只看该作者
mark下

使用特权

评论回复
10
小花笑薇薇| | 2017-6-26 10:05 | 只看该作者
按照50us一次的tick计算的啊

使用特权

评论回复
11
新手上路了| | 2017-7-4 08:29 | 只看该作者
没看太明白,最近在用这个东西,但是我用的是ModBus-RTU

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

0

粉丝