全局數據塊和背景數據塊的區別
對于全局數據塊而言,所有的程序塊 (FB,FC 和 OB)均可以讀寫該數據塊中的數據。而背景數據塊被分配給特定的功能塊,包含所分配的FB的本地數據。 全局數據塊 | 背景數據塊 | 所有的程序塊 (FB,FC 和 OB)可以訪問程序中全局數據塊中的數據 | 背景數據塊 DB 被指定到一個 FB | 在程序中能夠獨立地創建全局數據塊 | 在程序中只能夠對相關聯的 FB 創建背景數據塊 | 不能創建靜態變量 | 在FB中可以定義靜態變量,當數據塊建立完成并且已經被保留了幾個循環之后,存儲的本地靜態數據不會丟失,除非數據再次被更改 | 在數據塊中添加,刪除,改變變量 | 在相關的功能塊中添加或刪除變量,改變變量 | 可以改變初始值和當前值 | 不能改變變量的初始值和當前值 | 全局數據塊的結構能夠被指定 | 在相關的FB中預定義數據塊的結構 | 表 1
注意 在 CPU 中的 STEP7 程序對全局和背景數據塊有相等的讀寫權利。

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