OPCUA 的历史数据库/聚合服务器的实现细节

news2024/11/15 15:25:10

       进入了AI 大数据时代,无论是工业自动化系统,还是物联网系统,对大数据的采集,存储和分析都十分重要。大数据被称为工业的石油,未来制造业的持续改善离不开大数据。

     传统的应用中,历史数据的存储是特定的数据结构来存储历史数据的,不同厂商,不同应用的数据存储格式都各不相同。在工业控制和物联网应用项目中,数据库的工作量占据了很大一部分设计工作

    开放自动化的观点下,倾向系统的数据采纳开放的,标准化的数据模型。例如OPCUA 信息模型。基于标准化的数据模型,实现不同厂商的设备和软件实现互操作。

       在开放性系统中,构建一个通用的,基于模型的历史数据库显得十分重要。本博文探讨OPCUA 历史数据库的相关话题。

 在前面的博文中,我曾经介绍过聚合服务器和历史数据服务器,可以阅读:

OPCUA 聚合服务器和历史数据服务器

本文我们进一步探讨实现历史数据库具体的细节。

OPCUA  历史数据的访问的内容

在OPCUA 规范的多个部分提及历史数据访问。

  1.   OPC 10000-5: UA Part 5: Information Model  5.3 Variables
  2. OPC 10000-11: UA Part 11: Historical Access
  3. OPC 10000-4: UA Part 4: Services

Historizing 属性

在 UA Part5 5.3 变量规范中指出 信息模型中每一个变量可以有一个Historizing 属性 当该属性为true 表示该变量具有历史数据。

 

 这里表明该属性的值是与服务器相关的,不知道什么意思。在Open62541 中是这样设置historizing 属性的。

UA_VariableAttributes attr = UA_VariableAttributes_default;
    UA_UInt32 myUint32 = 0;
    UA_Variant_setScalar(&attr.value, &myUint32, &UA_TYPES[UA_TYPES_UINT32]);
    attr.description = UA_LOCALIZEDTEXT("en-US","myUIntValue");
    attr.displayName = UA_LOCALIZEDTEXT("en-US","myUIntValue");
    attr.dataType = UA_TYPES[UA_TYPES_UINT32].typeId;
    /* We set the access level to also support history read
     * This is what will be reported to clients */
    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE | UA_ACCESSLEVELMASK_HISTORYREAD;
    /* We also set this node to historizing, so the server internals also know from it. */
    attr.historizing = true;

历史数据的读写

OPC 10000-4: UA Part 4: Services 中规范了HistoryRead和HistoryUpdate

5.10.3 HistoryRead

允许client 端读取节点的值和事件。

5.10.5 HistoryUpdate

允许Server 更新历史数据和事件。

在OPC 10000-11: UA Part 11: Historical Access中·规定了参数的细节。

maxAge

timesStampsTo Return 返回时间标签格式。

在Open62641 中是使用UA_Client_HistoryRead_raw 调用

UA_StatusCode
UA_Client_HistoryRead_raw(UA_Client *client, const UA_NodeId *nodeId,
                             const UA_HistoricalIteratorCallback callback,
                             UA_DateTime startTime, UA_DateTime endTime,
                             UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 numValuesPerNode,
                             UA_TimestampsToReturn timestampsToReturn, void *callbackContext)

OPCUA Server与历史数据库的融合

     历史数据存储在哪里?采取什么样的数据格式存储在数据库中呢?这并不是OPCUA 规范的内容,与系统架构和产品有关。它们大致分为两种:

    历史数据库嵌入现场设备中

   许多工业控制器和仪表中嵌入的历史数据存储功能,例如,在智能电表中,会存储几百个波形数据值,上层软件能够分析波形数据,分析恶意负载等现象。工业控制器一般使用小型SD 卡存储现场数据,容量比较小,存储的时间短,通常不采用数据库,而是一种特殊格式的文件系统实现数据存储。这种嵌入式历史数据存储的优点是存储数据非常块。缺点是上层软件通过读取历史数据的比较慢。而且读取大量历史数据会打扰实时控制的正常操作。特别是需要同时读取多个设备的历史数据时,占用的网络带宽更是无法容忍的。

