淺談PLC的“掃描週期”以及ST指令的特性

掃描週期大家應該都知道,是PLC完整掃描一遍程序的時間,PLC就像一個讀報紙的人,而報紙上的內容就是程序,讀完一次報紙的時間就是一個掃描週期。

淺談PLC的“掃描週期”以及ST指令的特性

這個掃描週期可以是指定一個時間,也可以不指定,指定時間時無論程序有多長,PLC都在設定的時間內全部讀完,如果實在讀不完,PLC就會報警,說明PLC的性能不夠需要更換。時間不指定時PLC按照一個固定的速度去讀程序,程序多時間長些,程序少時間就短。

但這並不是今天我們要說的重點,重點是如何從一個掃描週期的角度去看程序。

一個掃描週期下的IF指令

習慣於梯形圖編程的人可能不太會去關注一個掃描週期下的程序與連續運行的程序有何區別,因為梯形圖最開始就是用來代替繼電器的,採用的也是硬件的邏輯思維,但如果想要學習ST,你一定要知道程序在微觀下與宏觀下的區別,以及不同指令如何運行。

舉個例子,判斷下面這兩段程序有沒有區別:

淺談PLC的“掃描週期”以及ST指令的特性

程序1

淺談PLC的“掃描週期”以及ST指令的特性

程序2

從宏觀上來看,這兩段程序的效果都是iNumber變量+1後持續+10,iNumber的值一直在增長。

但是從一個掃描週期上來看,結果就完全不一樣了,為了看到一個掃描週期下程序的運行結果,我們給兩段程序加上限制條件,保證程序執行一個掃描週期:

淺談PLC的“掃描週期”以及ST指令的特性

程序1的運行結果

淺談PLC的“掃描週期”以及ST指令的特性

程序2的運行結果

注:iNumber的初始值=0。

可以看到,執行一個掃描週期以後,兩段程序給出兩個不同的結果,導致這個結果的原因是IF指令的運行特性導致的,一個IF語句在一個掃描週期內最多隻執行其中的一個條件

在程序1中,兩個判斷條件是由兩個IF語句寫出,條件1(iNumber=0)判斷並執行後還會繼續判斷條件2(iNumber>0),所以最後的結果是iNumber=0+1+10=11。

而在程序2中,兩個判斷條件寫入一個IF語句中,在程序讀到IF語句時會依次判斷IF下面的所有條件哪個成立,去執行條件成立下的程序。發現條件1(iNumber=0)成立,執行iNumber+1後跳出IF判斷,後面的所有條件不再過問了。條件1下的程序執行後,iNumber=1,即便後面的條件2(iNumber>0)這時也成立了PLC也不會去管他了。

這個例子中IF的兩個條件同時只有一個條件成立,那如果是在一個掃描週期下,有多個條件成立時PLC如何選擇呢?我們稍微改下程序:

淺談PLC的“掃描週期”以及ST指令的特性

我們把條件2改為iNumber>-1,PLC復位後iNumber=0,同時滿足兩個判斷條件,執行一個掃描週期後iNumber仍然=1,這裡說明IF有多個條件同時成立時,執行第一個成立的條件。

不知道有沒有人對我加的限制條件有點疑惑,bTrig觸發後,程序立即復位了bTrig,也就是最外層的IF語句條件不成立了,為什麼後面的程序還會執行呢?這裡體現出IF語句的第三個特性,只要判斷時條件成立,條件下的程序會全部執行,無論在這個過程中條件有沒有變化。

當然,如果想要終止某個條件下程序的運行也是有方法的,可以使用RETURN指令。比如程序1,在條件1執行後我們不希望在執行條件2了的話,可以在條件1後面加一句return;PLC會跳出當前正在執行的指令。

淺談PLC的“掃描週期”以及ST指令的特性

RETURN指令

可以看到,在條件1執行後iNumber=1,滿足了return的執行條件,返回上一層的IF語句,下面的條件不會再判斷了。

總結:

一個IF語句在一個掃描週期內最多隻執行其中的一個條件

在一個掃描週期內IF語句有多個條件同時成立時,執行第一個成立的條件。

在一個掃描週期內IF語句只要判斷時條件成立,條件下的程序會全部執行,無論在這個過程中條件有沒有變化

IF與CASE的區別

上面剛剛總結的3個特性,case語句是同樣具有的,那case與if有什麼區別呢?

