上一篇
"老张,这批设备运行数据能不能自动存到数据库里?领导要看趋势分析..."一大早,车间主任就给我出了个难题,作为厂里的WinCC"老司机",我微微一笑:"没问题,用VBScript搞个数据库读写功能就行!"
在工业自动化领域,WinCC作为西门子的经典组态软件,经常需要与数据库打交道,无论是存储历史数据、记录报警信息,还是与MES系统交互,都离不开数据库操作,今天我就带大家用最接地气的方式,搞定WinCC中的VBScript数据库操作。
在开始写代码前,我们需要做好几项准备工作:
CREATE TABLE EquipmentData ( ID INT IDENTITY(1,1) PRIMARY KEY, EquipmentName NVARCHAR(50), Temperature FLOAT, RecordTime DATETIME DEFAULT GETDATE() )
首先来看怎么用VBScript连接数据库,在WinCC的全局脚本或按钮事件中都可以写这段代码:
' 数据库连接函数 Function ConnectToDatabase() Dim conn Set conn = CreateObject("ADODB.Connection") ' 连接字符串 - 根据实际情况修改 Dim connStr connStr = "Provider=SQLOLEDB;Data Source=.\WINCC;Initial Catalog=CC_YourProjectName_日期;User ID=sa;Password=你的密码;" On Error Resume Next conn.Open connStr If Err.Number <> 0 Then MsgBox "数据库连接失败:" & Err.Description, vbCritical, "错误" Set ConnectToDatabase = Nothing Exit Function End If Set ConnectToDatabase = conn End Function
实用小技巧:
CC_项目名_日期
格式,可以在WinCC项目管理器中查看现在我们来实现把WinCC的变量值写入数据库,比如要把"设备1"的当前温度存入数据库:
Sub WriteDataToDB() Dim conn Set conn = ConnectToDatabase() If conn Is Nothing Then Exit Sub ' 获取WinCC变量值 Dim equipmentName, currentTemp equipmentName = "设备1" currentTemp = HMIRuntime.Tags("ActualTemperature").Read ' 准备SQL语句 Dim sql sql = "INSERT INTO EquipmentData (EquipmentName, Temperature) " & _ "VALUES ('" & equipmentName & "', " & Replace(currentTemp, ",", ".") & ")" ' 执行SQL On Error Resume Next conn.Execute sql If Err.Number <> 0 Then MsgBox "数据写入失败:" & Err.Description, vbCritical, "错误" Else ' 可以加个日志记录 HMIRuntime.Trace "数据写入成功:" & equipmentName & " - " & currentTemp & "℃" End If conn.Close Set conn = Nothing End Sub
避坑指南:
光存不用可不行,我们来看看怎么从数据库读取数据并显示在WinCC画面上:
Sub ReadDataFromDB() Dim conn Set conn = ConnectToDatabase() If conn Is Nothing Then Exit Sub ' 查询最近10条记录 Dim sql sql = "SELECT TOP 10 EquipmentName, Temperature, RecordTime " & _ "FROM EquipmentData ORDER BY RecordTime DESC" Dim rs Set rs = CreateObject("ADODB.Recordset") rs.Open sql, conn ' 清空现有显示(假设有个多行文本框叫MsgBoxData) ScreenItems("MsgBoxData").Text = "" ' 遍历结果 Do Until rs.EOF Dim displayText displayText = "设备:" & rs("EquipmentName").Value & _ " 温度:" & rs("Temperature").Value & "℃ " & _ "时间:" & rs("RecordTime").Value & vbCrLf ' 添加到显示控件 ScreenItems("MsgBoxData").Text = ScreenItems("MsgBoxData").Text & displayText rs.MoveNext Loop rs.Close conn.Close Set rs = Nothing Set conn = Nothing End Sub
性能优化建议:
直接拼接SQL容易有注入风险,我们来用参数化查询更安全:
Sub SafeWriteToDB() Dim conn Set conn = ConnectToDatabase() If conn Is Nothing Then Exit Sub ' 创建命令对象 Dim cmd Set cmd = CreateObject("ADODB.Command") cmd.ActiveConnection = conn cmd.CommandType = 1 ' adCmdText ' 带参数的SQL cmd.CommandText = "INSERT INTO EquipmentData (EquipmentName, Temperature) VALUES (?, ?)" ' 添加参数 Dim param1, param2 Set param1 = cmd.CreateParameter("EquipmentName", 200, 1, 50, "设备1") ' 200=adVarChar Set param2 = cmd.CreateParameter("Temperature", 5, 1, , HMIRuntime.Tags("ActualTemperature").Read) ' 5=adDouble cmd.Parameters.Append param1 cmd.Parameters.Append param2 ' 执行 On Error Resume Next cmd.Execute If Err.Number <> 0 Then HMIRuntime.Trace "安全写入失败:" & Err.Description Else HMIRuntime.Trace "安全写入成功" End If conn.Close Set cmd = Nothing Set conn = Nothing End Sub
结合WinCC报警功能,我们可以把报警信息自动存到数据库:
Sub SaveAlarmToDB() Dim conn Set conn = ConnectToDatabase() If conn Is Nothing Then Exit Sub ' 获取最近触发的报警 Dim alarmMsg, alarmTime, alarmType alarmMsg = HMIRuntime.Tags("@CurrentAlarmMessage").Read alarmTime = Now ' 实际项目中可以用报警时间标签 alarmType = HMIRuntime.Tags("@CurrentAlarmType").Read ' 检查是否为有效报警 If alarmMsg = "" Or IsEmpty(alarmMsg) Then Exit Sub ' 存入数据库 Dim sql sql = "INSERT INTO AlarmHistory (AlarmMessage, AlarmTime, AlarmType) " & _ "VALUES ('" & Replace(alarmMsg, "'", "''") & "', '" & _ FormatDateTime(alarmTime, vbShortDate) & " " & FormatDateTime(alarmTime, vbLongTime) & _ "', '" & alarmType & "')" conn.Execute sql conn.Close Set conn = Nothing End Sub
Q1:连接总是失败怎么办?
Q2:写入数据乱码怎么处理?
Charset=UTF-8
Q3:查询速度很慢如何优化?
通过VBScript在WinCC中操作数据库,我们打通了实时数据与历史存储的桥梁,从简单的数据记录到复杂的统计分析,这套方法在项目中经得起考验,好的数据库设计是成功的一半,而稳健的代码实现则是另一半。
下次当领导再要数据报表时,你就可以淡定地说:"没问题,数据都在数据库里,我这就给您查!"
本文由 长孙妍 于2025-08-02发表在【云服务器提供商】,文中图片由(长孙妍)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/520099.html
发表评论