你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:实现 Azure 工业 IoT 参考解决方案体系结构

制造商希望在全球范围内部署一个整体工业 IoT 解决方案,并将所有生产站点连接到此解决方案,以提高每个生产站点的效率。

这些效率的提高导致了生产速度更快且能源消耗更低,所有这些都降低了生产产品的成本,同时在大多数情况下提高了产品的质量。

该解决方案必须尽可能高效,并支持所有必需的用例,例如条件监视、设备综合效率 (OEE) 计算、预测和异常情况检测。 通过使用从这些用例中获得的见解,可以创建一个数字反馈循环,然后它可以对生产过程应用优化和其他更改。

互操作性是实现解决方案体系结构快速推出的关键。 使用开放标准(如 OPC UA)极大地有助于实现这种互操作性。

本教程介绍如何使用 Azure 服务部署工业 IoT 解决方案。 此解决方案对所有运营技术 (OT) 数据使用 IEC 62541 开放平台通信 (OPC) 统一体系结构 (UA)

先决条件

需要 Azure 订阅才能完成本教程中的步骤。 如果没有 Azure 订阅,请在开始之前创建一个免费帐户

参考解决方案体系结构

下图显示了工业 IoT 解决方案的体系结构:

显示 Azure 和 Microsoft Fabric 选项的简化体系结构:

简单的工业 IoT 体系结构示意图。

显示 Azure 选项的详细体系结构:

工业 IoT 体系结构示意图。

下表描述了此解决方案中的关键组件:

组件 说明
工业资产 Docker 容器中托管的一组已启用 OPC UA 的模拟生产线。
Azure IoT 操作 Azure IoT 操作是边缘的统一数据平面。 它包括一组在已启用 Azure Arc 的边缘 Kubernetes 群集上运行的模块化、可缩放且高度可用的数据服务。
数据网关 此网关将本地数据源(如 SAP)连接到云中的 Azure 逻辑应用。
Azure 事件中心 云消息中转站,从边缘网关接收 OPC UA 发布/订阅消息并存储它们,直到订阅服务器检索到为止。
Azure 数据资源管理器 用于高级云分析(包括内置异常情况检测和预测)的时序数据库和前端仪表板服务。
Azure 逻辑应用 Azure 逻辑应用是一个云平台,可用于创建和运行自动化工作流,几乎没有代码。
Azure Arc 此云服务用于在边缘管理本地 Kubernetes 群集。
Microsoft 托管 Grafana Azure 托管 Grafana 是 Grafana Labs 基于 Grafana 软件构建的数据可视化平台。 Grafana 是由 Microsoft 托管并提供支持的一项完全托管服务。
Microsoft Power BI Microsoft Power BI 是 SaaS 软件服务、应用和连接器的集合,它们协同工作,将不相关的数据源转换为一致的、直观逼真的交互式见解。
Microsoft Dynamics 365 Field Service Microsoft Dynamics 365 Field Service 是一种用于管理现场服务请求的统包式 SaaS 解决方案。
UA Cloud Commander 此开放源代码引用应用程序将发送到 MQTT 或 Kafka 中转站(可能位于云中)的消息转换为对连接的 OPC UA 服务器的 OPC UA 客户端/服务器请求。 该应用程序在 Docker 容器中运行。
UA Cloud Action 此开放源代码参考云应用程序查询 Azure 数据资源管理器以获取特定数据值。 数据值是其中一台模拟生产线机器中的压力。 当达到某个阈值 (4,000 mbar) 时,它通过 Azure 事件中心调用 UA Cloud Commander。 然后,UA Cloud Commander 通过 OPC UA 在计算机上调用 OpenPressureReliefValve 方法。
UA Cloud Library UA Cloud Library 是 OPC UA 信息模型的在线存储,由 OPC Foundation 托管
UA Edge Translator 此开源工业连接参考应用程序从专有资产接口转换为 OPC UA。 该解决方案使用 W3C 物联网说明作为架构来描述工业资产接口。

注意

在实际部署中,像打开减压阀这样关键的事情将在现场完成。 这只是如何实现数字反馈循环的一个简单示例。

