全局?jǐn)?shù)據(jù)塊和背景數(shù)據(jù)塊的區(qū)別
對(duì)于全局?jǐn)?shù)據(jù)塊而言,所有的程序塊 (FB,F(xiàn)C 和 OB)均可以讀寫該數(shù)據(jù)塊中的數(shù)據(jù)。而背景數(shù)據(jù)塊被分配給特定的功能塊,包含所分配的FB的本地?cái)?shù)據(jù)。 全局?jǐn)?shù)據(jù)塊 | 背景數(shù)據(jù)塊 | 所有的程序塊 (FB,F(xiàn)C 和 OB)可以訪問(wèn)程序中全局?jǐn)?shù)據(jù)塊中的數(shù)據(jù) | 背景數(shù)據(jù)塊 DB 被指定到一個(gè) FB | 在程序中能夠獨(dú)立地創(chuàng)建全局?jǐn)?shù)據(jù)塊 | 在程序中只能夠?qū)ο嚓P(guān)聯(lián)的 FB 創(chuàng)建背景數(shù)據(jù)塊 | 不能創(chuàng)建靜態(tài)變量 | 在FB中可以定義靜態(tài)變量,當(dāng)數(shù)據(jù)塊建立完成并且已經(jīng)被保留了幾個(gè)循環(huán)之后,存儲(chǔ)的本地靜態(tài)數(shù)據(jù)不會(huì)丟失,除非數(shù)據(jù)再次被更改 | 在數(shù)據(jù)塊中添加,刪除,改變變量 | 在相關(guān)的功能塊中添加或刪除變量,改變變量 | 可以改變初始值和當(dāng)前值 | 不能改變變量的初始值和當(dāng)前值 | 全局?jǐn)?shù)據(jù)塊的結(jié)構(gòu)能夠被指定 | 在相關(guān)的FB中預(yù)定義數(shù)據(jù)塊的結(jié)構(gòu) | 表 1
注意 在 CPU 中的 STEP7 程序?qū)θ趾捅尘皵?shù)據(jù)塊有相等的讀寫權(quán)利。

圖 01
不同 FB 的數(shù)據(jù)可以存儲(chǔ)在單個(gè)背景數(shù)據(jù)塊中 (多重背景)。圖 02 給出了一個(gè)例子,說(shuō)明了在 FB1 中 FB5 和 FB6 如何作為多重背景的。兩個(gè) FB 將它們的背景數(shù)據(jù)保存在調(diào)用它們的 FB1 的背景數(shù)據(jù)塊 DB1中。在 FB1 的聲明中,多重背景塊保存為靜態(tài)變量。
圖 02
更多信息可以參考 STEP 7 在線幫助以下部分 - “背景數(shù)據(jù)塊”
- “創(chuàng)建數(shù)據(jù)塊 (DB)”
- “數(shù)據(jù)塊 (DB) 的結(jié)構(gòu)”
- “使用多重背景”
從 STEP 7 V4.02 升級(jí)到 V5.x 需要注意
當(dāng)升級(jí) STEP 7 V4.02 到 V5.x 版本時(shí),在 LAD/STL/FBD 編輯器中可能會(huì)在調(diào)用 CALL 功能時(shí)出現(xiàn)紅色。這種現(xiàn)象的原因是塊中調(diào)用的一個(gè)背景數(shù)據(jù)塊已經(jīng)在符號(hào)表里被聲明為全局?jǐn)?shù)據(jù)塊。在 STEP7 編程規(guī)則中這是不允許的,并且在 STEP7 V5.x 版本中也是不能被接受的。 補(bǔ)救措施
可以按照下列步驟來(lái)修改發(fā)生錯(cuò)誤的數(shù)據(jù)塊: - 在符號(hào)表中刪除聲明錯(cuò)誤的 DB 所在行。
- 然后刪除錯(cuò)誤的 DB 塊。
- 打開調(diào)用的塊然后重新生成背景數(shù)據(jù)塊。
調(diào)用 CALL 功能如何影響 DB 寄存器
當(dāng)程序塊在 STEP 5 或 STEP 7 中被調(diào)用時(shí),DB1 和 DB2 寄存器的初始內(nèi)容被恢復(fù)。已經(jīng)打開的數(shù)據(jù)塊會(huì)一直保持有效直到另一個(gè)數(shù)據(jù)塊被打開。DB 寄存器的內(nèi)容反映了當(dāng)前打開的數(shù)據(jù)塊(DB / DI)。 然后,必須明確,不是所有的 S7 編輯器/編譯器對(duì) DB 寄存器的改變對(duì)用戶來(lái)說(shuō)都是明顯的。例如,當(dāng)使用 CALL 指令調(diào)用 FC 時(shí),如果給 FC 形參分配的是完整的數(shù)據(jù)塊變量地址,編譯器會(huì)打開指定的數(shù)據(jù)塊。當(dāng) FC 調(diào)用完成時(shí),DB 號(hào)仍然保存在 DB1 寄存器中。在 FC 中改變 DB 寄存器不會(huì)影響調(diào)用完成后 DB 寄存器的值。
舉例: | DB1 寄存器 | AUF DB1 | 1 | L DBB 0 | | CALL FC1Input1:= DB2.DBB0
Input2:= DB3.DBB0
| | L DBB 0 | 3 | 表 2
如果調(diào)用功能塊和相關(guān)的背景數(shù)據(jù)塊,調(diào)用 CALL 指令后,背景數(shù)據(jù)塊號(hào)保存在 DB1 寄存器中。傳輸完整的數(shù)據(jù)塊變量地址給 FB,在 FB 中更改 DB 寄存器不會(huì)影響 DB1 寄存器的內(nèi)容。
舉例: | DB1 寄存器 | AUF DB1 | 1 | L DBB 0 | | CALL FB1, DB10Input1:= MW0
Input2:= DB3.DBB0
| | L DBB 0 | 10 | 表 3
調(diào)用系統(tǒng)功能塊后 (SFB),相應(yīng)的背景數(shù)據(jù)塊號(hào)保存在 DB1 寄存器中。然而,使用 UC 或 CC 指令后,數(shù)據(jù)寄存器始終保持不變,這是由于這些調(diào)用沒(méi)有指定參數(shù)和背景數(shù)據(jù)塊。 注意
為了避免在 STEP 編程過(guò)程中處理數(shù)據(jù)塊時(shí)出現(xiàn)區(qū)域長(zhǎng)度錯(cuò)誤和訪問(wèn)錯(cuò)誤,盡量只使用完整的地址訪問(wèn) DB 中變量。(如 DBx.DBBy 或符號(hào)名 "DBName".Variable_name)。
|