我有一个工作脚本,它读取WinCC DB并将数据写入包含两个列(1个时间标记和1个值)的CSV中。
path = "C:\HMI\Report\Report.csv"
'creating csv file
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(path) Then
fso.DeleteFile(path)
End If
fso.CreateTextFile(path)
Set f = fso.GetFile(path)
Const ForWriting = 2
Const TristateUseDefault = -2
Set ts = f.OpenAsTextStream(ForWriting,TristateUseDefault)
'''''''''''''''''''
'connection to SQL
Dim Pro 'Provider
Dim DSN 'Data Source Name
Dim DS 'Data Source
Dim ConnString 'Connection String
Dim MachineNameRT 'Name of the PC from WinCC-RT
Dim DSNRT 'Data Source Name from WinCC-RT
Dim Conn 'Connection to ADODB
Dim RecSet 'RecordSet
Dim Command 'Query
Dim CommandText 'Command-Text
Set MachineNameRT = HMIRuntime.Tags("@LocalMachineName")
Set DSNRT = HMIRuntime.Tags("@DatasourceNameRT")
pro="Provider=WinCCOLEDBProvider.1;"
DSN="Catalog=" & DSNRT.Read & ";"
DS="Data Source=.\WinCC" ' & MachineNameRT.Value & "\WinCC"
ConnString = Pro + DSN + DS
Set Conn = CreateObject("ADODB.Connection")
Conn.ConnectionString = ConnString
Conn.CursorLocation = 3
Conn.Open
CommandText="Tag:R,(ProductionTags\Temperature1),'" & StartArchive & "','" & StopArchive & "'"
'Create the recordset, read the records and set to first redcordset:
Set Command = CreateObject("ADODB.Command")
Command.CommandType = 1
Set Command.ActiveConnection = Conn
Command.CommandText=CommandText
Set RecSet = Command.Execute
RecSet.MoveFirst
Do While Not RecSet.EOF
ts.WriteLine (RecSet.Fields("TimeStamp").Value & ";" & RecSet.Fields("RealValue").Value) '<-that's the line in question
RecSet.MoveNext
Loop
' Close all
ts.Close
RecSet.Close
Set RecSet=Nothing
Set Command = Nothing
conn.Close
Set Conn = Nothing
Set fso = Nothing
Set f = Nothing
Set ts = Nothing 我想写1个时间标签和3个值,或3个时间标签和3个值在4或6列。
我想将查询更改为
CommandText="Tag:R,(ProductionTags\Temperature1;ProductionTags\Temperature2;ProductionTags\Temperature3),'" & StartArchive & "','" & StopArchive & "'"但我不明白如何为Writeline编写一个参数,以获取循环中的值,使其成为4或6列。
发布于 2022-02-01 12:44:29
有点长的文字,对不起,我也喜欢保持简单的查询。没必要让事情变得复杂。
首先,您正在使用的有关“WinCC连接包”的内容是:“使用WinCC / Connectivity启用对WinCC的在线和归档数据的许可访问。WinCC OLE DB提供程序使访问进程值和警报存档成为可能。在数据库中存储、压缩的数据可以作为解压缩数据读取。WinCC OLE DB提供程序还提供分析功能,例如,最小、最大存档标记。“
由于数据被压缩,返回到查询的记录集的“布局”是固定的:
Fields(0) = VarID
Fields(1) = DateTime
Fields(2) = RealValue
Fields(3) = Quality
Fields(4) = Flags因此,当使用多于1个标记执行查询时,返回的“列表”就会更长,而存档标记现在只是一个数字(VarID)。我也不知道这样做在性能上没有任何改善。此外,这也限制了vbs中记录集的大小。
似乎您想要一个带有时间戳的表作为“索引”。WinCCv7中的时间戳通常以毫秒为单位,在为表构建数据时截断该部分是个好主意,消除了基于毫秒的行中不必要的“空白”。有时,基于“时间I/o”和诸如“AR_SEND”/“OPC(远动)”/“WinCC ODK函数”的数据确实具有毫秒(nano更罕见)的分辨率。
我的建议是使用临时对象/数组来保存一个又一个执行的几个sql命令的结果,在一个无聊的“for”循环中或者类似的地方。
然后匹配时间戳(没有ms,或者创建一个很好的表),没有很多“空白”--这个表可以打印为一个csv文件,并使用写线。
示例可在您的本地帮助文件中找到:“WinCC帮助→接口、→、WinCC/Connectivity文档、使用OLE DB提供程序访问的→示例:分析WinCC项目→中的进程值归档”
在示例中,在论坛“support.industry.siemens.com”上找到的项目和下载的官方示例。
但是一个完整的例子,有一个很好的表结构,对不起,据我所知,不存在。
那些想要表格的人通常使用excel(带有插件)或其他一些专门的报告工具。(MS SQL reporting可与连接包一起使用)
//维持和平权利d
https://stackoverflow.com/questions/70756600
复制相似问题