首页 理论教育 ControlLogixST编程结构与示例

ControlLogixST编程结构与示例

时间:2023-11-19 理论教育 版权反馈
【摘要】:2)每个ELSIF表示一个选择路径。表3-11 IF、THEN、ELSIF和ELSE语句使用总结应用示例如果有以下的要求:若判断条件大于3则停止运行传送带并且报警置位。

ControlLogixST编程结构与示例

1.IF......THEN语句

当特定条件发生时,使用IF......THEN语句执行某项操作。

(1)格式与语法

一般情况下的格式为:

IFbool_expressionTHEN

statement>;

ENDI_F

注意,上面的bool_expression为标签表达式,计算结果为布尔量。

这种格式也常和ELSIF以及ELSE结合起来构成多种选择结构,如下所示:

978-7-111-42627-1-Chapter03-115.jpg

使用上面的格式时需要注意以下几点:

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语句使用总结

978-7-111-42627-1-Chapter03-116.jpg

(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//如果液位上下限位开关都有信号,则阀打开

ELSEIFNOTwater.HighTHEN

Water.Inlet∶=0//如果液位低于上限开关,则阀关闭

END_IF

如果有以下要求:若罐温度大于200℃,则泵快速运行;如果罐温度大于100℃,则泵缓慢运行;否则泵停止运行。

/*通过温度大小来决定泵的运行状态*/

IFtank.temp>200THEN

pump.fast∶=1pump.slow∶=0pump.off∶=0

//如果温度大于200℃,则泵快速运行

ELSEIFtank.temp>100THEN

Pump.fast∶=0pump.slow∶=1pump.off∶=0

//如果温度大于100℃,则泵慢速运行

ELSE

Pump.fast∶=0pump.slow∶=0pump.off∶=1

//其他情况下,泵停止运行

END_IF

2.CASE......OF语句

使用CASE语句根据数值来选择执行的操作。

(1)格式与语法

一般情况下的格式为:

CASEnumeri_cexpressionOF

selector1∶statement

selectorN∶statement

ELSE

statement

END_CASE

注意,上面的numeric_expression为标签表达式,selector为选择器。

这种选择语句的具体做法如下所示:

978-7-111-42627-1-Chapter03-117.jpg

(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

1Ingredient_A.Outlet_1∶=1

Ingredient_B.Outlet_4∶=1//如果配方号是1,则成分A的1号出口和成分B的4号出口打开

23Ingredient_A.Outlet_4∶=1

Ingredient_B.Outlet_2∶=1//如果配方号是2或3,则成分A的4号出口和成分B的2号出口打开

4...7Ingredient_A.Outlet_4∶=1;(www.xing528.com)

Ingredient_B.Outlet_1∶=1//如果配方号是4、5、6、7,则成分A的4号出口和成分B的1号出口打开

811...13Ingredient_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是增量值。这种选择语句的具体做法如下所示:

978-7-111-42627-1-Chapter03-118.jpg

(2)应用示例

下面示例使用FOR......DO循环将一个32个元素的数组全部置位成0。

/*本示例使用FOR......DO循环将一个32个元素的数组全部置位成0*/

FORi∶=0TO31BY1DO

Array[i]∶=0

END_FOR

当然,FOR......THEN循环语句的应用十分广泛,这里仅是举了一个比较简单的例子。下面再演示一个比较复杂的例子。

下面的例子中,输入条形码,则查询相对货物的数量。注意,货物的数据结构体中是包含条形码的数值和存货数量信息。程序如下:

/*本示例中通过输入条形码来查询货物的数量*/

SIZEInventory0Inventory_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为表达式,是判断条件。

这种循环语句的具体做法为:

978-7-111-42627-1-Chapter03-119.jpg

(2)应用示例

在本例中,要求复制两个数组中的偶数位。具体实现如下:

/*本例复制大小为32的数组中的偶数位*/

pos∶=0初始化指针

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为假

时,执行该语句

978-7-111-42627-1-Chapter03-120.jpg

(2)应用示例

在本例中,要求复制两个数组中的奇数位。具体实现如下:

/*本例复制大小为32的数组中的奇数位*/

pos∶=-1//初始化指针

REPEAT

pos∶=pos+2//指针递加2

dest[pos]∶=sore[pos];//顺序移位

UNTILpos>=32

END_REPEAT

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