1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/baetyl-baetyl-adapter

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 26 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 01:23 2bbefac

Modbus

Введение

Модуль Modbus основан на протоколе Modbus и собирает и анализирует данные. Модуль поддерживает настройку нескольких подчинённых устройств (называемых «slave»), а также позволяет устанавливать интервалы сбора данных.

Доступны два способа подключения: TCP или RTU. Данные собираются с помощью идентификатора устройства, начального адреса данных, длины блока данных, функционального кода и информации о полях.

После сбора данные отправляются в виде двоичного потока на настроенную тему MQTT broker. Модуль может быть настроен так, чтобы собирать данные только от подчинённого устройства и отправлять их в виде двоичного потока на указанную тему MQTT. Также можно настроить модуль для анализа собранных данных и отправки их в формате JSON на заданную тему MQTT.

Модуль Modbus можно развернуть с использованием baetyl и baetyl-cloud и интегрировать с baetyl-broker. Baetyl автоматически настроит соединение Modbus с baetyl-broker по протоколу TLS.

Для получения дополнительной информации обратитесь к документации baetyl и рекомендациям по развёртыванию приложений.

Конфигурацию модуля можно разделить на три части: 1) конфигурация подчинённого устройства; 2) настройка задачи; 3) отправка данных:

Конфигурация подчинённого устройства

Подчинённые устройства используются для настройки подключённых к модулю устройств. Можно настроить несколько подчинённых устройств, каждое из которых должно иметь уникальный идентификатор, иначе последующие определения подчинённых устройств будут перекрывать предыдущие.

Подключение через TCP или RTU является возможным. По умолчанию используется режим RTU. Кроме того, модуль поддерживает автоматическое переподключение, то есть после восстановления соединения после сбоя модуль автоматически повторно подключается к устройству и продолжает сбор данных.

  • Режим TCP:
id: 1 # Идентификатор устройства
address: tcp://127.0.0.1:502 # Адрес устройства
mode: tcp # Режим TCP
timeout: 10s # Тайм-аут по умолчанию составляет 10 секунд
idletimeout: 1m # Время ожидания простоя соединения по умолчанию — 1 минута
  • Режим RTU:
id: 1 # Идентификатор устройства
address: /dev/ttyUSB4 # Адрес устройства   timeout: 10s # Тайм-аут по умолчанию составляет 10 секунд
mode: rtu # Режим RTU
idletimeout: 1m # Время ожидания простоя соединения по умолчанию — 1 минута
baudrate: 19200 # Скорость передачи данных по умолчанию равна 19 200
databits: 8 # Биты данных, возможны варианты (5,6,7,8), по умолчанию равно 8
stopbits: 1 # Стоповые биты, возможны варианты (1,2), по умолчанию равен 1
parity: E # Тип контроля чётности, возможны варианты N (без контроля, стоп-биты должны быть установлены на 2), E (нечётный контроль), O (чётный контроль). По умолчанию установлен E

Задачи

Задачи определяют серию точек данных и интервалов сбора, включая сбор и анализ. В конфигурации модуля можно определить несколько задач, каждая из которых соответствует одному подчинённому устройству. Задачи могут быть настроены с указанием интервала сбора, а также для сбора или сбора и анализа.

Подробности конфигурации:

slaveid: 1 # Идентификатор устройства для сбора данных
interval: 20s # Интервал сбора
encoding: json # Кодирование, можно настроить как binary или json, binary означает отправку собранных данных в виде двоичного потока, json означает анализ собранных данных и отправку в формате JSON
time: # Информация о времени в задаче сбора, кодирование установлено как binary, поддерживается только настройка precision
name: time # Имя поля времени, по умолчанию установлено значение «time»
type: integer # Можно настроить как integer и string, по умолчанию установлено integer
format: '2006-01-02 15:04:05' # Формат времени, должен быть настроен в соответствии с форматом 2006-01-02 15:04:05, по умолчанию установлен 2006-01-02 15:04:05
precision: s # Можно настроить как s или ns, что означает точность до секунд или наносекунд, по умолчанию установлена s
maps:
- function: 3 # Функциональный код, можно настроить (1, 2, 3, 4), подробности приведены ниже
address: 40011 # Начальный адрес
quantity: 4 # Количество собранных данных, кодирование установлено в json, не требуется настройка, будет автоматически выведено
field: # Кодирование установлено в json, обязательно настроить поле
name: temperature # Имя анализируемого поля
type: float64 # Тип анализируемых данных
publish:
topic: # Отправленная тема
qos: # Качество обслуживания при отправке

