11#include "driver/uart.h"
15#include "freertos/FreeRTOS.h"
16#include "freertos/task.h"
17#include "mbcontroller.h"
20static const char *
TAG =
"modbus_app";
23#define MB_UART_PORT UART_NUM_1
26#define MB_UART_TXD_GPIO 17
27#define MB_UART_RXD_GPIO 5
28#define MB_UART_RTS_GPIO 33
31#define MB_UART_BAUD_RATE 9600
34#define MB_SLAVE_ADDR 7
37#define MB_HOLD_REG_ADDR 1000
40#define MB_CMD_READ_HOLDING_REGISTER 3
43#define MB_POLL_INTERVAL_MS 5000
52 mb_communication_info_t comm = {
54 .ser_opts.mode = MB_RTU,
56 .ser_opts.parity = MB_PARITY_NONE,
58 .ser_opts.response_tout_ms = 1000,
59 .ser_opts.data_bits = UART_DATA_8_BITS,
60 .ser_opts.stop_bits = UART_STOP_BITS_1,
65 "mb controller init failed");
66 ESP_RETURN_ON_ERROR(err,
TAG,
"mb controller create failed");
70 ESP_RETURN_ON_ERROR(err,
TAG,
"uart_set_pin failed");
72 err = uart_set_mode(
MB_UART_PORT, UART_MODE_RS485_HALF_DUPLEX);
73 ESP_RETURN_ON_ERROR(err,
TAG,
"uart_set_mode failed");
76 ESP_RETURN_ON_ERROR(err,
TAG,
"mb controller start failed");
78 ESP_LOGI(
TAG,
"Modbus master started: UART%d, %d baud, slave %d",
96 uint16_t reg_value = 0;
99 esp_err_t err = ESP_OK;
102 ESP_LOGI(
TAG,
"Slave %d, reg %d = %u",
106 snprintf(topic,
sizeof(topic),
"ozlocks/%s/modbus/%d/reg%d",
110 snprintf(payload,
sizeof(payload),
"%u", reg_value);
113 ESP_LOGW(
TAG,
"Read slave %d reg %d failed: %s",
123 static bool started =
false;
131 BaseType_t created = xTaskCreate(
modbus_poll_task,
"modbus_poll", 4096, NULL, 5, NULL);
132 ESP_RETURN_ON_FALSE(created == pdPASS, ESP_ERR_NO_MEM,
TAG,
"poll task create failed");
#define MB_POLL_INTERVAL_MS
Интервал опроса, мс
esp_err_t modbus_app_start(void)
Инициализирует Modbus master и запускает задачу опроса шины.
#define MB_UART_PORT
UART для RS485.
static esp_err_t modbus_master_init(void)
Инициализация Modbus RTU master на UART с режимом RS485.
#define MB_SLAVE_ADDR
Адрес Modbus-устройства на шине
#define MB_HOLD_REG_ADDR
Адрес holding-регистра
#define MB_UART_TXD_GPIO
Пины RS485-трансивера
static void * s_master_handle
static void modbus_poll_task(void *arg)
Задача периодического чтения регистра 1000 и публикации в MQTT.
#define MB_UART_BAUD_RATE
Параметры линии: 9600 8N1.
Modbus RTU master на RS485.
const char * mqtt_app_get_client_id(void)
Возвращает Client ID устройства (префикс + MAC Ethernet).
esp_err_t mqtt_app_publish(const char *topic, const char *data, int qos, int retain)
Публикует сообщение в MQTT, если клиент подключён.
Публичный интерфейс MQTT-клиента.