【SCL】1200应用案例:交通灯模拟&自动装料控制

使用博图SCL语言来编写 交通灯模拟控制 和 自动装料应用案例


前言

本篇文章我们继续学习西门子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.0L1东西红灯Q0.0
SB2停止I0.1L2东西绿灯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.FB块编写程序

 形式参数:

 程序代码(使用比较指令来完成要求):

(*
接通 PLC 控制器,信号灯系统开始工作,先是南北红灯 R 亮,东西绿 G 灯亮;
25S 后东西绿灯 G 灭,东西黄灯 Y 闪亮;
5S 后 ,南北红灯 R 灭,南北绿灯 G 亮,东西黄灯 Y 灭,东西红灯 R 亮;
25S 后南北绿灯 G 灭,南北黄灯 Y 闪亮;
5S 后南北黄灯灭,南北红灯 R 亮,东西红灯 R 灭,东西绿灯 G 亮,周而复始。
*)

//停止,按下后将灯清零
IF #停止 THEN
    #东西红灯 := 0;
    #东西黄灯 := 0;
    #东西绿灯 := 0;
    #南北红灯 := 0;
    #南北黄灯 := 0;
    #南北绿灯 := 0;
    #启动标志 := 0;
END_IF;

//定时器,计当前时间并进行比较.时间到后用Q点断开再进行循环
#T[0].TON(IN := #启动标志 & NOT  #T[0].Q,
          PT := T#20000ms,
          ET => #当前时间);

//启动按钮
IF #启动 THEN
    #启动标志 := 1;
END_IF;

//用定时器当前时间来和设定时间进行比较,从而控制交通灯
IF #当前时间 > INT_TO_TIME(0) & #当前时间 < INT_TO_TIME(10000) THEN
    #东西红灯 := 0;
    #南北黄灯 := 0;
        #南北红灯 := 1;
        IF #当前时间 > INT_TO_TIME(0) & #当前时间 < INT_TO_TIME(7000) THEN
            #东西绿灯 := 1;
        ELSE
            #东西绿灯 := 0;
            #东西黄灯 := "Clock_1Hz";
        END_IF;
        
    END_IF;
    
    IF #当前时间 > INT_TO_TIME(10000) & #当前时间 < INT_TO_TIME(20000) THEN
        #东西黄灯 := 0;
        #东西红灯 := 1;
        #南北红灯 := 0;
        
        IF #当前时间 > INT_TO_TIME(10000) & #当前时间 < INT_TO_TIME(17000) THEN
            #南北绿灯 := 1;
        ELSE
            #南北绿灯 := 0;
            #南北黄灯 := "Clock_1Hz";
        END_IF;
    END_IF;
    

5.小结

这里程序不难, 使用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.0L1指示灯Q0.0
SB2停止I0.1L2指示灯Q0.1
SQ1限位I0.2D1指示灯Q0.2
SQ2限位I0.3D2指示灯Q0.3
S1料位传感器I0.4D4指示灯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 灭)。

总结

以上就是 交通灯 和 自动装料  这两个应用案例。

  • 7
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值