1.IF......THEN语句
当特定条件发生时,使用IF......THEN语句执行某项操作。
(1)格式与语法
一般情况下的格式为:
IFbool_expressionTHEN
<statement>;
ENDI_F;
注意,上面的bool_expression为标签表达式,计算结果为布尔量。
这种格式也常和ELSIF以及ELSE结合起来构成多种选择结构,如下所示:
使用上面的格式时需要注意以下几点:
1)如果从多个语句组(2个以上)中选择,需要添加一个或者多个ELSIF语句。
2)每个ELSIF表示一个选择路径。
3)控制器执行首个条件为真的IF或者ELSIF语句,并跳过其余的ELSIF和ELSE语句。
4)如果要求当所有IF和ELSIF条件为假时执行ELSE语句后的指令。
表3-11总结了IF、THEN、ELSIF和ELSE语句的多种组合情况。
表3-11 IF、THEN、ELSIF和ELSE语句使用总结
(2)应用示例
如果有以下的要求:若判断条件(rejects)大于3则停止运行传送带(conveyor)并且报警(alarm)置位。在ST例程中输入以下语句:
/*判断是否停止传送带并且报警置位*/
IFrejects>3THEN
conveyor∶=0;//停止传送带
alarm∶=1;//报警置位
END_IF;
如果有以下要求:若传送带此时方向(conveyor direction contact)为向前(用1表示),则将灯(light)熄灭;否则灯是点亮的。
根据上面的要求,在ST中输入以下语句:
/*如果传送带此时方向为向前(用1表示),则将灯熄灭;否则灯是点亮的
*/
IFconveyor_directionTHEN
light∶=0;//如果传送带的方向是向前,则灯熄灭
ELSE
light[∶=]1;//否则为暂时点亮
END_IF;
如果有以下要求:若液位上下限位开关都导通,则阀打开;如果液位低于上限位开关,则阀关闭。
/*通过判断液位的上下限位开关的状态来决定阀的开与关操作*/
IFwater.Low&water.HighTHEN
water.Inlet[∶=]1;//如果液位上下限位开关都有信号,则阀打开
ELSEIFNOT(water.High)THEN
Water.Inlet∶=0;//如果液位低于上限开关,则阀关闭
END_IF;
如果有以下要求:若罐温度大于200℃,则泵快速运行;如果罐温度大于100℃,则泵缓慢运行;否则泵停止运行。
/*通过温度大小来决定泵的运行状态*/
IFtank.temp>200THEN
pump.fast∶=1;pump.slow∶=0;pump.off∶=0;
//如果温度大于200℃,则泵快速运行
ELSEIFtank.temp>100THEN
Pump.fast∶=0;pump.slow∶=1;pump.off∶=0;
//如果温度大于100℃,则泵慢速运行
ELSE
Pump.fast∶=0;pump.slow∶=0;pump.off∶=1;
//其他情况下,泵停止运行
END_IF;
2.CASE......OF语句
使用CASE语句根据数值来选择执行的操作。
(1)格式与语法
一般情况下的格式为:
CASEnumeri_cexpressionOF
selector1∶statement;
selectorN∶statement;
ELSE
statement;
END_CASE;
注意,上面的numeric_expression为标签表达式,selector为选择器。
这种选择语句的具体做法如下所示:
(2)应用示例
下面的示例是在进行配方管理时经常遇见的。具体要求如下:如果配方号是1,则成分A的1号出口和成分B的4号出口打开;如果配方号是2或3,则成分A的4号出口和成分B的2号出口打开;如果配方号是4、5、6、7,则成分A的4号出口和成分B的1号出口打开;如果配方号是8、11、12、13,则成分A的1号出口和成分B的2号出口打开;否则所有的出口关闭。
/*本示例根据配方号来决定要添加的成分*/
CASErecipe_numberOF
1: Ingredient_A.Outlet_1∶=1;
Ingredient_B.Outlet_4∶=1;//如果配方号是1,则成分A的1号出口和成分B的4号出口打开
2,3: Ingredient_A.Outlet_4∶=1;
Ingredient_B.Outlet_2∶=1;//如果配方号是2或3,则成分A的4号出口和成分B的2号出口打开
4...7: Ingredient_A.Outlet_4∶=1;(www.xing528.com)
Ingredient_B.Outlet_1∶=1;//如果配方号是4、5、6、7,则成分A的4号出口和成分B的1号出口打开
8,11...13:Ingredient_A.Outlet_1∶=1;
Ingredient_B.Outlet_2∶=1;//如果配方号是8、11、12、13,则成分A的1号出口和成分B的2号出口打开
ELSE
Ingredient_A.Outlet1[∶=]0;
Ingredient_A.Outlet2[∶=]0;
Ingredient_A.Outlet4[∶=]0;
Ingredient_B.Outlet1[∶=]0;
Ingredient_B.Outlet2[∶=]0;
Ingredient_B.Outlet4[∶=]0;//否则关闭所有出口
END_CASE;
3.FOR......DO语句
使用FOR......DO循环在执行其他操作前执行特定次数的操作。
(1)格式与语法
FORcount∶=initial_valueTO
final_valueBYincrementDO
<statement>;
END_FOR;
在上式中,count是计数值;initial_value是初始值;final_value是结束值;increment是增量值。这种选择语句的具体做法如下所示:
(2)应用示例
下面示例使用FOR......DO循环将一个32个元素的数组全部置位成0。
/*本示例使用FOR......DO循环将一个32个元素的数组全部置位成0*/
FORi∶=0TO31BY1DO
Array[i]∶=0;
END_FOR;
当然,FOR......THEN循环语句的应用十分广泛,这里仅是举了一个比较简单的例子。下面再演示一个比较复杂的例子。
下面的例子中,输入条形码,则查询相对货物的数量。注意,货物的数据结构体中是包含条形码的数值和存货数量信息。程序如下:
/*本示例中通过输入条形码来查询货物的数量*/
SIZE(Inventory,0,Inventory_Item);//计算货物的种类数目
FORposition∶=0TOInventory_Item-1DO
IFBarcode=Inventory[position].IDTHEN
Quantity∶=Inventory[position].Qty;//如果条形码的数值等于货物的条形码则显示货物的数目
END_IF;
END_FOR;
4.WHILE......DO语句
如果条件为真,使用WHILE......DO循环连续工作。
(1)格式与语法
WHILEbool_expressionDO
<statement>;
END_WHILE;
上式中:bool_expression为表达式,是判断条件。
这种循环语句的具体做法为:
(2)应用示例
在本例中,要求复制两个数组中的偶数位。具体实现如下:
/*本例复制大小为32的数组中的偶数位*/
WHILEpos<=32DO
dest[pos]∶=sore[pos];//顺序移位
pos∶=pos+2;//指针递加2
END_WHILE;
5.REPEAT......UNTIL语句
该语句同WHILE......DO语句相对应,它的含义是:连续执行某操作,直到条件为真。它同WHILE......DO语句的区别如下:REPEAT......UNTIL执行结构内语句,然后在再次执行语句前判断条件是否为真,这样REPEAT......UNTIL内语句至少执行一次,而WHILE......DO循环中的语句可能一次也不执行。
(1)格式与语法
REPEAT
<statement>;
UNTILbool_expression
END_REPEAT;
在上式中,bool_expression为判断条件。
这种循环的具体做法如下:
REPEAT
<statement>;当bool_expression1为假
时,执行该语句
(2)应用示例
在本例中,要求复制两个数组中的奇数位。具体实现如下:
/*本例复制大小为32的数组中的奇数位*/
pos∶=-1;//初始化指针
REPEAT
pos∶=pos+2;//指针递加2
dest[pos]∶=sore[pos];//顺序移位
UNTILpos>=32
END_REPEAT;
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。