S7-1200 PLC SCL语言程序编写简单的交通灯

控制要求:
       首先,南北方向红灯亮25秒,与此同时,东西方向绿灯先亮20秒,然后闪3秒,接着东西方向黄灯闪2秒;接下来,东西方向红灯亮30秒,南北方向绿灯先亮25秒,然后,南北绿灯闪3秒,南北黄灯闪2秒。
程序设计思路:
       程序分为单定时器和双定时器两个版本,但思路是一样的,都是根据在不同的时间点,控制不同的灯亮。因为总的时长为55秒,然后东西方向通行时间为25秒,南北方向通行时间为30秒,整个程序流程如下:

 

       然后简单说一下单定时器和双定时器的区别,他们的功能是一样的,只不过双定时器可以任意修改闪烁频率,而单定时器版本的只能使用系统设定好的几个频率。因为单定时器版本用的是PLC自带的系统时钟,使用方法是打开”设备组态”,在“常规”里面找到“系统和时钟存储器”,勾选“时钟存储器位”就行了,然后就可以在PLC变量表里面看到相应的变量了。图片如下:
 

 

程序如下:
单定时器版本:

//交通灯:单定时器版本
IF "启动" AND "停止" = 0 THEN
    "数据块_1".启动值 := 1;
    "数据块_1".停止值 := 0;
ELSIF "停止" THEN
    "数据块_1".启动值 := 0;
    "数据块_1".停止值 := 1;
    "东西红" := 0;
    "东西黄" := 0;
    "东西绿" := 0;
    "南北红" := 0;
    "南北黄" := 0;
    "南北绿" := 0;
END_IF;
IF "数据块_1".启动值 THEN
    "数据块_1".定时器.IN := 1;
    "数据块_1".定时器.PT := T#55s;
    "IEC_Timer_0_DB_2".TON(IN := "数据块_1".定时器.IN,
                           PT := "数据块_1".定时器.PT,
                           ET => "数据块_1".定时器输出时间);
    IF "数据块_1".定时器输出时间>=T#0s AND "数据块_1".定时器输出时间<=T#20s THEN
        "东西绿" := 1;
        "南北红" := 1;
        ELSIF "数据块_1".定时器输出时间>T#20s AND  "数据块_1".定时器输出时间<=T#23s THEN
            "东西绿" :="Clock_2Hz" ;
        ELSIF "数据块_1".定时器输出时间>T#23s AND  "数据块_1".定时器输出时间<=T#25s THEN
            "东西绿" := 0;
            "东西黄" := "Clock_2Hz";
    ELSIF "数据块_1".定时器输出时间>T#25s AND "数据块_1".定时器输出时间<=T#50s THEN
        "东西红" := 1;
        "南北绿" := 1;
        "东西黄" := 0;
        "南北红" := 0;
    ELSIF "数据块_1".定时器输出时间>T#50s AND "数据块_1".定时器输出时间<=T#53s THEN
        "南北绿" := "Clock_2Hz";
    ELSIF "数据块_1".定时器输出时间>T#53s AND "数据块_1".定时器输出时间<=T#55s THEN
        "南北黄" :="Clock_2Hz" ;
        "南北绿" := 0;
    END_IF;
    IF "数据块_1".定时器输出时间 =T#55s THEN
        RESET_TIMER("IEC_Timer_0_DB_2");
        "东西红" := 0;
        "东西黄" := 0;
        "东西绿" := 0;
        "南北红" := 0;
        "南北黄" := 0;
        "南北绿" := 0;
    END_IF;
END_IF;

双定时器版本:

//交通灯:两个定时器版本
IF "启动" AND "停止" = 0 THEN
    "数据块_1".启动值 := 1;
    "数据块_1".停止值 := 0;
ELSIF "停止" THEN
    "数据块_1".启动值 := 0;
    "数据块_1".停止值 := 1;
    "东西红" := 0;
    "东西黄" := 0;
    "东西绿" := 0;
    "南北红" := 0;
    "南北黄" := 0;
    "南北绿" := 0;
