標籤:

用雙指針實現PLC堆棧設計

關鍵技術:PLC 堆棧

關鍵演算法:指針

某基地在設計MES現場調度模塊時,架構了一個部署在車間現場的IT PLC,作為MES與ME PLC通訊的中間介質,用於處理握手信號並緩存業務數據。

此調度模塊要實現以下業務數據的緩存:訂單緩存、過站記錄緩存、在制品隊列緩存。其中訂單緩存用於上線,過站記錄緩存用於物料拉動,在制品隊列緩存用於防錯。

緩存的意義是為了防止應用系統環境(應用伺服器/資料庫/OPC/消息隊列伺服器)對現場(OEM PLC)作業的影響,畢竟PLC層面的交互要穩定及時得多。

從IT的層面來說,用資料庫做隊列和堆棧設計是非常容易的,通常通過一個過濾條件再加一個排序條件就可以從資料庫中檢索數據並載入到內存。

但是用PLC做緩存堆棧會受到諸多限制,尤其是要考慮掃描周期和掉電保持數據容量的影響。

比較方便實現的一個做法是:建立一個數組,按照先進先出的規則對數據進行處理,每次更新數據時對數組裡的數據用FOR循環進行MOVE。但是當數據長度較大時(如緩存120個訂單),並且數據類型以字元型為主時,這種操作對掃描周期會造成較大影響。

本文描述了另一種建立堆棧的方式:利用雙指針構建。

首先我們在DB塊里建立如下表所示的堆棧結構:

下表建立了WO1/WO2/WO3/WO4這4個訂單的堆棧:

當WO1下發成功後,且又從MES接收到新訂單WO5後,可用的訂單序列是WO2/WO3/WO4/WO5,堆棧結構如下表所示:

從表格可以看到,首訂單指針已經下跳了一格,由1變成2,而末訂單指針則由4跳回了1。

首訂單的定址演算法為:

首訂單偏移量 = HEAD + (P1 - 1) * STEP

代入上表值,即90 = 10 + (2-1) * 80

當WO2下發成功後,將首訂單指針指向WO3(P1=P1+1,當P1=5時重置P1=1),並將有效訂單個數QTY-1:

下一個訂單WO3的定址演算法為:

170 = 10 + (3-1) + 80

堆棧里訂單的邏輯序列為:WO3/WO4/WO5

此時訂單的有效個數QTY=3,小於最大緩存數量4,因此允許從MES接收新訂單WO6,WO6寫入位置的定址演算法為:

末訂單偏移量 = HEAD + P2 * STEP // P2 < 4

末訂單偏移量 = HEAD // P2 = 4

代入上表值,即90 = 10 + 1*80

寫入新訂單數據後,將P2下移一位,P2 = P2 + 1,當P2 = 5時,將P2複位成1。

然後將有效訂單個數QTY+1,如下表如示:

經由上述方法,即在數據塊里建立了一個由P1和P2這兩個指針界定的訂單隊列,並用HEAD/STEP/P1/P2進行定址,用QTY判斷要不要接收新訂單。

可以另外編寫兩個FC,分別用於實現訂單下發和訂單接收。

這種方法由於使用指針進行定址,無需對堆棧進行MOVE操作,因此對CPU掃描周期的影響較小。

但是這種方法的缺點是:當現場出現異常作業時,容易出現指針混亂,從而引發業務數據混亂。應對的方法是:每次作業都和MES進行同步,並且記錄日誌進行追蹤。


推薦閱讀:

MES在汽車製造中的應用之工藝篇(4) -- 變速器製造工藝

TAG:MES |