施耐德文本化编程语言

指令表(IL)

◆指令表编程语言与汇编语言类似,是一种助记符编程语言,由操作符和操作数组

成。

◆例如:

指令表(IL)

◆上述程序中,LD/ST/R/CAL为操作符;input1/output1等为操作数。

◆操作数可为变量、常量、寄存器地址、函数等, 如:input1为变量,T1_PT为常量,

%QX0.0为输出点地址。

◆常用操作符如下所示:

◆ADD加法/SUB减法/MUL乘法/DIV除法/MOD取余/AND(N)与(非)/OR(N)或(非)

/XOR(N)异或(非)/NOT非/SHL左移/SHR右移/ROL循环左移/ROR循环右移/GT大于/GE大于等于/LT小于/LE小于等于/EQ等于/NE不等于

◆在Somachine软件中,指令表(IL)与梯形图(LD)、功能块图(FBD)之间可

以相互转换。

◆上例的IL程序可转换为梯形图如下:

结束

结构化文本(ST)

◆结构化文本,Structured Text,简写为ST,是用结构化的描述文本来编写程序的一

种编程语言。

◆ST语言的特点是“高级文本编程”和“结构化”,适合于算法和结构较为复杂,其它编

程语言(如梯形图、FBD等)实现比较困难的情况。具有高效、快捷、简洁的优点。

◆例:现在有A,B,C,D四个整形变量,要求得到这四个数的平均数,并赋值给E。

结构化文本(ST)

结构化文本(ST)

语法结构:

一、表达式

表达式中包括操作符和操作数,操作数按照操作符指定的规则进行运算,得到结果并返回。

操作数可以为变量、常量、寄存器地址、函数等。

例如:a+b+c

3.14*R*R

ABS(-10)+var1

如果在表达式中有若干个操作符,则操作符会按照约定的优先级顺序执行:先执行优先级高的操作符运算,再顺序执行优先级低的操作符运算。如果在表达式中具有优先级相同的操作符,则这些操作符按照书写顺序从左至右执行。

结构化文本(ST) 操作符的优先级如下表所示:

结构化文本(ST)

二、指令说明

1. 赋值指令

变量:= 变量或表达式

意义:操作符“:=”右边变量或表达式的值被赋给了左边的变量例如:Var2:=Var1*10;

该语句把Var1的值乘以10,再将得到的结果赋值给Var2。

2 IF指令

使用IF指令可以检查条件,并根据此条件执行相应的指令。

常见的IF指令结构有:

(1) IF 条件A THEN

表达式A;

END_IF

当条件A满足时,执行表达式A。

结构化文本(ST)

例如:

IF temp<17

THEN heating_on := TRUE;

END_IF

当温度降到17度以下时,开启加热器。

(2) IF 条件A THEN

表达式A;

ELSE

表达式B;

END_IF

当条件A满足时,执行表达式A;否则,执行表达式B。

例如:

IF temp<17

THEN heating_on := TRUE;

ELSE heating_on := FALSE;

END_IF;

当温度降到17度以下时,开启加热器, 否则加热器保持关闭。

结构化文本(ST)

(3)IF 条件A THEN 表达式A;

ELSIF 条件B THEN 表达式B;

...

ELSIF 条件N-1 THEN 表达式N-1;

ELSE 表达式N;

END_IF

当条件A满足时,执行表达式A;否则,当条件B满足时,执行表达式B;…否则,当(条件N-1)满足时,执行(表达式N-1);如果以上条件都不满足,则执行表达式N; 指令结束。

例如:

IF temp<17

THEN heating_on := TRUE;

ELSIF temp<30

结构化文本(ST)

THEN Heating_on := FALSE; Colding_on:= FALSE;

ELSE

Colding_on:= TRUE;

END_IF

当温度降到17度以下时,开启加热器;当温度升高到30度以上时,开启制冷器;当温度在17度~30度之间时,加热器、制冷器均保持关闭。

3 CASE指令

语法:

CASE <控制变量> OF

<数值1>: <表达式1>

<数值2>: <表达式2>

<数值3, 数值4, 数值5>: <表达式3>

<数值6 .. 数值10>: <表达式4>

...

<数值n>: <表达式n>

ELSE

END_CASE

结构化文本(ST)

CASE指令用于将控制变量和若干个操作数进行比较,如果控制变量与其中一个值相同,则执行该值对应的语句。如果与任何一个值都不相同,则执行ELSE指令的语句。

例如:

CASE INT1 OF

1, 5: BOOL1 := TRUE;

2: BOOL2 := TRUE;

10..20: BOOL3:= TRUE;

ELSE

BOOL1 := BOOL2 :=BOOL3 :=FALSE;

END_CASE

当INT1=1或5时,BOOL1为真;

当INT1=2时,BOOL2为真;

当INT1=10~20之间的数值时,BOOL3为真;

否则,BOOL1、BOOL2、BOOL3均为假。

