你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:实现 Azure 工业 IoT 参考解决方案体系结构
制造商希望在全球范围内部署一个整体工业 IoT 解决方案,并将所有生产站点连接到此解决方案,以提高每个生产站点的效率。
这些效率的提高导致了生产速度更快且能源消耗更低,所有这些都降低了生产产品的成本,同时在大多数情况下提高了产品的质量。
该解决方案必须尽可能高效,并能够实现所有所需的用例,如条件监视、OEE 计算、预测和异常情况检测。 根据从这些用例中获得的见解,可以在第二步中创建一个数字反馈循环,然后可以对生产过程应用优化和其他更改。
互操作性是实现解决方案体系结构快速推出的关键,并且使用 OPC UA 等开放标准有助于实现这种互操作性。
IEC 62541 开放平台通信统一体系结构 (OPC UA)
此解决方案对所有操作技术 (OT) 数据使用 IEC 62541 开放平台通信 (OPC) 统一体系结构 (UA)。 此处介绍了此标准。
参考解决方案体系结构
简化的体系结构(Azure 和 Fabric 选项):
详细的体系结构(仅限 Azure):
组件
下面是此解决方案中涉及的组件:
组件 | 说明 |
---|---|
工业资产 | Docker 容器中托管的一组已启用 OPC UA 的模拟生产线 |
Azure IoT 操作 | Azure IoT 操作是边缘的统一数据平面。 它包括一组在已启用 Azure Arc 的边缘 Kubernetes 群集上运行的模块化、可缩放且高度可用的数据服务。 |
数据网关 | 此网关将本地数据源(如 SAP)连接到云中的 Azure 逻辑应用。 |
Azure 事件中心 | 云消息中转站,从边缘网关接收 OPC UA PubSub 消息并存储它们,直到订阅服务器检索到为止。 |
Azure 数据资源管理器 | 用于高级云分析(包括内置异常情况检测和预测)的时序数据库和前端仪表板服务。 |
Azure 逻辑应用 | Azure 逻辑应用是一个云平台,可用于创建和运行自动化工作流,几乎没有代码。 |
Azure Arc | 此云服务用于在边缘管理本地 Kubernetes 群集。 可以通过 Flux 部署新工作负载。 |
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 | 此开放源代码工业连接参考应用程序使用 W3C Web of Things (WoT) Thing Descriptions 作为描述工业资产接口的架构,从专有资产接口转换为 OPC UA。 |
注意
在实际部署中,像打开减压阀这样关键的事情将在现场完成。 这只是如何实现数字反馈循环的一个简单示例。
UA Cloud Library
若要直接从 Azure 数据资源管理器读取 OPC UA 信息模型,可以将 OPC UA 信息模式中定义的 OPC UA 节点导入到一个表中。 你可以在查询中使用导入的信息来查找更多元数据。
首先,通过在 ADX 群集上运行以下查询,为 UA Cloud Library 配置 Azure 数据资源管理器 (ADX) 标注策略。 在开始之前,请确保你是 ADX 群集管理员,可以通过在 Azure 门户中导航到“ADX”选项卡中的“权限”来配置该角色。
.alter cluster policy callout @'[{"CalloutType": "webapi","CalloutUriRegex": "uacloudlibrary.opcfoundation.org","CanCall": true}]'
然后,从 Azure 门户运行以下 Azure 数据资源管理器查询:
let uri='https://uacloudlibrary.opcfoundation.org/infomodel/download/\<insert information model identifier from the UA Cloud Library here\>';
let headers=dynamic({'accept':'text/plain'});
let options=dynamic({'Authorization':'Basic \<insert your cloud library credentials hash here\>'});
evaluate http_request(uri, headers, options)
| 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
需要在此查询中提供两项内容:
- 来自 UA Cloud Library 的信息模型唯一 ID,将其输入到 ADX 查询的“<在此处插入云库中的信息模型标识符>”字段中。
- UA Cloud Library 凭据(在注册期间生成)基本授权标头哈希,将其插入到 ADX 查询的“<在此处插入云库凭据哈希>”字段中。 使用 https://www.debugbear.com/basic-auth-header-generator 之类的工具生成哈希。
例如,若要在 Kusto Explorer 工具(可在此处下载)中呈现生产线模拟工作站 OPC UA 服务器的信息模型,请运行以下查询:
let uri='https://uacloudlibrary.opcfoundation.org/infomodel/download/1627266626';
let headers=dynamic({'accept':'text/plain'});
let options=dynamic({'Authorization':'Basic \<insert your cloud library credentials hash here\>'});
let variables = evaluate http_request(uri, headers, options)
| 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, options)
| 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
为了获得最佳结果,请将 Layout
选项更改为 Grouped
,并将 Labels
更改为 name
。
生产线模拟
该解决方案使用由多个工作站组成的生产线模拟,使用 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
工作站 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 数据资源管理器仪表板中看到程序集计算机的压力。 西雅图生产线定期释放压力。
安装生产线模拟和云服务
选择“部署”按钮以在 Microsoft Azure 上部署所有必需资源:
在部署过程中,必须为用于承载生产线模拟的虚拟机 (VM) 和 UA Cloud Twin 提供密码。 密码必须具有以下三个属性:一个小写字符、一个大写字符、一个数字和一个特殊字符。 密码长度必须介于 12 到 72 个字符之间。
注意
为了节省成本,该部署为生产线模拟和边缘基础设施部署了单个 Windows 11 Enterprise VM。 在生产方案中,不需要生产线模拟,对于基本 OS,我们建议使用 Windows IoT 企业版长期服务渠道 (LTSC)。
部署完成后,请使用 RDP(远程桌面)连接连接到已部署的 Windows VM。 在 VM 的 Azure 门户页中,可在“连接”选项下下载 RDP 文件。 使用你在部署期间提供的凭据登录,打开一个 Windows 命令提示符,并通过以下方法安装适用于 Linux 的 Windows 子系统 (WSL):
wsl --install
命令完成后,重启 VM 并重新登录。 命令提示符会完成 WSL 的安装,系统会提示你为 WSL 输入一个新用户名和密码。 然后,通过以下方法安装 K3S(一个轻型 Kubernetes 运行时):
curl -sfL https://get.k3s.io | sh
现在,你可以运行生产线模拟。
运行生产线模拟
从部署的 VM 中,运行一个 Windows 命令提示符,输入 wsl,然后按 Enter。 导航到 /mnt/c/ManufacturingOntologies-main/Tools/FactorySimulation
目录并运行 StartSimulation shell 脚本:
sudo ./StartSimulation.sh "<EventHubsCS>"
注意
<EventHubCS>
是事件中心命名空间连接字符串,如此处所述。
示例:StartSimulation "Endpoint=sb://ontologies.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=abcdefgh="
注意
如果 Kubernetes 服务的外部 IP 地址显示为 <pending>
,则可以通过 sudo kubectl patch service <theService> -n <the service's namespace> -p '{"spec": {"type": "LoadBalancer", "externalIPs":["<the traefik external IP address>"]}}'
将 traefik
服务的外部 IP 地址分配给它。
注意
为防止 WSL(和 K3s)自动关闭,请使 WSL 命令提示符保持打开状态。
在边缘部署 Azure IoT 操作
在部署之前,请确认你已启动生产线模拟。 然后,如此处所述执行这些步骤。
用例条件监视、计算 OEE、检测异常情况并在 Azure 数据资源管理器中进行预测
还可以访问 Azure 数据资源管理器文档,了解如何创建用于状态监视、产量/维护预测或异常情况检测的无代码仪表板。 我们在此处提供了一个示例仪表板,供你按照此处概述的步骤部署到 ADX 仪表板。 导入后,需要通过在仪表板右上角以 https://ADXInstanceName.AzureRegion.kusto.windows.net/
格式指定 ADX 服务器群集实例的 HTTPS 终结点来更新仪表板的数据源。
注意
如果要显示特定班次的 OEE,请在 ADX 仪表板左上角的“时间范围”下拉列表中选择“自定义时间范围”,然后输入感兴趣的班次开始到结束的日期和时间。
在 Kusto Explorer 中呈现内置统一命名空间 (UNS) 和 ISA-95 模型图
此参考解决方案基于发送到云中时序数据库(Azure 数据资源管理器)的 OPC UA 元数据实现统一命名空间 (UNS)。 此 OPC UA 元数据还包括 ISA-95 资产层次结构。 生成的图形可以在 Kusto Explorer 工具(可在此处下载)中轻松可视化。
将新连接添加到此参考解决方案中部署的 Azure 数据资源管理器实例,然后在 Kusto Explorer 中运行以下查询:
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
。
使用 Azure 托管 Grafana 服务
还可以使用 Grafana 在 Azure 上为本文中所述的解决方案创建仪表板。 Grafana 用于在制造过程中创建显示实时数据的仪表板。 Azure 提供了一项名为 Azure 托管 Grafana 的服务。 使用 Grafana,你可以创建云仪表板。 在此配置手册中,你将在 Azure 上启用 Grafana,并创建一个仪表板以显示从 Azure 数据资源管理器和 Azure 数字孪生服务查询的数据。 你将使用此参考解决方案中的模拟生产线数据。
以下屏幕截图显示了仪表板:
启用 Azure 托管 Grafana 服务
转到 Azure 门户并搜索服务“Grafana”,然后选择“Azure 托管 Grafana”服务。
为实例提供一个名称并开启标准选项,然后创建服务。
创建服务后,导航到访问 Grafana 实例的 URL。 可以在服务的主页中找到 URL。
在 Grafana 中添加新数据源
首次登录后,需要向 Azure 数据资源管理器添加新数据源。
导航到“配置”并添加新数据源。
搜索 Azure 数据资源管理器并选择该服务。
配置连接并使用应用注册(按照本页顶部提供的手册进行操作)。
保存并测试页面底部的连接。
导入示例仪表板
现在,你已准备好导入提供的示例仪表板。
请在此处下载示例仪表板:示例 Grafana 制造仪表板。
导航到“仪表板”,然后选择“导入”。
选择你下载的源,然后选择“保存”。由于两个变量尚未设置,因此页面上会出现错误。 转到仪表板的设置页。
选择“变量”,并将两个 URL 更新为你的 Azure 数字孪生服务的 URL。
导航回仪表板并点击“刷新”按钮。 现在应会看到数据(别忘了点击仪表板上的“保存”按钮)。
页面顶部的位置变量会自动填充来自 Azure 数字孪生的数据(ISA95 中的区域节点)。 在这里,可以选择不同的位置并查看每个工厂的不同数据点。
如果仪表板中未显示数据,请导航到各个面板,查看是否选择了正确的数据源。
配置警报
在 Grafana 中,还可以创建警报。 在此示例中,我们将为其中一条生产线创建低 OEE 警报。
登录到 Grafana 服务,然后在菜单中选择“警报规则”。
选择“创建警报规则”。
为警报命名并选择“Azure 数据资源管理器”作为数据源。 在导航窗格中选择“查询”。
在查询字段中,输入以下查询。 在此示例中,我们使用“Seattle”生产线。
let oee = CalculateOEEForStation("assembly", "seattle", 6, 6); print round(oee * 100, 2)
选择“表格”作为输出。
向下滚动到下一部分。 在此处配置警报阈值。 在此示例中,我们使用“低于 10”作为阈值,但在生产环境中,此值可能更高。
选择要保存警报的文件夹,并配置“警报评估行为”。 选择“每 2 分钟一次”选项。
选择“保存并退出”按钮。
在警报的概述中,你现在可以看到当 OEE 小于 10 时触发的警报。
可以将此设置与 Microsoft Dynamics Field Services 等集成。
将参考解决方案连接到 Microsoft Power BI
若要连接参考解决方案 Power BI,需要访问 Power BI 订阅。
请完成下列步骤:
从此处安装 Power BI Desktop 应用。
使用有权访问 Power BI 订阅的用户登录到 Power BI Desktop 应用。
在 Microsoft Azure 门户中,导航到 Azure 数据资源管理器数据库实例 (
ontologies
),并将Database Admin
权限添加到仅能访问单个 Azure 订阅的 Azure Active Directory 用户,特别是用于此参考解决方案的已部署实例的订阅。 如果需要,请在 Azure Active Directory 中创建新用户。在 Power BI 中,创建一个新报表,并通过“获取数据”>“Azure”>“Azure 数据资源管理器(Kusto)”选择 Azure 数据资源管理器时序数据作为数据源。
在弹出窗口中,输入实例的 Azure 数据资源管理器终结点(如
https://erichbtest3adx.eastus2.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
选择“加载”。 此操作将导入慕尼黑生产线组装工作站在过去一小时内的实际周期时间。
出现提示时,使用你之前授予访问 Azure 数据资源管理器数据库的权限的 Azure Active Directory 用户登录到 Azure 数据资源管理器。
从
Data view
中,选择“NodeValue”列,然后在“汇总”菜单项中选择“不汇总”。切换到
Report view
。在“可视化效果”下,选择“折线图”可视化效果。
在“可视化效果”下,将
Timestamp
从Data
源移动到X-axis
,选择它,然后选择“时间戳”。在“可视化效果”下,将
NodeValue
从Data
源移动到Y-axis
,选择它,然后选择“中值”。保存新报表。
注意
可以类似地将 Azure 数据资源管理器中的其他数据添加到报表。
将参考解决方案连接到 Microsoft Dynamics 365 Field Service
此集成展示了以下方案:
- 将资产从 Manufacturing Ontologies 参考解决方案上传到 Dynamics 365 Field Service。
- 当达到 Manufacturing Ontologies 参考解决方案遥测数据的特定阈值时,在 Dynamics 365 Field Service 中创建警报。
集成使用 Azure 逻辑应用。 使用逻辑应用,业务关键应用和服务可以通过无代码工作流进行连接。 我们从 Azure 数据资源管理器中提取信息,并在 Dynamics 365 Field Service 中触发操作。
首先,如果还不是 Dynamics 365 Field Service 客户,请在此处激活 30 天的试用版。 请记得使用在部署 Manufacturing Ontologies 参考解决方案时使用的相同 Microsoft Entra ID(以前称为 Azure Active Directory)。 否则,需要配置跨租户身份验证,这不是这些说明的一部分。
创建 Azure 逻辑应用工作流以在 Dynamics 365 Field Service 中创建资产
首先,将资产从 Manufacturing Ontologies 上传到 Dynamics 365 Field Service:
转到 Microsoft Azure 门户并创建新的逻辑应用。
为 Azure 逻辑应用命名,将其放置在与 Manufacturing Ontologies 参考解决方案相同的资源组中。
选择“工作流”。
为工作流命名,对于此方案,我们使用有状态的状态类型,因为资产不是数据流。
创建新触发器。 首先创建一个定期触发器。 这会每天检查数据库,看看是否创建了新资产。 你可以将触发器更改为更频繁地发生。
在操作中,搜索
Azure Data Explorer
并选择“运行 KQL 查询”命令。 在此查询中,我们将检查我们拥有的资产类型。 使用以下查询获取资产并将其粘贴到查询字段中:let ADTInstance = "PLACE YOUR ADT URL";let ADTQuery = "SELECT T.OPCUAApplicationURI as AssetName, T.$metadata.OPCUAApplicationURI.lastUpdateTime as UpdateTime FROM DIGITALTWINS T WHERE IS_OF_MODEL(T , 'dtmi:digitaltwins:opcua:nodeset;1') AND T.$metadata.OPCUAApplicationURI.lastUpdateTime > 'PLACE DATE'";evaluate azure_digital_twins_query_request(ADTInstance, ADTQuery)
若要将资产数据引入 Dynamics 365 Field Service,需要连接到 Microsoft Dataverse。 连接到 Dynamics 365 Field Service 实例并使用以下配置:
- 使用“客户资产”表名称
- 将“AssetName”放入“名称”字段
保存工作流并运行它。 几秒钟后,会看到在 Dynamics 365 Field Service 中创建了新资产。
创建 Azure 逻辑应用工作流以在 Dynamics 365 Field Service 中创建警报
此工作流将在 Dynamics 365 Field Service 中创建警报,特别是当达到 Manufacturing Ontologies 参考解决方案资产的 FaultyTime 的特定阈值时。
首先,创建一个 Azure 数据资源管理器函数来获取正确的数据。 转到 Microsoft Azure 门户中的 Azure 数据资源管理器查询面板,并运行以下代码来创建 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}
在 Azure 逻辑应用中创建新工作流。 创建“定期”触发器以启动 - 每 3 分钟一次。 创建操作“Azure 数据资源管理器”并选择“运行 KQL 查询”。
输入 Azure 数据资源管理器群集 URL,然后选择数据库,并使用步骤 1 中创建的函数名称作为查询。
选择“Microsoft Dataverse”作为操作。
运行工作流并查看 Dynamics 365 Field Service 仪表板中生成的新警报: