设备运行报表案例实现
目录概述三、Wincc 变量四、数据存储脚本5、报表制作5、报表制作六、导出EXCEL七、打印EXCEL
目录
概述
在工业生产中存在很多设备,例如机床,压机等,在实际生产过程中需要对这些设备的启停时间、耗电量以及生产产品的数量这些运行数据进行统计,作为分析企业生产运营情况的依据。
本文以WinCC V7.5 SP1为例,介绍WinCC如何实现设备运行数据统计并通过报表的形式展现统计数据,如图1所示: 可以实现如下功能: ➢ 自动记录各设备的运行数据 ➢ 自动统计各设备的运行时间 ➢ 按设备、日期呈现报表 ➢ 按日期和设备编号以EXCEL表格保存数据 ➢ 可打印存有设备运行数据的表格
本文档所使用的各软件版本如下: ➢ 操作系统版本:Windows 10 ➢ WinCC 版本: SIMATIC WinCC V7.5 SP1 ➢ Office版本: Microsoft Office 2019
2、创建数据库 WinCC自动存储设备运行数据到数据库,然后报表系统从数据库调取数据。 这里使用SQL数据库存储数据。因此需要首先创建SQL数据库。
关于数据库的结构和文件位置说明如下: 1、 每个设备创建一个数据表,表名称中只有编号不同,方便后面编程时定位相应设备的数据库表。 2、 所有表的结构都相同。表的结构如图2所示。 其中ID需要改为标识规范,标识增量为1
“ST_T”代表本次生产设备的启动时间,“EN_T”代表本次生产设备的停止时间。同时,报表会读取其差值作为本次生产所进行的时间。
本例中“Power_ST”和“Power_EN”分别代表设备每次启动和停止时电能表的数据,其差值就是本次生产所消耗的电能。同样“Connt_ST”和“Connt_EN”的差值代表本次所生产的产品数量。
三、Wincc 变量
本例中需要用到两种WinCC变量。一种是和设备运行数据相关的 WinCC变量,包括运行状态、电能表数据、生产数量等。另外一种是用于标识WinCC全局动作执行的WinCC变量。
设备运行相关变量以结构变量形式创建。根据需要创建结构变量的元素,本例中包括Running(运行状态)、Power(电能表数据)、Count (生产数量)三个元素,数据类型如图4所示。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4c06dd4a7a4542a09a3e5bf9e93ddfe3.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzU4MjIwOTM4,size_16,color_FFFFFF,t_70)
为每个设备创建结构变量,各设备的变量名称中只有编号不同。 如图5所示。 运行数据写入数据是通过WinCC全局动作实现的,设备运行状态发生变化时就执行数据写入,根据设备的不同状态写入不同的数据。但是WinCC启动后默认会执行一次全局动作,这样就会造成设备状态没有发生变化,但数据被更新的情况。因此需要使用一个标识变量来避免这一问题。 为每个设备创建一个标识变量,数据类型为二进制变量。如图6所示。
这些变量的初始值设为0。在WinCC运行后,第一次执行全局动作时,置位相应的标识变量,当标识变量为1时才执行数据库写入操作。
四、数据存储脚本
各设备的运行数据是通过各自的WinCC全局动作写入数据库,WinCC全局动作由设备运行状态的变化触发脚本执行,全局动作脚本根据设备的状态写入不同的数据。
打开WinCC VBS全局脚本编辑器,在项目模块下创建项目函数 各设备的运行数据是通过各自的WinCC全局动作写入数据库,WinCC全局动作由设备运行状态的变化触发脚本执行,全局动作脚本根据设备的状态写入不同的数据。 脚本:
Function dev_record (devno)
On Error Resume Next
Dim DEV_ID: DEV_ID = devno
Dim DeviceRunning,DeviceCount,DevicePower,flag '读取WinCC变量
Set DeviceRunning = HMIRuntime.Tags("Device" & DEV_ID & ".Running") 'WinCC变量:设备运行状态
DeviceRunning.Read
Set DeviceCount = HMIRuntime.Tags("Device" & DEV_ID & ".Count") 'WinCC变量:运行数据1
DeviceCount.Read
Set DevicePower = HMIRuntime.Tags("Device" & DEV_ID & ".Power") 'WinCC变量:运行数据2
DevicePower.Read
Set flag = HMIRuntime.Tags("flag" & DEV_ID )
flag.Read
If flag.Value = 1 Then 'WinCC启动后第一次不执行以下脚本
'-------------------数据库链接--------------------’
Dim conn '定义类对象
Dim SCon '定义数据库连接字符串
Dim oRs1 '定义获取到的数据集
Dim oCom
Dim strSQL1
Dim ID
Dim m
Dim devx: devx = "dev" & DEV_ID
'ID = HMIRuntime.Tags("ID").Read
'MsgBox("devx=" & devx)
sCon= "Provider=SQLOLEDB; Integrated Security =SSPI;Persist Security Info=False; Initial Catalog=Hong ; Data Source=DESKTOP-VFDPROG"
If DeviceRunning.Value =1 Then
strSQL1="INSERT INTO [dbo].["& devx &"] (dev_no,ST_T,Power_ST,Count_ST) VALUES ('"& DEV_ID & "','"& Now &"','"& DevicePower.Value &"','"& DeviceCount.Value &"')"
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
Else
'--------------------使用查询命令确定此时ID的数值---------------------------
strSQL1= "SELECT * FROM [dbo].["& devx &"]"
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
ID = oRs1.RecordCount
'MsgBox("ID=" & ID)
'--------------------得出表格ID的值,以便确定最后一行---------------------------
'数据库更新语句
'--------------------使用修改命令,来更改最后一行的结束数值---------------------------
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 ="UPDATE [Hong].[dbo].["& devx &"] Set [EN_T]='" & Now & "',[Count_EN]= '" & DeviceCount.Value &"', [Power_EN] = " & DevicePower.Value& " WHERE ([ID] = " & ID & ")"
Set oCom.ActiveConnection =conn
oCom.CommandText = strSQL1
Set oRs1 = oCom.Execute
'--------------------修改命令结束---------------------------
'MsgBox("m="& ID)
End If
Set oRs1 = Nothing
Set oCom = Nothing
conn.Close
Set conn = Nothing
Else
flag.Write 1
End If
End Function
各设备的运行数据是通过各自的WinCC全局动作写入数据库,WinCC全局动作由设备运行状态的变化触发脚本执行,全局动作脚本根据设备的状态写入不同的数据。
在全局动作中调用全局项目函数。分别为每个设备创建一个全局动作,如图9所示。 在全局动作中直接调用项目函数,并输入设备编号作为参数,如图10所示为设备1的全局动作。 设备运行状态发生变化时执行全局动作,在全局动作中根据设备的状态写入不同的数据。因此需要设定设备状态变量作为全局动作的触发器。如图11所示为设备1的全局动作触发器。
在工业生产中存在很多设备,例如机床,压机等,在实际生产过程中需要对这些设备的启停时间、耗电量以及生产产品的数
使能WinCC的“全局脚本运行系统”,并激活WinCC运行。 当有设备启停时,会自动在数据库中记录此设备的启停时间,本次启停时刻的运行数据,如图13所示为设备1的数据库记录结果。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4cb83d1f0f844d09b6574b82b2b5d428.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzU4MjIwOTM4,size_16,color_FFFFFF,t_70)
5、报表制作
报表查询的实现过程是通过脚本查询数据库,把查询结果填充到excel模板并另存为htm文件,在WinCC画面中添加web控件显示htm报表文件。 创建excel模板,如图14所示: 模板文件存放在WinCC项目文件夹\report\模板下,如图15所示。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6c3e8a7568c145e69e9077d615427139.png)
5、报表制作
报表查询的实现过程是通过脚本查询数据库,把查询结果填充到excel模板并另存为htm文件,在WinCC画面中添加web控件显示htm报表文件。
在WinCC报表查询画面上,可以按照设备编号和日期来查询报表。需要在画面中添加日期选择控件、选项组控件和web控件,如图16所示
按如下步骤添加Microsoft Date and Timer Picker Control和 Microsoft Web Browser。 第一步,在ActiveX控件上右键,选择“添加/删除”,然后在OCX控件列表中选择Microsoft Date and Timer Picker Control和 Microsoft Web Browser。如图17所示。 第二步,添加控件到画面分别拖拽Microsoft Date and Timer Picker Control和 Microsoft Web Browser控件到画面中。如图18所示。
第三步,添加组合框控件 在画面上添加组合框控件,用来选择设备。可以从智能对象下拖拽组合框控件直接添加到画面,并设置属性。步骤如图19所示。 第四步,创建生成报表的脚本 在画面中添加按钮用来生成报表并显示在Microsoft Web Browser控件中, 按钮脚本:
Sub OnClick(Byval Item)
On Error Resume Next
item.Enabled = False
'获取设备编号和报表日期
Dim dev_ID,timepicker
Dim date_select,strStartTime,strEndTime
Set dev_ID = ScreenItems("组合框1")'获取设备编号。"组合框2"为组合框名称
Set timepicker = ScreenItems("控件2")'获取报表日期。"控件2"为时间控件名称
date_select = FormatDateTime(timepicker.Value,2)
strStartTime = date_select & " 00:00:00.000"
strEndTime = date_select & " 23:59:59.999"
'MsgBox("strStartTime="&strStartTime)
'SQL
Dim conn '定义类对象
Dim SCon '定义数据库连接字符串
Dim oRs1 '定义获取到的数据集
Dim oCom
Dim m
Dim strSQL1
Dim ReportSelect
Dim devx: devx = "dev" & dev_ID.SelIndex
sCon= "Provider=SQLOLEDB.1; Integrated Security =SSPI;Persist Security Info=False; Initial Catalog=Hong ; Data Source=DESKTOP-VFDPROG"
strSQL1= "SELECT * FROM [dbo].["& devx &"] Where EN_T >=' "&strStartTime&" ' and EN_T =' 2021-08-04 08:57:54.000 '"
'strSQL1= "SELECT * FROM [dbo].[dev1] Where EN_T =' 2021-08-04 08:57:54.000 '"
'Where EN_T > 2021-08-04 08:57:52.000
'strSQL1= "SELECT * FROM [dbo].[dev1] Where EN_T >= #" & strStartTime & "# and EN_T = #" & strStartTime & "# and EN_T =' "&strStartTime&" ' and EN_T |