WinCC与Mysql原来可以这样玩

该博客介绍了如何在WinCC 7.5中使用VBS脚本集成Excel对象,实现与MySQL数据库的连接,读取和插入实时数据。通过ADODB连接数据库,创建和调用函数完成数据插入操作,并展示了如何从数据库取出数据填充到Excel表格,最终保存和展示数据。整个过程详细说明了VBS脚本在SCADA系统中的应用。
摘要由CSDN通过智能技术生成

1 环境

1 软件&环境需求

  • win10 OS
    
  • mysql 5.6~5.7
    
  • mysql ODBC connector
    
  • navicate
    
  • wincc 7.5 集成VBS
    

2 VBS脚本

2.1 wincc中集成Excel对象

Excel 对象的根对象是 Excel.application
excel.application->workbook->sheet->cell

' 在Wincc的起始画面的打开画面事件中写入下面脚本
' 创建 Excel Application并加入DataSet,以便在不同画面或画面窗口中访问。
Sub OnOpen() 

Dim xlApp
Dim DSExist
Dim i

On Error Resume Next '出现错误继续执行
'检查 Excel 是否已运行,若无则新建应用,以防止重复运行 Exce
Set xlApp = GetObject("Excel Application")
If Typename(xlApp) <> "Application" Then
	Set xlApp = CreateObject("Excel.Application")
End If

'检查 DataSet 中是否已有 xlApp,若无则添加
With HMIRuntime.DataSet
	For i = 1 To .Count
		If StrComp(.item(i).Name,"xlApp",1) = 0 Then
			DSExist = 1
			i = .Count
		End If
	Next
	If DSExist = 0 Then .Add "xlApp",xlApp
End With
 	
End Sub

2.2 链接数据库,并插入实时数据(ADODB)

2.2.1 测试代码
Option Explicit
Function action
On Error Resume Next
Dim conn, rs, com, sql
Dim water, power, medicine
Dim a
Dim b
a = Now
b = CStr(a)


water = HMIRuntime.Tags("report1.water").Read
power = HMIRuntime.Tags("report1.power").Read
medicine = HMIRuntime.Tags("report1.medicine").Read


Set conn = CreateObject("ADODB.Connection")
	conn.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};server=localhost;database=test;uid=root;pwd=root;option=3"
	conn.CursorLocation = 3
	conn.Open
	'Msgbox conn.state


Set rs = CreateObject("ADODB.RecordSet")
	'sql = "select * from report"
	sql = "insert into report (addr, time, power, water, medicine) values(1,"&"'"& b & "'"& "," & power & "," & water & "," & medicine & ")"
	'sql = "insert into report (addr, time, power, water, medicine) values(1,2,3,4,5)"
	'Msgbox sql
	'Msgbox sql
	conn.Execute sql	
	'rs.Open sql,conn,1,3
	'Msgbox (rs.state)

Set conn = Nothing
Set rs = Nothing

End Function
2.2.2 封装成函数
Sub insert(sql)
Dim conn
On Error Resume Next
Set conn = CreateObject("ADODB.connection")
With conn
	.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};server=localhost;database=test;uid=root;pwd=root;option=3"
	.CursorLocation = 3
	.Open
	.Execute sql 	
End With
Set conn = Nothing
End Sub
2.2.3 动作中调用函数进行插入
Option Explicit
Function action
On Error Resume Next
Dim addr : addr = "PAC加药间I"
Dim medicine_A : medicineA = HMIRuntime.tags("FT0404_F.3_Feedback").Read/3600
Dim medicine_B : medicineA = HMIRuntime.tags("FT0405_F.3_Feedback").Read/3600
Dim medicine_total : medicine_total = medicine_A + medicine_B

Dim sql
sql = "insert into report (addr, time, power, water, medicine) " &_
	   "values(" &"'"& addr &"'" &","&"'"& CStr(Now) & "'"& "," & "Null" & "," & "Null" & "," & 1 & ")" &"," &_
	   "("&"'"&addr&"'"&","&"'"& CStr(Now) & "'"& "," & "Null" & "," & "Null" & "," & 1 & ")"
'Msgbox sql
insert(sql)


End Function

3 取出数据,填充excel,存储并展示

Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)                                 
On Error Resume Next
Dim conn,rs,sql
Dim excel

Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.RecordSet")
	conn.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};server=localhost;database=test;uid=root;pwd=root;option=3"
	conn.CursorLocation = 3
	conn.Open
	'Msgbox (conn.State)
	sql =   "select addr, concat(Year(Time),'-',Month(Time),'-',Day(Time),' ',Hour(Time), ':00', ':00') As Time ,avg(power), avg(water), avg(medicine)" &_
			"from report group by Year(Time), Month(Time), Day(Time), Hour(Time);"
	'Msgbox sql
	rs.Open sql,conn,1,3
	'Msgbox(rs.State)
	Dim m 
	m = rs.RecordCount
	'Msgbox(m)




