「直播回放」使用 PLC + OPC + TDengine,快速搭建烟草生产监测系统

在烟草工业场景里,多数设备的自动控制都是通过 PLC 可编程逻辑控制器来实现的,PLC 再将采集的数据汇聚至 OPC 服务器。传统的 PI System、实时数据库、组态软件等与 OPC 相连,提供分析、可视化、报警等功能,这类系统存在一些问题:

  1. 收费是按照测点数进行的,价格昂贵,而且需要有商务谈判才能开始 PoC,无法在购买决策前做足够的验证测试工作;
  2. 系统封闭,如果想集成一个新的 BI、AI 或可视化工具,需要原厂商的支持,十分困难;
  3. 数据的实时分发、分享功能薄弱;
  4. 架构落后,往往基于 Windows,部署维护还十分复杂。

借助 TDengine 3.0 云服务或 TDengine Enterprise(企业版),上述问题便可迎刃而解。作为物联网、工业大数据平台,TDengine 内嵌对 OPC UA/DA、MQTT 等协议的支持。通过网页上简单的配置,无需一行代码,就能将 PLC 采集的数据通过 OPC 连接器源源不断的写入 TDengine,再通过与可视化工具 Grafana、BI 工具(如 Power BI、帆软、永洪)的无缝集成,就可以提供数据的可视化、报表、报警等系列功能。而且由于 TDengine 支持标准的 JDBC、ODBC 接口,众多的 BI、AI 和报表工具都可以无缝集成,而不被厂商绑定。

同时,你可以使用 TDengine Cloud,无商务谈判,免费注册,几分钟内就可以搭建好整个系统,验证是否工作,无任何前期费用和风险。如果验证没问题,可以继续使用云服务,也可以切换到 TDengine Enterprise 做本地化部署。对于云服务,5 万个测点,如果数据采集间隔是一秒,最基础的 TDengine Cloud 入门级就可满足要求,一个月仅需 1200 元。与传统昂贵的工业软件相比,大大降低了投入的成本。

本文以 TDengine Cloud 为例,介绍该方案在烟草制丝车间的具体实现。

在下面例子里,我们将从 OPC Server 采集三个指标:冷床出口水分、计量秤工艺流量及烘丝出口温度,并希望在可视化界面实现以下功能:

  1. 实时监测数采完备率和在线状态:避免数据采集出现异常时不能及时观察到,导致长时间原始数据缺失
  2. 实时监测各指标值、变化趋势曲线:及时掌握生产过程中关键指标的变化

本文中可视化工具选择了开源的 Grafana,你也可以使用国产的 BI 软件来实现。这个方案也适用于 TDengine Enterprise 企业版。

1. TDengine Cloud OPC 接入介绍

为方便不同数据源的接入,涛思打造了一套数据接入方案来接入各种不同类型的数据源。它的核心功能组件是 taosExplorer(TDengine Cloud 为控制台)、taosX Agent 及各类数据源连接器。TDengine 支持两种 OPC 接入:OPC UA、OPC DA。

需要注意的是,TDengine Cloud 仅支持代理模式接入各类数据源。TDengine Enterprise 则是直连、代理两种连接模式均支持。

以某个工厂为例,它的数据中心部署在工厂内部(车间机房、工厂中心机房),各车间通过 OPC 向外提供的数据服务和数据中心处于同一内部网络,这种情况可采用直连模式。如果该工厂的数据中心部署在云端(TDengine Cloud、共有云、上级集团私有云),且工厂与云端之间没有 VPN 连接时,这种情形可采用代理模式。

下面以 TDengine Cloud 云服务+代理模式为例,介绍如何快速搭建 OPC UA+TDengine+Grafana 环境,实现工业 OPC 数据采集的可视化。

2. 部署环境

本文的部署拓扑图如下:

  • 本地 MacBook Pro,Grafana 部署在本机
  • taosX Agent 代理、OPC UA Simulation Server 部署在虚拟机 vm1 上,Ubuntu 20.04
  • TDengine 采用 TDengine Cloud 云服务入门版

