访问WinCC归档数据库的方法
WinCC归档数据库介绍WinCC的历史工艺数据和报警消息保存在SQL Server数据库,数据以分段和压缩形式储存,不方便直接通过SQL去读取,用WinCC OLE DB Provider访问这些数据时会自动合并分段并解压缩数据。安装ConnectivityPackWinCC OLE DB provider由WinCC的ConnectivityPack选件提供,在安装WinCC时需要安装ConnectivityPack。在提供数据的WinCC的计算机需安装ConnectivityPack server,读取数据的计算机上安装ConnectivityPack client,可以在计算机上同时安装ConnectivityPack server和ConnectivityPack client。
在SQL Server中通过链接服务器访问归档数据库创建链接服务器安装了WinCC的计算机中,启动WinCC项目时会自动创建链接服务器。在未安装WinCC的计算机需要手动创建链接服务器。打开SQL Server Management Studio,在对象资源管理器中,展开“服务器对象”,右键单击“链接服务器”,然后单击“新建链接服务器”。
如下图填入链接服务器信息,数据源(Data Source)中填入WinCC服务器的数据库完整实例名,目录(Catalog)中填入归档数据库名。
使用OPENQUERY查询连接服务器查询链接数据库使用OPENQUERY,传递给OPENQUERY查询语句不同于SQL,是WinCC的特定查询语句,可通过变量ID或变量名查询。如下:select * from openquery(LnkRtDb_WinCCOLEDB,'Tag:R,1,''0000-00-00 01:00:00.000'',''0000-00-00 00:00:00.000''')使用变量ID查询:
使用变量名查询:
在SQL Server中通过OPENDATASOURCE访问归档数据库通过OPENDATASOURCE()函数可直接查询OLE DB数据源,语法如下:SELECT *FROM OPENDATASOURCE('WinCCOleDbProvider.1','Provider=WinCC OLEDB Provider for Archives;Catalog=CC_WinCCSer_19_02_14_10_59_03R;Data Source=WIN-54UD17PRU0N\WINCC').N'Tag:R,1,''0000-00-00 00:10:00.000'',''0000-00-00 00:00:00.000'''
通过存储过程访问归档数据库存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。适用于WinCC归档数据库的存储过程有哪些如下图的路径,在System Databases -> master数据库下有部分存储过程,在WinCC项目程序对应的数据库下也有部分存储过程。
大部分存储过程都找不到对应的使用说明,下面对已知的几个存储过程简单介绍。cp_TagStatisticcp_TagStatistic是对过程值统计分析的存储过程,它的使用方法在官方文档中有描述。CC_SP_ReadTags是一个读取过程值的存储过程,查询到的值会被存储到一个临时表中。在SQL Server中CC_SP_ReadTags源代码是被加密的,从网络上查到的源代码如下,仅做参考:+ View Code
CC_SP_ReadTags的参数说明如下:参数说明@List变量列表@TimeBegin查询的起始时间@TimeEnd结束时间@WHEREClause过滤条件@ORDERBYClause排序@Timestep时间间隔(以秒计),格式为’TimeStep=60’@Aggregationmode汇总类型(定义时间间隔结果)@TempTable临时表名称,默认值为“TlgDataTmp”@SymDataSource建立链接服务器的数据源@SymCatalog建立链接服务器的数据目录@LS_Name指定要使用的链接服务器语句示例:USE [CC_WinCCSer_19_02_14_10_59_03R]GOIF OBJECT_ID('tempdb..##TagsTempTable') is not NULLDROP Table ##TagsTempTableDECLARE @return_value intEXEC @return_value = [dbo].[CC_SP_ReadTags]@List = N'archive1\tag1;archive1\tag2',@TimeBegin = N'0000-00-00 00:01:00',@TimeEnd = N'0000-00-00 00:00:00',@WHEREClause = default,@ORDERBYClause = default,@Timestep = default,@Aggregationmode = default,@TempTable = N'##TagsTempTable',@SymDataSource = default,@SymCatalog = default,@LS_Name = N'LnkRtDb_WinCCOLEDB'SELECT 'Return Value' = @return_valueGO
重新排列数据上面的示例图片中查询出的数据是以列的形式排序的,通过下面代码可以把相同时间戳的数据放在同一行。1234567891011121314151617181920212223242526272829303132declare @TimeBegin datetime = '2020-09-03 00:00:00.000';declare @TimeEnd datetime = '2020-09-04 00:00:00.000';declare @TimeStep nvarchar(64) = '10'Declare @List Varchar(1000) = N'SysInfo\CPU_1;SysInfo\CPU_2;SysInfo\CPU_3;SysInfo\CPU_4'declare @strTimeBegin nvarchar(64) = format(Dateadd(hh, DATEDIFF(hh,GETDATE(),GETUTCDATE()), @TimeBegin),'yyyy-MM-dd HH:mm:ss.fff')declare @strTimeEnd nvarchar(64) = format(Dateadd(hh, DATEDIFF(hh,GETDATE(),GETUTCDATE()), @TimeEnd),'yyyy-MM-dd HH:mm:ss.fff')declare @strTimeStep nvarchar(500)if @TimeStep<>''set @strTimeStep = N', ''''TimeStep=' + @TimeStep +',1'''' 'elseset @strTimeStep = ''declare @temp table(ValueID bigint,TimeStamp datetime,RealValue float,Quality int,Flags int)declare @SQL nvarchar(1000)set @SQL = 'select * from openquery(LnkRtDb_WinCCOLEDB,''Tag:R,('+@List+'), '''''+@strTimeBegin+''''' ,'''''+@strTimeEnd+''''' ' +@strTimeStep+ ' '')'insert into @temp exec(@SQL)SELECT Dateadd(hh, DATEDIFF(hh,GETUTCDATE(),GETDATE()), [TimeStamp]) AS TimeStamp, [1] AS CPU_1, [2] AS CPU_2, [3] AS CPU_3, [4] AS CPU_4From(SELECT [ValueID], [TimeStamp], [RealValue] from @temp ) AS SourceTablePIVOT (max(Realvalue) for ValueID in ([1],[2],[3],[4])) AS PivotTableorder by PivotTable.TimeStamp用VB脚本访问归档数据库创建数据库连接12345dim connSet conn = CreateObject('ADODB.Connection')conn.ConnectionString = 'Provider=WinCCOLEDBProvider.1;Catalog=CC_OpenArch_03_05_27_14_11_46R; Data Source=.\WinCC'conn.CursorLocation = 3conn.open查询数据库1234Dim rs, SqlSet rs = CreateObject('ADODB.Recordset')Sql = 'Tag:R,1,''0000-00-00 00:10:00.000'',''0000-00-00 00:00:00.000'''rs.Open Sql, conn, 1, 3访问另一台电脑的WinCC归档数据库假如有两台电脑,命名为A和B,A和B电脑上都安装了ConnectivityPack,从A电脑上通过WinCCOleDbProvider.1去访问B电脑中的WinCC归档数据库,需要按照如下做法:B电脑的SQL Server数据库中要给A电脑的Windows账户添加访问权限。因为WinCCOleDbProvider.1访问需要通过Windows账户认证,没有从资料中查到如何使用SQL Server账户认证。Data Source使用B电脑的数据库地址,Catalog使用B电脑WinCC数据库名。下图使用openDatasource访问方法进行测试,本地电脑A为WIN-OJHUAJ0TT67,远程电脑B为192.168.248.128: