用雙指標實現PLC堆疊設計

2021-07-25 10:02:56 字數 3540 閱讀 2850

關鍵技術:plc 堆疊

關鍵演算法:指標

某基地在設計mes現場排程模組時,架構了乙個部署在車間現場的it plc,作為mes與me plc通訊的中間介質,用於處理握手訊號並快取業務資料。

此排程模組要實現以下業務資料的快取:訂單快取、過站記錄快取、在製品佇列快取。其中訂單快取用於上線,過站記錄快取用於物料拉動,在製品佇列快取用於防錯。

快取的意義是為了防止應用系統環境(應用伺服器/資料庫/opc/訊息佇列伺服器)對現場(oem plc)作業的影響,畢竟plc層面的互動要穩定及時得多。

從it的層面來說,用資料庫做佇列和堆疊設計是非常容易的,通常通過乙個過濾條件再加乙個排序條件就可以從資料庫中檢索資料並載入到記憶體。

但是用plc做快取堆疊會受到諸多限制,尤其是要考慮掃瞄週期和掉電保持資料容量的影響。

比較方便實現的乙個做法是:建立乙個陣列,按照先進先出的規則對資料進行處理,每次更新資料時對陣列裡的資料用for迴圈進行move。但是當資料長度較大時(如快取120個訂單),並且資料型別以字元型為主時,這種操作對掃瞄週期會造成較大影響。

首先我們在db塊裡建立如下表所示的堆疊結構:

偏移量

tag

tag長度

備註0

head

2訂單起始位

2step

2訂單資料長度4p1

2首訂單指標6p2

2末訂單指標

8qty

2有效訂單個數

10order1

80訂單1

90order2

80訂單2

170order3

80訂單3

250order4

80訂單4

下表建立了wo1/wo2/wo3/wo4這4個訂單的堆疊:

偏移量

tag

tag長度

備註0

head210

訂單起始位

2step280

訂單資料長度4p1

21首訂單指標6p2

24末訂單指標

8qty24

有效訂單個數

10order1

80wo1

訂單190

order2

80wo2

訂單2170

order3

80wo3

訂單3250

order4

80wo4

訂單4當wo1下發成功後,且又從mes接收到新訂單wo5後,可用的訂單序列是wo2/wo3/wo4/wo5,堆疊結構如下表所示:

偏移量

tag

tag長度

備註0

head210

訂單起始位

2step280

訂單資料長度4p1

22首訂單指標6p2

21末訂單指標

8qty24

有效訂單個數

10order1

80wo5

訂單490

order2

80wo2

訂單1170

order3

80wo3

訂單2250

order4

80wo4

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

首訂單的定址演算法為:

首訂單偏移量 = head + (p1 - 1) * step

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

當wo2下發成功後,將首訂單指標指向wo3(p1=p1+1,當p1=5時重置p1=1),並將有效訂單個數qty-1:

偏移量

tag

tag長度

備註0

head210

訂單起始位

2step280

訂單資料長度4p1

23首訂單指標6p2

21末訂單指標

8qty23

有效訂單個數

10order1

80wo5

訂單390

order2

80wo2

已下發訂單

170order3

80wo3

訂單1250

order4

80wo4

訂單2170 = 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,如下表如示:

偏移量

tag

tag長度

備註0

head210

訂單起始位

2step280

訂單資料長度4p1

23首訂單指標6p2

22末訂單指標

8qty24

有效訂單個數

10order1

80wo5

訂單390

order2

80wo6

新接收訂單,佇列位置4

170order3

80wo3

訂單1250

order4

80wo4

訂單2經由上述方法,即在資料塊裡建立了乙個由p1和p2這兩個指標界定的訂單佇列,並用head/step/p1/p2進行定址,用qty判斷要不要接收新訂單。

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

這種方法由於使用指標進行定址,無需對堆疊進行move操作,因此對cpu掃瞄週期的影響較小。

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

陣列實現雙堆疊

在乙個陣列中實現兩個堆疊 20 分 本題要求在乙個陣列中實現兩個堆疊。stack createstack int maxsize bool push stack s,elementtype x,int tag elementtype pop stack s,int tag 其中tag是堆疊編號,取1...

用陣列實現堆疊

stack.h define stack type char extern void push stack type value extern void pop void extern stack type top void int is empty int is full stack.c incl...

堆疊 佇列 雙端佇列實現

author hao rui chun class stack object def init self self.lis defpush self,item 入棧 defpop self 出棧 self.lis.pop def peek self 獲取棧頂元素 if self.lis return...