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

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

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

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

全局變量與全局訪問(wèn)之間的差異

opkgjew ? 來(lái)源:PLC標(biāo)準(zhǔn)化編程 ? 作者:萬(wàn)泉河0031 ? 2022-11-14 11:21 ? 次閱讀

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

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

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

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

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

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

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

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

GX2中VAR可以被全局訪問(wèn),而GX3中則不可以。

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

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

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

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

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

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

不能因?yàn)榭吹接形鏖T(mén)子官方的例子程序這么做過(guò),就理所當(dāng)然的認(rèn)為就是正確無(wú)誤的。他們的作者也是普通的工控工程師,也未必事事都嚴(yán)格規(guī)范。

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

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

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

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

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

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

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

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

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

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

所以,我們?cè)贕X3遇到的問(wèn)題, 那些導(dǎo)致編譯錯(cuò)誤的變量, 正確規(guī)范的數(shù)據(jù)類(lèi)型應(yīng)該是INOUT和OUTPUT。

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

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

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




審核編輯:劉清

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

    關(guān)注

    9

    文章

    621

    瀏覽量

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

    關(guān)注

    0

    文章

    39

    瀏覽量

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

    關(guān)注

    0

    文章

    13

    瀏覽量

    6753

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    onsemi全局快門(mén)圖像傳感器—了解圖像傳感器的選型要點(diǎn)

    統(tǒng)應(yīng)運(yùn)而生,而高速、全畫(huà)幅全局快門(mén)傳感器是這些系統(tǒng)的核心。全局快門(mén)能夠即時(shí)捕捉拍攝對(duì)象的完整視圖,這非常重要?;?b class='flag-5'>全局快門(mén)的系統(tǒng)可以消除許多常見(jiàn)于視覺(jué)系統(tǒng)的視覺(jué)偽
    的頭像 發(fā)表于 12-20 16:15 ?647次閱讀
    onsemi<b class='flag-5'>全局</b>快門(mén)圖像傳感器—了解圖像傳感器的選型要點(diǎn)

    為什么同一個(gè)隊(duì)列引用的全局變量,運(yùn)行在兩個(gè)子vi中發(fā)現(xiàn)隊(duì)列數(shù)據(jù)丟失了

    我創(chuàng)建了一個(gè)隊(duì)列,然后將隊(duì)列引用做了個(gè)全局變量,運(yùn)行在兩個(gè)子vi中,一個(gè)是只入隊(duì)列,另一個(gè)是只出隊(duì)列。但我發(fā)現(xiàn),一個(gè)字vi數(shù)據(jù)入隊(duì)列成功,檢查隊(duì)列元素?cái)?shù)量也已經(jīng)是1了,這時(shí)我運(yùn)行另一個(gè)子vi,出隊(duì)列前檢查隊(duì)列數(shù)量發(fā)現(xiàn)為0了。隊(duì)列里的數(shù)據(jù)沒(méi)了。而且這個(gè)情況不是一直有,是偶爾發(fā)生。
    發(fā)表于 11-14 11:47

    通過(guò)設(shè)置全局變量I2S0,I2S1觸發(fā)DMA機(jī)制的疑問(wèn)求解答

    在跟蹤esp32-web-camera的代碼時(shí),看到了通過(guò)設(shè)置全局變量I2S0,I2S1,觸發(fā)DMA的機(jī)制,對(duì)于結(jié)構(gòu)體i2s_dev_t的各字段不是很理解,不懂哪里有這方面的文檔,另外通過(guò)設(shè)置變量
    發(fā)表于 06-13 07:42

    LABVIEW調(diào)用DLL,DLL中包含全局變量不識(shí)別的問(wèn)題

    頭文件中寫(xiě)法如上,.cpp文件中寫(xiě)法如下 導(dǎo)入DLL時(shí),錯(cuò)誤如下 這個(gè)報(bào)錯(cuò)就很沒(méi)有道理 我在同樣的文件中按同樣的寫(xiě)法,寫(xiě)一個(gè)add(a,b,c)函數(shù),同樣寫(xiě)全局變量的話,它就不會(huì)報(bào)這樣的錯(cuò),所以我可以排除是頭文件或者預(yù)處理定義的問(wèn)題。 很頭疼,有沒(méi)有大神指導(dǎo)一下。
    發(fā)表于 05-31 09:37

    TC375如何將變量值保存到非易失性存儲(chǔ)器中?

    我有一臺(tái) TC375,正在開(kāi)發(fā)工作室進(jìn)行編程。 我的軟件有一個(gè)控制系統(tǒng),它使用一組我可以調(diào)整的參數(shù)。 這些參數(shù)設(shè)置為全局變量。 一旦我對(duì)它們進(jìn)行了調(diào)整,控制器復(fù)位后就無(wú)法保持它們的值。 是否有辦法使用閃存編程示例,用新值更新 Pflash 或 Dflash 中的地址,使其存儲(chǔ)在非易失性存儲(chǔ)器中?
    發(fā)表于 05-31 06:40

    思特威最新全局快門(mén)技術(shù)在無(wú)人機(jī)、機(jī)器人等領(lǐng)域的應(yīng)用

    全局快門(mén)與卷簾快門(mén)有別,前者在同一時(shí)間內(nèi)對(duì)整個(gè)圖像傳感器上的所有像素點(diǎn)進(jìn)行曝光,保證畫(huà)面整體亮度均勻;后者則是逐行曝光,各行曝光時(shí)間可能存在差異。
    的頭像 發(fā)表于 05-18 16:07 ?847次閱讀

    keil中Logic Analyzer可以在硬件上在線調(diào)試,為什么把全局變量加入Logic Analyzer不顯示波形呢?

    keil中Logic Analyzer可以在硬件上在線調(diào)試,按照說(shuō)明文檔上調(diào)試,用的是SW模式,為什么把全局變量加入Logic Analyzer不顯示波形呢?是不是時(shí)鐘頻率選擇的不合適?還是必須得對(duì)調(diào)試寄存器配置?
    發(fā)表于 05-16 06:47

    建立更多的全局變量的時(shí)候,如何使得PROGRAM SIZE不增大呢?

    今天發(fā)現(xiàn),建立更多的全局變量的時(shí)候,PROGRAM SIZE同時(shí)也增大了,如何使得PROGRAM SIZE不增大呢?我對(duì)全局變量的初始化無(wú)要求。
    發(fā)表于 05-15 06:30

    COSMIC在外部中斷中修改全局變量后,發(fā)現(xiàn)在主程序中,修改的值又變回來(lái)了,為什么?

    我用的COSMIC,在外部中斷中修改全局變量后,發(fā)現(xiàn)在主程序中,修改的值又變回來(lái)了(比如說(shuō)我想計(jì)數(shù)外部中斷的次數(shù))。這是怎么回事?而我在定時(shí)中斷中卻可以修改全局變量
    發(fā)表于 05-13 08:45

    IAR調(diào)試STM32F4XX時(shí),一下斷點(diǎn)就出現(xiàn)全局變量被覆蓋的情況是什么原因?qū)е碌模?/a>

    IAR調(diào)試STM32F405VG時(shí),一下斷點(diǎn)就出現(xiàn)全局變量被覆蓋的情況。 //進(jìn)入該函數(shù)后,單步的時(shí)候_X這個(gè)全局變量的內(nèi)容被覆蓋,設(shè)置的func_triggered函數(shù)地址被改變,觸發(fā)
    發(fā)表于 05-11 06:52

    stm32 tim1輸入捕獲+DMA,如果長(zhǎng)時(shí)間無(wú)脈寬信號(hào),輸出報(bào)警信號(hào)怎么解決?

    要求:實(shí)現(xiàn)測(cè)量外部脈沖寬度,讀取脈寬后,清除脈寬數(shù)據(jù),如果長(zhǎng)時(shí)間無(wú)脈寬信號(hào),輸出報(bào)警信號(hào)。 實(shí)現(xiàn)方式:使用stm32 tim1輸入捕獲+DMA方式,把捕獲的脈寬通過(guò)DMA方式存儲(chǔ)到全局變量中,軟件
    發(fā)表于 05-11 06:08

    使用IAR定義全局變量出現(xiàn)兩個(gè)同名不同地址變量是什么原因?qū)е碌模?/a>

    使用IAR定義全局變量出現(xiàn)兩個(gè)同名不同地址變量 systickCount和systickFlag都在另一個(gè)c文件里定義的,假設(shè)a.c,然后在a.h里聲明為外部變量,main.c
    發(fā)表于 05-10 06:09

    請(qǐng)問(wèn)ucos中全局變量OSTime最終能累加到多少呢?

    在ucos-ii 中全局變量 OSTime 總是++請(qǐng)問(wèn)最終能累加到多少呢? 若加到65530后 會(huì)自動(dòng)歸零嗎?
    發(fā)表于 05-09 06:22

    HarmonyOS實(shí)戰(zhàn)開(kāi)發(fā)-全局狀態(tài)保留能力彈窗

    介紹 全局狀態(tài)保留能力彈窗一種很常見(jiàn)的能力,能夠保持狀態(tài),且支持全局控制顯隱狀態(tài)以及自定義布局。使用效果參考評(píng)論組件 效果圖預(yù)覽 使用說(shuō)明 首先程序入口頁(yè)對(duì)全局彈窗初始化
    發(fā)表于 05-07 14:53

    請(qǐng)問(wèn)stm32程序中如何優(yōu)化大量的編譯開(kāi)關(guān)和全局變量

    剛接手一個(gè)程序,發(fā)現(xiàn)里面存在大量的編譯開(kāi)關(guān)和定義了大量的全局變量,感覺(jué)這些顯得很是臃腫,有什么方法可以優(yōu)化一下這些編譯開(kāi)關(guān)和全局變量? 全局變量是一個(gè)個(gè)的標(biāo)志位,有時(shí)候還會(huì)有條件嵌套。
    發(fā)表于 05-06 06:35