zoukankan      html  css  js  c++  java
  • 访问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。

    在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-54UD17PRU0NWINCC').
    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_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	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
    

    重新排列数据 

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

    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报警消息归档的语法详解:查看文档

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

  • 相关阅读:
    Mac从零配置Vim
    Mac效率:配置Alfred web search
    看看你的邻居在干什么
    成功破解邻居的Wifi密码
    MacBook安装Win10
    C陷阱:求数组长度
    Nexus 6P 解锁+TWRP+CM
    搭建树莓派手机远程开门系统
    Ubuntu下配置ShadowS + Chrome
    JS传参出现乱码(转载)
  • 原文地址:https://www.cnblogs.com/yada/p/12661348.html
Copyright © 2011-2022 走看看