提示:

  • TDengine Cloud 的注册或登录请参照 https://cloud.taosdata.com/login
  • OPC UA Server 在本文中将采用 PROSYS OPCUA Simulation Server 5.4.6,下载地址为 Prosys OPC UA Simulation Server - Prosys OPC
  • Grafana 下载地址为 Download Grafana | Grafana Labs

Grafana 数据源安装

Grafana 安装后,需要安装 TDengine 的数据源插件,有两种方式供选择:

  • 在 Grafana Configuration – Datasource 页面中,搜索 TDengine,完成安装【推荐】
  • 通过运行下面的命令完成该插件安装【以 Linux 为例】
bash -c "$(curl -fsSL https://raw.githubusercontent.com/taosdata/grafanaplugin/master/install.sh)"

3. 配置OPC UA Server

为方便展示,本文将采用 PROSYS OPC UA Simulation Server 的功能,模拟生成 10 个双精度点位的随机数。

在 MacBook Pro 上,启动 PROSYS OPC UA Simulation Server。

切换至 Objects 页面,右键点击 Random:BaseDataVariableType,Duplicate Node 创建 10 个采集点位,均为双精度浮点数。完成此步骤后,将生成节点地址 ns=3;i=1008~1017。

生成的点位默认随机数范围是 [-2,2],如需修改,可点击每个点位 Value 标签进行设置。默认的数值生成间隔为 1000ms。

4. 创建代理并部署 taosX Agent

登录 TDengine Cloud 后进入控制台,点击数据写入->数据源->创建新的代理

根据提示,在 vm1 上下载并部署 taosX Agent。

tar xf taosx-agent-xxx-linux-x64.tar.gz
cd taosx-agent-xxx-linux-x64
./install.sh

设置代理名称:agent-vm1

获得 Endpoint 和 token,将其复制、粘贴至 vm1 上的 taosX Agent 的配置文件中:/etc/taos/agent.toml

在 vm1 上启动 taosX Agent:

systemctl start taosx-agent

5. 数据准备

在配置 OPC UA 采集任务之前,还有两个准备工作需要完成:

  • 在 TDengine Cloud 创建 opcdemo 库
  • 创建批量导入用的采集点位 CSV 文件

5.1 创建 opcdemo 库

登录 TDengine Cloud 后进入控制台,点击数据浏览器-> + 创建数据库,输入名称 opcdemo、设置 CACHEMODEL 为 both 后,完成创建。

5.2 创建点位 CSV 文件

为方便批量导入采集点位,TDengine Cloud 提供了以 CSV 文件批量导入点位信息的功能。

根据前面的 OPC UA Simulation Server 创建的 10 个点位信息,创建 CSV 文件。

文件填写说明:

  • point_id: OPC 点位地址
  • tbname: 该点位地址对应 TDengine 中的子表名
  • type: 该点位地址值的数据类型,对应普通列 val。常见的数据类型有 int/bigint/float/double/varchar/nchar/bool,其中 varchar/ncahr 需给出最大允许长度,如 varchar(50)/nchar(50)
  • stable: 子表所属的超级表名
  • 时间戳列:
    • ts_col: OPC 原始采集时间戳的列名,默认 ts,默认为首列时间戳
    • received_ts_col: 【可选】TDengine 接收时间戳对应的列名
    • 一旦配置了 received_ts_col 列,该列将取代 ts_col 成为首列时间戳,ts_col 列将做为普通列保留
  • 普通列:
    • val 列:存放采集值,类型由用户定义,本文中类型为 double
    • quality 列:质量信息,INT 型,系统默认自动创建
  • tag:: 标签列定义,以tag::nchar(10)::unit为例,将创建一个名为 unit,类型为 nchar(10) 的标签列。需要说明的是,每张超级表默认创建两个标签列:point_id VARCHAR(256), point_name VARCHAR(256)
