0

我有一个工作脚本,它读取 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 

我想在 4 或 6 列中写入 1 个时间标签和 3 个值,或 3 个时间标签和 3 个值。

我想将查询更改为

CommandText="Tag:R,(ProductionTags\Temperature1;ProductionTags\Temperature2;ProductionTags\Temperature3),'" & StartArchive & "','" & StopArchive & "'"

 

但我不明白如何为 Writeline 编写参数以获取循环中的值以使其成为 4 或 6 列。

4

1 回答 1

0

有点长的文字,很抱歉,我也想保持查询简单。没必要把事情复杂化。

首先是关于您正在使用的“WinCC 连接包”:“使用 WinCC / 连接包启用对 WinCC 在线和归档数据的许可访问。WinCC OLE DB Provider 使访问过程值和报警归档成为可能。在数据库中存储、压缩的数据可以作为解压缩数据读取。WinCC OLE DB Provider 还提供分析功能,例如归档变量的最小值、最大值。”</p>

由于数据被压缩,返回的记录集对查询的“布局”是固定的:

Fields(0) = VarID
Fields(1) = DateTime
Fields(2) = RealValue
Fields(3) = Quality
Fields(4) = Flags

因此,当使用超过 1 个标签进行查询时,返回的“列表”会更长,并且您的存档标签现在只是一个数字(VarID)。据我所知,这样做也没有提高性能。此外,它限制了记录集在 vbs 中的大小。

似乎您想要一个带有时间戳作为“索引”的表。WinCCv7 中的时间戳通常以毫秒为单位,在为表构建数据时截断该部分是一个好主意,以消除基于毫秒的行中不必要的“间隙”。有时,基于“时间 i/o”和“AR_SEND”/“OPC UA(遥控)”/“WinCC ODK 函数”之类的数据,数据确实具有真正的毫秒(纳米更罕见)分辨率。

我的建议是使用临时对象/数组来保存几个 sql 命令一个接一个地执行的结果,在一个无聊的“for”循环或类似的东西中。

然后匹配时间戳(不带 ms 或带)创建一个漂亮的表,没有太多“间隙” 这个表你可以用 writeline 打印为 csv 文件

示例可在本地帮助文件中找到:“WinCC 帮助 → 接口 → WinCC/Connectivity Pack 文档 → 使用 OLE DB 提供程序进行访问的示例 → 示例:分析 WinCC 项目中的过程值归档 →”</p>

在论坛的“support.industry.siemens.com”上找到的示例项目和下载的官方示例。

但是一个完整的例子,结果很好的表结构,抱歉,据我所知不存在。

想要表格的人通常使用excel(带插件)或其他一些专门的报告工具。(MS SQL 报告服务可以与连接包一起使用)

//PerD

于 2022-02-01T12:44:29.473 回答