你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
OPC UA(OPC 统一体系结构)是 OPC 基金会制定的一项标准,可用于在边缘工业组件和云之间交换数据。 它可以将消息从 OPC UA 服务器路由到 MQTT 代理,并将控制消息发送到 OPC UA 服务器。 OPC UA 基于广泛使用的数据格式提供一致、安全且有据可查的标准。 工业组件可以实施 OPC UA 标准来启用通用数据交换。
OPC UA 写入功能允许工业开发人员和运营工程师使用 OPC UA 连接器,通过将值直接写入 OPC UA 节点,在边缘执行实时控制。 此功能可立即更新配置、自动化触发器和动态过程调整,而无需依赖于云往返。
在延迟、自主性或本地决策至关重要的情况下,写入功能非常有用,例如在生产线、预测性维护或 AI 驱动的控制循环中。
OPC UA 连接器是 Azure IoT 操作的一部分。 OPC UA 连接器连接到 OPC UA 服务器以检索其发布到 MQTT 代理中的主题的数据,并根据 MQTT 代理主题订阅中的值写入数据。 通过 OPC UA 连接器,工业 OPC UA 环境能够将数据传入 Kubernetes 群集上运行的本地工作负载以及云工作负载的服务。
OPC UA 连接器是在 Azure IoT 操作中作为中间件服务运行的客户端应用程序。 OPC UA 的连接器连接到 OPC UA 服务器,使你可以浏览服务器地址空间、监视连接资产中的数据更改和事件,并将数据写入服务器地址空间中的节点。 操作团队和开发人员使用 OPC UA 连接器来简化将 OPC UA 资产连接到其边缘工业解决方案的任务。
能力
作为 Azure IoT 操作的一部分,OPC UA 连接器是一个本机 Kubernetes 应用程序,其特点如下:
- 将现有 OPC UA 服务器和资产连接到边缘的本机 Kubernetes 群集。
- 发布以 OPC UA PubSub 格式的 JSON 编码消息,该消息来自 OPC UA 服务器并使用 JSON 有效负载。 使用此标准格式进行数据交换,可以降低未来兼容性问题的风险。
- 可以将 OPC UA 节点属性同步到 分布式状态存储。
- 根据 MQTT 订阅将值直接写入连接的 OPC UA 服务器中的节点。
- 连接到云中已启用 Azure Arc 的服务。
其他功能
作为 Azure IoT 操作的一部分,OPC UA 连接器支持以下功能:
- 同时连接到使用 Kubernetes
device自定义资源 (CR) 配置的多个 OPC UA 服务器。 - 使用 JSON 编码发布采用 OPC UA PubSub 格式的 OPC UA 数据值变化。
- 在 MQTT 消息中将消息标头作为用户属性发布。 OPC UA 连接器发布的消息标头基于 OPC UA 的 CloudEvents 规范。
- 使用预定义的事件字段发布 OPC UA 事件。
- 使用 Kubernetes 资产 CR 定义资产
- 有效负载压缩,包括
gzip和brotli。 - 自动重新连接到 OPC UA 服务器。
- 集成兼容 OpenTelemetry 的可观测性。
- OPC UA 传输加密。
- 匿名身份验证和基于用户名与密码的授权。
-
可使用 Azure REST API 和操作体验 Web UI 配置
device和assetCR。 - 使用 OPC UA
TranslateBrowsePathToNodeId服务在运行时对节点进行动态解析。
工作原理
若要从已连接的 OPC UA 服务器读取数据,请使用 OPC UA 应用程序的连接器:
- 读取资产的关联设备配置,以确定 OPC UA 服务器终结点以及用于连接的安全设置。
- 读取资产配置的发布间隔,以确定连接器将数据发布到 MQTT 中转站主题的频率。
- 读取资产的已配置数据点和事件,以确定 OPC UA 服务器中要发布到 MQTT 代理的值。
- 为每个已配置的资产创建到 OPC UA 服务器的会话。
- 为每个 1,000 个数据点在会话中创建一个单独的订阅。
- 为资产中定义的每个事件创建单独的订阅。
- 根据发布间隔将消息发布到 MQTT 中转站。 此连接器实现了重试逻辑,以便标识与指定的保持活动状态请求次数后没有响应的终结点的连接。 例如,当 OPC UA 服务器因断电而停止响应,环境可能会出现终结点无响应的情况。
为了将值写入已连接的 OPC UA 服务器中的节点,OPC UA 连接器会执行以下操作:
读取资产的关联设备配置,以确定 OPC UA 服务器终结点以及用于连接的安全设置。
读取资产配置以确定要将数据写入 OPC UA 服务器上的哪些节点。
订阅包含资产写入请求的 MQTT 主题。 主题名称采用格式
{Namespace}/asset-operations/{AssetId}/builtin/{DatasetName}/,其中{Namespace}是 Azure IoT 操作实例的命名空间,{AssetId}是资产的唯一标识符,{DatasetName}是包含目标节点的数据集的名称。使用设备配置创建与 OPC UA 服务器的临时会话。
检查有效负载以确保所有数据点都存在于目标数据集中。
将值写入 OPC UA 服务器,并向 MQTT 代理发布成功或失败响应。 更改的值将发布到与数据集关联的标准消息主题。
若要生成写入请求,请使用 MQTT v5 请求/响应语义将 JSON 消息发布到 MQTT 主题。 指定要在有效负载中写入的数据集名称和值。 每个 MQTT 消息都包含定义系统级别和用户定义属性(例如 SourceId、ProtocolVersion 和 CorrelationData)的元数据,以确保可跟踪性和一致性。
若要将 OPC UA 节点属性同步到分布式状态存储,OPC UA 的连接器:
- 遵循所有变量节点的
HasProperty引用,这些节点使用同一 OPC UA 入站终结点在所有资产的任何数据集中作为数据点引用。 - 将属性添加到 ID 下的分布式状态存储中:
{AioNamespace}.{AssetName}.{DatasetName}.{DataPointName}.{PropertyName} - 自动订阅 OPC UA 服务器的
ModelChange事件,并在ModelChange事件发生后重新填充所有属性。
若要配置此行为,请在操作体验 Web UI 中配置入站 OPC UA 终端时,选择 将属性同步到状态存储:
还可以通过对主题进行 MQTT RPC 调用 azure-iot-operation/asset-operations/{AssetName}/builtin/syncProperties 来强制同步所有属性。 载荷 {} 在未观察到 ModelChange 事件的情况下强制同步。 有效载荷 {"observeModelChanges": true} 强制进行同步以观察 ModelChange 事件。
OPC UA 连接器消息格式
OPC UA 的连接器将来自 OPC UA 服务器的消息作为 JSON 发布到 MQTT 中转站。 每个消息都有一个有效负载和一组属于 MQTT 用户属性部分的属性。 负载包含来自 OPC UA 服务器的消息,属性提供元数据。
有效负载
OPC UA 消息的有效负载是包含 OPC UA 服务器消息的 JSON 对象。 以下示例演示快速入门中使用的示例恒温器资产的消息的有效负载。 使用以下命令订阅 azure-iot-operations/data 主题中的消息:
mosquitto_sub --host aio-broker --port 18883 --topic "azure-iot-operations/data/#" -v --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
上一命令的输出如以下示例所示:
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:17.1858435Z","Value":4558},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:17.1858869Z","Value":4558}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:18.1838125Z","Value":4559},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:18.1838523Z","Value":4559}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:19.1834363Z","Value":4560},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:19.1834879Z","Value":4560}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:20.1861251Z","Value":4561},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:20.1861709Z","Value":4561}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:21.1856798Z","Value":4562},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:21.1857211Z","Value":4562}}
示例写入有效负载
下面是将简单浮点值写入节点的最小示例:
{
"SetPoint": 50
}
用户属性
OPC UA 连接器发布的消息标头基于 OPC UA 的 CloudEvents 规范。 OPC UA 消息中的标头将成为发布到 MQTT 代理的消息中的用户属性。 以下示例演示快速入门中使用的示例恒温器资产的消息的用户属性。 使用以下命令订阅 azure-iot-operations/data 主题中的消息:
mosquitto_sub --host aio-broker --port 18883 --topic "azure-iot-operations/data/#" -V mqttv5 -F %P --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
上一命令的输出如以下示例所示:
uuid:0000aaaa-11bb-cccc-dd22-eeeeee333333 externalAssetId:0000aaaa-11bb-cccc-dd22-eeeeee333333 serverToConnectorMilliseconds:0.3153 id:1111bbbb-22cc-dddd-ee33-ffffff444444 specversion:1.0 type:ua-keyframe source:urn:OpcPlc:opcplc-000000 time:2024-08-05T14:19:08.8738457Z datacontenttype:application/json subject:0000aaaa-11bb-cccc-dd22-eeeeee333333 sequence:9768 traceparent:00-4eb4313536bc006c918e936686921cfc-4ee795f6fdd5fae7-01 recordedtime:2024-08-05 14:19:08.874 +00:00
uuid:0000aaaa-11bb-cccc-dd22-eeeeee333333 externalAssetId:0000aaaa-11bb-cccc-dd22-eeeeee333333 serverToConnectorMilliseconds:0.3561 id:1111bbbb-22cc-dddd-ee33-ffffff444444 specversion:1.0 type:ua-keyframe source:urn:OpcPlc:opcplc-000000 time:2024-08-05T14:19:09.8746396Z datacontenttype:application/json subject:0000aaaa-11bb-cccc-dd22-eeeeee333333 sequence:9769 traceparent:00-388697f77c2dcb5e9b30589c0a4cef6e-de9351186ff5833e-01 recordedtime:2024-08-05 14:19:09.875 +00:00
uuid:0000aaaa-11bb-cccc-dd22-eeeeee333333 externalAssetId:0000aaaa-11bb-cccc-dd22-eeeeee333333 serverToConnectorMilliseconds:0.3423 id:1111bbbb-22cc-dddd-ee33-ffffff444444 specversion:1.0 type:ua-keyframe source:urn:OpcPlc:opcplc-000000 time:2024-08-05T14:19:10.8754860Z datacontenttype:application/json subject:0000aaaa-11bb-cccc-dd22-eeeeee333333 sequence:9770 traceparent:00-7c65a93fa7668bbe0cdfd051168c88ac-ab86b83fb1b7944f-01 recordedtime:2024-08-05 14:19:10.875 +00:00
uuid:0000aaaa-11bb-cccc-dd22-eeeeee333333 externalAssetId:0000aaaa-11bb-cccc-dd22-eeeeee333333 serverToConnectorMilliseconds:0.3277 id:1111bbbb-22cc-dddd-ee33-ffffff444444 specversion:1.0 type:ua-keyframe source:urn:OpcPlc:opcplc-000000 time:2024-08-05T14:19:11.8765569Z datacontenttype:application/json subject:0000aaaa-11bb-cccc-dd22-eeeeee333333 sequence:9771 traceparent:00-5851e56a6f358ab5e1af1d798f7580a1-bf6dfbda8196cba0-01 recordedtime:2024-08-05 14:19:11.877 +00:00
主题字段包含消息相关的资产的名称。 序列字段包含消息的序列号。
注释
对于在运营体验 Web UI 中创建的资产,其发送的任何消息的主题属性均设置为 externalAssetId 值。 在这种情况下,该 subject 属性包含 GUID 而不是友好资产名称。
使用浏览路径对节点进行动态解析
在资产中配置 OPC UA 数据点或事件时,通常会在 数据源 字段中添加 OPC UA 服务器节点 ID。 此方法假定节点 ID 在服务器重启和部署之间是稳定的。 但是,某些 OPC UA 服务器在运行时或按需动态创建节点 ID。 无法在资产配置中保留这些动态节点 ID,因为它们可能会随时间而变化。
若要解决这种情况,连接器可以使用 OPC UA TranslateBrowsePathToNodeId 服务在运行时解析动态节点。 此服务从起始对象和相对浏览路径解析目标节点 ID。 在数据集或事件配置中配置 Start 实例 值时,每个数据点或事件在其 数据源 属性中都需要有效的相对浏览路径。 连接器将相对浏览路径转换为运行时的具体节点 ID。
注释
如果未提供 “开始”实例 值,连接器将使用 数据源 属性作为固定节点 ID。
示例启动实例值:
i=2555nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1nsu=http://microsoft.com/Opc/OpcPlc/Boiler;i=5ns=10;s=System.Pump1ns=1;b=M/RbKBsRVkePCePcx24oRA==
要用于“数据源”字段中的相对浏览路径示例:
/1:SYSTEM/1:PUMP/1:P1/2:Block&.Output/3:Truck.0:NodeVersion<!HasChild>Truck<1:ConnectedTo>1:Boiler/
有关相对浏览路径语法的详细信息,请参阅 OPC Foundation 第 4 部分 A.2。
相对浏览路径必须使用数字 OPC UA 命名空间索引。 目前不支持字符串格式的命名空间名称。
重要
命名空间索引可以在服务器中更改。 如果命名空间索引发生更改,则必须在资产定义中重新配置这些索引。
它与 Azure IoT 操作有何关系?
ONVIF 连接器是 Azure IoT 操作的一部分。 该连接器作为 Azure IoT 操作部署的一部分部署到边缘上已启用 Arc 的 Kubernetes 群集。 该连接器与其他 Azure IoT 操作元素交互,例如: