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

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

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

對于FC或FB中的臨時變量使用

機器人及PLC自動化應(yīng)用 ? 來源:機器人及PLC自動化應(yīng)用 ? 作者:機器人及PLC自動化 ? 2022-11-07 16:50 ? 次閱讀

很多初學者容易將 FC 及FB 相混淆,認為 FB 僅僅是比 FC 多了一個背景數(shù)據(jù)塊,這種認識是非常危險的。在 STEP7 的關(guān)于 FC 的描述是這樣的:

FC 是一個沒有存儲空間的邏輯塊。FC 的臨時變量存儲在本地數(shù)據(jù)堆棧中,這些數(shù)據(jù)在 FC 執(zhí)行完畢后將會丟失。為了永久的保存數(shù)據(jù),F(xiàn)C 可以使用共享數(shù)據(jù)塊。

由于 FC 沒有自己的存儲空間,所以必須指定實參給它的參數(shù)(這就是為什么 FC 的輸入輸出管腳必須填寫參數(shù)的原因)。FC 的臨時變量(位于本地數(shù)據(jù)堆棧中)是無法指定初始值的(由于本地數(shù)據(jù)堆棧是由系統(tǒng)自動動態(tài)使用的)。為了更形象的說明這一點,我們來看下面的例子,此例子對 L 堆棧在程序調(diào)用時的分配進行了詳細的講解:

L 堆棧永遠以地址“0”開始。在 L 堆棧中,會為每個 FC 提供一定地址空間,作為存放每個塊所擁有的固有數(shù)據(jù)或局部數(shù)據(jù)。當某個塊終止時,那么它的空間隨之也被重新釋放出來。指針總是指向當前打開塊的第一個字節(jié)。

運行等級 L 堆棧中的字節(jié)數(shù) 指針
調(diào)用OB1(帶有 20 個字節(jié)的系統(tǒng)固有數(shù)據(jù)和局部數(shù)據(jù)的 10 個附加字節(jié)) 30 0
調(diào)用 FC1(帶有 30 個字節(jié)的局部數(shù)據(jù))
30 個字節(jié) (OB1) + 30 個字節(jié) (FC1)
60 30
調(diào)用 FC20(帶有 20 個字節(jié)的局部數(shù)據(jù))
60 個字節(jié) (OB1 + FC1) +20 個字節(jié) FC10
80 60
調(diào)用 FC21(帶有 20 個字節(jié)的局部數(shù)據(jù))
60 個字節(jié) (OB1 + FC1) +20 個字節(jié) FC11
80 60
調(diào)用 FC2(帶有 50 個字節(jié)的局部數(shù)據(jù))
30 個字節(jié) (OB1) +50 個字節(jié) (FC2)
80 30
調(diào)用 FC30(帶有 10 個字節(jié)的局部數(shù)據(jù))
80 個字節(jié) (OB1 + FC2) +10 個字節(jié) FC20
90 80

由上面的例子可以看出:對于FC20 曾經(jīng)使用過的系統(tǒng)中 L 堆棧 60-80 區(qū)間(FC20 中地址范圍為 LB0-LB19)在 FC20 調(diào)用結(jié)束后,被提供給 FC21 使用(FC21 中地址范圍同樣為 LB0-LB19)。 對于 FC 的臨時變量認識不清晰,用戶在對臨時變量的使用當中,也經(jīng)常會出現(xiàn)一些錯誤,下面將使用一個例子非常直觀地說明上面的問題

程序原目的:

在 OB1 在程序中調(diào)用FC20 后立即調(diào)用 FC21

FC20 中將 20 賦值給臨時變量 FC20_TEMP1,將 21 賦值給臨時變量 FC20_TEMP2FC21 中將 FC21_TEMP1,F(xiàn)C21_TEMP2 相加

程序分析:我們發(fā)現(xiàn) FC20 中的臨時變量曾經(jīng)出現(xiàn)的數(shù)值(20,21)被 FC21 中的臨時變量FC21_TEMP1, FC21_TEMP2 得到了,如果直接使用這兩個臨時變量進行加法操作,可以得到結(jié)果 41。對于編程人員來說,臨時變量必須要在所在程序段中賦值,而后使用。用戶對此例中的 FC21_TEMP1, FC21_TEMP2 必須先做清零處理,否則其在使用前即可能擁有數(shù)值。

016556ba-5e77-11ed-a3b6-dac502259ad0.png

結(jié)論:對于 FC 或 FB 中的臨時變量,不要希望將本次調(diào)用的數(shù)值可以存儲在里面以供下次程序調(diào)用使用,因為這些臨時變量所使用的 L 堆??臻g在 FC 或 FB 調(diào)用結(jié)束就釋放給系統(tǒng)了,其它后續(xù)程序可以任意使用。所以下列用法都是錯誤的:

將臨時變量用于上升/下降沿指令

將臨時變量用于自保持邏輯

臨時變量未在所在程序段中賦值,直接使用

審核編輯:郭婷

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

    關(guān)注

    13

    文章

    4122

    瀏覽量

    85272
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    176

    瀏覽量

    19668

原文標題:FC 中臨時變量的使用:

文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    CC2340R5有沒有變量可以代替直接使用地址0x400043FC,該如何使用?

    我現(xiàn)在需要SYS0_DEVICED內(nèi)存中高位數(shù)據(jù),目前在內(nèi)存對應(yīng)的是0x400043FC。 SYS0_DEVICED會一直是0x400043FC嗎? 有沒有變量可以代替直接使用地址
    發(fā)表于 05-30 08:21

    如何調(diào)整S7-1500S7-GRAPH FB的保持性屬性

    FB 塊屬性“優(yōu)化的塊訪問”默認勾選并且顯示灰色無法操作,如圖 2 所示。對于需要從CPU停止時所處步號繼續(xù)運行的應(yīng)用場合,必須設(shè)置保持性屬性為“保持”。
    發(fā)表于 04-03 09:17 ?440次閱讀
    如何調(diào)整S7-1500<b class='flag-5'>中</b>S7-GRAPH <b class='flag-5'>FB</b>的保持性屬性

    西門子博途:SCLFB模塊的結(jié)構(gòu)

    模塊FB是用于控制執(zhí)行器和單元的功能模塊執(zhí)行某一功能的其他FB的塊。 VASS庫不可用的塊必須由系統(tǒng)供應(yīng)商與負責的標準化電氣工程部門協(xié)商創(chuàng)建。
    發(fā)表于 01-18 10:38 ?1071次閱讀
    西門子博途:SCL<b class='flag-5'>中</b><b class='flag-5'>FB</b>模塊的結(jié)構(gòu)

    SCLFB模塊的結(jié)構(gòu)

    模塊FB是用于控制執(zhí)行器和單元的功能模塊執(zhí)行某一功能的其他FB的塊。
    的頭像 發(fā)表于 01-17 09:22 ?526次閱讀
    SCL<b class='flag-5'>中</b><b class='flag-5'>FB</b>模塊的結(jié)構(gòu)

    自動控制系統(tǒng)的操縱變量指什么

    自動控制系統(tǒng)的操縱變量指的是在系統(tǒng)由控制器控制的可調(diào)節(jié)參數(shù),用于調(diào)節(jié)改變被控對象的輸出狀態(tài)。操縱
    的頭像 發(fā)表于 01-15 11:29 ?3768次閱讀

    C語言:指針內(nèi)存是如何存放變量

    在程序定義一個變量,那么在程序編譯的過程,系統(tǒng)會根據(jù)你定義變量的類型來分配「相應(yīng)尺寸」的內(nèi)存空間。那么如果要使用這個變量,只需要用
    發(fā)表于 01-08 10:14 ?355次閱讀

    stm32變量能存進flash

    當涉及到將變量存儲在Flash時,我們通常指的是將變量存儲在STM32微控制器的閃存器件。在STM32芯片中,閃存用于存儲程序代碼和只讀數(shù)據(jù),但
    的頭像 發(fā)表于 12-28 15:33 ?1862次閱讀

    西門子博途:調(diào)用FB(實例化)

    與功能塊(FC)相比,功能塊(FB)具有存儲器。這意味著功能塊被分配了一個本地數(shù)據(jù)塊,即所謂的實例數(shù)據(jù)塊。當調(diào)用FB時,還必須指定實例DB的編號,并且此DB會自動打開。
    的頭像 發(fā)表于 12-25 11:04 ?2325次閱讀
    西門子博途:調(diào)用<b class='flag-5'>FB</b>(實例化)

    javascript的變量可以包含

    JavaScript是一種強大的編程語言,廣泛應(yīng)用于網(wǎng)頁開發(fā)和動態(tài)網(wǎng)頁交互。作為一種靈活的語言,JavaScript允許開發(fā)人員聲明和操作各種類型的變量。在JavaScript,變量可以包含
    的頭像 發(fā)表于 12-03 11:34 ?612次閱讀

    python變量命名規(guī)則

    的規(guī)則和約定。本文將詳盡、詳實、細致地探討Python變量的命名規(guī)則,幫助讀者了解如何正確命名變量并在編程遵循最佳實踐。 一、變量命名規(guī)則的重要性 合適的
    的頭像 發(fā)表于 11-23 15:44 ?1022次閱讀

    for循環(huán)里的變量是局部變量

    對于一個普通for循環(huán)而言,循環(huán)變量是局部變量。在大多數(shù)編程語言中,循環(huán)變量只在循環(huán)內(nèi)部的作用域中可見。換句話說,循環(huán)變量的聲明和賦值僅在循
    的頭像 發(fā)表于 11-23 14:50 ?1865次閱讀

    什么是FB功能塊?為什么要使用FB功能塊?如何制作一個FB功能塊?

      FB功能塊是一種封裝了特定邏輯功能的模塊。它類似于一個子程序函數(shù),但是它有自己的內(nèi)部變量和接口。FB功能塊可以被多次調(diào)用,并且每次調(diào)用都會創(chuàng)建一個新的實例。
    的頭像 發(fā)表于 11-09 16:13 ?3092次閱讀
    什么是<b class='flag-5'>FB</b>功能塊?為什么要使用<b class='flag-5'>FB</b>功能塊?如何制作一個<b class='flag-5'>FB</b>功能塊?

    Shell腳本變量詳解

    使用 unset 命令可以刪除變量。變量被刪除后不能再次使用。unset 命令不能刪除只讀變量。
    的頭像 發(fā)表于 10-27 11:21 ?449次閱讀

    什么是變量?PLC變量哪些部分組成?

    變量在 TIA Portal 中集中管理。 在程序編輯器創(chuàng)建 PLC 變量與在 PLC 變量創(chuàng)建 PLC
    發(fā)表于 10-15 11:31 ?4245次閱讀
    什么是<b class='flag-5'>變量</b>?PLC<b class='flag-5'>變量</b>哪些部分組成?

    Java變量的命名規(guī)范

    兩部分:變量的名字和變量的值,可通過變量名來訪問變量值。簡單來說,變量就是存儲數(shù)據(jù)的載體。 對于
    的頭像 發(fā)表于 10-10 11:49 ?624次閱讀