龔偉平(1976-)
男,湖南雙峰人,中南大學(xué)信息科學(xué)與工程學(xué)院在讀工程碩士研究生,(湖南婁底華菱漣鋼集團(tuán)信息自動(dòng)化中心,湖南 婁底 417009)主要研究方向?yàn)橄冗M(jìn)控制技術(shù)及工程應(yīng)用、過程工業(yè)控制、智能控制與智能自動(dòng)化。
摘要:本論文詳細(xì)介紹了基于ODBC技術(shù)實(shí)現(xiàn)iFix 組態(tài)軟件與關(guān)系數(shù)據(jù)庫通訊的原理和方法,增強(qiáng)了報(bào)表功能;某工程應(yīng)用實(shí)例表明該方法行之有效。
關(guān)鍵詞:關(guān)鍵字 ODBC;iFix;三級機(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)品無疑為全球自動(dòng)化生產(chǎn)制造業(yè)提供了易于使用,高性能的自動(dòng)化監(jiān)控解決方案,平臺功能強(qiáng)大,集控制技術(shù)、人機(jī)界面技術(shù)、數(shù)據(jù)庫技術(shù)、網(wǎng)絡(luò)技術(shù)于一身,可實(shí)現(xiàn)數(shù)據(jù)采集、實(shí)時(shí)過程監(jiān)控、報(bào)警和報(bào)警管理、報(bào)表查詢打印、趨勢分析等功能,并且可與信息自動(dòng)化管理系統(tǒng)進(jìn)行無縫連接。借助ODBC技術(shù),將iFix采集的現(xiàn)場數(shù)據(jù)通過以太網(wǎng)傳送到L3系統(tǒng)的關(guān)系數(shù)據(jù)庫中,實(shí)現(xiàn)共享信息資源的全方位、全過程信息系統(tǒng)。
2 總體思路
開放式數(shù)據(jù)庫互連(ODBC)是Microsoft的標(biāo)準(zhǔn)API,用來訪問、顯示和修改多種關(guān)系數(shù)據(jù)庫數(shù)據(jù);結(jié)構(gòu)化查詢語言(SQL)是關(guān)系數(shù)據(jù)庫使用的標(biāo)準(zhǔn)語言,用來檢索、更新和管理數(shù)據(jù),不提供公共應(yīng)用程序接口(API)。ODBC技術(shù)的最大優(yōu)勢是開放的互操作性,通過安裝多種ODBC驅(qū)動(dòng)程序,可實(shí)現(xiàn)同一應(yīng)用程序?qū)Σ煌瑪?shù)據(jù)庫的訪問。由于iFix和SQL2000都支持ODBC標(biāo)準(zhǔn),可以通過ODBC接口實(shí)現(xiàn)SCADA節(jié)點(diǎn)和數(shù)據(jù)庫服務(wù)器之間的通訊。
圖1 多層ODBC驅(qū)動(dòng)程序結(jié)構(gòu)圖
在本應(yīng)用中是通過在iFix端安裝ODBC驅(qū)動(dòng)程序,把SQL2000數(shù)據(jù)庫作為數(shù)據(jù)源來實(shí)現(xiàn)連接的。在iFix中可通過兩種ODBC結(jié)構(gòu)(多層ODBC驅(qū)動(dòng)和單層ODBC驅(qū)動(dòng))來實(shí)現(xiàn)通訊。數(shù)據(jù)庫文件和應(yīng)用可位于同一臺計(jì)算機(jī)上,也可以通過網(wǎng)絡(luò)位于另外計(jì)算機(jī)上。多層驅(qū)動(dòng)更為普遍,通常與遠(yuǎn)程數(shù)據(jù)庫服務(wù)器如SQL2000和Oracle等一起使用。多層驅(qū)動(dòng)處理由應(yīng)用引起的ODBC呼叫,傳遞實(shí)際SQL命令到數(shù)據(jù)庫系統(tǒng)。由于SQL2000屬于遠(yuǎn)程服務(wù)器數(shù)據(jù)庫,所以采用的是多層ODBC驅(qū)動(dòng)程序,其結(jié)構(gòu)如圖1所示。
當(dāng)iFix ODBC應(yīng)用請求連接時(shí),由ODBC驅(qū)動(dòng)管理器裝載相應(yīng)的驅(qū)動(dòng)程序,ODBC驅(qū)動(dòng)程序?qū)Fix ODBC的調(diào)用轉(zhuǎn)換成對特定數(shù)據(jù)庫的調(diào)用,并與數(shù)據(jù)庫客戶端支持層通訊。網(wǎng)絡(luò)層將請求處理并傳送到數(shù)據(jù)庫服務(wù)器,監(jiān)聽進(jìn)程負(fù)責(zé)接收客戶端服務(wù)的請求,最終由數(shù)據(jù)庫引擎查詢實(shí)現(xiàn)數(shù)據(jù)的操作。
3 數(shù)據(jù)通訊原理
通過ODBC API提供訪問SQL數(shù)據(jù)源,iFix允許使用下列方法:iFix SQL接口選項(xiàng),稱為iFix ODBC;以及在Microsoft Visual Basic for Applications通過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過程數(shù)據(jù)庫到關(guān)系數(shù)據(jù)庫為例說明數(shù)據(jù)的傳輸過程:
(1)當(dāng)SQL觸發(fā)塊(SQT)由時(shí)間或事件觸發(fā)時(shí),把要執(zhí)行的SQL 命令的名稱和數(shù)據(jù)源的名稱DSN 一起傳給SQL任務(wù);
(2)SQL任務(wù)根據(jù)接收到的信息到關(guān)系數(shù)據(jù)庫的SQL庫表檢索與命令名對應(yīng)的SQL命令。數(shù)據(jù)庫引擎以字符串的形式返回SQL命令;
(3)SQL任務(wù)把從SQL庫表獲得的SQL命令和SQL數(shù)據(jù)塊(SQD)中列出的數(shù)據(jù)塊中的數(shù)據(jù)結(jié)合,形成完整的命令;
(4)SQL任務(wù)用該命令對關(guān)系數(shù)據(jù)庫進(jìn)行操作,由數(shù)據(jù)庫引擎把數(shù)據(jù)寫入數(shù)據(jù)表中。
4 實(shí)現(xiàn)方法
4.1 數(shù)據(jù)庫服務(wù)器的配置
(1)創(chuàng)建SQL2000數(shù)據(jù)庫與表單:數(shù)據(jù)庫名稱為iFix ;創(chuàng)建SQL命令表、錯(cuò)誤記錄表與實(shí)時(shí)數(shù)據(jù)采集表 。創(chuàng)建SQL命令:在SQL Query Analyzer中使用SQL語言創(chuàng)建SQL庫表,用以存放將要執(zhí)行的SQL命令。該庫表只能有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ù)源:打開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ò)庫選用TCP/IP,注意端口設(shè)置與步驟C中一致,使服務(wù)器能響應(yīng)iFix ODBC應(yīng)用的請求。
4.2 SCADA節(jié)點(diǎn)(iFix端)的配置
在對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)來。此處選擇的數(shù)據(jù)庫類型為SQL2000,填寫的用戶名和密碼必須具有訪問在數(shù)據(jù)庫中創(chuàng)建的SQL庫表和數(shù)據(jù)表的權(quán)限,數(shù)據(jù)庫ID便是SQL2000數(shù)據(jù)源名DSN。
(2)配置SQL任務(wù):在SCU的配置SQL任務(wù)對話框中完成。首先需啟用SQL支持,啟用后SQL任務(wù)會以WSQLODC.EXE任務(wù)的形式自動(dòng)添加。然后需分別設(shè)置主、次備份文件的路徑,以便與數(shù)據(jù)庫服務(wù)器的通訊出現(xiàn)故障時(shí)將數(shù)據(jù)備份,等故障排除后重新發(fā)送。此外還需分別輸入數(shù)據(jù)源名、數(shù)據(jù)庫中SQL庫表和錯(cuò)誤記錄表的名稱。
(3)定義SQT和SQD塊:iFix過程數(shù)據(jù)庫與SQL2000數(shù)據(jù)庫的通訊方式及傳輸內(nèi)容是通過配置SQT和SQD塊具體實(shí)現(xiàn)的。在iFix過程數(shù)據(jù)庫管理器中添加標(biāo)簽SQT與SQD。SQT塊中需添加將執(zhí)行的SQL命令名(需與SQL2000數(shù)據(jù)庫中表單名稱一致)與數(shù)據(jù)庫ID,命令執(zhí)行的時(shí)間事件或塊事件與事件類型,以及與該SQT塊鏈接的SQD塊。在SQD塊中需定義需要傳輸?shù)倪^程數(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)過實(shí)踐后,發(fā)現(xiàn)iFix運(yùn)行緩慢,其后臺服務(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來處理數(shù)據(jù)庫的訪問。
(1)創(chuàng)建ADO對象
為了使用ActiveX數(shù)據(jù)對象來處理數(shù)據(jù),需要參考畫面工程中的ActiveX數(shù)據(jù)對象庫。從VBE的工具菜單中選擇參考指令然后選擇ADO類型庫。對象變量被聲明為模塊級,這意味著在本例中可以應(yīng)用在所有其他程序中。如果讀取它們之后不處理這些記錄,那么它們被聲明為程序級。
創(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 “存放日報(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è)是日報(bào)表模板的文件名”
(3)建立對EXCEL的引用,并打開報(bào)表的模板文件:
Set msExcel = CreateObject("Excel.Application")
With msExcel
.WindowState = xlMinimized
.Visible = False
.Workbooks.Open ReportTemplateName, , False Rem“ 打開報(bào)表的模板文件”
.ActiveWorkbook.ActiveSheet.Select
.DisplayAlerts = False
.DisplayAlerts = False
.Wait (Now() + 0.00002)
End With
(4)建立查詢數(shù)據(jù)庫后的記錄集,并把數(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è)表查詢條件為空,請檢查查詢條件”
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ù)庫中。為便于數(shù)據(jù)的管理,在數(shù)據(jù)庫中創(chuàng)建2個(gè)生產(chǎn)數(shù)據(jù)表。累積重量的數(shù)據(jù),采用塊事件觸發(fā)傳輸方式,事件標(biāo)簽設(shè)置為新煤三號皮帶運(yùn)行,事件類型為高到低。對于水份、配煤的數(shù)據(jù),也采用時(shí)間觸發(fā)傳輸方式,但將其時(shí)間間隔設(shè)置為較長。通過把iFix采集的過程數(shù)據(jù)傳輸?shù)絊QL2000關(guān)系數(shù)據(jù)庫,實(shí)現(xiàn)了對運(yùn)行工況數(shù)據(jù)的掌握,從而達(dá)到有效的生產(chǎn)調(diào)度、合理配置資源、提高生產(chǎn)效益、及時(shí)發(fā)現(xiàn)和迅速排除故障的目的。
6 結(jié)束語
筆者采用以上方法成功實(shí)現(xiàn)了iFix過程數(shù)據(jù)庫與SQL2000關(guān)系數(shù)據(jù)庫的連接,該方法實(shí)現(xiàn)簡單,只需掌握基本的SQL語言,大大節(jié)省了開發(fā)時(shí)間。測試表明通過該ODBC接口能實(shí)時(shí)、準(zhǔn)確地將過程數(shù)據(jù)傳送到數(shù)據(jù)庫服務(wù)器,能滿足對現(xiàn)場實(shí)時(shí)數(shù)據(jù)的要求。