唐鋼信息自動化部 胡運杰
按照以往的慣例,數據庫用來保存數據,而對數據的處理由相應的進程處理。在以前的項目中有過類似的案例,通常的解決思路是MES將XML數據寫入本地數據庫。數據處理進程內部會維護一個定時器,該定時器會定時觸發(fā)查詢數據庫的新數據。進程查詢到新數據后,把存儲通信數據的XML文檔從數據庫內讀出,然后按照通信XML的格式進行解析,將解析的結果存入變量中,最后將解析完的的數據寫入數據庫。發(fā)送數據也一樣,先把待發(fā)送數據寫入數據庫,數據處理進程掃描到新數據后將數據封裝成XML文件,然后寫入數據庫再發(fā)送給MES。目前常用的處理方式有很多亟待解決的問題。所以需要一種全新的處理方法解決上述問題。
原通信的數據處理方式簡單直觀,技術較成熟。但是有一些不能避免的缺點:數據流復雜,系統(tǒng)開銷大,由此導致處理效率低,資源占用高。為了保證數據處理進程處理數據的即時性,只能縮短數據處理進程對數據庫進行查詢的周期。這樣的話,即使數據庫中沒有新數據也要對數據庫進行查詢。為了保證通信就需要保持以高頻率查詢數據庫。同時數據先寫入本地數據庫,再由數據處理進程讀出解析,再寫入本地數據庫,這種處理方式也會額外占用磁盤的讀寫資源。綜上,這種處理方式會導致很多不必要的開銷,而且也不能完全彌補它自身的弊端。
為縮短數據處理流程決定去掉后臺的數據處理程序,對新數據的處理采用觸發(fā)方式,收到新數據觸發(fā)解析,沒有新數據時沒有額外的資源開銷。減少數據的流轉過程,數據不再交由后臺進程處理,減少服務器硬盤讀寫操作,降低出錯幾率的同時減少磁盤資源占用,該部分數據的處理完全交給數據庫操作。數據庫直接解析或者封裝XML數據并保存處理后的信息。
在與MES通信接口方式中采用傳遞XML文件的方式進行數據交換。XML作為輕量級的數據儲存文件非常適合系統(tǒng)間的數據交換,具有統(tǒng)一的標準語法,并且在傳遞過程中保留了諸如父/子關系這樣的數據結構。在MES系統(tǒng)中由于采用了Tibco中間件,能夠簡單有效的處理XML文件,而在無人天車的系統(tǒng)中只能手動解析處理通信數據。
在通信報文中有3條用于生產的步進梁跟蹤數據對時間要求較高,需要及時對該數據進行處理并下發(fā)給WMS系統(tǒng)。在WMS與A模塊系統(tǒng)中鋼卷信息與鋼卷實物的對應關系依靠步進梁的跟蹤數據處理。如果步進梁跟蹤數據滯后或者不準確會導致嚴重的安全問題。其它生產數據也需要及時獲取并處理,所以及時準確與MES通信非常重要。
在以前的技術解決方案中,數據庫不僅作為最后結果的存儲器,也可以用作各個處理進程間的“共享緩沖”使用。使用數據庫作為“共享緩存”的弊端就是速度慢、開銷大。經過技術攻關決定采用新的數據處理結構,從根本上解決通信及時性問題。接收MES數據時,本地數據觸發(fā)器觸發(fā)新數據的解析處理,然后將解析后的數據存入本地。向MES發(fā)送數據時,本地數據庫觸發(fā)數據封裝處理,封裝完成后存入MES遠程數據表。很明顯如果這樣處理極大的提高了處理效率,并且降低了資源開銷。因為老的處理結構并沒有把全部系統(tǒng)資源用于處理數據,而是浪費在了等待、掃描新數據和無用的重復讀寫上面。
通過查閱有關XML的資料發(fā)現,XML文檔雖然是線性存儲的文檔,但是其內部的標準格式能保存完整的數據結構。很多軟件都提供了對XML對象的支持。XML DOM文檔對象模型類是XML文檔的內存中表示形式,DOM文檔對象模型能夠以編程方式讀取、處理和修改XML文檔。XML數據在內存中表示是常見的結構化方法,盡管實際的XML數據在文件中時或從另一個對象傳入時以線性方式存儲。
在XML文檔結構中,XMLNode對象是DOM樹中的基本對象。通過將XML文件轉換成對象,能夠用程方式操作XML文檔。通過查找、學習相關資料發(fā)現Oracle有一個包XMLDOM,可以很方便的處理XML對象。
通過oracle的XMLDOM包解析出的數據直接插入數據表中。存儲過程運行于數據庫內部,不需要再由程序將數據讀出來,所以減少了系統(tǒng)資源占用。在實際使用過程中發(fā)現數據庫的執(zhí)行效率非常高,解析時間在毫秒級,CPU占用率也極低。
解決了XML數據解析問題后還存在一個問題,就是收到MES新數據后的觸發(fā)處理,這是解決通信數據處理及時性的關鍵。采用定時器掃描處理的方式有先天的弊端,并不適合對速度要求較高的環(huán)境。通過比較認為采用觸發(fā)器比較適用于及時處理通信數據。觸發(fā)器在數據庫以獨立的對象存儲,觸發(fā)器不需要顯示調用而是由一個事件啟動運行。
這樣當MES有新數據存入本地接口表時,在插入新數據前就會觸發(fā)解析新數據的存儲過程。存儲過程會把解析好的數據保存到相應的表。MES發(fā)送的原始數據也插入本地接口表存檔。使用觸發(fā)器觸發(fā)新數據處理,免去了定時器對某個表的頻繁讀取,減輕了對數據庫的沖擊,能夠提高整個數據運行效率。數據庫解析過程對于上層程序來說是透明的,上層進程不需要知道數據來源,只需使用即可。
向MES發(fā)送的數據采用類似的處理方式,不用后臺進程處理,直接由oracle數據庫進行封裝,然后發(fā)送到MES的接口表。oracle對數據的封裝調用了oracle的DBMS_XML包,這個包能夠把SQL查詢的結果轉換成XML文件。最后將生成的XML文檔放入clob字段并發(fā)送給MES。封裝XML的過程重點是根據報文結構構造查詢結果集,查詢結果集要和生成的XML數據結構一致,否則會生成錯誤的XML文件。
經過后期的應用測試,去掉后臺處理程序后縮短了數據處理流程??s短數據流程后數據處理速度更加迅速,滿足了生產的實時性要求。新數據通過觸發(fā)的方式處理速度更加迅速,同時降低了服務器的資源占用。并且通過數據庫解析、封裝XML通信數據,使數據與應用程序的分層更加清晰。數據的問題全部交由數據庫處理,數據庫不僅是“容器”還作為“處理器”。前臺應用程序只需調用現成處理好的數據。也為以后大項目的分工協(xié)作提供了新的方法。