65.9K
CodeProject 正在变化。 阅读更多。
Home

基于 GE Predix 时间序列摄入和数据流的工业 IoT 机器工具状况监控

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2016年8月6日

CPOL

36分钟阅读

viewsIcon

46060

downloadIcon

238

使用 GE Predix 时间序列摄入和数据流进行工业 IoT 时间序列数据收集

1. 概述

刀具磨损监测是指机床在运行过程中所遭受的磨损。每台机床都会遭受一定程度的磨损,具体取决于刀具类型、加工性质等。随着持续的磨损,刀具会在某个时间点变得无法使用。随着刀具的磨损,加工精度开始受到影响。当刀具无法再以一定水平的公差精度生产工件时,就需要更换。在工业中,通常采用标准程序来测量这些刀具的磨损。大多数这些方法都基于工业加速度计传感器和高精度多通道同步数据采集单元。刀具寿命预期定义为刀具可以使用的总预测时间。它通常使用泰勒方程计算得出,该方程通常取决于切削速度、切削深度、进给率和材料成分。但很多时候,由于各种生产过程(包括不当进给、不准确的材料成分等),预期寿命会偏离计算出的预期寿命。正如预期的那样,寿命是生产和维护规划的重要指标,许多公司现在正在采用标准的刀具观测方法,并试图预测准确的剩余使用寿命 (RUL)。RUL 定义为从当前时间起,刀具将失效(或简单地说,在生产中无法使用)的估计时间。通常,RUL 预测并不像描述的那样简单。目前正在该方向进行大量研究,以有效地估算 RUL。

其中一种常见的方法是基于机器学习的技术。机器学习方法是将已知数据提供给一个计算引擎,引擎根据这些数据对给定输入数据的状态进行分类,或者对状态变化进行预测分析。因此,这些技术依赖于特征。

如前所述,测量刀具质量的常见指标之一是测量其产生的振动。振动数据通过三个方向的总加速度进一步累积。这种随时间变化的数据也称为时间序列。因此,RUL 是一个与时间序列预测相关的问题。各种技术,包括神经网络

为了创建用于 RUL 的机器学习框架,首先必须在受限环境下将刀具使用到运行至失效 (RTF),并记录数据和观察寿命。这种技术已被传统地用于有效地规划维护计划。

随着计算和预测引擎的改进,在 RTF 期间获取的时间序列数据可以作为输入提供给机器学习技术,该技术可以使用神经网络、支持向量机、曲线拟合或其他技术来插值当前观测值,从而找出 RUL。

随着微软 Azure、IBM Watson 等公司提供的基于云计算的人工智能,许多公司正在寻求利用这些云服务提供商实现高精度准确的 RUL。这需要一个强大的数据采集、收集、分析和预测框架。在工业术语中,机器通常被称为资产。一家公司可能在生产的不同部门拥有多个正在运行的资产。此外,资产可能由不同制造商生产,具有不同的规格。泰勒方程取决于常数,这些常数又取决于资产类型、制造商、规格等。因此,RUL 需要以下基本要素:

  • 资产管理系统
  • RTF 数据
  • 数据采集与收集
  • 数据过滤
  • 预测分析(包含来自资产数据的指标)

通信的安全性和延迟成为上述堆栈之上的额外挑战。数据可靠性是堆栈需要解决的另一个问题。

一年前,在与班加罗尔一家公司合作后,我们开始着手 RUL 分析。我们的任务是分析通过 RTF 获取的数据,并找到一种能够适当地预测 RUL 的方法。

毋庸置疑,当我们开始这个项目时,整个项目都是离线的。我们收集数据并记录在文本文件中。然后,我们在 Matlab 中分析数据,并创建了基于阈值的技术,应用于各种转换域以估计 RUL。我们的整个实验基于一台车床和一项受限工作,采用单个刀具。我们意识到,在对数据有了充分了解之后,为单个资产-单个工作-单个刀具编写 RUL 分析并不那么困难。

现在考虑一家大型公司,拥有数百甚至数千个资产,部署在分散于整个地理区域的不同单元中,执行着多项复杂工作。创建通用 RUL 分析需要每个资产中每种工作的 RTF,这在生产周期中理论上是不可能的。

唯一的出路是使用基于云计算的机器学习技术,通过运行计划好的受限作业的不同资产的RTF来训练它。然后,如果将实时观测序列作为输入提供给该分析,它应该能够生成RUL警报。

工业自动化领域的各个参与者都有自己经过长时间针对特定行业完善的平台。他们的服务包含自己的中间件、用户界面和网关。因此,公司从一个供应商迁移到另一个供应商从来都不是一件容易的事。因为这需要协议、传感器、用户界面的全面改变,而忙于生产的公司几乎没有时间进行这些。所以传统上少数工业自动化公司主导了该行业几十年。现在,制造业和生产过程面临着巨大的挑战,公司被迫后退一步,审视其自动化和分析过程。基于云的服务广泛地开启了竞争。

GE 的 Predix 环境是当今工业物联网 (IIoT - 正如他们所说) 中最热门的话题之一。凭借 GE 在资产管理、维护计划和资产监控方面多年的经验,该行业正在对这个 PaaS 生态系统寄予厚望。很早就跳进了物联网浪潮,进入物联网生态系统大约一年半,我们认为这次 CodeProject 竞赛可能是更深入探索工业物联网的绝佳机会。我们非常兴奋地看到了一个专门的“工业物联网”部分。那是在正确的时间给予的正确动力。所以,我们开始了我们的工业物联网之旅。

免责声明:我们都不是机械工程师,因此本文中提供的许多定义可能与您从机械教科书中学到的内容并非完全精确。如果定义的描述或我们描述的工业流程存在技术性错误,我们在此提前请求您的原谅。此外,本文更像是 GE Predix 平台入门、理解 RUL 原理、使用 Intel Edison 等原型平台创建工业物联网模拟环境的初学者手册,而不是一个功能齐全的端到端通用 RUL 系统的完整堆栈。如果您是具有多年生产和维护规划经验的机械工程专家,请留下您宝贵的建议、评论和意见。如果您是新手并希望获得工业物联网入门指南,请将本文作为您的入门指南,但请务必同时参考一些其他机械工程教材。

2. 文章结构

我们的计划当然是使用 GE Predix 构建一个完整的堆栈 RUL 和机床分析框架。但当我们开始时,我们意识到这可能是我们所知的唯一比女性天性更复杂的事情(Moumita 不同意,她认为没有什么能比女性的复杂性更甚!)

所以,不幸的是我们没能构建出完整的系统。但我们对架构的复杂性一无所知。因此,我们将本文限制在时间序列数据摄取方面,这是基于云的 RUL 或机床健康/寿命分析的初步步骤之一。目标是详细阐述整个堆栈,尽可能多地涵盖,指出我们未能完成的部分,并请求社区帮助我们连接我们未能实现的几个点,以便将此解决方案转化为一个完整的过程。我们还将涵盖数据收集过程。这应该有助于开发人员社区理解行业中的数据采集先决条件,并帮助他们建模其架构以适应此类框架。

以下是本文的内容:

第一部分:采用 GE Predix 的 IIoT

  • 用于刀具寿命预期分析的实时加速度计数据采集(非物联网)
  • 关于将这种数据采集架构转换为物联网的讨论
  • GE Predix 入门
  • 开发微服务,用于将机器中采集到的数据实时发送到 GE Predix
  • 关于分析这些数据的讨论。

了解了数据采集的工作原理后,我们需要关注预测分析。但是,本文不涉及分析部分,因为那需要另外详细的讨论。

3. 工业中的实时数据采集过程

本节详细介绍了测试设施的总体描述和用于振动数据采集的仪器。适当的数据采集过程可以极大地提高故障检测的灵敏度。图片和描述来自印度班加罗尔的一家小型工业企业,我们与他们合作进行实验(应管理层要求,名称已省略)。我们目前讨论的是车床和车削操作。

3.1 车床

用于车削操作的车床是名为 HEIDENREICH & HARBECK 540 的中心车床。图 3.1 显示了本次工作所用的车床,表格给出了车床的规格。

图3.1:海登赖希与哈贝克540车床

车床是一种机床,它通过旋转工件主轴来执行各种操作,例如切割、打磨、滚花、钻孔或变形、端面加工、车削,通过施加到工件上的刀具来创建具有旋转轴对称性的物体[维基百科]。

表3.1:车床规格

3.2 刀具详情

选择硬质合金刀具用于对铝基碳化硅金属基复合材料进行可加工性研究。本次工作使用的硬质合金刀具如图 3.2 所示。使用的这些刀片由 Taegutec India Pvt ltd 制造。

图 3.2:Taegu Tec 硬质合金刀片

硬质合金是必须承受各种磨损(包括滑动磨损、侵蚀、腐蚀/磨损和金属对金属磨损)并表现出高韧性的零件的首选材料。它具有高抗压强度,抗挠曲,并在高温下保持其硬度值,这是一种在金属切削应用中特别有用的物理特性。 [通用硬质合金]

它在其他材料无法持久或会过早失效的应用中提供了长寿命。硬质合金行业通常将这种材料简称为“硬质合金”,尽管碳化钨硬质合金这两个术语可互换使用。

硬质合金刀片插入硬质合金刀柄中,如图 3.3 所示。刀片的几何形状如图 3.4 所示。硬质合金刀具的化学成分如表 3.2 所示。几何规格如表 3.3 所示。

您可以参考这篇关于刀具刀片的维基百科文章了解更多详情。

图3.3:目前工作中所用的刀柄

图 3.4:硬质合金刀片的几何形状

表3.2:硬质合金刀具的成分百分比

表3.3:硬质合金刀片几何规格

硬质合金刀片的硬度值为 55-70RC,熔点温度为 2800 °C。

本次工作使用的刀片是 C 型无涂层 IC20 牌号,具有 55°菱形,7°后角。刀具锋利切削刃的钝化表示部分磨损,而完全磨损的刀具则表示切削刃断裂。

3.3 数据采集系统结构

图3.5:数据采集系统信息流

数据采集系统

刀具状态监测通过对数据采集系统捕获的振动数据进行分析来实现。图 3.6 显示了数据采集系统中组件的集成。

图3.6:数据采集系统组件集成

8 通道分析仪 - 8 通道分析仪在 Abacus 的帮助下,由 Data Physics 模块化软件提供支持,既可用于录制又可用于分析,该软件允许您从通用 FFT 分析、数据录制和回放分析、环境测试、结构分析、声学、机械诊断和生产/质量控制测试等广泛范围中选择您所需的测量功能。 [Data Physics]

SignalCalc Mobilyzer 的核心功能包括强大的 FFT 测量、高动态范围和广泛的分析工具。标准功能包括完整的工程单位选择和转换、自动导出、专业报告、Signal Map 轻松数据管理、灵活的结果显示、用于详细分析的光标功能以及无与伦比的直观用户界面。(您可以在此处阅读更多关于 SignalCalc Mobilyzer 的信息。)

可选应用模块扩展了功能,包括实时倍频程和 1/3 倍频程分析、声功率和声强、基于转速的测量、阶次跟踪、MIMO 和步进正弦测试、平衡、SRS 分析、解调、转子动力学分析、多平面平衡、瀑布图和频谱图显示以及吞吐量到磁盘。

8 通道数据记录仪 - TEAC 数据记录仪(es8 记录仪)专为现场和实验室中快速设置、可靠记录应用而设计。 [TEAC] 图 3.7 显示了 ES8 记录仪。es8 记录仪使用 Compact Flash 存储卡进行记录。通过 LCD 和按键进行独立操作,可以设置、监控和记录。通过内置 USB 接口连接到 PC,可以执行波形监控和记录控制。所有通道同时采样,每个通道单独配备 16 位 A/D 转换器,使用内部干电池可连续记录约四个小时。外部电池将延长记录时间。采样频率范围为 5kHz 到 1/60Hz。结合各种类型的传感器放大器,可以进行广泛的测量 [TEAC es8],例如:地震、自然现象和结构振动、机械振动测量、应变测量和生物信号测量。它作为 8 通道分析仪的备份。它们旨在提供经济高效的数据记录和前端解决方案。

