WITNESS程序
WITNESS变量类型
witness提供了四种类型的变量,用来进行数据处理。它们是整型、实型、名型、字符型。
整型(integer)
整型变量用来存储不包含小数点部分的数字。在witness中,可以是-2147483648到+2147483647之间的整数。
使用整数变量能够比较精确的存储数据,并且处理速度比比实数要快。但是由于整数的“循环”性,可能会使得它们过大或过小。例如:
2147483647+1=-2147483648
-2147483647-2=2147483647
实型(real)
实型变量可以存储由数字(0~9)、小数点和正负号组成的数据。范围为(3.4E-38,3.4E38);
名型(name)
名型(name)变量用来存储witness仿真系统组成元素的名称。例如:
widget
miller(3)
注:函数、数值型变量、数值型属性不能够存储为名型数据。
字符型(string)
字符型变量用来存储不具有计算能力的字符型数据。字符型数据是由汉字和ASCII字符集中可打印字符(英文字符、数字字符、空格以及其他专用字符)组成,长度范围是0~4095个字符。
字符运算符
=比较前后两个字符串是否相同;
+连接两个字符串
=对字符型数据赋值
如果连接操作得出的字符型数据长度超出长度范围,witness显示出错信息。
特殊用途字符串
字符型数据可以存储任何键盘上的字符。反斜线字符()却是一个特殊的字符。
"向字符串中引入一个引号(“)。引号标识字符的结束。
\向字符串中引入一个反斜线()。
\n向字符串中引入换行符。
\r向字符串中引入回车。
\t向字符串中引入8个空格(TAB)字符。
\f向字符串中引入走纸字符。如果是打印(PRINT)操作,交互窗口被清空;如果是写(write)操作,将另起一页进行写入。
运算符及表达式
算术运算符
通过算术运算符可以构成算术表达式,进行数值型数据的处理。算术运算符和表达式实例见表6.1。
运算符 | 功能 | 表达式 | 表达式值 |
---|---|---|---|
** | 乘方 | 28,52 | 256,25 |
*,/ | 乘,除 | 36*4/9 | 16 |
+,- | 加,减 | 5+6-7 | 4 |
在进行算术表达式计算时,要遵循以下优先顺序:先括号,在同一括号内,按照先乘方,在乘除,后加减。
关系运算符
关系运算符用来构成关系表达式,关系运算是运算符两边同类元素的比较,关系成立结果为真(T);反之,结果为假(F),参看表6.2。
运算符 | 功能 | 表达式 | 表达式值 |
---|---|---|---|
<> | 不等于 | 15<>20 | T |
> | 大于 | 5>8 | F |
< | 小于 | 8+4>10 | T |
<= | 小于等于 | 12<=3*4 | T |
>= | 大于等于 | 16>=20 | F |
逻辑运算符
逻辑运算符用来构成逻辑表达式。逻辑表达式可与关系表达式一起组成满足IF,WHILE语句的判断条件,参看表6.3。
运算符 | 功能 | 表达式 | 表达式值 |
---|---|---|---|
NOT | 逻辑非 | NOT3+5>6 | F |
AND | 逻辑与 | 3+5>6AND4*5=20 | T |
OR | 逻辑或 | 6*9<45OR7<>8 | T |
转换运算符
转换运算符主要有两种:
(1)&将整数转换为英文字母。
如果变量值为1,则返回“A”;如果变量值为2,则返回“B”;如此类推,当变量值为26时,则返回“Z”。如果变量值大于26,将进行循环,如:变量值为28,则返回“B”。
如果变量值为-1,则返回“a”;如果变量值为-2,则返回“b”;如此类推,当变量值为-26时,则返回“z”。如果变量值小于-26,将进行循环,如:变量值为-28,则返回“b”。
(2)@将数值型数据转换为字符型数据。
例如:DESC=”P”+@VAR1(此时数值型变量VAR1=56),则DESC=P56。
程序三种基本结构
顺序结构
顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。WITNESS系统中的大多数命令都可以作为顺序结构中的语句。
分支结构
分支结构是在程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题。
分支结构有单向分支和多向分支语法结构,分别如下:
单向分支,也叫简单分支结构
1 | IF<条件表达式> |
该语句首先计算<条件表达式>的值,当<条件表达式>的值为真(T)时,执行<命令行序列>;否则,则执行ENDIF后面的命令。
多向分支,也叫复杂分支结构
1 | IF<条件表达式1> |
该语句首先计算〈条件表达式1〉的值,当〈条件表达式1〉的值为真时,执行〈命令行序列1〉中的命令;否则,执行〈命令行序列2〉中的命令;执行完〈命令行序列1〉或〈命令行序列2〉后都将执行ENDIF后面的第一条命令。
使用分支语句应注意的几点:
lIF……ENDIF必须配对使用;
l〈条件表达式〉可以是各种表达式或函数的组合,其值必须是逻辑值;
l〈命令行序列〉可以由一个或多个命令组成,也可以是条件控制语句组成的嵌套结构。
示例
1 | IF(water_level>=0)AND(water_level<=5) |
这段程序是用来检测容器中的水位的。变量water_level记录容器的水位,当水位在[0,5]之间时,在交互窗口(interactboxwindow)中打印出“Thelevelinthewatertankislow”语句,提醒水位较低;如果第一个条件不满足,判断第二个条件表达式,看水位是否在(5,10]之间,若表达式为真,在交互窗口中打印出“Thelevelinthewatertankisnormal”语句,提醒水位正常;当条件二也不满足时,唯一的一种情况就是水位高于10了,此时在交互窗口中打印出“Thelevelinthewatertankishigh”语句,提醒水位超高了。
循环结构
允许有限次重复执行某一特定的程序。
计数型循环
基本语法如下:
1 | FOR〈循环变量〉=〈循环变量初值〉TO〈循环变量终值〉[STEP〈循环变量步长〉] |
参数说明:
循环变量:一般情况下为整型变量,并且其数量为一,即不是数组;
循环变量初值、循环变量终值:数值型常量、变量或表达式;
循环变量步长:每次步进的长度,可以为整数,也可以为负数;缺省时为1。
语句功能:
该语句用〈循环变量〉来控制〈命令行序列〉的执行次数。执行语句时,首先将〈循环变量初值〉赋给〈循环变量〉,然后判断〈循环变量〉是否大于或小于〈循环变量终值〉,若结果为“真”,则结束循环,执行ENDFOR后面的第一条命令;否则,执行〈命令行序列〉,〈循环变量〉自动按〈循环变量步长〉增加或减少,再重新判断〈循环变量〉当前的值是否大于或小于〈循环变量终值〉,直到其结果为真。
示例
1 | NUMBER_FOUND=0 |
这段程序用来统计缓冲区store(1)中,颜色为红色的部件的数量。变量NUMBER_FOUND用来统计红色部件的数量,开始时被置零;BUFFER_INDEX是循环变量;NPARTS(STORE(1))函数计算出缓冲区STORE(1)中的部件数量;IF分支用来判断STORE(1)中排于第BUFFER_INDEX位置的部件的属性color是否等于“red”,如果为真,统计变量NUMBER_FOUND自动加1,如果为假,则执行ENDIF后面的语句;执行完成一次IF……ENDIF语句后,则循环变量自动增加1,然后判断循环变量是否大于循环变量终值,如果为假,再执行IF语句,如果为真,结束循环,执行NEXT后面的程序,循环结束。
“当”型循环
语法结构:
WHILE<条件表达式>
<命令行序列>
ENDWHILE
注:ENDWHILE可以缩写为END。
语句功能:
当<条件表达式>为真时,一直执行<命令行序列>,直到<条件表达式>为假时,循环结束。
示例:
1 | WHILENPARTS(STOCK)>90 |
该段程序实现当缓冲区STOCK中的部件数量大于90时,在交互窗口发出提醒信息“Warning!TheSTOCKbufferisnearlyfull.”。
使用循环语句时应注意的几点
lWHILE和ENDWHILE、FOR和NEXT必须配对使用。
l〈命令行序列〉可以是任何WITNESS的命令或语句,也可以是循环语句,即可以嵌套为多重循环。