西门子PLC-结构化控制语言SCL(西门子scl语言实例)

一、SCL编辑器的使用方法


工作区


FC与FB的区别


注释


书签


格式优化


SCL编辑器显示设置


SCL块接口区显示设置


监视


断点测试

二、SCL运算符总览

操作

运算符

功能

赋值

:=

赋值运算

括号

()

限定表达式或参数列表

位逻辑

NOT

取反运算


AND,&

与逻辑运算


OR

或逻辑运算


XOR

异或逻辑运算

比较

<,<=,>,>=,=,<>

构成关系表达式

数学运算

+,-

正、负(符合)


+,-

加法、减法运算


*,/

乘法、除法运算


**

幂运算


MOD

余数运算

举例:

赋值
//单赋值运算
#a:=#b;  //将变量#b的值赋值给变量#a

//多赋值运算
#a:=#b:=#c;  //将变量#c的值赋值给变量#b,再将变量#b的值赋值给变量#a

//组合赋值运算
#a+=#b; //赋值运算过程等同于#a:=#a+#b;
#a+=#b+=#c*=#d; //按一下顺序进行赋值运算
                                //#c:=#c*#d;
                                //#b:=#b+#c;
                                //#a:=#a+#b;
括号的用法
//限定范围
#a>=(#b+#c);
//限定顺序
#a:=#b*(#c+#d);
//参数列表
“IEC_TImer_DB".TON(IN:=#a
                                     PT:=#b
                                     Q=>#c
                                     ET=>#d);

位逻辑
//逻辑运算
NOT#a_BOOL,
#a_BOOL  AND #b_BOOL ,
#a_BOOL  OR #b_BOOL ,
#a_BOOL  XOR #b_BOOL , 

比较
//比较运算(数据类型可以是整数,浮点数,字符串等,但是要确保第一操作数和第二操作数类型一致)
#a<#b,
#a<=#b, a>#b,
#a>=#b,
#a<>#b,
#a=#b
  
数学运算
//基本数学运算 +,-,*,/,**,MOD
#a+#b,
#a-#b,  
#a*#b,
#a/#b,  
#a**2,
  #a MOD #b, 
//复杂数学运算 ABS,SQR,SQRT,LN,EXP,SIN,COS,TAN,ASIN,ACOS,ATAN
#a := SQR(#b);
#a := SQR(#b);
#a := ATAN(#b);

三、运算符的优先级

数学运算

运算符

优先级

运算

+,-

2

一元加法、减法

**

3

幂运算

*,/

4

乘法,除法

+,-

5

加法、减法

+=,-=,*=,/=

11

组合赋值运算

位逻辑

运算符

优先级

运算

NOT

3

取反

AND,&

8

与逻辑运算

XOR

9

异或逻辑运算

OR

10

或逻辑运算

比较

运算符

优先级

运算

<,<=,>,>=

6

小于、小于等于、大于、大于等于

=,<>

7

等于、不等于

引用、括号、赋值

运算符

优先级

运算

^

1

取消引用

?=

11

赋值尝试

()

1

括号

:=

11

赋值

四、SCL表达式

//算数表达式
#a:=#a+1;
//数据类型转换  小范围→大范围    低精度→高精度
#Angel_REAL :=3.14*ATAN_REAL((#Y2_INT-Y1_INT)/(#X2_INT-X1_INT));
//关系表达式
IF #a=#b THEN #c:=TRUE;
IF#a>20 AND #b<20 THEN #c:=TRUE;
IF#a<>(#b AND #c) THEN #c:=FALSE;
//逻辑表达式
IF #a_BOOL AND NOT #b_BOOL THEN #c:=#a_BOOL OR #b_BOOL;
IF #B LB= FALSE OR #L AutomatiC= FALSE THEN
#ConveyorRight Automatic := FALSE;
ELSIF #B Bay1 =TRUE AND #B Bay2 =FALSE AND #S Bay1 = TRUE THEN
#ConveyorRight Automatic :=TRUE;
ELSIF #B Bay1 =FALSE AND #B Bay2 = TRUE AND #S Bay2 =TRUE THEN
#ConveyorRight Automatic :=TRUE;
END IF;

五、SCL程序控制语句

语句类型

语句类型

功能

语句类型

IF

根据BOOL表达式选择程序分支


CASE

根据整数或位字符串选择程序分支

循环程序

FOR

循环次数已知的循环程序


WHILE

先判断后执行的循环程序


REPEAT

REPEAT

退出循环

CONTINUE

终止当前循环


EXIT

出当前循环