图 3.7:es8 数据记录仪

Kistler 放大器 - 型号 5357B12 如图 3.8 所示。电荷校准器可用于检查和校准压电测量系统。电荷校准器与测量链串联或并联连接,代替或并行于传感器。最多可连接五个电荷放大器。 [Kistler] 操作通过键盘或可选接口进行。设置的参数显示在 LCD 上。典型的应用是将电荷校准器与 1 到 5 个电荷放大器组合使用。

图 3.8:Kistler 放大器 - 5357B12 型

Kistler 三轴加速度计 - 振动信号对于车削操作中的机器状态监测非常重要。图 3.9 显示了三轴加速度计 (8766A500BB)。8766A250AA 和 8766A5BB 型是专为高温应用设计的三轴加速度计。它采用 Kistler 的 PiezoStar 剪切元件设计,提供理想的工作频率范围和极低的温度变化敏感度。与其它传感元件设计相比,该传感器结合了 PiezoStar 晶体和高增益集成混合微电子技术,在工作温度范围内实现了极低的灵敏度变化。 [Quality Digest]

图 3.9:Kistler 加速度计(传感器)

表3.4:Kistler 加速度计 (500BB) 规格

Kistler 加速度计 (8766A500BB) 通过攻丝安装在刀柄上,如图 3.10 所示。

图 3.10:传感器安装

3.4 实验设置、测试程序与分析

实验设置和测试程序

从以往的TCM研究回顾来看,采用三轴加速度计来检测多方向振动。图3.11显示了数据采集系统与传统车床的完整设置。Kistler放大器根据要求设定振动灵敏度为104.3 Hz,放大器的设置如图3.12所示。

加速度计安装在夹持切削工具的刀柄上,如图3.13所示。加速度计检测到的信号经过放大并记录。信号存储在数据采集程序(数据物理)中,将具有不同刀具磨损量(正常硬质合金刀具、中度磨损刀具、完全磨损刀具)的硬质合金刀片安装在传统车床上,以不同速度、进给和相同切削深度切削不同成分(LM6,即LM6+0%SiC;LM6+4%SiC;LM6+12%SiC)的金属基复合材料(LM6)工件。

图 3.11:实验设置

图 3.12:放大器灵敏度设置

在加工测试中,首先借助测速仪设置速度(图 3.14),加速度计安装在刀架上以收集加工过程中产生的振动数据(图 3.15)。振动信号由 Kistler 放大器生成并放大,然后由 8 通道分析仪记录。切削力数据采集通道已编程并使用数据物理记录,如图 3.16 所示。

图 3.13:安装在刀架上的加速度计

实验数据显示,振动幅度随切削条件的变化而变化。针对不同刀具磨损条件、不同主轴转速和进给速度进行了测试,这些数据已在表 7.1 中列出,其中:A-新刀具,B-部分(中度)磨损刀具,C-完全磨损刀具,分别对应 LM6+0%SiC;LM6+4%SiC;
LM6+12%SiC组合的样本1,2,3。图3.17展示了三种硬质合金刀具的状态。

图 3.14:设置速度

图 3.15:加工操作

图 3.16:刀塔处采集的振动数据示例

表3.5:实验安排表

图3.17:三种硬质合金刀片

3.5 将监测过程迁移到云的挑战

第3.4节介绍了机床健康监测过程的工业设置、组件及其排列。该设置主要是以非常高的采样率(如音频录制 - 22kHz)记录加速度计数据,然后存储。如果需要对这些数据进行在线分析,则需要以非常快的速度将数据上传到云端,而不会丢失连接或丢失数值。

16 位 ADC 以 22Khz 记录 3 个通道,导致每秒数据量为 48x22000 = 1.5KB。20 小时的记录将产生约 950 MB 的数据。这对于内存处理来说非常大。因此,通常情况下,此数据以 500 Hz-1 Khz 的频率重新采样,以减少样本数量。

我们随本文提供了一些样本录音,这有助于您分析数据的性质和复杂性。

图3.18:3轴工业加速度计数据样本

数据本质上包含三个记录 x、y 和 z 轴加速度的列。由于数据量庞大,我们需要一种特殊的测量方法来缓解数据存储,这通常被称为数据流。以下是亚马逊 Web 服务官方数据流解释对数据流服务的良好解释。

现在很清楚,这种数据缓解需要分块数据传输,其中块由时间戳标识。工业物联网数据流服务必须遵守这一基本原则。因此,基于云的机床健康监测数据记录架构必须:

  1. 在本地记录数据。
  2. 打开与服务器的连接。
  3. 一次性发送一组带时间戳的数据。
  4. 服务器必须分块存储数据,并必须向分析服务提供这种分块数据的访问权限。

然而,当今大多数所谓的“物联网云”服务提供商最大的错误之一是,他们假设每个数据都是一个独立的时间戳。这意味着数据被视为某个时间实例上的一个单一样本。这就是问题开始的地方。Azure、Bluemix 及相关物联网云存储/服务提供商都使用 MQTT 或 Websockets 的某种形式。数据可以作为序列发送,但会随时间进行串行时间戳。GE Predix 在这方面优于其他提供商。它通过其资产模型服务提供了一种机器的逻辑抽象选项,数据以块的形式进行流式传输,每个块都有一个唯一的 ID,并且时间序列与单个值或整个块本身相关联。

它提供了一种基于微服务的架构,其中每个独立的组件都可以单独开发和部署。

此外,它基于亚马逊网络服务,因此扩展绝不是问题。您可以按需付费。该平台使用其基于云的用户和应用程序认证架构 UAA,从一开始就提供安全的数据访问和交换。GE Predix 还提供逻辑级别(使用其自定义视图服务)和演示级别(使用基于 Angular JS 的 Px 组件)的可视化服务。

