91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

全局變量與全局訪問之間的差異

opkgjew ? 來源:PLC標(biāo)準(zhǔn)化編程 ? 作者:萬泉河0031 ? 2022-11-14 11:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

簡單說,全局變量、局部變量是變量自身的身份。身份的不同是靠出生地決定的。而能否被全能局訪問,能被多大范圍空間訪問,即首篇文章中講到的作用域,是完全不同的概念。不能混而等同之。

然而,如果大家對寫程序并沒有什么原則目標(biāo), 只以完成設(shè)計任務(wù)為目的,以設(shè)備最終能跑起來為目的,這些概念不清楚也無所謂。尤其只在西門子平臺內(nèi)談,沒有橫向的對比,就得不出更深刻的經(jīng)驗。

所以,這個話題就放下了。估計當(dāng)年的讀者們也都放下了,沒幾個人放在心上。

我自己最近在編寫《三菱PLC標(biāo)準(zhǔn)化煙臺方法》的書,在寫書的過程中,在做一些小例子來驗證功能。其中把西門子的程序移植到了GX WORKS2,寫完了GX2的章節(jié)。然后現(xiàn)在又把程序移植到GX WORKS3,為GX3的章節(jié)整理素材。就發(fā)現(xiàn)了問題。

簡單描述,就是原本在西門子程序中,有外部對FB塊內(nèi)的靜態(tài)變量訪問,到GX2,也仍然這么做的。但移植到GX3時,發(fā)現(xiàn)了問題,編譯報錯。

經(jīng)咨詢?nèi)鈽?biāo)準(zhǔn)化的學(xué)員,得到提醒, 說新的GX3平臺,靜態(tài)變量VAR多出來一個VAR_PUBLIC的類型,可以支持外部訪問。照著修改之后,果然沒問題了。

(很多人以為我做啥品牌的標(biāo)準(zhǔn)化方法,就一定要在掌握這個品牌全部的高精端的知識基礎(chǔ)上,其實恰恰相反, 我只是對標(biāo)準(zhǔn)化架構(gòu)熟悉,而對這些具體品牌和軟件的使用,我反而時刻在跟學(xué)員們學(xué)習(xí)請教。)

我現(xiàn)在回過頭看我當(dāng)年提出的問題,就很清楚了。靜態(tài)變量能被全局訪問,被很多人誤以為就是等同于全局變量,那是因為只在西門子的井底。當(dāng)視界擴大到所有PLC品牌和平臺之后,就不一樣了。甚至GX2和GX3都不一樣。

GX2中VAR可以被全局訪問,而GX3中則不可以。

你總不能認(rèn)為GX2中的VAR是全局變量,而GX3中的 VAR就不是全局變量了吧?

發(fā)現(xiàn)這個問題的起源的程序塊來自西門子官方庫BST,先后移植到GX2和GX3。而根源又是其設(shè)計的部分靜態(tài)變量要被WINCC訪問,即勾選了HMI/OPC可見的選項。

在PORTAL中,不管是否勾選,影響的只是WINCC訪問的權(quán)限,而在程序中FB外的訪問都是暢通無阻的。

我在上帝一篇中建議過加個開關(guān),關(guān)掉被塊外部訪問的權(quán)限,現(xiàn)在看,GX3果然做到了。

而最近幾天,也有學(xué)員在開發(fā)自己的庫函數(shù),跟我溝通相似的問題。問我與WINCC通訊相關(guān)的變量放在OUTPUT還是STATIC更合適的問題。

我給與的回答是,原則上來講,應(yīng)該放到INOUT或者OUTPUT。而放到VAR STATIC是不合適的,不符合封裝的原則。比如我這次的移植,就出現(xiàn)了問題。

不能因為看到有西門子官方的例子程序這么做過,就理所當(dāng)然的認(rèn)為就是正確無誤的。他們的作者也是普通的工控工程師,也未必事事都嚴(yán)格規(guī)范。

而我很容易就從西門子官方出的《設(shè)計規(guī)范指南》中找到了理論依據(jù)。

其中的DA005規(guī)則:只通過形參交換數(shù)據(jù)

DA006規(guī)則:僅從塊內(nèi)訪問靜態(tài)變量

5eb973dc-6273-11ed-8abf-dac502259ad0.png

有人會杠, 如果不讓從塊外訪問靜態(tài)變量, 那系統(tǒng)為啥要設(shè)計為可以訪問?

就如同我一直在推廣PLC中編程不要使用M全局變量的理論,有人杠我系統(tǒng)設(shè)計了就該允許使用一個邏輯。

答案是系統(tǒng)提供的功能是給非規(guī)范的程序準(zhǔn)備的。未必所有程序,比如測試學(xué)習(xí)程序也需要完全遵守規(guī)范。

而倒過來說,如果系統(tǒng)提供的功能即符合規(guī)范規(guī)則,只要規(guī)范規(guī)則之外的用法系統(tǒng)即不允許。如我在GX3遇到的這樣。那么,連編程規(guī)范都不需要存在。西門子也不需要整理一個設(shè)計規(guī)范了。

你做的不對, 編譯都不通過,保存都亮紅燈的事,還需要寫在規(guī)范里面嗎?

規(guī)范里的所有違反規(guī)范的相反的做法,都是可以用的,無非是不規(guī)范而已。

所以,我們在GX3遇到的問題, 那些導(dǎo)致編譯錯誤的變量, 正確規(guī)范的數(shù)據(jù)類型應(yīng)該是INOUT和OUTPUT。

有一些剛?cè)腴T的工程師, 甚至連FB都不會用,從未用過的工程師,會看不懂我的這些文章,會質(zhì)疑這些文章傳播的知識什么用,我不懂你這些道理,我甚至不需要用FB,不也照樣做出功能正常運行的設(shè)備嗎?

我借用某Z常說的一句話:“基礎(chǔ)不牢,地動山搖”。其實我不完全認(rèn)同這個道理的?;A(chǔ)不牢,不會導(dǎo)致你地動山搖,你在入門級別的工作并不受影響。而恰恰反過來,如果基礎(chǔ)牢了, 會有更高的起飛的空間。

就好比,田徑運動員基礎(chǔ)的動作姿勢如果不標(biāo)準(zhǔn),在校級運動會可能沒什么大的影響,照樣有可能獲得校運會冠軍。然而當(dāng)?shù)搅烁蟮奶斓亻g,就會發(fā)現(xiàn)姿勢標(biāo)準(zhǔn)的重要性了。而等到了奧運會選手的級別,所有的運動員動作一定都是最標(biāo)準(zhǔn)的了。因為那是基礎(chǔ)的基本功。




審核編輯:劉清

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

    關(guān)注

    9

    文章

    714

    瀏覽量

    51975
  • VaR
    VaR
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

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

    關(guān)注

    0

    文章

    13

    瀏覽量

    6878

