很多初學(xué)者容易將 FC 及FB 相混淆,認(rèn)為 FB 僅僅是比 FC 多了一個(gè)背景數(shù)據(jù)塊,這種認(rèn)識(shí)是非常危險(xiǎn)的。在 STEP7 的關(guān)于 FC 的描述是這樣的:
FC 是一個(gè)沒有存儲(chǔ)空間的邏輯塊。FC 的臨時(shí)變量存儲(chǔ)在本地?cái)?shù)據(jù)堆棧中,這些數(shù)據(jù)在 FC 執(zhí)行完畢后將會(huì)丟失。為了永久的保存數(shù)據(jù),F(xiàn)C 可以使用共享數(shù)據(jù)塊。
由于 FC 沒有自己的存儲(chǔ)空間,所以必須指定實(shí)參給它的參數(shù)(這就是為什么 FC 的輸入輸出管腳必須填寫參數(shù)的原因)。FC 的臨時(shí)變量(位于本地?cái)?shù)據(jù)堆棧中)是無法指定初始值的(由于本地?cái)?shù)據(jù)堆棧是由系統(tǒng)自動(dòng)動(dòng)態(tài)使用的)。為了更形象的說明這一點(diǎn),我們來看下面的例子,此例子對(duì) L 堆棧在程序調(diào)用時(shí)的分配進(jìn)行了詳細(xì)的講解:
L 堆棧永遠(yuǎn)以地址“0”開始。在 L 堆棧中,會(huì)為每個(gè) FC 提供一定地址空間,作為存放每個(gè)塊所擁有的固有數(shù)據(jù)或局部數(shù)據(jù)。當(dāng)某個(gè)塊終止時(shí),那么它的空間隨之也被重新釋放出來。指針總是指向當(dāng)前打開塊的第一個(gè)字節(jié)。
| 運(yùn)行等級(jí) | L 堆棧中的字節(jié)數(shù) | 指針 | |
| 調(diào)用OB1(帶有 20 個(gè)字節(jié)的系統(tǒng)固有數(shù)據(jù)和局部數(shù)據(jù)的 10 個(gè)附加字節(jié)) | 30 | 0 | |
|
調(diào)用 FC1(帶有 30 個(gè)字節(jié)的局部數(shù)據(jù)) 30 個(gè)字節(jié) (OB1) + 30 個(gè)字節(jié) (FC1) |
60 | 30 | |
|
調(diào)用 FC20(帶有 20 個(gè)字節(jié)的局部數(shù)據(jù)) 60 個(gè)字節(jié) (OB1 + FC1) +20 個(gè)字節(jié) FC10 |
80 | 60 | |
|
調(diào)用 FC21(帶有 20 個(gè)字節(jié)的局部數(shù)據(jù)) 60 個(gè)字節(jié) (OB1 + FC1) +20 個(gè)字節(jié) FC11 |
80 | 60 | |
|
調(diào)用 FC2(帶有 50 個(gè)字節(jié)的局部數(shù)據(jù)) 30 個(gè)字節(jié) (OB1) +50 個(gè)字節(jié) (FC2) |
80 | 30 | |
|
調(diào)用 FC30(帶有 10 個(gè)字節(jié)的局部數(shù)據(jù)) 80 個(gè)字節(jié) (OB1 + FC2) +10 個(gè)字節(jié) FC20 |
90 | 80 |
由上面的例子可以看出:對(duì)于FC20 曾經(jīng)使用過的系統(tǒng)中 L 堆棧 60-80 區(qū)間(FC20 中地址范圍為 LB0-LB19)在 FC20 調(diào)用結(jié)束后,被提供給 FC21 使用(FC21 中地址范圍同樣為 LB0-LB19)。 對(duì)于 FC 的臨時(shí)變量認(rèn)識(shí)不清晰,用戶在對(duì)臨時(shí)變量的使用當(dāng)中,也經(jīng)常會(huì)出現(xiàn)一些錯(cuò)誤,下面將使用一個(gè)例子非常直觀地說明上面的問題
程序原目的:
在 OB1 在程序中調(diào)用FC20 后立即調(diào)用 FC21
FC20 中將 20 賦值給臨時(shí)變量 FC20_TEMP1,將 21 賦值給臨時(shí)變量 FC20_TEMP2FC21 中將 FC21_TEMP1,F(xiàn)C21_TEMP2 相加
程序分析:我們發(fā)現(xiàn) FC20 中的臨時(shí)變量曾經(jīng)出現(xiàn)的數(shù)值(20,21)被 FC21 中的臨時(shí)變量FC21_TEMP1, FC21_TEMP2 得到了,如果直接使用這兩個(gè)臨時(shí)變量進(jìn)行加法操作,可以得到結(jié)果 41。對(duì)于編程人員來說,臨時(shí)變量必須要在所在程序段中賦值,而后使用。用戶對(duì)此例中的 FC21_TEMP1, FC21_TEMP2 必須先做清零處理,否則其在使用前即可能擁有數(shù)值。

結(jié)論:對(duì)于 FC 或 FB 中的臨時(shí)變量,不要希望將本次調(diào)用的數(shù)值可以存儲(chǔ)在里面以供下次程序調(diào)用使用,因?yàn)檫@些臨時(shí)變量所使用的 L 堆??臻g在 FC 或 FB 調(diào)用結(jié)束就釋放給系統(tǒng)了,其它后續(xù)程序可以任意使用。所以下列用法都是錯(cuò)誤的:
將臨時(shí)變量用于上升/下降沿指令
將臨時(shí)變量用于自保持邏輯
臨時(shí)變量未在所在程序段中賦值,直接使用
審核編輯:郭婷
-
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4790瀏覽量
90058 -
堆棧
+關(guān)注
關(guān)注
0文章
183瀏覽量
20524
原文標(biāo)題:FC 中臨時(shí)變量的使用:
文章出處:【微信號(hào):gh_a8b121171b08,微信公眾號(hào):機(jī)器人及PLC自動(dòng)化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
用戶對(duì)變量或寄存器進(jìn)行位操作的方法
WTK6900FC鼾聲識(shí)別芯片在四種助眠場景中的應(yīng)用
常用變量的介紹
變量控件實(shí)驗(yàn)
lc-fc光纖跳線什么意思
fc跳線是圓口還是方口
在MG51FB9AE MCU中,如何使用LDROM中的IAP加載程序MCU在APROM中上傳程序?
SC、LC、FC和ST四種類型中哪類價(jià)格最貴
FC光纖頭有什么作用
FC光纖頭和SC光纖頭有什么區(qū)別
fc/lc/sc光纖分別是什么頭
Ansible Playbook中的變量使用技巧
愛普生FC1610AN5G手機(jī)中替代傳統(tǒng)晶振的理想之選
對(duì)于FC或FB中的臨時(shí)變量使用
評(píng)論