此外,并不是所有的现场设备都支持嵌入式存储。

云端或边缘设备中构建历史数据存储

        另一种方式是在云端或者现场设置一个独立的数据库设备中。例如独立的计算机安装influxDB,MySQL ,mongoDB 等数据库。所有现场设备将更新数据发送到历史数据库中。应用软件可以直接访问历史数据库。

       这种架构类似与著名的OSISoft(现在是施耐德AVEVA的一部分)的PI 服务器。OSISoft 的PI 服务器已经具有30多年的历史,OSIsoft 的业务主要面向石油和天然气、公用事业、生命科学和生物制药、金属和采矿、纸浆和造纸、水务六个核心市场。

        PI 服务器基于所谓的资产架构(AF) 服务器和PI 数据库两大部分。所谓的AF 是一个模型库,通过·访问·AF服务器可以找到对于的数据指针,读取PI中的历史数据。

   但是可惜的是PI 系统的AF 模型并非OPCUA 模型。如果设计一个类似PI System,同时支持OPCUA 的历史数据服务器,可以使用OPCUA 信息模型替代AF 资产架构。这样我们就可以构建一个开放性历史数据库系统。

     实现的系统架构如下所示:

 

        注意: Historian 服务器和Database 可以部署在同一的计算机上,或者云端。这台计算机提供了三个接口:

 OPC UA Client 

通过了现场OPC UA Server 的数据读取

OPCUA Server 

   应用软件能够访问工业现场的实时数据,也可以访问历史数据。

数据库访问接口

       为了使历史数据的访问更加高效,可以直接数据库的接口访问数据。同时能够避免访问历史数据库影响现场网络的实时性。

 聚合服务器

       历史数据库往往会与聚合服务器结合在一起。我在博文谈谈OPCUA 聚合服务器 中介绍了背景知识。聚合服务器+历史服务器形成了一个工业现场的完整的大模型。是控制现场的一个全景快照。它们是TI应用程序能够访问控制现场的全部数据。

        从OPCUA 聚合服务器的规范中看,实现服务器的聚合貌似很复杂。基本的模型如下:

    在聚合服务器中包含了多个Aggregated Server 。有些应用建立了Servers 文件夹,将所有的源服务器放在内部,它们包含了ServerUrl,EndPoint 等参数。在每个Server 中,包含了需要聚合的对象。这些对象的名称的名称应该和源服务器中对应的对象是相同的。当需要读取这些对象的值时,通过OPCUA Client 到源服务器中读取。

下图中左边是聚合服务器,右边是源服务器

 

研究国外的一些聚合服务器产品,他们采用了一些简单的方式。

采用配置文件实现

        采用用户的配置文件,可以将需要聚合的对象完全描述出来,并且包括服务器的URI,Endpoint 参数。有些项目还规定了那些对象需要轮询,那些需要订阅,那些需要Monitor。一般使用json 作为配置文件格式。

Prosys 公司的实现

     在聚合服务器中将所有现场的源服务器建立一个副本服务器实例。例如在下图中,就建立了两个源服务器的副本:

’Prosys OPC UA Sample Console Server

’Prosys OPC UA Simulation Server

 聚合的方法

       程序扫描Servers 中的变量和属性等,以相同的名称去访问源服务器中的值。写入到聚合服务器相应的变量中去。

但是这会遇到一个问题,比如两个服务器实例中有相同名称的对象,如上图中MyDevice。他们采取的方式是使用不同的地址空间Index。

 在上图中一个MyDevice的ns=20,另一个ns=26.

当然,还有事件和方法的聚合问题。想必采取类似的方式去解决。

此外,在聚合服务器中要保留所有的服务器的入口(Endpoint)。

  许多问题看文本是一回事,编程是另一回事。只有深化,问题才会浮现出来。

数据库的数据格式

        为了实现一个通用的数据库格式,需要设计一种通用的数据库格式,包含必需的tag。下面几项是必需的:

源服务器

  1. 对象的browserName
  2. 对象的DisplayName
  3. 对象的NodeId
  4. 显示路径
  5. 时间标签

实例:

   应用软件借助于这些tag 和OPCUA 服务器中的信息模型,获取历史数据的完整信息。

 数据库可以采用influxDB,mongoDB和MySQL 等多种数据库,本人倾向使用influxDB。