信息点编码,OPC TAG点地址,数据类型,对应超级表表名,OPC原始时间列名,标签列1
tbname,point_id,type,stable,ts_col,tag::nchar(10)::unit
d_1008,ns=3;i=1008,double,stb_double,ts,%H
d_1009,ns=3;i=1009,double,stb_double,ts,kg/h
d_1010,ns=3;i=1010,double,stb_double,ts,℃
d_1011,ns=3;i=1011,double,stb_double,ts,%H
d_1012,ns=3;i=1012,double,stb_double,ts,kg/h
d_1013,ns=3;i=1013,double,stb_double,ts,℃
d_1014,ns=3;i=1014,double,stb_double,ts,%H
d_1015,ns=3;i=1015,double,stb_double,ts,kg/h
d_1016,ns=3;i=1016,double,stb_double,ts,℃
d_1017,ns=3;i=1017,double,stb_double,ts,℃

以上 CSV 文件成功导入后,将在 TDengine 中在指定的库中(本文为 opcdemo)创建一张名为 stb_double 的超级表,并以之为模板创建 10 张子表,名为 d_1008/d_1009…/d_1017。

taos> desc stb_double;field              |          type          |   length    |    note    |
=====================================================================================ts                             | TIMESTAMP              |           8 |            |quality                        | INT                    |           4 |            |val                            | DOUBLE                 |           8 |            |point_id                       | VARCHAR                |         256 | TAG        |point_name                     | VARCHAR                |         256 | TAG        |unit                           | NCHAR                  |          10 | TAG        |
Query OK, 6 row(s) in set (0.008236s)

6. 创建数据采集任务

登入控制台,点击数据写入->数据源->添加数据源

填写数据源名称,选择类型:OPC-UA,代理选刚新建的代理 agent-vm1,目标数据库 opcdemo,输入 OPC UA Server 的服务地址。

本文代理模式下,OPC UA Server 部署在vm1上,服务地址填写 127.0.0.1 即可,端口号及详细信息参见 PROSYS Simulation Server 的 Status 页面。

点击“选择文件”按钮,进入 CSV 文件导入界面。

采集间隔设置为 1 秒,采集模式设置为 observe。

本次 CSV 共采集 10 个点位,为优化写入性能,将批次大小调整为 10。如有必要,可选择开启 Debug 日志。

7. 数据采集验证

登入控制台,点击数据浏览器->Sql,执行多次最新数据查询语句,观察查询结果。如结果行时间戳单调递增,则表示数据采集链路工作正常,数据已正常入库了。

select last_row(*) from opcdemo.stb_double;

8. 数据可视化

Grafana 部署在本地 MacBook Pro 上,希望访问云服务上的 TDengine 实例中的 opcdemo 库的数据。根据云服务控制台【工具-Grafana】页面的指引,填入 Host、Cloud Token,删除 User、Password,保存退出。

选择 Import Dashboard,点击 Upload JSON file 导入 OPCDemo.json 文件(文件代码详见 OPC Demo-0925.json - TDengine | 涛思数据),选择对应的 TDengine 的 DataSource,完成 Dashboard 导入。

点击 OPC Demo Dashboard,打开该仪表板,可以观察到实时数据的变化。

9. OPC Demo Dashboard 使用说明

该仪表盘可以选择三个物理量作为监控对象:metric01、metric02、metric03,分别对应:冷床出口水分、工艺流量、烘丝出口温度,位于第一行,可通过下拉框选择;用户可设置设备离线阈值 offline_threshold(单位:秒),通过下拉框选择。

首行三个控件,分别是 metric01 的分钟级数采完备率、整体数采完备率以及在线状态。

在烟草生产行业,数据采集是否有缺漏,是企业数据运营管理的基础。在本文中我们提出两个指标来衡量数采完备:分钟级数采完备率、整体数采完备率。

9.1 分钟级数采完备率

算法说明:以一分钟划分时间窗口,分段计算当前时间区间(最近 5/15/30 分钟…)内 metric01 物理量采集点数除以 60 后的比值 – 默认数据生成间隔为 1000ms,即 1 秒。

select _wstart, count(*)/60 from opcdemo.$metric01 where _c0 >= $from and _c0 < $to interval(1m) limit 100 offset 1

9.2 整体数采完备率

算法说明:计算 metric01 物理量采集点数除以当前时间区间内秒级跨度的比值,spread 计算的时间值单位与 opcdemo 库的 precision 一致,默认为 ms。

select count(*)/(spread(_c0 )/1000+1) from opcdemo.$metric01 where _c0 >= $from and _c0 < $to

9.3 在线状态

设备是否按设计要求及时上报数据,可通过在线状态的监测来实现。如在指定时间阈值内无采集数据到达,显示红色 offline 以示警。

算法说明:判断 metric01 物理量在指定离线阈值内是否有数据入库,如有则判 Online,否则判 Offline。

select count(*) from (select last_row(*) from opcdemo.$metric01 where _c0 >= now-$offline_thresholds)

三个 Gauge 仪表表头控件,用于显示烘丝出口水分、工艺流量、烘丝出口温度的最新值。

select last_row(val) from opcdemo.$metric01

三个 TimeSeries 曲线控件,用于显示烘丝出口水分、工艺流量、烘丝出口温度在当前时间区间内的动态曲线,显示值为动态时间窗口内采集值的算术平均值。

select _wstart, avg(val) from opcdemo.$metric01 where _c0 >= $from and _c0 < $to interval($interval) fill(null)

以上以制丝车间的几个典型参数为例,介绍了如何利用 TDengine 的 OPC 连接器,将数据采集入库,并通过 Grafana 将这些参数以动态可视化方式直观地呈现出来。

掌握了以上基本语法,大家可以举一反三,结合自己的实际业务要求,不用写一行代码,就可以轻松地定制自己专属的 Grafana Dashboard,进行实时采集数据监控了。

10. 开发实时业务应用

前面阐述了如何基于 TDengine 实现 OPC 数采接入、持久化,以及基于 Grafana 方便地实现实时数据的可视化。估计会有读者想更进一步了解如何基于 TDengine 来开发实时业务应用,如 SPC 统计过程控制能否方便地实现呢?

下面我们简单介绍一下,如何利用 TDengine 来开发 SPC 实时业务应用。

SPC:统计过程控制是工业界广泛使用的质量分析工具,它采用统计技术对生产过程的某个物理量进行实时监控计算,快速识别出生产过程中产品质量的随机波动与异常波动,对生产过程的异常趋势提出预警,以便生产管理人员及时采取措施,消除异常,恢复过程的稳定,从而达到提高和控制质量的目的。

SPC 的第一步是计算标准差。TDengine 提供 stddev 标准差函数,方便用户快速从时序数据算得标准差 σ。

通过实时查询可获取指定时间段的时序数据,再通过 TDengine 内嵌函数即可直接算得:均值 μ(avg)、最大(max)、最小(min)、跨距(spread)。

结合前面算得的标准差 σ、该物理量设计的合格上下限范围 USL-LSL、目标值 T,可算得 SPC 各过程参数:Cp/Cr/Cpu/Cpl/Cpk/Cpm/Pp/Pr/Ppu/Ppl/Ppk/Ppm。

TDengine 提供各种主流编程语言如 C/C++、Java、Go、RUST、Python、C# 的驱动程序,也提供 RESTful 接口,支持 SQL 语法,因此应用开发的学习成本几乎为零,十分简单。

11. 总结

很多用户对于如何快速、便捷呈现工业现场的实时时序数据比较畏惧,觉得需要耗费大量人力进行应用开发才能实现,影响了时序数据快速有效的利用。其实,和 IT 运维采用 Telegraf+TDengine+Grafana 一样,烟草生产企业可以非常方便地利用 TDengine 的 OPC 接入能力,通过搭建 OPC+TDengine+Grafana 方案,快速实现低代码的业务数据监控。

需要说明的是,本文的例子是一较简单的场景:taosX Agent 代理和 OPC UA Server 部署在同一节点上。其他的场景可以从这个场景中演变而来,如:

  • taosX Agent 与 OPC UA Server 分别部署在不同节点上
  • 部署多个 taosX Agent,每个 Agent 对接多个 OPC UA Server

实际部署拓扑都可以按需规划、实施,取决于您实际的部署需求。

