MODBUS 协议的困惑?

[复制链接]
 楼主| cahwlx1982 发表于 2007-12-6 15:51 | 显示全部楼层 |阅读模式
最近在移植modbus协议到自己的系统中,在网上下载了freemodbus协议的源代码,但有两个地方一直觉得很困惑:<br />1.关于从地址的设置问题:<br />在函数eMBErrorCode&nbsp;eMBRTUInit(&nbsp;UCHAR&nbsp;ucSlaveAddress,&nbsp;UCHAR&nbsp;ucPort,&nbsp;ULONG&nbsp;ulBaudRate,&nbsp;eMBParity&nbsp;eParity&nbsp;)中,我们看到已经代入了从地址参数"UCHAR&nbsp;ucSlaveAddress",但是函数中只是"(&nbsp;void&nbsp;)ucSlaveAddress;"一行调用了该参数,我不理解这句是什么意思,难道这样就算设置好了从设备的地址了吗?感觉怪怪的,找了很多资料都没有找到答案;<br />2.关于定时器的问题:<br />也是在这个初始化函数中,我们可以看到这样的一段代码:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;If&nbsp;baudrate&nbsp;&gt&nbsp;19200&nbsp;then&nbsp;we&nbsp;should&nbsp;use&nbsp;the&nbsp;fixed&nbsp;timer&nbsp;values<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;t35&nbsp;=&nbsp;1750us.&nbsp;Otherwise&nbsp;t35&nbsp;must&nbsp;be&nbsp;3.5&nbsp;times&nbsp;the&nbsp;character&nbsp;time.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;ulBaudRate&nbsp;&gt&nbsp;19200&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usTimerT35_50us&nbsp;=&nbsp;35;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;1800us.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;The&nbsp;timer&nbsp;reload&nbsp;value&nbsp;for&nbsp;a&nbsp;character&nbsp;is&nbsp;given&nbsp;by:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;ChTimeValue&nbsp;=&nbsp;Ticks_per_1s&nbsp;/&nbsp;(&nbsp;Baudrate&nbsp;/&nbsp;11&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;11&nbsp;*&nbsp;Ticks_per_1s&nbsp;/&nbsp;Baudrate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;220000&nbsp;/&nbsp;Baudrate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;reload&nbsp;for&nbsp;t3.5&nbsp;is&nbsp;1.5&nbsp;times&nbsp;this&nbsp;value&nbsp;and&nbsp;similary<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;for&nbsp;t3.5.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usTimerT35_50us&nbsp;=&nbsp;(&nbsp;7UL&nbsp;*&nbsp;220000UL&nbsp;)&nbsp;/&nbsp;(&nbsp;2UL&nbsp;*&nbsp;ulBaudRate&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;xMBPortTimersInit(&nbsp;(&nbsp;USHORT&nbsp;)&nbsp;usTimerT35_50us&nbsp;)&nbsp;!=&nbsp;TRUE&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eStatus&nbsp;=&nbsp;MB_EPORTERR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />其中"usTimerT35_50us"就是3.5个字节的延时时间,让我感觉困惑的是,为什么用公式usTimerT35_50us&nbsp;=&nbsp;(&nbsp;7UL&nbsp;*&nbsp;220000UL&nbsp;)&nbsp;/&nbsp;(&nbsp;2UL&nbsp;*&nbsp;ulBaudRate&nbsp;);计算??其中Ticks_per_1s&nbsp;是什么东西?是不是所有的系统这个3.5字节的延时都是这样定义的啊?<br /><br />希望用过MODBUS的朋友能帮我解释以下,没有做项目的朋友也能一同讨论一下这两个问题,非常感谢!<br /><br />
 楼主| cahwlx1982 发表于 2007-12-7 09:46 | 显示全部楼层

自己顶一下

自己顶一下,有哪位朋友能否帮个忙?
jinshan2000 发表于 2009-3-30 21:46 | 显示全部楼层

同样疑惑

我做了测试,自己用软件测试的。没有做这个延时不能成功通信吗?这是什么决定的呢?
部史蒂夫 发表于 2011-4-13 20:32 | 显示全部楼层
继续顶顶
yangjichun 发表于 2011-4-18 09:33 | 显示全部楼层
个人觉得用延时+计时中断是判断帧结束通用的方式,这种方式可靠,省去中断中的耗时,也可以用接受数据个数来判断帧结束,这种方式通讯没问题,不过觉得如果波特率很高的情况下,是否因耗时问题使得接收数据出现丢失情况
yangjichun 发表于 2011-4-18 09:35 | 显示全部楼层
持续发送多帧,那么延时+中断接收方式非常好,发送单帧,不考虑处理速度,无所谓了
yangjichun 发表于 2011-4-18 09:37 | 显示全部楼层
那个freemodbus协议,你用那个学习485通讯是不行的,找个简单的USART程序调试硬件,感觉一下。
yangjichun 发表于 2011-4-18 14:36 | 显示全部楼层
延时判断帧结束方式,可避免帧错位无法自我校正情况,用计数方式判断帧结束,一旦帧错位,这个方法就会失效。
另外,也不见得用3.5字符间隔作为帧结束条件,帧结束时间间隔满足条件,只要小于主机发送帧时间间隔-中断处理时间,大于3.5字符时间间隔,就可以了
king3306 发表于 2012-12-23 15:05 | 显示全部楼层
mark下
小花笑薇薇 发表于 2017-6-26 10:05 | 显示全部楼层
按照50us一次的tick计算的啊
新手上路了 发表于 2017-7-4 08:29 | 显示全部楼层
没看太明白,最近在用这个东西,但是我用的是ModBus-RTU
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

0

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