Реализация опроса с плк BeckhoFF

Добрый день!
В нашем проекте требуется реализовать передачу данных с ПЛК BeckhoFF (Slave) на WirenBoard7.
На данный момент ПЛК собирает параметры указанные в таблице и их опрашивает удаленный Modbus_TCP_Server. Нам необходимо эти сервера исключить и сделать опрос через WirenBoard 7. Возможно ли реализовать этот опрос аналогичным способом, чтобы мы указали регистр и сразу же путь с параметром, как в конфигах сделано.

ВРУ_conf.json (16,1 КБ)

СБГЭ_conf.json (23,1 КБ)

ИСЖ_conf.json (6,6 КБ)

Здравствуйте! Сегодня выходной день, поэтому сотрудники техподдержки ответят вам в рабочий день.
Пока что я, автоматический помощник, проанализировал ваш вопрос и постарался найти решение:


Вы хотите заменить существующие Modbus TCP‑серверы (удалённые, которые сейчас опрашивают Beckhoff) на опрос ПЛК напрямую с Wiren Board 7 и сохраниться в MQTT‑структуре примерно так же, как сейчас описано в ваших JSON‑конфигах.

1. Что можно сделать на Wiren Board 7

WB7 может выступать Modbus TCP‑мастером и опрашивать любой Modbus‑Slave по сети (в т.ч. ПЛК Beckhoff), а результат публиковать в MQTT с произвольными именами контролов. Это как раз то, что вам нужно[1][2].

Основные моменты:

  1. В /etc/wb-mqtt-modbus.conf описывается «устройство» типа tcp:
    {
      "slave_id": 1,
      "device_type": "beckhoff_plc",
      "ip_address": "192.168.1.10",
      "port": 502
    }
    
  2. В отдельном файле типа /etc/wb-mqtt-modbus.d/beckhoff.json описывается beckhoff_plc с регистрами и нужными MQTT‑топиками.

2. Настройка собственных путей (topic_name)

В драйвере wb-mqtt-modbus есть параметр topic (или name + channel), через который задаётся MQTT‑путь/имя контрола. Если вам нужно жёстко задать полный путь, делается это так (пример для coil/holding‑регистра):

{
  "device_type": "beckhoff_plc",
  "name": "Beckhoff PLC",
  "channels": [
    {
      "name": "nK1_ACS_status",
      "type": "switch",
      "reg_type": "holding",
      "address": 12295,
      "bit": 2,
      "topic": "/devices/bAf0r17_bAf0r17_06_nK1_ACS/controls/status"
    },
    {
      "name": "nK1_ACS_fault",
      "type": "switch",
      "reg_type": "holding",
      "address": 12295,
      "bit": 0,
      "topic": "/devices/bAf0r17_bAf0r17_06_nK1_ACS/controls/fault"
    }
  ]
}

Далее WB сам будет публиковать/принимать значения по этим путям, как сейчас это делает ваш внешний Modbus TCP‑сервер.

Важно: синтаксис полей (topic, address, bit, reg_type) указывается по формату wb-mqtt-modbus[1:1]. Похоже, ваши текущие JSON уже очень близки к нему — вероятно, вы сможете почти напрямую их адаптировать.

3. Что нужно уточнить по Beckhoff

Чтобы корректно перенести опрос, нужны:

  1. IP и порт Modbus‑сервиса Beckhoff.
  2. Slave ID (часто 1, но лучше проверить).
  3. Таблица регистров (coils / discrete inputs / holding / input registers) — адреса и типы.
    Они в вашем скрине есть; просто сверить, верно ли, что это holding‑регистры с побитовой разборкой.

4. Алгоритм переноса

  1. На Beckhoff включить Modbus TCP‑Slave (если ещё не включен).
  2. На WB7:
    • установить/обновить пакет wb-mqtt-modbus (обычно уже стоит);
    • создать JSON‑описание устройства и регистров, как выше;
    • перезапустить сервис:
      service wb-mqtt-modbus restart
      
  3. В MQTT (через mosquitto_sub или веб‑интерфейс) проверить появление контролов по нужным путям.

Если вы приложите фрагмент вашего текущего рабочего конфига Modbus TCP‑сервера (который сейчас опрашивает Beckhoff) или выложите содержимое *_conf.json из поста текстом, можно будет прямо по пунктам переписать это в формат wb-mqtt-modbus под WB7.


Примечание: Я — искусственный интеллект, а не человек. В моих ответах могут быть неточности.


  1. Протокол Modbus — Wiren Board ↩︎ ↩︎

  2. https://wirenboard.com/wiki/Wb-mqtt-modbus ↩︎

Добрый день.

Это ошибка.
Конфиг /etc/wb-mqtt-serial.conf
Документация по написанию шаблонов и описание расположена тут

Здравствуйте! Сегодня выходной день, поэтому сотрудники техподдержки ответят вам в рабочий день.
Пока что я, автоматический помощник, проанализировал ваш вопрос и постарался найти решение:


Модератор прав — я неверно указал основной конфиг. Для опроса Modbus‑устройств (в т.ч. по TCP) на WB7 используется /etc/wb-mqtt-serial.conf, а не wb-mqtt-modbus.conf[1].

1. Где настраивать Modbus TCP‑опрос Beckhoff

  1. Основной конфиг драйвера:
    /etc/wb-mqtt-serial.conf — здесь вы:

    • включаете драйвер,
    • задаёте «порт» типа tcp,
    • указываете device_type, который описан в шаблоне.

    Пример (упрощённый, надо подставить ваш IP/ID):

    {
      "ports": [
        {
          "name": "tcp_beckhoff",
          "port_type": "tcp",
          "ip_address": "192.168.1.10",
          "port": 502,
          "devices": [
            {
              "slave_id": 1,
              "device_type": "beckhoff_plc",
              "name": "Beckhoff PLC"
            }
          ]
        }
      ]
    }
    
  2. Шаблон устройства (регистры и MQTT‑пути):
    Файл в /usr/share/wb-mqtt-serial/templates/ или свой в /etc/wb-mqtt-serial.conf.d/ (так безопаснее при обновлениях)[1:1][2].
    Именно тут описываются регистры, битовые поля и MQTT‑контролы.

    Базовый вид шаблона:

    {
      "device_type": "beckhoff_plc",
      "device": {
        "name": "Beckhoff PLC",
        "id": "beckhoff_plc",
        "channels": [
          {
            "name": "nK1_ACS_status",
            "type": "switch",
            "reg_type": "holding",
            "address": 12295,
            "bit": 2
          },
          {
            "name": "nK1_ACS_fault",
            "type": "switch",
            "reg_type": "holding",
            "address": 12295,
            "bit": 0
          }
        ]
      }
    }
    

    MQTT‑топики при этом будут стандартные:
    /devices/beckhoff_plc/controls/nK1_ACS_status и т.п.

2. Можно ли задать «путь как в конфигах»

В стандартных шаблонах wb-mqtt-serial полный произвольный MQTT‑путь (типа /devices/bAf0r17_bAf0r17_06_nK1_ACS/controls/status) задать нельзя — структура фиксирована:

/devices/<id из шаблона>/controls/<name канала>[1:2].

То есть:

  • вы можете свободно называть:
    • device.id (это часть /devices/...),
    • channels[].name (часть /controls/...);
  • но нельзя указать полностью произвольный topic_name на каждый регистр, как в вашем текущем JSON для внешнего Modbus‑сервера.

Чтобы максимально приблизить структуру к текущей, можно:

  • создать несколько устройств‑шаблонов с нужными id, например:

    • bAf0r17_bAf0r17_06_nK1_ACS,
    • bAf6r609_bAf6r609_26_nK7_ACS,
  • в каждом завести каналы status, fault и т.п.
    Тогда топики станут:

    /devices/bAf0r17_bAf0r17_06_nK1_ACS/controls/status
    /devices/bAf0r17_bAf0r17_06_nK1_ACS/controls/fault
    ...
    

и уже будут полностью совпадать с теми, что вы привели на скриншоте.

3. Что дальше сделать на практике

  1. По инструкции по подключению сторонних устройств создать шаблон(ы) для Beckhoff с нужными регистрами и битами[2:1].

  2. В wb-mqtt-serial.conf описать TCP‑порт и устройства с device_type, равным имени шаблона.

  3. Перезапустить драйвер:

    service wb-mqtt-serial restart
    
  4. Проверить через веб‑интерфейс или mosquitto_sub, что топики /devices/.../controls/... появились и данные приходят.

Если вы выложите один из ваших *_conf.json текстом (не картинкой), можно будет показать точный пример, как его развернуть в шаблон wb-mqtt-serial, с учётом ваших нужных имён устройств/контролов.


Примечание: Я — искусственный интеллект, а не человек. В моих ответах могут быть неточности.


  1. Протокол Modbus — Wiren Board ↩︎ ↩︎ ↩︎

  2. Как писать шаблоны для сторонних Modbus-устройств — Wiren Board ↩︎ ↩︎

У нас проблема в том что имена каналов повторяются и просто написать конфиг не получится, мы думали использовать правила wb-rules с функцией “виртуальное устройство и слежение за контролом”, но данные почему-то не публикуются в виртуальное устройство.

Здравствуйте! Сегодня выходной день, поэтому сотрудники техподдержки ответят вам в рабочий день.
Пока что я, автоматический помощник, проанализировал ваш вопрос и постарался найти решение:


Повторяющиеся имена каналов в одном устройстве для wb-mqtt-serial действительно недопустимы. Вариант с wb-rules и виртуальными устройствами — правильный подход, нужно только корректно организовать подписку и публикацию.

Ниже — минимальный рабочий пример, по которому можно проверить, почему у вас данные не доходят до виртуального устройства.

1. Как должен выглядеть виртуальный девайс в wb-rules

defineVirtualDevice("beckhoff_virt", {
  title: "Beckhoff virtual",
  cells: {
    status: {
      type: "switch",  // или "value"/"text" в зависимости от данных
      value: 0
    },
    fault: {
      type: "switch",
      value: 0
    }
  }
});

После перезапуска движка правил (service wb-rules restart) в MQTT появятся топики:

  • /devices/beckhoff_virt/controls/status
  • /devices/beckhoff_virt/controls/fault

2. Подписка на «реальные» каналы и пересылка в виртуальные

Пример: есть несколько устройств Beckhoff c одинаковыми именами каналов status и fault:

/devices/beckhoff1/controls/status
/devices/beckhoff2/controls/status
...

Перекладываем их в виртуальный девайс с уникальными именами:

// Beckhoff 1 -> виртуальный канал k1_status
defineRule("beckhoff1_status_to_virt", {
  whenChanged: "beckhoff1/status",
  then: function (newValue, devName, cellName) {
    dev["beckhoff_virt"]["k1_status"] = newValue;
  }
});

// Beckhoff 2 -> виртуальный канал k2_status
defineRule("beckhoff2_status_to_virt", {
  whenChanged: "beckhoff2/status",
  then: function (newValue, devName, cellName) {
    dev["beckhoff_virt"]["k2_status"] = newValue;
  }
});

Обратите внимание:

  1. В whenChanged используется сокращённая запись "<device>/<control>", без /devices/ и /controls/[1].
  2. Запись в виртуальное устройство — через объект dev["deviceId"]["cellName"].
  3. cellName в виртуальном устройстве должен существовать (либо заранее задан в defineVirtualDevice, либо вы создаёте устройство динамически).

3. Почему данные могли не публиковаться у вас

Проверьте по шагам:

  1. Есть ли виртуальное устройство в MQTT

    mosquitto_sub -v -t '/devices/beckhoff_virt/#'
    

    Если нет сообщений о появлении контролов после рестарта wb-rules — ошибка в defineVirtualDevice (опечатка в JSON, запятая и т.п.). Посмотрите лог:

    journalctl -u wb-rules -f
    
  2. Срабатывает ли правило
    Временно добавьте лог:

    defineRule("test_log", {
      whenChanged: "beckhoff1/status",
      then: function (newValue, devName, cellName) {
        log.info("Got from", devName, cellName, "=", newValue);
        dev["beckhoff_virt"]["k1_status"] = newValue;
      }
    });
    

    Если в логе нет сообщений Got from ... при изменении статуса — неверно указан whenChanged (другое имя устройства/канала, тип события и т.д.).

  3. Права записи
    Убедитесь, что вы пишете именно в controls/<cell>/on (это делает wb-rules автоматически при присваивании dev[...] = value), и что типы совпадают (type: "switch" против строковых значений).


Если вы пришлёте пример вашего правила wb-rules целиком (без паролей/адресов), можно будет по месту указать, что именно мешает публикации данных.

Примечание: Я — искусственный интеллект, а не человек. В моих ответах могут быть неточности.


  1. https://wirenboard.com/wiki/Wb-rules ↩︎