找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4377|回复: 1
收起左侧

简单的交通灯:PLC-SCL语言程序

[复制链接]
ID:420439 发表于 2020-7-15 12:06 | 显示全部楼层 |阅读模式
本帖最后由 12131213 于 2020-7-15 12:32 编辑

       看了网上的交通灯程序似乎都没有SCL版本的,就把自己 写的SCL版本分享一下吧。
控制要求:
       首先,南北方向红灯亮25秒,与此同时,东西方向绿灯先亮20秒,然后闪3秒,接着东西方向黄灯闪2秒;接下来,东西方向红灯亮30秒,南北方向绿灯先亮25秒,然后,南北绿灯闪3秒,南北黄灯闪2秒。
程序设计思路:
       程序分为单定时器和双定时器两个版本,但思路是一样的,都是根据在不同的时间点,控制不同的灯亮。因为总的时长为55秒,然后东西方向通行时间为25秒,南北方向通行时间为30秒,整个程序流程如下:
无标题.png

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

程序如下:
单定时器版本:
  1. //交通灯:单定时器版本
  2. IF "启动" AND "停止" = 0 THEN
  3.     "数据块_1".启动值 := 1;
  4.     "数据块_1".停止值 := 0;
  5. ELSIF "停止" THEN
  6.     "数据块_1".启动值 := 0;
  7.     "数据块_1".停止值 := 1;
  8.     "东西红" := 0;
  9.     "东西黄" := 0;
  10.     "东西绿" := 0;
  11.     "南北红" := 0;
  12.     "南北黄" := 0;
  13.     "南北绿" := 0;
  14. END_IF;
  15. IF "数据块_1".启动值 THEN
  16.     "数据块_1".定时器.IN := 1;
  17.     "数据块_1".定时器.PT := T#55s;
  18.     "IEC_Timer_0_DB_2".TON(IN := "数据块_1".定时器.IN,
  19.                            PT := "数据块_1".定时器.PT,
  20.                            ET => "数据块_1".定时器输出时间);
  21.     IF "数据块_1".定时器输出时间>=T#0s AND "数据块_1".定时器输出时间<=T#20s THEN
  22.         "东西绿" := 1;
  23.         "南北红" := 1;
  24.         ELSIF "数据块_1".定时器输出时间>T#20s AND  "数据块_1".定时器输出时间<=T#23s THEN
  25.             "东西绿" :="Clock_2Hz" ;
  26.         ELSIF "数据块_1".定时器输出时间>T#23s AND  "数据块_1".定时器输出时间<=T#25s THEN
  27.             "东西绿" := 0;
  28.             "东西黄" := "Clock_2Hz";
  29.     ELSIF "数据块_1".定时器输出时间>T#25s AND "数据块_1".定时器输出时间<=T#50s THEN
  30.         "东西红" := 1;
  31.         "南北绿" := 1;
  32.         "东西黄" := 0;
  33.         "南北红" := 0;
  34.     ELSIF "数据块_1".定时器输出时间>T#50s AND "数据块_1".定时器输出时间<=T#53s THEN
  35.         "南北绿" := "Clock_2Hz";
  36.     ELSIF "数据块_1".定时器输出时间>T#53s AND "数据块_1".定时器输出时间<=T#55s THEN
  37.         "南北黄" :="Clock_2Hz" ;
  38.         "南北绿" := 0;
  39.     END_IF;
  40.     IF "数据块_1".定时器输出时间 =T#55s THEN
  41.         RESET_TIMER("IEC_Timer_0_DB_2");
  42.         "东西红" := 0;
  43.         "东西黄" := 0;
  44.         "东西绿" := 0;
  45.         "南北红" := 0;
  46.         "南北黄" := 0;
  47.         "南北绿" := 0;
  48.     END_IF;
  49. END_IF;
复制代码



