孫宏林,巫 影
(海軍工程大學(xué) 船舶與動(dòng)力學(xué)院,武漢430033)
組態(tài)王6.5以前的版本,雖然支持最快的數(shù)據(jù)采集和處理的速率為毫秒級(jí)的,但是組態(tài)王自帶的數(shù)據(jù)庫(kù)存儲(chǔ)速率仍然是秒級(jí)的,存儲(chǔ)速率往往達(dá)不到實(shí)際的需要,而且數(shù)據(jù)存儲(chǔ)所占的磁盤空間較大,不適合長(zhǎng)時(shí)間、大規(guī)模的數(shù)據(jù)存儲(chǔ)及訪問(wèn)。雖然在組態(tài)王6.5以后的版本中采用了新的數(shù)據(jù)壓縮和搜索技術(shù),數(shù)據(jù)庫(kù)壓縮比低于20%,大大節(jié)約了壓縮空間,提高了訪問(wèn)速度,支持毫秒級(jí)存儲(chǔ)和查詢,但是數(shù)據(jù)庫(kù)中的數(shù)據(jù)仍是以二進(jìn)制文件的形式存儲(chǔ)的,引用不夠直觀,方便,數(shù)據(jù)的存儲(chǔ)和查詢方面的能力還偏弱。為此在某型艦船模擬器的研制中利用組態(tài)王6.5的SQL訪問(wèn)功能,連接到Access 2000數(shù)據(jù)庫(kù),實(shí)現(xiàn)了數(shù)據(jù)的時(shí)時(shí)存儲(chǔ)和查詢。*.REC文件中存放的數(shù)據(jù),不能用Excel直接打開,可以在VBA中調(diào)用動(dòng)態(tài)連接庫(kù)來(lái)訪問(wèn)[1-2]。
組態(tài)王SQL訪問(wèn)功能是為了實(shí)現(xiàn)組態(tài)王和其它ODBC數(shù)據(jù)庫(kù)之間的數(shù)據(jù)傳輸,它由組態(tài)王的SQL訪問(wèn)管理器來(lái)實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的通信。組態(tài)王SQL訪問(wèn)管理器用來(lái)建立數(shù)據(jù)庫(kù)列和組態(tài)王變量之間的聯(lián)系。通過(guò)表格模板在數(shù)據(jù)庫(kù)中創(chuàng)建表格,表格模板信息存儲(chǔ)在SQL.DEF文件中;通過(guò)記錄體建立數(shù)據(jù)庫(kù)表格列和組態(tài)王變量之間的聯(lián)系,允許組態(tài)王通過(guò)記錄體直接操縱數(shù)據(jù)庫(kù)中的數(shù)據(jù)。這種聯(lián)系存儲(chǔ)在BIND.DEF文件中。組態(tài)王可以與其它外部數(shù)據(jù)庫(kù)(支持ODBC訪問(wèn)接口,例如Microsoft Access數(shù)據(jù)庫(kù),Oracle數(shù)據(jù)庫(kù),SQLServer數(shù)據(jù)庫(kù),dBase數(shù)據(jù)庫(kù)等等)進(jìn)行數(shù)據(jù)傳輸,這里選用Access2000數(shù)據(jù)庫(kù)。
在D盤根目錄下建立一個(gè)名為“模擬器數(shù)據(jù)庫(kù).mdb”的Access空數(shù)據(jù)庫(kù)。然后在本機(jī)上的ODBC數(shù)據(jù)源中建立一個(gè)基于Micrisoft Access Driver(*.mdl)的數(shù)據(jù)源名——“模擬器數(shù)據(jù)庫(kù)”。在組態(tài)王中創(chuàng)建一個(gè)內(nèi)存整型變量DeviceID,用來(lái)保存SQLConnect()函數(shù)為每個(gè)數(shù)據(jù)庫(kù)連接分配的數(shù)值。在組態(tài)王的應(yīng)用程序命令語(yǔ)言對(duì)話框中,選擇啟動(dòng)時(shí)使用下述命令連接數(shù)據(jù)庫(kù):
SQLConnect(DeviceID,“dsn=模擬器數(shù)據(jù)庫(kù);uid=;pwd=”);用戶名和密碼可以根據(jù)需要而定。
在組態(tài)王中創(chuàng)建表格模板“經(jīng)航模板”、“主推模板”、“輔推模板”、“發(fā)電機(jī)模板”和“柴油機(jī)模板”。定義各個(gè)字段名稱,變量類型、變量長(zhǎng)度和索引類型。經(jīng)航電機(jī)的表格模板見圖1。
使用下述命令創(chuàng)建Access數(shù)據(jù)庫(kù)表格,取名為“經(jīng)航電機(jī)”:
SQLCreateTable(DeviceID,“經(jīng)航電機(jī)”,“經(jīng)航模板”);
“經(jīng)航電機(jī)”表格中的各列與“經(jīng)航模板”中的字段一一對(duì)應(yīng)。
在組態(tài)王中創(chuàng)建記錄體“經(jīng)航記錄”、“主推記錄”、“輔推記錄”、“發(fā)電機(jī)記錄”和“柴油機(jī)記錄”。記錄體中的字段名稱、順序等要與表格模板中定義的一致。經(jīng)航電機(jī)的記錄體見圖2。
這樣就建立了組態(tài)王變量與Access數(shù)據(jù)庫(kù)表格中的各列之間一一對(duì)應(yīng)的聯(lián)系。在組態(tài)王的應(yīng)用程序命令語(yǔ)言中選擇運(yùn)行時(shí),時(shí)間間隔設(shè)為55ms。使用下述命令可以將經(jīng)航電機(jī)的數(shù)據(jù)時(shí)時(shí)地存入經(jīng)航電機(jī)表格中:
SQLInsert(DeviceID,“經(jīng)航電機(jī)”,“經(jīng)航記錄”);
圖2 經(jīng)航記錄
另外還可以根據(jù)需要,在組態(tài)王的數(shù)據(jù)改變命令語(yǔ)言中選擇經(jīng)航電機(jī)變量,使用上述命令,只要數(shù)據(jù)發(fā)生改變就可以將經(jīng)航電機(jī)的數(shù)據(jù)存入經(jīng)航電機(jī)表格,甚至于可以在畫面命令語(yǔ)言中使用上述的命令將經(jīng)航電機(jī)的數(shù)據(jù)按照需要存入到數(shù)據(jù)庫(kù)表格中。
該命令使用記錄體“經(jīng)航記錄”中定義的連接,在表格“經(jīng)航電機(jī)”中插入一個(gè)新的記錄。該命令執(zhí)行后,組態(tài)王運(yùn)行系統(tǒng)會(huì)將經(jīng)航電機(jī)變量的當(dāng)前值添加到Access數(shù)據(jù)庫(kù)表格“經(jīng)航電機(jī)”中最后一條記錄。
在組態(tài)王中創(chuàng)建記錄體“經(jīng)航查詢”、“主推查詢”、“輔推查詢”、“發(fā)電機(jī)查詢”和“柴油機(jī)查詢”,用于定義查詢時(shí)的連接。圖3是經(jīng)航電機(jī)查詢記錄體。這里“經(jīng)航查詢”記錄體的字段名稱和順序要與“經(jīng)航記錄”和“經(jīng)航模板”中的一致。
圖3 經(jīng)航查詢
使用下列命令查詢數(shù)據(jù)庫(kù):
SQLSelect(DeviceID,“經(jīng)航電機(jī)”,“經(jīng)航查詢”,“”,“”);
該命令選擇表格“經(jīng)航電機(jī)”中所有符合條件的記錄,并以記錄體“經(jīng)航查詢”中定義的連接返回選擇集中的第一條記錄。可以設(shè)置查詢的條件和選擇集的排列順序,此處沒有設(shè)定條件,將返回該表格中所有記錄。執(zhí)行該命令后,運(yùn)行系統(tǒng)會(huì)把得到的選擇集的第一條記錄的各個(gè)字段的值,賦給記錄體經(jīng)航查詢中定義的與其連接的各組態(tài)王變量。
同時(shí)還有其他的一些命令語(yǔ)言可配合使用,例如:
SQLFirst(DeviceID);返回第一條記錄;
SQLprev(DeviceID);返回前一條記錄;
SQLNext(DeviceID);向后移動(dòng)一條記錄;
SQLLast(DeviceID);移到最后一條記錄;
SQLGetRecord(DeviceID,RecordNumber);返回指定序號(hào)記錄;
SQLEndSelect(DeviceID);結(jié)束選擇集,釋放資源。
下面是在某畫面命令中使用的部分程序:
s1=“勵(lì)磁電流調(diào)節(jié)<1”;
s2=“首電樞接通指示燈=1”;
s3=“尾電樞接通指示燈=1”;
s4=“運(yùn)行2指示燈=0”;
s5=“運(yùn)行1指示燈=0”;
s=s1+“and”+s2+“and”+s3+“and”+s4+“and”+s5;
SQLSelect(DeviceID,“經(jīng)航電機(jī)”,“經(jīng)航查詢”,s,“”);
NumRows=SQLNumRows(DeviceID);
if(NumRows==0)\本站點(diǎn)\經(jīng)航扣分=40;
SQLEndSelect(DeviceID);
SQLSelect(DeviceID,“經(jīng)航電機(jī)”,“經(jīng)航查詢”,“”,“”);
SQLLast(DeviceID);
if(JHDJ1_06R==1)\本站點(diǎn)\經(jīng)航扣分=\本站點(diǎn)\經(jīng)航扣分+15;
else if(JHDJ1_07R==1)\本站點(diǎn)\經(jīng)航扣分=\本站點(diǎn)\經(jīng)航扣分+15;
else if(JHDJ1_09R==1)\本站點(diǎn)\經(jīng)航扣分=\本站點(diǎn)\經(jīng)航扣分+10;
else if(JHDJ1_12R==0)\本站點(diǎn)\經(jīng)航扣分=\本站點(diǎn)\經(jīng)航扣分+10;
else if(JHDJ1_14R==0)\本站點(diǎn)\經(jīng)航扣分=\本站點(diǎn)\經(jīng)航扣分+10;
SQLEndSelect(DeviceID)。
在組態(tài)王的畫面命令中,可以編制條件更為復(fù)雜的查詢,非常靈活。
在組態(tài)王的應(yīng)用程序命令語(yǔ)言中,退出時(shí)使用SQLDisconnect(DeviceID);命令,可以斷開組態(tài)王與數(shù)據(jù)庫(kù)的連接。
組態(tài)王共提供了200多種函數(shù)可供用戶調(diào)用,其中數(shù)據(jù)庫(kù)操作函數(shù)就有40多種,上面提到的只是很小的一部分,同時(shí)組態(tài)王支持用戶自定義函數(shù),用戶可以根據(jù)需要自己編制合適的函數(shù)。另外組態(tài)王的命令語(yǔ)言是類似于C語(yǔ)言的,靈活,方便,易于用戶編制程序。
利用組態(tài)王的數(shù)據(jù)庫(kù)訪問(wèn)功能,可以建立組態(tài)王與Access數(shù)據(jù)庫(kù)的聯(lián)系,組態(tài)王提供了豐富的數(shù)據(jù)庫(kù)操作函數(shù),可以在任意一種命令語(yǔ)言中調(diào)用,可以方便地進(jìn)行創(chuàng)建表格,插入、刪除記錄,編輯已有的表格,清空、刪除表格,查詢記錄等操作。Access數(shù)據(jù)庫(kù)可以不必打開,只在后臺(tái)執(zhí)行就行了。數(shù)據(jù)庫(kù)中的數(shù)據(jù)可以根據(jù)需要隨時(shí)進(jìn)行轉(zhuǎn)存,大大節(jié)省了應(yīng)用程序所占的磁盤空間,在某型艦船模擬器中應(yīng)用該方法效果良好。
[1]王成志.工控軟件“組態(tài)王”的數(shù)據(jù)處理和Excel報(bào)表自動(dòng)生成程序設(shè)計(jì)[J].微計(jì)算機(jī)信息,2002,18(4):63-65.
[2]李衛(wèi)中.用access擴(kuò)展組態(tài)王的功能[J].化工自動(dòng)化及儀表,2002,29(4):82-84.