PTC Kepware 和 InfluxDB:收集和存储您的自动化数据

导航到

kepware-and-InfluxData-logos

如果您在自动化领域工作了一段时间,您可能已经遇到或至少听说过 PTC Kepware。他们提供了一套最大的自动化设备连接套件,如 PLC,简化了 OT(操作技术)和 IT(信息技术)世界的桥梁。

最好的部分?您可以使用 InfluxDB 存储和转换这些数据。这篇博客文章将带您了解连接 Kepware 实例到 InfluxDB 的不同方法。

Kepware Edge

关于本教程的一个小声明:我使用了 ThingWorx Kepware Edge。它是 KEPServerEX 的紧凑型版本。以下是一些需要注意的事项

  1. 无头(没有用户 GUI,交互通过 REST API 进行)
  2. 在 Ubuntu 18.04 上运行
  3. 拥有比 KEPServerEX 更小的驱动程序集(Modbus Ethernet、Allen-Bradley、ControlLogix Ethernet、Siemens TCP/IP Ethernet 等驱动程序正在逐步添加)
  4. 支持 OPC UA 服务器接口、发布 MQTT 消息和 ThingWorx AlwaysOn 协议,以实现与 ThingWorx 的原生连接。
  5. 虽然实例直接安装在 Linux 操作系统上,但它也作为 Microsoft Azure IoT Edge 运行时模块以及通用 Docker 容器提供。

由于 KEPServerEX 和 Edge 在底层具有相似的核心架构,因此本教程适用于两者(如果需要,我将突出显示任何关键差异)。

设置

注意:本教程将使用 Kepware Edge 默认加载的示例项目。要连接您自己的设备,请咨询官方 Kepware 文档。

Using Telegraf to stream data from Kepware to InfluxDB

我们将使用 Telegraf 将我们的数据从 Kepware 流式传输到 InfluxDB。我们可以使用两种协议来配置此连接

  1. OPC UA
  2. MQTT

Telegraf 插件支持这两种协议——无需编写代码。

在开始之前,您需要安装 Telegraf。安装说明可以在这里找到。

选项 1 - OPC UA

OPC UA(统一架构)是一种机器对机器的工业协议,近年来在自动化领域变得极为流行。这主要是由OPC UA 基金会推动的,该基金会将开放连接、互操作性和集成安全性作为标准的一部分进行推广。在早期阶段,OPC UA 主要用于连接设备,如 PLC,到SCADA(监督控制与数据采集)系统。

在底层,Kepware 建立在 OPC UA 服务器之上。这意味着我们可以使用我们的 Telegraf 客户端直接与 Kepware 交互。以下是详细说明

1. 首先,我们需要生成我们的Telegraf配置。为此,我们将使用OPC UA客户端输入插件。以下是我们配置的示例(您可以在此处找到完整的配置,以使用InfluxDB输出插件将数据发送到InfluxDB)

[[inputs.opcua]]
  name = "opcua"
  endpoint = "opc.tcp://127.0.0.1:49330"

   security_policy = "auto"
   security_mode = "auto"

   certificate = ""
   private_key = ""

auth_method = "UserName"
   username = "########"
   password = "########"

   nodes = [
    {name="Tag1", namespace="2", identifier_type="s", identifier="Channel1.Device1.Tag1"},
    {name="Tag2", namespace="2", identifier_type="s", identifier="Channel1.Device1.Tag2"},
  ]

分解

  • 首先,我们指定一个名称和一个端点。名称是任意的,因为它将作为我们的测量名称。端点是指向您的Kepware服务器所必需的。请注意,Kepware的默认OPC UA端点端口号为49330
  • 接下来,我们建立我们的安全策略模式。我们的客户端和Kepware服务器足够智能,可以互相沟通其要求,因此我们可以将这些设置为自动(请注意,您的Kepware实例可能具有受限的发现功能,这可能需要手动选择安全策略)。
  • 由于我们正在建立一个安全策略,在大多数情况下这将是一个Basic256Sha256、已签名和加密的策略,因此我们需要一个证书私钥。对于我们的用例,我们可以将路径留空。客户端将生成一个自签名的证书。
  • 安全层的最后一层需要一个认证方法。这可以通过用户、证书或匿名方式(不建议在生产环境中使用)完成。在我们的用例中,我们将使用用户名和密码以安全的方式连接到Kepware。我建议查看官方Kepware文档中的用户管理。
  • 最后,我们确定我们的标签。不要与InfluxDB的标签表示法混淆。Kepware使用标签来表示数据变量(在InfluxDB术语中可以与字段紧密相关)。由于我们正在使用默认项目,我们只收集两个标签(Tag1和Tag2)。

2. 我们现在可以启动Telegraf服务,指向我们的OPC-UA配置

telegraf --config ./telegraf-opcua.conf

请注意我们目前收到的错误

2021-11-16T11:57:48Z E! [inputs.opcua] Error in plugin: error in Client Connection: EOF
2021-11-16T11:57:50Z E! [inputs.opcua] Error in plugin: error in Client Connection: EOF

我知道这不是一个很好的错误消息!本质上发生的事情是我们的客户端正在生成一个证书并将其发送到Kepware。从那里,Kepware将证书放入其信任存储中,默认情况下会被拒绝。出于安全原因,这是我们手动批准此连接的操作。

