一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制的制作方法
【專利摘要】本發(fā)明涉及一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,包括工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟和工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟,在工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟和工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟中均采用內(nèi)存數(shù)據(jù)庫,所述內(nèi)存數(shù)據(jù)庫中的實時數(shù)據(jù)結構為先進先出的環(huán)形隊列,所述環(huán)形隊列中的數(shù)據(jù)項采用變長方式,并且設置頭指針和尾指針,所述頭指針指向環(huán)形隊列頭部待讀取的數(shù)據(jù)的第一個字節(jié),所述尾指針指向隊列尾部已寫入數(shù)據(jù)的下一個可用空字節(jié)。本發(fā)明應用在廣域測量、實時交易、軍事監(jiān)測等領域的數(shù)據(jù)交換中,使用變長循環(huán)隊列結構的內(nèi)存數(shù)據(jù)庫,通過對數(shù)據(jù)的緩存、組織,使數(shù)據(jù)訪問做到異步、可延時。
【專利說明】—種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制
【技術領域】
[0001]本發(fā)明涉及一種數(shù)據(jù)異步存儲及訪問機制,更具體的說涉及一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制。
【背景技術】
[0002]對于實時、高并發(fā)數(shù)據(jù)訪問的應用系統(tǒng)環(huán)境下,恰當?shù)靥幚砗徒M織數(shù)據(jù)的方法越來越多地傾向于使用內(nèi)存數(shù)據(jù)庫,由于其自身較高的性能,尤其適合應用在廣域測量、實時交易、軍事監(jiān)測等領域。與傳統(tǒng)基于磁盤存儲的數(shù)據(jù)庫相比,內(nèi)存數(shù)據(jù)庫特點十分明顯,由于數(shù)據(jù)存儲、處理都在物理內(nèi)存中進行,使得數(shù)據(jù)訪問的響應時間在本機內(nèi)達到微秒級甚至更高,在廣域網(wǎng)絡訪問方面,能提供高達普通數(shù)據(jù)庫幾十倍的吞吐量。鑒于這些優(yōu)點,內(nèi)存數(shù)據(jù)庫能解決廣域測量系統(tǒng)中測量值與實際測量時間準確對應、網(wǎng)絡交易系統(tǒng)高并發(fā)訪問的實時性等問題。
[0003]內(nèi)存數(shù)據(jù)庫的另一個重要作用就是實時數(shù)據(jù)的緩存、組織和延時異步訪問,它可以把工業(yè)控制系統(tǒng)產(chǎn)生的實時數(shù)據(jù)高速進行緩存,在讀取和處理這些數(shù)據(jù)的過程存在延時或者不確定時,暫時保存數(shù)據(jù),解決數(shù)據(jù)的產(chǎn)生與處理之間的速率不匹配問題。同時,由于緩存技術的應用,使得系統(tǒng)可以應對復雜的運行中的不可預期事件和錯誤,甚至系統(tǒng)的停止和間斷出現(xiàn)時,也能以最大程度保證數(shù)據(jù)的可靠、有效、不丟失,極大地提高了系統(tǒng)的容錯性。
[0004]現(xiàn)有的大多數(shù)內(nèi)存數(shù)據(jù)庫的設計不是以緩存和異步訪問為出發(fā)點進行構造的,它們多傾向于復雜的系統(tǒng)結構和豐富的附加功能(如客戶端/服務器網(wǎng)絡訪問,和sql語句的解釋執(zhí)行等),這樣的產(chǎn)品使用于工業(yè)控制系統(tǒng)的緩存和異步訪問中,往往得不到預期的效果,由于復雜的功能使得數(shù)據(jù)庫訪問效率大幅度降低,面對工業(yè)控制系統(tǒng)緩存的環(huán)境中對高速實時要求較高對復雜sql語句功能并不需要的情況,尤其顯得不能合適和勝任。
[0005]因此對于工業(yè)控制系統(tǒng)數(shù)據(jù)交換和高速緩存情況需要建立高效、簡捷、良好的結構化設計的內(nèi)存數(shù)據(jù)庫系統(tǒng),提供數(shù)據(jù)的異步訪問機制。
【發(fā)明內(nèi)容】
[0006]為解決現(xiàn)有技術的不足,本發(fā)明的目的在于提供一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,使工業(yè)控制系統(tǒng)的數(shù)據(jù)交換和高速緩存變得高效、簡捷,大大提高了工業(yè)系統(tǒng)的效率。
[0007]為達到上述目的,本發(fā)明是通過以下的技術方案來實現(xiàn)的:一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,包括工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟和工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟,在工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟和工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟中均采用內(nèi)存數(shù)據(jù)庫,所述內(nèi)存數(shù)據(jù)庫中的實時數(shù)據(jù)結構為先進先出的環(huán)形隊列,所述環(huán)形隊列中的數(shù)據(jù)項采用變長方式,并且設置頭指針和尾指針,所述頭指針指向環(huán)形隊列頭部待讀取的數(shù)據(jù)的第一個字節(jié),所述尾指針指向隊列尾部已寫入數(shù)據(jù)的下一個可用空字節(jié)。[0008]本發(fā)明技術方案的進一步限定為,所述內(nèi)存數(shù)據(jù)庫中的實時數(shù)據(jù)結構為先進先出的環(huán)形隊列的方式為:內(nèi)存數(shù)據(jù)庫的數(shù)據(jù)區(qū)域采用操作系統(tǒng)的共享內(nèi)存技術,預先開辟一塊一定大小的操作系統(tǒng)級別的共享內(nèi)存區(qū)域,所述共享內(nèi)存區(qū)域獨立于系統(tǒng)中運行的各進程,并被各個進程映射訪問;當進程映射訪問了所述共享內(nèi)存區(qū)域,在進程中得到映射的共享內(nèi)存區(qū)域首地址,內(nèi)存數(shù)據(jù)庫依據(jù)得到的共享內(nèi)存區(qū)域首地址把共享內(nèi)存區(qū)域結構化成環(huán)形隊列。
[0009]進一步地,所述工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟中,將工業(yè)控制系統(tǒng)的實時數(shù)據(jù)處理為環(huán)形隊列的數(shù)據(jù)包,數(shù)據(jù)包的緩存在隊尾進行,按順序使數(shù)據(jù)包節(jié)點入隊,數(shù)據(jù)包節(jié)點入隊包括數(shù)據(jù)長度入隊步驟和數(shù)據(jù)內(nèi)容入隊步驟,其中,所述數(shù)據(jù)長度入隊步驟具體為:
[0010]①在數(shù)據(jù)包中獲取需要入隊的數(shù)據(jù)長度data_size和數(shù)據(jù)內(nèi)容;
[0011]②獲取隊列當前的頭指針head和尾指針tail的位置;
[0012]③判斷環(huán)形隊列的空間是否可容納當前需要入隊的數(shù)據(jù),如果data_siZe>(tail_p+total_size - head_p)%total_size,則執(zhí)行步驟④,否則,返回步驟①,其中data_siz為需要入隊的數(shù)據(jù)包中數(shù)據(jù)長度所占的字節(jié)數(shù),tail_p為環(huán)形隊列的尾指針的位置,head_p為環(huán)形隊列的頭指針的位子,total_size為環(huán)形隊列的總長度;
[0013]④將數(shù)據(jù)包中的數(shù)據(jù)長度data_Size入隊,入隊時判斷尾指針tail是否到達環(huán)形隊列的末端;
[0014]⑤如果尾指針tail到達環(huán)形隊列末端或到達環(huán)形隊列末端長度不夠容納數(shù)據(jù)長度,則使用分拆方法將數(shù)據(jù)長度分成兩段存儲;如果尾指針tail未到達環(huán)形隊列末端,則將數(shù)據(jù)長度直接存儲;
[0015]所述數(shù)據(jù)內(nèi)容入隊步驟具體為:
[0016]①數(shù)據(jù)內(nèi)容入隊時,判斷隊尾指針tail到達環(huán)形隊列末端的長度是否可容納數(shù)據(jù)內(nèi)容的長度,如果隊尾指針到末端不夠容納數(shù)據(jù),使用拆分方法將數(shù)據(jù)內(nèi)容分成兩段存儲;如果尾指針tail未到達環(huán)形隊列末端,則把數(shù)據(jù)內(nèi)容直接存儲;
[0017]②更新環(huán)形隊列隊尾指針tail,完成數(shù)據(jù)包節(jié)點入隊。
[0018]進一步地,所述工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟在隊頭進行,按入隊順序和長度依次使數(shù)據(jù)包出隊,具體步驟為;
[0019]①判斷環(huán)形隊列中是否有數(shù)據(jù),如果head_p==tail_p,則直接返回;否則,執(zhí)行步驟②;
[0020]②如果環(huán)形隊列頭指針head到尾指針tail的長度大于等于4字節(jié),在環(huán)形隊列頭指針head處直接讀出4字節(jié)長度的數(shù)據(jù);否則,使用聚合方法將環(huán)形隊列末端和首端數(shù)據(jù)組合成4字節(jié)長度,然后讀出4字節(jié)長度的數(shù)據(jù);
[0021]③根據(jù)讀出4字節(jié)長度的數(shù)據(jù)承載的數(shù)據(jù)值,判斷頭指針head到環(huán)形隊列末端的數(shù)據(jù)長度是否大于等于此數(shù)據(jù)值,如果大于等于此數(shù)據(jù)值,則直接讀取數(shù)據(jù)內(nèi)容,否則使用聚合方法將環(huán)形隊列末端和首端數(shù)據(jù)組成完整的數(shù)據(jù),再讀取數(shù)據(jù)內(nèi)容;
[0022]④數(shù)據(jù)內(nèi)容讀取后,更新環(huán)形隊列頭指針head,完成數(shù)據(jù)出隊。
[0023]進一步地,步驟②中,讀出4字節(jié)長度的數(shù)據(jù)后,判斷長度的合理性,如果長度不在合理范圍內(nèi),則將環(huán)形隊列內(nèi)數(shù)據(jù)清空,頭指針head和尾指針tail歸零,然后返回。[0024]進一步地,所述內(nèi)存數(shù)據(jù)庫中設置一個互斥鎖mutexWrite,兩個信號量used和free,其中,信號量used的值對應使用的空間大小,信號量free的值對應空閑的空間大小,且 used+free==size -1。
[0025]進一步地,所述內(nèi)存數(shù)據(jù)庫中設置寫入數(shù)據(jù)時使用的互斥鎖mutexWrite及消息隊列writeQueue,當完成工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟時,發(fā)送無數(shù)據(jù)的通知消息WRITE_MSG到消息隊列writeQueue,監(jiān)控進程實時讀取消息隊列里的消息,讀取到寫入消息WRITE_MSG時,對共享內(nèi)存區(qū)域的循環(huán)隊列進行讀取,一直讀取到隊列為空。
[0026]進一步地,所述內(nèi)存數(shù)據(jù)庫中設置對循環(huán)隊列的寫訪問之間保護的互斥鎖mutexWrite和對循環(huán)隊列的讀訪問之間保護的互斥鎖mutexRead,所述寫訪問和讀訪問之間設置一個標識隊列中可讀數(shù)據(jù)包格式的信號量readable。
[0027]本發(fā)明的有益效果是:本發(fā)明所述的一種應用于控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,應用在廣域測量、實時交易、軍事監(jiān)測等領域的數(shù)據(jù)交換中,使用變長循環(huán)隊列結構的內(nèi)存數(shù)據(jù)庫,通過對數(shù)據(jù)的緩存、組織,使數(shù)據(jù)訪問做到異步、可延時,主要起到3方面作用:①數(shù)據(jù)緩存,解決讀寫速率不匹配造成的操作等待或數(shù)據(jù)丟失;②高速訪問,毫秒級響應時間,使數(shù)據(jù)讀寫在內(nèi)存中進行,極高的訪問效率;③實現(xiàn)了無縫的數(shù)據(jù)交換與進程間的通信。鑒于這些作用,使大型工業(yè)系統(tǒng)的可靠性、容錯性大大加強,使系統(tǒng)效率大幅提升。
【專利附圖】
【附圖說明】
[0028]圖1為本發(fā)明所述的環(huán)形隊列內(nèi)存數(shù)據(jù)庫結構示意圖;
[0029]圖2為本發(fā)明所述的工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟的流程示意圖;
[0030]圖3為本發(fā)明工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟的流程示意圖;
[0031]圖4為本發(fā)明所述的同步互斥實施方法I的偽代碼流程示意圖;
[0032]圖5為本發(fā)明所述的同步互斥實施方法2的偽代碼流程示意圖;
[0033]圖6為本發(fā)明所述的同步互斥實施方法3的偽代碼流程示意圖。
【具體實施方式】
[0034]以下結合附圖和具體實施例對本發(fā)明作具體的介紹。
[0035]實施例1:
[0036]本發(fā)明提供一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,解決大型工業(yè)控制系統(tǒng)數(shù)據(jù)交換和緩存的異步數(shù)據(jù)訪問問題,提供較高的系統(tǒng)數(shù)據(jù)交換效率和容錯性。
[0037]本發(fā)明包括工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟和工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟,在工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟和工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟中均采用內(nèi)存數(shù)據(jù)庫,所述內(nèi)存數(shù)據(jù)庫中的實時數(shù)據(jù)結構為先進先出的環(huán)形隊列,環(huán)形隊列的數(shù)據(jù)結構如圖1所示。所述環(huán)形隊列中的數(shù)據(jù)項采用變長方式,并且設置頭指針和尾指針,所述頭指針指向環(huán)形隊列頭部待讀取的數(shù)據(jù)的第一個字節(jié),所述尾指針指向隊列尾部已寫入數(shù)據(jù)的下一個可用空字節(jié)。本發(fā)明保證數(shù)據(jù)交換時有序數(shù)據(jù)的正確高速訪問,由于數(shù)據(jù)在內(nèi)存中組織和緩存,空間的利用率相對重要,考慮到隊列中緩存的數(shù)據(jù)內(nèi)容長度的不確定性,使用定長數(shù)據(jù)項的隊列可能出現(xiàn)空間的浪費、或者數(shù)據(jù)的超長丟失,所以設計隊列中數(shù)據(jù)項采用變長方式,數(shù)據(jù)包的結構定義如下:[0038]
【權利要求】
1.一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,包括工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟和工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟,在工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟和工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟中均采用內(nèi)存數(shù)據(jù)庫,其特征在于,所述內(nèi)存數(shù)據(jù)庫中的實時數(shù)據(jù)結構為先進先出的環(huán)形隊列,所述環(huán)形隊列中的數(shù)據(jù)項采用變長方式,并且設置頭指針和尾指針,所述頭指針指向環(huán)形隊列頭部待讀取的數(shù)據(jù)的第一個字節(jié),所述尾指針指向隊列尾部已寫入數(shù)據(jù)的下一個可用空字節(jié)。
2.根據(jù)權利要求1所述的一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,其特征在于,所述內(nèi)存數(shù)據(jù)庫中的實時數(shù)據(jù)結構為先進先出的環(huán)形隊列的方式為:內(nèi)存數(shù)據(jù)庫的數(shù)據(jù)區(qū)域采用操作系統(tǒng)的共享內(nèi)存技術,預先開辟一塊一定大小的操作系統(tǒng)級別的共享內(nèi)存區(qū)域,所述共享內(nèi)存區(qū)域獨立于系統(tǒng)中運行的各進程,并被各個進程映射訪問;當進程映射訪問了所述共享內(nèi)存區(qū)域,在進程中得到映射的共享內(nèi)存區(qū)域首地址,內(nèi)存數(shù)據(jù)庫依據(jù)得到的共享內(nèi)存區(qū)域首地址把共享內(nèi)存區(qū)域結構化成環(huán)形隊列。
3.根據(jù)權利要求1所述的一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,其特征在于,所述工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟中,將工業(yè)控制系統(tǒng)的實時數(shù)據(jù)處理為環(huán)形隊列的數(shù)據(jù)包,數(shù)據(jù)包的緩存在隊尾進行,按順序使數(shù)據(jù)包節(jié)點入隊,數(shù)據(jù)包節(jié)點入隊包括數(shù)據(jù)長度入隊步驟和數(shù)據(jù)內(nèi)容入隊步驟,其中,所述數(shù)據(jù)長度入隊步驟具體為: ①在數(shù)據(jù)包中獲取需要入隊的數(shù)據(jù)長度data_Size和數(shù)據(jù)內(nèi)容; ②獲取隊列當前的頭指針head和尾指針tail的位置; ③判斷環(huán)形隊列的空間是否可容納當前需要入隊的數(shù)據(jù),如果data_siZe>(tail_p+total_size - head_p)%total_size,則執(zhí)行步驟④,否則,返回步驟①,其中data_siz為需要入隊的數(shù)據(jù)包中數(shù)據(jù)長度所占的字節(jié)數(shù),tail_p為環(huán)形隊列的尾指針的位置,head_p為環(huán)形隊列的頭指針的位子,total_size為環(huán)形隊列的總長度; ④將數(shù)據(jù)包中的數(shù)據(jù)長度`data_Size入隊,入隊時判斷尾指針tail是否到達環(huán)形隊列的末端; ⑤如果尾指針tail到達環(huán)形隊列末端或到達環(huán)形隊列末端長度不夠容納數(shù)據(jù)長度,則使用分拆方法將數(shù)據(jù)長度分成兩段存儲;如果尾指針tail未到達環(huán)形隊列末端,則將數(shù)據(jù)長度直接存儲; 所述數(shù)據(jù)內(nèi)容入隊步驟具體為: ①數(shù)據(jù)內(nèi)容入隊時,判斷隊尾指針tail到達環(huán)形隊列末端的長度是否可容納數(shù)據(jù)內(nèi)容的長度,如果隊尾指針到末端不夠容納數(shù)據(jù),使用拆分方法將數(shù)據(jù)內(nèi)容分成兩段存儲;如果尾指針tail未到達環(huán)形隊列末端,則把數(shù)據(jù)內(nèi)容直接存儲; ②更新環(huán)形隊列隊尾指針tail,完成數(shù)據(jù)包節(jié)點入隊。
4.根據(jù)權利要求1所述的一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,其特征在于,所述工業(yè)控制系統(tǒng)的數(shù)據(jù)讀取步驟在隊頭進行,按入隊順序和長度依次使數(shù)據(jù)包出隊,具體步驟為; ①判斷環(huán)形隊列中是否有數(shù)據(jù),如果head_p== tail_p,則直接返回;否則,執(zhí)行步驟②; ②如果環(huán)形隊列頭指針head到尾指針tail的長度大于等于4字節(jié),在環(huán)形隊列頭指針head處直接讀出4字節(jié)長度的數(shù)據(jù);否則,使用聚合方法將環(huán)形隊列末端和首端數(shù)據(jù)組合成4字節(jié)長度,然后讀出4字節(jié)長度的數(shù)據(jù); ③根據(jù)讀出4字節(jié)長度的數(shù)據(jù)承載的數(shù)據(jù)值,判斷頭指針head到環(huán)形隊列末端的數(shù)據(jù)長度是否大于等于此數(shù)據(jù)值,如果大于等于此數(shù)據(jù)值,則直接讀取數(shù)據(jù)內(nèi)容,否則使用聚合方法將環(huán)形隊列末端和首端數(shù)據(jù)組成完整的數(shù)據(jù),再讀取數(shù)據(jù)內(nèi)容; ④數(shù)據(jù)內(nèi)容讀取后,更新環(huán)形隊列頭指針head,完成數(shù)據(jù)出隊。
5.根據(jù)權利要求4所述的一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,其特征在于,步驟②中,讀出4字節(jié)長度的數(shù)據(jù)后,判斷長度的合理性,其方法為比較長度的上下限范圍,上限為隊列中現(xiàn)有數(shù)據(jù)的總長度((tail_p+data_size - head_p) %data_size),下限為大于O (不能小于或等于)。如果長度不在合理范圍內(nèi),則將環(huán)形隊列內(nèi)數(shù)據(jù)清空,頭指針head和尾指針tail歸零,然后返回。
6.根據(jù)權利要求1所述的一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,其特征在于,所述內(nèi)存數(shù)據(jù)庫中設置一個互斥鎖mutexWrite,兩個信號量used和free,其中,信號量used的值對應使用的空間大小,信號量free的值對應空閑的空間大小,且used+free==size -1。
7.根據(jù)權利要求1所述的一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,其特征在于,所述內(nèi)存數(shù)據(jù)庫中設置寫入數(shù)據(jù)時使用的互斥鎖mutexWrite及消息隊列writeQueue,當完成工業(yè)控制系統(tǒng)的實時數(shù)據(jù)緩存步驟時,發(fā)送無數(shù)據(jù)的通知消息WRITE_MSG到消息隊列writeQueue,監(jiān)控進程實時讀取消息隊列里的消息,讀取到寫入消息WRITE_MSG時,對共享內(nèi)存區(qū)域的循環(huán)隊列進行讀取,一直讀取到隊列為空。
8.根據(jù)權利要求1所述的一種應用于工業(yè)控制系統(tǒng)的數(shù)據(jù)異步存儲及訪問機制,其特征在于,所述內(nèi)存數(shù)據(jù)庫中設置對循環(huán)隊列的寫訪問之間保護的互斥鎖mutexWrite和對循環(huán)隊列的讀訪問之間保護的互斥鎖mutexRead,所述寫訪問和讀訪問之間設置一個標識隊列中可讀數(shù)據(jù)包格式的信號量readable。
【文檔編號】G06F12/08GK103514261SQ201310351073
【公開日】2014年1月15日 申請日期:2013年8月13日 優(yōu)先權日:2013年8月13日
【發(fā)明者】吳克河, 安思成, 崔文超 申請人:江蘇華大天益電力科技有限公司