请教:单片机跑飞后,怎样能从开始跑飞前的指令位置执...
和别人讨论时,遇到一个问题:看门狗可以解决单片机跑飞的问题,它是让单片机复位来解决的。但有些特殊的场合,操作过程是不允许重新再来一遍的,只能接着原来的操作往下进行,例如,假设一个机床正在切削加工一个东西,此时单片机跑飞了,如果通过看门狗使其复位,程序又会从开始运行,已经加工过的部分可能会被重复加工,所以单片机应该是能记下程序开始跑飞的位置,接着原来的操作进行。但这怎么实现呢,请高手指点。 每完成一个步骤把指令更新到flash里面,重启后先看flash里面的状态 一般都是可以判断动作到了哪里的,楼主这种是不能判断到 保存在非初始化区域,系统启动的时候判断是上电启动还是看门狗复位。 随机的吧,
即使记下PC的位置,数据储存器内容也有可能改变了。 只有一种可能,楼主你知道你的程序要跑飞了,就记住这个位置{:lol:}{:lol:} 跑飞的话,做不到完美效果的。
就算你保存当前指令执行的条数记录。那么,在某一条指令执行的过程中跑飞的话,机器会停下来。但是你记录的是这条指令已经执行完成或者未完成。
你复位后只能有2种选择,就是要么重新执行这条指令,要么接着执行。总是做不到很完美的。
如果是机床切削这种,记录指令条数可能还不错,因为是做减法。重新切削一次,并不会增加或者减少什么; 思路错了吧,看门狗是一种补救措施,不允许重新来的话,应该是想办法防止复位 防止程序跑飞啊。 那就做稳定,不允许跑飞。
PLC你什么时候见死机重启? 赞同7楼的观点。 yu_studio 发表于 2016-4-1 18:29
那就做稳定,不允许跑飞。
PLC你什么时候见死机重启?
plc也有看门狗,也可以重启,要求高的话可以双机热备份 能回到跑飞的那个那个位置继续往下执行,那就不叫跑飞,那是调用了子程序或执行中断去了。{:titter:} rainbow 发表于 2016-4-1 20:49
能回到跑飞的那个那个位置继续往下执行,那就不叫跑飞,那是调用了子程序或执行中断去了。 ...
不知道可不可以这样,将当前动作做个反馈与当前指令做对比,
如果反馈结果与指令不符,则停机并记录,退回上一条指令待机~ 开机判断是否是看门狗复位重启,如果是看门狗复位则不初始化数据,否则初始化数据。 就是是双机备份运行了,上面有人说了 kafeiwutang 发表于 2016-4-1 20:28
plc也有看门狗,也可以重启,要求高的话可以双机热备份
双机冗余主要是为了防止一台出现故障,另一台可以马上启用运行。
总之,成熟的PLC的设计是非常稳定的,我使用PLC十几年了,从未见过PLC死机或重启。
另外,PLC是决不允许自动重启的,如果PLC真的死机或程序跑飞,就停在那儿,等待人是处理。对于有些设备来说,如果突然重启,会造成巨大危险或不可估量的损失。 三机并行运算,结果由表决确定 把电源做好,抗干扰做好,程序优化好,选好的工业级的芯片,在恶劣的工况下多测试.....终于你发现不会跑飞 .titrwh 发表于 2016-4-1 16:16
每完成一个步骤把指令更新到flash里面,重启后先看flash里面的状态
但是要是在某个步骤开始过程中间跑飞,即使从FLASH中可以判断出该步骤未完成,但也很难接着继续完成,还有,RAM中有些数据可能已经发生变化了 不讓程式跑飛才是王道!!
雖然有些時候很難做到... 这个问题。95年我们针对80C31+32kEPROM+32kRAM做过设计,每一个功能(入口设置一个ID号,然后保存MCU当前的寄存器值),上电后根据ID号跳转。。。。。。异常复杂。但最终无法做到完美接力运行。 mon51 发表于 2016-4-21 11:16
这个问题。95年我们针对80C31+32kEPROM+32kRAM做过设计,每一个功能(入口设置一个ID号,然后保存MCU当前的 ...
是个解决方案,离目标更近了 hnzbding 发表于 2016-6-7 21:08
是个解决方案,离目标更近了
你无法保证MCU死机时RAM里的数据未被干扰破坏。 RAM的数据不好控制的,如果MCU跑飞的话。 是啊!程序是无法知道自己干的对不对的!就如同小孩子不明白大人为什么要训斥他一样! 单机是没办法做到完美复位运行的,就像楼上说的双机备份或三机表决 内存要搞一片非初始化区,保存各种中间参数, 上电后通过检查,调出这部分参数接着跑。 只能让他不跑飞,看门狗不能保证100%正确继续执行的
页:
[1]