1.PLC的佔用不同

PLC在解析IF語句時,在一個掃描週期內要依次判斷所有條件是否成立,找到第一個成立的條件後去執行,而解析case語句時,直接根據判斷變量的值跳轉至相應的程序中,舉個例子:

淺談PLC的“掃描週期”以及ST指令的特性

IF判斷

在這段程序中,iStep的值=8;在bTrig觸發後PLC先判斷第1個條件iStep=0,發現不成立後判斷第2個條件iStep=1,發現不成立後判斷第3個條件。。。最後判斷第9個條件iStep=8,發現條件成立,開始執行,共判斷了9步。

我們再看看case如何編寫:

淺談PLC的“掃描週期”以及ST指令的特性

在bTrig觸發後,PLC判斷iStep的值=8,直接去執行“8”後面的程序,只判斷了一步。在複雜程序中多使用case去判斷數字變量,可以非常有效的減少PLC的運行負荷。(由於三菱軟件編譯的原因,實際的步數不一定誰多誰少,不用過於關注。)

2.判斷的變量類型不同。

IF指令能夠判斷數字變量,開關變量等多種類型的變量,甚至可以在判斷條件中編寫複雜數學公式和邏輯計算。例如:

淺談PLC的“掃描週期”以及ST指令的特性

如圖,直接在判斷的數組變量的角標中寫入數學公式,且多個變量使用and 、or 、not 等邏輯符號進行計算。

而case語句只能判斷數字類型的變量,或者枚舉變量(三菱不支持),例如:

淺談PLC的“掃描週期”以及ST指令的特性

理解循環的意義

ST的循環可以指定循環次數(FOR循環),可以不指定循環次數(while循環),而這裡所說的

循環次數都是一個掃描週期下的執行次數。舉個例子:

淺談PLC的“掃描週期”以及ST指令的特性

這句話的意思是在一個掃描週期內,執行100次iNumber+1,而且每次執行後,ii的值增加1。我們如果想看到一個週期內的結果扔然要增加限制條件:

淺談PLC的“掃描週期”以及ST指令的特性

可以看到執行一個掃描週期後,iNumber增加了100次1,最後等於100。

那它有什麼作用呢?我用if語句也能實現iNumber增加100次1啊,比如:

淺談PLC的“掃描週期”以及ST指令的特性

bTrig觸發後,iNumber滿足<100 的條件,執行iNumber+1的程序,100掃描週期後,條件不再滿足。他們雖然實現了同樣的功能(iNumber增加了100次1),區別是IF用了100個掃描週期,而for只用了一個。在我舉的例子當中區別確實不大,但是在正常程序中,PLC的掃描週期一般要在2-5ms左右,一千次的掃描週期就達到了2-5秒的時間,假設要實現從一個容量為1萬的數組裡面找出一個特定數值,如果用IF的方法,大約要耗費20-50秒才能完成,這個時間成本是有點高的,而for循環只需要幾毫秒,可以說一瞬間完成。

例如:假設容量為1萬的數組iNumber[0..9999],從中找出第一個數值為888的變量,記錄他的角標:

淺談PLC的“掃描週期”以及ST指令的特性

大家可以試著理解一下這個程序。

上升沿/下降沿

字面理解上升沿和下降沿,是一個變量變化的一瞬間,是一個無窮小的時間。但是在plc的程序裡最小的時間單位就是掃描週期,所以所謂的沿就是一個掃描週期。

上面舉的例子中用到的bTrig變量都是為了讓下面的程序執行一個掃描週期,也可以理解為執行bTrig的一個上升沿,與下面的編程效果一樣:

淺談PLC的“掃描週期”以及ST指令的特性

上升沿功能塊R_TRIG的功能,實際上就是檢測輸入變量,在輸入變量由低電平變為高電平的第一個掃描週期內輸出高電平,然後輸出低電平。也就是輸出一個掃描週期。

下降沿與上升沿同理,檢測的是輸入變量由高到低變化的第一個掃描週期。

理解的上升沿與下降沿的含義,我們可以非常靈活的應用在程序中,像讓程序執行一個掃描週期,可以檢測一個變量的上升/下降沿,可以用我們上面的例子中在IF語句置位復位一個變量,也可以在case中執行一個條件後立刻改變判斷變量的數值等等。


分享到:


相關文章: