很多初學者容易將 FC 及FB 相混淆,認為 FB 僅僅是比 FC 多了一個背景數據塊,這種認識是非常危險的。在 STEP7 的關于 FC 的描述是這樣的:
FC 是一個沒有存儲空間的邏輯塊。FC 的臨時變量存儲在本地數據堆棧中,這些數據在 FC 執行完畢后將會丟失。為了永久的保存數據,FC 可以使用共享數據塊。
由于 FC 沒有自己的存儲空間,所以必須指定實參給它的參數(這就是為什么 FC 的輸入輸出管腳必須填寫參數的原因)。FC 的臨時變量(位于本地數據堆棧中)是無法指定初始值的(由于本地數據堆棧是由系統自動動態使用的)。為了更形象的說明這一點,我們來看下面的例子,此例子對 L 堆棧在程序調用時的分配進行了詳細的講解:
L 堆棧永遠以地址“0”開始。在 L 堆棧中,會為每個 FC 提供一定地址空間,作為存放每個塊所擁有的固有數據或局部數據。當某個塊終止時,那么它的空間隨之也被重新釋放出來。指針總是指向當前打開塊的第一個字節。
運行等級 | L 堆棧中的字節數 | 指針 | |
調用OB1(帶有 20 個字節的系統固有數據和局部數據的 10 個附加字節) | 30 | 0 | |
調用 FC1(帶有 30 個字節的局部數據) 30 個字節 (OB1) + 30 個字節 (FC1) |
60 | 30 | |
調用 FC20(帶有 20 個字節的局部數據) 60 個字節 (OB1 + FC1) +20 個字節 FC10 |
80 | 60 | |
調用 FC21(帶有 20 個字節的局部數據) 60 個字節 (OB1 + FC1) +20 個字節 FC11 |
80 | 60 | |
調用 FC2(帶有 50 個字節的局部數據) 30 個字節 (OB1) +50 個字節 (FC2) |
80 | 30 | |
調用 FC30(帶有 10 個字節的局部數據) 80 個字節 (OB1 + FC2) +10 個字節 FC20 |
90 | 80 |
由上面的例子可以看出:對于FC20 曾經使用過的系統中 L 堆棧 60-80 區間(FC20 中地址范圍為 LB0-LB19)在 FC20 調用結束后,被提供給 FC21 使用(FC21 中地址范圍同樣為 LB0-LB19)。 對于 FC 的臨時變量認識不清晰,用戶在對臨時變量的使用當中,也經常會出現一些錯誤,下面將使用一個例子非常直觀地說明上面的問題
程序原目的:
在 OB1 在程序中調用FC20 后立即調用 FC21
FC20 中將 20 賦值給臨時變量 FC20_TEMP1,將 21 賦值給臨時變量 FC20_TEMP2FC21 中將 FC21_TEMP1,FC21_TEMP2 相加
程序分析:我們發現 FC20 中的臨時變量曾經出現的數值(20,21)被 FC21 中的臨時變量FC21_TEMP1, FC21_TEMP2 得到了,如果直接使用這兩個臨時變量進行加法操作,可以得到結果 41。對于編程人員來說,臨時變量必須要在所在程序段中賦值,而后使用。用戶對此例中的 FC21_TEMP1, FC21_TEMP2 必須先做清零處理,否則其在使用前即可能擁有數值。
結論:對于 FC 或 FB 中的臨時變量,不要希望將本次調用的數值可以存儲在里面以供下次程序調用使用,因為這些臨時變量所使用的 L 堆??臻g在 FC 或 FB 調用結束就釋放給系統了,其它后續程序可以任意使用。所以下列用法都是錯誤的:
將臨時變量用于上升/下降沿指令
將臨時變量用于自保持邏輯
臨時變量未在所在程序段中賦值,直接使用
審核編輯:郭婷
-
存儲
+關注
關注
13文章
4314瀏覽量
85846 -
堆棧
+關注
關注
0文章
182瀏覽量
19761
原文標題:FC 中臨時變量的使用:
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論