在实际应用中,客户对于WinCC变量记录的显示需求各式各样,比如在Excel或者Word中显示变量记录,以特定的表格显示历史数据等等。当WinCC集成的在线表格控件不能满足客户需要时,就需要通过自定义的方式来显示变量归档。主要分为两部分:
(1)从WinCC中读取归档数据 (2)将归档数据以特定的格式显示出来 本文档介绍从WinCC读取归档数据的通用方法,并以ListView为例,介绍如何显示归档数据。对于其它控件,客户也可以参考本文档的脚本和编程思路。 1.测试环境
表 01 2.实现方式总体思路介绍 其中,自定义函数的说明如下表所示:
表 02 具体代码见附件。 3.具体实现方法和代码 3.1 创建到归档数据库的连接 由于WinCC的变量归档为压缩数据,所以必须通过WinCC OLE DB来读取归档数据。对于已经安装WinCC的计算机,不需要安装WinCC连通性软件包。对于未安装WinCC的客户端,必须安装WinCC连通性软件包。该软件包含在WinCC V7.0的安装光盘中。 Set conn = CreateObject("ADODB.Connection") '定义数据库查询脚本(可以根据需要自定义修改) sSQL="Tag:R,'ProcessValueArchive\Tag1','0000-00-00 00:01:00.000','0000-00-00 00:00:00.000'" '通过调用自定义的数据库连接函数,建立与数据库的连接 Set oRs= WinCCDataSourceAccess(conn,sSQL) 其中,自定义的数据库连接函数WinCCDataSourceAccess(connObj,pSQL),参数connObj为连接对象(ADODB.Connection),参数pSQL为要执行的SQL查询语句,具体代码如下所示: '定义数据库连接字符串 sPro = "Provider=WinCCOLEDBProvider.1;" sDsn = "Catalog=" & DatasourceNameRT.Value & ";" sSer = "Data Source=.\WinCC" DataConnectionName = sPro + sDsn + sSer '建立连接 Set oCom = CreateObject("ADODB.Command") oCom.CommandType = 1 Set oCom.ActiveConnection = conn oCom.CommandText=sSQL '返回结果 If err.number <> 0 Then MsgBox "error Code" & Err.Number & "Source:" & Err.Source & "error description" & Err.Description End If On Error Go to 0 End Function 自定义函数的创建过程为:在WinCC项目管理器中右键点击全局脚本打开VBS全局脚本编辑器项目函数新建函数。具体如下图所示:
打开WinCC图形编辑器。在右侧的对象选项板中单击“控件”,选中“ActiveX Control”,点击右键,选择“添加移除”。在弹出菜单中,选择“Microsoft ListView Control 6.0”,点击“OK”确认。 之后,将“Microsoft ListView Control 6.0”拖动到画面编辑器中,并将对象名称设置为Control1。 3.3 添加ListView 控件的列名 '用于错误捕获和处理 Dim oRs,columnCount Set oRs=CreateObject("ADODB.Recordset") Set oRs=pRecordset '获取数据库中的列数 '定义操作的ListView对象 Set ListViewT=pListView '用查询的数据库表格列名来为ListView添加列名(*2) For AddColumnIndex=0 To columnCount-1 ListViewT.ColumnHeaders.Add , , CStr(oRs.Fields(AddColumnIndex).Name) Next MsgBox "AddColumnHeader函数报错,Source:" & Err.Source & vbCr & "Error description:" & Err.Description err.clear End If On Error Goto 0 End Function 3.4 填充ListView 控件 '获取查询记录条数 '定位到第一条记录 '定义最大的查询条目(*3) maxLine = 10 n = n + 1 Dim oItem,ListViewT 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 关闭到归档数据库的连接 Set oRs=pRecordset oRs.Close Set oRs = Nothing conn.Close Set conn = Nothing End Function 3.6 运行结果
sSQL="Tag:R,'ProcessValueArchive\Tag1','0000-00-00 00:01:00.000','0000-00-00 00:00:00.000'" 比如,如果需要动态制定查询时间,可以在画面中输入查询日期,然后通过HMIRuntime.Tags(“变量名”)来获得查询条件,再赋值给sSQL。 For AddColumnIndex=0 To columnCount-1 ListViewT.ColumnHeaders.Add , , CStr(oRs.Fields(AddColumnIndex).Name) Next (3) ListView需要填充不一样的行数和内容。 maxLine = 10 '改变此值,可以更改最大显示的条目数 n = n + 1 Dim oItem,ListViewT 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 本文档中提供的脚本尽量通用化,方便客户修改和复用。并加入了错误处理机制,保证脚本的正确运行,并提高了诊断的方便性。 声明: |
电工学习网 ( )
GMT+8, 2023-3-30 11:07