TDengine 不仅支持 OPC,也支持 MQTT, PI System, Wonderware 等数据源的无缝接入,受篇幅所限本文不多做介绍,仅分享基于 TDengine Cloud 提供 OPC+TDengine+Grafana 方案的具体实现。这套方案同样可以基于 TDengine Enterprise 企业版来实现,如果您有这样的需求,请联系北京涛思商务团队获取相关资源。

直播视频回放:

TDengine 行业产品经理聊聊以烟草行业为例,如何基于 PLC + OPC + TDengine 快速搭建工业生产监测系统_哔哩哔哩_bilibili


 了解更多 TDengine Database的具体细节,可在GitHub上查看相关源代码。

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

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

相关文章

2023/10/29总结

总结 踩坑记录 写代码的时候遇到了一个错误大概是这样的 io.jsonwebtoken.security.WeakKeyException: The signing keys size is 48 bits which is not secure enough for the HS256 algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used…

【Spring MVC】传递参数

前言&#xff1a; 访问不同路径就是在发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带有一些参数&#xff0c;所以Spring的请求主要是为了学习如何传递参数到后端以及后端如何接收。 在SpringMVC中使用RequestMapping来实现路由映射&#xff0c;也就是浏览器连接…

Linux--jdk、tomcat、环境配置,mysql安装、后端项目搭建

前言 上期我们讲到了安装linux虚拟机&#xff0c;这期我们来讲一下如何使用xshell和xftp在linux系统上搭建我们的单体项目 一、软件的传输 1.1 xftp Xftp是一款功能强大的文件传输软件&#xff0c;用于在本地主机和远程服务器之间进行快速、安全的文件传输。它是由南京帆软科…

2024王道考研计算机组成原理——中央处理器

CPU的运算器其实就是进行固定的数据处理&#xff0c;后面讲的CPU主要侧重的是它的控制器功能 运算器的基本结构 左右两边都是16位&#xff0c;因为寄存器可能位于左右两端的一边(源/目的操作数) A、B两端都要接一堆线 通用寄存器 ALU都在运算器当中 从主存来的数据直接放到…

BLS embedded curves族

1. 引言 以太坊基金会Antonio Sanso 2023年论文 Family of embedded curves for BLS中&#xff0c;展示了源自BLS椭圆曲线的embedded curves。 pairing-friendly curve E E E具有bilinear map e : G 1 G 2 → G T e:\mathbb{G}_1\times \mathbb{G}_2\rightarrow \mathbb{G…

MFC打开控制台的常用方式

工程项目中&#xff0c;想打开控制台的&#xff0c;简单打印日志 &#xff08;1&#xff09;依次打开&#xff1a; 项目配置属性——>生成事件——>后期生成事件&#xff1a;命令行 &#xff08;2&#xff09;输入&#xff1a; editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\$…

C++前缀和算法的应用:统计上升四元组

C前缀和算法的应用&#xff1a;统计上升四元组 本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个长度为 n 下标从 0 开始的整数数组 nums &#xff0c;它包含 1 到 n 的所有数字&#xff0c;请你返回上…

DXF文件写入多边形和名称属性,可在Global Mapper和ArcGIS打开

DXF文件写入多边形和名称属性&#xff0c;可在Global Mapper和ArcGIS打开 目标效果 为了实现下图的效果&#xff0c;学习了一下dxf格式的相关内容。 官方文档价值很高&#xff0c;但是结合实例.dxf文件看学习起来更快。 免费下载实例 下面将介绍dxf文件的格式规范&#xff0…

Elasticsearch:在你的数据上训练大型语言模型 (LLM)

过去的一两年&#xff0c;大型语言模型&#xff08;LLM&#xff09;席卷了互联网。 最近 Google 推出的 PaLM 2 和 OpenAI 推出的 GPT 4激发了企业的想象力。 跨领域构思了许多潜在的用例。 多语言客户支持、代码生成、内容创建和高级聊天机器人都是一些例子。 这些用例要求 LL…

数字展厅搭建平台要具备哪些功能,如何选择数字展厅搭建平台