Эта конфигурация означает, что данные будут собираться с подчинённого устройства с идентификатором 1 с интервалом в 20 секунд. Сбор начинается с адреса 40011, поскольку функциональный код равен 3, что соответствует данным сохранённого регистра. Количество данных определено как 4, каждый регистр имеет длину данных 16 бит (2 байта), что означает сбор 8 байтов данных начиная с начального адреса. Собранные данные анализируются как float64 и отправляются в формате JSON:

{
    "slaveid": 1,
    "time": "2020-05-20 15:04:05",
    "attr": {
        "temperature": 35.32
    }
}

Эти данные будут отправлены в определённую тему в разделе jobs. При работе в baetyl можно не настраивать тему, по умолчанию она будет установлена как /.

Типы анализа

Поддерживаемые типы анализа включают bool, int16, uint16, int32, uint32, int64, uint64, float32 и float64. При указании типа анализа следует использовать один из этих типов. Анализ использует порядок байтов с прямым порядком.

Функциональные коды

Modbus предоставляет доступ к данным, хранящимся в одном из четырёх хранилищ данных или диапазонов адресов: состояние катушки, дискретный ввод, сохранённый регистр и входной регистр. Состояние катушки и данные дискретного ввода представлены в битах, и после анализа данные поддерживают только тип bool. Состояния катушки соответствуют функциональному коду 1, а данные дискретного входа — функциональному коду 2. Данные сохранённого и входного регистров представлены в двойных байтах (16 бит), и после анализа они поддерживают все типы данных, упомянутые выше. Сохранённый регистр соответствует функциональному коду 3, а входной регистр — функциональному коду 4.

Количество собранных данных

Когда кодирование задачи установлено в json, необходимо настроить поле, указав имя и тип данных при анализе в JSON. Настройка количества не требуется, так как количество данных для каждого типа данных фиксировано. Например, когда тип поля установлен в int32, это означает 4 байта, а сохранённый регистр или входной регистр имеют длину 16 бит (2 байта). Поэтому количество обязательно равно 2 (32/16). Когда тип поля установлен на float64, это означает 8 байт, поэтому количество обязательно равно 4 (64/16). Кроме того, когда кодирование задачи установлено на binary, это означает только сбор данных без анализа. Настройка поля не действует, и количество необходимо настроить.

Только сбор данных

Если кодирование задачи настроено на json (по умолчанию), модуль будет анализировать собранные данные и отправлять их в формате JSON. Если кодирование настроено на binary, модуль отправит собранные данные без анализа. Конкретный формат:

|----|----|----|----|---------|----|---------|
|    ts   | id |a+l |  data   |a+l |  data   |

8 байтов (отметка времени) + 4 байта (идентификатор устройства сбора) + 2 байта (начальный адрес сбора) + 2 байта (количество собранных данных) + собранные данные + ...

Отправка

В настоящее время модуль Modbus может отправлять проанализированные данные через MQTT на MQTT broker. Соединение с MQTT broker может осуществляться через TCP/WS/SSL/WSS и другие способы. Указывая целевую тему для отправки, собранные или проанализированные данные будут отправляться в эту тему.

Настройка соединения MQTT:

broker:
clientid: Client 连接 Hub 的 Client ID。cleansession 为 false 则不允许为空
address: [必须] Client 连接Hub的地址
username: Client 连接Hub的用户名
password: 如果采用账号密码,必须填 Client 连接Hub的密码,否者不用填写
ca: 如果采用证书双向认证,必须填 Client 连接Hub的CA证书路径
key: 如果采用证书双向认证,必须填 Client 连接Hub的客户端私钥路径
cert: 如果采用证书双向认证,必须填 Client 连接Hub的客户端公钥路径
timeout: 默认值:30s,Client 连接 Hub 的超时时间
``` **maxReconnectInterval:**

* Значение по умолчанию: 3 минуты.
* Описание: максимальное время ожидания повторного подключения клиента к Hub при разрыве соединения. Соединение начинается с 500 микросекунд и удваивается до максимального значения.

**keepalive:**

* Значение по умолчанию: 30 секунд.
* Описание: интервал времени, в течение которого клиент поддерживает соединение с Hub.

**cleansession:**

* Значение по умолчанию: false.
* Описание: определяет, сохраняет ли клиент сеанс при подключении к Hub.

**disableAutoAck:**

* Значение по умолчанию: false.
* Описание: отключает автоматическую отправку подтверждения (ACK) клиентом при получении сообщений от Hub.

**subscriptions:** список тем подписки на Hub.

**maxCacheMessages:**

* Значение по умолчанию: 10.
* Описание: максимальный размер очереди сообщений, отправляемых клиентом на Hub. Если клиент неожиданно завершает работу, сообщения могут быть потеряны. После восстановления работы QoS для сообщений, зависящих от 1, будет зависеть от повторной отправки Hub.

Сбор данных: типичная конфигурация

broker: address: tcp://127.0.0.1:1883 # Адрес подключения к MQTT Hub clientid: modbus-1 # Идентификатор клиента при подключении к MQTT Hub (можно не настраивать при работе на основе baetyl) slaves:

  • id: 1 # ID подчиненного устройства address: tcp://127.0.0.1:502 # Адрес TCP-соединения с подчиненным устройством mode: tcp # Режим TCP jobs:
  • slaveid: 1 # Задача сбора данных для соответствующего устройства encoding: binary # Указание только на сбор данных, данные отправляются в виде двоичного потока maps:
    • function: 1 # Функция, соответствующая состоянию катушки address: 32 # Начальный адрес quantity: 1 # Количество собранных данных, состояние катушки соответствует 1 биту, количество нельзя пропустить при кодировании в двоичном формате
    • function: 3 # Функция, соответствующая сохранённому регистру address: 40011 # Начальный адрес количество: 1 # Собранное количество данных, сохранённый регистр соответствует 16 битам, количество нельзя пропустить при двоичном кодировании publish: topic: test # Тема MQTT для отправки собранных данных logger: filename: var/log/baetyl/service.log # Путь к журналу level: info # Уровень журнала

Сбор и анализ данных: типовая конфигурация
```yaml
broker:
  address: tcp://127.0.0.1:1883 # Адрес подключения к MQTT Hub
  clientid: modbus-1 # Идентификатор клиента при подключении к MQTT Hub (можно не настраивать при работе на основе baetyl)
slaves:
  - id: 1 # ID подчинённого устройства
    address: tcp://127.0.0.1:502 # Адрес TCP-подключения к подчинённому устройству
    mode: tcp # Режим TCP
jobs:
  - slaveid: 1 # Задание сбора данных для соответствующего устройства
    encoding: json # Указание на сбор и анализ данных, данные передаются в формате JSON, по умолчанию — json
    maps:
      - функция: 2 # Функция, соответствующая дискретному входному сигналу
        адрес: 47 # Начальный адрес
        количество: 1 # Собрано количество данных, дискретный входной сигнал соответствует 1 биту, модуль может автоматически определить количество при анализе данных
        поле:
          имя: переключатель # Имя поля данных после анализа
          тип: bool # Тип данных для анализа данных с плавающей точкой 32
      - функция: 4 # Функция, соответствующая входному регистру
        адрес: 30027 # Начальный адрес
        количество: 1 # Собранное количество данных, входной регистр соответствует 16 битам
        поле:
          имя: влажность # Имя поля данных после анализа
          тип: float32 # Тип данных для анализа данных с плавающей точкой 32
publish:
  topic: test # MQTT-тема для отправки собранных данных
