文章目录

WinCC趋势曲线的数据导出脚本

发布于 2026-03-28 15:46:53 · 浏览 12 次 · 评论 0 条

WinCC趋势曲线的数据导出脚本

WinCC(Windows Control Center)是西门子推出的工业组态软件,广泛应用于过程控制和监控系统。趋势曲线(Trend Control)是WinCC中用于实时显示和历史记录过程变量的核心功能。在实际项目中,工程师经常需要将趋势曲线中的历史数据导出进行分析、备份或与其他系统集成。本文将详细介绍在WinCC中导出趋势曲线数据的多种方法,并提供可直接使用的脚本代码。


一、准备工作

在开始导出数据之前,需要确认以下环境条件和权限:

1.1 确认WinCC版本

打开 WinCC项目管理器,在顶部菜单栏 点击 帮助关于 WinCC,记录显示的版本号。不同版本的趋势控件和数据存储方式可能存在差异,本文内容主要适用于WinCC V7.4及以上版本。

1.2 检查归档变量配置

打开 WinCC资源管理器,展开 归档变量 项目夹。确认需要导出数据的变量已经配置了归档,并且归档模式(周期性或变化触发)已正确设置。如果变量未启用归档,趋势曲线将无法显示历史数据,导出功能也无从谈起。

1.3 确认访问权限

导出数据通常需要以下权限:

  • 操作系统管理员权限或WinCC用户组权限
  • WinCC变量访问权限
  • 如果使用了SQL Server归档数据库,需要数据库读取权限

