OPC Publisher 不按 OPC 模拟服务器生成的顺序发送数据

OPC Publisher doesn't send data in order as in generated by OPC simulation server

我一直在尝试将 OPC 模拟服务器生成的传感器数据(在 excel 文件中列出并由 OPC 模拟读取的数据)检索到 Azure IOT Edge 中的自定义模块之一。当数据记录到控制台时,它告诉我数据没有按顺序记录。以下是作为模块托管在物联网边缘的 OPC 发布者的 JSON。

        "OPCPublisher": {
        "version": "1.0",
        "type": "docker",
        "status": "running",
        "restartPolicy": "always",
        "settings": {
          "image": "mcr.microsoft.com/iotedge/opc-publisher:2.8",
          "createOptions": {
            "Hostname": "publisher",
            "Cmd": [
              "publisher",
              "--pf=/appdata/publishednodes.json",
              "--lf=/appdata/publisher.log",
              "--aa"
            ],
            "HostConfig": {
              "Binds": [
                "/home/sineth/iiotedge:/appdata"
              ]
            }
          }
        }
      }

以下是网关设备中发布的节点json。 以下是我的 excel sheet 数据的截图

但是 OPC 发布者不会按照从任何地方开始的顺序 而是按顺序 将数据路由到模块中。 例如,它从行开始发送,标签 11 的值为 11,然后再次发送下一行,标签 11 的值为 17。有时会发送一批数据。没有正确的顺序。 这不是 OPC 服务器模拟的问题,因为我已经用独立的 OPC 客户端测试了模拟服务器并且它按顺序获取数据。 Excel 被模拟服务器读取。 下图是我的 IoT 边缘模块 (python) 的屏幕截图,我将数据记录到控制台,从 OPC 发布者路由中检索。 感谢对此的任何帮助。 非常感谢。

所以一些问题:

  1. 您使用的是哪个版本的 iotedge?
  2. 仅仅是日志顺序不对还是接收的消息乱序?
  3. 您使用的是什么协议 MQTT 或 AMQP?

添加来自 GitHub 的摘要在这里讨论:

  • OPC Publisher 为每个 OPC UA 端点生成一个唯一的消息 ID(自动增加一个)
  • python 以上客户端代码记录同一条消息超过 3500 次
    • 接收消息似乎没有阻塞,因此一遍又一遍地处理同一条消息
    • receive_on_message_input 已弃用,不应再使用,请参阅 API documentation

没有重复项,所有值的更改都是有序的,但行为仍然不是 OP 所需要的。

不止一条消息(包含所有三个标签的值更改)被批处理

OPC Publisher 尝试优化成本和性能,一次发送每条消息两者都不是,但可以通过将批大小设置为一个来配置 OPC Publisher 以直接发送数据的方式。

命令行参数--bs=1

不是从第一个值开始

OPC Publisher 建立到 OPC UA 服务器的连接并为其配置文件中的每个 OPC UA 节点创建监控项。默认情况下,OPC UA 监控项将发送包含当前值的默认通知。如果你想忽略它,你可以先使用跳过。

命令行参数--sk=true

但在上述情况下,第一个值也是相关的。如果第一条消息(消息 id = 1)不包含第一个值,则 OPC 服务器模拟之前更改了它们。

请注意,OPC Publisher 只能在完全建立 OPC UA client/server 连接(包括信任证书)、创建订阅和受监控项后才能发布。这个时间也取决于OPC UA服务器和网络的性能。

提议:

  • 将 OPC 模拟更改为仅在客户端连接完全建立后才开始模拟序列

多次检索同一条消息

如果多次收到消息,则可能是从一个 IoT 边缘模块到另一个 IoT 边缘模块的消息路由错误。请确保明确命名发送模块(在本例中为 OPC Publisher)

"$edgeHub": {
      "properties.desired": {
        "schemaVersion": "1.2",
        "routes": {
          "opcPublisherToPyDataConsumer": "FROM /messages/modules/opc-publisher INTO BrokeredEndpoint(\"/modules/PyDataConsumer/inputs/fromOPC\")"
        }
      }
    }