# Инструкция по подключению релиза библиотеки `STM Modbus` Данная библиотека подключается напрямую из Git, как субмодуль. Позволяя при желании обновлять её напрямую через pull. ## Структура библиотеки *Note: Файлы начинающиеся с `__` и которых нет в этом дереве являются **внутренними/непротестированными/недокументированными*** ``` Modbus/ │ inc/ │ ├── modbus.h # Главный заголовочный файл │ ├── modbus_core.h # Базовые определения и структуры │ ├── modbus_coils.h # Работа с дискретными выходами │ ├── modbus_holdregs.h # Работа с регистрами хранения │ ├── modbus_inputregs.h # Работа с входными регистрами │ ├── modbus_devid.h # Идентификация устройства │ ├── rs_message.h # Драйвер обмена по RS/UART ├── src/ │ ├── modbus.c # Основная логика Modbus Slave │ ├── modbus_coils.c # Реализация работы с coils │ ├── modbus_holdregs.c # Реализация регистров хранения │ ├── modbus_inputregs.c # Реализация входных регистров │ ├── modbus_devid.c # Реализация идентификации устройства │ ├── modbus_data.c # Функции доступа к данным │ └── rs_message.c # Реализация драйвера RS ├── __modbus_config.h # Конфигурация Modbus (надо заменить) ├── __modbus_data.h # Структуры данных (надо заменить) └── __modbus_data.c # Функции доступа (надо заменить) ``` ## Инструкция по подключению 1. **Склонируйте субмодуль** в ваш проект: ```bash git submodule add https://git.arktika.cyou/Razvalyaev/STM32_ExtendedLibs path/to/ExtendedLibs git submodule update --init --recursive ``` 2. **Скопируйте файлы конфигурации и главный include** в отдельную папку в вашем проекте (вне субмодуля) и удалите `__`: ``` ProjectRoot/ ├── Configs/ │ ├── modbus_config.h # ← скопировать из __modbus_config.h │ ├── modbus_data.h # ← скопировать из __modbus_data.h │ └── modbus_data.c # ← скопировать из __modbus_data.c (опционально) └── Modbus/ # Субмодуль ``` 3. **Настройте конфигурацию** под ваш проект: 3.1. Настройка периферии - **UART**: Настройте в режиме Asynchronous, нужная скорость (9600, 19200, etc), 8N1 - **TIM**: Настройте таймер для генерации прерываний (например, 1ms tick) - **Включите прерывания** для UART и TIM 3.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.3. В `modbus_config.h` укажите параметры устройства 3.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) { // Основной цикл } } ``` 3.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 ``` 3.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 включен } ``` 5. **Обновление библиотеки**: После обновления субмодуля из Git, исходные файлы библиотеки будут обновлены, но ваши конфиги останутся в целевой папке и не перезапишутся: ```bash git submodule update --remote ```