找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4821|回復: 1
收起左側

簡單的交通燈:PLC-SCL語言程序

[復制鏈接]
ID:420439 發(fā)表于 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

       然后簡單說一下單定時器和雙定時器的區(qū)別,他們的功能是一樣的,只不過雙定時器可以任意修改閃爍頻率,而單定時器版本的只能使用系統(tǒng)設定好的幾個頻率。因為單定時器版本用的是PLC自帶的系統(tǒng)時鐘,使用方法是打開”設備組態(tài)”,在“常規(guī)”里面找到“系統(tǒng)和時鐘存儲器”,勾選“時鐘存儲器位”就行了,然后就可以在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 發(fā)表于 2020-7-30 17:06 | 顯示全部樓層
為啥我開不開
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表