访问WinCC归档数据库的方法 目录 WinCC归档数据库介绍 安装ConnectivityPack 在SQL Server中通过链接服务器访问归档数据库 在SQL Server中通过OPENDATASOURCE访问归档数据库 通过存储过程访问归档数据库 重新排列数据  用VB脚本访问归档数据库 访问另一台电脑的WinCC归档数据库

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

WinCC归档数据库介绍

WinCC的历史工艺数据和报警消息保存在SQL Server数据库,数据以分段和压缩形式储存,不方便直接通过SQL去读取,用WinCC OLE DB Provider访问这些数据时会自动合并分段并解压缩数据。

安装ConnectivityPack

WinCC OLE DB provider由WinCC的ConnectivityPack选件提供,在安装WinCC时需要安装ConnectivityPack。在提供数据的WinCC的计算机需安装ConnectivityPack server,读取数据的计算机上安装ConnectivityPack client,可以在计算机上同时安装ConnectivityPack server和ConnectivityPack client。

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

在SQL Server中通过链接服务器访问归档数据库

创建链接服务器

安装了WinCC的计算机中,启动WinCC项目时会自动创建链接服务器。在未安装WinCC的计算机需要手动创建链接服务器。

打开SQL Server Management Studio,在对象资源管理器中,展开“服务器对象”,右键单击“链接服务器”,然后单击“新建链接服务器”。

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

 如下图填入链接服务器信息,数据源(Data Source)中填入WinCC服务器的数据库完整实例名,目录(Catalog)中填入归档数据库名。访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

 访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

使用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查询:

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

 使用变量名查询:

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

在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-54UD17PRU0NWINCC').
N'Tag:R,1,''0000-00-00 00:10:00.000'',''0000-00-00 00:00:00.000'''

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

通过存储过程访问归档数据库

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

适用于WinCC归档数据库的存储过程有哪些

如下图的路径,在System Databases -> master数据库下有部分存储过程,在WinCC项目程序对应的数据库下也有部分存储过程。

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库  访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

大部分存储过程都找不到对应的使用说明,下面对已知的几个存储过程简单介绍。

cp_TagStatistic

cp_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

GO

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

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]
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	ag1;archive1	ag2',
        @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

访问WinCC归档数据库的方法
目录
WinCC归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

重新排列数据 

上面的示例图片中查询出的数据是以列的形式排序的,通过下面代码可以把相同时间戳的数据放在同一行。

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'SysInfoCPU_1;SysInfoCPU_2;SysInfoCPU_3;SysInfoCPU_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归档数据库介绍
安装ConnectivityPack
在SQL Server中通过链接服务器访问归档数据库
在SQL Server中通过OPENDATASOURCE访问归档数据库
通过存储过程访问归档数据库
重新排列数据 
用VB脚本访问归档数据库
访问另一台电脑的WinCC归档数据库

查询WinCC过程值归档的语法详解:查看文档

过程值字段类型:查看文档

查询WinCC报警消息归档的语法详解:查看文档

报警消息归档字段类型:查看文档