3. 要接受我们的自签名证书,您需要在运行您的Kepare Edge服务器的系统上运行以下命令

sudo /opt/tkedge/v1/edge_admin manage-truststore uaserver --list

这将向您展示Kepware中当前存储的证书列表

Thumbprint                                  Status       Common Name
5a5d2c63283b6ad8cd1bd0ad4137f4fd93706124    Trusted      UaBrowser
9ccd3ed34655e0dce281e1e52b971b2c3391475b    Rejected     Telegraf OPC UA client

如您所见,我们的客户端正如预期的那样被拒绝。要批准我们的客户端,我们运行以下命令

sudo /opt/tkedge/v1/edge_admin   manage-truststore uaserver --force --trust  9ccd3ed34655e0dce281e1e52b971b2c3391475b

注意:由于我们正在使用Telegraf在启动时自动生成的证书,您将需要在重启Telegraf时接受新的证书。强烈建议您使用自己的证书。

  • 您必须使用强制标志接受自签名证书,因为它被认为是不安全的连接方法。
  • 由于Telegraf在启动时自动生成我们的证书,您将需要在重启Telegraf时接受新的证书。强烈建议您使用自己的证书。

可以通过KEPServerEX的OPC UA配置管理器批准证书。

4. Telegraf现在将开始将数据写入您的InfluxDB实例。

选项2 - MQTT

MQTT是一个开源的轻量级pub/sub协议,在基于物联网的应用程序中得到广泛使用。值得注意的是,尽管MQTT很受欢迎,但它并不被认为是一个OT协议,如Modbus、OPC UA或CAN。幸运的是,Kepware提供了一个名为IoT网关的桥梁,它自动将Kepware服务器中的数据转换为JSON,并将其发送到您选择的MQTT代理。

我们将使用Telegraf内置的MQTT客户端从代理中提取此数据,并将其自动存储到InfluxDB中。

1. 首先,我们需要生成我们的 Telegraf 配置。为此,我们将使用 MQTT 消费者输入插件。以下是我们的配置 (您可以在 此处找到完整配置,以使用 InfluxDB 输出插件将数据发送到 InfluxDB)

[[inputs.mqtt_consumer]]

  servers = ["tcp://192.168.1.220:1883"]
  topics = [
    "iotgateway",
  ]
  data_format = "json_v2"

 [[inputs.mqtt_consumer.json_v2]]
     measurement_name = "kepware_edge5"
       [[inputs.mqtt_consumer.json_v2.object]]
        path = "@this"
        disable_prepend_keys = true
        timestamp_path = "timestamp"
        timestamp_format = "unix"
        excluded_keys = ["timestamp"]

[[processors.starlark]]
  source = '''
def apply(metric):
    v = metric.fields.get('id')

    if v == None:
      return metric

    metric.tags['id'] = v
    return metric
'''

分解

  • 首先,我们指定一个 服务器。服务器需要指向您的 MQTT 代理。请注意,我在与我 Kepware 服务器相同的机器上运行了一个 Mosquitto 服务器,使用默认端口 1883
  • 接下来,我们建立我们希望订阅的主题。默认情况下,Kepware IoT 网关将在以下主题上发布其数据:iotgateway
  • 最后,由于物联网网关发送的数据是 JSON 格式,我们使用 json_v2 解析器相应地设置自己的数据格式。
  • 由于我们的数据以对象数组的形式到来,我们必须稍微聪明一点。首先,我们 禁用 prepend_key 以获取确切的键名。然后,我们使用 timestamp_path 将 Kepware 时间戳分配为我们指标的时间戳。最后,我们使用 exclude_key 删除时间戳作为字段。
  • 有一点小问题,由于每个对象都是同一数组的组成部分,并且我们已经禁用了 prepend 键,因此指标实际上正在相互覆盖。为了解决这个问题,我使用了一个名为 Starlark 的处理器插件,将 id 字段更改为标签,从而分离我们的数据。

2. 如果您还没有安装和运行 MQTT 代理,请确保这样做。我使用 Mosquitto。有关安装说明,请参阅此 页面

3. 我们现在可以启动 Telegraf 服务,指向我们的 OPC-UA 配置

telegraf --config ./telegraf-mqtt.conf

4. 最后,我们需要配置 Kepware IoT 网关(在以下文档中搜索 IoT Gateway)

结论

如您现在所见,我们正在从 Kepware 服务器收集数据,并将标签直接存储到 InfluxDB 中。一旦您开始收集自己的机器数据,您的可视化将比我的更有趣。

stored data visualization

我还建议查看以下博客文章,以了解您可以使用自动化数据做什么

  1. 使用 ogamma Visual Logger for OPC 和 InfluxDB 存储、处理和可视化数据。
  2. InfluxDB 云中的物联网原型设计(第 2 部分):查询、任务和仪表板
  3. InfluxDB 和 GeoData – 应急发电机

如果您想试用 ThingWorx Kepware Edge 或 KEPServerEX,请查看此 网站。试用是免费的,并提供有限时间的许可证。如果您遇到困难或想讨论您的用例,请访问 InfluxData 的 Slack社区 论坛(只需确保 @Jay Clifford)。让我们在那里继续讨论!