WINCC报表 VBS脚本链接SQL Server数据库 日报月报 导出EXCEL PDF 1.登录界面:输入正确的用户名、密码,可进入系统 2.主控画面:对于每一工作站不同的工作状态显示不同的颜色 3.录入数据:手动输入数据并存储于数据库,通过Code从数据库中查询出数据或删除数据库数据;按时间段查询数据库数据,并可打印、导出Excel、PDF。 (也可自动录入) 4.日报月报:日报、月报报表功能 5.信息查询:可根据Type、Code、Time、归档/不归档等条件综合查询数据,并显示查询数量,查询结果以表格形式显示在界面,方便、快捷、美观,并支持导出为EXCEL表格,EXCEL表格模板可自由设定。 6.数据归档:通过验证用户名、密码,将临时数据库数据归档到历史数据库,保证归档安全性,并支持自定义时间自动归档。 7.用户管理:对用户进行增加或删除。

在工业自动化领域,WINCC是一款非常强大的监控与数据采集软件。今天咱们来聊聊如何通过VBS脚本让WINCC报表与SQL Server数据库紧密协作,实现登录、数据处理、报表生成以及数据归档等一系列实用功能。

登录界面

登录界面是系统的第一道关卡。我们得验证用户输入的用户名和密码是否正确,只有通过验证才能进入系统。在VBS脚本中,可以这样实现一个简单的登录验证思路(假设连接到SQL Server数据库验证用户信息):

' 连接到SQL Server数据库
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD"
conn.Open

' 获取用户输入的用户名和密码
userName = InputBox("请输入用户名")
password = InputBox("请输入密码")

' 构建SQL查询语句
sql = "SELECT COUNT(*) FROM Users WHERE UserName = '" & userName & "' AND Password = '" & password & "'"

Set rs = CreateObject("ADODB.Recordset")
rs.Open sql, conn, 1, 1

If rs.Fields(0).Value = 1 Then
    MsgBox "登录成功"
    '这里可以添加进入系统主界面的逻辑
Else
    MsgBox "用户名或密码错误"
End If

rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing

代码分析

  1. 首先通过CreateObject("ADODB.Connection")创建一个数据库连接对象conn,并配置好连接字符串,连接到指定的SQL Server数据库。
  2. 使用InputBox获取用户输入的用户名和密码。
  3. 构建SQL查询语句,通过COUNT(*)统计匹配用户名和密码的记录数量。
  4. 根据查询结果判断登录是否成功,若数量为1则登录成功,否则提示错误。

主控画面

主控画面根据每个工作站不同的工作状态显示不同颜色,这部分更多涉及到WINCC界面的组态设置以及与变量的关联。假设工作状态存储在数据库中,我们可以在VBS脚本中读取数据库状态值,然后根据值设置界面元素颜色。

' 连接数据库(代码同登录部分,省略重复代码)

' 读取工作站状态
sql = "SELECT Status FROM Workstations WHERE StationID = 1" '假设查询ID为1的工作站状态
rs.Open sql, conn, 1, 1

status = rs.Fields(0).Value

If status = "正常" Then
    '假设界面上有个名为Rectangle1的矩形代表工作站,设置为绿色
    ScreenItems("Rectangle1").BackColor = RGB(0, 255, 0)
Else
    '设置为红色
    ScreenItems("Rectangle1").BackColor = RGB(255, 0, 0)
End If

rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing

代码分析

  1. 同样先连接数据库,构建查询语句获取特定工作站的状态。
  2. 根据查询到的状态值,使用RGB函数设置界面上代表工作站的图形元素的颜色,直观展示工作状态。

录入数据

数据录入既可以手动输入,也能自动录入。手动录入后要存储到数据库,还能按条件查询、删除数据,以及按时间段查询并打印、导出。

' 手动录入数据到数据库
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD"
conn.Open

' 获取用户手动输入的数据
dataValue = InputBox("请输入要存储的数据")

' 插入数据到数据库
sql = "INSERT INTO DataTable (DataValue) VALUES ('" & dataValue & "')"
conn.Execute sql

' 根据Code查询数据
code = InputBox("请输入查询的Code")
sql = "SELECT * FROM DataTable WHERE Code = '" & code & "'"

