【原创技术分享】TIA Portal 使用SCL的程序控制指令
文中所使用软硬件版本:
TIA Portal V15.1 Professional
S7-1200 (6ES7 214-1AG40-0XB0)
在TIA Portal软件中,西门子提供了多种形式的语言来供编程者选择,其中SCL语言(全称“Structured Control Language”,即“结构化控制语言”)因为它与其它高级语言比较相像(不如说其本身就是基于PASCAL语言)这个特征而非常受欢迎。
本文将简单讲解在TIA Portal软件中使用SCL语言进行编程的方法及SCL中常用的程序控制指令,当了解这部分后,其它SCL指令的使用就如同在LAD中一样,希望能够给没接触过SCL语言的同志提供入门级别的帮助。
在讲解之前,本文默认读者懂得SCL中的一些最简单的运算符的含义,如算数、关系、逻辑运算符等,若读者没有这方面的知识,其实也可以阅读本文,相信读者也能结合常识,通过下文中的很多例子,推测出运算符的含义。
一、如何使用SCL语言
如同使用经典的LAD一样,当我们建立一个PLC后,创建FB、FC、OB块时可以选择编程语言为SCL,如图1.1;或者在LAD编程语言的块中也可以插入一个SCL程序段,如图1.2。但当选择SCL为块语言时,将无法再插入LAD程序段,这点还请注意。(本文使用整个SCL程序块进行讲解。)
图1.1 添加一个SCL块
图1.2 在LAD块中插入一段SCL
二、如何进行SCL中常用的程序控制指令的编程
在创建一个以SCL进行程序编辑的程序块后,在右侧指令集中可以看见程序控制指令,这里将简单讲解其中几个有条件才能进行的控制指令:
”IF...THEN...ELSIF...THEN...ELSE...END_IF”、
”CASE...OF...ELSE...END_CASE”、
”FOR...TO...BY...DO...END_FOR”、
”WHILE...DO...END_WHILE”、
”REPEAT...UNTIL...END_REPEAT” 、
”REGION...END_REGION”
以及一些简单的控制指令:
”CONTINUE”、
”EXIT”、
”RETURN”、
”GOTO”
1、使用IF进行条件判断(条件多分支)
”IF<表达式>THEN<语句1>ELSIF<表达式X>THEN<语句X>ELSE<语句X+1>END_IF”
基本的使用方法如下:
当执行到IF时,进行表达式1的运算,当计算值为TRUE,则执行语句1并结束IF;若计算值为FALSE,则继续计算ELSIF中的表达式X,同样地,若表达式X计算值为TRUE,则执行语句X并结束IF,当前方的表达式的计算结果全为FALSE的话,那么当执行到达ELSE时,直接执行ELSE后的语句X+1并结束IF。
注:表达式位置可以使用逻辑表达式或比较表达式,执行IF时先将其内部的表达式进行运算,返回的结果应为TRUE或FALSE,当使用IF时可以与其它的程序控制指令进行嵌套,如FOR、WHILE、CASE等。
图2.1—图2.3是简单的条件判断实例:
图2.1 执行第一段语句
图2.2 执行第二段语句
图2.3 执行第三段语句
2、使用CASE进行分支选择(多分支选择)
”CASE<表达式>OF<常量范围X>:<语句X>ELSE:<语句X+1>END_CASE”
基本的使用方法如下:
进行CASE选择时,先进行表达式的运算,使用运算结果进行分支选择,当运算结果在常量范围X所规定的范围内时,执行常量范围X所对应的语句X,当没有一个范围包含表达式的结果时,则执行ELSE中的语句,最后结束CASE。
注:与IF的相同点是可以根据条件来选择执行一种分支,不同点是相较于IF计算得一个布尔值来说,CASE的表达式位置计算所得的应是一个整数值,PLC利用这里计算所得的整数与下面所列的常量范围进行比较;同时,相较于IF中每个ELSIF位置的表达式都不同,每次都需要进行表达式的运算来说,CASE部分的表达式只计算一次,而后进行的仅仅是所得数值与范围的比较。这里常量范围的位置上支持单个整数、多个整数、整数范围以及多个整数与多个整数范围的枚举这几种形式。
图2.4—图2.6是简单的分支选择实例:
图2.4 CASE结果为1时
图2.5 CASE结果为2时
图2.6 CASE结果为4时
3、利用FOR进行循环执行(在按步宽计数循环中执行)
”FOR<变量>:=<初值>TO<末值>BY<步长>DO<语句>END_FOR”
基本的使用方法如下:
执行FOR时,先给变量赋初值,之后执行语句,再根据变量增加步长的大小,判断是否达到末值,若没达到则继续执行与判断,若达到则结束FOR。
注:同样的,我们可以在FOR内部嵌套一些如IF、CASE等的指令,FOR的第一次循环时是在将初值赋值给变量后直接开始的,在超过循环边界后停止循环,即当末值等于当前值时执行最后一次,若当前值超过末值时,停止执行。这意味着一个首5尾1步长-1的FOR循环会执行5次,其循环变量在循环期间经历5、4、3、2、1这五个值,最后由于进行-1运算,退出循环时循环变量的末值为0,即用作循环的变量的值一共改变了5次。
当心:在使用FOR循环与数组时,需要保证FOR循环所能遍历到的数组元素都是数组内存在的,否则PLC在执行到错误位置时会报错为“区域长度错误”,且红灯闪烁。这是由于PLC试图去寻址一个本没有被定义的位置,但这个错误不会影响PLC的正常运行,PLC会自动地忽略这条指令并继续执行后面的程序,这是将FOR循环指令与数组同时使用时的常见错误之一,同样的错误也经常在使用WHILE和REPEAT时出现。
图2.7是简单的循环执行实例:
图2.7 FOR循环的运行实例
4、利用WHILE当条件为真进行循环(满足条件时运行)
”WHILE<表达式>DO<语句>END_WHILE”
基本的使用方法如下:
在执行WHILE时,先进行表达式的运算,若结果为TRUE,则执行语句作为一轮循环,每次循环开始进行一次运算,当存在一次表达式的值为FALSE时则结束循环。
注:这里的表达式返回值为TRUE或FALSE,也当然可以使用逻辑表达式或比较表达式。在执行前先进行判断的运行形式意味着当PLC执行到WHILE语句的开始位置后,可能一次都执行不到WHILE内部的语句,相较于FOR只要执行到FOR语句,其内部的语句必定会执行一次的运行方式,WHLIE可以避免不必要的语句的执行。
图2.8是简单的当条件为真进行循环执行实例(注意这里添加了起始值):
图2.8 变量值小于4则把对应的数组元素赋值
5、利用REPEAT当条件为假时进行循环(不满足条件时运行)
”REPEAT<语句>UNTIL<表达式>END_REPEAT”
基本的使用方法如下:
当执行到REPEAT时,执行其中语句,然后运算表达式,当表达式值为FALSE时继续循环,直到表达式值为TRUE,结束REPEAT。
注:先执行后判断的运行方式与FOR循环异曲同工。表达式处的计算值需为布尔类型,可以使用逻辑表达式或比较表达式进行多种情况的选择处理。
图2.9是简单的当条件为假进行循环执行实例:
图2.9 变量值不等于5则对对应的数组元素进行赋值
6、”REGION...END_REGION”建立区域(组织源代码)、
”CONTINUE”提前结束本轮循环(核对循环条件)、
”EXIT”跳出循环(立即退出循环)、
”RETURN”退出块、
”GOTO”跳转。
REGION:REGION可以用来创建一个区域,这个区域在SCL编辑器左侧会有显示,而且整个区域可以进行收缩和展开,合理地利用区域并与使用注释相结合,会使得你的程序条理清晰,简洁易懂。
注:不能跨嵌套层级建立区域,区域内部不能包含不完整的指令,哪怕这个指令在区域外会完整地结束,也不能使区域内部只包含这个指令的其中一部分。简单地说,REGION只能收起一段完整的指令。
图2.10是实例:
图2.10 REGION的例子
CONTINUE与EXIT:CONTINUE用来结束本轮循环。它常与IF一起使用,作为满足条件时不执行本轮循环下面的语句,核对是否到达循环的边界,并判断是否应该继续进行下一轮循环。EXIT与CONTINUE类似,相较于CONTINUE只提前结束一轮循环来讲,EXIT则是无论在本轮结束后循环还可能执行多少次,都直接跳出这个循环,若有多层循环嵌套则跳出所在的那一层。这两者与IF的同时使用都可以做到有选择性的执行循环中的一部分。
图2.11是实例:
图2.11 把CONTINUE与EXIT进行比较与展示
RETURN:RETURN指令可以退出块,当程序执行到EXIT时,本程序块的后面的所有语句都将不执行,从程序块退出返回到调用的上一级,并返回运算结果。将其与IF同时使用可以进行选择性地退出程序块。由于每个块在执行到末尾时会自动地退出块,所以当把RETURN放在整个块的末尾时,达到的效果与没有放置是一样的。
图2.12是实例:
图2.12 退出块RETURN后的程序不会执行
GOTO:GOTO是跳转指令,能够使程序从一个位置直接跳转到另一个位置继续执行。允许同一个标签(即所要跳转到的位置)被多个GOTO指向,但一个GOTO不能指向多个标签。需要注意的是GOTO指令能从条件语句、循环语句中跳出,但不能跳入,也可以理解为标签不能在判断或循环指令内。
注:程序中使用过多的GOTO指令时会极大地提高程序的阅读难度,使得程序维护起来格外困难。
图2.13是实例:
图2.13 利用GOTO跳转到本应不执行的程序位置(标签Next)
三、总结
至此,本文已经对SCL程序编辑语言中部分程序控制指令的用法进行了讲解,并在每个指令讲解其后都附有例子。
文中对于其指令用法的讲解部分,以及例子中所展示的部分不可能覆盖这些程序控制指令的全部用法以及其使用时的全部注意事项。本文所进行的讲解是希望能在给同志们入门的同时,激发同志们研究指令使用技巧的兴趣。至于循环指令的选择、每种指令对程序运行的耗时以及对PLC空间的占用情况等具体细节则不进行讲解。
指令不是会用就行,而是要琢磨如何用得更好,活学活用这些指令来写出好的程序,能够对PLC的整体良好运行产生莫大帮助,也为后人维护带来极大的方便,而这应该在掌握好基础后花时间来慢慢积累经验。