打印

通讯时从机如何及时应答?

[复制链接]
4337|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
南海渔歌|  楼主 | 2011-3-18 12:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做从机,别人做主机,采用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协议也看了一下,没找出解决办法。希望大家拍砖!

相关帖子

沙发
FreedomFighter| | 2011-3-18 14:01 | 只看该作者
本帖最后由 FreedomFighter 于 2011-3-18 14:03 编辑

第一种方法,重写所有功能模块,保证每个模块执行时间限制在50mS之内,我自己一般限制在10mS之内。这些模块在主程序中循环调用即可。
第二种方法,原来程序基本不动,在执行时间长的模块中,增加几个查询点,保证50mS查询一次

第一种常用,第二种不是好方法

使用特权

评论回复
板凳
南海渔歌|  楼主 | 2011-3-18 15:11 | 只看该作者
谢谢!我程序里有写EEPROM的情况(偶尔,用户修改从机里的参数后才有这个操作),需要200ms左右,这期间要禁止一切中断,包括通讯。若遇到这种情况,你的第一种方法就不好办了。
第二种方法,我干脆在主程序的不同地方多放几个子程序A,应该能保证50mS内肯定能至少执行一次A。但若有写EEPROM时还是不行,因为这个地方不能放A,需要连续执行EEPROM写操作。我设想还是得弄个定时器,接受完一帧后超过50ms就不再返回信息了。

实际上是把你的第二种方法与主帖里的第8条结合起来的办法。

使用特权

评论回复
地板
xuyaqi| | 2011-3-18 17:01 | 只看该作者
不知楼主用的什么总线,如何防止从机同时发送信息。

使用特权

评论回复
5
chunyang| | 2011-3-18 18:02 | 只看该作者
合理的编程不要使用串口查询,全部使用中断,但中断程序中不要执行功能性代码,仅仅设置标志位即可,主循环根据标志位散转调用相应的判断及处理子程序,楼主应该去看看软件工程方面的书籍,一个良好的编程思想非常重要。

使用特权

评论回复
6
FreedomFighter| | 2011-3-18 20:26 | 只看该作者
楼主用什么样的EEPROM需要200ms左右连续执行写操作? 应该是这个写入程序不合理。
请问EEPROM型号?

使用特权

评论回复
7
李冬发| | 2011-3-18 23:50 | 只看该作者
就停个200ms不传数又能到什么程度呢?
难道修改设置时你还非要传数据?

使用特权

评论回复
8
南海渔歌|  楼主 | 2011-3-18 23:51 | 只看该作者
4楼,总线是485。
5楼,我不明所以。我的接收信息是用中断,完整接收完一桢后会在中断里有个标志位b.主循环中,检查到b为真,则执行发送响应操作。问题是,只有当在主循环里执行到子程序A时,才会检查标志位b。主循环的其余时间,是要执行其它的功能子程序。现在的焦点是,当执行其它子程序时,即使中断里的b已经为真了,却仍然不能马上检查到。检查不到b,自然就不能及时返回响应。
6楼,是MCU里自带的EEPROM。由于需要写入的参数很多,因此时间较长。当然只有当参数被主机或操作者修改后,才会引起写入动作。

我感觉我的编程思想有问题,可一时又想不出更好的办法来。

使用特权

评论回复
9
y1234567| | 2011-3-19 00:14 | 只看该作者
如果发送反馈信号,不是软件模拟的,在写eeprom的200ms内也可发送数据.记得写完一帧EEprom数据后,还要延时一段时间,才能写下一帧。

使用特权

评论回复
10
chunyang| | 2011-3-19 02:57 | 只看该作者
多字节通讯时,中断程序除了设置标志之外,往公共缓冲区内压入数据即可,关键还是软件结构,EEPROM的操作和通讯完全可以并发处理。EEPROM的写操作需要时间,但写完了就可以直接进行下一次的操作,写入等待时间不要干延时,完全可以进行其它操作,特别是对实时通讯系统必须这么处理,否则可能导致数据丢失。

