当前位置: 首页 > 工业控制产品 > 自动化控制 > 工业软件 > 组态软件

类型分类:
科普知识
数据分类:
组态软件

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

发布日期:2022-04-27 点击率:290 品牌:西门子_Siemens

    在实际应用中,客户对于WinCC变量记录的显示需求各式各样,比如在Excel或者Word中显示变量记录,以特定的表格显示历史数据等等。当WinCC集成的在线表格控件不能满足客户需要时,就需要通过自定义的方式来显示变量归档。主要分为两部分:

    (1)从WinCC中读取归档数据

    (2)将归档数据以特定的格式显示出来

    本文档介绍从WinCC读取归档数据的通用方法,并以ListView为例,介绍如何显示归档数据。对于其它控件,客户也可以参考本文档的脚本和编程思路。

    1.测试环境

    本文档基于WinCCV7.0ASIA,并通过MSWindowsCommonControls6.0ListView控件来显示读取的归档数据。需要的授权如下:

    表01

授权名称个数备注
WinCC RC V7.01 
WinCC连通性软件包V7.01订货号为: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

推荐产品

更多