菜鸟提问
我看了论坛那个关于EXCEL访问WINCC归档变量的PDF文档,用它提供的DEMO表格,把计算机名更改了一下,创建DEMO里的相应的内部变量,给这些变量做了变量记录。但是运行WINCC,整点没有读取到归档的数据、或者是读到的数据不是我想要的那个时间段的,下边是技术文档提供的本地采集的代码:
提供的脚本:
Subget_wincc_data()
'--GetDatabaseDSNname-----------------------------------
SetDSNName=CreateObject("CCHMIRuntime.HMIRuntime")
sDsn=DSNName.Tags("@DatasourceNameRT").Read
'--buildconnectionstring-----------------------------------
sPro="Provider=WinCCOLEDBProvider.1;"
sDsn="Catalog="&sDsn&";"
sSer="DataSource=ZHANGWinCC"
sCon=sPro&sDsn&sSer
Setconn=CreateObject("ADODB.Connection")
conn.ConnectionString=sCon
conn.CursorLocation=3
conn.Open
SetoRs=CreateObject("ADODB.Recordset")
SetoCom=CreateObject("ADODB.Command")
oCom.CommandType=1
SetoCom.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&"'orderbydatetime"
oCom.CommandText=sSql
SetoRs=oCom.Execute
If(oRs.EOF)Then
oRs.Close
Else
oRs.MoveFirst
i=0
DoWhileNotoRs.EOF
Sheet1.Cells(i+4,2)=oRs.Fields("RealValue").Value
oRs.MoveNext
i=i+1
Loop
oRs.Close
EndIf
'读取Fan1_T2
sSql="Tag:R,('ProcessValueArchiveFan1_T2'),'"&sStart&"','"&sStop&"'orderbydatetime"
oCom.CommandText=sSql
SetoRs=oCom.Execute
If(oRs.EOF)Then
oRs.Close
Else
oRs.MoveFirst
i=0
DoWhileNotoRs.EOF
Sheet1.Cells(i+4,3)=oRs.Fields("RealValue").Value
oRs.MoveNext
i=i+1
Loop
oRs.Close
EndIf
'读取Fan1_P1
sSql="Tag:R,('ProcessValueArchiveFan1_P1'),'"&sStart&"','"&sStop&"'orderbydatetime"
oCom.CommandText=sSql
SetoRs=oCom.Execute
If(oRs.EOF)Then
oRs.Close
Else
oRs.MoveFirst
i=0
DoWhileNotoRs.EOF
Sheet1.Cells(i+4,4)=oRs.Fields("RealValue").Value
oRs.MoveNext
i=i+1
Loop
oRs.Close
EndIf
'读取Fan1_P2
sSql="Tag:R,('ProcessValueArchiveFan1_P2'),'"&sStart&"','"&sStop&"'orderbydatetime"
oCom.CommandText=sSql
SetoRs=oCom.Execute
If(oRs.EOF)Then
oRs.Close
Else
oRs.MoveFirst
i=0
DoWhileNotoRs.EOF
Sheet1.Cells(i+4,5)=oRs.Fields("RealValue").Value
oRs.MoveNext
i=i+1
Loop
oRs.Close
EndIf
SetoRs=Nothing
Setconn=Nothing
EndSub
PrivateSubDTPicker1_Change()
clear_cell'**已经填充的数据
get_wincc_data'读取WinCC历史数据
EndSub
关于这个问题我做了两天的测试,发现了技术文档的代码是貌似有一点漏洞的,直接引用的查询结果不正确,会丢数据。而且顺便解决了时间控件的大小会每次重启都改变的问题,如果需要相关代码可以联系我QQ
斑竹:
WinCCOLEDB我不记得是否支持orderbydatetime了,其实不需要orderbydatetime,归档本来就是按时间顺序存储的。
主要不是排序的问题,是时间的转换出了问题,本地时间到UTC的转换应该不只是简单的减去8个点吧。
你*好看看*后的查询表达式。
我觉得中间转换挺乱的,字符串型与时间型转换可以直接转换吗?
比如:sStart=DateAdd("h",-8,CDate(sStart))
结果应该是时间,可以直接加到查询语句中吗?&sStart
菜鸟:
这个转换的问题我都测试好了,需要把时间转成字符型,然后计算UTC时间,然后再转成时间,*后再转换成SQL的时间格式,才可以查询出正确的结果,否则的话要么没有数据,要么数据不完全。会丢掉其中几个点
发现了技术文档的代码有一点漏洞的,
不同的项目不同的电脑肯定不一样了啊
可能是因为电脑的不同吧很多人根据那个技术文档都没试出来,才来找我做的