Modbus/README.md

2.7 KiB
Raw Permalink Blame History

Modbus: подключение и использование

Это вариант голого (bare) modbus, где вся инициализация скинута на CubeMX

Настройка

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

    #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:

    // 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 добавьте:

    #include "rs_message.h"
    
    MODBUS_FirstInit();
    
  4. Настройка регистров и коилов

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

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

    Пример настройки Input Registers:

    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 вызовите:

    RS_Receive_IT(&hmodbus1, &MODBUS_MSG);