西門子PLC SCL語言開發學習筆記(二)


 

 

今天來講下scl兩個關鍵的點

 

一、按鍵事件

比如地址I0.0是某個按鈕的狀態,他只有True和False兩個狀態,所以我們要獲得按下事件需要我們自己模擬。

#KeyPress := "Btn1" AND NOT #LastKey;

#LastKey := "Btn1";

這樣通過對#KeyPress判斷是否為True即可獲得一次點擊事件,相當於 |P|

把上一次的存起來,然后判斷按下,如果你想把按鍵放在松開時也可以。

因為大多數事情都是用按鍵觸發的,掌握這一點才能開始跑代碼。

 

 

二、定時器

PLC在梯形圖中使用定時器很困難,比如TON  5秒,需要輸入一直保持True,持續5s后輸出變為True,TOF則需要輸入從True變成False,然后持續5秒后輸出False,自帶各種邏輯,一旦碰到復雜的條件判斷頭都暈了,我是只能做到間隔時間打開幾個燈,但要做另一個按鈕還能間隔關上就不會了。

我們寫程序的只需要一個計時器就好了,不需要你帶這么多亂七八糟的邏輯,我們自己決定到時間了干嘛就好了。

 

1)     使用TON TORN

使用TON很簡單,讓一個變量保持True,然后判斷輸出是否時間到了,時間到了既可以做事情了,同時讓輸入變為False。

 

TORN則還含有Reset功能,他能累計計時,同時能取到計時了多久,下面這個程序展示了一開始就給TimerStart設置為True,開始計時並變燈的情況。

 下面是代碼塊,不要忘了這是被循環不斷執行的,大概功能是第五秒打開一個燈,第10秒再打開一個,到15秒重置, 為了代碼簡單理解就不加各種為了嚴謹的判斷了

#TimerStart := TRUE; // 隨便打開一下,就不寫事件了

"IEC_Timer_0_DB".TONR(IN := #TimerStart,

                     PT := T#15S,  // 計時15秒

                     Q => #TmpOut, //計時完畢,我們不去用這個

                     R:= #Reset,

                     ET => #Time1);//  ET為取出計時了多久

IF #Reset THEN

    #Reset := FALSE;

END_IF;

 

IF #Time1 >= T#5s THEN

    "Light1" := TRUE;

END_IF;

 

IF #Time1 >= T#10s THEN

    "Light2" := TRUE;

END_IF;

 

IF #TmpOut THEN

    "Light1" := FALSE;

    "Light2" := FALSE;

    #Reset := TRUE;

END_IF;

 

 

 

2)時鍾存儲器位

 

首先右鍵PLC進入屬性

找到時鍾存儲器位

 

我們把地址放到100那里去,這樣子這幾個存儲器里,就會有震盪,不斷在True  False之間來回變化,比圖1HZ會在一秒的開始變為True,到一半變為False,再下一秒開始變True,通過他的變化就能計時了

 

下面這個程序,再按下按鈕1后亮一個燈,過5秒再亮一個,再過5秒再亮一個,關閉時也是間隔滅燈,不考慮打開過程中關閉等情況。

 

 

IF #TT <> "Clock_1Hz" THEN //一個不斷根據震盪時間增加的Count 計數器

    #Count += 1;

END_IF;

#TT := "Clock_1Hz";

 

#KeyPress := "Btn1" AND NOT #LastKey;

#LastKey := "Btn1";

 

IF #KeyPress AND NOT "Light1" THEN // 開燈事件

    #TurnOn := TRUE;

    #TurnOff := FALSE;

    #Count := 0;  //重置計數器

END_IF;

 

IF #KeyPress AND "Light1" THEN // 關燈事件

    #TurnOn := FALSE;

    #TurnOff := TRUE;

    #Count := 0;

END_IF;

 

IF #TurnOn THEN // 持續處理開燈

    "Light1" := TRUE;

    IF #Count >= 5 * 2 THEN

        "Light2" := TRUE;

    ELSIF #Count >= 20 THEN

        "Light3" := TRUE;

    END_IF;

END_IF;

 

IF #TurnOff THEN

    "Light1" := FALSE;

    IF #Count >= 10 THEN

        "Light2" := FALSE;

    ELSIF #Count >= 20 THEN

        "Light3" := FALSE;

    END_IF;

END_IF;

 

 

3) 時間函數

其實PLC里面本來也有很多時間函數,比如獲取當前機器時間,比較時間差等,我們完全可以很靈活的去使用這些方法,變得和編程無異,這里就不介紹了

 

 

結語:我們可以識別按鈕事件,然后獲得了好用的計時器后,scl的邏輯處理剩下的就都是寫代碼了和調方法了,沒有什么能難倒我們程序員了

SCL邏輯比梯形圖更嚴謹明白,復雜邏輯控制更簡單,是我們程序員的好幫手。

以后會繼續挖掘SCL的寫法,教大家SCL能代替梯形圖的寫法,做到是個程序員就無門檻

暫時告一段落

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM