访问WinCC归档数据库的方法 | 您所在的位置:网站首页 › wincc写入数据库 › 访问WinCC归档数据库的方法 |
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
创建链接服务器
使用OPENQUERY查询连接服务器
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据
用VB脚本访问归档数据库
创建数据库连接
查询数据库
访问另一台电脑的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源代码是被加密的,从网络上查到的源代码如下,仅做参考: USE CC_SIR_16_07_29_11_30_35R GO SET ANSI_NULLS ON SET QUOTED_IDENTIFIER OFF GO CREATE PROCEDURE [dbo].[CC_SP_ReadTags] ( @List varchar(1000), @TimeBegin varchar(32), @TimeEnd varchar(32), @WHEREClause varchar(1000)= NULL, @ORDERBYClause varchar(1000) = NULL, @Timestep varchar(500) = NULL, @Aggregationmode int = 0, @SymDataSource varchar(512) = NULL, @SymCatalog varchar(512) = NULL, @LS_Name varchar(255)=NULL ) WITH encryption AS BEGIN SET NOCOUNT ON --DECLARE @LS_Name varchar(255) DECLARE @Catalogname varchar(255) DECLARE @Internal_LS bit DECLARE @NoTime bit SET @Internal_LS = 0 -- check valid datetime or Aggregationmode = 0 DECLARE @ret int SET @ret = ISDATE(@TimeBegin) IF (@ret = 0 and @Aggregationmode 0) RETURN IF ISNULL(@LS_Name,'') = '' BEGIN SET @LS_Name = 'CA_'+ CAST(@@SPID as varchar(10)) SET @Catalogname = DB_NAME() if @SymDataSource = NULL set @SymDataSource = 'Hallo' if ISNULL(@SymDataSource,'') = '' or ISNULL(@SymCatalog,'') = '' BEGIN EXEC sp_addlinkedserver @server = @LS_Name,@srvproduct = 'CommonArchiving', @provider = 'WinCCOLEDBProvider', @datasrc = @@servername, @catalog = @CatalogName set @Internal_LS = 1 END ELSE BEGIN EXEC sp_addlinkedserver @server = @LS_Name,@srvproduct = 'CommonArchiving', @provider = 'WinCCOLEDBProvider', @datasrc = @SymDataSource, @catalog = @SymCatalog set @Internal_LS = 1 END END DECLARE @Statement varchar(8000) SET @Statement = '' SET @Statement = 'SELECT * FROM OPENQUERY('+@LS_Name+',''Tag:R,('+@List+'),'''''+@TimeBegin+''''','''''+@TimeEnd+'''''' IF(LEN(@TimeStep) 0) BEGIN SET @Statement = @Statement + ',' + @Timestep + ',' + CAST(@Aggregationmode AS VARCHAR(6)) END SET @Statement = @Statement + ' '') ' IF(LEN(@WHEREClause) 0) BEGIN SET @Statement = @Statement + @WHEREClause END IF(LEN(@ORDERBYClause) 0) BEGIN SET @Statement = @Statement + ' ORDER BY ' + @ORDERBYClause END --print @Statement BEGIN EXEC( @Statement ) END if @Internal_LS = 1 BEGIN EXEC sp_dropserver @server = @LS_Name set @LS_Name = NULL END SET NOCOUNT OFF END GOCC_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] GO IF OBJECT_ID('tempdb..##TagsTempTable') is not NULL DROP Table ##TagsTempTable DECLARE @return_value int EXEC @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_value GO 重新排列数据上面的示例图片中查询出的数据是以列的形式排序的,通过下面代码可以把相同时间戳的数据放在同一行。 declare @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'''' ' else set @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_4 From (SELECT [ValueID], [TimeStamp], [RealValue] from @temp ) AS SourceTable PIVOT (max(Realvalue) for ValueID in ([1],[2],[3],[4])) AS PivotTable order by PivotTable.TimeStamp用VB脚本访问归档数据库 创建数据库连接 dim conn Set conn = CreateObject("ADODB.Connection") conn.ConnectionString = "Provider=WinCCOLEDBProvider.1;Catalog=CC_OpenArch_03_05_27_14_11_46R; Data Source=.\WinCC" conn.CursorLocation = 3 conn.open 查询数据库 Dim rs, Sql Set 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:
查询WinCC过程值归档的语法详解:查看文档 过程值字段类型:查看文档 查询WinCC报警消息归档的语法详解:查看文档 报警消息归档字段类型:查看文档
本文来自博客园,作者:星墨,转载请注明原文链接:https://www.cnblogs.com/yada/p/12661348.html |
CopyRight 2018-2019 实验室设备网 版权所有 |