1 基本RAPID编程
1.1.5 程序
1.1.5 程序
简介
程序(子程序)分为无返回值程序、有返回值程序和软中断程序这三类。 ? 无返回值程序不会返回数值。该程序用于指令中。
? 有返回值程序会返回一个特定类型的数值。该程序用于表达式中。
? 软中断程序提供了一种中断应对方式。一个软中断程序只对应一次特定中断。 一旦发生中断,则将自动执行对应软中断程序。但不能从程序中直接调用软中 断程序。
程序的范围
程序的范围是指可获得程序的区域。除非程序声明的可选局部命令将程序归为局部程 序(在模块内),不然则为全局程序。 例子:
LOCAL PROC local_routine (... PROC global_routine (...
程序适用的范围规则如下:
? 全局程序的范围可能包括任务中的任意模块; ? 局部程序的范围由其所处模块构成;
? 在范围内,局部程序会隐藏名称相同的所有全局程序或数据;
? 在范围内,程序会隐藏名称相同的所有指令、预定义程序和预定义数据。
xx1100000551
以上示例中,可从程序h中调用下述程序: ? 模块1:程序c和d; ? 模块2:所有程序。
同一模块中,某一程序的名称与另一程序、数据或数据类型的名称不一定相同。全局 程序的名称与对应模块或另一模块中的全局程序、全局数据或全局数据类型的名称不 一定相同。
参数
程序声明中的参数列表明确规定了调用程序时必须或能提供的参数(实参)。
下一页继续
技术参考手册 - RAPID语言概览
3HAC050947-010 修订: B
? 版权所有 2004-2015 ABB。保留所有权利。
21
1 基本RAPID编程
1.1.5 程序 续前页
参数包括四种(按访问模式区分):
? 正常情况下,参数仅用作输入,同时被视作程序变量。改变此变量,不会改变 对应参数; ? INOUT参数规定,对应参数必须为变量(整体、元素或部分)或对应参数必须 为可为程序所改变的完整的永久数据对象; ? VAR参数规定,对应参数必须为可为程序所改变的变量(整体、元素或部分); ? PERS参数规定,对应参数必须为可为程序所改变的完整的永久数据对象。 更新INOUT、VAR或PERS参数事实上就等同于更新了参数本身,借此可用参数将多个 数值返回到调用程序。 例子:
PROC routine1 (num in_par, INOUT num inout_par, VAR num var_par, PERS num pers_par)
此类参数是可选的,在程序调用的参数列表中可忽略。可选参数用反斜线(\\)+参数 表示。 例子:
PROC routine2 (num required_par \\num optional_par)
不可引用程序调用时会忽略的可选参数值,也就是说,在使用可选参数前,必须要检 查程序调用的可选参数。
两个或多个可选参数之间可能会互相排斥(声明互相排斥),也就是说同一程序调用 中只可能出现其中一个。这一情况通过在存疑参数之间加竖线(|)表明。 例子:
PROC routine3 (\\num exclude1 | num exclude2)
特殊类型switch可能(只能)属于可选参数,提供了一种运用转换参数(只能通过名 称—而非数值—确定)的方式。数值不能转为switch参数。要运用switch参数的唯 一方式就是运用预定义函数Present检查其存在。 例子:
PROC routine4 (\\switch on | switch off) ...
IF Present (off ) THEN ...
ENDPROC
数组可能会以参数的形式通过。数组参数的范围必须与相应形参的范围相符。数组参 数的阶数一致(带*标记)。因此实际阶数取决于程序调用中相应参数的阶数。程序借 用预定义函数 Dim可确定参数的实际阶数。 例子:
PROC routine5 (VAR num pallet{*,*})
程序终止
通过RETURN指令明确无返回值程序执行终止,或在到达无返回值程序末端(ENDPROC、 BACKWARD、ERROR或UNDO)时,即暗示执行终止。 有返回值程序求值必须通过RETURN指令终止。
运用RETURN指令明确软中断程序执行终止,或在到达软中断程序末端(ENDTRAP、 ERROR或UNDO)时,即暗示执行终止。下次会从中断点处开始继续执行。
下一页继续
22
? 版权所有 2004-2015 ABB。保留所有权利。
技术参考手册 - RAPID语言概览
3HAC050947-010 修订: B
1 基本RAPID编程
1.1.5 程序
续前页
程序声明
程序包含程序声明(包括参数)、数据、正文主体、反向处理器(仅限无返回值程 序)、错误处理器和撤销处理器。不能套入程序声明,也就是说,不能在程序中声明 程序。
xx1100000553
无返回值程序声明
如,用数值数组中的各元素乘以:
PROC arrmul( VAR num array{*}, num factor) FOR index FROM 1 TO dim( array, 1 ) DO array{index} := array{index} * factor; ENDFOR ENDPROC
有返回值程序声明
有返回值程序可返回任意数据类型的数值,但不能返回数组数值。 如,可返回矢量长度。
FUNC num veclen (pos vector)
RETURN Sqrt(Pow(vector.x,2)+Pow(vector.y,2)+Pow(vector.z,2)); ENDFUNC
软中断声明
如,对“给料机空载”所致中断的反应:
TRAP feeder_empty wait_feeder; RETURN; ENDTRAP
过程调用
调用一个过程时,应使用与该过程的参数对应的参数: ? 必须明确强制性参数,同时还须按正确顺序列出. ? 可选参数可忽略.
? 可用条件式参数,将参数从一个程序调用转到另一程序调用。 请参阅 第39页的运用表达式中的函数调用。
下一页继续
技术参考手册 - RAPID语言概览
3HAC050947-010 修订: B
? 版权所有 2004-2015 ABB。保留所有权利。
23
1 基本RAPID编程
1.1.5 程序 续前页
可用标识符(前期绑定)以静态方式指定过程名称或在串类型表达式运行时间内(后 期绑定)求得程序名称的值。前期绑定应被视作正常的过程调用形式,但有时后期绑 定却能提供极有效的紧凑编码。通过在代表过程名称的字符串前后添加百分比符号, 定义后期绑定。 例子:
! early binding TEST products_id CASE 1:
proc1 x, y, z; CASE 2:
proc2 x, y, z; CASE 3: ...
! same example using late binding
% “proc” + NumToStr(product_id, 0) % x, y, z; ...
! same example again using another variant of late binding VAR string procname {3} :=[“proc1”, “proc2”, “proc3”]; ...
% procname{product_id} % x, y, z; ...
注意后期绑定仅适用于过程调用,不适合函数调用。若要用后期绑定引用一个未知过 程,则将系统变量ERRNO设为ERR_REFUNKPRC;若要引用过程调用错误(语法,而 非过程),则将系统变量ERRNO设为ERR_CALLPROC。
语法 程序声明
[LOCAL] (
参数
'\\' (
下一页继续
24
? 版权所有 2004-2015 ABB。保留所有权利。
技术参考手册 - RAPID语言概览
3HAC050947-010 修订: B
1 基本RAPID编程
1.1.5 程序
续前页
[ VAR | PERS | INOUT]
无返回值程序声明
[ BACKWARD
::= {}
有返回值程序声明
[ ERROR
软中断程序声明
::= TRAP
[ ERROR
::=
过程调用
| '%'
下一页继续
技术参考手册 - RAPID语言概览
3HAC050947-010 修订: B
? 版权所有 2004-2015 ABB。保留所有权利。
25