龔偉平(1976-)
男,湖南雙峰人,中南大學(xué)信息科學(xué)與工程學(xué)院在讀工程碩士研究生,(湖南婁底華菱漣鋼集團(tuán)信息自動(dòng)化中心,湖南 婁底 417009)主要研究方向?yàn)橄冗M(jìn)控制技術(shù)及工程應(yīng)用、過(guò)程工業(yè)控制、智能控制與智能自動(dòng)化。
摘要:本論文詳細(xì)介紹了基于ODBC技術(shù)實(shí)現(xiàn)iFix 組態(tài)軟件與關(guān)系數(shù)據(jù)庫(kù)通訊的原理和方法,增強(qiáng)了報(bào)表功能;某工程應(yīng)用實(shí)例表明該方法行之有效。
關(guān)鍵詞:關(guān)鍵字 ODBC;iFix;三級(jí)機(jī);SQL2000
Abstract: This paper describes in detail the communication principle and method of iFix configuration software and relational database based on ODBC technology, and the function of report is also added to this system. The practical engineering application shows the effectiveness of the method.
Key words: ODBC;iFix;Level3;SQL2000
1 引言
iFix是Intellution Dynamics(全世界上第一套基于組件技術(shù)的自動(dòng)化監(jiān)控軟件家族)最為重要的上位監(jiān)控軟件產(chǎn)品之一,該軟件產(chǎn)品無(wú)疑為全球自動(dòng)化生產(chǎn)制造業(yè)提供了易于使用,高性能的自動(dòng)化監(jiān)控解決方案,平臺(tái)功能強(qiáng)大,集控制技術(shù)、人機(jī)界面技術(shù)、數(shù)據(jù)庫(kù)技術(shù)、網(wǎng)絡(luò)技術(shù)于一身,可實(shí)現(xiàn)數(shù)據(jù)采集、實(shí)時(shí)過(guò)程監(jiān)控、報(bào)警和報(bào)警管理、報(bào)表查詢打印、趨勢(shì)分析等功能,并且可與信息自動(dòng)化管理系統(tǒng)進(jìn)行無(wú)縫連接。借助ODBC技術(shù),將iFix采集的現(xiàn)場(chǎng)數(shù)據(jù)通過(guò)以太網(wǎng)傳送到L3系統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)中,實(shí)現(xiàn)共享信息資源的全方位、全過(guò)程信息系統(tǒng)。
2 總體思路
開(kāi)放式數(shù)據(jù)庫(kù)互連(ODBC)是Microsoft的標(biāo)準(zhǔn)API,用來(lái)訪問(wèn)、顯示和修改多種關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù);結(jié)構(gòu)化查詢語(yǔ)言(SQL)是關(guān)系數(shù)據(jù)庫(kù)使用的標(biāo)準(zhǔn)語(yǔ)言,用來(lái)檢索、更新和管理數(shù)據(jù),不提供公共應(yīng)用程序接口(API)。ODBC技術(shù)的最大優(yōu)勢(shì)是開(kāi)放的互操作性,通過(guò)安裝多種ODBC驅(qū)動(dòng)程序,可實(shí)現(xiàn)同一應(yīng)用程序?qū)Σ煌瑪?shù)據(jù)庫(kù)的訪問(wèn)。由于iFix和SQL2000都支持ODBC標(biāo)準(zhǔn),可以通過(guò)ODBC接口實(shí)現(xiàn)SCADA節(jié)點(diǎn)和數(shù)據(jù)庫(kù)服務(wù)器之間的通訊。
圖1 多層ODBC驅(qū)動(dòng)程序結(jié)構(gòu)圖
在本應(yīng)用中是通過(guò)在iFix端安裝ODBC驅(qū)動(dòng)程序,把SQL2000數(shù)據(jù)庫(kù)作為數(shù)據(jù)源來(lái)實(shí)現(xiàn)連接的。在iFix中可通過(guò)兩種ODBC結(jié)構(gòu)(多層ODBC驅(qū)動(dòng)和單層ODBC驅(qū)動(dòng))來(lái)實(shí)現(xiàn)通訊。數(shù)據(jù)庫(kù)文件和應(yīng)用可位于同一臺(tái)計(jì)算機(jī)上,也可以通過(guò)網(wǎng)絡(luò)位于另外計(jì)算機(jī)上。多層驅(qū)動(dòng)更為普遍,通常與遠(yuǎn)程數(shù)據(jù)庫(kù)服務(wù)器如SQL2000和Oracle等一起使用。多層驅(qū)動(dòng)處理由應(yīng)用引起的ODBC呼叫,傳遞實(shí)際SQL命令到數(shù)據(jù)庫(kù)系統(tǒng)。由于SQL2000屬于遠(yuǎn)程服務(wù)器數(shù)據(jù)庫(kù),所以采用的是多層ODBC驅(qū)動(dòng)程序,其結(jié)構(gòu)如圖1所示。
當(dāng)iFix ODBC應(yīng)用請(qǐng)求連接時(shí),由ODBC驅(qū)動(dòng)管理器裝載相應(yīng)的驅(qū)動(dòng)程序,ODBC驅(qū)動(dòng)程序?qū)Fix ODBC的調(diào)用轉(zhuǎn)換成對(duì)特定數(shù)據(jù)庫(kù)的調(diào)用,并與數(shù)據(jù)庫(kù)客戶端支持層通訊。網(wǎng)絡(luò)層將請(qǐng)求處理并傳送到數(shù)據(jù)庫(kù)服務(wù)器,監(jiān)聽(tīng)進(jìn)程負(fù)責(zé)接收客戶端服務(wù)的請(qǐng)求,最終由數(shù)據(jù)庫(kù)引擎查詢實(shí)現(xiàn)數(shù)據(jù)的操作。
3 數(shù)據(jù)通訊原理
通過(guò)ODBC API提供訪問(wèn)SQL數(shù)據(jù)源,iFix允許使用下列方法:iFix SQL接口選項(xiàng),稱為iFix ODBC;以及在Microsoft Visual Basic for Applications通過(guò)DAO或RDO。iFix到SQL數(shù)據(jù)源的路徑如圖2所示。
圖2 iFix到SQL數(shù)據(jù)源的路徑示意圖
iFix ODBC由SQL觸發(fā)塊(SQT)、SQL數(shù)據(jù)塊(SQD)、SQL任務(wù)三部分組成,其中SQL觸發(fā)塊用于指定SQL命令的名稱,并確定數(shù)據(jù)傳輸觸發(fā)的時(shí)間或事件,SQL數(shù)據(jù)塊用于指定采集和傳送的數(shù)據(jù)以及數(shù)據(jù)傳送的方向。SQL任務(wù)除處理和ODBC驅(qū)動(dòng)的通訊外,還和SQT塊、SQD塊通訊。以iFix過(guò)程數(shù)據(jù)庫(kù)到關(guān)系數(shù)據(jù)庫(kù)為例說(shuō)明數(shù)據(jù)的傳輸過(guò)程:
(1)當(dāng)SQL觸發(fā)塊(SQT)由時(shí)間或事件觸發(fā)時(shí),把要執(zhí)行的SQL 命令的名稱和數(shù)據(jù)源的名稱DSN 一起傳給SQL任務(wù);
(2)SQL任務(wù)根據(jù)接收到的信息到關(guān)系數(shù)據(jù)庫(kù)的SQL庫(kù)表檢索與命令名對(duì)應(yīng)的SQL命令。數(shù)據(jù)庫(kù)引擎以字符串的形式返回SQL命令;
(3)SQL任務(wù)把從SQL庫(kù)表獲得的SQL命令和SQL數(shù)據(jù)塊(SQD)中列出的數(shù)據(jù)塊中的數(shù)據(jù)結(jié)合,形成完整的命令;
(4)SQL任務(wù)用該命令對(duì)關(guān)系數(shù)據(jù)庫(kù)進(jìn)行操作,由數(shù)據(jù)庫(kù)引擎把數(shù)據(jù)寫入數(shù)據(jù)表中。
4 實(shí)現(xiàn)方法
4.1 數(shù)據(jù)庫(kù)服務(wù)器的配置
(1)創(chuàng)建SQL2000數(shù)據(jù)庫(kù)與表單:數(shù)據(jù)庫(kù)名稱為iFix ;創(chuàng)建SQL命令表、錯(cuò)誤記錄表與實(shí)時(shí)數(shù)據(jù)采集表 。創(chuàng)建SQL命令:在SQL Query Analyzer中使用SQL語(yǔ)言創(chuàng)建SQL庫(kù)表,用以存放將要執(zhí)行的SQL命令。該庫(kù)表只能有sqlname和sqlcmd兩個(gè)字段,分別存放SQL命令的名稱和內(nèi)容。創(chuàng)建錯(cuò)誤記錄表和數(shù)據(jù)表:錯(cuò)誤記錄表用于記錄所有SQL運(yùn)行的錯(cuò)誤消息,其字段也需根據(jù)要求設(shè)置;數(shù)據(jù)表用于存放實(shí)際傳輸?shù)臄?shù)據(jù),可根據(jù)應(yīng)用的需要?jiǎng)?chuàng)建合適的字段(需要傳輸多少個(gè)標(biāo)簽數(shù)據(jù)就需要有多少個(gè)字段)。
(2)創(chuàng)建ODBC數(shù)據(jù)源:打開(kāi)WINDOWS控制面板中管理工具的數(shù)據(jù)源(ODBC),選中系統(tǒng)DSN或用戶DSN項(xiàng),單擊添加后選擇SQL2000驅(qū)動(dòng)程序,填寫數(shù)據(jù)源DSN名稱:iFixODBC與服務(wù)器名稱:SUNOK。
(3)在SQL Server Network Utility Gerneral中允許TCP/IP協(xié)議,在其屬性中設(shè)置端口。
(4)在客戶端配置中網(wǎng)絡(luò)庫(kù)選用TCP/IP,注意端口設(shè)置與步驟C中一致,使服務(wù)器能響應(yīng)iFix ODBC應(yīng)用的請(qǐng)求。
4.2 SCADA節(jié)點(diǎn)(iFix端)的配置
在對(duì)iFix軟件進(jìn)行配置前,需安裝SQL2000的網(wǎng)絡(luò)服務(wù)和基本客戶機(jī)軟件(ODBC驅(qū)動(dòng)程序包括在其中),以支持ODBC的運(yùn)行。
(1)添加SQL帳戶:在創(chuàng)建完ODBC數(shù)據(jù)源后,就可在系統(tǒng)設(shè)置SCU中添加SQL帳戶,把SQL2000數(shù)據(jù)源添加進(jìn)來(lái)。此處選擇的數(shù)據(jù)庫(kù)類型為SQL2000,填寫的用戶名和密碼必須具有訪問(wèn)在數(shù)據(jù)庫(kù)中創(chuàng)建的SQL庫(kù)表和數(shù)據(jù)表的權(quán)限,數(shù)據(jù)庫(kù)ID便是SQL2000數(shù)據(jù)源名DSN。
(2)配置SQL任務(wù):在SCU的配置SQL任務(wù)對(duì)話框中完成。首先需啟用SQL支持,啟用后SQL任務(wù)會(huì)以WSQLODC.EXE任務(wù)的形式自動(dòng)添加。然后需分別設(shè)置主、次備份文件的路徑,以便與數(shù)據(jù)庫(kù)服務(wù)器的通訊出現(xiàn)故障時(shí)將數(shù)據(jù)備份,等故障排除后重新發(fā)送。此外還需分別輸入數(shù)據(jù)源名、數(shù)據(jù)庫(kù)中SQL庫(kù)表和錯(cuò)誤記錄表的名稱。
(3)定義SQT和SQD塊:iFix過(guò)程數(shù)據(jù)庫(kù)與SQL2000數(shù)據(jù)庫(kù)的通訊方式及傳輸內(nèi)容是通過(guò)配置SQT和SQD塊具體實(shí)現(xiàn)的。在iFix過(guò)程數(shù)據(jù)庫(kù)管理器中添加標(biāo)簽SQT與SQD。SQT塊中需添加將執(zhí)行的SQL命令名(需與SQL2000數(shù)據(jù)庫(kù)中表單名稱一致)與數(shù)據(jù)庫(kù)ID,命令執(zhí)行的時(shí)間事件或塊事件與事件類型,以及與該SQT塊鏈接的SQD塊。在SQD塊中需定義需要傳輸?shù)倪^(guò)程數(shù)據(jù)標(biāo)簽(時(shí)間日期標(biāo)簽?zāi)J(rèn)為TMTD)以及傳輸?shù)姆较颉?BR>
4.3 報(bào)表的實(shí)現(xiàn)
iFix基于時(shí)間調(diào)度事件可以生成每天的Excel格式報(bào)表,但經(jīng)過(guò)實(shí)踐后,發(fā)現(xiàn)iFix運(yùn)行緩慢,其后臺(tái)服務(wù)占有相當(dāng)?shù)南到y(tǒng)資源。如果采用API計(jì)時(shí)器也需占用大量的系統(tǒng)資源,造成控制系統(tǒng)死機(jī)。因此,建議不采用調(diào)度事件或API計(jì)時(shí)器觸發(fā)。Intellution推薦所有iFix的VBA腳本中使用ADO來(lái)處理數(shù)據(jù)庫(kù)的訪問(wèn)。
(1)創(chuàng)建ADO對(duì)象
為了使用ActiveX數(shù)據(jù)對(duì)象來(lái)處理數(shù)據(jù),需要參考畫面工程中的ActiveX數(shù)據(jù)對(duì)象庫(kù)。從VBE的工具菜單中選擇參考指令然后選擇ADO類型庫(kù)。對(duì)象變量被聲明為模塊級(jí),這意味著在本例中可以應(yīng)用在所有其他程序中。如果讀取它們之后不處理這些記錄,那么它們被聲明為程序級(jí)。
創(chuàng)建ADO記錄集:
Dim conODBC As ADODB.Connection
Dim adoRS As ADODB.Recordset
Private Sub InitADO()
Dim strQuery As String
On Error GoTo ErrorHandler
strQuery = "select * from iFixNo1 "
Set conODBC = New ADODB.Connection
conODBC.Open "driver= _
& " SQL server};server=SUNOK;uid=sa;pwd=;database=iFix"
Set adoRS = New ADODB.Recordset
adoRS.Open strQuery, conODBC, adOpenDynamic, _
adLockPessimistic, adCmdText
Exit Sub
ErrorHandler:
HandleError
End Sub
(2)初始變量定義
Dim ReportArray As Variant “存放日?qǐng)?bào)中所有要顯示的參數(shù)的數(shù)組”
Dim FirstPoint1 As Variant“ 第一個(gè)變量”
Dim tempvar As Variant “中間變量”
Dim strStartTime, strEndTime “報(bào)表查詢的時(shí)間范圍”
Dim Interval As Variant “報(bào)表查詢的間隔時(shí)間”
Dim OutReportfile As Variant “輸出EXCEL表格的文件名”
Dim TemplateName As String “這個(gè)是日?qǐng)?bào)表模板的文件名”
(3)建立對(duì)EXCEL的引用,并打開(kāi)報(bào)表的模板文件:
Set msExcel = CreateObject("Excel.Application")
With msExcel
.WindowState = xlMinimized
.Visible = False
.Workbooks.Open ReportTemplateName, , False Rem“ 打開(kāi)報(bào)表的模板文件”
.ActiveWorkbook.ActiveSheet.Select
.DisplayAlerts = False
.DisplayAlerts = False
.Wait (Now() + 0.00002)
End With
(4)建立查詢數(shù)據(jù)庫(kù)后的記錄集,并把數(shù)據(jù)寫到Excel中后另存為Excel文件:
Set adoRS = New ADODB.Recordset
adoRS.CursorLocation = adUseClient
adoRS.Open SQL1, conODBC, adOpenForwardOnly, adLockReadOnly
If adoRS.BOF Then
adoRS.Close
conODBC.Close
With msExcel
DoEvents
.ActiveWorkbook.Close
.Quit
End With
Set msExcel = Nothing
Rem MsgBox “第一個(gè)表查詢條件為空,請(qǐng)檢查查詢條件”
Exit Sub
Else
c = 1
While adoRS.EOF <> True
With msExcel.Worksheets(1)
For j = 1 To 24
If adoRS(0) <> "" Then
msExcel.Worksheets(1).Cells(j, c).Value = adoRS(0)
adoRS.MoveNext
End If
Next j
End With
c = c + 1
Wend
msExcel.ActiveWorkbook.SaveAs “d:\” & OutReportfile & “.xls”
msExcel.Quit
msExcel.DisplayAlerts = True
msExcel.Visible = True
Set msExcel = Nothing
Set conODBC = Nothing
adoRS.Close
5 應(yīng)用實(shí)例
本方法已用于湖南漣鋼焦化廠自動(dòng)配煤智能控制與專家系統(tǒng)中。iFix從施耐德PLC采集的各種配合煤的累積重量、水份、配煤比等實(shí)時(shí)數(shù)據(jù)需要傳送到鐵前L3系統(tǒng)數(shù)據(jù)庫(kù)中。為便于數(shù)據(jù)的管理,在數(shù)據(jù)庫(kù)中創(chuàng)建2個(gè)生產(chǎn)數(shù)據(jù)表。累積重量的數(shù)據(jù),采用塊事件觸發(fā)傳輸方式,事件標(biāo)簽設(shè)置為新煤三號(hào)皮帶運(yùn)行,事件類型為高到低。對(duì)于水份、配煤的數(shù)據(jù),也采用時(shí)間觸發(fā)傳輸方式,但將其時(shí)間間隔設(shè)置為較長(zhǎng)。通過(guò)把iFix采集的過(guò)程數(shù)據(jù)傳輸?shù)絊QL2000關(guān)系數(shù)據(jù)庫(kù),實(shí)現(xiàn)了對(duì)運(yùn)行工況數(shù)據(jù)的掌握,從而達(dá)到有效的生產(chǎn)調(diào)度、合理配置資源、提高生產(chǎn)效益、及時(shí)發(fā)現(xiàn)和迅速排除故障的目的。
6 結(jié)束語(yǔ)
筆者采用以上方法成功實(shí)現(xiàn)了iFix過(guò)程數(shù)據(jù)庫(kù)與SQL2000關(guān)系數(shù)據(jù)庫(kù)的連接,該方法實(shí)現(xiàn)簡(jiǎn)單,只需掌握基本的SQL語(yǔ)言,大大節(jié)省了開(kāi)發(fā)時(shí)間。測(cè)試表明通過(guò)該ODBC接口能實(shí)時(shí)、準(zhǔn)確地將過(guò)程數(shù)據(jù)傳送到數(shù)據(jù)庫(kù)服務(wù)器,能滿足對(duì)現(xiàn)場(chǎng)實(shí)時(shí)數(shù)據(jù)的要求。