1200 SCL学习笔记
一. IF. 如果。下面是一个起保停
IF #I_start AND NOT #I_stop THEN //如果I_start接通 和 I_stop没有接通#Q_run := 1; //输出Q_run 接通
ELSIF #I_stop THEN //如果I_stop接通#Q_run := 0; //。。。。。。
END_IF;
二. CASE
CASE #NUM OF1: // 如果NUM=1#Q_run_1 := 1;2..4: // 如果NUM = 2 到 4#Q_run_2 := 1;ELSE // 否则...#Q_run_1 := 0;#Q_run_2 := 0;
END_CASE;
三. for
1. 首次循环时,循环变量被赋起始值,然后执行代码。结束后,循环变量的值与步值相
加,然后判断是否超出结束值,如果没有超出,则执行代码;如果超出,则跳出FOR循环,继续执行END_FOR后面的代码。
注意以下几点:
① 起始值与结束值在循环过程中不能更改;
② 步值可以是正数,也可以是负数,不能为0;
③ 如果步值是正数,则结束值要大于等于起始值;
④ 如果步值是负数,则结束值要小于等于起始值;
⑤ 如果没有使用BY关键字指明步值,则默认为1
2. 如下图所示,num一直到了6(1,2....6)。 但是内部的程序只执行了5次。
#sta_sum := 0;FOR #num := 1 TO 5 DO#sta_sum := #sta_sum + 2;END_FOR;// 0-2
// 2-4
// 4-6
// 6-8
// 8-10
四. 上升沿检测 和 下降沿
1. 举个例子:假设使用I0.0(变量名:start)连接的按钮的上升沿来启动某个电机。启动
按钮连接常开触点,正常情况下I0.0的值为0,当按下按钮时,I0.0的值为1;继电器线圈连
接输出地址Q0.0(变量名:motor),中间变量M0.0(变量名:interFlag)用来保存上升沿
的状态。SCL程序代码如图8-3所示
"R_TRIG_DB_1"(CLK:=#start, // start----I0.0Q=>#P_Start); // P_Start--脉冲IF #P_Start THEN // 监控#P_Start 来控制输出#Q_RUN := 1;
END_IF;
五. 定时器
以延时接通定时器为例
#T.T1(IN:=#start, // IN 启动信号PT:=#TimeSET, // PT 设定值Q=>#Q_RUN, // Q 输出ET=>#Q_ET); // ET 定时器当前值
六. 计数器(ctu加计数器为例)
七. 移动指令
1. MOVE_BLK指令。
(1). 该指令可以从一个存储区地址拷贝一定数量的数据到另一个存储区,拷贝的数据必须是
相同的数据类型.
(2). MOVE_BLK指令移动的数据必须存放在数组中。
MOVE_BLK(IN:="数据块_1".ARR_1[0], // 源数据中的第一个元素COUNT:=3, // 要拷贝的数据的个数OUT=>"数据块_1".ARR_2[0]); // 目标数据中的第一个元素
2. UMOVE_BLK: 指令与MOVE_BLK指令的参数及用法都相同。唯一不同的地方是:
UMOVE_BLK指令的执行过程不会被中断,这使它很适合用于一些重要的、不希望被中断的数据拷贝。
3. FILL_BLK指令
该指令用指定的数据来填充存储区中的某段区域,操作的目标是数组。
该指令有3个参数:
① IN:用来填充的数据,可以是整数、实数、字符、日期时间等数据类型。
② COUNT:要填充的数据个数,可以是USINT、UINT或者UDINT类型。
③ OUT:要填充的目标地址(数组)。
FILL_BLK(IN:=16#ff,COUNT:=10,OUT=>"数据块_1".ARR_2[0]);
八. 转换指令
1. ROUND: 取整
// ROUND指令. 将[实数]四舍五入,变成[DINT]
"Tag_22" := ROUND(real#1.8); // 返回2
2. CEIL : 向上取整
// CELL 向上取整 返回值:2
"Tag_22" := CEIL(real#1.1);