通过VBS脚本在ListView控件中显示WinCC的变量记录

时间:2023-03-18作者:佚名
在实际应用中,客户对于WinCC变量记录的显示需求各式各样,比如在Excel或者Word中显示变量记录,以特定的表格显示历史数据等等。当WinCC集成的在线表格控件不能满足客户需要时,就需要通过自定义的方式来显示变量归档。主要分为两部分:
(1)从WinCC中读取归档数据
(2)将归档数据以特定的格式显示出来
本文档介绍从WinCC读取归档数据的通用方法,并以ListView为例,介绍如何显示归档数据。对于其它控件,客户也可以参考本文档的脚本和编程思路。

1.测试环境
本文档基于WinCC V7.0 ASIA,并通过MS Windows Common Controls 6.0 ListView 控件来显示读取的归档数据。需要的授权如下:

授权名称 个数 备注
WinCC RC V7.0 1
WinCC连通性软件包V7.0 1 订货号为:6AV6371-1DR07-0AX0,授权通过WinCC OLE DB访问过程值归档。

表 01

2.实现方式总体思路介绍
本文档通过调用WinCC OLE DB数据库接口驱动(需要WinCC连通性软件包的授权)来访问WinCC的变量归档,并在微软的ListView控件中显示归档数据。程序结构如下所示:

通过VBS脚本在ListView控件中显示WinCC的变量记录
图1

其中,自定义函数的说明如下表所示:

函数名称 功能
WinCCDataSourceAccess(connObj, pSQL) 建立到数据库的连接。参数connObj为连接对象(ADODB.Connection),参数pSQL为要执行的SQL查询语句
WinCCDataSourceClose(pRecordset, connObj) 断开与数据库的连接,释放资源。参数pRecordset为ADODO.RecordSet对象,参数connObj为连接对象(ADODB.Connection)
AddListViewHeaderColumn(pRecordset, pListView) 添加ListView的列名。参数pRecordset为ADODO.RecordSet对象,参数pListView为ListView对象
FillListView (pRecordset, pListView) 参数pRecordset为ADODO.RecordSet对象,参数pListView为ListView对象。

表 02

具体代码见附件。

3.具体实现方法和代码

3.1 创建到归档数据库的连接

由于WinCC的变量归档为压缩数据,所以必须通过WinCC OLE DB来读取归档数据。对于已经安装WinCC的计算机,不需要安装WinCC连通性软件包。对于未安装WinCC的客户端,必须安装WinCC连通性软件包。该软件包含在WinCC V7.0的安装光盘中。
数据库连接的脚本如下所示:
'定义数据库连接变量
Dim conn

Set conn = CreateObject("ADODB.Connection")

'定义数据库查询脚本(可以根据需要自定义修改)
Dim sSQL

sSQL="Tag:R,'ProcessValueArchiveTag1','0000-00-00 00:01:00.000','0000-00-00 00:00:00.000'"

'通过调用自定义的数据库连接函数,建立与数据库的连接
Dim oRs

Set oRs= WinCCDataSourceAccess(conn,sSQL)

其中,自定义的数据库连接函数WinCCDataSourceAccess(connObj,pSQL),参数connObj为连接对象(ADODB.Connection),参数pSQL为要执行的SQL查询语句,具体代码如下所示:
Function WinCCDataSourceAccess(connObj,pSQL)
'建立到数据库的连接
On Error Resume Next
'读取本地的WinCC运行数据库名称
Dim DatasourceNameRT,DataConnectionName
Set DatasourceNameRT = hmiRuntime.Tags("@DatasourceNameRT")
DatasourceNameRT.Read

'定义数据库连接字符串
Dim sPro, sDsn,sSer

sPro = "Provider=WinCCOLEDBProvider.1;"

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

sSer = "Data Source=.WinCC"

DataConnectionName = sPro sDsn sSer
' 定义查询语句字符串
Dim sSQL
sSQL=pSQL

'建立连接
Dim oRs,oCom,conn
Set conn = CreateObject("ADODB.Connection")
Set conn=connObj
conn.ConnectionString = DataConnectionName
conn.CursorLocation = 3
conn.Open
' 创建查询的命令文本
Set oRs = CreateObject("ADODB.Recordset")

Set oCom = CreateObject("ADODB.Command")

oCom.CommandType = 1

Set oCom.ActiveConnection = conn

oCom.CommandText=sSQL
'执行查询
Set oRs = oCom.Execute

'返回结果
Set WinCCDataSourceAccess=oRs

If err.number <> 0 Then

MsgBox "error Code" & Err.Number & "Source:" & Err.Source & "error description" & Err.Description
err.clear

End If

On Error Go to 0

End Function

自定义函数的创建过程为:在WinCC项目管理器中右键点击全局脚本打开VBS全局脚本编辑器项目函数新建函数。具体如下图所示:

通过VBS脚本在ListView控件中显示WinCC的变量记录
图2
3.2 注册Microsoft ListView Control 6.0控件

打开WinCC图形编辑器。在右侧的对象选项板中单击“控件”,选中“ActiveX Control”,点击右键,选择“添加移除”。在弹出菜单中,选择“Microsoft ListView Control 6.0”,点击“OK”确认。

通过VBS脚本在ListView控件中显示WinCC的变量记录
图3

之后,将“Microsoft ListView Control 6.0”拖动到画面编辑器中,并将对象名称设置为Control1。
注意:在脚本中,当定义ListView对象时用到对象名称Control1。详情请参考图1的步骤2。

3.3 添加ListView 控件的列名
在ListView中添加列名,步骤如图1的步骤3。自定义函数AddListViewHeaderColumn(pRecordset, pListView)的具体代码如下所示:
Function AddColumnHeader(pRecordset, pListView)
'添加ListView列名

'用于错误捕获和处理
On Error Resume Next

Dim oRs,columnCount

Set oRs=CreateObject("ADODB.Recordset")

Set oRs=pRecordset

'获取数据库中的列数
columnCount=oRs.Fields.Count

'定义操作的ListView对象
Dim ListViewT

Set ListViewT=pListView
'清空ListView对象的列数
ListViewT.ColumnHeaders.Clear

'用查询的数据库表格列名来为ListView添加列名(*2)
Dim AddColumnIndex

For AddColumnIndex=0 To columnCount-1

ListViewT.ColumnHeaders.Add , , CStr(oRs.Fields(AddColumnIndex).Name)

Next
'发生错误,提示消息框
If err.number <> 0 Then

MsgBox "AddColumnHeader函数报错,Source:" & Err.Source & vbCr & "Error description:" & Err.Description

err.clear

End If

On Error Goto 0

End Function

3.4 填充ListView 控件
在ListView中添加列名,步骤如图1的步骤4。自定义函数FillListView (pRecordset, pListView) 的具体代码如下所示:
Function FillListView(pRecordset,pListView)
'用数据库查询的值填充ListView
On Error Resume Next

'获取查询记录条数
Dim recordsCount,oRs
Set oRs=CreateObject("ADODB.Recordset")
Set oRs=pRecordset
recordsCount=oRs.RecordCount

'定位到第一条记录
If (recordsCount > 0) Then
oRs.MoveFirst

'定义最大的查询条目(*3)
Dim maxLine,n

maxLine = 10
n=0
'填充数据值列
Do While (Not oRs.EOF And n < maxLine)

n = n 1

Dim oItem,ListViewT
Set ListViewT=pListView
Set oItem = ListViewT.ListItems.Add()

oItem.text = oRs.Fields(0).Value

oItem.SubItems(1) = oRs.Fields(1).Value

oItem.SubItems(2) = FormatNumber(oRs.Fields(2).Value, 4)

oItem.SubItems(3) = Hex(oRs.Fields(3).Value)

oItem.SubItems(4) = Hex(oRs.Fields(4).Value)

oRs.MoveNext

Loop

3.5 关闭到归档数据库的连接
关闭与数据库的连接并释放资源,步骤如图1的步骤5。自定义函数WinCCDataSourceClose(pRecordset, connObj)的具体代码如下图所示:
Function WinCCDataSourceClose(pRecordset,connObj)
'关闭数据库连接,释放资源
'获取连接和查询对象
Dim oRs,conn

Set oRs=pRecordset
Set conn=connObj

oRs.Close

Set oRs = Nothing

conn.Close

Set conn = Nothing

End Function

3.6 运行结果
本文档介绍的脚本,其运行结果如下图所示:

通过VBS脚本在ListView控件中显示WinCC的变量记录
图4
3.7 更改代码以满足更广泛的需求
对于不同客户的定制化需求,可以通过修改少量代码实现。
(1) 不同的查询需求,修改sSQL变量的值。
'修改变量sSQL的值
Dim sSQL

sSQL="Tag:R,'ProcessValueArchiveTag1','0000-00-00 00:01:00.000','0000-00-00 00:00:00.000'"

比如,如果需要动态制定查询时间,可以在画面中输入查询日期,然后通过HMIRuntime.Tags(“变量名”)来获得查询条件,再赋值给sSQL。
(2) ListView需要使用不同的列名。
修改函数AddListViewHeaderColumn中的如下内容:
‘用查询的数据库表格列名来为ListView添加列名 (*2)
Dim AddColumnIndex

For AddColumnIndex=0 To columnCount-1

ListViewT.ColumnHeaders.Add , , CStr(oRs.Fields(AddColumnIndex).Name)

Next

