0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PLC靜態(tài)變量的作用域和生存期

opkgjew ? 來源:劍指工控 ? 作者:萬泉河 ? 2022-11-14 11:23 ? 次閱讀

PLC的本質(zhì)是個計算機。 和計算機的編程語言一樣,在程序中是需要用到各種變量的。

所以先從計算機高級語言說起。

不管是VB還是C++,各種編程語言都有一個比較重要的章節(jié),講變量的存儲類型。

我一開始以為它們是在第一章第一課就講的。 還好先翻了翻書。

第七章

7.8 局部變量和全局變量

7.9 動態(tài)存儲變量和靜態(tài)存儲變量

在實際的高級語言的編程應(yīng)用中,用的最多的是局部變量和全部變量, 以及極少數(shù)情況下會用到局部的靜態(tài)變量。 有多極少數(shù)呢?我甚至想不起來應(yīng)用靜態(tài)變量的標準場景了。

幸虧翻了下書, 書里有例子講到了,如此珍貴, 我抄下來算了:

C語言用static處理輸出1到5的階乘.

#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 就是靜態(tài)變量

其中一個最大的技巧是, 在函數(shù)計算5!的時候, 用到了前面計算4!的計算結(jié)果。對早期的計算機計算資源特別寶貴的情況下, 起到了節(jié)省一點點計算資源的作用。

但是, 這個技巧又相當扯淡。如果你只想求5!而對前面的1!,2!,3!,4!皆不感興趣,則這個函數(shù)反而不能用了。 還逼著你非要在外面做一次循環(huán),重復(fù)調(diào)用那個函數(shù)fact,才能真正得到5!的答案。

一個計算功能, 原生的函數(shù)還不能直接得到答案, 還需要再做一次循環(huán)處理,才可以。 這事兒換誰誰不煩啊?

嗯, 還真有不煩的。 誰不煩?

PLC不煩。

因為PLC的OB1是天生自動循環(huán)的。

只要計算結(jié)果不是需要在一個周期內(nèi)立馬得到答案, 就可以充分使用OB1循環(huán)運行的特性, 在函數(shù)中實現(xiàn)想要的功能。

比如MODBUS輪詢,就可以由OB1的循環(huán)調(diào)用機制本身來驅(qū)動。 不需要自己做循環(huán)程序(而且也不能做, 如果做的話CPU單個周期運轉(zhuǎn)時間過長, 會累死。)

所以, 以往在高級語言中,只有概念, 而鮮有用武之地的STATIC靜態(tài)變量在PLC系統(tǒng)中,閃亮登場了, 而且大放異彩。

變量作用域和生存期列表:

pYYBAGNxtO2Af_1VAADBvVMbi6o468.jpg

備注

* 對于被嵌套調(diào)用的函數(shù)塊FB/FC/OB來說, 各自定義的TEMP變量不繼承,不滲透。

** 地址區(qū)間先分給INPUT和OUTPUT,而后才是STATIC。

*** 所有TEMP變量, 必須先寫入數(shù)值后使用。 不能假設(shè)初始都為0,或者上個周期運行的結(jié)果。

所以,不同的應(yīng)用需求, 需要的變量類型是不一樣的。

比如要計算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區(qū),雙字,存儲REAL數(shù)據(jù)。 在STEP7中可以未加定義直接使用。 而在TIA PORTAL中要么提前定義, 要么直接使用名字后補充定義到LOCAL變量。不再允許絕對尋址。

如果同一個函數(shù)中, 還有要使用同樣數(shù)據(jù)類型的地方,可以重復(fù)使用。 但都是要先寫入后讀取。

同樣的程序, 使用其它的內(nèi)存地址來實現(xiàn)當然也可以。 比如可以使用MD10/MD14替代上面的LD10/LD14。 運算效果完全相同。 但是,對資源使用造成了浪費, 也容易導致變量重復(fù)使用, 會干擾其他的使用了同地址的函數(shù)塊。

如果見到有人做的這樣的程序,你立馬可以判定: 這是個新手做的。

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靜態(tài)變量。具體細分的話, 個別變量可能可以使用TEMP臨時變量, 但圖省事, 也就不那么細了。 反正最終完全封裝, 不會影響到外面其它函數(shù)的變量使用。

同樣的道理,這些變量如果使用全局變量M, 能不能同樣實現(xiàn)目的呢?

答案是:有時候能,有時候不能!

看這個函數(shù)使用的情況。 如果在系統(tǒng)中只調(diào)用1次, 那是可以的。 而如果需要調(diào)用n次, 使用全局變量的話, 反而不可以了!多個實例時間會亂串, 會互相干擾。所以如果不幸要多次調(diào)用, 還需要復(fù)制另存,更改其中的M變量,換一批來!

上面的功能中還使用了定時器, 只不過代碼沒有貼出來。 也是同樣的道理。 只不過定時器比較復(fù)雜, 使用的是多重背景的數(shù)據(jù)塊,本質(zhì)也是STATIC變量。

