VAR string procname {3} := ["proc1", "proc2",
"proc3"];
...
% procname{product_id} % x, y, z;
...
下一页继续
70 技术参考手册 - RAPID语言内核
4.6 过程调用
在正常情况下,语句中的字符串表达式%<expression>%是无返回值程序名称符合范 围规则要求的字符串,但字符串也可具备指定程序位置的封闭表达前缀。
“name1:name2”指定了模块“name1”中的无返回值程序“name2"(请注意,可在该程 序中局部声明无返回值程序“name2")。“name2"指定了其中一个任务模块的全局无 返回值程序“name2",在必须从系统等级(安装内置对象)完成向下调用时,这将非 常有用。
后期绑定
请注意,后期绑定仅可用于无返回值程序调用,不可用于有返回值程序调用。
无返回值程序调用的参数表方面的一般性规则恰好与有返回值程序调用的相同。欲知 更多详情,请参见第60页的函数调用和第85页的程序声明。
描述 示例
无返回值程序调用 move t1, pos2, mv;
move tool := t1, dest := pos2, movedata := 以名称 mv;
以开关型reltool move \reltool, t1, dest, mv;
以可选型speed move \reltool, t1, dest, mv \speed := 100;
以可选型time move \reltool, t1, dest, mv \time := 20;
通常,将按常规范围规则来对无返回值程序引用求解(绑定),但后期绑定可无需按 常规范围规则。
技术参考手册 - RAPID语言内核 71
4.6 过程调用 续前页
4.7 Goto语句
定义
goto语句会导致程序在标签位置继续执行。
<goto statement> ::= GOTO <identifier> ';'
注意
goto语句不可造成受语句表控制的情况。
例如,
next:
i := i + 1;
...
GOTO next;
72 技术参考手册 - RAPID语言内核
4.7 Goto语句
4.8 Return语句
定义
return语句将终止一项程序的执行,并在合适时,指定一个返回值。一个程序可包含 任意数量的return语句。return语句可出现在语句表或程序错误处理器/回退处理器的 任意地方以及复合语句的任何层级。在任务的入口(参见第115页的任务模块)程序中 执行return语句,将终止任务的求值。在软中断(参见第114页的软中断程序)程序 中执行return语句,将从中断点重新开始执行。
<return statement> ::= RETURN [ <expression> ] ';'
限制
表达式类型必须等同于有返回值程序的类型。无返回值程序和软中断程序中的return 语句不得包含return表达式。
例如,
FUNC num abs_value (num value) IF value < 0 THEN
RETURN -value;
ELSE
RETURN value;
ENDIF ENDFUNC
PROC message ( string mess ) write printer, mess;
RETURN; ! could have been left out ENDPROC
技术参考手册 - RAPID语言内核 73
4.8 Return语句
4.9 Raise语句
定义
raise语句用于明确发出或传递错误。
<raise statement> ::= RAISE [ <error number> ] ';'
<error number> ::= <expression>
错误编号
包含明确错误编号的raise语句,将发出带该编号的错误。错误编号(参见第97页的
错误恢复)表达式必须表示为处于1至90范围内的一个整数值(参见第31页的num 型)。包含错误编号的raise语句不得出现在程序的错误处理器中。
不带错误编号的raise语句仅可出现在程序的错误处理器中,也将在传递该错误的程 序被调用时,再次发出(重新发出)同一(当前)错误。由于软中断程序仅可被系统 调用(作为对中断的响应),所以,错误将从软中断程序传递到系统错误处理器(参 见第97页的错误恢复)。
例如,
CONST errnum escape := 10;
...
RAISE escape; ! recover from this position ...
ERROR
IF ERRNO = escape THEN RETURN val2;
ENDIF ENDFUNC
74 技术参考手册 - RAPID语言内核
4.9 Raise语句
4.10 Exit语句
定义
exit语句用于立即终止任务的执行。
<exit statement> ::= EXIT ';'
不像从任务的入口程序返回,利用exit语句进行任务终止,还将禁止系统自动重启任 务的尝试。
例如,
TEST state CASE ready:
...
DEFAULT :
! illegal/unknown state - abort
write console, "Fatal error: illegal state";
EXIT;
ENDTEST
技术参考手册 - RAPID语言内核 75
4.10 Exit语句
4.11 Retry语句
定义
retry语句用于在错误发生后,重新开始执行程序,将最先执行(重新执行)引起错 误的语句。
<retry statement> ::= RETRY ';' retry语句仅可出现在程序的错误处理器。
例如,
...
! open logfile
open \append, logfile, "temp.log";
...
ERROR
IF ERRNO = ERR_FILEACC THEN
! create missing file create "temp.log";
! resume execution RETRY;
ENDIF
! propagate "unexpected" error RAISE; ENDFUNC RAISE;
ENDFUNC
76 技术参考手册 - RAPID语言内核
4.11 Retry语句
4.12 Trynext语句
定义
trynext语句用于在错误发生后,重新开始执行程序,将最先执行引起错误的语句的 后一个语句。
<trynext statement> ::= TRYNEXT ';' trynext语句仅可出现在程序的错误处理器。
例如,
...
! Remove the logfile delete logfile;
...
ERROR
IF ERRNO = ERR_FILEACC THEN
! Logfile already removed - Ignore TRYNEXT;
ENDIF
! propagate "unexpected" error RAISE;
ENDFUNC
技术参考手册 - RAPID语言内核 77
4.12 Trynext语句
4.13 Connect语句
定义
connect语句将分配中断编号,将中断编号指定给一个变量或参数(关联目标),再 将其与中断程序关联起来。当(如果)带该特定中断编号的中断随后发生时,系统将 调用被关联的中断程序来对中断做出响应。关联目标可表示为占位符<VAR>。
<connect statement> ::= CONNECT <connect target> WITH <trap> ';'
<connect target> ::=
<variable>
| <parameter>
| <VAR>
<trap> ::= <identifier>
操作前提
connect目标必须为num数据类型(或具备num的别名),必须作为(或表示)一个 模块变量(非程序变量)。如果将一个参数用作connect目标,则该参数必须为VAR 参数或INOUT/VAR参数,请参见第86页的参数声明。分配的中断编号无法“断开”,也 无法与另一个中断程序关联起来。同一关联目标不可与同一软中断程序进行不止一次 关联。这意味着,同一connect语句不可被执行一次以上,两个相同的connect语句
(关联目标相同且软中断程序相同)中,只有一个connect语句可在一次会话期间被 执行。但请注意,同一软中断程序可关联一个以上的中断编号。
例如,
VAR intnum hp;
PROC main() ...
CONNECT hp WITH high_pressure;
...
ENDPROC
TRAP high_pressure close_valve\fast;
RETURN;
ENDTRAP
78 技术参考手册 - RAPID语言内核
4.13 Connect语句
4.14 IF语句
定义
IF语句将按一个或多个条件表达式的值,对若干语句表中的一个语句表求值,或不对 任何语句表求值。
<if statement> ::=
IF <conditional expression> THEN <statement list>
{ELSEIF <conditional expression> THEN <statement list> | <EIT>
}
[ ELSE <statement list> ] ENDIF
条件表达式将连续进行求值,直至其中一个求值为真。然后,将执行相应的语句表。
如果没有任何条件表达式求值为真,那么将执行(可选)else子句。可用占位符<EIT>
来表示未定义的elseif子句。
例如,
IF counter > 100 THEN counter := 100;
ELSEIF counter < 0 THEN counter := 0;
ELSE
counter := counter + 1;
ENDIF
技术参考手册 - RAPID语言内核 79
4.14 IF语句
4.15 简洁IF语句
定义
除了一般的结构化if语句外(参见第79页的IF语句),RAPID语言还提供了一种替代 的简洁if语句。如果条件表达式求值为真,那么,简洁if语句将对简单的单个语句进行 求值。
<compact if statement> ::=
IF <conditional expression> ( <simple statement> | <SMT> ) 可用占位符<SMT>来表示未定义的简单语句。
例如,
IF ERRNO = escape1 GOTO next;
80 技术参考手册 - RAPID语言内核
4.15 简洁IF语句
4.16 For语句
定义
for语句将重复对语句表进行求值,而循环变量将在指定范围内递增(或递减)。一 个可选步骤子句能够选择增量(或减量)值。
循环变量:
• 以外观来进行声明(num型)。
• 具备语句表范围(do .. endfor)。
• 隐藏同名的其他对象。
• 是只读的,即,无法被for循环的语句更新。
<for statement> ::=
FOR <loop variable> FROM <expression>
TO <expression> [ STEP <expression> ] DO <statement list> ENDFOR
<loop variable> ::= <identifier>
最初,from表达式、to表达式和step表达式将进行求值,将保持其值。它们只求值一 次。循环变量以from值开头。如果未指定step值,则默认step值为1(值域在递减的情 况下,为-1)。
在每一(非首个)新循环前,将更新循环变量,并对照值域核实新值。只要循环变量 的值违背(超出)值域,那么将继续执行后续语句。
from表达式、to表达式和step表达式均必须为num(数字)型。
例如,
FOR i FROM 10 TO 1 STEP -1 DO a{i} := b{i};
ENDFOR
技术参考手册 - RAPID语言内核 81
4.16 For语句
4.17 While语句
定义
只要指定的条件表达式求值为真,那么,while语句将重复对语句表进行求值。
<while statement> ::=
WHILE <conditional expression> DO
<statement list> ENDWHILE
将在每一新循环前,对条件表达式进行求值和核实。只要条件表达式求值为假,那么 将继续执行后续语句。
例如,
WHILE a < b DO ...
a := a + 1;
ENDWHILE
82 技术参考手册 - RAPID语言内核
4.17 While语句
4.18 Test语句
定义
test语句将按表达式的值,对若干语句表中的一个语句表求值,或不对任何语句表求 值。
<test statement> ::=
TEST <expression>
{ CASE <test value> { ',' <test value> } ':' <statement list> )
| <CSE> }
[ DEFAULT ':'<statement list> ] ENDTEST
<test value> ::= <expression>
每一语句表前都跟有一个测试值表,指定选择特定替代项的值。test表达式可以为任 何值数据类型或半值数据类型(参见第36页的数据类型的值类型)。测试值的类型必 须等同于测试表达式的类型。执行test语句,将选择一项替代项或不选择任何替代项。
在不止一个测试值与测试表达式拟合的情况下,仅第一个测试值才会被识别。可用占 位符<CSE>来表示未定义的case子句。
如果没有case子句与表达式拟合,那么将对可选默认子句求值。
例如,
TEST choice CASE 1, 2, 3 :
pick number := choice;
CASE 4 : stand_by;
DEFAULT:
write console, "Illegal choice";
ENDTEST
技术参考手册 - RAPID语言内核 83
4.18 Test语句