为何中断程序偶尔会产生错误的结果?

n

问题描述:

如果中断程序偶尔输出错误结果,原因通常在于中断程序和主程序之间的数据交换。由于两部分程序之间不同步,建议要特别注意两者之间的数据交换过程。如果中断程序在一个断点访问主程序的变量,这种情况在任何时间都可能发生,被访问的变量在主程序中不仅用于“传输参数(transfer parameter)”而且还有其它用途,例如用于保存中间结果,则中断程序偶尔就会获取不正确的数据。该变量在程序中被赋予“错误”数据的时间越长,该数据被中断程序获取的概率就越大。同样的情况也适用于相反方向即从中断程序到主程序的数据交换过程。n

这种对变量进行多重赋值的情况可以在 STL 编程中发现。n

一些 LAD/FBD 操作指令代表了多个 STL 指令组成的一个序列。在 LAD/FBD 显示模式下,不能看出指令的输出变量是否作为临时运算中间结果的存储单元使用。n

举例:n

为何中断程序偶尔会产生错误的结果?
图 1

如果中断程序在 MOVR 和 *R 之间访问 VD524,则中断程序会使用未乘过的值操作。n

解决方法:

您可以使用一系列的技巧,以避免主程序和中断程序共享数据时发生错误。这些技巧将限制访问共享数据,或者在访问共享数据时禁止中断。n

  • 在共享单个变量的 STL 程序中:
    如果共享的变量是单个的字节、字或者双字,并且您的程序用 STL 编写,则运算的中间结果必须保存在不共享的变量存储区或者累加器中。n

  • 在共享单个变量的 LAD 程序中:
    如果共享的变量是单个的字节、字或者双字,并且您的程序用 LAD 编写,则运指算令可能包括多个 STL 语句,如 "MUR_R" ,这个变量必须首先被缓冲在非共享变量保存区中(例如图2 中的 VD2000)。使用不能被中断的传送指令 "MOVB","MOVW","MOVD" 和 "MOVR",将被缓冲的数据值赋给共享数据。

    举例:

    中断程序读取 VD524。当中断在 "MUL_R" 操作的 *R 和 MOVR 指令之间发生,它访问的只是上一个周期的有效的 VD524。这可以保证中断程序使用有效值工作。
    附加的变量 VD2000 只是用来缓冲数据,它也可以用临时变量代替。

    为何中断程序偶尔会产生错误的结果?
    图 2


    在共享多个变量的 STL 或 LAD 程序中:

    如果共享数据包括多个连续的字节、字和双字,中断程序的处执行可以用 “禁止全局中断 (DISI)”和“允许全局中断(ENI)”指令控制。在主程序中访问共享变量之前,必须先禁止中断事件。执行完相关操作后, 必须再允许中断事件。在中断事件被禁止期间,将不能执行中断程序并访问共享数据区。这种编程技巧当然会延迟中断事件的响应。

注意事项:
更多关于该主题的信息请参考 STEP7 Micro/WIN 在线帮助“Interrupt Routines / Creating Interrupt Routines”索引项下的内容,以及 S7-200 系统手册第 6 章“S7-200 Instruction Set”中“Interrupt Instructions”一节的内容(条目号 1109582)。

关键词:
编程提示、程序中断

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc337474.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月5日 下午12:03
下一篇 2021年4月12日 上午12:00

相关推荐

发表回复

登录后才能评论