打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
访问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-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_TagStatistic
cp_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]
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
重新排列数据
上面的示例图片中查询出的数据是以列的形式排序的,通过下面代码可以把相同时间戳的数据放在同一行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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脚本访问归档数据库
创建数据库连接
1
2
3
4
5
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
查询数据库
1
2
3
4
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:
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
存储过程
关于存储过程的使用问题
使用VB或VBS访问WINCC6.0历史数据库
VB实现SQL Server 2000存储过程调用(3) - 存储过程调用 - 技术应用 ...
三分钟学会Sql Server的复制功能 - 51windows.Net
DataSnap客户端共享服务器端的数据库连接
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服