# Modbus: подключение и использование
Это вариант голого (bare) modbus, где вся инициализация скинута на CubeMX

## Настройка

1. Подключите обработчики прерываний **UART** и **TIM** в свои IRQ обработчики после HAL-обработчиков:

    ```c
    #include "rs_message.h"

    void USARTx_IRQHandler(void)
    {
        HAL_UART_IRQHandler(&huart);
        RS_UART_Handler(&modbus1);
    }

    void TIMx_IRQHandler(void)
    {
        HAL_TIM_IRQHandler(&htim);
        RS_TIM_Handler(&modbus1);
    }
    ```

2. Настройте `modbus_config.h`:

    ```c
    // MODBUS PARAMS
    #define MODBUS_DEVICE_ID 			    1		///< девайс текущего устройства
    #define MODBUS_TIMEOUT 				    5000 	///< максимальнйы тайтаут MB в тиках таймера
    
    // PERIPH FUNCTIONS AND HANDLERS
    #define RS_UART_Init                    MX_USART1_UART_Init
    #define RS_UART_DeInit                  HAL_UART_MspDeInit
    #define RS_TIM_Init                     MX_TIM3_Init
    #define RS_TIM_DeInit                   HAL_TIM_Base_MspDeInit
    #define rs_huart                        huart1
    #define rs_htim                         htim3
    ```
3. Для инициализации Modbus добавьте:

    ```c
    #include "rs_message.h"

    MODBUS_FirstInit();
    ```

4. Настройка регистров и коилов

    Все данные объединены в общую структуру устройства `MB_DataStructureTypeDef`, которая содержит:

    - Входные регистры (`InRegs`) - 16-битные регистры только для чтения
    - Коилы (`Coils`) - 1-битовые коилы для чтения/записи
    - Регистры хранения (`HoldRegs`) - 16-битные регистры для чтения/записи
    
    Пример настройки `Input Registers`:

    ```c
    typedef struct //MB_DataInRegsTypeDef
    {
        uint16_t ForwardVoltage;
        uint16_t ReversePeakVoltage;
    }MB_DataInRegsTypeDef;

    // DEFINES FOR INPUT REGISTERS ARRAYS
    #define   R_INPUT_ADDR                 0 // начальный адресс инпут регистров
    #define   R_INPUT_QNT                  2 // количество инпут регистров
    ```
    Аналогично с `Hodling Registers` и `Coils` (в коилах только желательно использовать битовые поля)

5. Для запуска Modbus вызовите:
    ```c
    RS_Receive_IT(&hmodbus1, &MODBUS_MSG);
    ```
