目录

一、概述

1.1 前言

博图WINCC通过VBS脚本实现在数据库中保存和查询数据,调用Excel模板把数据保存到指定的位置!

在这里插入图片描述

1.2 主要功能

可以实现如下功能:
➢ 自动记录各设备的运行数据
➢ 自动统计各设备的运行时间
➢ 按设备、日期呈现报表
➢ 按日期和设备编号以EXCEL表格保存数据
➢ 可打印存有设备运行数据的表格

1.3 使用的软件

本文档所使用的各软件版本如下:
操作系统版本:Window10 专业版
➢ 博图版本: TIA V16
➢ WinCC 版本: WinCC RT Professional
➢ Office版本: Microsoft Office 2019

二、 SQL server建库和建表

这里我用的20192019版本的,其他版本的相差无几

2.1、SQL server建库

1、在开始—>所有程序,找到方框中箭头的那个单击,如下图所示:
在这里插入图片描述

倘若没有这个图标,请先安装SQL Server 2019。

2、然后,打开后会弹出下面图片,记住这个服务器名称 后面的值,这个等会程序中会用到,

在这里插入图片描述
点击链接后,需要建立我们需要的数据库,右击键“数据库” 点击 “新建数据库” 这是建库
在这里插入图片描述

在这里插入图片描述
4、然后在“数据库名称(N)”中输入数据库名字,点“确定”。这个名字用英文,我测试,所有名字随便取得

在这里插入图片描述
5、新建好了之后,点“数据库” ,就出现了下图信息
在这里插入图片描述

2.2SQL server建表

1、在库“Hong”下面 的“表” 右键—>“新建”—>点击“表(T)”,就出现下图,这是建表,

建表的意思就是建立一个小房间,这个房间专门用来存放某一个单独业务数据,比如专门存放某一个设备启停和产量等信息
在这里插入图片描述
2、进入下图,下面这个图是建字段,字段是用来存放设备中的属性,例如编号,时间、电能、停止电能和产量等等
在这里插入图片描述
列名就是填写数据英文名称,
数据类型 是字符、数字、浮点要选的类型都不一样,这个数据类型也很重要,它涉及到保存数据的长度,如果选错了,保存数据就会有问题。
不同的数据库都会详细介绍各个类型的使用场景,数据库基础知识我就不介绍了,随便找一个对于数据库的教学视频或者书都会介绍。
允许Null值意思是是否允许这一个值为空。
就是说当保存一个设备编号为1,开始电能为114KW的数据时候,允许为空的情况下,保存数据的时候,如果SQL语句中对于dev_no的值没取到,或者丢失,则这条数据也会保存,那么最终保存到数据库的信息就是编号为空,年龄为开始电能为114KW

3、其中ID需要改成标识,标识增量为1,如下图所示:
在这里插入图片描述

4、填好信息后,保存,就会弹出下面图片,这个是填写表的名字,就是给这个小房间弄一个名字,例如DataTableTest
在这里插入图片描述
在这里插入图片描述
到这里,数据库的建库建表就完成了,这个是鼠标操作,还可以用SQL语句来建表,或者直接拿别的地方导出的库文件直接导入到这个数据库,前提是同类型数据库。

三、建立wincc变量、画面

3.1、新建项目:

在这里插入图片描述

3.2添加wincc项目

在这里插入图片描述

3.2 给wincc添加HMI应用软件和通讯模块

在这里插入图片描述

3.3 添加内部变量

添加一个DataTableTest变量表
在这里插入图片描述

3.4 添加变量

T_Datetime(时间)、T_ID(ID)、T_ID_A(查询ID)、T_Power(电能表数据)、T_Count (生产数量),五个变量
在这里插入图片描述

3.5添加画面

添加设备运行报表画面,并在里面添加I/O域和按钮
在这里插入图片描述

四、 脚本编写

4.1 新建按钮和全局脚本文件夹

在这里插入图片描述

4.2、MyRnd全局脚本

1、添加全局VBS函数,并命名MyRnd脚本
在这里插入图片描述

2、变量设置
在这里插入图片描述
3、脚本代码

Function MyRnd(ByVal min, ByVal max)

MyRnd=Rnd*(max-min+1)+min  '在(min,max)之间取随机数

End Function

4、脚本展示
在这里插入图片描述

4.3 随机数生成按钮

1、 随机数生成按钮

2、添加按钮脚本
在这里插入图片描述

3、 脚本代码

Sub Random_generation()
HMIRuntime.Tags("T_Power").Write MyRnd(0,1000)
HMIRuntime.Tags("T_Count").Write MyRnd(0,1000)


End Sub

