使用SCL编写小应用:四节传送带模拟和机械手模拟控制
文章目录
目录
前言
前面我们学习了第1个面向对象编程,使用FB块和形参;本章继续来练习两个scl语言应用!
一、四节传送带模拟控制
1.控制要求
M1-M4 是四条皮带机运转指示,A、B、C、D 是四条皮带机故障输入。
起动后,先起动最末的皮带机 M4,1s 后再依次起动 M3,1s 后再依次起动 M2,1s 后
再依次起动 M1;停止时,先停止皮带机 M1,1s 后再停止 M2,1s 后再停止 M3,1s 后再停
止 M4;当某条皮带机有重物时,该皮带机前面的应立即停止,该皮带机运行 1s 后停止,再
1s 后接下去的一台停止,依此类推。
2.参考图
这里M1到M4用指示灯表示,4个开关表示4个故障输入,右下角是ON和OFF。
3.接线图和I/0分配
I/0分配:
输入 | 输出 | ||||
---|---|---|---|---|---|
名称 | 作用 | 地址 | 名称 | 作用 | 地址 |
ON | 启动 | I0.0 | M1 | 电机1 | Q0.0 |
OFF | 停止 | I0.2 | M2 | 电机2 | Q0.1 |
A | 故障输入 | I0.3 | M3 | 电机3 | Q0.3 |
B | 故障输入 | I0.4 | M4 | 电机4 | Q0.3 |
C | 故障输入 | I0.5 | |||
D | 故障输入 | I0.6 |
接线图:
这里PLC的输入和输出接上断路器是防止短路。
4.编写程序
看题可以发现,这里主要有三点:逆序启动,顺序停止,故障输入。
1.逆序启动
起动后,先起动最末的皮带机 M4,1s 后再依次起动 M3,1s 后再依次起动 M2,1s 后再依次起动 M1;
这里可以用一个1秒脉冲来触发启动,使用1s的上升沿来对A变量进行加1,再用case语句进行判断,启动就可以完成了。
#T[1].TON(IN := #启动标志 & NOT #SC ,
PT := T#1s,
Q => #SC);
#P_R[1](CLK := #SC);
IF #P_R[1].Q THEN
#A := #A + 1;
END_IF;
//启动部分
CASE #A OF
0:
IF #启动 THEN
#C := 0;
#M4 := 1;
#启动标志 := 1;
END_IF;
1:
#M3 := 1;
2:
#M2 := 1;
3:
#M1 := 1;
#启动标志 := 0;
#A := 0;
END_CASE;
2.顺序停止
和启动的思路相同,用case语句来实现:
#T[2].TON(IN := #标志2 & NOT #SC1,
PT := T#1s,
Q => #SC1);
#P_R[2](CLK := #SC1);
IF #P_R[2].Q THEN
#B := #B + 1;
END_IF;
//停止部分
CASE #B OF
0:
IF #停止 & NOT #启动标志 THEN
#标志2 := 1;
#M1 := 0;
END_IF;
1:
#M2 := 0;
2:
#M3 := 0;
3:
#M4 := 0;
#标志2 := 0;
#B := 0;
END_CASE;
3.故障输入
当某条皮带机有重物时,该皮带机前面的应立即停止,该皮带机运行 1s 后停止,再1s 后接下去的一台停止,依此类推。
可以用M2来示例:当故障输入B被按下,前面的M1立即停止,M2运行1s停止,M3和M4相同。
既然还是都是1s那就可以用1个定时器来脉冲:
进入case语句后先判断是哪个故障输入,如果是B就将C赋值为2,上一台电机M1清零,当C不等于0的时候,定时器触发产生脉冲,对D进行++,然后在下面的小case语句中,将M2,M3,M4间隔1s停止,最后将变量清零,就结束。另外3个相同。
#T[3].TON(IN := #C <> 0 & NOT #SC2 ,
PT := T#1s,
Q => #SC2);
#P_R[3](CLK := #SC2);
IF #P_R[3].Q THEN
#D := #D + 1;
END_IF;
//故障输入部分
CASE #C OF
0:
IF #故障输入1 THEN
#C := 1;
;
ELSIF #故障输入2 THEN
#M1 := 0;
#C := 2;
;
ELSIF #故障输入3 THEN
#M1 := 0;
#M2 := 0;
#C := 3;
;
ELSIF #故障输入4 THEN
#M1 := 0;
#M2 := 0;
#M3 := 0;
#C := 4;
;
END_IF;
1:
CASE #D OF
1:
#M1 := 0;
2:
#M2 := 0;
3:
#M3 := 0;
4:
#M4 := 0;
#B := 0;
#C := 0;
#D := 0;
END_CASE;
2:
CASE #D OF
1:
#M2 := 0;
2:
#M3 := 0;
3:
#M4 := 0;
#B := 0;
#C := 0;
#D := 0;
END_CASE;
3:
CASE #D OF
1:
#M3 := 0;
2:
#M4 := 0;
#B := 0;
#C := 0;
#D := 0;
END_CASE;
4:
CASE #D OF
1:
#M4 := 0;
#B := 0;
#C := 0;
#D := 0;
END_CASE;
END_CASE;
4.调试
最后在主程序调用,写入相应的变量就完成啦!
5.完整代码
(*#M1-M4 是四条皮带机运转指示,A、B、C、D 是四条皮带机故障输入。
起动后,先起动最末的皮带机 M4,1s 后再依次起动 M3,1s 后再依次起动 M2,1s 后
再依次起动 M1;停止时,先停止皮带机 M1,1s 后再停止 M2,1s 后再停止 M3,1s 后再停
止 M4;当某条皮带机有重物时,该皮带机前面的应立即停止,该皮带机运行 1s 后停止,再
1s 后接下去的一台停止,依此类推。*)
#T[1].TON(IN := #启动标志 & NOT #SC ,
PT := T#1s,
Q => #SC);
#T[2].TON(IN := #标志2 & NOT #SC1,
PT := T#1s,
Q => #SC1);
#P_R[1](CLK := #SC);
#P_R[2](CLK := #SC1);
IF #P_R[1].Q THEN
#A := #A + 1;
END_IF;
IF #P_R[2].Q THEN
#B := #B + 1;
END_IF;
//启动部分
CASE #A OF
0:
IF #启动 THEN
#C := 0;
#M4 := 1;
#启动标志 := 1;
END_IF;
1:
#M3 := 1;
2:
#M2 := 1;
3:
#M1 := 1;
#启动标志 := 0;
#A := 0;
END_CASE;
//停止部分
CASE #B OF
0:
IF #停止 & NOT #启动标志 THEN
#标志2 := 1;
#M1 := 0;
END_IF;
1:
#M2 := 0;
2:
#M3 := 0;
3:
#M4 := 0;
#标志2 := 0;
#B := 0;
END_CASE;
#T[3].TON(IN := #C <> 0 & NOT #SC2 ,
PT := T#1s,
Q => #SC2);
#P_R[3](CLK := #SC2);
IF #P_R[3].Q THEN
#D := #D + 1;
END_IF;
//故障输入部分
CASE #C OF
0:
IF #故障输入1 THEN
#C := 1;
;
ELSIF #故障输入2 THEN
#M1 := 0;
#C := 2;
;
ELSIF #故障输入3 THEN
#M1 := 0;
#M2 := 0;
#C := 3;
;
ELSIF #故障输入4 THEN
#M1 := 0;
#M2 := 0;
#M3 := 0;
#C := 4;
;
END_IF;
1:
CASE #D OF
1:
#M1 := 0;
2:
#M2 := 0;
3:
#M3 := 0;
4:
#M4 := 0;
#B := 0;
#C := 0;
#D := 0;
END_CASE;
2:
CASE #D OF
1:
#M2 := 0;
2:
#M3 := 0;
3:
#M4 := 0;
#B := 0;
#C := 0;
#D := 0;
END_CASE;
3:
CASE #D OF
1:
#M3 := 0;
2:
#M4 := 0;
#B := 0;
#C := 0;
#D := 0;
END_CASE;
4:
CASE #D OF
1:
#M4 := 0;
#B := 0;
#C := 0;
#D := 0;
END_CASE;
END_CASE;
二、机械手控制
1.控制要求
按下启动按钮,传送带
A
启动运转,当传感器
S(
扭子开关拨到
ON)
检测到物体时,传
送带
A
停止运转,
B
传送带启动运转,机械手下降
L1
亮,拨动
SQ1
到位,
L1
灭,抓取物
体
L3
亮,抓到物体
SQ3
输出信号后机械手上升
L2
亮,
S
、
SQ1
复位,货物抓走后转送带
A
再启动;拨动
SQ2
到位,
L2
灭,机械手左转
L5
亮,拨动
SQ5
到位,
L5
灭,机械手下降
L1
亮,
SQ2
复位,拨动
SQ1
到位,
L1
灭,松开物体
L3
灭,
SQ3
拨到
OFF
,机械手上升
L2
亮,
SQ1
复位,拨动
SQ2
到位,
L2
灭,机械手右转
L4
亮,
SQ5
复位,拨动
SQ4
到位,
L4
灭,再按下
S
,依次循环下去。抬起启动按钮,模拟信号指示灯都灭。
2. 接线图和I/0分配
输入 | 输出 | ||||
---|---|---|---|---|---|
名称 | 作用 | 地址 | 名称 | 作用 | 地址 |
ON | 启动 | I0.0 | A | 传送带 | Q0.0 |
OFF | 停止 | I0.1 | B | 传送带 | Q0.1 |
S | 传感器 | I0.2 | L1 | 指示灯 | Q0.2 |
SQ1 | 限位 | I0.3 | L2 | 指示灯 | Q0.3 |
SQ2 | 限位 | I0.4 | L3 | 指示灯 | Q0.4 |
SQ3 | 限位 | I0.5 | L4 | 指示灯 | Q0.5 |
SQ4 | 限位 | I0.6 | L5 | 指示灯 | Q0.6 |
SQ5 | 限位 | I0.7 |
3.编写程序
看控制要求和控制参考图,这里用case语句可以一步一步写下来。
到最后再赋值为1,可以接着循环运行。
IF #OFF THEN
#L1 := 0;
#L2 := 0;
#L3 := 0;
#L4 := 0;
#L5 := 0;
#A := 0;
#B := 0;
#W := 0;
END_IF;
CASE #W OF
0:
IF #ON THEN
#A := 1;
#W := 1;
END_IF;
1:
IF #S THEN
#A := 0;
#B := 1;
#L1 := 1;
#W := 2;
END_IF;
2:
IF #SQ1 THEN
#L1 := 0;
#L3 := 1;
#W := 3;
END_IF;
3:
IF #SQ3 THEN
#L2 := 1;
#A := 1;
#W := 4;
END_IF;
4:
IF #SQ2 THEN
#L2 := 0;
#L5 := 1;
#W := 5;
END_IF;
5:
IF #SQ5 THEN
#L5 := 0;
#L1 := 1;
#W := 6;
END_IF;
6:
IF #SQ1 THEN
#L1 := 0;
#L3 := 0;
#W := 7;
END_IF;
7:
IF #SQ3 = 0 THEN
#L2 := 1;
#W := 8;
END_IF;
8:
IF #SQ2 THEN
#L2 := 0;
#L4 := 1;
#W := 9;
END_IF;
9:
IF #SQ4 THEN
#L4 := 0;
#W := 10;
END_IF;
10:
#W := 1;
END_CASE;
总结
以上就是今天的内容,我们下一篇见!