使用特权

评论回复
11
joyme| | 2011-3-19 10:18 | 只看该作者
如果EEPROM写操作会屏蔽中断的话,应该不会在这中间接到需要你发送信息的帧才对,而

使用特权

评论回复
12
joyme| | 2011-3-19 10:27 | 只看该作者
其他小于50ms的功能模块不会影响你及时发送数据吧,或者在大于50ms的功能模块起始时检测你中断置起的标志,如果没有置起而在模块执行完就发现置起了此标志则忽略此次数据发送,等下一次上位机的查询。

我也准备做这样一个系统,我想在485总线上加一天线来做总线仲裁,任意从机发送数据前要判断此总线,如果是空闲的才开始发送数据,如果总线被拉低则表明有其他从机在发送数据,发送操作将延迟发送。此总线平时上拉高表示总线空闲,一旦任何从机发送数据需先判断此总线,如为高,则拉低总线后开始发送,发送完毕后释放总线。这样的硬件仲裁我认为可以很好的防止485从机发送冲突问题

使用特权

评论回复
13
FreedomFighter| | 2011-3-19 12:50 | 只看该作者
本帖最后由 FreedomFighter 于 2011-3-19 12:51 编辑

综合楼主的系统情况,修改eeprom写入程序最好,主程序中放好数据、指针、长度,启动第一个字节写入,主程序就返回了,执行时间极短。后续字节由中断服务程序自动写入,长度=0时结束写入。

如果通讯周期>250mS,退而求其次,简单修改于下:
程序收到写eeprom命令时设一个标志WriteEepromFlag,不要立即写入。
主程序优先查询通讯缓冲区,需要应答立即应答,不能延时应答。
应答完成后立即判断WriteEepromFlag,有效立即启动写入,即使要用200mS也无关,只要通讯周期够长即可。

使用特权

评论回复
14
xuyaqi| | 2011-3-20 11:14 | 只看该作者
如果楼主用的是485总线那就犯了一个极大错误,485总线要求在一个时间段总线只允许一个发其余全是收否则谁都发不了,这个功能只能由主机调度让谁发谁再发,而不能由从机自作主张。

使用特权

评论回复
15
chunyang| | 2011-3-20 11:30 | 只看该作者
不能这么说,485网络目前还是用的很多的,特别是在工业领域,短距高速通讯则用以太网,长距高速的话,可以考虑采用类似数字有线电视的技术甚至光纤,但成本会大幅上升,满足需要就好,合适的技术才是好技术。

使用特权

评论回复
16
xuyaqi| | 2011-3-20 11:57 | 只看该作者
可能楼上误解了我的意思,我不是说用485总线错了,而是说用485总线而让从机自作主张错了。

使用特权

评论回复
17
chunyang| | 2011-3-20 14:13 | 只看该作者
485总线确实应该运行一主多从轮询式协议,个别情况下可以采用突发请求式辅助协议作为补充,但从机的突发请求信息要尽可能的短,采用侦听——请求——等待主机查询的流程,主机轮询时优先查询突发请求的节点。对于特殊应用,可以运行令牌式一主多从协议,令牌持有者作为临时主机,但这样的协议编制非常讲究,工艺难度是比较高的。

使用特权

评论回复
18
xmdongd8899| | 2011-3-20 14:18 | 只看该作者

RE: 通讯时从机如何及时应答?

5# chunyang


而且不调用函数

使用特权

评论回复
19
xmdongd8899| | 2011-3-20 14:19 | 只看该作者
中断法和查询法两种,一般用中断法的较多,还有两种兼用,看资源和资源分配来定

使用特权

评论回复
20
xmdongd8899| | 2011-3-21 02:11 | 只看该作者
楼主,要说的的你的MODUBS还有个问题要提醒你的那就是MODBUS的CRC16校验码问题,千万记住以空间换时间

使用特权

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

本版积分规则

16

主题

91

帖子

0

粉丝