4.4 使用 Spreadsheet 控件显示数据--单元格填充方式
下面就是用微软的 EXCEL 表格控件 Spreadsheet 进行数据的显示,在比较早之前,我也是用用户归档做的报表,不过当时做的报表,没有针对报表建立专门的归档数据,是在原变量记录归档周期 500ms 的基础上,进行数据查询然后显示的,显示的方式也是单元格填充的方式。之前的脚本有些复杂,这里进行简化一下,所以也用单元格填充的方式做出来,测试一下数据刷新的时间看看是多少。 在新版本的 OFFICE 安装之后,默认没有了 Spreadsheet 控件,此时你可以下载 OWC11 进行安装,安装后,相关的 office 控件就都能显示出来了。
Spreadsheet 控件和 DPTicker 控件的使用可能需要购买授权注册才能正常使用
控件在 HMI 画面上创建之后,根据需要可以设置一下保护、显示隐藏的参数,如果表格一直显示,可以先设置一个表格模版,然后另存为 XML 格式的表格,在表格控件属性的导入选项卡,选择 XML 格式的模版文件,点击立即导入,就能在表格文件中显示出来表格模版,脚本只负责填充数据部分即可。
剩下的内容就是脚本来实现了,显示的时候,也分两种,一是表格一直显示这,看着数据挨个单元格的进行填充刷新,另一种是把数据部分隐藏起来,待数据刷新完毕后,再进行完整显示。
先是第一种方法,控件表格打开后一直完整显示表格,点击查询按钮之后,执行填充的过程完全显示出来。 下面是完整的脚本
HMIRuntime.Trace vbCRLF & "now=" & Now '测试脚本运行时间,正常运行时可以删除
Dim sPro,sDsn,sSer,sCon,conn
Dim oRs,oCom,sSql
Dim sBTime,sETime,sTagList
Dim DT,CO_EX,m
Set CO_EX = ScreenItems("C0_EXCEL")
CO_EX.ActiveWorkbook.Worksheets("Sheet1").Select
Set DT = ScreenItems("DATA_ST") '开始日期对象
sPro = "Provider=WinCCOLEDBProvider.1;" '设置OLE DB 提供程序的名称
sDsn = "Catalog=" & HMIRuntime.Tags("@DatasourceNameRT").Read & ";" '设置WinCC 数据库的名称
sSer = "Data Source=" & HMIRuntime.Tags("@ServerName").Read &"\WinCC" '设置服务器名称
sCon = sPro + sDsn + sSer
sBTime = UTC_SQLTIME(DateValue(DT.Value) & " 00:00:00")'查询起始时间
sETime = NOW2UTC(DateADD("d",1,sBTime))'查询结束时间
sTagList = "'baobiao\出水NH3N';'baobiao\出水PH';'baobiao\出水SS';'baobiao\出水流量';'baobiao\进厂COD';'baobiao\进水NH3N';'baobiao\进水PH';"
sTagList = sTagList & "'baobiao\进水SS';'baobiao\进水流量';'COD\厌氧区氧化还原电位值';'COD\厌氧区污泥浓度';'COD\好氧区污泥浓度';'COD\好氧区溶解氧值';'COD\缺氧区氧化还原电位';" _
& "'liuliang\嚗气量';'yewei\事故池液位';'yewei\泵房水液位';'yewei\盐酸罐液位';'yewei\硫酸亚铁池液位';'yewei\碱池液位';'yewei\调节池液位';'yewei\集水池液位')"
sSql = "Tag:R,('baobiao\出水流量';"& sTagList &",'" & sBTime & "','" & sETime & "'"
' HMIRuntime.Trace vbCRLF & "sSql=" & sSql
Set conn = CreateObject("ADODB.Connection") '设置对象
conn.ConnectionString = sCon '设置数据连接的ConnectionString属性
conn.CursorLocation = 3
conn.open '打开数据库连接,也可以不设置ConnectionString,直接使用conn.open sCon方式
Set oRs = CreateObject("ADODB.Recordset") '创建记录集对象
Set oCom = CreateObject("ADODB.Command") '创建查询对象
oCom.CommandType = 1 '设置Command类型 1:按命令或存储过程调用的文本定义计算 CommandText
Set oCom.ActiveConnection = conn '设置定义连接
oCom.CommandText = sSql '设置包含提供者(provider)命令的字符串值。默认值为 ""(零长度字符串)。
Set oRs = oCom.Execute '执行SQL查询
m = oRs.RecordCount '查询的记录集的数目
HMIRuntime.Trace vbCRLF & "m=" & m
Dim x,y,i,j,tagid
tagid=0
x=2
y=1
CO_EX.ActiveSheet.range("A2:A25").NumberFormat="yyyy-MM-dd HH:mm:ss" '设置单元格格式
CO_EX.ActiveSheet.range("B2:X25").NumberFormat="0.00"
If (m > 0) Then
oRs.MoveFirst
Do While Not oRs.EOF '数据输出
If tagid <> oRs.Fields(0).Value Then
y=y+1
x=2
End If
If y=2 Then
CO_EX.ActiveSheet.Cells(x,y-1).Value = UTC2NOW(oRs.Fields(1).Value)
End If
CO_EX.ActiveSheet.Cells(x,y).Value = oRs.Fields(3).Value
x=x+1
tagid = oRs.Fields(0).Value
oRs.MoveNext
Loop
Else
Msgbox "所选日期内没有数据记录!"
End If
oRs.Close '关闭对象
conn.Close
Set oRs = Nothing '释放资源
Set oCom = Nothing
Set conn = Nothing
HMIRuntime.Trace vbCRLF & "now=" & Now '测试脚本运行时间,正常运行时可以删除
此时的数据刷新效果如下图
数据的刷新显示效果还是挺好的,但是由于每个单元格填充后,控件还要显示出来,控件的刷新时间确实较慢,一天数据 552 个,在视图中还没有完全显示出来,数据的填充过程就需要 11 秒。
下面采取另一种方法:在脚本执行时,把表格的高度设置成 70,待脚本执行完,高度再设置成 500,添加两行脚本如下:
......
Set CO_EX = ScreenItems("C0_EXCEL")
CO_EX.Height = 70 '刷新之前先隐藏数据
CO_EX.ActiveWorkbook.Worksheets("Sheet1").Select
...
...
Set conn = Nothing
CO_EX.Height = 500 '刷新完成恢复视图
HMIRuntime.Trace vbCRLF & "now=" & Now '测试脚本运行时间,正常运行时可以删除
然后再看一下效果
额,刷新速度还是挺快的,也就在 3-4 秒左右,上面设置的高度是为了查看数据填充的效果,实际使用中,你可以着这样做:在数据刷新的时候也可以把表格先隐藏,待数据刷新完成后再进行显示。效果更好一些。这就是一个很好的选择呢