从SCADA系统导出数据

时间:2017-11-10 20:43:51

标签: csv vbscript recordset scada wincc

我正在尝试创建VBscript以从SCADA系统(WinCC RT Professional)导出过程数据,以定期归档所有过程变量。数据存储在SQL表中,可以通过连接包访问。我设法在导出一个标签(过程变量)时使脚本工作,但我想循环系统中的所有标签(大约60个),将它们收集在另一个记录集中,然后来自该记录集的所有数据保存在一个csv-文件。我创建了RecSet来收集一个标签的所有变量(字段)(时间,过程变量等),我只需要来自字段4的值(所有标签的相同字段)。然后我想在另一个记录集中复制这个字段--RecSetColl从所有标签收集所有必需的数据(字段4),最后将它们保存在CSV文件中。非常感谢您的帮助。

Sub DataExport()

Dim fso         'FileSystemObject
Dim f           'File
Dim ts          'TextStream
Dim path        'Path
Dim ArchiveDate 'Archive date

'Name of CSV-file
ArchiveDate = ArchiveDate & Now
ArchiveDate = Replace(ArchiveDate,"/","")
ArchiveDate = Replace(ArchiveDate," ","")
ArchiveDate = Replace(ArchiveDate,":","")
ArchiveDate = "MDF_" & ArchiveDate

'Path to the csv-file
path = "D:\Historical_data\" & ArchiveDate & ".csv"

'Create Filesystemobject and CSV-file if not exists:
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(path) Then
    fso.CreateTextFile(path)
Else
    MsgBox "File already exists!"
    Exit Sub
End If 

'Create object and open it for writing
Set f = fso.GetFile(path)
Set ts = f.OpenAsTextStream(2,-2)

ts.WriteLine("Tag-Name;ValueID;Date/Time;Process-Value")    'Header

'Generate String for the CSV-Filename
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 WinnCC-RT

Dim Conn        'Connection to ADODB
Dim RecSet      'RecordSet
Dim RecSetColl  'RecordSet storing data to be saved to the CSV-file
Dim Command     'Query 
Dim CommandText 'Command-Text
Dim i

'Read the name of the PC-Station and the DSN-Name from WinCC-RT
Set MachineNameRT = HMIRuntime.Tags("@LocalMachineName")
Set DSNRT = HMIRuntime.Tags("@DatasourceNameRT")

'Preparing the Connection-String
Pro = "Provider=WinCCOLEDBProvider.1;"  'First instance of WinCCOLEDB
DSN = "Catalog=" & DSNRT.Read & ";"     'Name of Runtime-Database
DS = "Data Source=" & MachineNameRT.Read & "\WinCC" 'Data Source

'Build the complete String:
ConnString = Pro + DSN + DS

'Make Connection
Set Conn = CreateObject("ADODB.Connection")
Conn.ConnectionString = ConnString
Conn.CursorLocation = 3
Conn.open

Set RecSetColl = CreateObject("ADODB.Recordset")

With RecSetColl.Fields
    .Append "Time1", adChar
    .Append "AHU_RUN", adChar
    .Append "Time2", adChar
    .Append "TT01", adChar
    .Append "TT02", adChar
End With


For i = 0 To 4  

    Set RecSet = CreateObject("ADODB.Recordset")                
    Set Command = CreateObject("ADODB.Command")

    Command.CommandType = 1

    Set Command.ActiveConnection = Conn

    'Building the complete string
    CommandText = "Tag:R," & i & ",'0000-00-00 12:00:00.000','0000-00-00 00:00:00.000'"

    Command.CommandText = CommandText

    Set RecSet = Command.Execute

    RecSet.MoveFirst

    RecSetColl.Fields(i) = RecSet.Fields(4) 'RecSet.Fields(4) stores a proces value

    RecSet.Close
    Set RecSet = Nothing
    Set Command = Nothing
Next

'Writing recordsets to CSV-file
Do While Not RecSetColl.EOF
    ts.WriteLine (RecSetColl.Fields(0).Value & ";" & RecSetColl.Fields(1).Value & ";" & RecSetColl.Fields(2).Value & ";" & RecSetColl.Fields(3).Value & ";" & RecSetColl.Fields(4).Value & ";" & RecSetColl.Fields(5).Value)
    RecSetColl.MoveNext 
Loop

RecSetColl.Close
Set RecSetColl = Nothing
Conn.close
Set Conn = Nothing

ts.Close
Set fso = Nothing
Set f = Nothing
Set ts = Nothing

End Sub

1 个答案:

答案 0 :(得分:0)

我真的不知道什么不起作用,而是猜测;

您的项目中是否存在ValueID = 0,(" i"在" 0到4"中)?

在表格"存档"你会发现有效的ValueIDs,以" 1"开头。在我的所有项目中。在SQL Management Studio中很容易看到,有时可能存在0。

要获取导出的所有值,请查询"存档"首先使用表格,然后使用返回的任何ValueID来循环请求数据。

// PERD