本帖最后由 12131213 于 2020-7-15 12:32 编辑
看了网上的交通灯程序似乎都没有SCL版本的,就把自己 写的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;
复制代码
顺便把归档文件也上传一下,有需要的自取。 |