我看了论坛那个关于EXCEL访问WINCC归档变量的PDF文档,用它提供的DEMO表格,把计算机名更改了一下,创建DEMO里的相应的内部变量,给这些变量做了变量记录。但是运行WINCC,整点没有读取到归档的数据、或者是读到的数据不是我想要的那个时间段的,下边是技术文档提供的本地采集的代码:
提供的脚本:
Sub get_wincc_data()
'--Get Database DSN name-----------------------------------
Set DSNName = CreateObject("CCHMIRuntime.HMIRuntime")
sDsn = DSNName.Tags("@DatasourceNameRT").Read
'--build connection string-----------------------------------
sPro = "Provider=WinCCOLEDBProvider.1;"
sDsn = "Catalog=" & sDsn & ";"
sSer = "Data Source=ZHANGWinCC"
sCon = sPro & sDsn & sSer
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = sCon
conn.CursorLocation = 3
conn.Open
Set oRs = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
oCom.CommandType = 1
Set oCom.ActiveConnection = conn
'查询启止时间
sStart = Year(DTPicker1.Value) & "-" & Month(DTPicker1.Value) & "-" & Day(DTPicker1.Value) & " 00:00:00"
sStop = Year(DTPicker1.Value) & "-" & Month(DTPicker1.Value) & "-" & Day(DTPicker1.Value) & " 23:00:00"
'转为UTC时间
sStart = DateAdd("h", -8, CDate(sStart))
sStop = DateAdd("h", -8, CDate(sStop))
'读取Fan1_T1
sSql = "Tag:R,('ProcessValueArchiveFan1_T1'),'" & sStart & "','" & sStop & "' order by datetime"
oCom.CommandText = sSql
Set oRs = oCom.Execute
If (oRs.EOF) Then
oRs.Close
Else
oRs.MoveFirst
i = 0
Do While Not oRs.EOF
Sheet1.Cells(i + 4, 2) = oRs.Fields("RealValue").Value
oRs.MoveNext
i = i + 1
Loop
oRs.Close
End If
'读取Fan1_T2
sSql = "Tag:R,('ProcessValueArchiveFan1_T2'),'" & sStart & "','" & sStop & "' order by datetime"
oCom.CommandText = sSql
Set oRs = oCom.Execute
If (oRs.EOF) Then
oRs.Close
Else
oRs.MoveFirst
i = 0
Do While Not oRs.EOF
Sheet1.Cells(i + 4, 3) = oRs.Fields("RealValue").Value
oRs.MoveNext
i = i + 1
Loop
oRs.Close
End If
'读取Fan1_P1
sSql = "Tag:R,('ProcessValueArchiveFan1_P1'),'" & sStart & "','" & sStop & "' order by datetime"
oCom.CommandText = sSql
Set oRs = oCom.Execute
If (oRs.EOF) Then
oRs.Close
Else
oRs.MoveFirst
i = 0
Do While Not oRs.EOF
Sheet1.Cells(i + 4, 4) = oRs.Fields("RealValue").Value
oRs.MoveNext
i = i + 1
Loop
oRs.Close
End If
'读取Fan1_P2
sSql = "Tag:R,('ProcessValueArchiveFan1_P2 '),'" & sStart & "','" & sStop & "' order by datetime"
oCom.CommandText = sSql
Set oRs = oCom.Execute
If (oRs.EOF) Then
oRs.Close
Else
oRs.MoveFirst
i = 0
Do While Not oRs.EOF
Sheet1.Cells(i + 4, 5) = oRs.Fields("RealValue").Value
oRs.MoveNext
i = i + 1
Loop
oRs.Close
End If
Set oRs = Nothing
Set conn = Nothing
End Sub
Private Sub DTPicker1_Change()
clear_cell '清除已经填充的数据
get_wincc_data '读取WinCC历史数据
End Sub
关于这个问题我做了两天的测试,发现了技术文档的代码是貌似有一点漏洞的,直接引用的查询结果不正确,会丢数据。而且顺便解决了时间控件的大小会每次重启都改变的问题,如果需要相关代码可以联系我QQ2606352062