使用博图SCL语言来编写 交通灯模拟控制 和 自动装料应用案例
目录
前言
一、应用:交通灯模拟控制
1.控制要求
2.I\o分配和接线
3.程序编写和效果
4.小结
二、自动装料模拟控制
1.控制要求
2.I/O分配
3.程序编写
4.小结
总结
本篇文章我们继续学习西门子SCL语言的应用;
当按下停止按钮时,系统停止工作。
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正负极不要接反。

这里就按照流程来编写就可以了,注意先后顺序。
程序:
//控制部分
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".变量 OF1:"南北红灯" := 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
这里程序不难, 使用CASE语句来逐步完成东西和南北方向指示灯;在编写时要注意每走下一步都要将上一步的状态清零,避免造成重复;结束和停止时都要将定时器进行复位,来实现每次循环。

| 输入 | 输出 | ||||
|---|---|---|---|---|---|
| 名称 | 作用 | 地址 | 名称 | 作用 | 地址 |
| 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 |
程序是在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变量 OF1: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;
自动装料使用的是CASE语句来完成,其中要注意这一点控制要求:用if eisif 解决。
若料位传感器 S1 置为“0”(料斗中的物料不满),进料阀开启进料,D4 亮。当 S1 置为“1”(料斗中的物料已满),则停止进料(D4 灭)。
以上就是 交通灯 和 自动装料 这两个应用案例。