当使用IF指令有过多分层,或者需要使用多个ELSIF,才能完成程序功能时,使用CASE指令替代IF指令,可以简化程序,并且能提高程序的可读性。

结构化文本(ST)

4 FOR循环指令

FOR循环指令用于一些需要重复执行的语句,它可以使程序简短并且一目了然。但需要注意避免陷入死循环。

FOR循环指令是有限制的循环指令, 当限制条件满足(变量值等于“循环结束时变量值”)时,程序就将退出FOR循环,执行下一条指令。

语法:

FOR <循环控制变量> := <循环开始时变量值> TO <循环结束时变量值>{BY <变量递增步长>}

DO

<表达式>

END_FOR

其中,{}内语句可根据需要省略,省略时步长默认为1。

结构化文本(ST)

例如:

FOR Counter:=1 TO 5 BY 1 DO

Var1:=Var1*2;

END_FOR

此程序的循环控制变量为Counter,循环开始时控制变量初值为1,每一次循环Counter+1;

当Counter等于5时,执行完FOR循环内容后,退出循环,执行下一条语句。

语句Var1:=Var1*2一共执行5次;假设Var1的初始值是1,那么循环结束后,Var1的值为

32。

注意:<循环结束时变量值>不能等于其数据类型的最大值,否则会进入死循环。

例如,假设上例中所使用的计数变量Counter的类型是SINT(范围从-128到127),如果语句为“FOR Counter:=1 TO 127 BY 1 DO”则会进入死循环。编程时应避免此类情况的发生。

结构化文本(ST)

5 WHILE循环指令

WHILE循环与FOR循环使用方法类似。二者的不同之处是,WHILE循环的结束条件不是指定的循环次数,而是任意的逻辑表达式。当满足该表达式叙述的条件满足时,执行循环。

语法:

WHILE <循环条件>

<表达式>

END_WHILE

WHILE循环执行前先检查<循环条件>是否为TRUE,如果为TRUE,则执行<表达式>;当执行完一次后,再次检查<循环条件>,如果仍为TRUE,则再次执行,直到<循环条件>为FALSE。如果一开始<循环条件>就为FALSE,则不会执行WHILE循环里的指令。

例如:

WHILE Counter<>0 DO

Var1 := Var1*2;

Counter := Counter-1;

END_WHILE

结构化文本(ST)

此程序只要Counter不等于0,则一直会执行WHILE循环中的指令,直到Counter等于0为止。每执行一次循环,通过指令“Counter := Counter-1”使Counter的值减1,当Counter等于0时,循环结束。

注意:WHILE循环因为没有循环次数的限定,因此相对FOR循环更容易发生死循环;因此可以在循环指令的内容中,增加语句来避免死循环的产生。如上述程序中的“Counter := Counter-1”即可避免程序进入死循环。

结构化文本(ST)

6 REPEAT循环指令

REPEAT循环与WHILE循环一样,也是没有明确循环次数的循环。与WHILE循环的区别在于,REPEAT循环在指令执行以后,才检查结束条件。这就意味着无论结束条件怎样,循环至少执行一次。

语法:

REPEAT

<表达式>

UNTIL <循环结束条件>

END_REPEAT

语句一直执行,直到<循环结束条件>为TRUE时,REPEAT循环结束。如果<循环结束条件>一开始就为TRUE,则循环只执行一次。

结构化文本(ST)

例如,上述WHILE示例程序也可写为:

REPEAT

Var1 := Var1*2;

Counter := Counter-1;

UNTIL

Counter=0

END_REPEAT

注意:REPEAT循环同样需要避免死循环的发生。

在一定的意义上,WHILE循环和REPEAT循环比FOR循环的功能更加强大,这是因为在执行循环前,WHILE循环和REPEAT循环不需要知道循环的次数。因此,在有些情况下,只使用这两种循环就可以了。然而,如果清楚地知道了循环的次数,那么FOR 循环更好,因为FOR循环可以避免产生死循环。

结构化文本(ST)

7 CONTINUE指令

CONTINUE指令可以在FOR、WHILE和REPEAT三种循环中使用,其作用为中断本次循环,直接执行下次循环。

例如:

FOR Counter:=1 TO 5 BY 1 DO

INT1:= INT1/2;

IF INT1=0 THEN

CONTINUE; (* to avoid division by zero *)

END_IF

Var1:=Var1/INT1; (* only executed, if INT1 is not "0" *)

END_FOR

此程序使用CONTINUE指令,当INT1等于0时,直接结束本次循环,开始下一次循环,以

避免指令“Var1:=Var1/INT1”中对INT1的除零操作。

结构化文本(ST)

8 EXIT指令

EXIT用于退出FOR循环、WHILE循环、REPEAT循环。例如:FOR Counter:=1 TO 5 BY 1 DO

INT1:= INT1/2;

IF INT1=0 THEN

EXIT; (* to avoid division by zero *)

END_IF

Var1:=Var1/INT1;

END_FOR

当INT1等于0时,FOR循环结束。

相关主题
相关文档
最新文档