RCM — ESP32 Room Controller
WT32-ETH01 firmware
Loading...
Searching...
No Matches
modbus_app.c
Go to the documentation of this file.
1
6#include "modbus_app.h"
7
8#include <stdbool.h>
9#include <stdio.h>
10
11#include "driver/uart.h"
12#include "esp_check.h"
13#include "esp_err.h"
14#include "esp_log.h"
15#include "freertos/FreeRTOS.h"
16#include "freertos/task.h"
17#include "mbcontroller.h"
18#include "mqtt_app.h"
19
20static const char *TAG = "modbus_app";
21
23#define MB_UART_PORT UART_NUM_1
24
26#define MB_UART_TXD_GPIO 17
27#define MB_UART_RXD_GPIO 5
28#define MB_UART_RTS_GPIO 33
29
31#define MB_UART_BAUD_RATE 9600
32
34#define MB_SLAVE_ADDR 7
35
37#define MB_HOLD_REG_ADDR 1000
38
40#define MB_CMD_READ_HOLDING_REGISTER 3
41
43#define MB_POLL_INTERVAL_MS 5000
44
45static void *s_master_handle;
46
50static esp_err_t modbus_master_init(void)
51{
52 mb_communication_info_t comm = {
53 .ser_opts.port = MB_UART_PORT,
54 .ser_opts.mode = MB_RTU,
55 .ser_opts.baudrate = MB_UART_BAUD_RATE,
56 .ser_opts.parity = MB_PARITY_NONE,
57 .ser_opts.uid = 0,
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,
61 };
62
63 esp_err_t err = mbc_master_create_serial(&comm, &s_master_handle);
64 ESP_RETURN_ON_FALSE(s_master_handle != NULL, ESP_ERR_INVALID_STATE, TAG,
65 "mb controller init failed");
66 ESP_RETURN_ON_ERROR(err, TAG, "mb controller create failed");
67
69 MB_UART_RTS_GPIO, UART_PIN_NO_CHANGE);
70 ESP_RETURN_ON_ERROR(err, TAG, "uart_set_pin failed");
71
72 err = uart_set_mode(MB_UART_PORT, UART_MODE_RS485_HALF_DUPLEX);
73 ESP_RETURN_ON_ERROR(err, TAG, "uart_set_mode failed");
74
75 err = mbc_master_start(s_master_handle);
76 ESP_RETURN_ON_ERROR(err, TAG, "mb controller start failed");
77
78 ESP_LOGI(TAG, "Modbus master started: UART%d, %d baud, slave %d",
80 return ESP_OK;
81}
82
86static void modbus_poll_task(void *arg)
87{
88 // mb_param_request_t request = {
89 // .slave_addr = MB_SLAVE_ADDR,
90 // .command = MB_CMD_READ_HOLDING_REGISTER,
91 // .reg_start = MB_HOLD_REG_ADDR,
92 // .reg_size = 1,
93 // };
94
95 while (true) {
96 uint16_t reg_value = 0;
97 // esp_err_t err = mbc_master_send_request(s_master_handle, &request, &reg_value);
98 // для тестирования временная заглушка
99 esp_err_t err = ESP_OK;
100
101 if (err == ESP_OK) {
102 ESP_LOGI(TAG, "Slave %d, reg %d = %u",
103 MB_SLAVE_ADDR, MB_HOLD_REG_ADDR, reg_value);
104
105 char topic[64];
106 snprintf(topic, sizeof(topic), "ozlocks/%s/modbus/%d/reg%d",
108
109 char payload[32];
110 snprintf(payload, sizeof(payload), "%u", reg_value);
111 mqtt_app_publish(topic, payload, 1, 0);
112 } else {
113 ESP_LOGW(TAG, "Read slave %d reg %d failed: %s",
114 MB_SLAVE_ADDR, MB_HOLD_REG_ADDR, esp_err_to_name(err));
115 }
116
117 vTaskDelay(pdMS_TO_TICKS(MB_POLL_INTERVAL_MS));
118 }
119}
120
121esp_err_t modbus_app_start(void)
122{
123 static bool started = false;
124
125 if (started) {
126 return ESP_OK;
127 }
128
129 ESP_RETURN_ON_ERROR(modbus_master_init(), TAG, "modbus init failed");
130
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");
133
134 started = true;
135 return ESP_OK;
136}
#define MB_POLL_INTERVAL_MS
Интервал опроса, мс
Definition modbus_app.c:43
esp_err_t modbus_app_start(void)
Инициализирует Modbus master и запускает задачу опроса шины.
Definition modbus_app.c:121
#define MB_UART_PORT
UART для RS485.
Definition modbus_app.c:23
static esp_err_t modbus_master_init(void)
Инициализация Modbus RTU master на UART с режимом RS485.
Definition modbus_app.c:50
#define MB_UART_RTS_GPIO
Definition modbus_app.c:28
#define MB_SLAVE_ADDR
Адрес Modbus-устройства на шине
Definition modbus_app.c:34
#define MB_HOLD_REG_ADDR
Адрес holding-регистра
Definition modbus_app.c:37
static const char * TAG
Definition modbus_app.c:20
#define MB_UART_RXD_GPIO
Definition modbus_app.c:27
#define MB_UART_TXD_GPIO
Пины RS485-трансивера
Definition modbus_app.c:26
static void * s_master_handle
Definition modbus_app.c:45
static void modbus_poll_task(void *arg)
Задача периодического чтения регистра 1000 и публикации в MQTT.
Definition modbus_app.c:86
#define MB_UART_BAUD_RATE
Параметры линии: 9600 8N1.
Definition modbus_app.c:31
Modbus RTU master на RS485.
const char * mqtt_app_get_client_id(void)
Возвращает Client ID устройства (префикс + MAC Ethernet).
Definition mqtt_app.c:45
esp_err_t mqtt_app_publish(const char *topic, const char *data, int qos, int retain)
Публикует сообщение в MQTT, если клиент подключён.
Definition mqtt_app.c:143
Публичный интерфейс MQTT-клиента.