所以您获得了一整套工具,用于实现端到端的数据采集和可视化服务。但问题在于,尽管该平台在数据采集和工业及机器数据结构方面表现出色,但尚未配备强大的机器学习工具来分析这些数据,而 IBM Bluemix 和 Microsoft Azure 在这方面明显优于 Predix。

因此,构建 RUL 框架的一个好方法是使用 Predix 收集数据,并使用 Watson 或 Azure 进行分析。然后将此架构作为云服务发布,供应用程序使用。

在本文中,我们将重点开发一个使用 GE Predix 的微服务,以接收来自传感器的数据。我们将使用由 Intel Edison 开发板支持的简单仿真框架来展示该服务的实际运行,以便您可以在实验室中复制数据收集过程,测试服务的可扩展性、鲁棒性,然后进行实时集成。

在下一章中,我们将详细阐述 GE Predix 平台的一般情况,以及如何在平台上开始应用程序开发。

4. GE Predix 入门

在我们开始 Predix 之旅之前,让我们先了解一下 Predix 的整体架构。

图4.1:GE Predix 架构(图片来源 - i-programmer

如您所见,Predix 基于 Cloud Foundry,它提供了方便的开发和云部署。其核心是,该平台本身基于亚马逊网络服务构建,您的应用程序通过 Predix 托管在亚马逊网络服务上。Predix 通过一套工业标准标签将机器作为资产进行管理,这些标签唯一标识一台机器、其地理位置、制造商、属性等。

Predix 的核心是其连接服务,本质上是一套专为工业物联网量身定制的协议套件。

Predix 提供资产服务,包括资产元数据管理和数据采集服务。分析服务包括视图、审计服务和可视化服务。这些服务可以由为小尺寸设备优化的移动应用程序使用。

在开始使用 Predix 之前,您首先需要一个 predix.io 帐户。创建一个 60 天的 predix.io 试用帐户。等待 Predix 发送一封包含您帐户详细信息的电子邮件。如果您没有很快收到(很可能不会),请写信给 Predix 团队,提交支持工单,来回发送几封邮件,最终(如果您足够幸运)您会收到帐户。至少,我们团队的情况就是如此。我们三个人都注册了 Predix,但只有 Abhishek 获得了帐户。所以我们使用他的帐户深入研究 Predix。

假设您获得了 Predix 账户,您可以使用他们提供的 Predix 准备好的开发环境,称为 Devbox。它本质上是一个基于 Unix 的系统。所以如果您是 Windows 用户,您需要 VMware(Cygwin 不起作用)。我们并不特别喜欢在 VMware 中运行我们的开发环境。所以我们继续进行了一些破解,创建了自己的开发环境,没有使用 Devbox(设置起来并不困难,但也不容易!)

由于 GE 的核心是 Cloud Foundry,您需要先在机器上安装 Cloud Foundry 客户端。此外,如果您是初学者(很可能您正在阅读本文),那么您将需要 GE 提供的许多示例应用程序来了解其工作原理。其中大多数都托管在 Git 上。因此建议您也在机器上安装 Git。

Predix的微服务框架基于Java Spring。因此,您的机器上至少需要安装 JDK 1.8。我们建议您安装带有 Java 的 Netbeans 8,以便轻松进行微服务开发。

GE 的 Web 应用程序使用 Node.js 作为后端,Python 和 Angular.js 的变体作为前端。它支持 npm 包并通过 Bower 管理 Node.js 包。因此,您需要在系统中安装 Node.js 和 Bower。

在您编写第一个 Predix Hello World 程序之前,以下是软件(或者他们所说的应用程序!)的摘要。

  • Git
  • 云铸造
  • Node.js (npm)
  • 鲍尔
  • Python (2.7 - 某些服务严格运行在 2.7 版本)
  • Netbeans IDE (>8)

完成这些步骤后,让我们开始开发。

安装 Cloud Foundry 和 Hello World

  1. https://github.com/cloudfoundry/cli/releases 安装 Cf
  2. 在命令提示符中,输入:cf login -a https://api.system.aws-usw02-pr.ice.predix.io

    图 4.2:使用 Cf 登录您的 Predix API
  3. 下载 Predix Hellow World Web 应用
    https://github.com/PredixDev/Predix-HelloWorld-WebApp

  4. 提取 Hello World

    图4.3:Hello Predix 目录结构
  5. 打开 manifest.yml 并更改应用程序名称

  6. 更改 index.html 的内容
  7. cf push

    图 4.4:将您的 Hello Predix 应用程序推送到云端

    图4.5:应用程序在云端运行
  8. 进入 predix.io 控制台查看应用程序运行情况

    图 4.6:Predix 控制台 - Hello Predix 运行中
  9. 点击应用程序。

    图 4.7:通过控制台中的应用视图查看应用 URL

    复制 URL。这是您的服务运行的 URL。

  10. 打开 URL(不要忘记使用 https://)

    图 4.8:在浏览器中测试 Hello Predix

    当您从应用程序目录调用 cf push 命令时,buildpack 会搜索 .yml 文件。这是 Predix Web 应用程序的配置文件。稍后,我们还将看到如何将服务添加到此应用程序。

为访问 Predix Repo 设置 Maven 配置

由于我们用于从终端(或边缘)硬件收集数据并发送到 Predix 云的桥接应用程序是使用 Java 的 Spring 框架开发的,因此您需要为 Predix 设置 Java 开发环境。Predix 提供的示例应用程序都是 Maven 应用程序,并链接到 Maven 仓库。但 Predix 有一个小问题。Maven 中的实际 Predix 仓库是一个私有仓库,需要 Maven 应用程序进行身份验证。此身份验证令牌是通过从您的 Predix 凭据生成的哈希值。但问题是,它需要另一个 Predix Web 应用程序。您需要从该站点创建一个加密密码,将其作为凭据添加到您的 Maven 配置文件中,才能填充 Predix Maven 仓库。

  1. 打开 c:\users\<pc-user-name>\.m2 并打开 settings.xml
  2. 打开 settings.xml->在这里,您必须更改用户名和加密密码
  3. 设置加密密码
    https://artifactory.predix.io/artifactory/webapp/#/login
  4. 点击顶部的用户名,在下一页输入您的密码。

图 4.9:获取您的 Predix Maven 仓库的加密密码

下载本文提供的 settings.xml,用您刚刚生成的 YOUR_PREDIX_EMAILYOUR_ENCRYPTED_PASSWORD 替换。

<servers>
        <server>
            <id>predix.repo</id>
            <username>YOUR_PREDIX_EMAIL</username>
            <password>YOUR_ENCRYPTED_PASSWORD</password> 
            <!-- Obtained from https://artifactory.predix.io -->
        </server>
    </servers>

在 Predix 中创建时间序列

我们将很快回到 Java 微服务开发。但在此之前,您需要完成更多的步骤。微服务是一个安全的服务,它基于 Predix 的安全 API 模型工作。Predix 提供两种安全服务:UAA(用户帐户和身份验证)和身份验证服务。UAA 是使用 Predix 的最基本步骤,因为其他服务都通过它进行身份验证。

  1. Predix.io 目录打开用户 UAA 服务

    图 4.10:订阅 UAA 服务
  2. 创建新的服务实例:订阅按钮将带您进入新的 UAA 服务实例创建页面。您需要指定一个管理员密码(Admin client secret),我们已将其设置为 admin。您需要指定一个子域名,可以是任何内容。所有将利用此认证的应用程序都需要在此子域名下运行。我们这里使用 rupam。为服务实例命名,我们已将其设置为 rupamUAA

    图 4.11:在 UAA 中创建新的服务实例
  3. 克隆时间序列应用程序:开始使用 GE Predix 时间序列绝非易事。我建议您克隆他们的参考应用程序仓库(或者更好的是,下载我们提供的预配置示例应用程序)
    git clone https://github.com/PredixDev/timeseries-bootstrap.git

  4. 通过进入 app 目录来构建 mvn 项目。
    mvn clean package

    它将显示时间序列构建

    图 4.12:时间序列参考应用程序的 Maven 构建
  5. 订阅时间序列:Predixx 在 Cloud Foundry 市场中拥有自己的时间序列服务。您的时间序列应用程序需要利用 Predix 的时间序列服务。因此,就像 UAA 一样,从 Predix 目录订阅时间序列。订阅时,它会要求您选择一个 UAA。由于我们已经创建了名为 rupamUAA 的 UAA 实例,因此我们在订阅时选择了它。下图显示了通过 UAA 订阅 TS 服务

    4.13:使用您的 UAA 订阅时间序列服务
  6. 检查时间序列参考架构
    https://www.predix.io/docs/#Y5J5gFHz

    为了使用 Predix 时间序列,您需要了解其架构。该服务基本上有两个端点:摄取服务和查询服务。摄取服务是一个基于 WebSocket 的钩子,用于数据流 Predix 服务。在我们的微服务 Java 应用程序中,我们将利用这个钩子并暴露一个服务端点。

  7. 将时间序列和 UAA 都绑定到您创建的应用程序
    cf bind-service RupamsHelloPredixWeb rupamUAA
    cf bind-service RupamsHelloPredixWeb rupamTs

    RupamHelloPredixWeb 替换为您为 Predix Hello World 应用程序设置的任何名称。

    图 4.13:将服务实例绑定到主应用程序

    将服务实例绑定到应用程序后,您可以转到 Predix.io 控制台并浏览您的 TS(我们已将其命名为 rupamTS),以检查绑定情况。

    图 4.14 验证服务绑定
  8. 获取应用程序环境变量:利用 Predix 服务的程序需要应用程序环境变量才能与云应用程序结构进行通信,而云应用程序结构又负责服务网关。当您将 UAA 服务与应用程序绑定时,您的程序将通过环境变量利用这些已订阅的服务。

    在命令提示符中,键入:cf env RupamsHelloPredixWeb >> env.rtf 将所有环境变量下载到名为 env.rtf 的单个文件中。

    Predix 的另一个问题是,即使您已经使用 UAA 创建了时间序列,该绑定也只允许您的时间序列实例使用您的 UAA,但不会验证基于时间序列的 API 调用。您需要手动设置权限。此设置也称为访问授权。服务访问授权需要通过在 UAA 范围中添加服务环境变量来执行,这需要您使用另一个 Predix Web 应用程序来完成。

    首先,从 Predix.io 控制台打开您的 UAA 实例,在我们的例子中是 rupamUAA。在右侧,您将看到一个“配置 UAA”选项。

    首先,您需要以管理员身份登录,这又需要您的 UAA 的管理员 URL。

    打开 env.rtf 查看 uaa 的 url 并将其粘贴到 Admin 登录的 url 部分。

    图 4.15:在 Predix UAA Web 应用(称为 Predix 入门套件应用)中设置 UAA 管理员 URL
  9. 创建 UAA 客户端:管理特权和实例不得用于授权最终应用程序。它必须通过另一个名为 UAA 客户端的实例完成。登录您的 Predix starter web 应用程序后,选择创建客户端选项。

客户端是用于从 UAA 服务器生成应用程序访问令牌的实体。因此,必须在客户端中授予权限。此客户端需要您希望通过此客户端授权的服务环境变量的区域 ID 范围。

从您的 env.txt 中,在客户端创建表单的 resource.id 字段后,复制时间序列(摄取和查询)的区域凭据。结果应如下所示(这显示了我们在创建客户端时,rupamTSrupamUAA 的情况)。

引用

{"client_id":"rupam","client_secret":"rupam","scope":["uaa.none","openid"],"authorized_grant_types":["authorization_code","client_credentials","refresh_token","password"],"authorities":["openid","uaa.none","uaa.resource","timeseries.zones.68262012-bfea-4dc9-abd5-d1360153f783.user","timeseries.zones.68262012-bfea-4dc9-abd5-d1360153f783.ingest","timeseries.zones.68262012-bfea-4dc9-abd5-d1360153f783.query"],"autoapprove":["openid"]}

表单视图如图 4.16 所示。

图 4.16:通过在范围中添加时间序列的区域 ID 来创建新的 UAA 客户端。

使用新客户端配置 Java Spring 微服务

现在再次进入 Spring 时间序列引导应用程序的 /config/application.properties,并添加您的客户端 ID 和客户端 secret,如图 4.17 所示。

图 4.17:在引导应用程序中配置 UAA 客户端凭据。

application.properties 看起来像这样(必须通过进入 project directory/config 进行编辑)

///--------------application.properties---------//
#properties for running locally or for unit tests
logging.level.root=INFO
logging.level.org.springframework=INFO
#<currentworkingdir>/config/application.properties are 
#local overrides to src/main/resources(aka classpath)/application.properties
server.port=9000

spring.profiles.active=local

#you should change these properties to match your own UAA, 
#ClientId, User and PredixAsset instances.
predix.oauth.certLocation=91d20548-2107-4bdb-be47-787c25ca69ac.
predix-uaa.run.aws-usw02-pr.ice.predix.io
predix.oauth.tokenType=JWT
predix.oauth.resource=/oauth/token
predix.oauth.restPort=80
predix.oauth.grantType=client_credentials
predix.oauth.clientIdEncode=true
# e.g. predix.oauth.restHost=36492c1e-657c-4377-ac51-add963552460.predix-uaa.cloud.com
predix.oauth.restHost=rupam.predix-uaa.run.aws-usw02-pr.ice.predix.io
predix.oauth.clientId=rupam:rupam
predix.websocket.uri=
wss://gateway-predix-data-services.run.aws-usw02-pr.ice.predix.io/v1/stream/messages
#predix.websocket.uri=wss://put.your.websocket.service.instance.here/v1/stream/messages
predix.websocket.zoneid=68262012-bfea-4dc9-abd5-d1360153f783

//////////--------------------------------------------------------------------//

这里,websocket.uri 是时间序列摄取 websocket uri,它将类似于 wss://oauth.clientId,必须指定为 client_name:client_secret 格式,您在创建 UAA 客户端时必须记下这一点。

相应的环境变量如下所示(以便您可以匹配)

Getting env variables for app RupamsHelloPredixWeb in org abhishek.nandy81@gmail.com 
/ space dev as abhishek.nandy81@gmail.com...
OK

System-Provided:

{
"VCAP_SERVICES": {
"predix-timeseries": [
{

"credentials": {
"ingest": {
"uri": "wss://gateway-predix-data-services.run.aws-usw02-
        pr.ice.predix.io/v1/stream/messages",
"zone-http-header-name": "Predix-Zone-Id",
"zone-http-header-value": "68262012-bfea-4dc9-abd5-d1360153f783",
"zone-token-scopes": [
"timeseries.zones.68262012-bfea-4dc9-abd5-d1360153f783.user",
"timeseries.zones.68262012-bfea-4dc9-abd5-d1360153f783.ingest"

]

},

"query": {

"uri": "https://time-series-store-predix.run.aws-usw02-pr.ice.predix.io/v1/datapoints",
"zone-http-header-name": "Predix-Zone-Id",
"zone-http-header-value": "68262012-bfea-4dc9-abd5-d1360153f783",
"zone-token-scopes": [
"timeseries.zones.68262012-bfea-4dc9-abd5-d1360153f783.user",
"timeseries.zones.68262012-bfea-4dc9-abd5-d1360153f783.query"
]

}

},

"label": "predix-timeseries",
"name": "rupamTs",
"plan": "Tiered",
"provider": null,
"syslog_drain_url": null,
"tags": [
"timeseries",
"time-series",
"time series"
]

}

],

"predix-uaa": [

{
"credentials": {
"issuerId": "https://rupam.predix-uaa.run.aws-usw02-pr.ice.predix.io/oauth/token",
"subdomain": "rupam",
"uri": "https://rupam.predix-uaa.run.aws-usw02-pr.ice.predix.io",
"zone": {
"http-header-name": "X-Identity-Zone-Id",
"http-header-value": "508a9e67-4ff4-41c5-8851-45e20124be4d"
}

},

"label": "predix-uaa",
"name": "rupamUAA",
"plan": "Tiered",
"provider": null,
"syslog_drain_url": null,
"tags": []
}

]

}

}


{

"VCAP_APPLICATION": {

"application_id": "5654088b-c7a3-44d5-b054-c7be41aa7911",
"application_name": "RupamsHelloPredixWeb",
"application_uris": [
"rupamshellopredixweb.run.aws-usw02-pr.ice.predix.io"
],

"application_version": "5e55585e-1d93-414f-bc60-2051210ad4f3",

"limits": {
"disk": 1024,
"fds": 16384,
"mem": 64
},

"name": "RupamsHelloPredixWeb",
"space_id": "cf1c5b44-e183-48cb-8229-39d69f6d27b9",
"space_name": "dev",
"uris": [
"rupamshellopredixweb.run.aws-usw02-pr.ice.predix.io"
],

"users": null,
"version": "5e55585e-1d93-414f-bc60-2051210ad4f3"
}

}
No user-defined env variables have been set
No running env variables have been set
No staging env variables have been set


///////////////////////////////////////////////////////////////////

如果您现在编译时间序列引导应用程序,该应用程序将被编译。

然而,Predix 提供的这个微服务不附带任何 API 端点!!!!!

那是什么意思?这意味着服务无法从任何设备调用或利用,因为即使将其部署到云端,它们也只是其他服务可以调用的服务,而不是任何设备可以调用的。

但是,我们希望我们的工业加速度计能够使用时间序列服务将数据放入 Predix 云。对吗?

为此,我们需要为微服务定义 API 端点。因此,我添加了端点,以便使用标准 Spring 方法将我们的引导微服务暴露给外部世界。

引导应用程序提供的主要 beans 类是 WebServiceClientImpl.java 类,它定义了连接和流数据到 Predix 云的方法。

  • postTextWSData
  • postTextArrayWSData
  • postBinaryWSData

是实现中提供的示例方法,但是,我们希望流式传输时间序列数据,而不是二进制或文本数据。

有趣的是,com.ge.predix.solsvc.service 下的 HelloController 类实现了您需要查看的方法。

postDataTest 方法是允许您使用 WebSocket 客户端将时间序列数据(单条目)发送到 Predix 云的方法。

但是,您不能发送任何任意格式的数据。您需要发送 JSON 数据,而且是 Predix 支持的特定格式,其中包括 messageID、interval、字段数量和 tagtag 是查询服务用于识别您的数据序列的字段。

所以,我们更新了该方法,使其支持 Predix 特定数据条目,如下所示:

    @Autowired
    protected RestClient restClient;
    @Autowired
    private WebSocketClient client;

    @Value("${predix.websocket.uri}")
    private String injectionUri;

    @Value("${predix.websocket.zoneid}")
    private String zoneId;

        public String postDataTest(String name, String value) {
        
        //headers required for authentication and for predix service
        List<Header> headers = this.restClient.getSecureTokenForClientId();
        headers.add(new BasicHeader("Predix-Zone-Id", this.zoneId)); //$NON-NLS-1$
        // Origin header required as it is not being set by the websocket
        headers.add(new BasicHeader
                   ("Origin", "https://")); //$NON-NLS-1$ //$NON-NLS-2$
        WebSocket ws = null;
                String s="";
        //connect to websocket once
        try {
                   
            ws = this.client.connectToWS(this.injectionUri, headers);
            
            //post data multiple times
                        long millis = new java.util.Date().getTime();
            String testMessage1 = "{\"messageId\": \" R"+millis+"\",
            \"body\": [{\"name\": \""+name+ "\",\"datapoints\": 
            [["+millis+","+value+",3]],\"attributes\": {\"host\": 
            \"rupamServer\",\"customer\": \"rupam\"}}]}"; //$NON-NLS-1$
            this.client.postTextWSData(ws,testMessage1);
            s="Data Posted.. mId="+millis+" tag="+name+"value="+value+" 
               ac msg="+testMessage1+"url="+this.injectionUri+"zone="+this.zoneId;

        } catch (IOException e) {
            fail("Failed to connect to WS due to IOException."+
                  e.getMessage()); //$NON-NLS-1$
            e.printStackTrace();
                        s= "Could not post data"+e.getMessage();
        } catch (WebSocketException e) {
            fail("Failed to connect to WS due to WebSocketException."+
                  e.getMessage()); //$NON-NLS-1$
                        s= "Could not post data"+e.getMessage();
        }
            
        try {//wait added for time delay in callback from websocket endpoint
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            fail("Failed due to thread interruption."+e.getMessage()); //$NON-NLS-1$
        }
        
        //disconnect once after posting all messages
        try {
            this.client.disconnectFromWS(ws);
        } catch (IOException e) {
            fail("Failed to connect to WS due to WebSocketException."+
                  e.getMessage()); //$NON-NLS-1$
        }    
                return s;
    }

下一部分是定义 API 端点。

这是通过使用请求映射技术完成的

 @RequestMapping("/hello")
    public String hello(@RequestParam(value="name",defaultValue="rupam") 
    String name,@RequestParam(value="value",defaultValue="1") String value) {
        return "hello "+ postDataTest(name, value)+ "
        </br>Greetings from Predix Spring Boot! " + (new Date());
    }

因此,your_predix_web_app_url/hello?name=field_name&value=field_value 就成了您调用该服务的完整 GET URL,该服务将内部调用 postDatatest,后者会根据 predix 特定格式对数据进行格式化。

执行 Netbeans 项目。默认情况下,本地服务将在端口 9000 运行。因此,在浏览器中,如果您输入:

localhost:9000/hello?name=acc_x&value=33

它将针对名为 acc_x 的标签输入 33。

在本地测试完数据后,您需要做的就是将应用程序部署到云端。进入引导应用程序目录并使用 cf push。

但是,在您能够将应用程序推送到 Predix 云之前,您需要配置此项并更新项目目录中的 pom.xml。这是我们示例项目的 pom 文件。

图 4.18:通过本地 API 端点进行数据存储(点击放大)

现在将解决方案部署到云端

我们需要使用 cf push 将项目推送到云端。

进入包含 pom.xmlmanifest.yml 的项目目录。cf 会从 manifest.yml 读取配置。所以打开您的 pom,查看 artifact id 并将其放入 yml 文件中。然后进入 target 目录,查看 .jar 文件并将名称输入为 target

这是 pom.xml 片段

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ge.predix.solsvc</groupId>
<artifactId>rupam-time-series</artifactId>
<version>1.1.6</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->

您需要相应地更改 yml 文件

这是 yml 文件

---

applications:
- name: rupam-time-series
buildpack: java_buildpack
path: target/rupam-time-series-1.1.6.jar
spring:
profiles: development
server:
port: 9000

---

spring:
profiles: production
server:
port: 0
Important : Make sure Server port:0 in yml file.

Also go to src folder . src/resources/application.properties: 
This is production properties. Set server port to 0 here and make sure 
that this also has the same credentials.

path 应该是编译后的 jar 文件的相对路径,通常会在 target 目录中。Server port=0 有助于云将服务器端口配置为可用端口,而不是绑定到特定端口,因为该端口可能由于其他服务而并非总是可用。

前往控制台查看云 URL。

图 4.19:您的数据摄取服务的云 API 端点

您可以像本地推送数据一样推送,也可以使用我们的 API 端点(直到我们的免费试用期结束)

https://rupam-time-series1.run.aws-usw02-pr.ice.predix.io/hello?name=rupam&value=51.9(更改值和标签)

好的,我们能够使用浏览器调用端点。但是如何从我们的物联网设备调用呢?Unix 提供了一个很棒的命令 curl,您可以使用它通过命令提示符调用任何网站。

从命令提示符调用服务

我们的物联网设备将使用 curl 工具调用此服务。因此,在命令提示符中,键入 curl 后跟上述 URL,并检查数据是否已发布。

验证数据

您可以进入 Predix starter web 中的 API explorer 部分。在区域 ID 字段中输入时间序列查询的区域 ID,选择时间相关数据。它将默认打开 1 年数据的 JSON 格式。只需更改名称和限制,最终您就能看到您的辛勤工作结出硕果。:)

图 4.20:使用查询验证数据摄取

本质上,应用程序还必须有一个可视化客户端。但是,使用 Predix 生态系统进行开发的复杂性超出了本文的范围。您可以通过 API explorer 获取数据,并使用任何 JSON 解析器进行解析,以获取数据数组,然后您可以将其保存为任何格式。

如果您想了解 Predix 中最终的可视化效果,可以打开 Predix 提供的正在运行的示例:

https://rmd-ref-app.run.aws-usw02-pr.ice.predix.io/dashboard

引用

用户名:app_user_1

密码:app_user_1

您可以看到 UI 应用程序正在运行,如下图所示:

图4.21:RMD参考应用示例结果显示实时数据监控

该应用程序还指向其 GitHub 仓库。您可以下载 RMD 应用程序并构建它。我们避免这样做,因为涵盖构建该应用程序所需的所有方面超出了本文的范围。

问题是,如果您想测试这些服务,您将如何做?有时,车床和工业标准监控服务并非总是可用。但是,您可以使用一些简单的硬件设置重现该用例。我们介绍了一种基于 Intel Edison 的环境,通过它我们可以将数据发送到我们创建的 Predix 数据摄取端点。

5. 基于 Intel Edison 的数据摄取模拟

无论您是谁,无论您拥有何种专业水平,如果您正在从事物联网工作,没有什么比将实时数据缓解到云端更能给您带来乐趣了。部分原因是因为物联网毕竟是“连接事物”,如果事物不在云端,您如何说它们已连接?

通过真实设备推送数据,除了满足开发人员之外,还具有许多其他目的。它可以作为测试台,用于研究系统的延迟、鲁棒性和吞吐量。因此,我们认为如果我们能复制第 3 节中开发的场景,以便开发人员可以重现真实用例,那将是一个好主意。

正如我们从第 3 节中学到的,RUL 预测本质上可以使用工业级三轴加速度计来执行。但如果您没有它,请不要担心。您始终可以使用 Raspberry Pi 或 Intel Edison 等低成本物联网原型开发板。

图 5.1 加速度计与 Edison 的连接

加速度计与 Edison 的连接非常简单。只需将其连接到 Grove 基座扩展板的 I2C 端口,如上图所示。

Node.js 有 Edison 加速度计包

jsupm_mma7660

使用 npm 安装该包。记录加速度计数据的示例代码已包含在该包中。

我们将派生代码并添加 curl 命令以将数据推送到 Predix 云。

var digitalAccelerometer = require('jsupm_mma7660');
var myDigitalAccelerometer = new digitalAccelerometer.MMA7660(
digitalAccelerometer.MMA7660_I2C_BUS,
digitalAccelerometer.MMA7660_DEFAULT_I2C_ADDR);
myDigitalAccelerometer.setModeStandby();
myDigitalAccelerometer.setSampleRate(digitalAccelerometer.MMA7660.AUTOSLEEP_64);
myDigitalAccelerometer.setModeActive();
var ax, ay, az;
ax = digitalAccelerometer.new_floatp();
ay = digitalAccelerometer.new_floatp();
az = digitalAccelerometer.new_floatp();
var outputStr;
var myInterval = setInterval(function()
{
myDigitalAccelerometer.getAcceleration(ax, ay, az);
outputStr = "Acceleration: x = "
+ roundNum(digitalAccelerometer.floatp_value(ax), 6)
+ " y = " + roundNum(digitalAccelerometer.floatp_value(ay), 6)
+ " z = " + roundNum(digitalAccelerometer.floatp_value(az), 6);
console.log(outputStr);
},50);
function roundNum(num, decimalPlaces)
{
var extraNum = (1 / (Math.pow(10, decimalPlaces) * 1000));
return (Math.round((num + extraNum)
* (Math.pow(10, decimalPlaces))) / Math.pow(10, decimalPlaces));
}

setInterval 方法每 50 毫秒循环一次(因此采样率为 20Hz,太低了!)digitalAccelerometer.floatp_value(ax), digitalAccelerometer.floatp_value(ay), digitalAccelerometer.floatp_value(az) 提供三个轴的加速度。

使用另一个名为 sysnpm 包,它允许您从 Node.js 调用 Unix 系统调用。使用 child_process 以单独的线程执行系统调用。

var sys = require('sys')

var exec = require('child_process').exec;
function puts(error, stdout, stderr) { sys.puts(stdout) }

假设我们要存储 X 轴加速度

var s="curl 
\"https://rupam-time-series1.run.aws-usw02-pr.ice.predix.io/hello?name=acc_x&value="+
roundNum(digitalAccelerometer.floatp_value(ay), 2)+ "\"";
exec(s);

就是这样!它会将数据放入您的 Predix 云中。您可以修改微服务,使其像我们一开始讨论的那样,同时以分块形式发布多个数据。

现在您可以模拟系统并查看数据。使用任何标准编程语言从查询服务获取 REST API,以获取结果数据,您可以将其用于您的分析框架。

6. 结论

在本教程中,我们详细阐述了在实际工业设置中,利用加速度计数据分析刀具寿命的过程。我们介绍了传感器及其他组件,以及用于数据采集的工业设置和标准。然后,我们介绍了基于 Predix 时间序列的数据流和摄取服务,将数据收集过程转移到云端。接着,我们提出了一种模拟驱动的方法,用于模拟工业设置并使用 Intel Edison 测试服务。

我们还提供了记录的数据集,003 是表 3.5 的第一行,004 是下一行,依此类推。您可以使用 RTF 数据手动上传到 Azure 等机器学习框架,然后构建您的 RUL 系统。

希望本教程能帮助您入门 IIoT,并使您轻松抽象学习曲线的逻辑模型,从而轻松构建您的 IIoT 架构。

© . All rights reserved.