引言: 数字展厅搭建平什台是现代营销中不可或缺的重要工具之一。它可以帮助企业打造个性化、多媒体、互动性强的展示空间&#xff0c;吸引、引导和留住目标用户。在选择数字展厅搭建平台时&#xff0c;我们需要考虑各方面的功能和性能&#xff0c;以确保能够满足企业的需求并取…

面试算法47:二叉树剪枝

题目 一棵二叉树的所有节点的值要么是0要么是1&#xff0c;请剪除该二叉树中所有节点的值全都是0的子树。例如&#xff0c;在剪除图8.2&#xff08;a&#xff09;中二叉树中所有节点值都为0的子树之后的结果如图8.2&#xff08;b&#xff09;所示。 分析 下面总结什么样的节…

全网公开电商数据的采集重点

数据的采集是根据需求而定的&#xff0c;品牌会做数据采集的原因&#xff0c;一般与内部营销、渠道管控有关&#xff0c;如需要做价格管控时&#xff0c;需要先采集价格&#xff0c;这就需要对数据进行采集&#xff0c;包括价格、促销信息&#xff0c;又或者是需要做行业分析、…

PHP连接SQLServer echo输出中文汉字显示乱码解决方法

1、查询结果有中文会显示乱码。 解决方法一&#xff08;较简单&#xff0c;建议使用&#xff09;&#xff1a; 在php文件最开头写上&#xff1a; header(Content-type: text/html; charsetUTF8); // UTF8不行改成GBK试试&#xff0c;与你保存的格式匹配 <?php header(&q…

matab读取包含struct混合类型的mat文件转为txt文件

现有一个mat文件&#xff0c;其内容如下&#xff1a; 目标&#xff1a;要将data.mat中的Obs_Iridium_A转为文本格式。 分析&#xff1a; data.mat里面包含了4个struct结构的成员&#xff0c;Obs_Iridium_A是其中之一&#xff0c;Obs_Iridium_A为1*7496维&#xff0c;7496代表…

波浪理论第3波anzo capital昂首资本3个方法3秒确认

要想通过波浪理论在交易中赚取最大利润&#xff0c;确认第三波必不可少&#xff0c;因为第三波通常是趋势中最大和最强的一波&#xff0c;今天anzo capital昂首资本3个方法3秒确认。 首先&#xff0c;第一个确认方法—斜率。 通常&#xff0c;第三波的斜率会比第一波更陡峭&a…

Linux内核是如何创建进程?

目录 1.Linux如何创建进程 2.fork函数原理 2.1 fork函数原型 2.2 fork函数实现原理 2.3 父子进程虚拟地址空间&#xff08;mm_struct&#xff09;之间的关系 2.4 写时拷贝&#xff08;copy-on-write&#xff09;技术 2.5 父子进程如何共享文件&#xff08;files_struct&…

06、Caused by: java.nio.charset.MalformedInputException: Input length = 1

目录 问题&#xff1a;原因&#xff1a;解决方法&#xff1a; 问题&#xff1a; Caused by: java.nio.charset.MalformedInputException: Input length 1 原因&#xff1a; 应该是中文有哪些文字导致的。 yml 编码格式出错 解决方法&#xff1a; 直接这里把GBK改成 utf-8…

unordered系列关联式容器--哈希结构详细讲解及使用示例

目录 unordered系列关联式容器unordered_map 哈希哈希概念哈希函数直接定址法&#xff1a;除留余数法&#xff1a; 哈希冲突解决哈希冲突闭散列&#xff1a;开散列&#xff1a; unordered系列关联式容器 之前讲解在C98中STL提供了底层为红黑树结构的一系列关联式容器&#xff…

Nginx域名重定向(如何访问的域名和实际的数据请求路径不同,可解决前端跨域)

感情需要被抑制&#xff0c;不能泛滥… 当需要将一个域名重定向到另一个域名并且用户仍然看到原始域名时&#xff0c;Nginx是一个强大的工具。这种场景通常涉及到反向代理或重写URL的技巧。在本篇博客中&#xff0c;我们将详细介绍如何使用Nginx来实现这个目标&#xff0c;以及…

精品基于Python的考场考试分配规划系统

《[含文档PPT源码等]精品基于Python的考场分配规划系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技…