END_IF;
IF "数据块_1".启动值 THEN
    "数据块_1".定时器.IN := 1;
    "数据块_1".定时器.PT := T#55s;
    "数据块_1".定时器1.PT := T#0.5s;
    //总定时;55s
    "IEC_Timer_0_DB_2".TON(IN := "数据块_1".定时器.IN,
                           PT := "数据块_1".定时器.PT,
                           ET => "数据块_1".定时器输出时间);
    //0~20s;南北红灯,东西绿灯
    IF "数据块_1".定时器输出时间>=T#0s AND "数据块_1".定时器输出时间<=T#20s THEN
        "东西绿" := 1;
        "南北红" := 1;
   //东西绿灯闪3s
    ELSIF "数据块_1".定时器输出时间>T#20s AND "数据块_1".定时器输出时间<=T#23s THEN
        "数据块_1".定时器1.IN := 1;
        "数据块_1".定时器1.PT := T#500ms;
        "IEC_Timer_0_DB".TON(IN := "数据块_1".定时器1.IN,
                             PT := "数据块_1".定时器1.PT,
                             Q => "数据块_1".定时器输出2);
        IF "数据块_1".定时器输出2 THEN
            "东西绿" := NOT "东西绿";
            RESET_TIMER("IEC_Timer_0_DB");
        END_IF;
        //东西黄灯闪2s
        ELSIF "数据块_1".定时器输出时间>T#23s AND"数据块_1".定时器输出时间<=T#25s THEN
            "东西绿" := 0;
            "数据块_1".定时器1.IN := 1;
            "数据块_1".定时器1.PT := T#500ms;
            "IEC_Timer_0_DB".TON(IN := "数据块_1".定时器1.IN,
                                 PT := "数据块_1".定时器1.PT,
                                 Q => "数据块_1".定时器输出2);
            IF "数据块_1".定时器输出2 THEN
                "东西黄" := NOT "东西黄";
                RESET_TIMER("IEC_Timer_0_DB");
            END_IF;
//东西红灯,南北绿灯亮25S
    ELSIF "数据块_1".定时器输出时间>T#25s AND "数据块_1".定时器输出时间<=T#50s THEN
        "东西红" := 1;
        "南北绿" := 1;
        "东西黄" := 0;
        "南北红" := 0;
     //南北绿灯闪3s   
    ELSIF "数据块_1".定时器输出时间>T#50s AND "数据块_1".定时器输出时间<=T#53s THEN
        "数据块_1".定时器1.IN := 1;
        "数据块_1".定时器1.PT := T#500ms;
        "IEC_Timer_0_DB".TON(IN := "数据块_1".定时器1.IN,
                             PT := "数据块_1".定时器1.PT,
                             Q => "数据块_1".定时器输出2);
        IF "数据块_1".定时器输出2 THEN
            "南北绿" := NOT "南北绿";
            RESET_TIMER("IEC_Timer_0_DB");
        END_IF;;
     //南北黄闪2s   
    ELSIF "数据块_1".定时器输出时间>T#53s AND  "数据块_1".定时器输出时间<=T#55s THEN
        "南北绿" := 0;
        "数据块_1".定时器1.IN := 1;
        "数据块_1".定时器1.PT := T#500ms;
        "IEC_Timer_0_DB".TON(IN := "数据块_1".定时器1.IN,
                             PT := "数据块_1".定时器1.PT,
                             Q => "数据块_1".定时器输出2);
        IF "数据块_1".定时器输出2 THEN
            "南北黄" := NOT "南北黄";
            RESET_TIMER("IEC_Timer_0_DB");
        END_IF;
    END_IF;
    //全部初始化
    IF "数据块_1".定时器输出时间 >=T#55s THEN
        RESET_TIMER("IEC_Timer_0_DB_2");
        "东西红" := 0;
        "东西黄" := 0;
        "东西绿" := 0;
        "南北红" := 0;
        "南北黄" := 0;
        "南北绿" := 0;
    END_IF;
END_IF;

TIA 16程序下载:

暂无优惠

已有0人支付

1,本站所有资源来源于用户上传和网络搜集,如有侵权请邮件联系站长删除。
2,分享目的仅供大家个人的学习用途,请不要用于商业用途。
3,如果你也有好的源码或者教程,可以投稿到本站,采纳后有积分奖励。
4,本站提供的各类资源均不保证其可用性及完整性,也没有任何技术服务。
5,如有链接无法下载、失效、过期,请联系管理员处理。
6,本站资源部分需要积分只是赞助,仅用于本站服务器和日常运营所需,不提供任何技术支持。
快捷联系方式 Email:admin@lzbk.com QQ:361113272
蓝知博库 » S7-1200 PLC SCL语言程序编写简单的交通灯

提供最优质的资源集合

立即查看 了解详情