跳转

GOTO

块内跳转


RETURN

终止子程序并返回主调块

IF举例:





//基本 IF 语句模板
IF_condition_THEN
         ;//Statement section lF
END IF;

//复合 IF 语句模板
IF condition THEN
         ;//Statement section lF
ELSE
         ;//Statement section ELSE
END IF;

//嵌套 IF 语句模板
IF_condition_ THEN
           ; //lStatement section lF
ELSIF condition THEN
          ;//Statement section ELSEIF
ELSE
          ;//Statement section ELSE
END IF;

CASE语句举例



CASE #a INT OF
       1: #Cal := #b INT+ #c INT; // Statement section case 1
       2: #Cal := #b INT- #c INT; //Statement section case 2
       3: #Cal := #b lNT * #c INT; //Statement section case 3
       4: #Cal := #b INT! #c INT; //Statement section case 4
ELSE
       #Cal := #b INT MOD #c INT; // Statement section ELSE
END CASE;

CASE #a BYTE OF
      1:#Cal :=#b INT+ #c INT; // Statement section case 2#0000 0001
      2:#Cal :=#b INT-#c INT; // Statement section case 2#0000 0010
ELSE
    #Cal := #b INT* #c INT; //l Statement section ELSE
END CASE;

FOR循环程序语句举例:



FOR counter := start count To end count DO
       ;// Statement section FOR
END_FOR;

FOR #i := 1 TO 10 DO
     #array[ #i]:=0;// Statement section FOR
END FOR;

FOR counter : start count To end count BY count step DO
      ;// Statement section FOR
END FOR;
//注意事项
//1、循环变量的初值和终值可以是表达式、变量及常量,
//其数据类型与初值及终值相同只能是有序数据类型,即各种整数数据类型。
//2、在循环执行前,根据初值和终值表达式计算初值和终值,
//并根据计算结果决定循环进行的次数,在循环体中对初值和终值表达式进行改变不会影响循环进行的次数。
//3、循环变量的变动步长由BY关键字设定,在不使用BY关键字的情况下,将使用缺省的变动步长+1。
//4、在循环体中,不允许用户通过程序语句对循环变量的值进行变动,否则编译器将提示语法错误。

WHILE语句举例



//WHILE 语句模板
WHILE condition Do
         ;// Statement section WHILE
END WHILE;
//WHILE 语句示例
WHILE #i< 10 DO
#Array[ #i]:=0; //Statement section WHILE
#i := #i+ 1;
END WHILE:

REPEAT语句


//REPEAT 语句模板
REPEAT
      ;// Statement sectiOn REPEAT
UNTIL conditiOn END REPEAT:

//REPEAT 语句示例
REPEAT
       #Array[ #i]:=0: // Statement sectiOn REPEAT
       #i := #i+ 1;
UNTIL #i> 10 END REPEAT;

REPEAT 与 WHILE 对比

1、REPEAT循环是在执行循环体之后检查布尔表达式,所以循环至少执行一次;而WHILE 循环是在执行循环体之前检查布尔表达式,如果值为假,则循环体一次也不会执行。

2、REPEAT循环在布尔表达式的值为真时结束循环,为假时继续循环;而 WHILE循环在布尔表达式的值为真时执行循环,为假时结束循环。

EXIT退出循环语句和跳转语句

//EXIT 语句示例
FOR #i:=1 TO 10 DO
       IF #array[ #i ]= #a THEN // Statement section FOR
       EXIT;
       END IF;
END FOR;

//跳转语句
//GOTO 语句、RETURN 语句示例
CASE #a BYTE OF
     1:GOTo branch1;// Statement section case 2#0000 0001
      2:GOTo branch2;//l Statement section case 2#0000 0010
ELSE
       GOTo exit; // Statement section ELSE
END CASE;
  _branch1://Statement section branch1
          #Cal := #b INT+ #C INT;
            GoTo exit;
  _branch2:1 Statement section branch2
           #Cal :=#b INT- #C INT;
           GOTo exit;
_exit:// Statement section exit
RETURN;

//注意事项
//跳转标签和 GOTO 指令必须在同一个块中。
//在一个块中,跳转标签的名称只能指定一次。每个跳转标签可以是多个跳转指令的目标。
//不允许从循环程序外跳转到循环程序内,
//但允许从循环程序内跳转到循环外程序LAD 中嵌入的 SCL段无法使用 GOTO 指令
//RETURN -“退出块”指令,终止当前块的程序执行,返回调用块中继续执行后续程序。
原文链接:,转发请注明来源!