4、 脚本展示
在这里插入图片描述
5、添加脚本
在这里插入图片描述

4.4 保存按钮

1、保存按钮
在这里插入图片描述
2、添加按钮脚本
在这里插入图片描述

3、脚本代码

Sub Save()
               
  
	Dim conn                     '定义类对象
	Dim SCon                     '定义数据库连接字符串
	Dim oRs1                       '定义获取到的数据集
	Dim oCom
	Dim strSQL1
	Dim Datetime,Count,Power

	 '---------打开数据库 -----------'
	  SCon= "Provider=SQLOLEDB; Integrated Security =SSPI;Persist Security Info=False; Initial Catalog=Hong ; Data Source=DESKTOP-VFDPROG"
		Set conn=CreateObject("ADODB.Connection")
		  conn.ConnectionString = SCon
		  conn.CursorLocation = 3  
		  conn.Open
		Set oRs1 = CreateObject("ADODB.Recordset")
		Set oCom = CreateObject("ADODB.Command")
		 oCom.CommandType = 1
	  
	  
	   '---------读取数据-----------'		
		Datetime = HMIRuntime.Tags("T_Datetime").Read
		Power = HMIRuntime.Tags("T_Power").Read
		Count = HMIRuntime.Tags("T_Count").Read
	   '---------测试是否能取到值-----------'
	    MsgBox("Power=" & Power)
	    
	    
	    
	   
	   '---------弹框显示测试数据是否正确-----------'	 
		Dim Msg, Style, Title, Help, Ctxt, Response, MyString
		    Msg = "Do you want to continue "  ' 定义信息。
		    Style = vbYesNo + vbQuestion + vbDefaultButton2   ' 定义按钮。
		    Title = "是否保存"   ' 定义标题。
		    Help = "DEMO.HLP"   ' 定义帮助文件。
		    Ctxt = 1000   ' 定义标题
		  ' 上下文。
		  
		  ' 显示信息。
		    Response = MsgBox(Msg, Style, Title, Help, Ctxt)
		    
		    If Response = vbYes Then   ' 用户按下“是”。
		        MyString = "Yes"   ' 完成某操作。
			 	 '---------弹框显示测试数据是否正确-----------'    
			 	 
			 	 
				 	strSQL1 = "INSERT INTO [Hong].[dbo].[DataTableTest] ([Datetime], [Power], [Count])"  
				'SQL数据库变量
				    strSQL1 = strSQL1 & " VALUES ('" & Datetime & "', '" & Power &"', '" & Count & "')"
			    '从wincc读取的临时变量	 						
					Set oCom.ActiveConnection = conn
					    oCom.CommandText = strSQL1           
				    Set oRs1 = oCom.Execute
			
				'---------关闭数据库-----------'    
					Set oRs1 = Nothing
					Set oCom = Nothing
					conn.Close
					Set conn = Nothing
				
			'---------弹框显示测试数据是否正确-----------'    
		    Else   ' 用户按下“否”。
		        MyString = "No"   ' 完成某操作。
		    End If
		'---------弹框显示测试数据是否正确-----------'    



End Sub

4、 脚本展示
在这里插入图片描述在这里插入图片描述
5、按钮添加脚本
在这里插入图片描述

4.5 I/O查询

1、 I/O查询按钮
在这里插入图片描述
2、按钮脚本中添加I_O_Search脚本
在这里插入图片描述

3、 脚本代码

Sub I_O_Search()
                           
 
Dim conn                     '定义类对象
Dim SCon                     '定义数据库连接字符串
Dim oRs1                       '定义获取到的数据集
Dim oCom
Dim strSQL1
Dim T_ID_A
 
T_ID_A = HMIRuntime.Tags("T_ID_A").Read
 
'---------------------打开数据库 --------------------'
  SCon= "Provider=SQLOLEDB; Integrated Security =SSPI;Persist Security Info=False; Initial Catalog=Hong ; Data Source=DESKTOP-VFDPROG"
Set conn=CreateObject("ADODB.Connection")
    conn.ConnectionString = SCon
    conn.CursorLocation = 3  
    conn.Open
Set oRs1 = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
oCom.CommandType = 1
 
'---------------------查询数据库 --------------------'
strSQL1 ="SELECT [ID],[Datetime],[Power], [Count] FROM [Hong].[dbo].[DataTableTest]"
strSQL1 = strSQL1 & " WHERE ID = '" & T_ID_A & "'"
 
