本發(fā)明涉及工業(yè)數(shù)據(jù)訪問技術(shù)領(lǐng)域,具體來說是基于定長數(shù)據(jù)塊的工業(yè)信號數(shù)據(jù)訪問方法。
背景技術(shù):
隨著物聯(lián)網(wǎng)、云計(jì)算、大數(shù)據(jù)等業(yè)務(wù)和技術(shù)的完善,以及國家中國制造2025戰(zhàn)略推動(dòng),工業(yè)數(shù)據(jù)中心作為工業(yè)數(shù)據(jù)的匯集以及存儲、分發(fā)中心,將起著不可替代的作用。在工業(yè)應(yīng)用的日常場景中,需要工業(yè)數(shù)據(jù)中心能夠高效的收集離散的工業(yè)測點(diǎn)數(shù)據(jù)信號,并且能夠高效的檢索數(shù)據(jù),以滿足工業(yè)現(xiàn)場實(shí)時(shí)工藝數(shù)據(jù)展現(xiàn)以及實(shí)時(shí)曲線報(bào)表的要求。而為了滿足工業(yè)實(shí)施信號的高速訪問,采用高效的數(shù)據(jù)緩存管理技術(shù)必不可少。
在工業(yè)領(lǐng)域,實(shí)時(shí)信號的存儲以及檢索方案很多,其中典型方案一般是借助于實(shí)時(shí)數(shù)據(jù)庫尤其是工業(yè)實(shí)時(shí)數(shù)據(jù)庫來實(shí)現(xiàn)測點(diǎn)數(shù)據(jù)緩存。實(shí)時(shí)數(shù)據(jù)庫具有高健壯、高吞吐、事務(wù)安全等特點(diǎn),但由于其價(jià)格昂貴,往往用于大型企業(yè)的mes、mrp系統(tǒng)中,對于數(shù)據(jù)中心這樣為多行業(yè)提供基礎(chǔ)設(shè)施的需求來說其成本不可接受并且沒有必要。
也有很多技術(shù)方案采用基于memchched、redis等搭建分布內(nèi)存數(shù)據(jù)隊(duì)列來解決工業(yè)數(shù)據(jù)緩存問題,僅僅采用k-value方式來存儲數(shù)據(jù)是不夠的,仍需要搭建分布數(shù)據(jù)緩存架構(gòu)并根據(jù)業(yè)務(wù)實(shí)際需要搭建相應(yīng)的數(shù)據(jù)結(jié)構(gòu)以及定義訪問策略。需要提到的是,ucberkeley的基于內(nèi)存的分布式并行處理框架spark、以及基于mapreduce的storm均提供了基于流處理的數(shù)據(jù)處理機(jī)制,解決了大數(shù)據(jù)的實(shí)時(shí)計(jì)算問題,但將其作為單純的數(shù)據(jù)緩沖并不合適。
在研究領(lǐng)域,大數(shù)據(jù)技術(shù)鏈上的內(nèi)存計(jì)算技術(shù)近年來逐漸被人關(guān)注,2015年國家863計(jì)劃已經(jīng)將“面向大數(shù)據(jù)的內(nèi)存關(guān)鍵技術(shù)”列為信息技術(shù)領(lǐng)域的重要內(nèi)容。但國內(nèi)科研機(jī)構(gòu)的科研成果偏于強(qiáng)調(diào)學(xué)術(shù)價(jià)值,成果轉(zhuǎn)化存在一定困難。隨著計(jì)算機(jī)硬件設(shè)備的制造技術(shù)的提升,以及超融合技術(shù)的普及,采用超融合技術(shù)架構(gòu)或者低成本超大容量內(nèi)存服務(wù)器可以為工業(yè)數(shù)據(jù)中心的工業(yè)數(shù)據(jù)緩存帶來新的解決方案。
從工業(yè)數(shù)據(jù)中心的角度來說,工業(yè)數(shù)據(jù)中心往往需要匯聚大量的信號數(shù)據(jù)。假設(shè)一組服務(wù)器接入1000多個(gè)工業(yè)站點(diǎn),每個(gè)工業(yè)站點(diǎn)需要監(jiān)控1000個(gè)信號測點(diǎn),每個(gè)測點(diǎn)需要實(shí)時(shí)保存檢索2000條數(shù)據(jù),則服務(wù)器需要為近2億條記錄提供保存和檢索服務(wù)。即使這些數(shù)據(jù)全部采用內(nèi)存保存,如不考慮采用合適的數(shù)據(jù)結(jié)構(gòu)和算法,則服務(wù)器檢索計(jì)算壓力巨大,無法即時(shí)響應(yīng)和處理高頻次的數(shù)據(jù)請求。從建設(shè)成本角度出發(fā),數(shù)據(jù)中心也不宜僅僅為滿足數(shù)據(jù)緩沖需要而使用價(jià)格高昂的超大內(nèi)存服務(wù)器。
從工業(yè)遠(yuǎn)程監(jiān)控的實(shí)際應(yīng)用來看,遠(yuǎn)程監(jiān)控一般需要考慮觀測工藝節(jié)點(diǎn)關(guān)鍵指標(biāo)數(shù)據(jù),以及觀測某一關(guān)鍵指標(biāo)某時(shí)間區(qū)域的實(shí)時(shí)曲線。而實(shí)時(shí)信號的即時(shí)計(jì)算以及實(shí)時(shí)信號的回溯往往在工業(yè)環(huán)境現(xiàn)場以及本地信息中心處理。因此分析如下:遠(yuǎn)程監(jiān)控在對工藝節(jié)點(diǎn)監(jiān)測時(shí),需要參照工藝結(jié)構(gòu)圖觀測測點(diǎn)最新數(shù)據(jù),這是僅僅需要服務(wù)器向客戶端發(fā)送該測點(diǎn)單條最新數(shù)據(jù)即可;而在觀測測點(diǎn)實(shí)時(shí)曲線的時(shí)候,受限于顯示設(shè)備分辨率大小,服務(wù)器僅僅需要向客戶端發(fā)送固定長度的測點(diǎn)數(shù)據(jù)。
因此,傳統(tǒng)技術(shù)中提取的大量數(shù)據(jù)實(shí)際被應(yīng)用在客戶端的則非常少,造成了數(shù)據(jù)提取過程的資源浪費(fèi)。如何利用工業(yè)遠(yuǎn)程監(jiān)控在實(shí)際應(yīng)用中的這一數(shù)據(jù)提取特性,減少工業(yè)源點(diǎn)數(shù)據(jù)的提取量,設(shè)計(jì)出一種工業(yè)信號數(shù)據(jù)訪問方法已經(jīng)成為急需解決的技術(shù)問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是為了解決現(xiàn)有技術(shù)中工業(yè)信號源提取的數(shù)據(jù)利用率低造成數(shù)據(jù)提取資源浪費(fèi)的缺陷,提供一種基于定長數(shù)據(jù)塊的工業(yè)信號數(shù)據(jù)訪問方法來解決上述問題。
為了實(shí)現(xiàn)上述目的,本發(fā)明的技術(shù)方案如下:
一種基于定長數(shù)據(jù)塊的工業(yè)信號數(shù)據(jù)訪問方法,包括以下步驟:
構(gòu)建內(nèi)存服務(wù)器集群,根據(jù)測點(diǎn)實(shí)時(shí)曲線的生成需要設(shè)定數(shù)據(jù)塊長度,對內(nèi)存服務(wù)器進(jìn)行內(nèi)存配置,并建立內(nèi)存服務(wù)器節(jié)點(diǎn)信息表;
對測點(diǎn)在內(nèi)存服務(wù)器上進(jìn)行編碼,在每臺內(nèi)存服務(wù)器上分別對其存儲的測點(diǎn)進(jìn)行編碼并建立內(nèi)存服務(wù)器的內(nèi)存分配結(jié)構(gòu);
接收數(shù)據(jù)高速總線所發(fā)送的數(shù)據(jù),數(shù)據(jù)寫入調(diào)度器接收數(shù)據(jù)高速總線所發(fā)送的數(shù)據(jù),并向內(nèi)存服務(wù)器存入數(shù)據(jù);
內(nèi)存服務(wù)器數(shù)據(jù)的接收與處理,內(nèi)存服務(wù)器接收數(shù)據(jù)寫入調(diào)度器發(fā)送的數(shù)據(jù),并進(jìn)行處理,更新相應(yīng)的數(shù)據(jù)塊;
請求服務(wù)器或客戶端讀取數(shù)據(jù),客戶端讀取相應(yīng)數(shù)據(jù),以生成測點(diǎn)實(shí)時(shí)曲線或者展示實(shí)時(shí)工藝數(shù)據(jù)。
所述的構(gòu)建內(nèi)存服務(wù)器集群包括以下步驟:
根據(jù)客戶端生成測點(diǎn)實(shí)時(shí)曲線的需求,設(shè)定數(shù)據(jù)塊長度為128、256、512、1024或2048;
對測點(diǎn)建立標(biāo)識sig_id,標(biāo)識從0開始編號;
計(jì)算每臺內(nèi)存服務(wù)器內(nèi)存容量,根據(jù)數(shù)據(jù)塊長度分配每臺內(nèi)存服務(wù)器所對應(yīng)的測點(diǎn)數(shù),并將相對應(yīng)測點(diǎn)分配到每臺內(nèi)存服務(wù)器;
建立內(nèi)存服務(wù)器節(jié)點(diǎn)信息表,在內(nèi)存服務(wù)器節(jié)點(diǎn)信息表中建立數(shù)組sig_id_array、數(shù)組下標(biāo)為sig_id,數(shù)組sig_id_array存放信號名稱與測點(diǎn)標(biāo)識映射,信號名稱為sig_name,sig_name對應(yīng)的測點(diǎn)標(biāo)識為sig_id;
建立保存測點(diǎn)數(shù)據(jù)存取對應(yīng)的內(nèi)存服務(wù)器信息server_element,內(nèi)存服務(wù)器信息server_element結(jié)構(gòu)如下:
{min_sig_id,max_sig_id,server_id,server_address},
其中:min_sig_id為該內(nèi)存服務(wù)器存放的最小測點(diǎn)編號,max_sig_id為該內(nèi)存服務(wù)器存放的最大測點(diǎn)編號,serve_id為內(nèi)存服務(wù)器編號,server_address為內(nèi)存服務(wù)器訪問地址;
若干個(gè)server_element組成內(nèi)存服務(wù)器測點(diǎn)分配表sig_server_list;
在內(nèi)存服務(wù)器節(jié)點(diǎn)信息表中保存內(nèi)存服務(wù)器測點(diǎn)分配表sig_server_list。
所述的對測點(diǎn)在內(nèi)存服務(wù)器上進(jìn)行編碼包括以下步驟:
在每個(gè)內(nèi)存服務(wù)器內(nèi)均配置索引,其包含單條測點(diǎn)數(shù)據(jù)索引mono_ind_array、數(shù)據(jù)塊索引block_ind_array;
單條測點(diǎn)數(shù)據(jù)索引mono_ind_array為地址的一維數(shù)組,數(shù)組下標(biāo)id從0開始,其中下標(biāo)id與sig_id的對應(yīng)關(guān)系為
id=sig_id-min_sig_id;
數(shù)據(jù)塊索引block_ind_array為二維數(shù)組,其中每個(gè)元素結(jié)構(gòu)為{pos,length,address},
pos用于指示當(dāng)前最新的測點(diǎn)數(shù)據(jù)存放位置,length用于指示整個(gè)數(shù)據(jù)塊長度,address用于指示數(shù)據(jù)塊內(nèi)存首地址;
在每個(gè)內(nèi)存服務(wù)器內(nèi)均配置隊(duì)列,其包含單條測點(diǎn)數(shù)據(jù)隊(duì)列和測點(diǎn)數(shù)據(jù)塊隊(duì)列,其中單條測點(diǎn)數(shù)據(jù)隊(duì)列用于存放最近一次接收的測點(diǎn)數(shù)據(jù),測點(diǎn)數(shù)據(jù)塊隊(duì)列用于根據(jù)客戶端要求存放最近一段時(shí)間內(nèi)的測點(diǎn)數(shù)據(jù),測點(diǎn)數(shù)據(jù)塊分配按設(shè)定的數(shù)據(jù)塊長度固定大小,采用獨(dú)立的內(nèi)存空間存放;
對所有內(nèi)存服務(wù)器數(shù)據(jù)進(jìn)行初始化,對測點(diǎn)索引填充對應(yīng)的內(nèi)存地址,依次向mono_ind_array、block_ind_array填充分配好的內(nèi)存地址的首地址。
所述的接收數(shù)據(jù)高速總線所發(fā)送的數(shù)據(jù)包括以下步驟:
數(shù)據(jù)寫入調(diào)度器從高速數(shù)據(jù)總線接收數(shù)據(jù),其數(shù)據(jù)形式為{sig_name,timestamp,value},sig_name為信號名稱的散列值,timestamp為時(shí)間標(biāo)簽,value為測點(diǎn)信號值測點(diǎn)信號取到的數(shù)值;
數(shù)據(jù)寫入調(diào)度器采用二分查找法,從sig_id_array中查找sig_name,得到sig_name的數(shù)組下標(biāo)為sig_id;根據(jù)sig_id檢索sig_server_list查找到內(nèi)存服務(wù)器地址;
數(shù)據(jù)寫入調(diào)度器將該條數(shù)據(jù)發(fā)送到查找到的內(nèi)存服務(wù)器。
所述的內(nèi)存服務(wù)器數(shù)據(jù)的接收與處理包括以下步驟:
內(nèi)存服務(wù)器接收數(shù)據(jù),保存到單條測點(diǎn)數(shù)據(jù);
計(jì)算單條測點(diǎn)數(shù)據(jù)索引下標(biāo)為i_cursor=sig_id–min_sig_id得到測點(diǎn)在當(dāng)前服務(wù)器的單點(diǎn)索引位置;從索引mono_ind_array[i_cursor]處獲得測點(diǎn)數(shù)據(jù)存放的內(nèi)存地址,在此地址寫入數(shù)據(jù);
內(nèi)存服務(wù)器接收數(shù)據(jù),保存數(shù)據(jù)到測點(diǎn)數(shù)據(jù)塊,步驟如下:
計(jì)算i_cursor=sig_id–min_sig_id;得到測點(diǎn)在當(dāng)前服務(wù)器的測點(diǎn)數(shù)據(jù)塊索引位置;
從block_ind_array[i_cursor]得到該測點(diǎn)數(shù)據(jù)存放數(shù)據(jù)塊首地址block_address,并得到數(shù)據(jù)塊當(dāng)前測點(diǎn)數(shù)據(jù)存放位置pos,數(shù)據(jù)塊長度len;
計(jì)算pos=posmodlen;在block_address[pos]存放測點(diǎn)信號數(shù)據(jù)記錄;在當(dāng)前位置覆蓋最新的測點(diǎn)信號數(shù)據(jù);
將block_ind_array[i_cursor]當(dāng)前位置pos更新為pos+1modlen。
所述的請求服務(wù)器或客戶端讀取數(shù)據(jù)包括以下步驟:
客戶端發(fā)送請求到數(shù)據(jù)訪問調(diào)度器,請求包含sig_name,以及請求數(shù)據(jù)為單條還是數(shù)據(jù)塊,
根據(jù)請求的信號名稱sig_name,從sig_id_array查找到測點(diǎn)標(biāo)志sig_id;檢查sig_server_list查找對應(yīng)內(nèi)存服務(wù)器,將請求發(fā)送到對應(yīng)的內(nèi)存服務(wù)器;
若請求為讀取單條測點(diǎn)數(shù)據(jù),內(nèi)存服務(wù)器從mono_ind_array[sig_id-min_sig_id]處直接讀取數(shù)據(jù)記錄并放置臨時(shí)緩沖區(qū);
若請求為信號實(shí)時(shí)曲線,則內(nèi)存服務(wù)器從block_address=
block_ind_array[sig_id–min_sig_id]處直接讀取數(shù)據(jù)塊全部內(nèi)容放置臨時(shí)緩沖區(qū);
在臨時(shí)緩沖區(qū)對數(shù)據(jù)塊內(nèi)容整理,步驟如下:
將block_address[0..pos-1]的數(shù)據(jù)與block_address[pos..len-1]數(shù)據(jù)內(nèi)容交換后放到臨時(shí)緩沖區(qū);
編碼器根據(jù)請求服務(wù)器或者客戶端要求將臨時(shí)緩沖區(qū)數(shù)據(jù)編碼成xml格式或者json格式,放置輸出隊(duì)列,輸出隊(duì)列采用fifo方式輸出到請求服務(wù)器或者客戶端。
有益效果
本發(fā)明的基于定長數(shù)據(jù)塊的工業(yè)信號數(shù)據(jù)訪問方法,與現(xiàn)有技術(shù)相比利用工業(yè)遠(yuǎn)程監(jiān)控的數(shù)據(jù)特性采用單條測點(diǎn)隊(duì)列和數(shù)據(jù)塊隊(duì)列存儲數(shù)據(jù),并采用索引方式提高了內(nèi)存服務(wù)器對工業(yè)信號的檢索速度。本發(fā)明采用索引方式將一定時(shí)間序列的測點(diǎn)數(shù)據(jù)全部取出并發(fā)送,以減少服務(wù)檢索負(fù)載,從而降低了服務(wù)器檢索數(shù)據(jù)的計(jì)算負(fù)荷,滿足了客戶端的工藝關(guān)鍵數(shù)據(jù)實(shí)時(shí)展現(xiàn)以及工業(yè)曲線報(bào)表的實(shí)時(shí)展現(xiàn)要求。
附圖說明
圖1為本發(fā)明的方法順序圖;
圖2為本發(fā)明中內(nèi)存服務(wù)器的內(nèi)存分配圖;
圖3為現(xiàn)有技術(shù)中工業(yè)信號數(shù)據(jù)訪問連接框圖。
具體實(shí)施方式
為使對本發(fā)明的結(jié)構(gòu)特征及所達(dá)成的功效有更進(jìn)一步的了解與認(rèn)識,用以較佳的實(shí)施例及附圖配合詳細(xì)的說明,說明如下:
如圖3所示,現(xiàn)有技術(shù)的工業(yè)信號數(shù)據(jù)訪問連接關(guān)系中,高速數(shù)據(jù)總線用于向內(nèi)存服務(wù)器組寫入實(shí)時(shí)測點(diǎn)數(shù)據(jù),可以采用zmq、rabbitmq、zeromq、jms、msmq、activemq、jafka/kafka中任意一種實(shí)現(xiàn)。
內(nèi)存服務(wù)器節(jié)點(diǎn)信息表用于保存內(nèi)存服務(wù)器測點(diǎn)分配表sig_server_list和數(shù)組sig_id_array。
數(shù)據(jù)寫入調(diào)度器從高速數(shù)據(jù)總線讀取測點(diǎn)信號數(shù)據(jù),選擇內(nèi)存服務(wù)器保存數(shù)據(jù)。
內(nèi)存服務(wù)器用于存放以及檢索數(shù)據(jù),其內(nèi)存分配圖結(jié)構(gòu)如圖2所示,其中單條測點(diǎn)數(shù)據(jù)索引用于存放每條測點(diǎn)數(shù)據(jù)地址,測點(diǎn)數(shù)據(jù)塊索引保存測點(diǎn)數(shù)據(jù)塊首地址、以及數(shù)據(jù)塊長度、當(dāng)前下標(biāo)信息。單條測點(diǎn)數(shù)據(jù)隊(duì)列保存各個(gè)測點(diǎn)數(shù)據(jù)記錄,測點(diǎn)數(shù)據(jù)記錄格式為{sig_name,time_stamp,value}。測點(diǎn)數(shù)據(jù)塊保存一定時(shí)間序列內(nèi)的測點(diǎn)數(shù)據(jù)記錄,測點(diǎn)數(shù)據(jù)塊是固定長度的。
數(shù)據(jù)訪問調(diào)度器接收請求服務(wù)器或者客戶端數(shù)據(jù)請求,選擇測點(diǎn)信號存在的服務(wù)器。如請求的是單一工藝測點(diǎn)信號數(shù)據(jù),則從相應(yīng)內(nèi)存服務(wù)器取出單條測點(diǎn)數(shù)據(jù)記錄。如請求的是一段實(shí)時(shí)曲線數(shù)據(jù),則從相應(yīng)內(nèi)存服務(wù)器中拿出整個(gè)數(shù)據(jù)塊所有數(shù)據(jù)記錄,經(jīng)整理后給出。
編碼器對數(shù)據(jù)訪問調(diào)度器取出的數(shù)據(jù),按請求服務(wù)器或者客戶端要求編碼。
輸出緩存用于存放編碼后的測點(diǎn)數(shù)據(jù)記錄,等待請求服務(wù)器或者客戶端消費(fèi)數(shù)據(jù)。
如圖1所示,本發(fā)明所述的基于定長數(shù)據(jù)塊的工業(yè)信號數(shù)據(jù)訪問方法,包括以下步驟:
第一步,構(gòu)建內(nèi)存服務(wù)器集群。根據(jù)測點(diǎn)實(shí)時(shí)曲線的生成需要設(shè)定數(shù)據(jù)塊長度,對內(nèi)存服務(wù)器進(jìn)行內(nèi)存配置,并建立內(nèi)存服務(wù)器節(jié)點(diǎn)信息表。在此,為減少數(shù)據(jù)查詢的耗時(shí),針對各工業(yè)數(shù)據(jù)節(jié)點(diǎn)來分配相應(yīng)的內(nèi)存服務(wù)器,并對內(nèi)存服務(wù)器建立相應(yīng)的索引。在進(jìn)行工業(yè)節(jié)點(diǎn)數(shù)據(jù)查詢時(shí),無需查詢傳統(tǒng)的數(shù)據(jù)庫或訪問工業(yè)節(jié)點(diǎn),只需訪問相應(yīng)的內(nèi)存數(shù)據(jù)庫即可。其具體步驟如下:
(1)根據(jù)客戶端生成測點(diǎn)實(shí)時(shí)曲線的需求,設(shè)定數(shù)據(jù)塊長度為128、256、512、1024或2048,數(shù)據(jù)塊長度以數(shù)據(jù)位為單位。
(2)對測點(diǎn)(工業(yè)信號節(jié)點(diǎn))建立標(biāo)識sig_id,標(biāo)識從0開始編號。
(3)計(jì)算每臺內(nèi)存服務(wù)器內(nèi)存容量,根據(jù)數(shù)據(jù)塊長度分配每臺內(nèi)存服務(wù)器所對應(yīng)的測點(diǎn)數(shù),并將相對應(yīng)測點(diǎn)分配到每臺內(nèi)存服務(wù)器。例如:總計(jì)設(shè)有4臺內(nèi)存服務(wù)器,每臺內(nèi)存服務(wù)器均可提供32g內(nèi)存用于存放數(shù)據(jù)塊,設(shè)測點(diǎn)數(shù)據(jù)塊長度均為1k,則每臺服務(wù)器可分配測點(diǎn)數(shù)為32m個(gè)。
(4)建立內(nèi)存服務(wù)器節(jié)點(diǎn)信息表。在內(nèi)存服務(wù)器節(jié)點(diǎn)信息表中建立數(shù)組sig_id_array、數(shù)組即下標(biāo)為sig_id,數(shù)組sig_id_array存放信號名稱與測點(diǎn)標(biāo)識映射,信號名稱為sig_name,sig_name對應(yīng)的測點(diǎn)標(biāo)識為sig_id。為便于快速檢索sig_name采用散列編碼。
(5)建立保存測點(diǎn)數(shù)據(jù)存取對應(yīng)的內(nèi)存服務(wù)器信息server_element,內(nèi)存服務(wù)器信息server_element結(jié)構(gòu)如下:
{min_sig_id,max_sig_id,server_id,server_address},
其中:min_sig_id為該內(nèi)存服務(wù)器存放的最小測點(diǎn)編號,max_sig_id為該內(nèi)存服務(wù)器存放的最大測點(diǎn)編號,serve_id為內(nèi)存服務(wù)器編號,server_address為內(nèi)存服務(wù)器訪問地址。
若干個(gè)server_element組成內(nèi)存服務(wù)器測點(diǎn)分配表sig_server_list。
(6)在內(nèi)存服務(wù)器節(jié)點(diǎn)信息表中保存內(nèi)存服務(wù)器測點(diǎn)分配表sig_server_list。
第二步,對測點(diǎn)在內(nèi)存服務(wù)器上進(jìn)行編碼。在每臺內(nèi)存服務(wù)器上分別對其存儲的測點(diǎn)進(jìn)行編碼并建立內(nèi)存服務(wù)器的內(nèi)存分配結(jié)構(gòu)。在針對訪問內(nèi)存服務(wù)器的過程中,也并非傳統(tǒng)的針對內(nèi)存服務(wù)器進(jìn)行查找,而是采取從相應(yīng)的內(nèi)存服務(wù)器中直接調(diào)取(非查找)的方法。針對實(shí)際使用中,需要參照工藝結(jié)構(gòu)圖觀測測點(diǎn)最新數(shù)據(jù)的數(shù)據(jù)調(diào)取方式,只需讀取單條測點(diǎn)數(shù)據(jù)隊(duì)列,而單條測點(diǎn)數(shù)據(jù)隊(duì)列中即為不斷更新的單點(diǎn)(某一工業(yè)信號源)的數(shù)據(jù),再配以單條測點(diǎn)數(shù)據(jù)索引進(jìn)行定位;而需生成測點(diǎn)實(shí)時(shí)曲線時(shí),則需讀取測點(diǎn)數(shù)據(jù)塊隊(duì)列,測點(diǎn)數(shù)據(jù)塊隊(duì)列中保存的為單點(diǎn)(某一工業(yè)信號源)數(shù)據(jù)塊長度內(nèi)的數(shù)據(jù),再配以數(shù)據(jù)塊索引進(jìn)行定位,從而減少了系統(tǒng)的計(jì)算和響應(yīng)時(shí)間,提高了運(yùn)行效率。其具體步驟如下:
(1)在每個(gè)內(nèi)存服務(wù)器內(nèi)均配置索引,其包含單條測點(diǎn)數(shù)據(jù)索引mono_ind_array、數(shù)據(jù)塊索引block_ind_array,單條測點(diǎn)數(shù)據(jù)索引mono_ind_array是一個(gè)地址的一維數(shù)組。數(shù)組下標(biāo)id從0開始。其中下標(biāo)id與sig_id的對應(yīng)關(guān)系為:id=sig_id-min_sig_id;數(shù)據(jù)塊索引block_ind_array是一個(gè)二維數(shù)組,其中每個(gè)元素結(jié)構(gòu)為{pos,length,address},pos用于指示當(dāng)前最新的測點(diǎn)數(shù)據(jù)存放位置,length用于指示整個(gè)數(shù)據(jù)塊長度,address用于指示數(shù)據(jù)塊內(nèi)存首地址。
在每個(gè)內(nèi)存服務(wù)器內(nèi)均配置隊(duì)列,其包含單條測點(diǎn)數(shù)據(jù)隊(duì)列和測點(diǎn)數(shù)據(jù)塊隊(duì)列,其中單條測點(diǎn)數(shù)據(jù)隊(duì)列用于存放最近一次接收的測點(diǎn)數(shù)據(jù),測點(diǎn)數(shù)據(jù)塊隊(duì)列用于根據(jù)客戶端要求存放最近一段時(shí)間內(nèi)的測點(diǎn)數(shù)據(jù),測點(diǎn)數(shù)據(jù)塊分配按設(shè)定的數(shù)據(jù)塊長度固定大小,采用獨(dú)立的內(nèi)存空間存放。
(2)對所有內(nèi)存服務(wù)器數(shù)據(jù)進(jìn)行初始化,對測點(diǎn)索引填充對應(yīng)的內(nèi)存地址。具體是依次向mono_ind_array,block_ind_array填充分配好的內(nèi)存地址的首地址。
第三步,接收數(shù)據(jù)高速總線所發(fā)送的數(shù)據(jù)。數(shù)據(jù)寫入調(diào)度器接收數(shù)據(jù)高速總線所發(fā)送的數(shù)據(jù),并向內(nèi)存服務(wù)器存入數(shù)據(jù)。其具體步驟如下:
(1)數(shù)據(jù)寫入調(diào)度器從高速數(shù)據(jù)總線接收數(shù)據(jù),其數(shù)據(jù)形式為{sig_name,timestamp,value},其中:sig_name為信號名稱的散列值,timestamp為時(shí)間標(biāo)簽,value為測點(diǎn)信號值測點(diǎn)信號取到的數(shù)值。
(2)數(shù)據(jù)寫入調(diào)度器采用二分查找法,從sig_id_array中查找sig_name,由第一步(4)可知,對應(yīng)sig_name的數(shù)組下標(biāo)為sig_id;根據(jù)sig_id檢索sig_server_list查找到內(nèi)存服務(wù)器地址。
(3)數(shù)據(jù)寫入調(diào)度器將該條數(shù)據(jù)發(fā)送到查找到的內(nèi)存服務(wù)器。
由此可以看出,本發(fā)明只是在數(shù)據(jù)寫入調(diào)度器中進(jìn)行內(nèi)存服務(wù)器的查找,即傳統(tǒng)的工業(yè)信號大數(shù)據(jù)源的查找,在此變?yōu)檫M(jìn)行內(nèi)存服務(wù)器的查找,查找出所需要的內(nèi)存服務(wù)器地址,大大減少了數(shù)據(jù)查找量。
第四步,內(nèi)存服務(wù)器數(shù)據(jù)的接收與處理。內(nèi)存服務(wù)器接收數(shù)據(jù)寫入調(diào)度器發(fā)送的數(shù)據(jù),并進(jìn)行處理,更新相應(yīng)的數(shù)據(jù)塊。考慮到每個(gè)測點(diǎn)數(shù)據(jù)可能被用作工藝關(guān)鍵指標(biāo)或者是作為工藝曲線一部分,因此需要同時(shí)保存,具體步驟如下:
(1)內(nèi)存服務(wù)器接收數(shù)據(jù),保存到單條測點(diǎn)數(shù)據(jù);
計(jì)算單條測點(diǎn)數(shù)據(jù)索引下標(biāo)為i_cursor=sig_id–min_sig_id得到測點(diǎn)在當(dāng)前服務(wù)器的單點(diǎn)索引位置;從索引mono_ind_array[i_cursor]處獲得測點(diǎn)數(shù)據(jù)存放的內(nèi)存地址,在此地址寫入數(shù)據(jù);
(2)內(nèi)存服務(wù)器接收數(shù)據(jù),保存數(shù)據(jù)到測點(diǎn)數(shù)據(jù)塊,步驟如下:
計(jì)算i_cursor=sig_id–min_sig_id;得到測點(diǎn)在當(dāng)前服務(wù)器的測點(diǎn)數(shù)據(jù)塊索引位置;
從block_ind_array[i_cursor]得到該測點(diǎn)數(shù)據(jù)存放數(shù)據(jù)塊首地址block_address,并得到數(shù)據(jù)塊當(dāng)前測點(diǎn)數(shù)據(jù)存放位置pos,數(shù)據(jù)塊長度len;
計(jì)算pos=posmodlen;在block_address[pos]存放測點(diǎn)信號數(shù)據(jù)記錄;在當(dāng)前位置覆蓋最新的測點(diǎn)信號數(shù)據(jù)。
將block_ind_array[i_cursor]當(dāng)前位置pos更新為pos+1modlen。用于指示下一條測點(diǎn)數(shù)據(jù)存放位置。
在此,內(nèi)存服務(wù)器不斷進(jìn)行數(shù)據(jù)的更新,以等待請求服務(wù)器或客戶端進(jìn)行數(shù)據(jù)讀取。
由此方式,可以在固定大小的數(shù)據(jù)塊內(nèi)存中,不斷刷新,保存最近一段時(shí)間內(nèi)的測點(diǎn)信號數(shù)據(jù)。
第五步,請求服務(wù)器或客戶端讀取數(shù)據(jù)??蛻舳俗x取相應(yīng)數(shù)據(jù),以生成測點(diǎn)實(shí)時(shí)曲線或者展示實(shí)時(shí)工藝數(shù)據(jù)。其具體步驟如下:
(1)客戶端發(fā)送請求到數(shù)據(jù)訪問調(diào)度器,請求包含sig_name,以及請求數(shù)據(jù)為單條還是數(shù)據(jù)塊。
根據(jù)請求的信號名稱sig_name,從sig_id_array查找到測點(diǎn)標(biāo)志sig_id;檢查sig_server_list查找對應(yīng)內(nèi)存服務(wù)器,將請求發(fā)送到對應(yīng)的內(nèi)存服務(wù)器。
(2)若請求為讀取單條測點(diǎn)數(shù)據(jù),內(nèi)存服務(wù)器從mono_ind_array[sig_id-min_sig_id]處直接讀取數(shù)據(jù)記錄并放置臨時(shí)緩沖區(qū)。
(3)若請求為信號實(shí)時(shí)曲線,則內(nèi)存服務(wù)器從block_address=block_ind_array[sig_id–min_sig_id]處直接讀取數(shù)據(jù)塊全部內(nèi)容放置臨時(shí)緩沖區(qū);
(4)在臨時(shí)緩沖區(qū)對數(shù)據(jù)塊內(nèi)容整理,
步驟如下:
將block_address[0..pos-1]的數(shù)據(jù)與block_address[pos..len-1]數(shù)據(jù)內(nèi)容交換后放到臨時(shí)緩沖區(qū),保證數(shù)據(jù)塊內(nèi)容是按時(shí)間順序排列;
(5)編碼器根據(jù)請求服務(wù)器或者客戶端要求將臨時(shí)緩沖區(qū)數(shù)據(jù)編碼成xml格式或者json格式,放置輸出隊(duì)列,輸出隊(duì)列采用fifo方式輸出到請求服務(wù)器或者客戶端。
在工業(yè)現(xiàn)場監(jiān)控系統(tǒng)中,需要能夠?qū)崟r(shí)的展現(xiàn)出現(xiàn)場測點(diǎn)數(shù)據(jù)關(guān)鍵工藝指標(biāo)或者展示最近一段時(shí)間內(nèi)的實(shí)時(shí)曲線。而為之服務(wù)的工業(yè)數(shù)據(jù)中心需要能夠高速的保存大量的實(shí)時(shí)現(xiàn)場信號數(shù)據(jù)并能夠快速的被訪問者檢索。本發(fā)明采用內(nèi)存服務(wù)器測點(diǎn)分配表和測點(diǎn)索引兩級結(jié)構(gòu)指示不同信號數(shù)據(jù)訪問的不同的內(nèi)存服務(wù)器以及內(nèi)存地址。本發(fā)明采用單條測點(diǎn)隊(duì)列和數(shù)據(jù)塊隊(duì)列保存信號數(shù)據(jù),單條測點(diǎn)隊(duì)列用于存儲最新一次工藝節(jié)點(diǎn)關(guān)鍵指標(biāo)數(shù)據(jù),數(shù)據(jù)塊隊(duì)列保存最近一段時(shí)間內(nèi)的工藝節(jié)點(diǎn)測點(diǎn)信號數(shù)據(jù),由于采用了直接覆蓋方式的存儲機(jī)制,因此不保存歷史數(shù)據(jù)。采用如上機(jī)制的訪問方式,使訪問者直接利用內(nèi)存服務(wù)器測點(diǎn)分配表和測點(diǎn)索引獲取數(shù)據(jù),避免了傳統(tǒng)內(nèi)存數(shù)據(jù)的檢索,大大減少了內(nèi)存服務(wù)器的檢索壓力,適合工業(yè)數(shù)據(jù)中心采用分布式內(nèi)存服務(wù)器集中處理大量工業(yè)信號數(shù)據(jù)的場景。
以上顯示和描述了本發(fā)明的基本原理、主要特征和本發(fā)明的優(yōu)點(diǎn)。本行業(yè)的技術(shù)人員應(yīng)該了解,本發(fā)明不受上述實(shí)施例的限制,上述實(shí)施例和說明書中描述的只是本發(fā)明的原理,在不脫離本發(fā)明精神和范圍的前提下本發(fā)明還會有各種變化和改進(jìn),這些變化和改進(jìn)都落入要求保護(hù)的本發(fā)明的范圍內(nèi)。本發(fā)明要求的保護(hù)范圍由所附的權(quán)利要求書及其等同物界定。