龔偉平(1976-)
男,湖南雙峰人,中南大學信息科學與工程學院在讀工程碩士研究生,(湖南婁底華菱漣鋼集團信息自動化中心,湖南 婁底 417009)主要研究方向為先進控制技術及工程應用、過程工業控制、智能控制與智能自動化。
摘要:本論文詳細介紹了基于ODBC技術實現iFix 組態軟件與關系數據庫通訊的原理和方法,增強了報表功能;某工程應用實例表明該方法行之有效。
關鍵詞:關鍵字 ODBC;iFix;三級機;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(全世界上第一套基于組件技術的自動化監控軟件家族)最為重要的上位監控軟件產品之一,該軟件產品無疑為全球自動化生產制造業提供了易于使用,高性能的自動化監控解決方案,平臺功能強大,集控制技術、人機界面技術、數據庫技術、網絡技術于一身,可實現數據采集、實時過程監控、報警和報警管理、報表查詢打印、趨勢分析等功能,并且可與信息自動化管理系統進行無縫連接。借助ODBC技術,將iFix采集的現場數據通過以太網傳送到L3系統的關系數據庫中,實現共享信息資源的全方位、全過程信息系統。
2 總體思路
開放式數據庫互連(ODBC)是Microsoft的標準API,用來訪問、顯示和修改多種關系數據庫數據;結構化查詢語言(SQL)是關系數據庫使用的標準語言,用來檢索、更新和管理數據,不提供公共應用程序接口(API)。ODBC技術的最大優勢是開放的互操作性,通過安裝多種ODBC驅動程序,可實現同一應用程序對不同數據庫的訪問。由于iFix和SQL2000都支持ODBC標準,可以通過ODBC接口實現SCADA節點和數據庫服務器之間的通訊。
圖1 多層ODBC驅動程序結構圖
在本應用中是通過在iFix端安裝ODBC驅動程序,把SQL2000數據庫作為數據源來實現連接的。在iFix中可通過兩種ODBC結構(多層ODBC驅動和單層ODBC驅動)來實現通訊。數據庫文件和應用可位于同一臺計算機上,也可以通過網絡位于另外計算機上。多層驅動更為普遍,通常與遠程數據庫服務器如SQL2000和Oracle等一起使用。多層驅動處理由應用引起的ODBC呼叫,傳遞實際SQL命令到數據庫系統。由于SQL2000屬于遠程服務器數據庫,所以采用的是多層ODBC驅動程序,其結構如圖1所示。
當iFix ODBC應用請求連接時,由ODBC驅動管理器裝載相應的驅動程序,ODBC驅動程序將iFix ODBC的調用轉換成對特定數據庫的調用,并與數據庫客戶端支持層通訊。網絡層將請求處理并傳送到數據庫服務器,監聽進程負責接收客戶端服務的請求,最終由數據庫引擎查詢實現數據的操作。
3 數據通訊原理
通過ODBC API提供訪問SQL數據源,iFix允許使用下列方法:iFix SQL接口選項,稱為iFix ODBC;以及在Microsoft Visual Basic for Applications通過DAO或RDO。iFix到SQL數據源的路徑如圖2所示。
圖2 iFix到SQL數據源的路徑示意圖
iFix ODBC由SQL觸發塊(SQT)、SQL數據塊(SQD)、SQL任務三部分組成,其中SQL觸發塊用于指定SQL命令的名稱,并確定數據傳輸觸發的時間或事件,SQL數據塊用于指定采集和傳送的數據以及數據傳送的方向。SQL任務除處理和ODBC驅動的通訊外,還和SQT塊、SQD塊通訊。以iFix過程數據庫到關系數據庫為例說明數據的傳輸過程:
(1)當SQL觸發塊(SQT)由時間或事件觸發時,把要執行的SQL 命令的名稱和數據源的名稱DSN 一起傳給SQL任務;
(2)SQL任務根據接收到的信息到關系數據庫的SQL庫表檢索與命令名對應的SQL命令。數據庫引擎以字符串的形式返回SQL命令;
(3)SQL任務把從SQL庫表獲得的SQL命令和SQL數據塊(SQD)中列出的數據塊中的數據結合,形成完整的命令;
(4)SQL任務用該命令對關系數據庫進行操作,由數據庫引擎把數據寫入數據表中。
4 實現方法
4.1 數據庫服務器的配置
(1)創建SQL2000數據庫與表單:數據庫名稱為iFix ;創建SQL命令表、錯誤記錄表與實時數據采集表 。創建SQL命令:在SQL Query Analyzer中使用SQL語言創建SQL庫表,用以存放將要執行的SQL命令。該庫表只能有sqlname和sqlcmd兩個字段,分別存放SQL命令的名稱和內容。創建錯誤記錄表和數據表:錯誤記錄表用于記錄所有SQL運行的錯誤消息,其字段也需根據要求設置;數據表用于存放實際傳輸的數據,可根據應用的需要創建合適的字段(需要傳輸多少個標簽數據就需要有多少個字段)。
(2)創建ODBC數據源:打開WINDOWS控制面板中管理工具的數據源(ODBC),選中系統DSN或用戶DSN項,單擊添加后選擇SQL2000驅動程序,填寫數據源DSN名稱:iFixODBC與服務器名稱:SUNOK。
(3)在SQL Server Network Utility Gerneral中允許TCP/IP協議,在其屬性中設置端口。
(4)在客戶端配置中網絡庫選用TCP/IP,注意端口設置與步驟C中一致,使服務器能響應iFix ODBC應用的請求。
4.2 SCADA節點(iFix端)的配置
在對iFix軟件進行配置前,需安裝SQL2000的網絡服務和基本客戶機軟件(ODBC驅動程序包括在其中),以支持ODBC的運行。
(1)添加SQL帳戶:在創建完ODBC數據源后,就可在系統設置SCU中添加SQL帳戶,把SQL2000數據源添加進來。此處選擇的數據庫類型為SQL2000,填寫的用戶名和密碼必須具有訪問在數據庫中創建的SQL庫表和數據表的權限,數據庫ID便是SQL2000數據源名DSN。
(2)配置SQL任務:在SCU的配置SQL任務對話框中完成。首先需啟用SQL支持,啟用后SQL任務會以WSQLODC.EXE任務的形式自動添加。然后需分別設置主、次備份文件的路徑,以便與數據庫服務器的通訊出現故障時將數據備份,等故障排除后重新發送。此外還需分別輸入數據源名、數據庫中SQL庫表和錯誤記錄表的名稱。
(3)定義SQT和SQD塊:iFix過程數據庫與SQL2000數據庫的通訊方式及傳輸內容是通過配置SQT和SQD塊具體實現的。在iFix過程數據庫管理器中添加標簽SQT與SQD。SQT塊中需添加將執行的SQL命令名(需與SQL2000數據庫中表單名稱一致)與數據庫ID,命令執行的時間事件或塊事件與事件類型,以及與該SQT塊鏈接的SQD塊。在SQD塊中需定義需要傳輸的過程數據標簽(時間日期標簽默認為TMTD)以及傳輸的方向。
4.3 報表的實現
iFix基于時間調度事件可以生成每天的Excel格式報表,但經過實踐后,發現iFix運行緩慢,其后臺服務占有相當的系統資源。如果采用API計時器也需占用大量的系統資源,造成控制系統死機。因此,建議不采用調度事件或API計時器觸發。Intellution推薦所有iFix的VBA腳本中使用ADO來處理數據庫的訪問。
(1)創建ADO對象
為了使用ActiveX數據對象來處理數據,需要參考畫面工程中的ActiveX數據對象庫。從VBE的工具菜單中選擇參考指令然后選擇ADO類型庫。對象變量被聲明為模塊級,這意味著在本例中可以應用在所有其他程序中。如果讀取它們之后不處理這些記錄,那么它們被聲明為程序級。
創建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 “存放日報中所有要顯示的參數的數組”
Dim FirstPoint1 As Variant“ 第一個變量”
Dim tempvar As Variant “中間變量”
Dim strStartTime, strEndTime “報表查詢的時間范圍”
Dim Interval As Variant “報表查詢的間隔時間”
Dim OutReportfile As Variant “輸出EXCEL表格的文件名”
Dim TemplateName As String “這個是日報表模板的文件名”
(3)建立對EXCEL的引用,并打開報表的模板文件:
Set msExcel = CreateObject("Excel.Application")
With msExcel
.WindowState = xlMinimized
.Visible = False
.Workbooks.Open ReportTemplateName, , False Rem“ 打開報表的模板文件”
.ActiveWorkbook.ActiveSheet.Select
.DisplayAlerts = False
.DisplayAlerts = False
.Wait (Now() + 0.00002)
End With
(4)建立查詢數據庫后的記錄集,并把數據寫到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 “第一個表查詢條件為空,請檢查查詢條件”
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 應用實例
本方法已用于湖南漣鋼焦化廠自動配煤智能控制與專家系統中。iFix從施耐德PLC采集的各種配合煤的累積重量、水份、配煤比等實時數據需要傳送到鐵前L3系統數據庫中。為便于數據的管理,在數據庫中創建2個生產數據表。累積重量的數據,采用塊事件觸發傳輸方式,事件標簽設置為新煤三號皮帶運行,事件類型為高到低。對于水份、配煤的數據,也采用時間觸發傳輸方式,但將其時間間隔設置為較長。通過把iFix采集的過程數據傳輸到SQL2000關系數據庫,實現了對運行工況數據的掌握,從而達到有效的生產調度、合理配置資源、提高生產效益、及時發現和迅速排除故障的目的。
6 結束語
筆者采用以上方法成功實現了iFix過程數據庫與SQL2000關系數據庫的連接,該方法實現簡單,只需掌握基本的SQL語言,大大節省了開發時間。測試表明通過該ODBC接口能實時、準確地將過程數據傳送到數據庫服務器,能滿足對現場實時數據的要求。