准备工作:
报表数据库路径:F:\报表数据库
报表存储路径:F:\报表存储
一、将 MSCAL.ocx 和 mscomct2.ocx 拷贝到 C:\WINDOWS\system32 路径下,并注册,注
册方法为:开始->运行->输入 regsvr32 mscal.ocx 确定,弹出注册成功对话框;用同样方法
注册 mscomct2.ocx。
二、将“报表数据库”和“报表存储”两个文件夹复制到 F 盘。
三、ReportViewM.xls 为报表模板,以实际报表格式为准,报表格式编辑好后另存为网
页格式 ReportViewM.htm。
四、按下生成报表按钮,画面中会以网页格式显示出对应的报表,同时,在 F:\报表存
储路径下会自动保存一个以日期命名的日报表。
1. 历史库定义
增加报表中要使用的标签至历史库,周期为 1m,如果标签特别多,建议错开相位。
2. 新建 access 数据库 report.mdb,数据表 ReportData
3.连接 ODBC 数据源,数据源名:Report
4. 新建调度,从 0:06:00 开始,间隔 1 小时
需要注意的是这里插入了两个功能函数 FIXTOOLS 和 modSet 模块,方法为:
1)将 FIXTOOLS.bas 和 modSet.bas 文件拷贝到 Ifix 安装路径的 APP 文件夹下;
2)打开 VB 编辑器,在报表工程上右击->导入文件->找到 FIXTOOLS.bas 和 modSet.bas 文件并
导入,导入之后如下:
脚本如下:
Dim tag(11) As String
Dim value(11) As String
‘报表中用到几个标签这里就要定义几个标签,本例为 11 个标签
‘报表中用到几个标签这里就要定义几个标签,本例为 11 个标签
As Single
Private Sub FixTimer3_OnTimeOut(ByVal lTimerId As Long)
Dim NumOfTags As Long
'HDA 相关(HAD 历史数据库)
Dim Values()
Dim Times() As Long
Dim Stats() As Long
Dim alarms() As Long
Dim Hg
Dim ht(8)
As Long
As Long
'ht(8) 最多写到 8,这是因为读取历史数据库标签一次最多读 8 个标签
Dim ErrNo As Long
Dim StartDate As String
Dim Ntf(8) As String
Dim NumSamples As Long
Dim i, j As Long
Dim qTime, StartTime As String
‘标签名,报表中用到几个标签这里就要写入几个标签名
tag(0) = "JD_LL_SUM"
tag(1) = "JDLL_SS"
tag(2) = "LL_SUM"
tag(3) = "CSZG_LL"
tag(4) = "BPQ_SJPL"
tag(5) = "YL_SET"
tag(6) = "CSZG_YL"
tag(7) = "DXSC_YW"
tag(8) = "XXSC_YW"
tag(9) = "B1_YGDD"
tag(10) = "B6_YGDD"
qTime = DateAdd("n", -5, Now())
StartTime = Format(qTime, "hh:mm:ss")
'添加标签点
NumOfTags = 8
Ntf(0) = "Fix:JD_LL_SUM.F_CV"
‘每次最多读 8 个标签,若有多个标签,则需要分多个组来读
'以此格式读取,中间为标签名,标签名必须前后顺序
一致
时
Ntf(1) = "Fix:JDLL_SS.F_CV"
Ntf(2) = "Fix:LL_SUM.F_CV"
Ntf(3) = "Fix:CSZG_LL.F_CV"
Ntf(4) = "Fix:BPQ_SJPL.F_CV"
Ntf(5) = "Fix:YL_SET.F_CV"
Ntf(6) = "Fix:CSZG_YL.F_CV"
Ntf(7) = "Fix:DXSC_YW.F_CV"
'建立 HDA 连接
'设定数据查询日期 起始时间 和 查询时间长度,设定查询历史数据时间间隔为 1 小
' Hg = SetHDA(StartDate, "00:01:00", "01:00:00:00", "01:00:00")
Hg = SetHDA(Date, StartTime, "00:00:05:00", "00:01:00")
'On Error GoTo errHandler
For j = 0 To (NumOfTags - 1)
ErrNo = HdaAddNtf(Hg, ht(j), Ntf(j)) '添加标签
ErrNo = HdaSetMode(Hg, ht(j), HDA_MODE_SAMPLE) '历史模式--采样数据
Next j
For i = 0 To (NumOfTags - 1)
ErrNo = HdaRead(Hg, 0) '读取历史数据库数据
ErrNo = HdaGetNumSamples(Hg, ht(i), NumSamples) '获取数据长度
ReDim Values(NumSamples)
ReDim Times(NumSamples)
ReDim Stats(NumSamples)
ReDim alarms(NumSamples)
For j = 0 To (NumSamples - 1) '初始化
Values(j) = 0
Next j
ErrNo = HdaGetData(Hg, ht(i), 0, NumSamples, Values(0), Times(0), Stats(0), alarms(0)) '
获取数据到数组
If NumSamples <> 0 Then
For j = 0 To (NumSamples - 1)
If Stats(j) = 0 Then
value(i) = Str(Format(Values(j), ".00"))
Exit For
Else
value(i) = " "
End If
Next j
End If
Next i
ErrNo = HdaDeleteGroup(Hg) '删除 HDA 链接
'添加第二组标签,读取剩余的三个标签
NumOfTags = 3
Ntf(0) = "Fix:XXSC_YW.F_CV"
Ntf(1) = "Fix:B1_YGDD.F_CV"
Ntf(2) = "Fix:B6_YGDD.F_CV"
'建立 HDA 连接
'设定数据查询日期 起始时间 和 查询时间长度,设定查询历史数据时间间隔为 1 小
时
'Hg = SetHDA(StartDate, "00:01:00", "01:00:00:00", "01:00:00")
Hg = SetHDA(Date, StartTime, "00:00:05:00", "00:01:00")
'On Error GoTo errHandler
For j = 0 To (NumOfTags - 1)
ErrNo = HdaAddNtf(Hg, ht(j), Ntf(j)) '添加标签
ErrNo = HdaSetMode(Hg, ht(j), HDA_MODE_SAMPLE) '历史模式--采样数据
Next j
For i = 0 To (NumOfTags - 1)
ErrNo = HdaRead(Hg, 0) '读取历史数据库数据
ErrNo = HdaGetNumSamples(Hg, ht(i), NumSamples) '获取数据长度
ReDim Values(NumSamples)
ReDim Times(NumSamples)
ReDim Stats(NumSamples)
ReDim alarms(NumSamples)
For j = 0 To (NumSamples - 1) '初始化
Values(j) = 0
Next j
ErrNo = HdaGetData(Hg, ht(i), 0, NumSamples, Values(0), Times(0), Stats(0), alarms(0)) '
获取数据到数组
If NumSamples <> 0 Then
For j = 0 To (NumSamples - 1)
If Stats(j) = 0 Then
value(i + 8) = Str(Format(Values(j), ".00"))
Exit For
Else
value(i + 8) = " "
End If
Next j
End If
Next i
ErrNo = HdaDeleteGroup(Hg) '删除 HDA 链接
'向 access 数据库中写数据
WriteToAccess
'errHandler:
' ErrNo = HdaDeleteGroup(Hg) '删除 HDA 链
End Sub
将历史库数据保存到 access 数据库中:
Private Sub WriteToAccess()
Dim cn As ADODB.Connection '定义一个 ADO 方式的数据库连接
Dim res As ADODB.Recordset '定义一个 ADO 方式的数据库记录集
Dim StrSQL As String
Set cn = New ADODB.Connection '定义 cn 为新的 ADO 数据库连接
Set res = New ADODB.Recordset '定义 res 为新的 ADO 数据库连接集
'On Error Resume Next
cn.ConnectionString = "DSN=Report;UID=;PWD=;" '定义 cn 的连接数据源为 ReportSource 即
ODBC 中建立的 ACCESS 的数据源名
cn.Open '打开数据库
StrSQL = "select * from ReportData" '使用 SQL 语句查找 ReportData 表中日期为 Date 的数据
res.Open StrSQL, cn, adOpenKeyset, adLockOptimistic '定义打开 SQL 定义的 ReportData 表,cn
数据库,adOpenKeySet(不允许用户看到其他用户完成的修改操作),adLockOptiimistic(当移动
记录或者执行 Update 时启动加锁,修改完成后接触加锁)
'res.MoveLast
For i = 0 To 10
res.AddNew '添加一个新的记录
res.Fields(0) = Date '在 1 列加入时间,测试中为 Minute(Time)工程中取 Hour(Time),这行为标
签值时间。
res.Fields(1) = Hour(Time)
res.Fields(2) = tag(i) '在 0 列加入日期
res.Fields(3) = value(i) '在 2 列加入标签 TAG1
res.Update '保存记录 Update(当 Edit 或 AddNew 方法完成后保存记录集)
Next i
res.Close '关闭记录集
Set res = Nothing
Set cn = Nothing
End Sub
‘本例共 11 个标签,所以 i=0 到 10 共 11 个
5. 新建画面:报表记录.grf
在画面中插入 OLE 控件 DTPicker 和 webbrowser,如下,
确定
确定
打开 VB 编辑器,工具->引用->
这里定义了 excel 相关功能需要引用插件和 ActiveX 插件,