(3) ListView需要填充不一样的行数和内容。
修改函数FillListView中的如下内容:
Dim maxLine,n

maxLine = 10 '改变此值,可以更改最大显示的条目数
n=0
'修改填充内容,请修改下面Do While循环中的代码
Do While (Not oRs.EOF And n < maxLine)

n = n 1

Dim oItem,ListViewT
Set ListViewT=pListView
Set oItem = ListViewT.ListItems.Add()

oItem.text = oRs.Fields(0).Value

oItem.SubItems(1) = oRs.Fields(1).Value

oItem.SubItems(2) = FormatNumber(oRs.Fields(2).Value, 4)

oItem.SubItems(3) = Hex(oRs.Fields(3).Value)

oItem.SubItems(4) = Hex(oRs.Fields(4).Value)

oRs.MoveNext

Loop

本文档中提供的脚本尽量通用化,方便客户修改和复用。并加入了错误处理机制,保证脚本的正确运行,并提高了诊断的方便性。

声明:
本文所述的方法为WinCC的高级用法,提供的代码程序仅供用户参考,西门子公司不提供任何调试和热线支持。敬请谅解!

相关阅读

PLC控制柜的五大关键接线规范

在工业自动化领域,PLC(可编程逻辑控制器)控制柜作为核心控制设备,其接线规范直接关系到系统的稳定运行与维护效率。以下是PLC控制柜在接线过程中必须遵循的五大关键规范: 1. 合理...
2024-08-12
PLC控制柜的五大关键接线规范

三线圈变压器差动保护的正确接线方法

差动保护是变压器的主保护,其接线正确与否,将对安全运行造成较大的影响。随着农业用电的不断发展。目前大多数的县先后新建了110千伏或更高的电压等级变电所,随之而来的是较...
2023-03-21
三线圈变压器差动保护的正确接线方法

四种晶体管开关电路详解

“晶体管开关”,是使用晶体管控制电路通断的开关。根据实际应用场景,也称“模拟开关(analog Switch)”或“逻辑开关(Logic Switch)”。它或许是一些电子发烧友们DIY时遇到的第一个电路...
2023-06-12
四种晶体管开关电路详解

10kV开闭所(变电所)的继电保护配置整定方案

大部分工厂企业及居民小区用电是10kV供电,并设置配电房,一般情况下一个配电房安装一台或两台10kV/400V的配电变压器,用380V/220V电压供用户用电,一次系统接线图,如下图。 配电...
2024-08-21
10kV开闭所(变电所)的继电保护配置整定方案

三种常见的陶瓷电容器及其特点

陶瓷电容器是以陶瓷材料为介质的电容器总称,品种繁多,外形尺寸相差甚大。按使用电压可分为高压、中压、低压3种陶瓷电容器。按温度系数、介电常数不同又可分为负温度系数、正...
2023-03-31
三种常见的陶瓷电容器及其特点

热销商品

国标TRVV高柔性拖链电缆2—48芯0.3 0.5 1 1.5 2.5平方耐弯折软线

国标TRVV高柔性拖链电缆,专为满足严苛工况下的动态传输需求而设计。该电缆具有2至48芯多种配置,适用于0.3、0.5、1.5、2.5平方等多种截面积选择,灵活满足不同设备的...
¥ 1.24

公牛开关插座面板全屋定制全屋配齐家装报价单官方正品付款链接Q9

公牛开关插座面板,为您的全屋定制家装提供一站式解决方案。我们提供全屋配齐的家装报价单,确保您的家装项目完美无缺。所有产品均为官方正品,品质保证,让您用得放心。...
¥ 1

定做定制各类密封条三元乙丙橡胶硅胶PVC防火阻燃EVA氯丁石墨丁晴

本公司专业定做各类定制密封条,涵盖三元乙丙橡胶(EPDM)、硅胶、PVC、EVA、氯丁橡胶、丁腈橡胶及石墨复合等多种材质,满足不同行业对密封、防水、隔音、隔热及防火阻燃...
¥ 1

直销配电箱暗插销铰链门轴CL225插销带螺丝固定铁皮柜弹簧铁铰链

CL225插销式暗铰链专为配电箱、铁皮柜等金属柜体设计,采用优质冷轧钢板经冲压成型,表面镀锌处理,防腐耐用。其内置弹簧结构,确保柜门开合顺畅、自动复位,提升使用便捷...
¥ 0.06

浇铸抛光螺纹钢扭矩扳手 镀锌双头延长杆扳手多功能工具 开口扳手

这款多功能工具集浇铸抛光螺纹钢扭矩扳手、镀锌双头延长杆扳手与开口扳手于一体,采用优质合金钢精密浇铸并经抛光处理,表面镀锌防锈,耐用性强。其双头设计适配多种规...
¥ 0.6

网站栏目