生产线模拟

该解决方案使用由多个工作站组成的生产线模拟,使用工作站 OPC UA 信息模型和简单的制造执行系统 (MES)。 工作站和 MES 都已容器化,以便于部署。

模拟配置为包含两条生产线。 默认配置为:

生产线 理想的周期时间(以秒为单位)
慕尼黑 6
Seattle 10
班次名称 开始 结束
上午 07:00 14:00
下午 15:00 22:00
夜间 23:00 06:00

注意

轮班时间是本地时间,特别是承载生产线模拟的虚拟机 (VM)设置为的时区。

工作站 OPC UA 服务器使用以下 OPC UA 节点 ID 来对云进行遥测:

  • i=379 - 制造的产品序列号
  • i=385 - 制造的产品数
  • i=391 - 丢弃的产品数
  • i=398 - 运行时间
  • i=399 - 故障时间
  • i=400 - 状态(0= 工作站准备工作,1= 正在工作,2= 工作已完成且生产状况良好,3= 工作已完成但生产有废料,4= 工作站处于故障状态)
  • i=406 - 能耗
  • i=412 - 理想的周期时间
  • i=418 - 实际周期时间
  • i=434 - 压力

使用 UA Cloud Commander 和 UA Cloud Action 进行数字反馈循环

该解决方案使用数字反馈循环来管理模拟工作站中的压力。 为了实现反馈循环,该解决方案在模拟中的一个 OPC UA 服务器上触发云中的命令。 当模拟时序压力数据达到特定阈值时,触发器将激活。 可以在 Azure 数据资源管理器仪表板中看到程序集计算机的压力。 西雅图生产线定期释放压力。

安装生产线模拟和云服务

选择“部署”按钮,将所有必需的资源部署到 Azure 订阅:

部署到 Azure

部署过程会提示你为托管生产线模拟和 Edge 基础结构的虚拟机 (VM) 提供密码。 该密码应包含以下三项:小写字符、大写字符、数字、特殊字符。 该密码长度必须介于 12 到 72 个字符之间。

注意

为了降低成本,该部署为生产线模拟和 Edge 基础设施创建了单个 Windows 11 Enterprise VM。 在生产方案中,不需要生产线模拟,对于基本 OS,应使用 Windows IoT Enterprise 长期服务渠道。

部署完成后,使用 RDP 连接到已部署的 Windows VM。 可以通过 Azure 门户中 VM 页面上的“连接”选项下载 RDP 文件。 使用你在部署期间提供的凭据登录,打开一个 Windows 命令提示符,并使用以下命令安装适用于 Linux 的 Windows 子系统 (WSL):

wsl --install

命令完成后,重新启动 VM 并重新登录。 命令提示符会完成 WSL 安装,系统会提示你为 WSL 输入一个新用户名和密码。 然后,在 WSL 中,使用以下命令安装轻型 Kubernetes 运行时 K3S:

curl -sfL https://get.k3s.io | sh

你的 VM 现已准备好运行生产线模拟。

运行生产线模拟

在 VM 中,打开 Windows 命令提示符,输入“wsl”,然后按 Enter。 导航到 /mnt/c/ManufacturingOntologies-main/Tools/FactorySimulation 目录并运行 StartSimulation shell 脚本:

sudo ./StartSimulation.sh "<Your Event Hubs connection string>"

<Your Event Hubs connection string> 是你的事件中心命名空间连接字符串。 若要了解详细信息,请参阅获取事件中心连接字符串。 连接字符串如下所示:Endpoint=sb://ontologies.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=abcdefgh=

注意

如果 Kubernetes 服务的外部 IP 地址显示为 <pending>,请使用以下命令分配 traefik 服务的外部 IP 地址:sudo kubectl patch service <theService> -n <the service's namespace> -p '{"spec": {"type": "LoadBalancer", "externalIPs":["<the traefik external IP address>"]}}'

提示

为防止 WSL 和 K3s 自动关闭,请使 WSL 命令提示符保持打开状态。

