使用博图SCL语言来编写 交通灯模拟控制 和 自动装料应用案例
文章目录
目录
前言
一、应用:交通灯模拟控制
1.控制要求
2.I\o分配和接线
3.程序编写和效果
4.小结
二、自动装料模拟控制
1.控制要求
2.I/O分配
3.程序编写
4.小结
总结
前言
本篇文章我们继续学习西门子SCL语言的应用;
一、应用:交通灯模拟控制
1.控制要求
接通
PLC
控制器,按下启动按钮,信号灯系统开始工作,先是南北红灯
R
亮,东西绿
G
灯亮;
25S
后东西绿灯
G
灭,东西黄灯
Y
闪亮;
5S
后 ,南北红灯
R
灭,南北绿灯
G
亮,东西黄灯
Y
灭,东西红灯
R
亮;
25S
后南北绿灯
G
灭,南北黄灯
Y
闪亮;
5S
后南北黄灯灭,南北红灯
R
亮,东西红灯
R
灭,东西绿灯
G
亮,周而复始。
当按下停止按钮时,系统停止工作。
2.I\o分配和接线
I/0分配:
输入 | 输出 | ||||
---|---|---|---|---|---|
名称 | 作用 | 地址 | 名称 | 作用 | 地址 |
SB1 | 启动 | I0.0 | L1 | 东西红灯 | Q0.0 |
SB2 | 停止 | I0.1 | L2 | 东西绿灯 | Q0.1 |
L3 | 东西黄灯 | Q0.2 | |||
L4 | 南北红灯 | Q0.3 | |||
L5 | 南北绿灯 | Q0.4 | |||
L6 | 南北黄灯 | Q0.5 |
接线图:
接线时注意24V正负极不要接反。
3.程序编写和效果
这里就按照流程来编写就可以了,注意先后顺序。
程序:
//控制部分
IF "启动" THEN
"数据块_1".变量 := 1;
END_IF;
IF "停止" THEN
"东西红灯" := 0;
"东西黄灯" := 0;
"东西绿灯" := 0;
"南北红灯" := 0;
"南北黄灯" := 0;
"南北绿灯" := 0;
RESET_TIMER(#IEC_Timer_0_Instance);
RESET_TIMER(#IEC_Timer_0_Instance_1);
RESET_TIMER(#IEC_Timer_0_Instance_2);
RESET_TIMER(#IEC_Timer_0_Instance_3);
"数据块_1".变量 := 0;
END_IF;
//运行部分
CASE "数据块_1".变量 OF
1:
"南北红灯" := 0;
"东西绿灯" := 0;
"东西红灯" := 1;
"南北绿灯" := 1;
#IEC_Timer_0_Instance(IN := "南北绿灯",
PT := T#5s,
Q => "输出点1");
IF "输出点1" THEN
"南北绿灯" := 0;
"数据块_1".变量 := 2;
END_IF;
2:
"中继1" := 1;
"南北黄灯" := "中继1" AND "Clock_1Hz";
#IEC_Timer_0_Instance_1(IN := "中继1",
PT := T#2s,
Q => "输出点2");
IF "输出点2" THEN
"东西红灯" := 0;
"中继1" := 0;
"南北黄灯" := 0;
"数据块_1".变量 := 3;
END_IF;
3:
"南北绿灯" := 0;
"东西红灯" := 0;
"南北红灯" := 1;
"东西绿灯" := 1;
#IEC_Timer_0_Instance_2(IN := "东西绿灯",
PT := T#5s,
Q => "输出点3");
IF "输出点3" THEN
"东西绿灯" := 0;
"数据块_1".变量 := 4;
END_IF;
4:
"中继2" := 1;
"东西黄灯" := "中继2" AND "Clock_1Hz";
#IEC_Timer_0_Instance_3(IN := "中继2",
PT := T#2s,
Q => "输出点4");
IF "输出点4" THEN
"中继2" := 0;
"东西黄灯" := 0;
"数据块_1".变量 := 5;
END_IF;
5:
"东西红灯" := 0;
"东西黄灯" := 0;
"东西绿灯" := 0;
"南北红灯" := 0;
"南北黄灯" := 0;
"南北绿灯" := 0;
RESET_TIMER(#IEC_Timer_0_Instance);
RESET_TIMER(#IEC_Timer_0_Instance_1);
RESET_TIMER(#IEC_Timer_0_Ins
4.小结
这里程序不难, 使用CASE语句来逐步完成东西和南北方向指示灯;在编写时要注意每走下一步都要将上一步的状态清零,避免造成重复;结束和停止时都要将定时器进行复位,来实现每次循环。
二、自动装料模拟控制
1.控制要求
按下启动开关,
L2
灭,
L1
亮,车未到位,表明允许汽车开进装料。料斗出料口
D2
关
闭,若料位传感器
S1
置为“
0
”(料斗中的物料不满),进料阀开启进料,
D4
亮。当
S1
置为“
1
”(料斗中的物料已满),则停止进料(
D4
灭)。电动机
M1
、
M2
、
M3
均为“
0
”。
当汽车开进装车位置时,限位开
SQ1
置为“
1
”,信号灯
L2
亮,
L1
灭,车到位;同时
启动电动机
M3
,经过
3s
后,再启动
M2
,再经
2s
后启动
M1
,再经过
3s
后才打开出料阀,
D2
亮,物料经料斗出料。 当车装满时,限位开关
SQ2
为“
1
”,
D1
亮,料斗关闭,
3s
后
M1
停止,
M2
在
M1
停止
3s
后停止,
M3
在
M2
停止
3s
后停止,同时
L2
灭,
L1
亮,表明
汽车可以开走。
按下停止按钮,自动配料装车的整个系统终止运行。
2.I/O分配
输入 | 输出 | ||||
---|---|---|---|---|---|
名称 | 作用 | 地址 | 名称 | 作用 | 地址 |
SB1 | 启动 | I0.0 | L1 | 指示灯 | Q0.0 |
SB2 | 停止 | I0.1 | L2 | 指示灯 | Q0.1 |
SQ1 | 限位 | I0.2 | D1 | 指示灯 | Q0.2 |
SQ2 | 限位 | I0.3 | D2 | 指示灯 | Q0.3 |
S1 | 料位传感器 | I0.4 | D4 | 指示灯 | Q0.4 |
M1 | 电机 | Q0.5 | |||
M2 | 电机 | Q0.6 | |||
M3 | 电机 | Q0.7 |
3.程序编写
程序是在FB块中编写的,使用的是#变量,在主程序调用后可以填入相应的I/O点。 程序:
IF #停止1 THEN
#L1 := 0;
#L2 := 0;
#D1 := 0;
#D2(出料口) := 0;
#D4(进料阀指示) := 0;
#M1 := 0;
#M2 := 0;
#M3 := 0;
#中继1 := 0;
#中继2 := 0;
RESET_TIMER(#IEC_Timer_0_Instance_4);
RESET_TIMER(#IEC_Timer_0_Instance_5);
RESET_TIMER(#IEC_Timer_0_Instance_6);
RESET_TIMER(#IEC_Timer_0_Instance_7);
RESET_TIMER(#IEC_Timer_0_Instance_8);
RESET_TIMER(#IEC_Timer_0_Instance_9);
"数据块_1".II变量 := 0;
END_IF;
IF #启动1 THEN
#L2 := 0;
#L1 := 1;
#M1 := 0;
#M2 := 0;
#M3 := 0;
"数据块_1".II变量 := 1;
END_IF;
CASE "数据块_1".II变量 OF
1:
IF #S1(料位传感器) THEN
#D4(进料阀指示) := 0;
#D2(出料口) := 0;
"数据块_1".II变量 := 2;
ELSIF #S1(料位传感器)=0 THEN
#D4(进料阀指示) := 1;
#D2(出料口) := 1;
"数据块_1".II变量 := 1;
END_IF;
2:
IF #SQ1 THEN
#L2 := 1;
#L1 := 0;
"数据块_1".II变量 := 3;
END_IF;
3:
#M3 := 1;
#IEC_Timer_0_Instance_4(IN:=#M3,
PT:=T#3s,
Q=>#输出点1);
IF #输出点1 THEN
#M2 := 1;
END_IF;
#IEC_Timer_0_Instance_5(IN:=#M2,
PT:=T#2s,
Q=>#输出点2);
IF #输出点2 THEN
#M1 := 1;
END_IF;
#IEC_Timer_0_Instance_6(IN:=#M1,
PT:=T#3s,
Q=>#输出点3);
IF #输出点3 THEN
#D2(出料口) := 1;
"数据块_1".II变量 := 4;
END_IF;
4:
IF #SQ2 THEN
#L2 := 0;
#L1 := 1;
#D1 := 1;
#D2(出料口) := 0;
END_IF;
#IEC_Timer_0_Instance_7(IN:=#D1,
PT:=T#3s,
Q=>#输出点4);
IF #输出点4 THEN
#M1 := 0;
#中继1 := 1;
END_IF;
#IEC_Timer_0_Instance_8(IN:=#中继1,
PT:=T#3s,
Q=>#输出点5);
IF #输出点5 THEN
#M2 := 0;
#中继2 := 1;
END_IF;
#IEC_Timer_0_Instance_9(IN:=#中继2,
PT:=T#3s,
Q=>#输出点6);
IF #输出点6 THEN
#M3 := 0;
"数据块_1".II变量 := 5;
END_IF;
5:
#中继1 := 0;
#中继2 := 0;
#L2 := 0;
#L1 := 0;
#D1 := 0;
RESET_TIMER(#IEC_Timer_0_Instance_4);
RESET_TIMER(#IEC_Timer_0_Instance_5);
RESET_TIMER(#IEC_Timer_0_Instance_6);
RESET_TIMER(#IEC_Timer_0_Instance_7);
RESET_TIMER(#IEC_Timer_0_Instance_8);
RESET_TIMER(#IEC_Timer_0_Instance_9);
"数据块_1".II变量 := 0;
END_CASE;
4.小结
自动装料使用的是CASE语句来完成,其中要注意这一点控制要求:用if eisif 解决。
若料位传感器 S1 置为“ 0 ”(料斗中的物料不满),进料阀开启进料, D4 亮。当 S1置为“ 1 ”(料斗中的物料已满),则停止进料( D4 灭)。
总结
以上就是 交通灯 和 自动装料 这两个应用案例。