# 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 | Чтение идентификации устройства |