原文標(biāo)題:1112 【萬泉河】FB內(nèi)靜態(tài)變量的使用

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    嵌入式C語言中各變量存儲位置

    局部變量、局部靜態(tài)變量全局變量全局靜態(tài)變量區(qū)別如下: 局部變量: 棧區(qū); 局部靜態(tài)
    發(fā)表于 12-25 07:54

    如何搞定嵌入式 C語言中的全局變量問題?

    、它會造成不必要的常量頻繁使用,特別當(dāng)這個常量沒有用宏定義“正名”時,代碼閱讀起來將萬分吃力。 2、它會導(dǎo)致軟件分層的不合理,全局變量相當(dāng)于一條快捷通道,它容易使程序員模糊了“設(shè)備層”和“應(yīng)用層”之間
    發(fā)表于 12-16 06:54

    C語言全局變量重點使用

    全局變量絕不會位于寄存器中。使用指針或者函數(shù)調(diào)用,可以直接修改全局變量的值。 因此,編譯器不能將全局變量的值緩存在寄存器中,但這在使用全局變量時便需要額外的 (常常是不必要的)讀取和存
    發(fā)表于 12-12 06:58

    第7章 變量進階與點陣LED(7.1 7.2)

    知識——變量的作用域和存儲類別。 7.1變量的作用域 所謂的作用域就是指變量起作用的范圍,也是變量的有效范圍。變量按他的作用域可以分為局部
    的頭像 發(fā)表于 12-10 16:25 ?350次閱讀

    看懂C語言程序中的內(nèi)聚和耦合

    ,稱為特征耦合,在這里,使函數(shù)之間產(chǎn)生聯(lián)系的是地址這樣的特征標(biāo)識。另外,有兩個函數(shù)可能會打開同一個文件進行操作,這也構(gòu)成了特征耦合的一種形式。 更強的耦合是外部耦合,這里,一組模塊都訪問同一全局變量
    發(fā)表于 12-08 06:37

    請問C語言開發(fā)單片機為什么大多數(shù)都采用全局變量的形式?

    C語言代碼,大多數(shù)都是使用全局變量,也就是用很多函數(shù)來操作這些變量,比如函數(shù)1把一個全局變量經(jīng)過一系列復(fù)雜的算法計算后改變了這個全局變量的值,然后函數(shù)2再拿著函數(shù)1處理過的這個
    發(fā)表于 12-04 07:47

    哪些場合會用到volatile關(guān)鍵字?

    當(dāng)你理解 volatile關(guān)鍵字的含義之后,你就能明白,其實很多場合都能用到 volatile關(guān)鍵字。 1.全局變量單片機開發(fā),難免會用到全局變量。一些初級工程師,更是全局變量滿天飛。這種情況下
    發(fā)表于 11-25 08:19

    常用變量的介紹

    extern:用在全局變量上表示該變量在其他文件中已經(jīng)定義;用在函數(shù)上作用同全局變量; static:用在全局變量上,和非靜態(tài)全局變量相比,
    發(fā)表于 11-21 07:05

    C語言開發(fā)單片機為什么大多數(shù)都采用全局變量的形式?

    單片機的芯片資源從來都是 “精打細(xì)算” 的級別,CPU 主頻普遍不高,RAM 總?cè)萘勘揪途o張,分給??臻g的更是少得可憐。要是像普通軟件那樣,依賴函數(shù)返回值傳遞數(shù)據(jù)、頻繁用局部變量周轉(zhuǎn),一來二去占用
    的頭像 發(fā)表于 11-12 14:29 ?424次閱讀
    C語言開發(fā)單片機為什么大多數(shù)都采用<b class='flag-5'>全局變量</b>的形式?

    求助,關(guān)于全局中斷使能的問題求解

    各位朋友大家好,我最近在使用蜂鳥的板子進行開發(fā)時,遇到了這樣的問題:我的程序每次運行到使能全局中斷的時候,就像進入了死循環(huán)一樣,出不去了,如上圖,首先先打印“GI_EN begin!”這里是可以
    發(fā)表于 11-07 06:37

    按照芯來文檔設(shè)置可以通過segger IDE debug了,但是沒法看全局或者局部變量值,怎么解決?

    如題,按照芯來文檔設(shè)置可以通過segger IDE debug了,但是沒法看全局或者局部變量值,很麻煩。有遇到過解決了的嗎?
    發(fā)表于 10-20 09:20

    請問Modus Toolbox下針對CYW20719B2編程,能否指定全局變量地址?

    請問Modus Toolbox 下針對CYW20719B2編程,能否指定全局變量地址?
    發(fā)表于 07-08 07:20

    全局快門圖像傳感器技術(shù)的改進提升了機器視覺效率

    先進視覺系統(tǒng)應(yīng)運而生,而高速、全畫幅全局快門傳感器是這些系統(tǒng)的核心。全局快門能夠即時捕捉拍攝對象的完整視圖,這非常重要。 ? 基于全局快門的系統(tǒng)可以消除許多常見于視覺系統(tǒng)的視覺偽影(例如擺動、傾斜和空間混疊等),有助于
    發(fā)表于 05-20 16:18 ?1955次閱讀
    <b class='flag-5'>全局</b>快門圖像傳感器技術(shù)的改進提升了機器視覺效率

    VirtualLab Fusion應(yīng)用:參數(shù)耦合

    。 源代碼標(biāo)簽包含以下三部分: 源代碼(中心區(qū)域) 全局變量/參數(shù)(右側(cè)上端) 選擇系統(tǒng)參數(shù)(右側(cè)底端) 6.參數(shù)耦合的一般示例 ?通常,利用代碼字典讀取所選參數(shù)并將其保存到變量(第4行)。 ?之后
    發(fā)表于 03-17 11:11

    求助,關(guān)于STM32G070封裝HAL_GetTick的疑問求解

    HAL_GetTick函數(shù),默認(rèn)使用了滴答定時器中斷,并使用了全局變量uwTick,這個變量是32位的,那變量溢出了就會從0開始,許多外設(shè)超時判斷的語句是HAL_GetTick() - Tickstart>TimeOut,
    發(fā)表于 03-14 07:20