IFix3.5报警历史的设置与查询
在实际工程中需要对开关量变位,模拟量越限等数据变化存入到历史数据库中,在此称之为报警历史库,然后再通过编写程序查询报警历史。
如何实现报警存入报警历史库呢?本章以ACCESS作为报警历史库,来说明报警历史库的实现过程,并给出实际的报警历史查询代码。
第一节报警历史的设置
第一步:
创建一个ACCESS类型的数据库,命名为hisdata,路径为:D:\Dynamics\SampleSystem\HistoricalData。
第二步:在ODBC中创建DSN,命名为hisdata。
创建过程如下:
1:双击ODBC,出现如图1.1所示对话框。
2:点击添加后,出现如图1.2所示对话框。
3:选择Driver do Microsoft Access (*.mdb)项,点击完成,出现如图1.3所示对话框。
4:输入数据源名hisdata,输入说明“IFIX报警历史库”,然后点击选择,出现如图1.4所示对话框。
图1.4
5:找到开始创建的Access数据库,点击确定。出现如图1.5所示的对话框。
6:点击确定完成ODBC配置。
第三步,打开ifix3.5的系统配置
在系统配置中选择配置下面的报警,显示如图1.6所示对话框。
图1.6
第四步:选择Alarm ODBC Service,并启用,点击修改后显示图1.7对话框。
第五步:选择报警ODBC服务配置下的配置按钮,显示图1.8对话框。
4
第六步点击数据库类型右边的浏览按钮,出现图1.9所示对话框。
图1.9
选择Access点击确定。
第七步点击图1.8中数据库标识符右边的浏览按钮出现图1.10所示的对话框。
5
选择hisdata点击确定。
第八步点击图1.8中的现在创建表,会弹出创建成功的对话框。点击确定返回图1.7所示的对话框,点击确定,返回图1.6所示的对话框,点击确定,然后点击文件中的保存,保存系统配置。
至此iFix3.5报警历史库的配置完成。
第二节报警历史的查询
启动iFix3.5演示系统。
按CTRl+W进入编辑模式。新建画面如图2.1所示,命名为“iFix1_Alarm_history_query.grf“,画面上有1个MSHFlexGrid控件(Grid1),1个ComboBox控件(alarmArea),4个DTPicker控件(StartDTPicker,StartTTPicker,EndDTPicker,EndTTPicker),4个Text控件,1个CommandButton控件(cmdOK)。MSHFlexGrid控件用来显示查询结果,ComboBox控件用来选择报警区域,DTPicker控件用来选择起始和结束时间,CommandButton控件用来启动查询。
6
图2.1
需要注意的是采用ADO查询,需要在引用中添加ADO库,如图2.2所示。
7
代码及说明如下:
Dim rdate, rdate1, tag, tt, dt
Dim StartTime, EndTime As String
Private Sub CFixPicture_Initialize()
With alarmArea
.AddItem "BATCH_PRODUCTION"
.AddItem "Discrete_Mfg"
.AddItem "Pharm_Process"
.AddItem "Waste_Water"
.AddItem "ALL"
.Text = "ALL"
End With
rdate = Date
rdate = Format(rdate, "yyyy-mm-dd")
rdate = rdate & " 00:00:00"
StartDTPicker = rdate
StartDTPicker1 = rdate
rdate1 = Date
rdate1 = Format(rdate1, "yyyy-mm-dd")
tt = Time
tt = Format(tt, "hh:mm:ss")
rdate1 = rdate1 & " " & tt
EndDTPicker = rdate1
EndTTPicker = Time
EndDTPicker1 = rdate1
EndTTPicker1 = Time
StartTime = rdate
EndTime = rdate1
End Sub
CFixPicture_Initialize为初始化画面时的事件,在这里对alarmArea进行初始化,添加需要的报警区域;对起始时间进行设置,起始时间设置为当前日期的零点,结束日期设置为当前日期时间。
Private Sub cmdOK_Click()
Dim strQueryAvg, strQueryAvg1, strQueryAvg2, strQueryAvg3 As String
Dim str As String
Dim Querytime As String
str = ""
8
If alarmArea.Text <> "ALL" Then
str = alarmArea.Text
End If
strQueryAvg = "SELECT FIXALARMS.ALM_DATEIN,FIXALARMS.ALM_TIMEIN,FIXALARMS.ALM_DATELAS
T,FIXALARMS.ALM_TIMELAST,FIXALARMS.ALM_TAGNAME,FIXALARMS.ALM_D
ESCR, FIXALARMS.ALM_VALUE,FIXALARMS.ALM_ALMAREA, FIXALARMS.ALM_OPFULLNAME, FIXALARMS.ALM_OPNODE FROM FIXALARMS"
strQueryAvg1 = " WHERE (FIXALARMS.ALM_ALMAREA LIKE '%" & str & "%')"
strQueryAvg2 = " AND (FIXALARMS.ALM_NATIVETIMELAST BETWEEN {ts '" &
StartTime & "'} AND {ts '" & EndTime & "'})"
strQueryAvg3 = " ORDER BY FIXALARMS.ALM_NATIVETIMELAST DESC"
strQueryAvg = strQueryAvg & strQueryAvg1 & strQueryAvg2 & strQueryAvg3
Dim i, j As Integer
Dim cnADO As New ADODB.Connection
Dim rsADO As Recordset
Set cnADO = New ADODB.Connection
cnADO.ConnectionString = "DSN = hisdata; UID = sa; PWD = ;"
cnADO.Open "hisdata", "sa", ""
Set rsADO = New ADODB.Recordset
rsADO.CursorLocation = adUseClient
rsADO.Open strQueryAvg, cnADO, adOpenDynamic, adLockUnspecified, -1
If rsADO.RecordCount > 5000 Then
MsgBox "查询结果超过5000条,请缩小查询时间范围"
Exit Sub
End If
Set Grid1.DataSource = rsADO
Set cnADO = Nothing
With Grid1
.TextMatrix(0, 1) = "开始日期"
.TextMatrix(0, 2) = "开始时间"
.TextMatrix(0, 3) = "结束日期"
.TextMatrix(0, 4) = "结束时间"
.TextMatrix(0, 5) = "TAGNAME"
.TextMatrix(0, 6) = "描述"
.TextMatrix(0, 7) = "值"
.TextMatrix(0, 8) = "报警区域"
9
.TextMatrix(0, 9) = "登录用户"
.TextMatrix(0, 10) = "操作节点"
.ColWidth(0) = 500
.ColWidth(1) = 1000
.ColWidth(2) = 1250
.ColWidth(3) = 1000
.ColWidth(4) = 1250
.ColWidth(5) = 2250
.ColWidth(6) = 2000
.ColWidth(7) = 1500
.ColWidth(8) = 1500
.ColWidth(9) = 1500
.ColWidth(10) = 1200
.ColWidth(11) = 1200
End With
For i = 1 To Grid1.Rows - 1
Grid1.TextMatrix(i, 0) = i
Next
End Sub
cmdOK_Click启动查询,并将查询的结果显示在Grid1上。在这里注意的是SQL语句,主要用到了SELECT,WHERE,LIKE,BETWEEN,AND,ORDER BY等SQL查询语句。
实现了起始时间到结束时间内,规定报警区域的报警历史查询。
Private Sub EndDTPicker_Change()
dt = EndDTPicker
dt = Format(dt, "yyyy-mm-dd")
tt = EndTTPicker.Hour & ":" & EndTTPicker.minute & ":" & EndTTPicker.second
tt = Format(tt, "hh:mm:ss")
EndTime = dt & " " & tt
End Sub
Private Sub EndTTPicker_Change()
dt = EndDTPicker
dt = Format(dt, "yyyy-mm-dd")
tt = EndTTPicker.Hour & ":" & EndTTPicker.minute & ":" & EndTTPicker.second
tt = Format(tt, "hh:mm:ss")
EndTime = dt & " " & tt
End Sub
10
Private Sub StartDTPicker_Change()
dt = StartDTPicker
dt = Format(dt, "yyyy-mm-dd")
tt = StartTTPicker.Hour & ":" & StartTTPicker.minute & ":" & StartTTPicker.second
tt = Format(tt, "hh:mm:ss")
StartTime = dt & " " & tt
End Sub
Private Sub StartTTPicker_Change()
dt = StartDTPicker
dt = Format(dt, "yyyy-mm-dd")
tt = StartTTPicker.Hour & ":" & StartTTPicker.minute & ":" & StartTTPicker.second
tt = Format(tt, "hh:mm:ss")
StartTime = dt & " " & tt
End Sub
后面四段为起始时间和结束时间的设置。
第三节如何加快查询的效率
一:设置主键。
二:SQL查询限制最大查询数目。
第四节如何在SQL SERVER中查询
与采用ACCESS数据库的方法一样,在SQL SERVER中建立数据库后,首先通过ODBC建立DSN,然后一样的步骤进行报警设置,在第六步中选择SQL Server即可。
11