『7x24小时有问必答』
本文以WinCCV8.1为例在项目中使用VBS脚本读取报警记录归档数据,并把获取的数据保存到Excel文件中。文中代码同样适用于 WinCC V7.5 和 V8.0 版本。
1访问原理

WinCC报警记录数据是以压缩的形式存储在数据库中,需要通过 WinCC连通性软件包提供的OLE-DB接口才能够解压并读取这些数据。
当使用 OLE-DB方式访问数据库时关键需要注意连接字符串的写法和查询语句的格式。连接字符串格式为“Provider= WinCCOLEDBProvider.1; Catalog= ***; Data Source= ***;”,其中:Catalog为WinCC运行数据库的名称, 当修改项目名称或在其它计算机上打开原项目时, Catalog会发生变化。建议使用WinCC内部变量 “@DatasourceNameRT” 获得当前项目的Catalog。Data Source 为服务器名称,格式为“<计算机名称>\WinCC”。

1.1 查询语句格式

查询语句的格式要求如下:

ALARMVIEWEX:SELECT * FROM <viewname>[WHERE <condition>...., optional]

其中参数信息如下所示:

ViewName:数据库表名。必须用需要的语言指定该表。

比如:中文(简体)字符表名为AlgViewExCHS,英文字符表名为AlgViewExENU。

Condition:为过滤标准。
详细说明请参见下表:

表1. 查询参数表
1.2查询结果

查询结果作为记录集返回。可以根据需要有选择的返回特定的数据集。例如:oRs.Fields(0).Value 返回的是消息的编号;oRs.Fields(2).Value 返回的是消息的时间戳;oRs.Fields(37).Value返回的是消息文本的内容。记录集的结构如下表所示:

表2. 记录集结构

表3. 记录集结构 (续表)
注意:WinCC的归档数据是使用UTC(协调世界时)时间保存的。本例中所采用的时间均为UTC时间。

2组态过程
2.1创建报警及Excel模板
1)创建变量

其中AlmTagA、AlmTagB和AlmTagC用于组态报警,MySqlStr用于动态化查询条件,BeginTime和EndTime 用于设定查询条件中的时间范围。如下图所示:

图1. 变量
2)组态报警

在报警记录中组态如下报警:

图2. 报警信息
3)创建Excel模板

在特定的路径下预先创建一个Excel文件作为模板,这样可以很好的控制输出格式。本例中在WinCC项目路径下创建一个名为“report”的文件夹并在其中创建名为“模板”的子文件夹,在report文件夹下创建一个名称为AlarmReport.xlsx的Excel模板,如下图所示:

图3. EXCEL模板
其中,“报警时间“列的数字格式设为”yyyy-m-d hh:mm:ss“,如下图所示:
图3. 时间格式
2.2组态查询界面

画面上新建五个按钮,上面的四个按钮分别用于设置不同的查询条件。

图5.   查询界面
按钮下方的静态文本用于显示查询条件。
最下方的按钮用于执行查询报警记录的VBS脚本。其中查询条件的设定是通过按钮的直接连接方式实现。
在按钮属性对话框的鼠标动作事件中,设置查询条件。
其中,图5中第一行的三个按钮使用直接连接的方式,如下图所示:
图6. 按钮直接连接配置
图5中第二行设置时间范围的按钮使用脚本来设置报警记录的查询时间范围,如下图所示:
图7. VBS脚本设置查询时间范围

2.3 详细脚本介绍
1)打开Excel模板

以后台方式打开之前创建好的Excel模板。其中sheetname作为变量可以定义Excel中Sheet的名字。需要注意模板文件的存储路径。

Set objExcelApp = CreateObject("Excel.Application")

objExcelApp.Visible = False

objExcelApp.Workbooks.Open HMIRuntime.ActiveProject.Path&"\Report\模板\AlarmReport.xlsx"

objExcelApp.Worksheets(sheetname).Activate

2)准备查询条件

主要是确定和格式化Catalog和查询条件。关键脚本如下:

'准备查询条件 Catalog

Set tagDSNName = HMIRuntime.Tags("@DatasourceNameRT")

tagDSNName.Read

‘拼接查询条件

MySqlStr.Read

sSql = "ALARMVIEWEX:Select * FROM AlgViewExCHS "&MySqlStr.Value