Dim xlApp, xlPath, xlFile, xlBook, xlSheet
Dim i,t
Dim objFSO, objFlexGrid, objProcessBar

Set objFSO = CreateObject("Scripting.FileSystemObject")

xlPath = HMIRuntime.ActiveProject.Path & "\Excel"

If Not objFSO.FolderExists(xlPath) Then
	objFSO.CreateFolder(xlPath)
End If

Set objFSO = Nothing


Set xlApp = HMIRuntime.DataSet("xlApp").Value
Set xlBook = xlApp.Workbooks.Add
xlApp.Visible = False
Set xlSheet = xlBook.WorkSheets(1)


With xlSheet
	.Activate
	.Columns(1).ColumnWidth = 15
	.Columns(2).ColumnWidth = 30
	.Columns(3).ColumnWidth = 10
	.Columns(4).ColumnWidth = 10
	.Columns(5).ColumnWidth = 10
	.Range("A:E").HorizontalAlignment = 3
	.Range("A:E").Borders.LineStyle = 1
	.Range("A1:E1").Interior.ColorIndex = 37
	
	.Cells(1,1) = "工艺段"
	.Cells(1,2) = "时间"
	.Cells(1,3) = "电能消耗"
	.Cells(1,4) = "水源消耗"
	.Cells(1,5) = "药品消耗"
	rs.MoveFirst
	For i = 1 To m
		.Cells(i+1, 1) = rs.Fields(0).Value
		.Cells(i+1, 2) = rs.Fields(1).Value
		.Cells(i+1, 3) = Round(rs.Fields(2).Value,1)
		.Cells(i+1, 4) = Round(rs.Fields(3).Value,1)
		.Cells(i+1, 5) = Round(rs.Fields(4).Value,1)
		rs.MoveNext
	Next
	.Cells(m+2, 1) = "合计"
	.Cells(m+2, 3) = "=SUM(C2:C"&m&")"
	.Cells(m+2, 4) = "=SUM(D2:D"&m&")"
	.Cells(m+2, 5) = "=SUM(E2:E"&m&")"
	

End With
	
t = Now
xlFile = Right("20"&Year(t),4)&"."&Right("0"&Month(t),2)&"."&Right("0"&Day(t),2)&"."&Right("0" & Hour(t),2)&"."&Right("0"&Minute(t),2)&"."&Right("0"&Second(t),2)&"."&"htm"
Msgbox(xlPath & xlFile)
xlBook.SaveAs xlPath&"\"&xlFile,44
xlApp.WorkBooks.Close
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing

Dim wbCtrl

Set wbCtrl = ScreenItems("控件1")

wbCtrl.MyPage = xlPath&"\"&xlFile


End Sub
WinCC中实现MySQL数据库的读写操作,可以通过以下步骤进行: 1. **安装MySQL ODBC驱动**: 首先,需要在WinCC所在的计算机上安装MySQL ODBC驱动。可以通过MySQL官方网站下载并安装最新版本的MySQL Connector/ODBC。 2. **配置ODBC数据源**: 安装完成后,需要配置ODBC数据源。可以通过“控制面板” -> “管理工具” -> “ODBC数据源(32位或64位)”来打开ODBC数据源管理器。选择“系统DSN”选项卡,点击“添加”,选择“MySQL ODBC 8.0 Unicode Driver”或“MySQL ODBC 8.0 ANSI Driver”,然后点击“完成”。在弹出的配置窗口中,输入数据源名称、描述、服务器地址、数据库名称、用户名和密码等信息,点击“确定”保存。 3. **在WinCC中配置数据库连接**: 打开WinCC项目,进入“变量管理”,新建一个“数据库连接”变量。在“数据库连接”属性中,选择“ODBC”作为连接类型,输入之前配置好的数据源名称(DSN),并填写数据库的用户名和密码。 4. **编写SQL语句**: 在WinCC的脚本编辑器中,编写SQL语句来实现对MySQL数据库的读写操作。可以使用WinCC提供的SQL函数,例如`SQLConnect`, `SQLExec`, `SQLFetch`, `SQLClose`等。 5. **执行SQL语句**: 在WinCC的脚本中,通过调用`SQLExec`函数执行SQL语句。例如: ```vb Dim conn As Integer Dim result As Integer Dim query As String ' 连接数据库 conn = SQLConnect("DSN=MySQL_DSN;UID=username;PWD=password") ' 执行查询 query = "SELECT * FROM table_name" result = SQLExec(conn, query) ' 处理查询结果 If result = 0 Then ' 处理查询结果 SQLFetch(conn) ' 读取数据 Dim value As Variant value = SQLGetField(conn, 1) ' 处理数据 End If ' 关闭连接 SQLClose(conn) ``` 6. **测试和调试**: 在WinCC中运行项目,测试数据库连接的读写操作是否正常。根据需要调试和优化脚本。 通过以上步骤,可以在WinCC中实现MySQL数据库的读写操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kobe_OKOK_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值