關鍵技術: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...