其中MySqlStr为定义的内部字符串类型的变量,当点击查询条件中的按钮时 ,就会把相应的查询条件字符串传给该变量(需要根据项目的实际情况调整查询条件)。本例中的四条查询条件的完整语句如下图所示:

图8. 查询条件
3)完整的代码

'变量定义和初始化

Dim sPro,sDsn,sSer,sCon,conn,sSql,oRs,oCom

Dim tagDSNName

Dim m,i

Dim objExcelApp,objExcelBook,objExcelSheet,sheetname

Dim MySqlStr

Set MySqlStr = HMIRuntime.Tags("MySqlStr")

item.Enabled = False

'On Error Resume Next

sheetname="Sheet1"

'打开Excel模板

Set objExcelApp = CreateObject("Excel.Application")

objExcelApp.Visible = False

objExcelApp.Workbooks.Open HMIRuntime.ActiveProject.Path&"\Report\模板\AlarmReport.xlsx"

objExcelApp.Worksheets(sheetname).Activate

'准备查询条件 Catalog

Set tagDSNName = HMIRuntime.Tags("@DatasourceNameRT")

tagDSNName.Read

'创建数据库联接

sPro = "Provider=WinCCOLEDBProvider.1;"

sDsn = "Catalog=" &tagDSNName.Value& ";"

sSer = "Data Source=.\WinCC"

sCon = sPro + sDsn + sSer

Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = sCon

conn.CursorLocation = 3

conn.Open

'定义查询的命令文本 SQL

MySqlStr.Read

sSql = "ALARMVIEWEX:Select * FROM AlgViewExCHS "&MySqlStr.Value

HMIRuntime.Trace "Sql is: " & sSql & vbCrLf

Set oRs = CreateObject("ADODB.Recordset")

Set oCom = CreateObject("ADODB.Command")

oCom.CommandType = 1

Set oCom.ActiveConnection = conn

oCom.CommandText = sSql

'填充数据到Excel中

Set oRs = oCom.Execute

m = oRs.RecordCount

If (m > 0) Then

oRs.MoveFirst

i=3

Do While Not oRs.EOF '是否到记录末尾,循环填写表格

objExcelApp.Worksheets(sheetname).cells(i,1).value= CStr(oRs.Fields(0).Value)

Select Case oRs.Fields(1).Value
Case 1: objExcelApp.Worksheets(sheetname).cells(i,2).value= "已到达"
Case 2: objExcelApp.Worksheets(sheetname).cells(i,2).value= "已离开"
Case 3: objExcelApp.Worksheets(sheetname).cells(i,2).value= "已确认"
Case 16: objExcelApp.Worksheets(sheetname).cells(i,2).value= "确认-系统"
End Select

objExcelApp.Worksheets(sheetname).cells(i,3).value= CStr(oRs.Fields(2).Value)

objExcelApp.Worksheets(sheetname).cells(i,4).value= CStr(oRs.Fields(37).Value)

oRs.MoveNext

i=i+1

Loop

oRs.Close

Else

MsgBox "没有所需数据……"

item.Enabled = True

Set oRs = Nothing

conn.Close

Set conn = Nothing

objExcelApp.Workbooks.Close

objExcelApp.Quit

Set objExcelApp= Nothing

Exit Sub

End If

'释放资源

Set oRs = Nothing

conn.Close

Set conn = Nothing

'生成新的文件,关闭Excel

Dim patch,filename

filename=CStr(Year(Now))&CStr(Month(Now))&CStr(Day(Now))&CStr(Hour(Now))+CStr(Minute(Now))&CStr(Second(Now))

patch= hmiruntime.ActiveProject.Path & "\Report\AlarmReport_"&filename&".xlsx"

objExcelApp.ActiveWorkbook.SaveAs patch

objExcelApp.Workbooks.Close

objExcelApp.Quit

Set objExcelApp= Nothing

MsgBox "成功生成数据文件!"

item.Enabled = True

3结果
下图为程序执行的结果:

图9. 输出结果
图10. 报表内容
微信群:PLC自动化技术交流(加好友入群,请标注:姓名-单位)工控王工18873166826
S7_1200配方功能快速入门

</condition></viewname>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码