打印

主从机通讯时,从机应答的时序问题?

[复制链接]
2549|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
南海渔歌|  楼主 | 2011-3-18 11:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做从机,别人做主机,采用MODBUS协议。
1、主机带几台从机,我是其中的一台从机,假设编号为1机,其余从机为2机、3机。。。;
2、主机每50ms读一次某个从机的信息,比如此刻读1机,50ms后读2机,100ms后读3机,以此类推循环;
3、主机若50ms内未收到从机响应,则弃之不顾,继续读下一台从机;
4、我作为从机,接受主机信息用的是中断方式,但返回响应用的是查询,调用了一个子程序A。在主程序里运行到调用A的时候,判断是否需要执行A(就是看是否接收到了一个新帧),若是,则进入A,向主机返回数据,否则越过A执行后面的程序。
5、这样就出现了问题:整个主程序在某些情况下可能运行时间超过50ms了,那么A就不能及时执行,也就无法在50ms内及时向主机返回信息了。而主机在下一个50ms内正在与下一台从机通讯,此时我的程序才运行到A,返回数据,于是造成总线冲突。
6、我设想将A放到中断里,只要接收到主机完整的一帧,立刻就返回数据,应该可以解决问题。但A比较大,也涉及到不少运算,比如CRC校验,似乎不适合放进中断里。中断程序不是要求简短快速吗?
7、还有个难言之隐,我用的是PIC单片机,程序区与变量区都是分页的,不建议在中断里调用子程序!否则堆栈递归等问题很麻烦。
8、若换个办法,A仍放在主程序里,但要加个50ms定时器,中断接收完整一帧后立刻计时,若50ms内执行到A,则返回数据,否则不返回,等下一轮主机再来查询的时候再说?但这样似乎很笨。假如以后遇到别的主机,人家是30ms间隔轮询呢?我这个程序就不通用了。

大家是如何及时响应主机的?由于某些原因好久不搞技术了,思维都不灵活了。也许是个很简单的问题,我钻进牛角尖了?MODBUS协议也看了一下,没找出解决办法。希望大家拍砖!

相关帖子

沙发
南海渔歌|  楼主 | 2011-3-18 15:17 | 只看该作者
问题太低级了吧?怎么没人愿意回答?

使用特权

评论回复
板凳
linbei1988| | 2011-3-18 15:18 | 只看该作者
也许你可以在程序不同段加入多个判断是否调用子程序A的语句呀,保证相互间隔不到50ms....笨办法

使用特权

评论回复
地板
南海渔歌|  楼主 | 2011-3-18 15:20 | 只看该作者
嗯谢谢!刚才有人提醒我了。但我觉得应该还有更科学的方法。

使用特权

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

本版积分规则

16

主题

91

帖子

0

粉丝