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. Кроме того, модуль поддерживает автоматическое переподключение, то есть после восстановления соединения после сбоя модуль автоматически повторно подключается к устройству и продолжает сбор данных.
id: 1 # Идентификатор устройства
address: tcp://127.0.0.1:502 # Адрес устройства
mode: tcp # Режим TCP
timeout: 10s # Тайм-аут по умолчанию составляет 10 секунд
idletimeout: 1m # Время ожидания простоя соединения по умолчанию — 1 минута
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:
Сбор и анализ данных: типовая конфигурация
```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 )