Set oCom.ActiveConnection = conn
oCom.CommandText = strSQL1           
Set oRs1 = oCom.Execute
 
 
'---------------------查询的数据传送给WinCC的内部变量 --------------------'
HMIRuntime.Tags("T_ID").Write oRs1.fields("ID").value
HMIRuntime.Tags("T_Datetime").Write oRs1.fields("Datetime").value
HMIRuntime.Tags("T_Power").Write oRs1.fields("Power").value
HMIRuntime.Tags("T_Count").Write oRs1.fields("Count").value
 
  MsgBox( "查询结束" )
  
'----------------关闭数据库-----------'    
Set oRs1 = Nothing
Set oCom = Nothing
    conn.Close
Set conn = Nothing                        
 
 


End Sub

4、 脚本展示
在这里插入图片描述
5、按钮添加脚本
在这里插入图片描述

五、脚本运行查看SQL

5.1 随机数脚本运行

1、打开“运行系统设置”,点开脚本选项中的启动命令
在这里插入图片描述
2、对我们建立的画面右击启动仿真命令
在这里插入图片描述
3、点击随机数生成按钮,电能和产量下的数值会随着每次的点击,进行随机变化

在这里插入图片描述

5.2 保存按钮运行

1、点击保存按钮后,会显示电能的数值,会和当前显示的电能数值一至。
在这里插入图片描述
2、点击确定后,会弹出是否保存的弹窗,
这里如我们点击是的话,数据会保存到SQL中
点击否的话,数据不会保存。

在这里插入图片描述

5.3 SQL数据库查看保存的数据

使用SQL查询刚才保存按钮保存的数据
1、右击DataTableTest,选择编写表脚本为(S)–>SELECT到(S)–>新查询编辑器窗口
在这里插入图片描述2、点击查询
在这里插入图片描述
3、这是刚才插入的数据
在这里插入图片描述

5.4 I/O查询按钮运行

1、选择查询ID,这里以查询数据库的第2行数据为例
在这里插入图片描述
2、点击I/O查询,
在这里插入图片描述
3、弹出查询结束的弹窗,点击确定即可
在这里插入图片描述

4、此时,这里显示的数据和SQL数据库的第二行数据

在这里插入图片描述

六、使用控件查询

6.1 添加控件

选择我的控件,在空白处右击,单击选择对象
在这里插入图片描述
2、弹出以下图框,在图框里选择控件,选好后点击确定

在这里插入图片描述
控件1:Microsoft Date and Time Picker Control 6.0 (SP4)

在这里插入图片描述
控件2:Microsoft FlexGrid Control , version 6.0
在这里插入图片描述
控件3:Microsoft Web Browser
在这里插入图片描述

3、添加完毕后,我的控件里会有刚才选择的三个控件
在这里插入图片描述

6.2MSHFlexGrid查询

1、添加按钮,命名为”MSHFlexGrid查询“
在这里插入图片描述
2、添加Microsoft FlexGrid Control , version 6.0控件
在这里插入图片描述3、Microsoft FlexGrid Control , version 6.0控件名称修改为Grid

4、在按钮脚本中添加MSHFlexGrid_Search脚本
在这里插入图片描述

5、脚本代码

Sub MSHFlexGrid_Search()

Dim conn                     '定义类对象
Dim SCon                     '定义数据库连接字符串
Dim oRs1                       '定义获取到的数据集
Dim oCom
Dim strSQL1
Dim m,i,j,k
 
'---------------------打开数据库 --------------------'
  SCon= "Provider=SQLOLEDB; Integrated Security =SSPI;Persist Security Info=False; Initial Catalog=Hong ; Data Source=DESKTOP-VFDPROG"
Set conn=CreateObject("ADODB.Connection")
    conn.ConnectionString = SCon
    conn.CursorLocation = 3  
    conn.Open
Set oRs1 = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
oCom.CommandType = 1
 
'---------------------查询数据库 --------------------'
strSQL1= "SELECT *  FROM  [Hong].[dbo].[DataTableTest]"
 
Set oCom.ActiveConnection = conn
oCom.CommandText = strSQL1           
Set oRs1 = oCom.Execute
 
 m = oRs1.RecordCount    
              MsgBox("查询到表格共有" & m &"行数据")
 
'---------------------设置MSHFlexGrid控件显示--------------------'
Dim olist
Set olist = ScreenItems("报表")
    olist.clear
    olist.Cols=5    '列数        
    olist.Rows = m+1 '行数量
 
For i = 0 To 2
    olist.ColAlignment(i)=3'列内容居中显示
Next
 
    '设置列宽    
    olist.ColWidth(0) = 800                 
    olist.ColWidth(1) = 1200
    olist.ColWidth(2) = 1200
    olist.ColWidth(3) = 1200
    olist.ColWidth(4) = 1200
 
    '设置表头
    olist.TextMatrix(0, 0)="序号"   
