diff --git a/README.md b/README.md new file mode 100644 index 0000000..9d1da06 --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +# 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. Настройка регистров и коилов + + В этом проекте структура данных Modbus организована в три основных типа элементов: входные регистры (`Input Registers` - только чтение), регистры хранения (`Holding Registers` - чтение и запись) и коилы (`Coils` - отдельные биты, чтение и запись). Каждый тип данных структурирован как отдельный набор с определенными адресами и размерностями. + + Все три типа данных объединены в общую структуру устройства `MB_DataStructureTypeDef`, которая содержит: + + - Входные регистры (`InRegs`) + - Коилы (`Coils`) + - Регистры хранения (`HoldRegs`) + + Пример настройки `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); + ```