访问WinCC归档数据库的方法


目录

  • WinCC归档数据库介绍
  • 安装ConnectivityPack
  • 在SQL Server中通过链接服务器访问归档数据库
    • 创建链接服务器
    • 使用OPENQUERY查询连接服务器
  • 在SQL Server中通过OPENDATASOURCE访问归档数据库
  • 通过存储过程访问归档数据库
  • 重新排列数据
  • 用VB脚本访问归档数据库
    • 创建数据库连接
    • 查询数据库
  • 访问另一台电脑的WinCC归档数据库

WinCC归档数据库介绍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访问归档数据库语法如下:

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'''

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

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

如下图的路径,在System Databases -> master数据库下有部分存储过程,在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

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\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

重新排列数据 连接 查看文档

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

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

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