, ,, ,
(1.中國船舶科學(xué)研究中心,江蘇 無錫 214082;2.江南大學(xué) 信息工程學(xué)院,江蘇 無錫 214122; 3.無錫職業(yè)技術(shù)學(xué)院,江蘇 無錫 214121)
船舶數(shù)字化平臺項目的主要目標(biāo)是實現(xiàn)從中國船舶研究中心重點實驗室試驗數(shù)據(jù)的采集、整理、分析和整合,并實現(xiàn)基于集中的中央數(shù)據(jù)庫開發(fā)艦船性能預(yù)報系統(tǒng),提供數(shù)據(jù)訪問和交換服務(wù)性能預(yù)報系統(tǒng),提供數(shù)據(jù)訪問和交換服務(wù)。利用LabVIEW[1]的數(shù)據(jù)采集[2]和對數(shù)據(jù)庫的操作功能以及Java的存儲過程,在船舶數(shù)據(jù)庫平臺上實現(xiàn)數(shù)據(jù)自動采集接口。
LabVIEW的程序由前面板和流程圖兩部分組成,整個程序是基于多線程的設(shè)計,前面板和流程圖各占用一個線程。前面板是LabVIEW程序的圖形用戶接口,此接口集成了用戶輸入,并顯示程序的輸出,相當(dāng)于傳統(tǒng)儀器的面板。流程圖包含虛擬儀器程序的圖形化源代碼,編程控制和定義在前面板上的輸入和輸出功能。
數(shù)據(jù)采集的整個過程見圖1。
圖1 LabVIEW數(shù)據(jù)采集流程圖
圖3 LabVIEW數(shù)據(jù)自動入庫
在數(shù)據(jù)采集之前,程序?qū)AQ板卡初始化,板卡上和內(nèi)存中的Buffer是數(shù)據(jù)采集存儲的中間環(huán)節(jié)。采集卡的數(shù)據(jù)先送到Buffer,由于采用的卡有DMA性能,模擬輸入操作就有一個通向計算機內(nèi)存的高速硬件通道,這就意味著所采集的數(shù)據(jù)直接送到計算機的內(nèi)存。觸發(fā)涉及初始化、終止或同步DAQ事件的任何方法。觸發(fā)器通常是一個數(shù)字或模擬信號,其狀態(tài)可確定動作的發(fā)生。硬件觸發(fā)讓板卡上的電路管理觸發(fā)器,控制了DAQ事件的時間分配,有很高的精確度。自動采集接口首先由采集到的數(shù)據(jù)通過通用接口總線傳輸給主機,由 LabVIEW試驗系統(tǒng)程序進行相應(yīng)處理后,再通過Java存儲過程將原始數(shù)據(jù)和信息存儲到數(shù)據(jù)庫中。
在數(shù)據(jù)采集到以后,數(shù)據(jù)將會進行分析,然后將分析處理后的數(shù)據(jù)直接導(dǎo)入到船舶數(shù)字化平臺中。將分析好的數(shù)據(jù)利用Java的存儲過程導(dǎo)入到船舶數(shù)字化平臺中的程序結(jié)構(gòu)見圖2。
圖2 LabVIEW配置程序
LabVIEW配置程序圖中描述的是將LabVIEW進行數(shù)據(jù)庫連接的配置,確保每次都能夠連接上數(shù)據(jù)庫。
在LabVIEW數(shù)據(jù)自動入庫圖中,LabVIEW設(shè)置了一些參數(shù)的類型和數(shù)據(jù)的格式,然后用call方法來調(diào)用Java存儲過程,利用存儲過程將數(shù)據(jù)自動保存到船舶數(shù)字化平臺中。在保存的過程中,如果檢測到數(shù)據(jù)有問題或者數(shù)據(jù)格式不對,Java的存儲過程就會執(zhí)行事物的回滾,LabVIEW會提示保存出錯;如果檢測不到錯誤,LabVIEW會提示添加成功。
從Oracle8i開始,Oracle已經(jīng)在數(shù)據(jù)庫中支持Java,從而為存儲過程提供了不同于PL/SQL的開放式和可移植的方法。兩種語言都適用于數(shù)據(jù)庫編程,對于要求與SQL進行無縫集成的數(shù)據(jù)庫中心來說則邏輯使用PL/SQL,從而完成對數(shù)據(jù)庫對象、類型和特性的訪問。
出于與數(shù)據(jù)庫的無關(guān)性考慮,可以選擇Java作為開放式的語言來取代PL/SQL,同時也為了集成和溝通SQL、XML、J2EE和Web服務(wù)等各個領(lǐng)域。
2.2.1 數(shù)據(jù)的處理
Java的存儲過程中首先是進行數(shù)據(jù)的處理,主要有以下一些處理:
1) 有些船舶數(shù)字化平臺中設(shè)定為非空的數(shù)據(jù)如果在LabVIEW中為空,那么在Java的存儲過程中會進行處理,使數(shù)據(jù)不能保存到船舶數(shù)字化平臺;
2) 設(shè)定LabVIEW分析好的數(shù)據(jù)的格式全部為字符串類型,在Java的存儲過程中將會對這些字符串?dāng)?shù)據(jù)進行適當(dāng)?shù)霓D(zhuǎn)換,使數(shù)據(jù)能和船舶數(shù)字化平臺中的數(shù)據(jù)類型保持一致;
3) 在一些包含了許多單獨字段的字符串,對其進行分割,用字符數(shù)組來保存這些分割好的數(shù)據(jù)。
2.2.2 事務(wù)的處理
在數(shù)據(jù)庫操作中,一項事務(wù)是指由一條或多條對數(shù)據(jù)庫更新的sql語句所組成的一個不可分割的工作單元。只有當(dāng)事務(wù)中的所有操作都正常完成了,整個事務(wù)才能被提交到數(shù)據(jù)庫,如果有一項操作沒有完成,就必須撤消整個事務(wù)。由于對數(shù)據(jù)庫進行了多次操作,每一次的執(zhí)行或步驟都是一個事務(wù).如果數(shù)據(jù)庫操作在某一步?jīng)]有執(zhí)行或出現(xiàn)異常而導(dǎo)致事務(wù)失敗,這樣有的事務(wù)被執(zhí)行有的就沒有被執(zhí)行,從而就有了事務(wù)的回滾,取消先前的操作。在jdbcapi中,可以通過調(diào)用setAutoCommit(false)來禁止自動提交事務(wù)。然后就可以把多條更新數(shù)據(jù)庫的sql語句做為一個事務(wù),在所有操作完成之后,調(diào)用commit()來進行整體提交。倘若其中一項sql操作失敗,就不會執(zhí)行commit()方法,而是產(chǎn)生相應(yīng)的sqlexception,此時就可以捕獲異常代碼塊中調(diào)用rollback()方法來撤消事務(wù)。
2.2.3 自增序列的查詢與插入
在數(shù)據(jù)庫的表結(jié)構(gòu)中,有些字段被設(shè)置為主鍵,并且是自增的。在查詢這些字段時可以采用no_zlcon_s.currval,插入這些字段可以采用no_zlcon_s.nextval。其中no_zlcon_s為其中一張表的sequence。并且在做這些操作的時候應(yīng)該先做no_zlcon_s.nextval,然后做no_zlcon_s.currval。
LoadJava是加載Java源文件、Java類文件和Java資源文件的實用程序,它可以用來驗證字節(jié)碼,并將Java類和JAR文件布置到數(shù)據(jù)庫中。它既可以通過命令行調(diào)用,也可以通過包含于DBMS_Java類中的loadJava()方法調(diào)用。為了加載zlcon類,輸入:
loadJava-user ksx/cssrc@cssrcdb D:zlcon.class。
其中,ksx為用戶名;cssrc為用戶密碼;cssrcdb為SID,為zlcon類存放的物理位置。
利用這個命令,可以將zlcon類裝載到ORACLE數(shù)據(jù)庫的KSX用戶下。
為了從ORACLE中調(diào)用Java方法(以及從PL/SQl和JDBC中調(diào)用),必須首先通過Call Spec發(fā)布公共靜態(tài)方法,它為SQL定義方法采用的參數(shù)以及返回的SQL類型。Java存儲過程可以通過其Call Spec從以下各項中進行調(diào)用:SQL DML語句(INSERT, UPDATE、DELETE、SELECT、CALL、EXPLAIN PLAN、LOCK TABLE和MERGE)、PL/SQL塊、子程序、程序包以及數(shù)據(jù)庫觸發(fā)器??梢韵裣旅孢@樣生成調(diào)用的Java存儲過程:
create or replace function addzlconzlori(ShipModleID varchar2,PropellerModuleID varchar2,……) return varchar2 as language Java name ‘zlcon.addzlconzlori(Java.lang.String,Java.lang.String,……)’ return Java.lang.String。
這樣就創(chuàng)建了一個addzlconzlori存儲過程,相當(dāng)于在ORACLE里面存在這樣一個方法,可以被其他程序來調(diào)用,并且其中還涉及到存儲過程的返回值。
LabVIEW本身并不具備數(shù)據(jù)庫訪問功能,因此以LabVIEW編制的虛擬儀器系統(tǒng)需要其它輔助的方法來進行數(shù)據(jù)庫訪問。在LabVIEW中訪問數(shù)據(jù)庫的方式主要又以下幾種:
1) 利用NI公司的附加工具包中的數(shù)據(jù)庫接口工具包LabVIEW SQL Toolkit[3]進行數(shù)據(jù)庫訪問。該工具包集成了一系列的高級功能模塊,這些模塊封裝了大多數(shù)的數(shù)據(jù)庫操作和一些高級的數(shù)據(jù)庫訪問功能。
2) 利用LabVIEW的ActiveX功能,調(diào)用Microsoft ADO對象,利用SQL語言實現(xiàn)數(shù)據(jù)庫的訪問。使用這種方法需要用戶對Microsoft ADO以及SQL語言有較深的了解。
3) 通過第三方開發(fā)的免費工具包LabSQL訪問。LabSQL利用Microsoft ADO以及SQL語言來完成數(shù)據(jù)庫訪問,將復(fù)雜的底層ADO及SQL操作封裝成一系列的LabSQL VIs,簡單易用。
出于對程序的可靠性和快速性考慮,數(shù)據(jù)自動采集接口訪問數(shù)字化平臺采用的是第1)種方式。
LabVIEW SQL Toolkit是用于數(shù)據(jù)庫訪問的附加工具包,它集成了一系列的高級功能模塊,這些模塊封裝了大多數(shù)的數(shù)據(jù)庫操作和一些高級的數(shù)據(jù)庫訪問功能,以使用LabVIEW SQL Toolkit在LabVIEW中支持ODBC的本地或遠程數(shù)據(jù)庫,例如Microsoft Access,Microsoft SQL Sever,Sybase SQL Server以及Oracle等。
使用DB Tools List Tables以一維數(shù)組形式列出指定數(shù)據(jù)庫中的所有表,同時顯示在前面板數(shù)組控件tables中。用戶指定Table Index后,通過索引數(shù)組函數(shù)Index Array索引其中一個表。然后將表名連接到DB Tools List Columns和DB Tools Select All Data。
接下來先將采集的數(shù)據(jù)進行格式轉(zhuǎn)換,賦給addzlconzlori方法里面的參數(shù),然后連接到數(shù)據(jù)庫后,可以通過執(zhí)行下面的SQL語句來調(diào)用Java的存儲。
Call addzlconzlori (?,?,……..) into:msg;
select :msg from dual;
然后LabVIEW會根據(jù)存儲過程的返回值來顯示是否操作成功。
LabVIEW的數(shù)據(jù)采集的技術(shù)。經(jīng)實踐證明效果明顯,大量減少了人工的參與,同時也提高了數(shù)據(jù)采集的安全性和穩(wěn)定性。對于需要進行大量數(shù)據(jù)采集的系統(tǒng)有很好的借鑒意義。
[1] Robert H.Bishop LabVIEW 6i 實用教程[M].北京:電子工業(yè)出版社, 2004.
[2] 楊樂平,李海濤.LabVIEW高級程序設(shè)計[M].北京:清華大學(xué)出版社,2003.
[3] 黎洪生,李 超,劉俊剛,等.LabVIEW中利用ADO接口訪問數(shù)據(jù)庫的方法[J].計算機系統(tǒng)應(yīng)用,2001(11):73-74.