歡迎光臨
每天分享高質量文章

西門子S7-1200程式設計概念(3)——使用塊來構建程式


點選 《福利來了!PLC的資料(免費),你要嗎?

點選第二波福利來了!PLC的資料(免費),你要嗎?

透過設計 FB 和 FC 執行通用任務,可建立模組化程式碼塊。
然後可透過由其它程式碼塊呼叫這些可重覆使用的模組來構建程式。
呼叫塊將裝置特定的引數傳遞給被呼叫塊。
當一個程式碼塊呼叫另一個程式碼塊時,CPU 會執行被呼叫塊中的程式程式碼。
執行完被呼叫塊後,CPU 會繼續執行呼叫塊。 繼續執行該塊呼叫之後的指令。

可巢狀塊呼叫以實現更加模組化的結構。 在以下示例中,巢狀深度為 3: 程式迴圈 OB加 3 層對程式碼塊的呼叫。

組織塊 (OB)

組織塊為程式提供結構。 它們充當作業系統和使用者程式之間的介面。 OB是由事件驅動的。 事件(如診斷中斷或時間間隔)會使 CPU 執行 OB。某些 OB預定義了起始事件和行為。

程式迴圈 OB 包含使用者主程式。 使用者程式中可包含多個程式迴圈 OB。 RUN樣式期間,程式迴圈 OB 以最低優先順序等級執行,可被其它事件型別中斷。 啟動OB不會中斷程式迴圈 OB,因為 CPU 在進入 RUN 樣式之前將先執行啟OB。完成程式迴圈 OB 的處理後,CPU 會立即重新執行程式迴圈 OB。該迴圈處理是用於可程式設計邏輯控制器的“正常”處理型別。
對於許多應用來說,整個使用者程式位於一個程式迴圈 OB 中。
可建立其它 OB以執行特定的功能,如用於處理中斷和錯誤或用於以特定的時間隔執行特定程式程式碼。這些 OB 會中斷程式迴圈 OB 的執行。
使用“新增新塊”(Add new block) 對話方塊在使用者程式中建立新的 OB。

CPU 按優先順序確定處理中斷事件的順序。 可為多個中斷事件分配相同的優先順序。

  • 建立附加 OB

可為使用者程式,甚至為程式迴圈和啟動 OB 事件建立多個 OB。 使用“新增新塊”(Add new block) 對話方塊建立 OB 併為 OB 輸入名稱。
如果為使用者程式建立了多個程式迴圈 OB,則 CPU 會按數字順序從具有最小編號(例如OB 1)的程式迴圈 OB 開始執行每個程式迴圈 OB。 例如: 當第一個程式迴圈OB(例如 OB 1)完成後,CPU 將執行下一個編號更高的程式迴圈OB。

  • 組態 OB 的屬性

可對 OB 的屬性進行修改。例如,可組態 OB 編號或程式語言。

請註意,您可將區域性過程映像編號分配給對應於 PIP0、PIP1、PIP2、PIP3 或 PIP4 的OB。 如果您為區域性過程映像編號輸入編號,則 CPU 將建立該過程映像分割槽。

功能 (FC)

功能 (FC) 是通常用於對一組輸入值執行特定運算的程式碼塊。 FC將此運算結果儲存在儲存器位置。 例如,可使用 FC執行標準運算和可重覆使用的運算(例如數學計算)或者執行工藝功能(如使用位邏輯運算執行獨立的控制)。 FC也可以在程式中的不同位置多次呼叫。此重覆使用簡化了對經常重覆發生的任務的程式設計。
FC 不具有相關的背景資料塊 (DB)。 對於用於計算該運算的臨時資料,FC採用了區域性資料堆疊。 不儲存臨時資料。
要長期儲存資料,可將輸出值賦給全域性儲存器位置,如 M 儲存器或全域性 DB。

功能塊 (FB)

功能塊 (FB) 是使用背景資料塊儲存其引數和靜態資料的程式碼塊。 FB 具有位於資料塊(DB) 或“背景”DB 中的變數儲存器。 背景 DB 提供與 FB的實體(或呼叫)關聯的一塊儲存區併在 FB 完成後儲存資料。 可將不同的背景 DB 與FB 的不同呼叫進行關聯。 透過背景 DB 可使用一個通用 FB 控制多個裝置。
透過使一個程式碼塊對 FB 和背景 DB 進行呼叫,來構建程式。 然後,CPU 執行該 FB中的程式程式碼,並將塊引數和靜態區域性資料儲存在背景 DB 中。 FB 執行完成後,CPU會傳回到呼叫該 FB 的程式碼塊中。 背景 DB 保留該 FB 實體的值。
隨後在同一掃描週期或其它掃描週期中呼叫該功能塊時可使用這些值。

  • 可重覆使用的程式碼塊和關聯的儲存區

使用者通常使用 FB 控制在一個掃描週期內未完成其執行的任務或裝置的執行。要儲存執行引數以便從一個掃描快速訪問到下一個掃描,使用者程式中的每一個 FB都具有一個或多個背景 DB。 呼叫 FB 時,也需要指定包含塊引數以及用於該呼叫或 FB“實體”的靜態區域性資料的背景 DB。 FB 完成執行後,背景 DB 將保留這些值。
透過設計用於通用控制任務的 FB,可對多個裝置重覆使用 FB,方法是:為 FB
的不同呼叫選擇不同的背景 DB。
FB 將 Input、Output 和 InOut 以及靜態引數儲存在背景資料塊中。

  • 在背景資料塊中分配起始值

背景資料塊儲存每個引數的預設值和起始值。 起始值提供在執行 FB 時使用的值。然後可在使用者程式執行期間修改起始值。
FB 介面還提供一個“預設值”(Default value)列,使您能夠在編寫程式程式碼時為引數分配新的起始值。 然後將 FB中的這個預設值傳給關聯背景資料塊中的起始值。 如果不在 FB介面中為引數分配新的起始值,則將背景資料塊中的預設值複製到起始值。

  • 使用帶多個 DB 的單個 FB

下圖顯示了三次呼叫同一個 FB 的 OB,方法是針對每次呼叫使用一個不同的資料塊。
該結構使一個通用 FB可以控制多個相似的裝置(如電機),方法是在每次呼叫時為各裝置分配不同的背景資料塊。 每個背景 DB 儲存單個裝置的資料(如速度、加速時間和總執行時間)。

在此實體中,FB 22 控制三個獨立的裝置,其中 DB 201用於儲存第一個裝置的執行資料,DB 202 用於儲存第二個裝置的執行資料,DB 203用於儲存第三個裝置的執行資料。

資料塊 (DB)

在使用者程式中建立資料塊 (DB) 以儲存程式碼塊的資料。
使用者程式中的所有程式塊都可訪問全域性 DB 中的資料,而背景 DB 僅儲存特定功能塊 (FB)的資料。
相關程式碼塊執行完成後,DB 中儲存的資料不會被刪除。 有兩種型別的 DB:
● 全域性 DB 儲存程式中程式碼塊的資料。 任何 OB、FB 或 FC 都可訪問全域性 DB中的資料。
● 背景 DB 儲存特定 FB 的資料。 背景 DB 中資料的結構反映了 FB的引數(Input、Output 和 InOut)和靜態資料。 (FB 的臨時儲存器不儲存在背景 DB中。)

  • 只讀資料塊

可將 DB 組態為只讀:
1. 在專案瀏覽器中右鍵單擊相應 DB,然後在右鍵快捷選單中選擇“屬性”(Properties)。
2. 在“屬性”(Properties) 對話方塊中選擇“特性”(Attributes)。
3. 選擇“在裝置中防寫資料塊”(Data block write-protected in the device)選項並單擊“確定”(OK)。

  • 已最佳化的資料塊和標準資料塊

程式設計工具以及經典的 S7-300 和 S7-400 CPU 相容。
可最佳化訪問的資料塊無固定的定義結構。
資料元素在宣告中僅包含一個符號名,在塊中沒有固定地址。 CPU會將元素自動儲存到塊的可用儲存區中,以免在儲存器中留下間隙。這樣一來,便可最最佳化地利用儲存器容量。
要設定對資料塊的最佳化訪問,請按以下步驟操作:
1. 在 STEP 7 專案樹中展開程式塊檔案夾。
2. 右鍵單擊資料塊並從背景關係選單中選擇“屬性”(Properties)。
3. 為屬性選擇“最佳化塊訪問”(Optimized block access)。
請註意,預設情況下會為新資料塊選中最佳化塊訪問。
如果取消選擇“最佳化塊訪問”(Optimized block access),則塊將採用標準訪問。


建立可重覆使用的程式碼塊

可儲存想要在庫中重覆使用的物件。 每個專案都有一個與之相連的專案庫。除專案庫外,您還可以建立可在多個專案中使用的任意數量的全域性庫。
由於庫彼此相容,因此可以複製庫要素並將其從一個庫移動到另一個庫。
庫可用於建立塊的模板:首先將塊貼上到專案庫中,隨後在其中進一步開發塊。
最後,將塊從專案庫複製到全域性庫。 可將全域性庫共享給正在使用專案的其他同事。
他們可使用塊並根據需要進一步調整塊以滿足各自的需求。

向塊傳遞引數

函式塊 (FB) 和函式 (FC) 有三種不同介面型別:
● IN
● IN/OUT
● OUT
函式塊和函式透過 IN 和 IN/OUT 介面型別接收引數。
塊對這些資料進行處理,此後,透過 IN/OUT 和 OUT 介面型別將傳回值傳回呼用者。
使用者程式採用以下兩種方法中的某一種傳遞引數。

  • 傳值

  • 傳取用

  • 塊最佳化和引數傳遞

使用者程式傳遞的函式塊引數通常在和該函式塊相關的背景資料塊 (DB) 中:
● 透過將引數複製給背景資料塊,或者,複製位於背景資料中引數,使用者程式可以以“傳值”方式傳遞簡單資料型別(例如,INT、DINT 和 REAL)的引數。
● 使用者程式將複雜資料型別(例如,STRUCT、ARRAY 和 STRING)複製到用於 IN 和OUT 引數型別的背景資料塊中,或者,複製位於該背景資料塊中的複雜資料型別。
● 對於 IN/OUT 介面型別,使用者程式以“傳取用”方式傳遞複雜資料型別。
資料塊可以建立成“最佳化的”或“標準的”(未最佳化)資料塊。
最佳化型資料塊的體積小於非最佳化型資料塊。
最佳化型資料塊和非最佳化型資料塊中的資料元素順序不一樣。

可以建立用來處理最佳化或非最佳化資料的函式塊和函式。 可以選擇核取方塊“最佳化塊訪問”(Optimized block access),將其作為塊的屬性。
預設情況下,使用者程式會最佳化程式塊;程式塊期望傳遞給該塊的資料採用最佳化格式。

使用者向某個函式傳遞複雜引數(例如,STRUCT結構的引數)時,系統會檢查包含該結構的資料塊的最佳化設定和程式塊的最佳化設定。
如果你同時最佳化該資料塊和該函式,使用者程式將以“傳取用”方式傳遞該結構(STRUCT)。
如果選擇了不最佳化該資料塊和該函式,也採用“傳取用”方式傳遞該結構。
但是,如果函式和資料塊採用不同最佳化設定(即,優化了一個塊且沒有最佳化另一個塊),則必須將 STRUCT 轉換成函式所期望的格式。
例如,如果選擇了不最佳化該資料塊但最佳化該函式,則資料塊中的 STRUCT須轉換成最佳化格式後才能被該函式進行處理。
該轉換過程由系統完成,其方法是:先製作該 STRUCT的一個“副本”,接著,將它轉換成該函式所期望的最佳化格式。

總而言之,當使用者程式將某個複雜資料型別(例如,STRUCT)作為 IN/OUT引數傳遞給某個函式時,該函式希望使用者程式以“傳取用”方式傳遞 STRUCT。
● 對於含該結構的資料塊和該函式,如果都選擇了最佳化或者不最佳化,使用者程式將以“傳取用”方式傳遞資料。
● 如果對資料塊和函式沒有配置相同的最佳化設定(最佳化其中一個且不最佳化另一個),系統必須先製作 STRUCT 的一個副本,再將其傳遞給函式。
由於系統必須製作該結構的副本,因此,該操作可以高效地將“傳取用”轉換成“傳值”。

  • 最佳化設定對使用者程式的影響作用

如果 HMI 或中斷組織塊更改了結構中的元素,引數複製將可能導致用戶程式出現問題。
例如,某個函式有一個 IN/OUT引數(正常情況下以“傳取用”方式傳遞),但是,資料塊和該函式採用了不同的設定,則:
1. 使用者程式準備呼叫該函式時,系統必須製作該結構的一個“副本”,以將該資料的格式轉換成與該函式相匹配的格式。
2. 使用者程式採用該結構的該“副本”的取用呼叫該函式。
3. 該函式執行期間出現了一個中斷組織塊,且該中斷組織塊更改了原結構中的某個值。
4. 該函式執行完畢。由於該結構是一個 IN/OUT引數,因此,系統將該值以原來的格式複製回原結構。
採用製作結構副本的方式進行格式轉換的後果:該中斷組織塊改寫過的資料將被丟失。
對於採用 HMI 寫入的值,情況也同樣如此。 HMI也可能中斷使用者程式的執行,並以和中斷組織塊相同的方式寫入某個值。
解決該問題的方法有很多種:
● 最好的方法是:需要使用複雜資料型別(例如,STRUCT)時,對程式塊和資料塊採用相匹配的最佳化設定。
這種方法可以保證使用者程式總是以“傳取用”方式進行引數傳遞。
● 另一種方法是使中斷組織塊或 HMI 不直接修改該結構中的元素。 讓組織塊或 HMI修改另一個變數,此後,使用者在使用者程式的某個特定位置將該變數複製到該結構中。


尋找同路人

做自動化工業變革的踐行者


可透過選單查詢自己喜歡的文章彙總:

現場儀錶DCS部分PLC部分SIS部分通訊標準數字化問題解答】此處列出部分連結,更多文章透過選單獲取。



贊(0)

分享創造快樂