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

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

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

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

opkgjew ? 來(lái)源:劍指工控 ? 作者:萬(wàn)泉河 ? 2022-11-14 11:23 ? 次閱讀

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

所以先從計(jì)算機(jī)高級(jí)語(yǔ)言說(shuō)起。

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

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

第七章

7.8 局部變量和全局變量

7.9 動(dòng)態(tài)存儲(chǔ)變量和靜態(tài)存儲(chǔ)變量

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

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

C語(yǔ)言用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)變量。

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

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

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

嗯, 還真有不煩的。 誰(shuí)不煩?

PLC不煩。

因?yàn)镻LC的OB1是天生自動(dòng)循環(huán)的。

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

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

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

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

pYYBAGNxtO2Af_1VAADBvVMbi6o468.jpg

備注

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

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

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

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

比如要計(jì)算OUT=(A+B)/(C+D),

在LAD或者STL 里,通常要用1個(gè)或者2個(gè)臨時(shí)變量。

L #A

L #B

+R

T LD10

L #C

L #D

+R

T LD14

L LD10

L LD14

/R

T #OUT

這里使用的L區(qū),雙字,存儲(chǔ)REAL數(shù)據(jù)。 在STEP7中可以未加定義直接使用。 而在TIA PORTAL中要么提前定義, 要么直接使用名字后補(bǔ)充定義到LOCAL變量。不再允許絕對(duì)尋址。

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

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

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

MODBUS輪詢問題,用SCL語(yǔ)言的部分代碼(用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)變量。具體細(xì)分的話, 個(gè)別變量可能可以使用TEMP臨時(shí)變量, 但圖省事, 也就不那么細(xì)了。 反正最終完全封裝, 不會(huì)影響到外面其它函數(shù)的變量使用。

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

答案是:有時(shí)候能,有時(shí)候不能!

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

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

emmmm, 我這是在做什么?

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





審核編輯:劉清

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

    關(guān)注

    19

    文章

    7174

    瀏覽量

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

    關(guān)注

    1

    文章

    239

    瀏覽量

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

    關(guān)注

    0

    文章

    13

    瀏覽量

    6635
  • plc編程語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    1142

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

    類型。在某個(gè)函數(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)容   本標(biāo)準(zhǔn)規(guī)定
    發(fā)表于 04-14 10:20 ?844次閱讀

    軟件生存期過程(2)

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

    軟件生存期過程(1)

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

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

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

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

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

    python變量作用

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

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

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

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

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