结构化文本编程语言中的语句主要有四种类型,即赋值语句、函数和功能块控制语句、选择语句和循环语句,它们以分号作为语句的结束标志。
1.赋值语句
赋值语句(Assignment statement)用于将赋值操作符号右侧表达式计算的值赋予在左侧的单元素或多元素变量。“:=”表示赋值操作符。赋值语句由位于左侧的变量引用,随后是赋值符“:=”,随后是被求值的表达式组成。
赋值语句格式如下:
变量:=表达式;
表2-11是赋值语句的类型和示例,表中序号与IEC61131-3标准的表72一致,下同。
表2-11 赋值语句的类型和示例
使用赋值语句时应注意下列事项:
1)注意数据类型的匹配。根据IEC61131-3第三版的规定,如果赋值操作符两侧的数据类型不同,可根据带隐式类型转换的基本数据类型函数进行数据类型的转换。也可用数据类型转换函数进行转换。
2)一行中的语句可以多于一个,例如,示例中,B[1]:=A*3;B[2]:=A;可列写在同一行。一个语句也可以延续几行,但最大的允许长度根据实施者规定。
3)变量声明中,可用赋值语句。例如,REAL:=20.2;用于设置实数数据类型变量的初始值。
4)函数体内,赋值语句的执行是强制性的,即它将表达式的求值结果强制赋予函数名。同样,函数的数据类型应与表达式结果的数据类型匹配。
5)如果A和B是多元素变量,A和B的数据类型应相同,这种情况下,变量A的元素获得变量B的元素的值。
如果A和B都是ANALOG_CHANNEL_CONFIGURATION类型的,则结构变量A的所有元素应采用变量B的相应元素的当前值替代。
6)赋值语句通常被用于一个函数、方法或功能块的结果的赋值,如果结果由POU定义,至少有一个该POU名的赋值被进行。返回值应是最近这样一个赋值的求值结果。
IEC61131-3第三版增加了比较语句。比较返回它的结果作为布尔值。一个比较由一个在左侧的变量引用,然后是比较符,然后是右侧的一个变量引用组成。变量可以是单元素或多元素变量。
比较A=B用于比较变量A的数据值与变量B的值是否相等。变量A与变量B的数据类型应相同,或已经被隐式转换到相同的数据类型。
对多元素的变量,比较语句比较变量A与变量B的各元素的值。
2.函数、方法、功能块的调用控制语句
IEC61131-3第三版将函数、方法、功能块和RETURN的调用控制语句列在赋值语句中定义,见该标准的表72。
函数、方法和功能块控制语句由调用该POU的机制和在POU物理端前RETURN控制到调用实体的机制组成。
(1)函数的调用控制
函数可用一个语句调用,该语句由函数名和一个括号列出的参数列表组成。
1.2.5节和1.2.6节有关函数调用的规则和性能可应用。
函数调用后将返回值作为表达式的值赋值给变量。函数调用的语句格式如下:
变量:=函数名(参数表);
参数表可以是形参表或实参表,必要时用赋值语句将实参赋值到形参。
【例2-14】函数调用语句示例。
A:=LIMIT(IN:=%IX0.0,MN:=MIN1,MX:=MAX1); /*调用LIMIT函数,计算结果赋值给A*/
BB:=ADD(2,3); /*调用ADD函数,计算结果赋值给BB*/
(2)方法的调用控制
方法可用一个由实例名、“.”、方法名和括号的参数列表组成的语句调用。调用语句格式如下:
变量:=实例名.方法名(参数表);
参数表可以是形参表或实参表,必要时用赋值语句将实参赋值到形参。
【例2-15】方法调用语句示例。
A:=FB_INST.M1(17); /*调用FB_INST.M1方法,计算结果赋值给A*/
(3)功能块的调用控制和功能块输出
功能块调用语句采用功能块实例名的调用实现。功能块调用语句格式如下:
功能块实例名(参数表);
参数表可以是形参表或实参表,必要时用赋值语句将实参赋值到形参。
【例2-16】功能块调用语句示例。
RS_1(S:=%IX0.0,R1:=%IX0.1); /*调用RS功能块实例RS_1*/
RTRIG_1(CLK:=START); /*调用R_TRIG功能块实例RTRIG_1*/
功能块返回控制语句是功能块的输出语句,返回控制语句格式如下:
变量:=功能块实例名.参数名;
【例2-17】功能块返回控制语句示例。
A:=TIM_1.Q;B:=RS_1.Q1;C:=RTRIG_1.Q; /*功能块TON实例TIM_1输出赋值给A等*/
(4)RETURN语句
RETURN语句用于提供从函数、功能块或程序(例如,作为一个IF语句的求值结果)的出口。因此,在执行该语句前,需根据函数名对变量赋值。如果在功能块内没有对功能块的输出变量赋值,则输出变量采用输出变量数据类型的初始值或最新的存储数值进行赋值。RETURN语句没有操作数。
【例2-18】RETURN语句示例。
加计数器CTU的功能块。程序如下:
示例的程序与表1-60的程序比较,可以发现,由于采用RETURN语句,当没有脉冲信号输入时,将输出Q复位,CV设置回复到零,并终止程序,返回到程序起点,从而缩短程序执行时间。只有当输入脉冲CU信号后,程序才执行后续语句,完成CV加1操作或复位操作。因此,RETURN语句用于从一个函数、功能块或程序的提前退出。
3.选择语句
选择语句包括IF和CASE语句。一个选择语句根据规定的条件选择表达式来确定执行它所组成的语句之一(或一组)。表2-12列出选择语句的示例。
表2-12 选择语句的示例
(1)IF选择语句
IF选择语句中,只有条件表达式的值为布尔1(TRUE)的一组语句被执行。如果条件为0(FALSE),则没有语句被执行或者在ELSE关键字(或ELSIF关键字)所示条件中的一组语句被执行。图2-3显示IF选择语句的语法结构。
图2-3 IF选择语句的语法结构
IF选择语句执行过程。当表达式1为1(TRUE)时,执行语句组1;如果为0(FALSE),则当表达式2为1时,执行语句组2,否则执行语句组。
使用IF选择语句时应注意下列事项:
1)IF选择语句至少由一个IF、一个THEN和一个END_IF组成。
2)“ELSIF表达式2 THEN语句组2”的语句可重复多次。应注意关键字是ELSIF,不是ELSEIF。
3)一些IF选择语句中,可以没有ELSIF和ELSE的语句段,见例2-19。
【例2-19】IF选择语句的示例。
4)表达式用后续的关键字THEN判别其是否结束。
5)语句组是一个或多个用分号分隔的语句。语句组结束用关键字END_IF判别。
6)可通过整数表达式、数值表和相应的语句组实现多重选择,见例2-20。
【例2-20】多重选择的示例。
END_IF;
(2)CASE选择语句
CASE选择语句由数据类型为ANY_INT或枚举数据类型变量求值的表达式和一组语句列表组成。每个语句组由一个或多个文本、枚举值或子范围标号(如果适用)组成。CASE选择语句格式如下:
CASE 表达式 OF
数值表元素1: 语句组1;
…
数值表元素n: 语句组n;
ELSE 语句组n+1;
CASE选择语句的语法结构如图2-4所示。
CASE语句中最大允许选择个数由实施者规定。
(www.xing528.com)
图2-4 CASE选择语句的语法结构
【例2-21】出错代码的CASE语句示例。
使用CASE选择语句时的注意事项如下:
1)CASE选择语句中,表达式的值必须是整数。因此,表达式的非整数数据类型的数据需要转换为整数。例如,表2-12中将WORD数据类型的THUMBWHEEL用WORD_BCD_TO_INT(THUMBWHEEL)转换为整数。
2)可采用连续符号“..”表示连续的多个整数。例如,表2-12中,6..10表示整数6、7、8、9、10。
3)不同整数数值用逗号“,”分隔表示时,用于选择执行相同的语句组。例如,表2-12中,1,5表示TW是1或5时都将DISPLAY赋值为OVEN_TEMP。
4)ELSE选项是可选的。一些程序可只有CASE…OF…END_CASE结构。
4.循环语句
循环语句也称为迭代语句、重复语句。IEC61131-3第三版增加CONTINUE语句,即有FOR、WHILE、REPEAT、EXIT和CONTINUE五类。
循环语句规定有关的语句组可重复执行。WHILE和REPEAT语句不被用于获得进程的同步,例如,它们被作为带外部确定终止条件的“等待循环”。当WHILE和REPEAT语句被用在一个算法,其中用于满足回路终止条件或一个EXIT语句的执行不能保证时,则出错。
循环次数可事先确定时,应采用FOR循环语句;循环次数不能事先确定时,应采用WHILE和REPEAT语句。
为了在循环执行过程中终止循环,可采用EXIT语句,它用于在终止条件满足前终止循环。
CONTINUE语句用于跳过循环回路的剩余语句,并继续执行。
表2-13是循环语句的示例。
表2-13 循环语句的示例
(1)FOR循环语句
循环次数可以事先确定时,采用FOR循环语句实现语句组的循环执行。FOR循环语句的格式如下:
FOR 控制变量:=初值表达式 TO 终值表达式 BY 增量表达式 DO
语句组;
END_FOR;
FOR循环语句格式中,控制变量是在循环执行过程中不断变化的变量,在每次循环执行后,该变量的值增加增量表达式所计算的值,即控制变量:=控制变量+增量表达式。因此,如果增量表达式的值是负数,表示每次循环执行后,控制变量的值减小。FOR循环语句的结构如图2-5所示。
图2-5 FOR循环语句的语法结构
初值表达式是控制变量起始值,终值表达式是控制变量终止值,增量表达式是控制变量的每次增量。每次循环执行后控制变量的值变化,即当前控制变量值加增量,如果其值没有超过终止值,则循环执行继续。反之,如果超过终止值,或执行过程中执行到EXIT语句,则循环执行过程终止。语句组是需要循环执行的语句集合。
【例2-22】FOR循环语句示例。
示例中,计算从1~100的累加和结果SUM和100的阶乘结果FACTORIAL。
使用FOR循环语句时的注意事项如下:
1)控制变量起始值、终止值和增量的数据类型应一致,必须是相同的整数类型。它不会因任何重复语句而改变。
2)控制变量起始值和增量的约定值都为1,因此,如果程序没有设置相应表达式,系统自动设置它们的值为1。BY关键字是可选的,当增量表达式的值为1时,可省略BY。
3)终止条件的测试在每次循环开始前进行,如果控制变量当前值超过终止值时,循环语句中的语句组不被执行。每次循环执行后进行赋值运算,即控制变量:=控制变量+增量表达式,并更新控制变量值。控制变量当前值超过终止值表示控制变量已经不在由起始值和终止值组成的循环范围内。当控制变量当前值等于终止值时,执行最后一次循环操作。
4)控制变量起始值、终止值和增量的表达式在执行过程中只计算一次。与其他循环语句不同,它们不允许被任何循环语句内的语句所改变。
5)FOR循环语句执行后,控制变量的值与具体的实现有关,应根据不同制造商的产品说明书确定。
(2)WHILE循环语句
WHILE循环语句根据表达式条件是否为真(满足)确定是否执行有关循环语句。因此,循环次数在循环语句执行前是不确定的。WHILE循环语句的格式如下:
WHILE 表达式 DO
语句组;
END_WHILE;
WHILE循环语句格式中的表达式是一个布尔表达式,其值为真时,循环语句组被执行,反之,则不被执行。图2-6显示WHILE循环语句的语法结构。
图2-6 WHILE循环语句的语法结构
【例2-23】WHILE循环语句示例。
本示例同样用于计算1~100的累加和SUM和100的阶乘FACTORIAL。与例2-22比较,执行WHILE循环语句中的语句组时,用于判别循环语句执行与否的表达式值不断变化。因此,每次循环过程开始,该循环语句先判别表达式是否为真,一旦条件满足(示例中,表达式中变量J的值大于或等于100)则结束循环语句的执行。
使用WHILE循环语句时的注意事项如下:
1)WHILE循环语句的循环次数事先不确定。循环语句执行过程中,表达式值变化。
2)WHILE循环语句中的表达式是布尔表达式。
3)WHILE循环语句中,对表达式的判别运算在循环执行前进行。
4)实际应用时,需注意循环语句中语句先后次序对运算结果的影响。例如,例2-23中,如果,J:=J+1;语句放在语句组的最后,则循环判别表达式应改为:J<=100。同时,J:=0的初始赋值语句改为J:=1。
5)WHILE循环语句不能用于获得内部过程间的同步(例如,用外部确定的终止条件来作为一个“等待循环”),但可用SFC元素实现过程间的同步。
6)该语句循环执行直到有关布尔表达式是FALSE。如果初始时表达式为FALSE,则语句组不执行。
(3)REPEAT循环语句
REPEAT循环语句根据表达式的条件是否为真(满足)确定是否执行有关的循环语句。循环次数在REPEAT循环语句执行前是不确定的。REPEAT循环语句的格式如下:
REPEAT
语句组;
UNTIL 表达式
END_REPEAT;
REPEAT循环语句执行语句组,然后对表达式进行判别,当表达式值为假(FALSE)时,循环不被执行。图2-7显示REPEAT循环语句的语法结构。
图2-7 REPEAT循环语句的语法结构
REPEAT循环语句使用注意事项与WHILE循环语句类似,两种循环语句的主要区别是对表达式判别的先后。WHILE循环语句先判别表达式的值,再执行循环语句组;而REPEAT循环语句先执行循环语句组,然后判别表达式的值。因此,当初始表达式为假时,REPEAT循环语句执行一次语句组,而WHILE循环语句则不执行该语句组。图2-8显示两种循环语句的区别。
图2-8 两种循环语句的区别
a)WHILE语句 b) REPEAT语句
【例2-24】REPAET循环语句示例。
例2-24同样用于计算1~100的累加和SUM和100的阶乘FACTORIAL。
(4)EXIT语句
EXIT语句用于循环语句执行过程中中断循环过程的执行,而不管循环的终止条件是否满足。
当EXIT语句位于嵌套循环语句内时,EXIT语句退出循环发生在EXIT语句所在循环的最内环,即在EXIT语句所在循环回路终止关键字(END_FOR,END_WHILE,END_REPEAT)后面的语句。
【例2-25】EXIT语句示例。
示例中,当标志FLAG的值为假(0)时,选择语句不被执行,因此,SUM的结果为15。如果FLAG的值为真(1),则执行IF选择语句时执行EXIT语句,循环将退出到控制变量I层,使SUM的结果为6。表2-14显示各循环执行过程中SUM值的变化。
表2-14 各循环执行过程中SUM值的变化
(5)CONTINUE语句
CONTINUE语句用于跳过循环回路的剩余语句。循环回路中,CONTINUE位于回路的最后一句语句的后面,但在回路终止符(END_FOR,END_WHILE或END_REPEAT)的前面。
【例2-26】CONTINUE语句示例。
与例2-25比较,语句执行后,如果布尔变量FLAG=0,则变量的值SUM=15;如果FLAG=1,则SUM=9。
5.空语句
空语句表示没有语句。它用分号“;”表示。这是IEC61131-3第三版增加的语句,用于表示不执行任何操作。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。