首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从WinCC记录集写入

从WinCC记录集写入
EN

Stack Overflow用户
提问于 2022-01-18 13:46:06
回答 1查看 1.3K关注 0票数 0

我有一个工作脚本,它读取WinCC DB并将数据写入包含两个列(1个时间标记和1个值)的CSV中。

代码语言:javascript
复制
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列。

我想将查询更改为

代码语言:javascript
复制
CommandText="Tag:R,(ProductionTags\Temperature1;ProductionTags\Temperature2;ProductionTags\Temperature3),'" & StartArchive & "','" & StopArchive & "'"

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

EN

回答 1

Stack Overflow用户

发布于 2022-02-01 12:44:29

有点长的文字,对不起,我也喜欢保持简单的查询。没必要让事情变得复杂。

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

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

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70756600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档