SCL作为一种编程语言,可以实现LAD/FBD所有的功能,大多数的指令与LAD/FBD都是相同的,只是在编辑器中的外形不同。只有一些指令使用是不太一样的甚至LAD/FBD没有的,这里只介绍这些不同的。 SCL特殊的指令有以下几种,如图1-3红框中的指令: 图1 读写存储器 图2 转换操作 图3 程序控制指令 在这三部分中,读写存储器的PEEK POKE指令可以参考链接,转换操作可以参考链接,这里只介绍图3的程序控制指令。 程序控制指令见以下表格。
程序控制指令是SCL编程的基础,接近高级语言的指令,虽然这些功能通过LAD/FBD也可以实现,但使用SCL编写会更加方便,逻辑条理也更加清晰。 说明:使用'条件执行'指令,可以根据条件控制程序流的分支。该条件是结果为布尔值(True 或 False)的表达式。可以将Bool变量、逻辑表达式或比较表达式作为条件。 执行该条件执行指令时,将对指定的表达式进行运算。如果表达式的值为 True,则表示满足该条件;如果其值为 False,则表示不满足该条件。 参数 根据分支的类型,可以对以下形式的指令进行编程:
图4 IF...THEN... 分支 如果满足该条件,则将执行 THEN 后编写的指令。如果不满足该条件,则程序将从 END_IF 后的下一条指令开始继续执行。
图5 IF...THEN... ELSE...分支 如果满足该条件,则将执行 THEN 后编写的语句。如果不满足该条件,则将执行 ELSE 后编写的语句。不论执行哪一个语句,之后都将从 END_IF 后的下一条指令开始继续执行。
图6 IF...THEN... ELSIF...分支 如果满足条件1,则将执行 THEN 后的语句1,执行这些语句后,程序将从 END_IF 后继续执行。 如果不满足条件1,则将检查条件2。如果满足条件2,则将执行 THEN 后的语句2。执行这些语句后,程序将从 END_IF 后继续执行。 如果不满足任何条件,则直接执行 END_IF 后的程序部分。 在 IF 指令内可以嵌套任意多个 ELSIF 和 THEN 组合。可以选择对 ELSE 分支进行编程。 参数 下表列出了该指令的参数:
示例 图7 IF示例 下表展示了不同的操作数数值对目标变量的影响:
说明:使用'创建多路分支'指令,可以根据数字表达式的值执行多个指令序列中的一个。 按如下方式声明此指令: CASE <变量> OF <常数1>: <语句1>; <常数2>: <语句2>; ...... <常数n>: <语句n>; ELSE <语句>; END_CASE; 图8 CASE语句 参数 下表列出了该指令的参数:
* TIA PORTAL V16开始支持位序列数据类型的变量 示例 图9 CASE示例 下表展示了不同的操作数数值对目标变量的影响:
说明:使用'在计数循环中执行'指令,重复执行程序循环,直至运行变量不在指定的取值范围内。 也可以嵌套程序循环。在程序循环内,可以编写包含其它运行变量的其它程序循环。 通过指令'复查循环条件'(Continue),可以终止当前正在运行的程序循环。通过指令'立即退出循环'(Exit)终止整个循环的执行。 注意: 有关运行次数和运行变量的信息: 程序运行时无法更改运行次数。出于性能原因,应在块接口的'Temp'部分中声明运行变量。在循环中,该运行变量无法更改。 按如下方式声明此指令: FOR <运行变量> := <起始值> TO <结束值> BY <增量> DO <语句>; END_FOR; 如果增量为1,可以简写为: FOR <运行变量> := <起始值> TO <结束值> DO <语句>; END_FOR; 图10 FOR语句 下表列出了该指令的参数:
*TIA PORTAL V16开始支持无符号整数类型的变量 示例 图11 FOR示例 Tag_Value 操作数乘以b_array 数组变量的元素 (2, 4, 6, 8)。并将计算结果读入到a_array 数组变量的元素 (2, 4, 6, 8) 中。 下表展示了给定 Tag_Value 与 b_array[i] 的值得到 a_array[i] 的结果:
说明:使用'满足条件时执行'指令可以重复执行程序循环,直至不满足执行条件为止。该条件是结果为布尔值(True 或 False)的表达式。可以将逻辑表达式或比较表达式作为条件。 执行该指令时,将对指定的表达式进行运算。如果表达式的值为 True,则表示满足该条件;如果其值为 False,则表示不满足该条件。 也可以嵌套程序循环。在程序循环内,可以编写包含其它运行变量的其它程序循环。 通过指令'复查循环条件'(Continue),可以终止当前连续运行的程序循环。通过指令'立即退出循环'(Exit)终止整个循环的执行。 可按如下方式声明此指令: WHILE <条件> DO <语句>; END_WHILE; 图12 WHILE语句 参数 下表列出了该指令的参数:
示例 图13 WHILE示例 下表展示了循环初始和循环结束时变量值的变化
说明:使用'不满足条件时执行'指令可以重复执行程序循环,直至不满足执行条件为止。该条件是结果为布尔值(True 或 False)的表达式。可以将逻辑表达式或比较表达式作为条件。 执行该指令时,将对指定的表达式进行运算。如果表达式的值为 True,则表示满足该条件;如果其值为 False,则表示不满足该条件。 即使满足终止条件,至少也会执行一次循环内的语句。 也可以嵌套程序循环。在程序循环内,可以编写包含其它运行变量的其它程序循环。 通过指令'复查循环条件'(Continue),可以终止当前连续运行的程序循环。通过指令'立即退出循环'(Exit)终止整个循环的执行。 可按如下方式声明此指令: REPEAT <语句>; UNTIL <条件> END_REPEAT; 图14 REPEAT语句 参数 下表列出了该指令的参数:
示例 图15 REPEAT示例 下表展示了循环初始和循环结束时变量值的变化
说明:使用'复查循环条件'指令,可以结束 FOR、WHILE 或 REPEAT 循环的当前程序运行。 执行该指令后,将再次计算继续执行程序循环的条件。该指令将影响其所在的程序循环。 图16 CONTINUE用在FOR循环 图17 CONTINUE用在WHILE循环 图18 CONTINUE用在REPEAT循环 示例 图19 CONTINUE示例 下表展示了计算结果:
如果满足条件 i < 5,则不执行后续值分配 ('DB10'.Test[i] := 1)。运行变量 (i) 以增量'1'递增,然后检查其当前值是否在设定的循环取值范围内。如果执行变量在循环取值范围内,则将再次计算 IF 的条件。 如果不满足条件 i < 5,则将执行后续值分配 ('DB10'.Test[i] := 1) 并开始一个新循环。在这种情况下,执行变量也会以增量'1'进行递增并接受检查。 说明:使用'立即退出循环'指令,可以随时取消 FOR、WHILE 或 REPEAT 循环的执行,而无需考虑是否满足条件,并在循环结束(END_FOR、END_WHILE 或 END_REPEAT)后继续执行程序。 该指令将影响其所在的程序循环。 图20 EXIT语句 示例 图21 EXIT示例 下表展示了计算结果:
如果满足条件 i > 5,则将取消循环执行。程序将从 END_FOR 后继续执行。 如果不满足条件 i <= 5,则将执行后续值分配 ('DB10'.Test[i] :=1) 并开始一个新循环。将运行变量 (i) 以 1 进行递增,并进行检查该变量的当前值是否在程序中设定的循环取值范围之内。如果执行变量 (i) 在循环取值范围内,则将再次计算 IF 的条件。 说明:使用'跳转'指令,可以从标注为跳转标签的指定点开始继续执行程序。 跳转标签和'跳转'指令必须在同一个块中。在一个块中,跳转标签的名称只能指定一次。每个跳转标签可以是多个跳转指令的目标。不允许从'外部'跳转到程序循环内,但允许从循环内跳转到'外部'。 注意: LAD/FBD语言内的SCL段,不能使用GOTO指令。 跳转标签遵循以下语法规则:
可按如下方式声明此指令: GOTO <跳转标签>; ... <跳转标签>: <语句> 示例 图22 GOTO示例 下表展示了每个操作数数值对目标变量的变化影响:
根据'Tag_Value'操作数的值,程序将从对应的跳转标签标识点开始继续执行。例如,如果'Tag_Value'操作数的值为 2,则程序将从跳转标签'MyLABEL2'开始继续执行。在这种情况下,将跳过'MyLABEL1'跳转标签所标识的程序行。 说明:使用'退出块'指令,可以终止当前处理块中的程序执行,并在调用块中继续执行。 如果该指令出现在块结尾处,则可以跳过。 图23 RETURN语句 示例 图24 RETURN示例 如果'Tag_Error'操作数的信号状态不为 0,则将终止当前处理块中的程序执行。 End 文章来源:百舜NET,本文系网络转载,版权归原作者所有。如有侵权,请联系删除。 |
|
来自: 金玉满堂jjnla8 > 《SCL》