emmmm, 我這是在做什么?

我是在重復(fù)印證我所主張的“好的程序的標準是:不使用M中間量,不使用Timer?!?br />





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 計算機
    +關(guān)注

    關(guān)注

    19

    文章

    7289

    瀏覽量

    87516
  • SCL
    SCL
    +關(guān)注

    關(guān)注

    1

    文章

    239

    瀏覽量

    17010
  • 靜態(tài)變量
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    6638
  • plc編程語言
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    1160

原文標題:【萬泉河】PLC系統(tǒng)變量的作用域和生存期

文章出處:【微信號:PLC標準化編程,微信公眾號:PLC標準化編程】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    [8.7.1]--5.7全局變量作用生存期

    程序設(shè)計
    jf_75936199
    發(fā)布于 :2023年03月06日 20:01:12

    靜態(tài)變量、全局變量和局部變量

    作用范圍內(nèi)可見。這一點是它與全局變量的區(qū)別。從以上分析可以看出,把局部變量改變?yōu)?b class='flag-5'>靜態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把全局
    發(fā)表于 06-20 09:52

    靜態(tài)變量的文件范圍

    嗨!我遇到了一個問題。我想引用(我不知道確切的術(shù)語是什么)或者使用pwm.c單元編譯中的main.c單元編譯中的靜態(tài)變量。但是,XC8用戶指南說:如果另一個源文件中定義的變量不是靜態(tài)的(參見
    發(fā)表于 03-12 09:54

    一看就知!static在編程中的作用到底是什么?

    能在這個函數(shù)里用了,同一個文件中其他函數(shù)是用不了的,同其他局部變量作用一樣的。生存期:由于被static修飾的變量總是存在內(nèi)存的
    發(fā)表于 06-20 13:19

    RAM的局部靜態(tài)變量和全局變量消耗

    因為在連接時,全局變量和局部靜態(tài)變量都是在data區(qū),所以在這里給放一起討論了。在原文中自己的表述犯了一個錯誤,就是初始化的全局變量或者局部靜態(tài)變量,是占用生成的可執(zhí)行文件大小。而未初
    發(fā)表于 11-03 08:54

    嵌入式C中的靜態(tài)變量是什么

    靜態(tài)變量與動態(tài)變量基本概念靜態(tài)變量:指的是在編譯時(compiling-time)變量的地址和大小都已經(jīng)確定下來的變量
    發(fā)表于 12-15 07:08

    ARM之靜態(tài)變量簡析

    類型。在某個函數(shù)中聲明的為內(nèi)部靜態(tài)變量。內(nèi)部靜態(tài)變量作用范圍僅限于定義它的函數(shù)中。因此,內(nèi)部static變量類似于auto變量,只不過au
    發(fā)表于 04-24 09:27

    什么是軟件生存期過程

    什么是軟件生存期過程 1 主題內(nèi)容與適用范圍   1.1 主題內(nèi)容   本標準規(guī)定
    發(fā)表于 04-14 10:20 ?845次閱讀

    軟件生存期過程(2)

    軟件生存期過程(2)  9 操作過程   操作過程含有操作者的活動和任務(wù)。  此過程包括系統(tǒng)操作和
    發(fā)表于 04-14 11:00 ?322次閱讀

    軟件生存期過程(1)

    軟件生存期過程(1)  6 獲取過程   獲取過程包含需方的活動和任務(wù)。此過程從定義軟件產(chǎn)品或服務(wù)的獲取需求開始。接
    發(fā)表于 04-14 11:10 ?1095次閱讀

    關(guān)于Java變量作用分析

    目錄 1.靜態(tài)作用與動態(tài)作用 2.變量作用
    發(fā)表于 09-25 16:28 ?0次下載

    單片機的靜態(tài)變量詳細資料講解

    靜態(tài)變量作用范圍在一個文件內(nèi),程序開始時分配空間,結(jié)束時釋放空間,默認初始化為0,使用時可以改變其值。
    發(fā)表于 05-30 17:55 ?0次下載
    單片機的<b class='flag-5'>靜態(tài)變量</b>詳細資料講解

    python變量作用

    python變量作用 1. 作用 Python的作用
    的頭像 發(fā)表于 03-03 16:50 ?1463次閱讀

    C語言里函數(shù)的定義、子函數(shù)的使用及變量作用

    這篇介紹C語言里函數(shù)的定義、子函數(shù)的使用。接著介紹變量作用,定義全局變量靜態(tài)變量、只讀變量
    的頭像 發(fā)表于 04-28 11:23 ?6467次閱讀

    static關(guān)鍵字的三種用法

    (StaticVariables):在C語言中,使用`static`關(guān)鍵字來聲明靜態(tài)變量是一種常見的用法,它具有以下主要作用:1.生存期延長:靜態(tài)變量
    的頭像 發(fā)表于 11-10 08:00 ?457次閱讀
    static關(guān)鍵字的三種用法