一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

opkgjew ? 來源:劍指工控 ? 作者:萬泉河 ? 2022-11-14 11:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

所以先從計(jì)算機(jī)高級語言說起。

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

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

第七章

7.8 局部變量和全局變量

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

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

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

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)變量

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

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

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

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

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ī)制本身來驅(qū)動(dòng)。 不需要自己做循環(huán)程序(而且也不能做, 如果做的話CPU單個(gè)周期運(yùn)轉(zhuǎn)時(shí)間過長, 會累死。)

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

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

pYYBAGNxtO2Af_1VAADBvVMbi6o468.jpg

備注

* 對于被嵌套調(diào)用的函數(shù)塊FB/FC/OB來說, 各自定義的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ū),雙字,存儲REAL數(shù)據(jù)。 在STEP7中可以未加定義直接使用。 而在TIA PORTAL中要么提前定義, 要么直接使用名字后補(bǔ)充定義到LOCAL變量。不再允許絕對尋址。

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

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

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

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

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

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

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

上面的功能中還使用了定時(shí)器, 只不過代碼沒有貼出來。 也是同樣的道理。 只不過定時(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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7663

    瀏覽量

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

    關(guān)注

    1

    文章

    243

    瀏覽量

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

    關(guān)注

    0

    文章

    13

    瀏覽量

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

    關(guān)注

    0

    文章

    7

    瀏覽量

    1265

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎ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)變量后是改變了它的存儲方式即改變了它的生存期。把全局
    發(fā)表于 06-20 09:52

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

    嗨!我遇到了一個(gè)問題。我想引用(我不知道確切的術(shù)語是什么)或者使用pwm.c單元編譯中的main.c單元編譯中的靜態(tài)變量。但是,XC8用戶指南說:如果另一個(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)確定下來的變量動(dòng)
    發(fā)表于 12-15 07:08

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

    類型。在某個(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 ?911次閱讀

    軟件生存期過程(2)

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

    軟件生存期過程(1)

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

    關(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 ?1842次閱讀

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

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

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

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