使用博图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 灭)。
总结
以上就是 交通灯 和 自动装料 这两个应用案例。



