打开 WinCC项目管理器,点击 用户管理器检查`当前用户是否具备上述权限。如有需要,联系**系统管理员添加相应权限。


二、使用WinCC内置导出功能

WinCC提供了基础的数据导出功能,适合少量数据的快速导出需求。

2.1 通过趋势控件导出

  1. 打开 包含趋势曲线的画面
  2. 双击 趋势控件,进入属性设置界面
  3. 切换到 趋势 选项卡
  4. 选择 需要导出数据的趋势曲线
  5. 点击 导出 按钮(工具栏中最右侧的图标)
  6. 弹出的导出对话框中,设置 导出时间范围
  7. 选择 导出格式(CSV或Excel)
  8. 点击 确定选择 保存路径

导出的CSV文件包含时间戳和数值两列数据,可以直接用Excel打开进行进一步处理。

2.2 导出功能局限性

内置导出功能存在以下限制:

  • 每次只能导出单条趋势曲线的数据
  • 无法批量导出多个变量
  • 时间范围选择不够灵活
  • 不支持自动化定时导出

当需要批量导出或实现自动化时,需要使用脚本方式。


三、使用VBScript脚本导出数据

VBScript是WinCC内置的脚本语言,可以直接访问WinCC的归档数据库,实现灵活的数据导出。

3.1 连接到归档数据库

WinCC使用SQL Server存储归档数据。使用 以下脚本建立数据库连接:

Dim objConnection
Dim objCommand
Dim strConnectionString

' 创建ADODB连接对象
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")

' 配置连接字符串(根据实际服务器名称修改)
strConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;" & _
                      "Initial Catalog=WinCCArchiveDB;" & _
                      "Data Source=WINCC_SERVER"

' 打开数据库连接
objConnection.Open strConnectionString
Set objCommand.ActiveConnection = objConnection

其中 WINCC_SERVER 需要替换为实际的SQL Server服务器名称。如果SQL Server使用实例名,格式为 服务器名\实例名

3.2 查询归档数据

使用 以下脚本查询指定时间范围内的归档数据:

Dim strQuery
Dim objRecordset
Dim strStartTime
Dim strEndTime
Dim strTagName

' 设置查询参数
strTagName = "TagName_001"  ' 替换为实际变量名
strStartTime = "2024-01-01 00:00:00"
strEndTime = "2024-01-31 23:59:59"

' 构建SQL查询语句
strQuery = "SELECT DateAndTime, Value " & _
           "FROM Runtime.." & strTagName & " " & _
           "WHERE DateAndTime BETWEEN '" & strStartTime & "' AND '" & strEndTime & "' " & _
           "ORDER BY DateAndTime"

' 执行查询
Set objRecordset = objCommand.Execute(strQuery)

注意:变量名在数据库中通常以特定前缀存储,实际查询时需要确认数据库中该变量的表名。可以在SQL Server Management Studio中查看WinCC归档数据库的结构。

3.3 完整导出脚本

以下是一个完整的VBScript脚本,可以将指定变量的历史数据导出为CSV文件:

Sub ExportTrendData()
    Dim objConnection
    Dim objCommand
    Dim objRecordset
    Dim strConnectionString
    Dim strQuery
    Dim strFilePath
    Dim strLine
    Dim objFSO
    Dim objFile
    Dim strTagName
    Dim strStartTime
    Dim strEndTime

    ' ============== 配置参数 ==============
    strTagName = "Motor_Speed"          ' 要导出的变量名
    strStartTime = "2024-01-01 00:00:00"
    strEndTime = "2024-01-31 23:59:59"
    strFilePath = "C:\WinCC_Export\TrendData_" & strTagName & ".csv"

    ' 创建文件系统对象
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    ' 确保输出目录存在
    If Not objFSO.FolderExists("C:\WinCC_Export") Then
        objFSO.CreateFolder "C:\WinCC_Export"
    End If

    ' 创建输出文件
    Set objFile = objFSO.CreateTextFile(strFilePath, True)

    ' 写入CSV表头
    objFile.WriteLine "TimeStamp,Value"

    ' 创建数据库连接
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand = CreateObject("ADODB.Command")

    strConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;" & _
                          "Initial Catalog=WinCCArchiveDB;" & _
                          "Data Source=.\WINCC"

    On Error Resume Next
    objConnection.Open strConnectionString

    If Err.Number <> 0 Then
        MsgBox "数据库连接失败: " & Err.Description
        Exit Sub
    End If
    On Error GoTo 0

    Set objCommand.ActiveConnection = objConnection

    ' 查询归档数据
    strQuery = "SELECT DateAndTime, Value " & _
               "FROM Runtime.." & strTagName & " " & _
               "WHERE DateAndTime BETWEEN '" & strStartTime & "' AND '" & strEndTime & "' " & _
               "ORDER BY DateAndTime"

    Set objRecordset = objCommand.Execute(strQuery)

    ' 写入数据行
    Do While Not objRecordset.EOF
        strLine = FormatDateTime(objRecordset("DateAndTime"), 0) & "," & _
                  objRecordset("Value").Value
        objFile.WriteLine strLine
        objRecordset.MoveNext
    Loop

    ' 清理资源
    objRecordset.Close
    objConnection.Close
    objFile.Close

    Set objRecordset = Nothing
    Set objCommand = Nothing
    Set objConnection = Nothing
    Set objFile = Nothing
    Set objFSO = Nothing

    MsgBox "数据导出完成!" & vbCrLf & "文件位置: " & strFilePath
End Sub

以上脚本保存为 ExportTrendData.vbs,可以在WinCC的全局脚本编辑器中运行,也可以通过外部任务调度器定时执行。

3.4 批量导出多个变量

如果需要一次性导出多个变量的数据,使用 以下改进脚本:

Sub BatchExportTrendData()
    Dim objFSO
    Dim objFile
    Dim objConnection
    Dim objCommand
    Dim objRecordset
    Dim strConnectionString
    Dim strQuery
    Dim strFilePath
    Dim strLine
    Dim strTagName
    Dim strStartTime
    Dim strEndTime
    Dim strExportFolder
    Dim arrTags(3)
    Dim i

    ' 配置参数
    strExportFolder = "C:\WinCC_Export\"
    strStartTime = "2024-01-01 00:00:00"
    strEndTime = "2024-01-31 23:59:59"

    ' 定义要导出的变量列表
    arrTags(0) = "Motor_Speed"
    arrTags(1) = "Tank_Level"
    arrTags(2) = "Temperature_01"
    arrTags(3) = "Pressure_Value"

    ' 创建输出目录
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    If Not objFSO.FolderExists(strExportFolder) Then
        objFSO.CreateFolder strExportFolder
    End If

    ' 建立数据库连接
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand = CreateObject("ADODB.Command")
    strConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;" & _
                          "Initial Catalog=WinCCArchiveDB;" & _
                          "Data Source=.\WINCC"
    objConnection.Open strConnectionString
    Set objCommand.ActiveConnection = objConnection

    ' 遍历每个变量
    For i = 0 To UBound(arrTags)
        strTagName = arrTags(i)
        strFilePath = strExportFolder & "TrendData_" & strTagName & ".csv"

        Set objFile = objFSO.CreateTextFile(strFilePath, True)
        objFile.WriteLine "TimeStamp,Value"

        strQuery = "SELECT DateAndTime, Value " & _
                   "FROM Runtime.." & strTagName & " " & _
                   "WHERE DateAndTime BETWEEN '" & strStartTime & "' AND '" & strEndTime & "' " & _
                   "ORDER BY DateAndTime"

        Set objRecordset = objCommand.Execute(strQuery)

        Do While Not objRecordset.EOF
            strLine = FormatDateTime(objRecordset("DateAndTime"), 0) & "," & _
                      objRecordset("Value").Value
            objFile.WriteLine strLine
            objRecordset.MoveNext
        Loop

        objFile.Close
        Set objFile = Nothing
    Next

    ' 释放资源
    objConnection.Close
    Set objRecordset = Nothing
    Set objCommand = Nothing
    Set objConnection = Nothing
    Set objFSO = Nothing

    MsgBox "批量导出完成!共导出 " & (UBound(arrTags) + 1) & " 个变量的数据。"
End Sub

该脚本通过数组定义变量列表,可以根据实际需求修改 arrTags 数组中的元素。


四、使用Python脚本导出数据

对于更复杂的数据处理需求,可以使用Python通过ODBC连接WinCC归档数据库。

4.1 环境配置

  1. 安装 Python 3.x版本
  2. 使用 pip安装必要的库:
    pip install pyodbc pandas

4.2 Python导出脚本

import pyodbc
import pandas as pd
from datetime import datetime
import os

# 数据库连接配置
server = 'WINCC_SERVER'
database = 'WinCCArchiveDB'
tag_name = 'Motor_Speed'
start_time = '2024-01-01 00:00:00'
end_time = '2024-01-31 23:59:59'
output_folder = r'C:\WinCC_Export'

# 创建输出目录
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 建立数据库连接
conn_str = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};Trusted_Connection=yes'
conn = pyodbc.connect(conn_str)

# 查询数据
query = f"""
SELECT DateAndTime, Value 
FROM Runtime..{tag_name}
WHERE DateAndTime BETWEEN '{start_time}' AND '{end_time}'
ORDER BY DateAndTime
"""

# 读取到DataFrame
df = pd.read_sql(query, conn)
conn.close()

# 数据处理
df['DateAndTime'] = pd.to_datetime(df['DateAndTime'])
df.columns = ['TimeStamp', 'Value']

# 导出CSV
output_file = os.path.join(output_folder, f'TrendData_{tag_name}.csv')
df.to_csv(output_file, index=False)

print(f"导出完成: {output_file}")
print(f"共导出 {len(df)} 条记录")

4.3 批量导出脚本

import pyodbc
import pandas as pd
import os
from datetime import datetime

def export_single_tag(conn, tag_name, start_time, end_time, output_folder):
    """导出单个变量的数据"""
    query = f"""
    SELECT DateAndTime, Value 
    FROM Runtime..{tag_name}
    WHERE DateAndTime BETWEEN '{start_time}' AND '{end_time}'
    ORDER BY DateAndTime
    """

    df = pd.read_sql(query, conn)
    df['DateAndTime'] = pd.to_datetime(df['DateAndTime'])
    df.columns = ['TimeStamp', 'Value']

    output_file = os.path.join(output_folder, f'TrendData_{tag_name}.csv')
    df.to_csv(output_file, index=False)

    return len(df)

# 配置参数
server = 'WINCC_SERVER'
database = 'WinCCArchiveDB'
start_time = '2024-01-01 00:00:00'
end_time = '2024-01-31 23:59:59'
output_folder = r'C:\WinCC_Export'

# 要导出的变量列表
tags = ['Motor_Speed', 'Tank_Level', 'Temperature_01', 'Pressure_Value']

# 创建输出目录
os.makedirs(output_folder, exist_ok=True)

# 连接数据库
conn_str = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};Trusted_Connection=yes'
conn = pyodbc.connect(conn_str)

# 批量导出
total_records = 0
for tag in tags:
    count = export_single_tag(conn, tag, start_time, end_time, output_folder)
    total_records += count
    print(f"已导出 {tag}: {count} 条记录")

conn.close()
print(f"\n批量导出完成!共导出 {total_records} 条记录。")

五、定时自动导出配置

5.1 使用Windows任务计划程序

  1. 打开 控制面板,选择 管理工具任务计划程序
  2. 点击 创建基本任务
  3. 输入 任务名称(如 WinCC_Data_Export),点击 下一步
  4. 选择 触发频率(如每天、每周),设置 执行时间
  5. 选择 启动程序
  6. 点击 浏览选择 cscript.exe(通常位于 C:\Windows\System32\
  7. 添加参数框中 输入 脚本完整路径,如:
    "C:\WinCC_Export\ExportTrendData.vbs"
  8. 完成 向导,确认 任务已启用

5.2 使用WinCC全局脚本定时器

  1. 打开 WinCC全局脚本编辑器
  2. 定时器 项目夹上 点击 右键,选择 新建定时器
  3. 设置 定时器属性(触发间隔、起始时间)
  4. 定时器的代码区域 粘贴 导出脚本
  5. 保存 并激活项目

六、常见问题与解决方案

6.1 数据库连接失败

问题:运行脚本时提示数据库连接失败。

可能原因

  • SQL Server服务未启动
  • 服务器名称错误
  • 防火墙阻止了数据库连接
  • 没有足够的数据库访问权限

解决方法

  1. 打开 SQL Server配置管理器,确认 SQL Server服务正在运行
  2. 检查 脚本中的服务器名称是否正确(使用 localhost. 表示本地服务器)
  3. 确认 Windows防火墙已允许SQL Server端口(默认1433)
  4. 联系 数据库管理员,确认当前账户有WinCC归档数据库的读取权限

6.2 变量表名不存在

问题:查询时提示找不到变量表。

可能原因

  • 变量名拼写错误
  • 变量未配置归档
  • 归档数据库名称与脚本中不同

解决方法

  1. 打开 SQL Server Management Studio
  2. 展开 WinCCArchiveDB数据库 → Tables
  3. 查找 Runtime schema下的表,确认实际表名
  4. 变量表名通常格式为 Runtime.压缩归档变量名Runtime.短周期归档变量名

6.3 导出数据为空

问题:导出的CSV文件中没有数据。

可能原因

  • 查询的时间范围内没有归档数据
  • 变量归档配置为只存储变化数据,如果变量在查询时间内没有变化,则没有记录
  • 时区差异导致时间匹配失败

解决方法

  1. 检查 变量归档配置,确认归档模式
  2. 扩大 查询时间范围进行测试
  3. 尝试 使用UTC时间进行查询

6.4 导出速度慢

问题:导出大量数据时脚本运行缓慢。

可能原因

  • 数据量过大(超过数百万条记录)
  • 网络延迟(远程数据库)
  • 查询没有使用索引

优化建议

  1. 分批次 导出数据(按天或按月)
  2. 添加 时间索引查询条件
  3. 使用 数据库服务器的本地磁盘作为输出目录,避免网络写入

七、高级功能扩展

7.1 导出时添加数据筛选

在SQL查询中添加条件,只导出 满足特定条件的数据:

' 只导出数值大于100的记录
strQuery = "SELECT DateAndTime, Value " & _
           "FROM Runtime.." & strTagName & " " & _
           "WHERE DateAndTime BETWEEN '" & strStartTime & "' AND '" & strEndTime & "' " & _
           "AND Value > 100 " & _
           "ORDER BY DateAndTime"

7.2 导出时进行数据聚合

对于长时间跨度的数据,可以 使用 SQL聚合函数减少数据量:

' 按小时聚合数据
strQuery = "SELECT DATEADD(HOUR, DATEPART(HOUR, DateAndTime), CAST(CAST(DateAndTime AS DATE) AS DATETIME)) AS Hour, " & _
           "AVG(Value) AS AvgValue, MAX(Value) AS MaxValue, MIN(Value) AS MinValue " & _
           "FROM Runtime.." & strTagName & " " & _
           "WHERE DateAndTime BETWEEN '" & strStartTime & "' AND '" & strEndTime & "' " & _
           "GROUP BY DATEADD(HOUR, DATEPART(HOUR, DateAndTime), CAST(CAST(DateAndTime AS DATE) AS DATETIME)) " & _
           "ORDER BY Hour"

7.3 导出多个变量到单个文件

将多个变量的数据 合并 到一个CSV文件中,便于对比分析:

Sub ExportMultiTagsToOneFile()
    Dim objConnection
    Dim objCommand
    Dim objRecordset
    Dim objFSO
    Dim objFile
    Dim strLine
    Dim strTagName
    Dim arrData(3)  ' 对应4个变量

    ' ... 建立数据库连接 ...

    ' 为每个变量创建独立的数据数组
    For i = 0 To 3
        arrData(i) = ""
        strQuery = "SELECT DateAndTime, Value FROM Runtime.." & arrTags(i) & " " & _
                   "WHERE DateAndTime BETWEEN '" & strStartTime & "' AND '" & strEndTime & "' " & _
                   "ORDER BY DateAndTime"
        Set objRecordset = objCommand.Execute(strQuery)

        Do While Not objRecordset.EOF
            arrData(i) = arrData(i) & objRecordset("DateAndTime") & "," & objRecordset("Value").Value & vbCrLf
            objRecordset.MoveNext
        Loop
    Next

    ' 合并写入文件
    Set objFile = objFSO.CreateTextFile(strFilePath, True)
    objFile.WriteLine "TimeStamp," & Join(arrTags, ",")

    ' 此处需要编写时间戳对齐逻辑 ...

    ' ... 清理资源 ...
End Sub

八、脚本安全注意事项

  1. 数据库凭据管理:避免在脚本中硬编码敏感信息,生产环境建议使用Windows集成身份验证或加密的配置文件

  2. 输出目录权限:确保运行脚本的账户有写入输出目录的权限

  3. 磁盘空间监控:定期清理导出文件,避免磁盘空间耗尽影响WinCC正常运行

  4. 脚本备份:将脚本文件备份到安全位置,避免意外丢失

  5. 日志记录:建议在脚本中添加日志记录功能,便于故障排查

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文