我做从机,别人做主机,采用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协议也看了一下,没找出解决办法。希望大家拍砖! |