UA Cloud Library

若要直接从 Azure 数据资源管理器读取 OPC UA 信息模型,可以将 OPC UA 信息模式中定义的 OPC UA 节点导入到一个表中。 你可以在查询中使用导入的信息来查找更多元数据。

首先,通过在 Azure 数据资源管理器群集上运行以下查询,为 UA Cloud Library 配置 Azure 数据资源管理器标注策略。 在开始之前,请确保你是群集中 AllDatabasesAdmin 角色的成员,可以在 Azure 门户中通过导航到 Azure 数据资源管理器群集的“权限”页进行配置。

.alter cluster policy callout @'[{"CalloutType": "webapi","CalloutUriRegex": "uacloudlibrary.opcfoundation.org","CanCall": true}]'

然后,从 Azure 门户运行以下 Azure 数据资源管理器查询。 在查询中:

  • <INFORMATION_MODEL_IDENTIFIER_FROM_THE_UA_CLOUD_LIBRARY> 替换为你要从 UA Cloud Library 导入的信息模型的唯一 ID。 可以在 UA Cloud Library 中信息模型页面的 URL 中找到此 ID。 例如,本教程使用的工作站节点集的 ID 为 1627266626
  • <HASHED_CLOUD_LIBRARY_CREDENTIALS> 替换为 UA Cloud Library 凭据的基本授权标头。 使用工具(例如 https://www.debugbear.com/basic-auth-header-generator)生成哈希。 还可以使用以下 bash 命令:echo -n 'username:password' | base64
let uri='https://uacloudlibrary.opcfoundation.org/infomodel/download/<INFORMATION_MODEL_IDENTIFIER_FROM_THE_UA_CLOUD_LIBRARY>';
let headers=dynamic({'accept':'text/plain', 'Authorization':'Basic <HASHED_CLOUD_LIBRARY_CREDENTIALS>'});
evaluate http_request(uri, headers)
| project title = tostring(ResponseBody.['title']), contributor = tostring(ResponseBody.contributor.name), nodeset = parse_xml(tostring(ResponseBody.nodeset.nodesetXml))
| mv-expand UAVariable=nodeset.UANodeSet.UAVariable
| project-away nodeset
| extend NodeId = UAVariable.['@NodeId'], DisplayName = tostring(UAVariable.DisplayName.['#text']), BrowseName = tostring(UAVariable.['@BrowseName']), DataType = tostring(UAVariable.['@DataType'])
| project-away UAVariable
| take 10000

若要查看 OPC UA 信息模型的图形表示形式,可以使用 Kusto 资源管理器工具。 若要呈现工作站模型,请在 Kusto 资源管理器中运行以下查询。 为了获得最佳结果,请将 Layout 选项更改为 Grouped,并将 Labels 更改为 name

let uri='https://uacloudlibrary.opcfoundation.org/infomodel/download/1627266626';
let headers=dynamic({'accept':'text/plain', 'Authorization':'Basic <HASHED_CLOUD_LIBRARY_CREDENTIALS>'});
let variables = evaluate http_request(uri, headers)
    | project title = tostring(ResponseBody.['title']), contributor = tostring(ResponseBody.contributor.name), nodeset = parse_xml(tostring(ResponseBody.nodeset.nodesetXml))
    | mv-expand UAVariable = nodeset.UANodeSet.UAVariable
    | extend NodeId = UAVariable.['@NodeId'], ParentNodeId = UAVariable.['@ParentNodeId'], DisplayName = tostring(UAVariable['DisplayName']), DataType = tostring(UAVariable.['@DataType']), References = tostring(UAVariable.['References'])
    | where References !contains "HasModellingRule"
    | where DisplayName != "InputArguments"
    | project-away nodeset, UAVariable, References;
let objects = evaluate http_request(uri, headers)
    | project title = tostring(ResponseBody.['title']), contributor = tostring(ResponseBody.contributor.name), nodeset = parse_xml(tostring(ResponseBody.nodeset.nodesetXml))
    | mv-expand UAObject = nodeset.UANodeSet.UAObject
    | extend NodeId = UAObject.['@NodeId'], ParentNodeId = UAObject.['@ParentNodeId'], DisplayName = tostring(UAObject['DisplayName']), References = tostring(UAObject.['References'])
    | where References !contains "HasModellingRule"
    | project-away nodeset, UAObject, References;
let nodes = variables
    | project source = tostring(NodeId), target = tostring(ParentNodeId), name = tostring(DisplayName)
    | join kind=fullouter (objects
        | project source = tostring(NodeId), target = tostring(ParentNodeId), name = tostring(DisplayName)) on source
        | project source = coalesce(source, source1), target = coalesce(target, target1), name = coalesce(name, name1);
let edges = nodes;
edges
    | make-graph source --> target with nodes on source

工作站信息模型图。

(可选)在边缘部署 Azure IoT 操作

默认情况下,生产线模拟会将数据直接发送到你的事件中心命名空间中的数据中心终结点。

若要管理此过程,可以改用边缘上的 Azure IoT 操作。 Azure IoT 操作是边缘的统一数据平面。 它包括一组在已启用 Azure Arc 的边缘 Kubernetes 群集上运行的模块化、可缩放且高度可用的数据服务。

在部署 Azure IoT 操作之前,请确认是否已启动生产线模拟。 然后,按照 Azure IoT 操作部署详细信息中的这些步骤操作。

提示

可以使用你之前在本教程中部署的 VM 和 K3S 实例来部署和运行 Azure IoT 操作。

配置 Azure IoT 操作部署

可以使用操作体验 Web UI 配置 Azure IoT 操作部署。 添加资产终结点、资产和数据流以处理来自生产线模拟的数据,并将其路由到你的事件中心命名空间中的数据中心。

在你的 Azure IoT 操作部署中,创建资产终结点,用于在生产模拟中定义与以下 OPC UA 服务器的连接:

  • opc.tcp://assembly.munich/
  • opc.tcp://test.munich/
  • opc.tcp://packaging.munich/
  • opc.tcp://assembly.seattle/
  • opc.tcp://test.seattle/
  • opc.tcp://packaging.seattle/

Azure 数据资源管理器中的用例条件监视、OEE 计算、异常情况检测和预测

若要了解如何创建用于条件监视、产量或维护预测或异常情况检测的无代码仪表板,请参阅 Azure 数据资源管理器文档。 还有一个可以部署的示例仪表板。 若要了解如何部署仪表板,请参阅使用根据文件创建的 Azure 数据资源管理器仪表板 > 可视化数据。 导入仪表板后,更新其数据源。 在仪表板右上角指定 Azure 数据资源管理器服务器群集的 HTTPS 终结点。 HTTPS 终结点如下所示:https://<ADXInstanceName>.<AzureRegion>.kusto.windows.net/

包含示例数据的 Azure 数据资源管理器仪表板的屏幕截图。

注意

若要显示特定班次的 OEE,请在 Azure 数据资源管理器仪表板左上角的“时间范围”下拉列表中选择“自定义时间范围”,然后输入感兴趣的班次开始到结束的日期和时间。

在 Kusto Explorer 中呈现内置统一命名空间 (UNS) 和 ISA-95 模型图

此参考解决方案基于发送到云中的 Azure 数据资源管理器时序数据库的 OPC UA 元数据实现统一命名空间 (UNS)。 此 OPC UA 元数据包括 ISA-95 资产层次结构。 可以在 Kusto 资源管理器工具中可视化生成的图形。

将新连接添加到 Azure 数据资源管理器实例,然后在 Kusto 资源管理器中运行以下查询:

let edges = opcua_metadata_lkv
| project source = DisplayName, target = Workcell
| join kind=fullouter (opcua_metadata_lkv
    | project source = Workcell, target = Line) on source
    | join kind=fullouter (opcua_metadata_lkv
        | project source = Line, target = Area) on source
        | join kind=fullouter (opcua_metadata_lkv
            | project source = Area, target = Site) on source
            | join kind=fullouter (opcua_metadata_lkv
                | project source = Site, target = Enterprise) on source
                | project source = coalesce(source, source1, source2, source3, source4), target = coalesce(target, target1, target2, target3, target4);
let nodes = opcua_metadata_lkv;
edges | make-graph source --> target with nodes on DisplayName

为了获得最佳结果,请将 Layout 选项更改为 Grouped

显示 ISA-95 资产层次结构的图形。

将参考解决方案连接到 Microsoft Power BI

若要连接参考解决方案 Power BI,需要访问 Power BI 订阅。

若要创建 Power BI 仪表板,请完成以下步骤:

  1. 安装 Power BI Desktop 应用

  2. 使用有权访问 Power BI 订阅的用户登录到 Power BI Desktop 应用。

  3. 在 Azure 门户中,导航到名为 ontologies 的 Azure 数据资源管理器数据库,并将数据库管理员权限添加到一个 Microsoft Entra ID 用户,该用户仅有权访问用于此参考解决方案的已部署实例的订阅。 如有必要,请在 Microsoft Entra ID 中创建一个新用户。

  4. 在 Power BI 中,创建一个新报表,然后选择 Azure 数据资源管理器时序数据作为数据源:“获取数据”>“Azure”>“Azure 数据资源管理器(Kusto)”。

  5. 在弹出窗口中,输入群集的 Azure 数据资源管理器终结点 (https://<your cluster name>.<location>.kusto.windows.net)、数据库名称 (ontologies) 和以下查询:

    let _startTime = ago(1h);
    let _endTime = now();
    opcua_metadata_lkv
    | where Name contains "assembly"
    | where Name contains "munich"
    | join kind=inner (opcua_telemetry
        | where Name == "ActualCycleTime"
        | where Timestamp > _startTime and Timestamp < _endTime
    ) on DataSetWriterID
    | extend NodeValue = todouble(Value)
    | project Timestamp, NodeValue
    
  6. 使用你之前授予访问 Azure 数据资源管理器数据库权限的 Microsoft Entra ID 用户登录到 Azure 数据资源管理器。

    注意

    如果 Timestamp 列的所有行包含相同的值,请修改查询的最后一行,如下所示:| project Timestamp1, NodeValue

  7. 选择“加载”。 此操作将导入慕尼黑生产线组装工作站在过去一小时内的实际周期时间。

  8. Table view 中,选择“NodeValue”列,然后在“汇总”菜单项中选择“不汇总”。

  9. 切换到 Report view

  10. 在“可视化效果”下,选择“折线图”可视化效果。

  11. 在“可视化效果”下,将 TimestampData 源移动到 X-axis,选择它,然后选择“时间戳”。

  12. 在“可视化效果”下,将 NodeValueData 源移动到 Y-axis,选择它,然后选择“中值”。

  13. 保存新报表。

提示

使用相同的方法将 Azure 数据资源管理器中的其他数据添加到报表。

Power BI 视图的屏幕截图。

将参考解决方案连接到 Microsoft Dynamics 365 Field Service

此集成展示了以下方案:

  • 将资产从制造本体参考解决方案上传到 Dynamics 365 Field Service。
  • 当达到制造本体参考解决方案遥测数据的特定阈值时,在 Dynamics 365 Field Service 中创建警报。

集成使用 Azure 逻辑应用。 借助逻辑应用,你可以使用无代码工作流来连接业务关键型应用和服务。 此示例演示如何从 Azure 数据资源管理器中提取数据并在 Dynamics 365 Field Service 中触发操作。

如果你还不是 Dynamics 365 Field Service 客户,请激活 30 天试用版

提示

为了避免配置跨租户身份验证,请使用部署制造本体参考解决方案时使用的 Microsoft Entra ID。

创建 Azure 逻辑应用工作流以在 Dynamics 365 Field Service 中创建资产

若要将资产从制造本体参考解决方案上传到 Dynamics 365 Field Service 中,请执行以下操作:

  1. 转到 Azure 门户并创建新的逻辑应用资源。

  2. 为 Azure 逻辑应用提供一个名称,然后将其放置在与制造本体参考解决方案相同的资源组中。

  3. 选择“工作流”。

  4. 为工作流提供一个名称。 对于此方案,请使用监控状态的状态类型,因为资产不是数据流。

  5. 在工作流设计器中,选择“添加触发器”。 创建每天都要运行的重复触发器。 可以更改触发器,使其更频繁地出现。

  6. 在重复触发器后添加一项操作。 在“添加操作”中,搜索“Azure Data Explorer”并选择“运行 KQL 查询”命令。 保留默认身份验证“OAuth”。 输入你的 Azure 数据资源管理器群集 URL,并输入 ontologies 作为数据库名称。 在此查询中,你检查所拥有的资产的种类。 使用以下查询从制造本体参考解决方案中获取资产:

    opcua_telemetry
    | join kind=inner (    
        opcua_metadata
        | distinct Name, DataSetWriterID
        | extend AssetList = split(Name, ';')
        | extend AssetName = tostring(AssetList[0])
    ) on DataSetWriterID
    | project AssetName
    | summarize by AssetName
    
  7. 若要将资产数据引入 Dynamics 365 Field Service,需要连接到 Microsoft Dataverse。 在“添加操作”中,搜索“Dataverse”并选择“添加新行”命令。 保留默认身份验证“OAuth”。 连接到 Dynamics 365 Field Service 实例并使用以下配置:

    • 在“表名称”字段中,选择“客户资产”
    • 在“名称”字段中,选择“输入前面步骤中的数据”,然后选择“AssetName”

    工作流设计器的屏幕截图显示了如何将资产名称添加到表中。

  8. 保存工作流并运行它。 可以看到在 Dynamics 365 Field Service 中创建了新资产:

    屏幕截图显示了 Field Service 资产表中的新资产定义。

创建 Azure 逻辑应用工作流以在 Dynamics 365 Field Service 中创建警报

当制造本体参考解决方案中的资产的 FaultyTime 达到阈值时,此工作流会在 Dynamics 365 Field Service 中创建警报。

  1. 若要提取数据,请创建一个 Azure 数据资源管理器函数。 在 Azure 门户的 Azure 数据资源管理器查询面板中运行以下代码,以在 ontologies 数据库中创建 FaultyFieldAssets 函数:

    .create-or-alter function  FaultyFieldAssets() {  
    let Lw_start = ago(3d);
    opcua_telemetry
    | where Name == 'FaultyTime'
    and Value > 0
    and Timestamp between (Lw_start .. now())
    | join kind=inner (
        opcua_metadata
        | extend AssetList =split (Name, ';')
        | extend AssetName=AssetList[0]
        ) on DataSetWriterID
    | project AssetName, Name, Value, Timestamp}
    
  2. 在逻辑应用中创建新的监控状态的工作流。

  3. 在工作流设计器中,创建每三分钟运行一次的重复触发器。 然后添加一项操作并选择“运行 KQL 查询”操作。

  4. 输入 Azure 数据资源管理器群集 URL,然后输入“ontologies”作为数据库名称,并使用 FaultyFieldAssets 函数名称作为查询。

  5. 若要将资产数据引入 Dynamics 365 Field Service,需要连接到 Microsoft Dataverse。 在“添加操作”中,搜索“Dataverse”并选择“添加新行”命令。 保留默认身份验证“OAuth”。 连接到 Dynamics 365 Field Service 实例并使用以下配置:

    • 在“表名称”字段中,选择“IoT 警报”
    • 在“说明”字段中,使用“输入前面步骤中的数据”生成一条消息:“[AssetName] 的 [名称] 为 [值]”。 “AssetName”、“名称”和“值”是上一步中的字段。
    • 在“警报时间”字段中,选择“输入前面步骤中的数据”,然后选择“时间戳”
    • 在“警报类型”字段中,选择“异常”

    屏幕截图显示了用于创建警报的逻辑应用配置。

  6. 运行工作流并查看 Dynamics 365 Field Service 的“IoT 警报”仪表板中生成的新警报

    Dynamics 365 FS 中警报的屏幕截图。