准备仔细研究RAPID的语法结构,由于中断功能比较常用,故先拿它开刀。正文之前,先说个形象的说法来解释程序里处理外部I/O的方法:查询和中断。那两者有什么区别呢?话说某人得了孩子,照看婴儿,于是就用撒尿论来解释中断和查询的区别:
查询:每隔一段时间就去看看婴儿尿了没有
中断:听到婴儿大哭,应该是尿了,赶快去处理
步入正文,举个例子:
!例子: VAR intnum empty;
VAR intnum full;
…PROC main()
!连接中断程序
CONNECT empty WITH etrap;
CONNECT full WITH ftrap; !定义 feeder中断信号
ISignalDI di1, high, empty;
ISignalDI di3, high, full;
…
IDelete empty;
IDelete full;
ENDPROC!响应“feeder empty” 中断
TRAP etrap
open_valve;
RETURN;
ENDTRAP
!响应 “feeder full” 中断
TRAP ftrap
close_valve;
RETURN;
ENDTRAP
中断介绍(interrupts):
中断(interrupts)是编程定义的事件,用中断号来识别。当一个中断条件满足真(TRUE)时中断就会发生。中断发生时正常运行的程序暂停,并把控制权交给中断子程序。
即使机器人立即识别到一个中断发生(硬件速度会延迟),它的响应(调用trap子程序)只会发生在程序特定位置,即:
- 当指令被执行时
- 等待型指令执行中的任何时间,如 WaitUntil
- 运动型指令执行中的任何时间,如 MoveL
通常中断检测和响应之间有几十ms的延迟,取决于中断时何种运动被正在执行。中断可以被禁用和启用。如果中断被禁用,发生的任何中断将会被排队不被调用直到中断被再次启用。注意中断队列可以包含一个以上的等待中断。列队的中断遵循FIFO即先进先出的顺序。当一个陷阱子程序执行时中断通常是被禁用的。当步进运行时或者当程序被停止时,中断将不会被处理。这种环境下产生的中断是不被处理的。一次可被定义的中断的最大数目被限制在每个任务(task)100个。
中断处理(interrupt manipulation):
中断要定义以便机器人识别。定义指明了中断的条件并激活和启用中断。
!例子:
VAR intnum sig1int;
…
ISignalDI di1, high, sig1int;
一个激活的中断(activated interrupt)可以撤销其活动(deactivated)。在没有激活的时间里,产生的任何中断被扔掉(thrown away)不执行任何trap中断子程序。
!例子: !不激活
ISleep sig1int;
…
!激活
IWatch sig1int;
一个启用的中断(enabled interrupt)也可以使其禁止。在禁止的时段里,产生的任何中断将列队并在终端启用时再次调用。
!例子:
!禁用
IDisable sig1int;
…
!启用
IEnable sig1int;
删除一个中断就是移除它的定义。明确的说没有必要去移除一个中断定义,但是前一个定义如果不删除的话就不可以定义一个新的中断。
中断子程序(trap routines):
代码如本篇开头所写。中断子程序提供处理中断的方法。一个中断子程序和一个特定的中断可以使用CONNECT指令连接起来。当一个中断发生时,控制权立即转移到相关联的中断子程序。如果一个中断发生后,没有连接任何中断子程序,将作为一个严重错误,如:导致程序立即终止执行。
几个中断可以连接到相同的中断子程序。系统变量INTNO包含了中断号并可以被一个中断子程序用来识别某个中断。当必要的动作执行后,一个中断子程序可以使用RETURN指令来终止,或者直接执行到ENDTRAP。然后程序继续从中断发生的地方继续执行。
注:摘译自 RAPID Overview 4.0.40
扩展阅读:
中断和异常 http://blog.csdn.net/liangzhibiao/article/details/4049304
中断与异常有什么区别?http://topic.csdn.net/t/20040916/13/3378467.html