2.7 KiB
2.7 KiB
Modbus: подключение и использование
Это вариант голого (bare) modbus, где вся инициализация скинута на CubeMX
Настройка
-
Подключите обработчики прерываний 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); }
-
Настройте
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
-
Для инициализации Modbus добавьте:
#include "rs_message.h" MODBUS_FirstInit();
-
Настройка регистров и коилов
Все данные объединены в общую структуру устройства
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
(в коилах только желательно использовать битовые поля) - Входные регистры (
-
Для запуска Modbus вызовите:
RS_Receive_IT(&hmodbus1, &MODBUS_MSG);