PLC的本質是個計算機。 和計算機的編程語言一樣,在程序中是需要用到各種變量的。
所以先從計算機高級語言說起。
不管是VB還是C++,各種編程語言都有一個比較重要的章節,講變量的存儲類型。
我一開始以為它們是在第一章第一課就講的。 還好先翻了翻書。
第七章
7.8 局部變量和全局變量
7.9 動態存儲變量和靜態存儲變量
在實際的高級語言的編程應用中,用的最多的是局部變量和全部變量, 以及極少數情況下會用到局部的靜態變量。 有多極少數呢?我甚至想不起來應用靜態變量的標準場景了。
幸虧翻了下書, 書里有例子講到了,如此珍貴, 我抄下來算了:
#include
int main()
{
int i;
for(i=1;i<=5;++i)
printf("%d!=%d\n",i,fact(i));
return 0;
}
int fact(int n)
{
static int f = 1;
f=f*n;
return (f);
}
這里面的static int f 就是靜態變量。
其中一個最大的技巧是, 在函數計算5!的時候, 用到了前面計算4!的計算結果。對早期的計算機計算資源特別寶貴的情況下, 起到了節省一點點計算資源的作用。
但是, 這個技巧又相當扯淡。如果你只想求5!而對前面的1!,2!,3!,4!皆不感興趣,則這個函數反而不能用了。 還逼著你非要在外面做一次循環,重復調用那個函數fact,才能真正得到5!的答案。
一個計算功能, 原生的函數還不能直接得到答案, 還需要再做一次循環處理,才可以。 這事兒換誰誰不煩啊?
嗯, 還真有不煩的。 誰不煩?
PLC不煩。
因為PLC的OB1是天生自動循環的。
只要計算結果不是需要在一個周期內立馬得到答案, 就可以充分使用OB1循環運行的特性, 在函數中實現想要的功能。
比如MODBUS輪詢,就可以由OB1的循環調用機制本身來驅動。 不需要自己做循環程序(而且也不能做, 如果做的話CPU單個周期運轉時間過長, 會累死。)
所以, 以往在高級語言中,只有概念, 而鮮有用武之地的STATIC靜態變量在PLC系統中,閃亮登場了, 而且大放異彩。
變量作用域和生存期列表:
備注
* 對于被嵌套調用的函數塊FB/FC/OB來說, 各自定義的TEMP變量不繼承,不滲透。
** 地址區間先分給INPUT和OUTPUT,而后才是STATIC。
*** 所有TEMP變量, 必須先寫入數值后使用。 不能假設初始都為0,或者上個周期運行的結果。
所以,不同的應用需求, 需要的變量類型是不一樣的。
比如要計算OUT=(A+B)/(C+D),
在LAD或者STL 里,通常要用1個或者2個臨時變量。
L #A
L #B
+R
T LD10
L #C
L #D
+R
T LD14
L LD10
L LD14
/R
T #OUT
這里使用的L區,雙字,存儲REAL數據。 在STEP7中可以未加定義直接使用。 而在TIA PORTAL中要么提前定義, 要么直接使用名字后補充定義到LOCAL變量。不再允許絕對尋址。
如果同一個函數中, 還有要使用同樣數據類型的地方,可以重復使用。 但都是要先寫入后讀取。
同樣的程序, 使用其它的內存地址來實現當然也可以。 比如可以使用MD10/MD14替代上面的LD10/LD14。 運算效果完全相同。 但是,對資源使用造成了浪費, 也容易導致變量重復使用, 會干擾其他的使用了同地址的函數塊。
如果見到有人做的這樣的程序,你立馬可以判定: 這是個新手做的。
MODBUS輪詢問題,用SCL語言的部分代碼(用LAD和STL原理相同)
IF "FirstScan" THEN
#cycle := 0;
#step := 1;
#j := -1;
END_IF;
IF #Data.MB_ADDR = 0 THEN
#i := #i + 1;
RETURN;
END_IF;
其中的#cycle ,#step,#i,#j等變量,都是定義的STATIC靜態變量。具體細分的話, 個別變量可能可以使用TEMP臨時變量, 但圖省事, 也就不那么細了。 反正最終完全封裝, 不會影響到外面其它函數的變量使用。
同樣的道理,這些變量如果使用全局變量M, 能不能同樣實現目的呢?
答案是:有時候能,有時候不能!
看這個函數使用的情況。 如果在系統中只調用1次, 那是可以的。 而如果需要調用n次, 使用全局變量的話, 反而不可以了!多個實例時間會亂串, 會互相干擾。所以如果不幸要多次調用, 還需要復制另存,更改其中的M變量,換一批來!
上面的功能中還使用了定時器, 只不過代碼沒有貼出來。 也是同樣的道理。 只不過定時器比較復雜, 使用的是多重背景的數據塊,本質也是STATIC變量。
emmmm, 我這是在做什么?
我是在重復印證我所主張的“好的程序的標準是:不使用M中間量,不使用Timer。”
審核編輯:劉清
-
計算機
+關注
關注
19文章
7520瀏覽量
88233 -
SCL
+關注
關注
1文章
239瀏覽量
17111 -
靜態變量
+關注
關注
0文章
13瀏覽量
6672 -
plc編程語言
+關注
關注
0文章
7瀏覽量
1178
原文標題:【萬泉河】PLC系統變量的作用域和生存期
文章出處:【微信號:PLC標準化編程,微信公眾號:PLC標準化編程】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論