logger:
  filename: var/log/baetyl/service.log # Путь к файлу журнала
  level: info # Уровень журнала

Структура данных при чтении Modbus с устройства в качестве примера:

{
  "slaveid": 1,
  "attr": {
    "switch": false,
    "humidity": 43.2 
  },
  "time": 234435345,
}

Здесь slaveid — это идентификатор устройства из конфигурационного файла, который идентифицирует данные с какого устройства считываются. Атрибут — это данные после сбора и анализа. Наконец, time — это временная метка при считывании данных, которая может быть настроена в конфигурационном файле.

Путь к файлу конфигурации журнала

Путь к файлу модуля конфигурации должен быть etc/baetyl/conf.yml, путь к файлу журнала модуля — var/log/baetyl/service.log.

Управление

Считывание данных с устройств Modbus является распространённой функцией, но иногда требуется контролировать данные в устройствах Modbus определённым образом. Считывание требует указания необходимой информации о данных и их анализа в конфигурационном файле, а запись данных в устройство Modbus в основном осуществляется путём отправки данных через MQTT. То есть в модуле настроен файл конфигурации для подписки на тему MQTT, и сообщение (своего рода инструкция) для записи данных принимается и записывается в устройство.

Следует отметить, что управление применимо только к анализу данных, когда в конфигурации jobs определено encoding как json, то есть определены соответствующие имена переменных и типы переменных, управление может вступить в силу. В качестве примера можно привести конфигурацию сбора и анализа выше. В jobs определены две переменные switch и humidity, тип данных — bool и float32.

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

broker:
  address: tcp://127.0.0.1:1883 # Адрес подключения к MQTT Hub
  clientid: modbus-1 # Идентификатор клиента при подключении к MQTT Hub (можно не настраивать при работе на основе baetyl)
  subscriptions:
      - topic: control # Тема управления для записи данных в устройства Modbus
slaves:
  - id: 1 # ID подчинённого устройства
    mode: tcp # Режим TCP
    address: tcp://127.0.0.1:502 # TCP-адрес подключения к подчинённому устройству
jobs:
  - slaveid: 1 # Задача сбора данных для соответствующего устройства
    encoding: json # Указание на сбор и анализ данных, данные передаются в формате JSON, по умолчанию — json
    maps:
      - функция: 2 # Функция, соответствующая дискретному входному сигналу
        адрес: 47 # Начальный адрес
        количество: 1 # Собрано количество данных, дискретный входной сигнал соответствует 1 биту, модуль может автоматически определить количество при анализе данных
        поле:
          имя: переключатель # Имя поля данных после анализа
          тип: bool # Тип данных для анализа данных с плавающей точкой 32
      - функция: 4 # Функция, соответствующая входному регистру
        адрес: 30027 # Начальный адрес
        количество: 1 # Собранное количество данных, входной регистр соответствует 16 битам
        поле:
          имя: влажность # Имя поля данных после анализа
          тип: float32 # Тип данных для анализа данных с плавающей точкой 32
publish:
  topic: test # MQTT-тема для отправки собранных данных
logger:
  filename: var/log/baetyl/service.log # Путь к файлу журнала
  level: info # Уровень журнала

Посредством отправки сообщения в тему управления MQTT control можно записать данные в устройство Modbus.

{
  "slaveid": 1,
  "attr": {
    "switch": true,
    "humidity": 23.43
  }
}

Формат данных при отправке аналогичен формату данных при считывании, slaveid обозначает идентификатор устройства, которое необходимо контролировать, и совпадает с идентификатором, определённым в конфигурационном файле. Поле attr содержит ожидаемые переменные, имена которых также совпадают с именами, определёнными в конфигурационном файле jobs. Следует отметить, что если отправленные данные не соответствуют определённым именам переменных и типам данных в конфигурационном файле, они будут проигнорированы.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/baetyl-baetyl-adapter.git
git@api.gitlife.ru:oschina-mirror/baetyl-baetyl-adapter.git
oschina-mirror
baetyl-baetyl-adapter
baetyl-baetyl-adapter
master