olist.TextMatrix(0, 1)="ID"                      
    olist.TextMatrix(0, 2) = "时间"   
    olist.TextMatrix(0, 3) = "电能"
    olist.TextMatrix(0, 4) = "生产数量"
    
'---------------------将数据写入表格--------------------'        
oRs1.movefirst
    For i = 1 To m  
    olist.TextMatrix(i ,0) = i     
        olist.TextMatrix(i ,1) = oRs1.Fields(0).Value
        olist.TextMatrix(i ,2) = oRs1.Fields(1).Value
        olist.TextMatrix(i ,3) = oRs1.Fields(2).Value
        olist.TextMatrix(i ,4) = oRs1.Fields(3).Value       
        oRs1.movenext
    Next
  MsgBox("查询结束" )
'----------------关闭数据库-----------'    
Set oRs1 = Nothing
Set oCom = Nothing
    conn.Close
Set conn = Nothing                        


End Sub

6、脚本展示:
在这里插入图片描述
在这里插入图片描述

5、运行情况
5.1点击查询
在这里插入图片描述
5.2、弹出共查询到几行数据

在这里插入图片描述
5.3、查询结束后会有查询结束的弹窗,点击确定即可
在这里插入图片描述
5.4、数据会显示在控件中在这里插入图片描述

七、数据导出EXCEL并保存、查询

7.1、新建模板表格

1、在D盘中新建DataTableTest表格
在这里插入图片描述
2、编辑DataTableTest表格
在这里插入图片描述3、D盘新建日报表文件夹

后面的的表格都保存到这个文件夹中
在这里插入图片描述

7.2、添加导出EXCEL按钮和脚本

1、添加导出到EXCEL按钮脚本
在这里插入图片描述
2、脚本代码

Sub Export_to_Excel()
Dim conn                     '定义类对象
Dim SCon                     '定义数据库连接字符串
Dim oRs1           '定义获取到的数据集
Dim oCom
Dim strSQL1
Dim m
Dim ReportSelect
 
'---------------------打开并查询数据库 --------------------'
SCon= "Provider=SQLOLEDB.1; Integrated Security =SSPI;Persist Security Info=False; Initial Catalog=Hong ; Data Source=DESKTOP-VFDPROG"
strSQL1= "SELECT *  FROM  [Hong].[dbo].[DataTableTest]"
Set conn=CreateObject("ADODB.Connection")
    conn.ConnectionString = SCon
    conn.CursorLocation = 3  
    conn.Open
Set oRs1 = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
    oCom.CommandType = 1
Set oCom.ActiveConnection = conn
    oCom.CommandText = strSQL1           
Set oRs1 = oCom.Execute              
    m = oRs1.RecordCount    
MsgBox("查询到表格共有" & m &"行数据")
 
'---------------------打开Excel模板 --------------------'        
Dim objExcelApp,objExcelBook,objExcelSheet,a,b ,i
Set objExcelApp =CreateObject("Excel.Application")
    objExcelApp.Visible=True
Set a =objExcelApp.Workbooks.Open("D:\DataTableTest.xlsx")  
Set b =a.Worksheets("Sheet1")
    b.Range("A2") = "日期: " & CStr(Year(Now)) & "年"  & CStr(Month(Now)) &"月" & CStr(Day(Now)) &"日"         
    objExcelApp.Worksheets("Sheet1").Activate
'---------------------判断有无符合要求的数据 --------------------'        
If (oRs1.EOF) Then
    MsgBox("没有符合要求的记录")
Else
MsgBox("符合要求的记录")
oRs1.movefirst                
        For i = 4 To m+3
        
            With objExcelApp.Worksheets("Sheet1")
            .cells(i,1).value=CStr(oRs1.Fields(0).Value)
            .cells(i,2).value=CStr(oRs1.Fields(1).Value)
            .cells(i,3).value=CStr(oRs1.Fields(2).Value)
            .cells(i,4).value=CStr(oRs1.Fields(3).Value)
            End With
            oRs1.MoveNext
        Next
End If
 
'---------------------以日期命名,并保存到指定文件夹 --------------------'        
Dim patch,filename
 filename=CStr(Year(Now))&"_"&CStr(Month(Now))&"_"&CStr(Day(Now))&"_"&CStr(Hour(Now))&"_"&CStr(Minute(Now))&"_"&CStr(Second(Now))
 patch= "D:\日报表\"&filename&".xlsx" 
 objExcelApp.ActiveWorkbook.SaveAs patch
 objExcelApp.Workbooks.Close
 objExcelApp.Quit
 
         MsgBox "成功生成数据文件!"
 
 