双定时器版本:
  1. //交通灯:两个定时器版本
  2. IF "启动" AND "停止" = 0 THEN
  3.     "数据块_1".启动值 := 1;
  4.     "数据块_1".停止值 := 0;
  5. ELSIF "停止" THEN
  6.     "数据块_1".启动值 := 0;
  7.     "数据块_1".停止值 := 1;
  8.     "东西红" := 0;
  9.     "东西黄" := 0;
  10.     "东西绿" := 0;
  11.     "南北红" := 0;
  12.     "南北黄" := 0;
  13.     "南北绿" := 0;
  14. END_IF;
  15. IF "数据块_1".启动值 THEN
  16.     "数据块_1".定时器.IN := 1;
  17.     "数据块_1".定时器.PT := T#55s;
  18.     "数据块_1".定时器1.PT := T#0.5s;
  19.     //总定时;55s
  20.     "IEC_Timer_0_DB_2".TON(IN := "数据块_1".定时器.IN,
  21.                            PT := "数据块_1".定时器.PT,
  22.                            ET => "数据块_1".定时器输出时间);
  23.     //0~20s;南北红灯,东西绿灯
  24.     IF "数据块_1".定时器输出时间>=T#0s AND "数据块_1".定时器输出时间<=T#20s THEN
  25.         "东西绿" := 1;
  26.         "南北红" := 1;
  27.    //东西绿灯闪3s
  28.     ELSIF "数据块_1".定时器输出时间>T#20s AND "数据块_1".定时器输出时间<=T#23s THEN
  29.         "数据块_1".定时器1.IN := 1;
  30.         "数据块_1".定时器1.PT := T#500ms;
  31.         "IEC_Timer_0_DB".TON(IN := "数据块_1".定时器1.IN,
  32.                              PT := "数据块_1".定时器1.PT,
  33.                              Q => "数据块_1".定时器输出2);
  34.         IF "数据块_1".定时器输出2 THEN
  35.             "东西绿" := NOT "东西绿";
  36.             RESET_TIMER("IEC_Timer_0_DB");
  37.         END_IF;
  38.         //东西黄灯闪2s
  39.         ELSIF "数据块_1".定时器输出时间>T#23s AND"数据块_1".定时器输出时间<=T#25s THEN
  40.             "东西绿" := 0;
  41.             "数据块_1".定时器1.IN := 1;
  42.             "数据块_1".定时器1.PT := T#500ms;
  43.             "IEC_Timer_0_DB".TON(IN := "数据块_1".定时器1.IN,
  44.                                  PT := "数据块_1".定时器1.PT,
  45.                                  Q => "数据块_1".定时器输出2);
  46.             IF "数据块_1".定时器输出2 THEN
  47.                 "东西黄" := NOT "东西黄";
  48.                 RESET_TIMER("IEC_Timer_0_DB");
  49.             END_IF;
  50. //东西红灯,南北绿灯亮25S
  51.     ELSIF "数据块_1".定时器输出时间>T#25s AND "数据块_1".定时器输出时间<=T#50s THEN
  52.         "东西红" := 1;
  53.         "南北绿" := 1;
  54.         "东西黄" := 0;
  55.         "南北红" := 0;
  56.      //南北绿灯闪3s   
  57.     ELSIF "数据块_1".定时器输出时间>T#50s AND "数据块_1".定时器输出时间<=T#53s THEN
  58.         "数据块_1".定时器1.IN := 1;
  59.         "数据块_1".定时器1.PT := T#500ms;
  60.         "IEC_Timer_0_DB".TON(IN := "数据块_1".定时器1.IN,
  61.                              PT := "数据块_1".定时器1.PT,
  62.                              Q => "数据块_1".定时器输出2);
  63.         IF "数据块_1".定时器输出2 THEN
  64.             "南北绿" := NOT "南北绿";
  65.             RESET_TIMER("IEC_Timer_0_DB");
  66.         END_IF;;
  67.      //南北黄闪2s   
  68.     ELSIF "数据块_1".定时器输出时间>T#53s AND  "数据块_1".定时器输出时间<=T#55s THEN
  69.         "南北绿" := 0;
  70.         "数据块_1".定时器1.IN := 1;
  71.         "数据块_1".定时器1.PT := T#500ms;
  72.         "IEC_Timer_0_DB".TON(IN := "数据块_1".定时器1.IN,
  73.                              PT := "数据块_1".定时器1.PT,
  74.                              Q => "数据块_1".定时器输出2);
  75.         IF "数据块_1".定时器输出2 THEN
  76.             "南北黄" := NOT "南北黄";
  77.             RESET_TIMER("IEC_Timer_0_DB");
  78.         END_IF;
  79.     END_IF;
  80.     //全部初始化
  81.     IF "数据块_1".定时器输出时间 >=T#55s THEN
  82.         RESET_TIMER("IEC_Timer_0_DB_2");
  83.         "东西红" := 0;
  84.         "东西黄" := 0;
  85.         "东西绿" := 0;
  86.         "南北红" := 0;
  87.         "南北黄" := 0;
  88.         "南北绿" := 0;
  89.     END_IF;
  90. END_IF;
复制代码


顺便把归档文件也上传一下,有需要的自取。
交通灯.zip (611.46 KB, 下载次数: 47)

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:613064 发表于 2020-7-30 17:06 | 显示全部楼层
为啥我开不开
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表