在上篇文章中,我們知道了如何在PLC中區分數值的正負,並知道了什麼是整點數和浮點數。那麼,這次我們接著學習PLC的各種數值運算指令。#三菱PLC入門#
在上篇文章就提過,所謂數值運算,就是通過加減乘除來實現數值的變換。然,在三菱FX PLC 2N中,這些個加減乘除具體又是怎樣實現的呢?
一、BIN數的四則運算指令
BIN數,即帶符號的二進位整數,它的四則運算指令包括加、減、乘、除指令。
(1)ADD(加)指令、SUB(減)指令
從編程手冊的截圖中,可以看到,ADD指令和SUB指令都有脈衝執行型和連續執行型兩種,且都可用於16位和32位。當然,它們的適用軟元件為字軟元件。
加、減指令都有兩個源操作數(S1·)、(S2·)和一個目的操作數(D·),它們在梯形圖中的形式如下圖所示。
在ADD指令中,其代表的含義為(S1)+(S2)=(D),將S1中的數值加上S2中的數值,然後把和存放到D中。
同理,在SUB指令中,其代表的含義為(S1)-(S2)=(D),將S1中的數值減去S2中的數值,然後把差存放到D中。
看過上篇文章的都知道,BIN數是帶有符號的,所以它們在運算的過程中,也要考慮到符號的影響。加、減指令在執行後要影響到三個標誌位,如下圖所示。
M8022這個進位標誌位,看過我系列文章的人可能還有點印象,其實我在寫到移位指令就提到過它。不記得的可以回顧一下移位指令的內容。
小學生都知道,兩個數相加減會涉及到借位和進位的問題,例如十進位數運算7+8=15,其中的1就是進位,15-7=8中的1被借位。
同理,PLC的BIN數四則運算也要考慮進位和借位問題,當兩個數相加,它們的和大於(D)所能保存的最大值後,M8022狀態為ON。
同理,兩個數相減,它們的差小於(D)所能保存的最小值後,M8021狀態為ON。
所謂(D)所能保存的最大值或最小值,是指這些參與運算的字軟元件所能保存的數值限值,包括符號位在內。
例如上圖的例子,(D0)=K32767,執行指令ADD D0 K1 D10後,和為K32768,一個16位的字元件,所能保存的最大正整數為K32767(包括符號位),所以D10超出最大值,此時進位標誌位M8022為ON。
另外,從圖中可以看到,D10的值變為0,所以此時M8020也為ON。同理,減法的溢出也是大同小異,我在此就不再舉例,大家感興趣的,可以用軟體編程驗算一下結果。
ADD指令和SUB指令比較簡單,實際運用不用我多說大家也知道,反正哪裡需要加減,哪裡就會出現它們。
但要注意的一點是,PLC每掃描一個周期,這些指令就執行一次,此時,重複執行加、減運算可能不是我們需要的,所以應該選擇脈衝執行型指令ADDP、SUBP或邊沿觸髮型驅動條件。
(2)MUL(乘)指令、DIV(除)指令
從編程手冊的截圖中,可以看到,MUL指令和DIV指令也有脈衝執行型和連續執行型兩種,且都可用於16位和32位,但終址D只有在16位運算時才可以用V、Z字元件。
和加、減指令一樣,乘、除指令都有兩個源操作數(S1·)、(S2·)和一個目的操作數(D·),它們在梯形圖中的形式如下圖所示。不一樣的地方在於乘法指令和除法指令的目的操作數,在用於16位運算時目的操作數佔兩個字元件D、D+1,用於32位運算時目的操作數佔四個字元件D、D+1、D+2、D+3。
這是很顯然的,因為乘法所得的積往往比因數大很多,若此時僅用一個字元件(16位運算時)保存結果是不夠的。
另外,除法運算在無法整除的時候,就會有餘數,所以就要用多一個字元件來保存餘數(16位運算時)。
在MUL指令中,這些操作數代表的含義為(S1)×(S2)=(D+1,D),將S1中的數值乘以S2中的數值,然後把積存放到D+1,D兩個連續字元件中。
同理,在DIV指令中,其代表的含義為(S1)÷(S2)=(D)…(D+1),將S1中的數值除以S2中的數值,然後把商存放到D中,把餘數存放到D+1中。
其梯形圖形式如下圖所示,16位和32位所佔用的字元件有所不同。
MUL指令和DIV指令也比較簡單,實際運用也不用我多說。和加、減指令一樣,PLC每掃描一個周期,這些指令就執行一次,此時,重複執行乘、除運算可能不是我們需要的,所以應該選擇脈衝執行型指令MULP、DIVP或邊沿觸髮型驅動條件。
除法運算的除數是不能為零的,PLC中也一樣,若除數為0,錯誤標誌位M8067=ON。
知道了BIN數的四則運算指令後,我們接著來看加1、減1指令。
二、加1指令INC和減1指令DEC
加1、減1,顧名思義,是指該指令執行一次,數值加1或減1,。INC指令和DEC指令只有目的操作數(D·),其梯形圖形式如下圖所示。
INC指令和DEC指令在執行的過程中不會影響到標誌位M8020、M8021、M8022。當採用連續執行型時,顯然,D會不斷地進行加1或減1操作,此時若超出其限值會怎樣呢?其實,INC指令和DEC指令是一個單位累加(累減)環形計數器,如下圖所示。
在執行INC指令時,若當前值為-1,加1 後其值就變為0,再加1就變為1;若當前值為32767(H7FFF),加1後變為-32768(H8000)。
同理,在執行DEC指令時,若當前值為1,減1 後其值就變為0,再減1就變為-1;若當前值為-32768(H8000),減1後變為32767(H7FFF)。
談及INC指令,我就會想到一道題:求1+2+3+……+99的和。這道題用INC指令顯然可以很簡單的實現計算,如下圖所示。這是我隨手編的一段程序,結合INC指令和ADD指令就可以算出1+2+3+……+99=4950。當然,這只是隨手編的,大家也可以嘗試一下其他方法。
INC指令和DEC指令
經常和變址尋址配合應用在累加或累減及檢索等程序中。例如把D0~的D100的數值相加等,在這裡我就不編程序啦。
知道了四則運算指令和加1、減1指令後,我們繼續來學習一個比較繞的指令:求補碼指令NEG。
三、求補碼指令NEG
NEG指令和INC指令、DEC指令一樣,只有一個操作數,驅動條件成立時,將D的數值求補碼,然後將結果送回到D中去。
上篇文章提到,在PLC中,正數(符號位為0)直接用其原碼表示,而(符號位為1)負數就用其補碼表示。
而NEG指令是直接對數值進行求反加1(包括符號位),不管當前值是正數還是負數,所以,其求出來的結果,和定義上的補碼有所出入。
例如-3在寄存器中用補碼表示(HFFFD),用NEG指令求補後,結果為+3(H0003);再如+6在寄存器中用原碼表示(H0006),用NEG指令求補後,結果為-6的補碼(HFFFA)。
顯然,NEG指令其實是求相反數的指令,當然,這是基於負數本就是用補碼表示的前提下的。
學到這裡,已經有7個指令了,為了不那麼累,這次的分享學習就先到這裡吧!
註:本文章內容都是基於三菱FX PLC 2N所寫
選自《三菱FX系列PLC功能指令詳解》第五章第29~38課時
技成培訓網原創,作者:楊思慧,未經授權不得轉載,違者必究~