'---------------------关闭数据库 --------------------'
Set objExcelApp= Nothing
Set oRs1 = Nothing
Set oCom = Nothing
conn.Close
Set conn = Nothing

End Sub

3、脚本展示

在这里插入图片描述

4、添加按钮
在这里插入图片描述5、按钮添加脚本
在这里插入图片描述
6、运行
1、点击导出EXCEL
在这里插入图片描述
2、弹窗点击确定
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3、导出结果
在这里插入图片描述数据统一至
在这里插入图片描述

八、运行界面显示EXCEL数据

8.1、D盘日报表文件夹内新建web文件夹
在这里插入图片描述

8.2、添加Web Browser 控件,并修改名称Web

在这里插入图片描述在这里插入图片描述

8.3、添加Generate_report脚本
在这里插入图片描述

8.4、脚本代码

Sub Generate_report()
                             
On Error Resume Next
                     
Dim conn                     '定义类对象
Dim SCon                     '定义数据库连接字符串
Dim oRs1           '定义获取到的数据集
Dim oCom
Dim strSQL1
Dim m
Dim ReportSelect
 
'---------------------打开并查询数据库 --------------------'
SCon= "Provider=SQLOLEDB.1; Integrated Security =SSPI;Persist Security Info=False; Initial Catalog=Hong ; Data Source=DESKTOP-VFDPROG"
strSQL1= "SELECT *  FROM  [Hong].[dbo].[DataTableTest]"
Set conn=CreateObject("ADODB.Connection")
    conn.ConnectionString = SCon
    conn.CursorLocation = 3  
    conn.Open
Set oRs1 = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
    oCom.CommandType = 1
Set oCom.ActiveConnection = conn
    oCom.CommandText = strSQL1           
Set oRs1 = oCom.Execute              
    m = oRs1.RecordCount    
MsgBox("查询到表格共有" & m &"行数据")
 
'---------------------打开Excel模板 --------------------'        
Dim objExcelApp,objExcelBook,objExcelSheet,a,b ,i
Set objExcelApp =CreateObject("Excel.Application")
    objExcelApp.Visible=False
     objExcelApp.DisplayAlerts=False
Set a =objExcelApp.Workbooks.Open("D:\DataTableTest.xlsx") 
Set b =a.Worksheets("Sheet1")
    b.Range("A2") = "日期: " & CStr(Year(Now)) & "年"  & CStr(Month(Now)) &"月" & CStr(Day(Now)) &"日"         
    objExcelApp.Worksheets("Sheet1").Activate
'---------------------判断有无符合要求的数据 --------------------'        
If (oRs1.EOF) Then
    MsgBox("没有符合要求的记录")
Else
MsgBox("符合要求的记录")
oRs1.movefirst                
        For i = 4 To m+3
        
            With objExcelApp.Worksheets("Sheet1")
            .cells(i,1).value=CStr(oRs1.Fields(0).Value)
            .cells(i,2).value=CStr(oRs1.Fields(1).Value)
            .cells(i,3).value=CStr(oRs1.Fields(2).Value)
            .cells(i,4).value=CStr(oRs1.Fields(3).Value)
            End With
            oRs1.MoveNext
        Next
        '---------------------文件同时保存到D:\日报表\web文件夹中--------------------'        
 a.SaveAs "D:\日报表\web\日报表.htm",44
 
'---------------------以日期命名,并保存到指定文件夹 --------------------'        
Dim patch,filename
 filename=CStr(Year(Now))&"_"&CStr(Month(Now))&"_"&CStr(Day(Now))&"_"&CStr(Hour(Now))&"_"&CStr(Minute(Now))&"_"&CStr(Second(Now))
 patch= "D:\日报表\"&filename&".xlsx"                  
 objExcelApp.ActiveWorkbook.SaveAs patch
 objExcelApp.Workbooks.Close
 objExcelApp.Quit
 
         MsgBox "成功生成数据文件!"         
 
'---------------------关闭数据库 --------------------'
Set objExcelApp= Nothing
Set objExcelBook= Nothing
Set objExcelSheet= Nothing
Set oRs1 = Nothing
Set oCom = Nothing
conn.Close
Set conn = Nothing
 
End If
 
 
 
 
'---------------------报表显示 --------------------'        
Dim wbCtrl
Set wbCtrl = ScreenItems("Web") '"Web"为Web控件名称
wbCtrl.Navigate  "D:\日报表\web\日报表.htm"


End Sub

8.5、脚本展示

在这里插入图片描述

在这里插入图片描述

8.6 添加按钮
在这里插入图片描述
8.7、添加脚本
在这里插入图片描述

8.8 运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