Files
STM32_Modbus/README.md
Razvalyaev 7e21fc7f28 API ПОМЕНЯЛОС - Реструктуризация модбас
- Переработана архитектура:
  * modbus_core.h - базовые определения и структуры
  * modbus_coils.[h/c] - работа с коилами
  * modbus_holdregs.[h/c] - работа с регистрами хранения (R/W)
  * modbus_inputregs.[h/c] -работа с входными регистрами (R/O)
  * modbus_devid.[h/c] - идентификаторы устройства
  * modbus_data.[h/c] - карта регистров и коилов и валидация адресов

- Улучшена документация:
  * Обновлены Doxygen-комментарии к функциям
  * Обновлены шапки файлов с подробным описанием
  * Обновлена инструкция по подключению и использованию
2025-11-03 19:32:53 +03:00

166 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# STM Modbus: подключение и использование
Библиотека реализует Modbus RTU Slave для STM32 с использованием HAL. Работает в прерываниях с детектированием конца фрейма по IDLE линии и таймаутами через прерывание таймера.
## Быстрый старт
_Note: Здесь описано подключение просто архива c исходниками. Если надо подключить библиотеку как субмодуль: см. ветку release в этом репозитории._
### 1. Настройка периферии
- **UART**: Настройте в режиме Asynchronous, нужная скорость (9600, 19200, etc), 8N1
- **TIM**: Настройте таймер для генерации прерываний (например, 1ms tick)
- **Включите прерывания** для UART и TIM
### 2. Подключение обработчиков прерываний
Подключите обработчики прерываний **UART** и **TIM** в свои IRQ обработчики ***вместо*** HAL-обработчиков:
```c
#include "modbus.h"
void USARTx_IRQHandler(void)
{
RS_UART_Handler(&modbus1);
return;
HAL_UART_IRQHandler(&huart);
}
void TIMx_IRQHandler(void)
{
RS_TIM_Handler(&modbus1);
return;
HAL_TIM_IRQHandler(&htim);
}
```
### 3. Настройка конфигурации
В `modbus_config.h` укажите параметры устройства:
```c
// MODBUS PARAMS
#define MODBUS_DEVICE_ID 1 // Адрес устройства в сети Modbus
#define MODBUS_TIMEOUT 100 // Таймаут в тиках таймера (рекомендуется 100-200ms)
// Строковые идентификаторы устройства
#define MODBUS_VENDOR_NAME "NIO-12"
#define MODBUS_PRODUCT_CODE ""
#define MODBUS_REVISION "Ver. 1.0"
#define MODBUS_VENDOR_URL ""
#define MODBUS_PRODUCT_NAME ""
#define MODBUS_MODEL_NAME "STM32F103"
#define MODBUS_USER_APPLICATION_NAME ""
#define MODBUS_NUMB_OF_USEROBJECTS 0
// Периферия
#define mb_huart huart1 // Удобный дефайн для модбасовского UART
#define mb_htim htim3 // Удобный дефайн для модбасовского таймера
```
### 4. Инициализация в коде
В `main()` после инициализации HAL:
```c
#include "modbus.h"
int main(void)
{
// Инициализация HAL
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM3_Init();
// Инициализация Modbus
MODBUS_SetupHardware(&hmodbus1, &mb_huart, &mb_htim);
// Запуск приема Modbus
MODBUS_SlaveStart(&hmodbus1, &MODBUS_MSG);
while (1)
{
// Основной цикл
}
}
```
### 5. Настройка карты данных
В `modbus_data.h` настройте регистры и coils под ваше устройство:
#### Input Registers (только чтение)
```c
typedef struct
{
uint16_t Temperature; // Адрес 0
uint16_t Humidity; // Адрес 1
uint16_t Pressure; // Адрес 2
uint16_t Voltage; // Адрес 3
} MB_DataInRegsTypeDef;
#define R_INPUT_ADDR 0 // Начальный адрес Input регистров
#define R_INPUT_QNT 4 // Количество Input регистров
```
#### Holding Registers (чтение/запись)
```c
typedef struct
{
uint16_t SetpointTemp; // Адрес 0
uint16_t SetpointHumidity; // Адрес 1
uint16_t ControlMode; // Адрес 2
} MB_DataHoldRegsTypeDef;
#define R_HOLDING_ADDR 0 // Начальный адрес Holding регистров
#define R_HOLDING_QNT 3 // Количество Holding регистров
```
#### Coils (1-битные)
```c
typedef struct
{
unsigned Relay1 : 1; // Адрес 0
unsigned Relay2 : 1; // Адрес 1
unsigned Pump : 1; // Адрес 2
unsigned Heater : 1; // Адрес 3
unsigned reserved : 12; // Резерв (выравнивание до 16 бит)
} MB_DataCoilsTypeDef;
#define C_COILS_ADDR 0 // Начальный адрес Coils
#define C_COILS_QNT 4 // Количество Coils
```
### 6. Доступ к данным в коде
```c
// Чтение входных регистров
uint16_t temp = MB_DATA.InRegs.Temperature;
// Запись в регистры хранения
MB_DATA.HoldRegs.SetpointTemp = 2500;
// Управление coils
MB_Set_Coil_Local(&MB_DATA.Coils, 0); // Включить Relay1
MB_Reset_Coil_Local(&MB_DATA.Coils, 1); // Выключить Relay2
// Чтение coil
if (MB_Read_Coil_Local(&MB_DATA.Coils, 2)) {
// Pump включен
}
```
## Поддерживаемые функции Modbus
| Функция | Код | Описание |
|---------|-----|-----------|
| Read Coils | 0x01 | Чтение дискретных выходов |
| Read Input Registers | 0x04 | Чтение входных регистров |
| Read Holding Registers | 0x03 | Чтение регистров хранения |
| Write Single Coil | 0x05 | Запись одиночного coil |
| Write Single Register | 0x06 | Запись одиночного регистра |
| Write Multiple Coils | 0x0F | Запись множественных coils |
| Write Multiple Registers | 0x10 | Запись множественных регистров |
| Read Device Identification | 0x2B | Чтение идентификации устройства |