Set rs = CreateObject("ADODB.Recordset")
rs.Open sql, conn, 1, 1

' 遍历查询结果
Do While Not rs.EOF
    MsgBox rs.Fields("DataValue").Value
    rs.MoveNext
Loop

rs.Close
Set rs = Nothing

' 删除数据
deleteCode = InputBox("请输入要删除数据的Code")
sql = "DELETE FROM DataTable WHERE Code = '" & deleteCode & "'"
conn.Execute sql

conn.Close
Set conn = Nothing

代码分析

  1. 连接数据库后,通过InputBox获取用户手动输入的数据,使用INSERT INTO语句插入到数据库表DataTable中。
  2. 根据用户输入的Code构建查询语句,打开记录集并遍历显示查询到的数据。
  3. 获取要删除数据的Code,使用DELETE FROM语句从数据库删除相应记录。

按时间段查询数据并导出功能稍微复杂点,涉及到日期格式处理以及导出到Excel和PDF的操作,后续结合日报月报部分一起讲。

日报月报

日报和月报报表功能是对数据按日或月进行统计汇总。假设我们要统计每日数据的总和生成日报。

' 连接数据库
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD"
conn.Open

' 获取当前日期
today = Date()

' 查询当日数据总和
sql = "SELECT SUM(DataValue) FROM DataTable WHERE Date = '" & today & "'"

Set rs = CreateObject("ADODB.Recordset")
rs.Open sql, conn, 1, 1

total = rs.Fields(0).Value

MsgBox "今日数据总和为:" & total

' 导出到Excel
Set excelApp = CreateObject("Excel.Application")
Set excelBook = excelApp.Workbooks.Add
Set excelSheet = excelBook.Sheets(1)

excelSheet.Cells(1, 1).Value = "日报数据"
excelSheet.Cells(2, 1).Value = "日期"
excelSheet.Cells(2, 2).Value = "总和"
excelSheet.Cells(3, 1).Value = today
excelSheet.Cells(3, 2).Value = total

excelBook.SaveAs "C:\日报数据.xlsx"
excelBook.Close
excelApp.Quit

Set excelSheet = Nothing
Set excelBook = Nothing
Set excelApp = Nothing

rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing

代码分析

  1. 连接数据库后,获取当前日期,构建查询语句统计当天DataTable表中DataValue的总和。
  2. 创建Excel应用程序对象,新建工作簿和工作表,将日报标题、日期、总和等信息写入Excel表格。
  3. 保存并关闭Excel文件,释放对象资源。导出PDF相对复杂些,可能需要借助第三方库,如Adobe Acrobat SDK等,这里暂不展开。

信息查询

信息查询支持根据TypeCodeTime、归档状态等条件综合查询数据,并显示查询数量,结果以表格形式显示且支持导出到自定义模板的Excel。

' 连接数据库
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD"
conn.Open

' 获取用户输入的查询条件
typeValue = InputBox("请输入Type")
codeValue = InputBox("请输入Code")
timeValue = InputBox("请输入Time")
archiveValue = InputBox("请输入归档状态(是/否)")

' 构建动态SQL查询语句
sql = "SELECT * FROM DataTable WHERE 1 = 1"
If typeValue <> "" Then
    sql = sql & " AND Type = '" & typeValue & "'"
End If
If codeValue <> "" Then
    sql = sql & " AND Code = '" & codeValue & "'"
End If
If timeValue <> "" Then
    sql = sql & " AND Time = '" & timeValue & "'"
End If
If archiveValue <> "" Then
    If archiveValue = "是" Then
        sql = sql & " AND IsArchived = 1"
    Else
        sql = sql & " AND IsArchived = 0"
    End If
End If

Set rs = CreateObject("ADODB.Recordset")
rs.Open sql, conn, 1, 1

' 显示查询数量
MsgBox "查询到的记录数量为:" & rs.RecordCount

' 这里可以添加将查询结果以表格形式显示在WINCC界面的代码(较复杂,暂不详细展开)

' 导出到自定义模板Excel
Set excelApp = CreateObject("Excel.Application")
Set excelBook = excelApp.Workbooks.Open("C:\自定义模板.xlsx")
Set excelSheet = excelBook.Sheets(1)

