搬家第14天-172.Wincc V7.3 vbs 读取多个归档数据到MSHGrid控件

有群友在群里询问过wincc怎么把变量归档里面的数据读取出来,这个我以前也没做过,不过好在官网有教程,但教程只是介绍了读取一个变量的方法,而且教程是写入excel——不过这个不是关键。我照着教程的方法,按照自己的理解做了读取两个变量到控件中,两个以上变量的方法可以照着做就是了。

 

西门子官方教学的链接在这里

https://support.industry.siemens.com/cs/document/77940055/在wincc中如何使用vbs读取变量归档数据到excel?dti=0&lc=zh-CN#!

 

下面一步一步记录我做的方法

 

1. 准备工作

由于变量归档的数据是以压缩的形式存储在数据库中,需要通过 WinCC连通性软件包提供的OLE-DB接口才能够解压并读取这些数据。关于WinCC连通性软件包的详细信息请参考连接:37436159

 

2. 新建变量

由于没有实际的PLC,因此建立4个内部变量如下:

flow1和flow2就是用于显示在grid控件里面的变量,btime和etime表示开始时间和结束时间。

 

3. 全局脚本

由于没有实际的PLC,要模拟数据变化,我使用了vbs全局脚本,触发器1秒。

Option Explicit
Function action
Dim f1,f2
Set f1=HMIRuntime.Tags("Flow1")
Set f2=HMIRuntime.Tags("Flow2")
f1.Write Second(Now)
f2.Write Second(Now)+10
End Function

 

4. 画面控件设置

在画面上放置两个输入输出域,名字分别为BTime和ETime,用于用户设定起止时间,当然也可以使用date and time picker控件。这两个控件关联btime和etime变量,“输入输出”类型,数据格式为“日期时间”类型。放置microsoft hierarchical flexgrid 控件,名字修改为grid。放置一个按钮,用于查询。

 

5. 按钮脚本

Sub OnClick(ByVal Item)                                                                                 
Dim myCatalog,myDS,PCName,cnstr,sqlstr1,sqlstr2
Dim grid,BTime,ETime,utcbtime,utcetime,utcbtstr,utcetstr
Dim conobj,rsobj1,comobj1
Dim rsobj2,comobj2
Dim rscount,i,curRow
myCatalog=HMIRuntime.Tags("@DatasourceNameRT").Read
PCName=HMIRuntime.Tags("@LocalMachineName").Read 
myDS=PCName & "\Wincc"
Set BTime=HMIRuntime.Tags("btime")
Set ETime=HMIRuntime.Tags("etime")
'北京时间时区修正
utcbtime=Dateadd("h",-8,BTime.Read) '起始时间
utcetime=Dateadd("h",-8,ETime.Read) '结束时间
'日期时间格式修正
utcbtstr = Year(utcbtime) & "-" & Month(utcbtime) & "-" & Day(utcbtime) & " " & Hour(utcbtime) & ":" & Minute(utcbtime) & ":" & Second(utcbtime)
utcetstr = Year(utcetime) & "-" & Month(utcetime) & "-" & Day(utcetime) & " " & Hour(utcetime) & ":" & Minute(utcetime) & ":" & Second(utcetime)
'连接字符串
cnstr="Provider=WinCCOLEDBProvider.1; Catalog=" & myCatalog & "; Data Source=" &  myDS
'创建连接对象
Set conobj=CreateObject("ADODB.Connection")
conobj.connectionstring=cnstr
conobj.CursorLocation = 3
conobj.Open
'查询字符串
'sqlstr = "Tag:R,('VA\flow1';'VA\flow2'),'" & utcbtstr & "','" & utcetstr & "'," & "'order by Timestamp ASC','TimeStep=1,1'"
sqlstr1 = "Tag:R,('VA\flow1'),'" & utcbtstr & "','" & utcetstr & "'," & "'order by Timestamp ASC','TimeStep=1,1'"
sqlstr2 = "Tag:R,('VA\flow2'),'" & utcbtstr & "','" & utcetstr & "'," & "'order by Timestamp ASC','TimeStep=1,1'"


'进行查询
Set rsobj1 = CreateObject("ADODB.Recordset")
Set comobj1 = CreateObject("ADODB.Command")
comobj1.CommandType = 1
Set comobj1.ActiveConnection = conobj
comobj1.CommandText = sqlstr1
Set rsobj1 = comobj1.Execute

Set rsobj2 = CreateObject("ADODB.Recordset")
Set comobj2 = CreateObject("ADODB.Command")
comobj2.CommandType = 1
Set comobj2.ActiveConnection = conobj
comobj2.CommandText = sqlstr2
Set rsobj2 = comobj2.Execute

 

'把查询结果添入grid控件
Set grid=ScreenItems("grid")
rscount=rsobj1.RecordCount
If rscount=0 Then
 Msgbox "没有记录"
 Exit Sub
End If
rsobj1.movefirst
rsobj2.movefirst


grid.Cols=4
grid.Rows=rscount+1

grid.TextMatrix(0,1)="日期时间"
grid.TextMatrix(0,2)="flow1"
grid.TextMatrix(0,3)="flow2"


For i=1 To rscount
 curRow=i
 '需要把日期时间还原成北京时间
 grid.TextMatrix(curRow,1)=Dateadd("h",+8,rsobj1.fields(1).value)
 grid.CellWidth(1)=2500
 grid.TextMatrix(curRow,2)=rsobj1.fields(2).value
 grid.TextMatrix(curRow,3)=rsobj2.fields(2).value
 rsobj1.movenext
 rsobj2.movenext
Next
'使用完毕,释放资源
Set rsobj1 = Nothing
Set rsobj2 = Nothing
conobj.Close
Set conobj = Nothing
End Sub

 

保存运行,就可以把数据放入控件里面了。

说说几点:

1. 变量归档中记录的时间不是北京时间,而是北京时间减去8小时。

2.我把条件查询时间间隔设定为1秒了,如果需要修改这个间隔,只需要把下面语句

sqlstr1 = "Tag:R,('VA\flow1'),'" & utcbtstr & "','" & utcetstr & "'," & "'order by Timestamp ASC','TimeStep=1,1'"
中TimeStep设定第一个参数修改成别的数值,单位是秒。

3. 我没有把变量的ID、数据质量等提取出来。

4. 我看有人把

sqlstr1 = "Tag:R,('VA\flow1'),'" & utcbtstr & "','" & utcetstr & "'," & "'order by Timestamp ASC','TimeStep=1,1'"
修改成

sqlstr1 = "Tag:R,('VA\flow1;'VA\flow2'),'" & utcbtstr & "','" & utcetstr & "'," & "'order by Timestamp ASC','TimeStep=1,1'"
其他语句类似,查询后同一个时间点,我以为flow1和flow2分别对应.field(1)和.field(2),可实际运行后flow1和flow2是分别显示在两行的。所以多个变量要查询显示的话,需要多写几条查询语句,每条查询一个变量,然后放入grid合适的位置。

posted @ 2021-02-11 10:57  来自金沙江的小鱼  阅读(1941)  评论(1编辑  收藏  举报