OPCUA大模型架构的优点

        在实际应用中,构建一个聚合现场设备OPCUA 服务器的UPCUA 大模型系统的是十分有效的。它的优点

  1.   为所有的数据建立一个统一的接入点
  2.   建立一个IT/OT 的接口
  3. 简单统一的方式访问历史数据

         自动化线的安全性,可靠性十分重要,一个小小的操作失误可能造成巨大的财产损失和人员丧亡。所以,要在不影响生产线安全和可靠运行的前提下,才能够将生产线向IT 开放,简单地将生产设备与云端服务互联是一种不安全的做法。比较合适的方法是通过一个公共的,安全的节点向IT结合。


实验项目

正在编写中。

编写一个OPCUA Server,建立聚合服务器模型。

client 采取多线程方式。与现场设备连接。

结束语

             OPCUA 很重要,也很复杂。实现开放自动化和工业4.0 还有漫长的道路。如何采纳这些为明天准备的技术来解决现在的问题,采取渐进的方式推行开放自动化的实现是可行的道路。

      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/732115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

官方外设库SDA安装和验证

第一种方法 1.打开mobaxterm,通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP下载压缩包,点击上传外设库的压缩包 2.输入命令 unzip 解压 3.输入命令 sudo ./build 安装工具包 4.验证安装完毕用 输入gpio readall 显示下面图片 第二…

数据分析实战(基础篇):从数据探索到模型解释

前言 本文着重介绍数据分析实战的基础知识和技巧,探索从数据探索到建模再到模型解释的完整过程内容包含数据探索、模型建立、调参技巧、SHAP模型解释数据来源于kaggle平台,crab age prediction数据集,数据详情 数据说明 数据背景 螃蟹味道…

【性能设计篇】聊聊异步处理

在性能设计的时候,其实主要的三板斧就是数据库(读写分离、分库分表),缓存(提升读性能),异步处理(提升写性能)以及相关的秒杀设计以及边缘设计等。 本篇主要介绍异步处理的哪些事,我们…

6.2.1 网络基本服务---域名解析系统DNS

6.2.1 网络基本服务—域名解析系统DNS 因特网是需要提供一些最基本的服务的,今天我们就来讨论一下这些基本的服务。 域名系统(DNS)远程登录(Telnet)文件传输协议(FTP)动态主机配置协议&#x…

Day47

思维导图 练习 实现登录框中&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;并跳转到其他界面 second.h #ifndef SECOND_H #define SECOND_H#include <QWidget>namespace Ui { class Second; }class Second : public QWidget {Q_OBJECTpublic:explicit …

Matlab绘图时的几个小技巧(修改刻度线长度、添加/去掉右边和上面的轴与刻度线、出图时去掉旁边的空白部分)

set(gca,TickLength,[0.005,0.035]); %修改坐标轴刻度线的长度 box on; %开启右面和上面的坐标轴 box off;%关闭右面和上面的坐标轴 set(gca, LooseInset, [0,0,0,0]);%删除掉图旁边多余的空白部分首先随便出一张图 我想让刻度线更长或更短一些&#xff1a; 我想让右侧和上面…

OpenCV的安装与配置指南(Windows环境,Python语言)

OpenCV 的安装与配置指南&#xff08;Windows环境&#xff0c;Python语言&#xff09; 导语一、安装 Python 二、安装 OpenCV 库三、配置 OpenCV 环境变量四、验证 OpenCV 安装总结 导语 OpenCV 是一个功能强大的计算机视觉库&#xff0c;广泛应用于图像处理和计算机视觉领域。…

第十二章 elk

1、ELK可以帮助我们解决哪些问题 日志分布在多台不同的服务器上,业务一旦出现故障,需要一台台查看日志 单个日志文件巨大,无法使用常用的文本工具分析,检索困难; 2、架构设计分析 Filebeat和Logstash ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、i…

MySQL入门必备:Linux中部署MySQL环境的四种方式详解

目录 一、仓库安装 二、本地安装 三、Docker中安装 四、源码安装 一、仓库安装 首先需要下载mysql软件包&#xff1a; 1、进入MySQL官网 2、进入MySQL社区版下载 3、使用yum方式下载MySQL 4、下载对应版本的软件包 5、这里可以不登录直接下载软件包 6、复制下载链接 7、然…

Perfetto详细解析

一、Perfetto基础 1、Perfetto介绍 Perfetto 是一个生产级的开源堆栈&#xff0c;用于提高性能 仪器和痕量分析。与 Systrace 不同&#xff0c;它提供数据源超集&#xff0c;可以用 protobuf 编码的二进制流形式记录任意长度的跟踪记录。可以将Perfetto理解为systrace的升级版…

Python——爬虫入门

爬虫的流程 第一步:获取网页内容 浏览器访问网页时也是一样&#xff0c;都是先发个请求获取网页内容&#xff0c;但是浏览器多了个渲染的步骤。 程序获取的内容都是网页源代码 第二步:解析网页内容 第三步:储存或分析数据 要做数据集就存起来&#xff0c;要做数据分析就形…

【Matlab】GRNN神经网络遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值

上一篇博客介绍了BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值&#xff0c;神经网络用的是BP神经网络&#xff0c;本篇博客将BP神经网络替换成GRNN神经网络&#xff0c;希望能帮助大家快速入门GRNN网络。 1.背景条件 要求&#xff1a;对于未知模型&#xff08;…

scratch 角色追踪

scratch 角色追踪 本程序中一个角色移动到随机位置和方向后向前移动&#xff0c;碰到边缘反弹&#xff1b;另一个角色跟随前一个角色&#xff0c;两个角色接触后前者重新取随机位置。 程序内容如下

Linux——进程信号详解

目录 一.进程信号的理解 1.1定义&#xff1a; 1.2举例&#xff1a; 1.3总结&#xff1a; 二.进程信号地使用&#xff1a; 2.1信号种类&#xff1a; 2.2而操作系统向进程发送信号地方式有四种&#xff1a; 2.2.1以键盘的方式向进程发送信号 接下来介绍一个系统调用函数sign…

【项目】C++实现高并发内存池

文章目录 一、项目介绍1.1 项目原型1.2 池化技术1.3 内存池主要解决的问题1.4 malloc理解 二、定长内存池实现三、高并发内存池的三层申请内存框架设计3.1 thread cache层的设计3.1.1 thread cache整体框架3.1.2 哈希桶映射对齐规则3.1.3 thread cacheTLS无锁访问 3.2 central …

【剑指offer】10. 矩阵中的路径(java)

文章目录 矩阵中的路径描述示例1示例2思路完整代码 矩阵中的路径 描述 请设计一个函数&#xff0c;用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始&#xff0c;每一步可以在矩阵中向左&#xff0c;向右&…

springboot切面应用

1、切面场景 无侵入的实现功能增强 2、实现 切面类的实现 需要使用注解Aspect和Componet来实现&#xff0c; 环绕通知的作用在返回的student的sname后面拼接around字符串。 后置通知的作用在入参后面拼接idididdi&#xff0c;然后打印日志 Aspect Component public class…

English Learning - L3 纠音 W9 Lesson7-8 Ted Living Beyond Limits 2023.7.4 周二

朗读内容&#xff1a; Lesson 7-8 Day 52 - 60 句子 Ted Living Beyond Limits 23-50

使用Python爬虫和数据可视化,揭示人口大国历年人数的变迁

前言 人口大国通常在全球人口排名中位居前列&#xff0c;其人口数量远远超过其他国家。而印度和中国这两个国家的人口数量均已经超过14亿&#xff0c;而当前全球的人口总数也不过刚刚突破80亿而已&#xff0c;妥妥的天花板级别存在。或许是中国和印度在人口方面的表现太过“耀…

【CANopen】周立功轻松入门CANopen笔记

前言 想学习些新东西了&#xff0c;原本想直接学学Ethercat&#xff0c;但是简单看了看对象字典啥的概念一头雾水的&#xff0c;决定先从CANopen开始&#xff0c;Ethercat看着头疼。Etehrcat和CANopen有挺多类似的地方。感谢ZLG的这个入门笔记&#xff0c;我似乎是看懂了些&am…