row = 2
Do While Not rs.EOF
    For col = 1 To rs.Fields.Count
        excelSheet.Cells(row, col).Value = rs.Fields(col - 1).Value
    Next
    row = row + 1
    rs.MoveNext
Loop

excelBook.SaveAs "C:\查询结果.xlsx"
excelBook.Close
excelApp.Quit

Set excelSheet = Nothing
Set excelBook = Nothing
Set excelApp = Nothing

rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing

代码分析

  1. 连接数据库后,获取用户输入的各项查询条件。
  2. 动态构建SQL查询语句,根据用户输入的条件添加相应的AND子句。
  3. 打开记录集,显示查询到的记录数量。
  4. 打开自定义的Excel模板,将查询结果逐行逐列写入模板,保存为新的Excel文件并清理资源。

数据归档

数据归档要保证安全性,通过验证用户名密码将临时数据库数据归档到历史数据库,还支持自定义时间自动归档。

' 验证用户名密码
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD"
conn.Open

userName = InputBox("请输入用户名")
password = InputBox("请输入密码")

sql = "SELECT COUNT(*) FROM Admins WHERE UserName = '" & userName & "' AND Password = '" & password & "'"

Set rs = CreateObject("ADODB.Recordset")
rs.Open sql, conn, 1, 1

If rs.Fields(0).Value = 1 Then
    ' 连接临时数据库和历史数据库(假设连接字符串不同)
    Set tempConn = CreateObject("ADODB.Connection")
    tempConn.ConnectionString = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=TEMP_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD"
    tempConn.Open

    Set historyConn = CreateObject("ADODB.Connection")
    historyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=HISTORY_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD"
    historyConn.Open

    ' 查询临时数据库数据
    sql = "SELECT * FROM TempDataTable"
    Set tempRs = CreateObject("ADODB.Recordset")
    tempRs.Open sql, tempConn, 1, 1

    ' 插入数据到历史数据库
    Do While Not tempRs.EOF
        insertSql = "INSERT INTO HistoryDataTable (Field1, Field2,...) VALUES ('" & tempRs.Fields("Field1").Value & "', '" & tempRs.Fields("Field2").Value & "',...)"
        historyConn.Execute insertSql
        tempRs.MoveNext
    Loop

    tempRs.Close
    Set tempRs = Nothing
    tempConn.Close
    Set tempConn = Nothing
    historyConn.Close
    Set historyConn = Nothing
Else
    MsgBox "用户名或密码错误,无法归档"
End If

rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing

代码分析

  1. 首先验证用户名和密码,确保是有权限的用户。
  2. 分别连接临时数据库和历史数据库。
  3. 查询临时数据库中的数据,并逐行插入到历史数据库对应的表中。

自动归档功能可以借助Windows的任务计划程序,定时执行包含归档代码的VBS脚本。

用户管理

用户管理实现对用户的增加或删除操作。

' 连接数据库
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD"
conn.Open

' 用户增加
action = InputBox("请选择操作(增加/删除)")
If action = "增加" Then
    newUserName = InputBox("请输入新用户名")
    newPassword = InputBox("请输入新用户密码")
    sql = "INSERT INTO Users (UserName, Password) VALUES ('" & newUserName & "', '" & newPassword & "')"
    conn.Execute sql
ElseIf action = "删除" Then
    delUserName = InputBox("请输入要删除的用户名")
    sql = "DELETE FROM Users WHERE UserName = '" & delUserName & "'"
    conn.Execute sql
End If

conn.Close
Set conn = Nothing

代码分析

  1. 连接数据库后,获取用户选择的操作(增加或删除)。
  2. 如果是增加用户,获取新用户名和密码,使用INSERT INTO语句添加到Users表。
  3. 如果是删除用户,获取要删除的用户名,使用DELETE FROM语句从表中删除。

通过以上一系列功能的实现,利用WINCC报表结合VBS脚本与SQL Server数据库的交互,能构建一个功能较为完善的工业数据管理系统,满足不同场景下的数据处理和展示需求。希望这篇博文能给大家在相关项目开发中带来一些启发。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