一、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 -“退出块”指令,终止当前块的程序执行,返回调用块中继续执行后续程序。