文本化编程语言•指令表(IL)•结构化文本(ST)文本化编程语言指令表(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)结构化文本,StructuredText,简写为ST,是用结构化的描述文本来编写程序的一种编程语言。ST语言的特点是“高级文本编程”和“结构化”,适合于算法和结构较为复杂,其它编程语言(如梯形图、FBD等)实现比较困难的情况。具有高效、快捷、简洁的优点。例:现在有A,B,C,D四个整形变量,要求得到这四个数的平均数,并赋值给E。结构化文本(ST)结构化文本(ST)语法结构:一、表达式表达式中包括操作符和操作数,操作数按照操作符指定的规则进行运算,得到结果并返回。操作数可以为变量、常量、寄存器地址、函数等。例如:a+b+c3.14*R*RABS(-10)+var1如果在表达式中有若干个操作符,则操作符会按照约定的优先级顺序执行:先执行优先级高的操作符运算,再顺序执行优先级低的操作符运算。如果在表达式中具有优先级相同的操作符,则这些操作符按照书写顺序从左至右执行。结构化文本(ST)操作符的优先级如下表所示:结构化文本(ST)二、指令说明1.赋值指令变量:=变量或表达式意义:操作符“:=”右边变量或表达式的值被赋给了左边的变量例如:Var2:=Var1*10;该语句把Var1的值乘以10,再将得到的结果赋值给Var2。2IF指令使用IF指令可以检查条件,并根据此条件执行相应的指令。常见的IF指令结构有:(1)IF条件ATHEN表达式A;END_IF当条件A满足时,执行表达式A。结构化文本(ST)例如:IFtemp17THENheating_on:=TRUE;END_IF当温度降到17度以下时,开启加热器。(2)IF条件ATHEN表达式A;ELSE表达式B;END_IF当条件A满足时,执行表达式A;否则,执行表达式B。例如:IFtemp17THENheating_on:=TRUE;ELSEheating_on:=FALSE;END_IF;当温度降到17度以下时,开启加热器,否则加热器保持关闭。结构化文本(ST)(3)IF条件ATHEN表达式A;ELSIF条件BTHEN表达式B;...ELSIF条件N-1THEN表达式N-1;ELSE表达式N;END_IF当条件A满足时,执行表达式A;否则,当条件B满足时,执行表达式B;…否则,当(条件N-1)满足时,执行(表达式N-1);如果以上条件都不满足,则执行表达式N;指令结束。例如:IFtemp17THENheating_on:=TRUE;ELSIFtemp30结构化文本(ST)THENHeating_on:=FALSE;Colding_on:=FALSE;ELSEColding_on:=TRUE;END_IF当温度降到17度以下时,开启加热器;当温度升高到30度以上时,开启制冷器;当温度在17度~30度之间时,加热器、制冷器均保持关闭。3CASE指令语法:CASE控制变量OF数值1:表达式1数值2:表达式2数值3,数值4,数值5:表达式3数值6..数值10:表达式4...数值n:表达式nELSEELSE的表达式END_CASE结构化文本(ST)CASE指令用于将控制变量和若干个操作数进行比较,如果控制变量与其中一个值相同,则执行该值对应的语句。如果与任何一个值都不相同,则执行ELSE指令的语句。例如:CASEINT1OF1,5:BOOL1:=TRUE;2:BOOL2:=TRUE;10..20:BOOL3:=TRUE;ELSEBOOL1:=BOOL2:=BOOL3:=FALSE;END_CASE当INT1=1或5时,BOOL1为真;当INT1=2时,BOOL2为真;当INT1=10~20之间的数值时,BOOL3为真;否则,BOOL1、BOOL2、BOOL3均为假。当使用IF指令有过多分层,或者需要使用多个ELSIF,才能完成程序功能时,使用CASE指令替代IF指令,可以简化程序,并且能提高程序的可读性。结构化文本(ST)4FOR循环指令FOR循环指令用于一些需要重复执行的语句,它可以使程序简短并且一目了然。但需要注意避免陷入死循环。FOR循环指令是有限制的循环指令,当限制条件满足(变量值等于“循环结束时变量值”)时,程序就将退出FOR循环,执行下一条指令。语法:FOR循环控制变量:=循环开始时变量值TO循环结束时变量值{BY变量递增步长}DO表达式END_FOR其中,{}内语句可根据需要省略,省略时步长默认为1。结构化文本(ST)例如:FORCounter:=1TO5BY1DOVar1:=Var1*2;END_FOR此程序的循环控制变量为Counter,循环开始时控制变量初值为1,每一次循环Counter+1;当Counter等于5时,执行完FOR循环内容后,退出循环,执行下一条语句。语句Var1:=Var1*2一共执行5次;假设Var1的初始值是1,那么循环结束后,Var1的值为32。注意:循环结束时变量值不能等于其数据类型的最大值,否则会进入死循环。例如,假设上例中所使用的计数变量Counter的类型是SINT(范围从-128到127),如果语句为“FORCounter:=1TO127BY1DO”则会进入死循环。编程时应避免此类情况的发生。结构化文本(ST)5WHILE循环指令WHILE循环与FOR循环使用方法类似。二者的不同之处是,WHILE循环的结束条件不是指定的循环次数,而是任意的逻辑表达式。当满足该表达式叙述的条件满足时,执行循环。语法:WHILE循环条件表达式END_WHILEWHILE循环执行前先检查循环条件是否为TRUE,如果为TRUE,则执行表达式;当执行完一次后,再次检查循环条件,如果仍为TRUE,则再次执行,直到循环条件为FALSE。如果一开始循环条件就为FALSE,则不会执行WHILE循环里的指令。例如:WHILECounter0DOVar1:=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)6REPEAT循环指令REPEAT循环与WHILE循环一样,也是没有明确循环次数的循环。与WHILE循环的区别在于,REPEAT循环在指令执行以后,才检查结束条件。这就意味着无论结束条件怎样,循环至少执行一次。语法:REPEAT表达式UNTIL循环结束条件END_REPEAT语句一直执行,直到循环结束条件为TRUE时,REPEAT循环结束。如果循环结束条件一开始就为TRUE,则循环只执行一次。结构化文本(ST)例如,上述WHILE示例程序也可写为:REPEATVar1:=Var1*2;Counter:=Counter-1;UNTILCounter=0END_REPEAT注意:REPEAT循环同样需要避免死循环的发生。在一定的意义上,WHILE循环和REPEAT循环比FOR循环的功能更加强大,这是因为在执行循环前,WHILE循环和REPEAT循环不需要知道循环的次数。因此,在有些情况下,只使用这两种循环就可以了。然而,如果清楚地知道了循环的次数,那么FOR循环更好,因为FOR循环可以避免产生死循环。结构化文本(ST)7CONTINUE指令CONTINUE指令可以在FOR、WHILE和REPEAT三种循环中使用,其作用为中断本次循环,直接执行下次循环。例如:FORCounter:=1TO5BY1DOINT1:=INT1/2;IFINT1=0THENCONTINUE;(*toavoiddivisionbyzero*)END_IFVar1:=Var1/INT1;(*onlyexecuted,ifINT1isnot0*)END_FOR此程序使用CONTINUE指令,当INT1等于0时,直接结束本次循环,开始下一次循环,以避免指令“Var1:=Var1/INT1”中对INT1的除零操作。结构化文本(ST)8EXIT指令EXIT用于退出FOR循环、WHILE循环、REPEAT循环。例如:FORCounter:=1TO5BY1DOINT1:=INT1/2;IFINT1=0THENEXIT;(*toavoiddivisionbyzero*)END_IFVar1:=Var1/INT1;END_FOR当INT1等于0时,FOR循环结束。结构化文本(ST)9.RETURN指令返回指令,用于根据一定条件退出POU。例如:IFb=TRUETHENRETURN;END_IFa:=a+1;如果b为TRUE,将不会执行a:=a+1,而是直接退出POU。10.JMP指令label:JMPlabel;跳转指令,跳转到label所在的位置执行程序。例如:i:=0;label:i:=i+1;......IFi10THENJMPlabel;END_IF当i10时,跳转回label所在行,执行i:=i+1。JMP指令容易造成程序结构混乱,降低代码可读性,不建议使用。结构化文本(ST)三、在ST中调用功能块如果需要在ST中调用功能块,可直接输入功能块的实例名称,并在随后的括号中给功能块的各参数分配数值或变量,参数之间以逗号隔开;功能块调用以分号结束。例如,在ST中调用TON定时器,假设其实例名为TON1:结构化文本(ST)四、在ST中添加注释注释是程序中非常重要的一部分,它使程序更加具有可读性,同时不会影响程序的执行。在ST编辑器的声明部分或执行部分的任何地方,都可以添加注释。在ST语言中,有两种注释方法:(1)注释以(*开始,以*)结束。这种注释方法允许多行注释。例如:结构化文本(ST)(2)注释以“//”开始,一直到本行结束。这是单行注释的方法。例如:结束