探索WINCC报表:用VBS脚本链接SQL Server数据库实现各类功能
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
代码分析
- 首先通过
CreateObject("ADODB.Connection")创建一个数据库连接对象conn,并配置好连接字符串,连接到指定的SQL Server数据库。 - 使用
InputBox获取用户输入的用户名和密码。 - 构建SQL查询语句,通过
COUNT(*)统计匹配用户名和密码的记录数量。 - 根据查询结果判断登录是否成功,若数量为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
代码分析
- 同样先连接数据库,构建查询语句获取特定工作站的状态。
- 根据查询到的状态值,使用
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
代码分析
- 连接数据库后,通过
InputBox获取用户手动输入的数据,使用INSERT INTO语句插入到数据库表DataTable中。 - 根据用户输入的
Code构建查询语句,打开记录集并遍历显示查询到的数据。 - 获取要删除数据的
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
代码分析
- 连接数据库后,获取当前日期,构建查询语句统计当天
DataTable表中DataValue的总和。 - 创建Excel应用程序对象,新建工作簿和工作表,将日报标题、日期、总和等信息写入Excel表格。
- 保存并关闭Excel文件,释放对象资源。导出PDF相对复杂些,可能需要借助第三方库,如
Adobe Acrobat SDK等,这里暂不展开。
信息查询
信息查询支持根据Type、Code、Time、归档状态等条件综合查询数据,并显示查询数量,结果以表格形式显示且支持导出到自定义模板的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
代码分析
- 连接数据库后,获取用户输入的各项查询条件。
- 动态构建SQL查询语句,根据用户输入的条件添加相应的
AND子句。 - 打开记录集,显示查询到的记录数量。
- 打开自定义的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
代码分析
- 首先验证用户名和密码,确保是有权限的用户。
- 分别连接临时数据库和历史数据库。
- 查询临时数据库中的数据,并逐行插入到历史数据库对应的表中。
自动归档功能可以借助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
代码分析
- 连接数据库后,获取用户选择的操作(增加或删除)。
- 如果是增加用户,获取新用户名和密码,使用
INSERT INTO语句添加到Users表。 - 如果是删除用户,获取要删除的用户名,使用
DELETE FROM语句从表中删除。
通过以上一系列功能的实现,利用WINCC报表结合VBS脚本与SQL Server数据库的交互,能构建一个功能较为完善的工业数据管理系统,满足不同场景下的数据处理和展示需求。希望这篇博文能给大家在相关项目开发中带来一些启发。







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



所有评论(0)