发布日期:2022-04-27 点击率:290 品牌:西门子_Siemens
在实际应用中,客户对于WinCC变量记录的显示需求各式各样,比如在Excel或者Word中显示变量记录,以特定的表格显示历史数据等等。当WinCC集成的在线表格控件不能满足客户需要时,就需要通过自定义的方式来显示变量归档。主要分为两部分:
(1)从WinCC中读取归档数据
(2)将归档数据以特定的格式显示出来
本文档介绍从WinCC读取归档数据的通用方法,并以ListView为例,介绍如何显示归档数据。对于其它控件,客户也可以参考本文档的脚本和编程思路。
1.测试环境
本文档基于WinCCV7.0ASIA,并通过MSWindowsCommonControls6.0ListView控件来显示读取的归档数据。需要的授权如下:
表01
授权名称 | 个数 | 备注 |
WinCC RC V7.0 | 1 | |
WinCC连通性软件包V7.0 | 1 | 订货号为:6AV6371-1DR07-0AX0,授权通过WinCC OLE DB访问过程值归档。 |
2.实现方式总体思路介绍
本文档通过调用WinCCOLEDB数据库接口驱动(需要WinCC连通性软件包的授权)来访问WinCC的变量归档,并在微软的ListView控件中显示归档数据。程序结构如下所示:
图1
其中,自定义函数的说明如下表所示:
表02
函数名称 | 功能 |
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对象。 |
具体代码见附件。
3.具体实现方法和代码
3.1创建到归档数据库的连接
由于WinCC的变量归档为压缩数据,所以必须通过WinCCOLEDB来读取归档数据。对于已经安装WinCC的计算机,不需要安装WinCC连通性软件包。对于未安装WinCC的客户端,必须安装WinCC连通性软件包。该软件包含在WinCCV7.0的安装光盘中。
数据库连接的脚本如下所示:
'定义数据库连接变量
Dimconn
Setconn=CreateObject("ADODB.Connection")
'定义数据库查询脚本(可以根据需要自定义修改)
DimsSQL
sSQL="Tag:R,'ProcessValueArchiveTag1','0000-00-0000:01:00.000','0000-00-0000:00:00.000'"
'通过调用自定义的数据库连接函数,建立与数据库的连接
DimoRs
SetoRs=WinCCDataSourceAccess(conn,sSQL)
其中,自定义的数据库连接函数WinCCDataSourceAccess(connObj,pSQL),参数connObj为连接对象(ADODB.Connection),参数pSQL为要执行的SQL查询语句,具体代码如下所示:
FunctionWinCCDataSourceAccess(connObj,pSQL)
'建立到数据库的连接
OnErrorResumeNext
'读取本地的WinCC运行数据库名称
DimDatasourceNameRT,DataConnectionName
SetDatasourceNameRT=HMIRuntime.Tags("@DatasourceNameRT")
DatasourceNameRT.Read
'定义数据库连接字符串
DimsPro,sDsn,sSer
sPro="Provider=WinCCOLEDBProvider.1;"
sDsn="Catalog="&DatasourceNameRT.Value&";"
sSer="DataSource=.WinCC"
DataConnectionName=sPro+sDsn+sSer
'定义查询语句字符串
DimsSQL
sSQL=pSQL
'建立连接
DimoRs,oCom,conn
Setconn=CreateObject("ADODB.Connection")
Setconn=connObj
conn.ConnectionString=DataConnectionName
conn.CursorLocation=3
conn.Open
'创建查询的命令文本
SetoRs=CreateObject("ADODB.Recordset")
SetoCom=CreateObject("ADODB.Command")
oCom.CommandType=1
SetoCom.ActiveConnection=conn
oCom.CommandText=sSQL
'执行查询
SetoRs=oCom.Execute
'返回结果
SetWinCCDataSourceAccess=oRs
Iferr.number<>0Then
MsgBox"errorCode"&Err.Number&"Source:"&Err.Source&"errordescription"&Err.Description
err.clear
EndIf
OnErrorGoto0
EndFunction
自定义函数的创建过程为:在WinCC项目管理器中右键点击全局脚本?打开VBS全局脚本编辑器?项目函数?新建函数。具体如下图所示:
图2
3.2注册MicrosoftListViewControl6.0控件
打开WinCC图形编辑器。在右侧的对象选项板中单击“控件”,选中“ActiveXControl”,点击右键,选择“添加移除”。在弹出菜单中,选择“MicrosoftListViewControl6.0”,点击“OK”确认。
图3
之后,将“MicrosoftListViewControl6.0”拖动到画面编辑器中,并将对象名称设置为Control1。
注意:在脚本中,当定义ListView对象时用到对象名称Control1。详情请参考图1的步骤2。
3.3添加ListView控件的列名
在ListView中添加列名,步骤如图1的步骤3。自定义函数AddListViewHeaderColumn(pRecordset,pListView)的具体代码如下所示:
FunctionAddColumnHeader(pRecordset,pListView)
'添加ListView列名
'用于错误捕获和处理
OnErrorResumeNext
DimoRs,columnCount
SetoRs=CreateObject("ADODB.Recordset")
SetoRs=pRecordset
'获取数据库中的列数
columnCount=oRs.Fields.Count
'定义操作的ListView对象
DimListViewT
SetListViewT=pListView
'清空ListView对象的列数
ListViewT.ColumnHeaders.Clear
'用查询的数据库表格列名来为ListView添加列名(*2)
DimAddColumnIndex
ForAddColumnIndex=0TocolumnCount-1
ListViewT.ColumnHeaders.Add,,CStr(oRs.Fields(AddColumnIndex).Name)
Next
'发生错误,提示消息框
Iferr.number<>0Then
MsgBox"AddColumnHeader函数报错,Source:"&Err.Source&vbCr&"Errordescription:"&Err.Description
err.clear
EndIf
OnErrorGoto0
EndFunction
3.4填充ListView控件
在ListView中添加列名,步骤如图1的步骤4。自定义函数FillListView(pRecordset,pListView)的具体代码如下所示:
FunctionFillListView(pRecordset,pListView)
'用数据库查询的值填充ListView
OnErrorResumeNext
'获取查询记录条数
DimrecordsCount,oRs
SetoRs=CreateObject("ADODB.Recordset")
SetoRs=pRecordset
recordsCount=oRs.RecordCount
'定位到第一条记录
If(recordsCount>0)Then
oRs.MoveFirst
'定义最大的查询条目(*3)
DimmaxLine,n
maxLine=10
n=0
'填充数据值列
DoWhile(NotoRs.EOFAndn<maxLine)
n=n+1
DimoItem,ListViewT
SetListViewT=pListView
SetoItem=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)=he(oRs.Fields(3).Value)
oItem.SubItems(4)=he(oRs.Fields(4).Value)
oRs.MoveNext
Loop
3.5关闭到归档数据库的连接
关闭与数据库的连接并释放资源,步骤如图1的步骤5。自定义函数WinCCDataSourceClose(pRecordset,connObj)的具体代码如下图所示:
FunctionWinCCDataSourceClose(pRecordset,connObj)
'关闭数据库连接,释放资源
'获取连接和查询对象
DimoRs,conn
SetoRs=pRecordset
Setconn=connObj
oRs.Close
SetoRs=Nothing
conn.Close
Setconn=Nothing
EndFunction
3.6运行结果
本文档介绍的脚本,其运行结果如下图所示:
图4
3.7更改代码以满足更广泛的需求
对于不同客户的定制化需求,可以通过修改少量代码实现。
(1)不同的查询需求,修改sSQL变量的值。
'修改变量sSQL的值
DimsSQL
sSQL="Tag:R,'ProcessValueArchiveTag1','0000-00-0000:01:00.000','0000-00-0000:00:00.000'"
比如,如果需要动态制定查询时间,可以在画面中输入查询日期,然后通过HMIRuntime.Tags(“变量名”)来获得查询条件,再赋值给sSQL。
(2)ListView需要使用不同的列名。
修改函数AddListViewHeaderColumn中的如下内容:
‘用查询的数据库表格列名来为ListView添加列名(*2)
DimAddColumnIndex
ForAddColumnIndex=0TocolumnCount-1
ListViewT.ColumnHeaders.Add,,CStr(oRs.Fields(AddColumnIndex).Name)
Next
(3)ListView需要填充不一样的行数和内容。
修改函数FillListView中的如下内容:
DimmaxLine,n
maxLine=10'改变此值,可以更改最大显示的条目数
n=0
'修改填充内容,请修改下面DoWhile循环中的代码
DoWhile(NotoRs.EOFAndn<maxLine)
n=n+1
DimoItem,ListViewT
SetListViewT=pListView
SetoItem=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)=he(oRs.Fields(3).Value)
oItem.SubItems(4)=he(oRs.Fields(4).Value)
oRs.MoveNext
Loop
本文档中提供的脚本尽量通用化,方便客户修改和复用。并加入了错误处理机制,保证脚本的正确运行,并提高了诊断的方便性。
声明:
本文所述的方法为WinCC的高级用法,提供的代码程序仅供用户参考,西门子公司不提供任何调试和热线支持。敬请谅解!
下一篇: PLC、DCS、FCS三大控
上一篇: 索尔维全系列Solef?PV