From b530a60de215c12f74aa0255052999735a427e5e Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Tue, 4 Nov 2025 23:12:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B8=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modbus/Inc/modbus_coils.h | 6 +- Modbus/Inc/modbus_config.h | 10 +-- Modbus/Inc/modbus_devid.h | 12 ++-- Modbus/Inc/modbus_diag.h | 4 +- Modbus/Inc/modbus_master.h | 6 +- Modbus/Src/modbus_coils.c | 4 +- Modbus/Src/modbus_data.c | 1 - Modbus/Src/modbus_devid.c | 12 ++-- Modbus/Src/modbus_diag.c | 4 +- Modbus/Src/modbus_master.c | 4 +- README.md | 115 +++++++++++++++++++++++++----- STM32F103_Example/Core/Src/main.c | 2 +- 12 files changed, 128 insertions(+), 52 deletions(-) diff --git a/Modbus/Inc/modbus_coils.h b/Modbus/Inc/modbus_coils.h index 95f4a14..1d5f36d 100644 --- a/Modbus/Inc/modbus_coils.h +++ b/Modbus/Inc/modbus_coils.h @@ -98,7 +98,7 @@ typedef enum * @code * // Пример: Запросили 10 coils с адреса 20, хотим узнать состояние coil 25 * int coil_state; - * if(MB_GetCoilState(&MODBUS_MSG, 25, &coil_state)) + * if(MB_RespGet_CoilState(&MODBUS_MSG, 25, &coil_state)) * { * printf("Coil 25 state: %s\n", coil_state ? "ON" : "OFF"); * } @@ -107,7 +107,7 @@ typedef enum * for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++) * { * int state; - * if(MB_GetCoilState(&MODBUS_MSG, addr, &state)) + * if(MB_RespGet_CoilState(&MODBUS_MSG, addr, &state)) * { * printf("Coil %d: %s\n", addr, state ? "ON" : "OFF"); * } @@ -115,7 +115,7 @@ typedef enum * @endcode */ -int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state); +int MB_RespGet_CoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state); /** MODBUS_REQ_COILS_API * @} diff --git a/Modbus/Inc/modbus_config.h b/Modbus/Inc/modbus_config.h index ac93b0b..ab7ce68 100644 --- a/Modbus/Inc/modbus_config.h +++ b/Modbus/Inc/modbus_config.h @@ -19,8 +19,8 @@ #include "stm32f1xx_hal.h" // Общие параметры -#define MODBUS_DEVICE_ID 1 ///< девайс текущего устройства -#define MODBUS_TIMEOUT 5000 ///< максимальнйы тайтаут MB в тиках таймера +#define MODBUS_DEVICE_ID 1 // Адрес устройства в сети Modbus +#define MODBUS_TIMEOUT 5000 // Таймаут в тиках таймера // Строковые идентификаторы устройства #define MODBUS_VENDOR_NAME "NIO-12" @@ -34,14 +34,14 @@ // Периферия (опционально) #define mb_huart huart1 ///< Удобный дефайн для модбасовского uart -#define mb_htim htim2 ///< Удобный дефайн для модбасовского таймера +#define mb_htim htim3 ///< Удобный дефайн для модбасовского таймера //#define RS_EnableReceive() ///< Функция изменения направления передачи на ПРИЕМ для RS-485 //#define RS_EnableTransmit() ///< Функция изменения направления передачи на ПЕРЕДАЧУ для RS-485 // Модули modbus -#define MODBUS_ENABLE_SLAVE ///< Включить обработку МАСТЕР режима -#define MODBUS_ENABLE_MASTER ///< Включить обработку СЛЕЙВ режима +#define MODBUS_ENABLE_SLAVE ///< Включить обработку СЛЕЙВ режима +//#define MODBUS_ENABLE_MASTER ///< Включить обработку МАСТЕР режима #define MODBUS_ENABLE_COILS ///< Включить обработку коилов #define MODBUS_ENABLE_HOLDINGS ///< Включить обработку регистров хранения diff --git a/Modbus/Inc/modbus_devid.h b/Modbus/Inc/modbus_devid.h index b1c8b2b..b14986b 100644 --- a/Modbus/Inc/modbus_devid.h +++ b/Modbus/Inc/modbus_devid.h @@ -87,7 +87,7 @@ void MB_DeviceInentificationInit(void); * // Пример 1: Получить VendorName (ID = 0x00) * uint8_t length; * char vendor_name[64]; - * if(MB_FindObjectById(&MODBUS_MSG, 0x00, vendor_name, &length)) + * if(MB_RespGet_ObjectById(&MODBUS_MSG, 0x00, vendor_name, &length)) * { * // получено * } @@ -96,12 +96,12 @@ void MB_DeviceInentificationInit(void); * uint8_t obj_id, obj_length; * char obj_data[256]; * - * int obj_count = MB_GetNumberOfObjects(&MODBUS_MSG); + * int obj_count = MB_RespGet_NumberOfObjects(&MODBUS_MSG); * printf("Total objects: %d\n", obj_count); * * for(int i = 0; i < obj_count; i++) * { - * if(MB_GetObjectByIndex(&MODBUS_MSG, i, &obj_id, obj_data, &obj_length)) + * if(MB_RespGet_ObjectByIndex(&MODBUS_MSG, i, &obj_id, obj_data, &obj_length)) * { * // получено * } @@ -110,11 +110,11 @@ void MB_DeviceInentificationInit(void); */ /* Получить количество объектов в сообщении */ -int MB_GetNumberOfObjects(RS_MsgTypeDef *modbus_msg); +int MB_RespGet_NumberOfObjects(RS_MsgTypeDef *modbus_msg); /* Найти объект по ID в сообщении */ -int MB_FindObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length); +int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length); /* Получить объект по индексу в сообщении */ -int MB_GetObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length); +int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length); /** MODBUS_REQ_DEFID_API diff --git a/Modbus/Inc/modbus_diag.h b/Modbus/Inc/modbus_diag.h index b338c67..b6d86c6 100644 --- a/Modbus/Inc/modbus_diag.h +++ b/Modbus/Inc/modbus_diag.h @@ -66,13 +66,13 @@ void MB_DiagnosticsInit(void); * @code * Получить данные диагностики (значение счетчика) * uint16_t counter_value; - * if(MB_GetDiagnosticResponse(&MODBUS_MSG, &counter_value)) + * if(MB_RespGet_Diagnostic(&MODBUS_MSG, &counter_value)) * { * printf("Counter value: %d\n", counter_value); * } * @endcode */ -int MB_GetDiagnosticResponse(RS_MsgTypeDef *modbus_msg, uint16_t *data); +int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data); /** MODBUS_REQ_DIAG_API * @} */ diff --git a/Modbus/Inc/modbus_master.h b/Modbus/Inc/modbus_master.h index 70505ac..b8f98e2 100644 --- a/Modbus/Inc/modbus_master.h +++ b/Modbus/Inc/modbus_master.h @@ -83,7 +83,7 @@ RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t obj * @code * // Пример: Запросили 10 регистров с адреса 100, хотим получить значение регистра 105 * uint16_t reg_value; - * if(MB_GetRegisterValue(&MODBUS_MSG, 105, ®_value)) + * if(MB_RespGet_RegisterValue(&MODBUS_MSG, 105, ®_value)) * { * printf("Register 105 value: %d\n", reg_value); * } @@ -92,7 +92,7 @@ RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t obj * for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++) * { * uint16_t value; - * if(MB_GetRegisterValue(&MODBUS_MSG, addr, &value)) + * if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value)) * { * printf("Register %d: %d\n", addr, value); * } @@ -100,7 +100,7 @@ RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t obj * @endcode */ -int MB_GetRegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value); +int MB_RespGet_RegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value); /** MODBUS_REQ_REGS_API diff --git a/Modbus/Src/modbus_coils.c b/Modbus/Src/modbus_coils.c index f47d872..1a6d195 100644 --- a/Modbus/Src/modbus_coils.c +++ b/Modbus/Src/modbus_coils.c @@ -94,7 +94,7 @@ uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception) * @param coil_state Указатель для состояния coil (1 - ON, 0 - OFF) * @return 1 - успех, 0 - ошибка или coil_addr вне диапазона запроса */ -int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state) +int MB_RespGet_CoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state) { if(modbus_msg == NULL || coil_state == NULL) return 0; @@ -284,7 +284,7 @@ uint8_t MB_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg) #else //MODBUS_ENABLE_COILS -int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state) {return 0;} +int MB_RespGet_CoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state) {return 0;} MB_ExceptionTypeDef MB_Write_Coil_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteVal) {return ILLEGAL_FUNCTION;} uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception) {return 0;} uint8_t MB_Process_Read_Coils(RS_MsgTypeDef *modbus_msg) {return 0;} diff --git a/Modbus/Src/modbus_data.c b/Modbus/Src/modbus_data.c index 5537991..7f1b00b 100644 --- a/Modbus/Src/modbus_data.c +++ b/Modbus/Src/modbus_data.c @@ -23,7 +23,6 @@ #include "modbus_devid.h" - /** * @brief Check is address valid for certain array. * @param Addr Начальный адресс. diff --git a/Modbus/Src/modbus_devid.c b/Modbus/Src/modbus_devid.c index 608d05a..4a84891 100644 --- a/Modbus/Src/modbus_devid.c +++ b/Modbus/Src/modbus_devid.c @@ -26,7 +26,7 @@ MB_DeviceIdentificationsTypeDef MB_DEVID; ///< Глобальная струк * @param modbus_msg Указатель на структуру сообщения * @return int Количество объектов */ -int MB_GetNumberOfObjects(RS_MsgTypeDef *modbus_msg) +int MB_RespGet_NumberOfObjects(RS_MsgTypeDef *modbus_msg) { if(modbus_msg == NULL) { @@ -49,7 +49,7 @@ int MB_GetNumberOfObjects(RS_MsgTypeDef *modbus_msg) * @param obj_length Указатель для длины объекта * @return int Найден ли объект (1 - да, 0 - нет) */ -int MB_FindObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length) +int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length) { if((modbus_msg == NULL) || (obj_data == NULL)) return 0; @@ -100,7 +100,7 @@ int MB_FindObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, * @param obj_length Указатель для длины объекта * @return int Успешность получения (1 - получен, 0 - не найден) */ -int MB_GetObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length) +int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length) { if((modbus_msg == NULL) || (obj_data == NULL)) return 0; @@ -674,9 +674,9 @@ void MB_DeviceInentificationInit(void) #else //MODBUS_ENABLE_DEVICE_IDENTIFICATIONS /* Получить количество объектов в сообщении */ -int MB_GetNumberOfObjects(RS_MsgTypeDef *modbus_msg) {return 0;} -int MB_FindObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length) {return 0;} -int MB_GetObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length) {return 0;} +int MB_RespGet_NumberOfObjects(RS_MsgTypeDef *modbus_msg) {return 0;} +int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length) {return 0;} +int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length) {return 0;} void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj) {} void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj) {} uint8_t MB_Process_Read_Device_Identifications(RS_MsgTypeDef *modbus_msg) {return 0;} diff --git a/Modbus/Src/modbus_diag.c b/Modbus/Src/modbus_diag.c index cb7f9a3..0d18122 100644 --- a/Modbus/Src/modbus_diag.c +++ b/Modbus/Src/modbus_diag.c @@ -42,7 +42,7 @@ void MB_DiagnosticsInit(void) * @param data Указатель куда положить данные * @return 1 - успех, 0 - ошибка */ -int MB_GetDiagnosticResponse(RS_MsgTypeDef *modbus_msg, uint16_t *data) +int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data) { if(modbus_msg == NULL || data == NULL) return 0; @@ -319,7 +319,7 @@ MB_DeviceModeTypeDef MB_GetDeviceMode(void) #else //MODBUS_ENABLE_DIAGNOSTICS void MB_DiagnosticsInit(void) {} -int MB_GetDiagnosticResponse(RS_MsgTypeDef *modbus_msg, uint16_t *data) {return 0;} +int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data) {return 0;} int MB_Diagnostics_WriteBit(int bit_num, int bit_state) {return 0;} int MB_Diagnostics_GetBit(int bit_num) {return 0;} uint8_t MB_Process_Diagnostics(RS_MsgTypeDef *modbus_msg) {return 0;} diff --git a/Modbus/Src/modbus_master.c b/Modbus/Src/modbus_master.c index a391426..f0af8ba 100644 --- a/Modbus/Src/modbus_master.c +++ b/Modbus/Src/modbus_master.c @@ -23,7 +23,7 @@ * @param reg_value Указатель для значения регистра * @return 1 - успех, 0 - ошибка или reg_addr вне диапазона запроса */ -int MB_GetRegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value) +int MB_RespGet_RegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value) { if(modbus_msg == NULL || reg_value == NULL) return 0; @@ -486,7 +486,7 @@ RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t obj #else RS_MsgTypeDef msg_dummy = {0}; -int MB_GetRegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value) {return 0;} +int MB_RespGet_RegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value) {return 0;} RS_MsgTypeDef MB_REQUEST_READ_COILS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity) {return msg_dummy;} RS_MsgTypeDef MB_REQUEST_READ_DISCRETE_INPUTS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity) {return msg_dummy;} diff --git a/README.md b/README.md index d0d0501..64ef473 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Библиотека реализует Modbus RTU Slave для STM32 с использованием HAL. Работает в прерываниях с детектированием конца фрейма по IDLE линии и таймаутами через прерывание таймера. ## Быстрый старт -_Note: Здесь описано подключение просто архива c исходниками. Если надо подключить библиотеку как субмодуль: см. ветку release в этом репозитории._ +_Note: Здесь описано подключение просто архива c исходниками. Если надо подключить библиотеку как субмодуль: см. ветку **release** в этом репозитории._ ### 1. Настройка периферии @@ -55,37 +55,77 @@ void TIMx_IRQHandler(void) // Периферия #define mb_huart huart1 // Удобный дефайн для модбасовского UART #define mb_htim htim3 // Удобный дефайн для модбасовского таймера + +// Модули modbus +#define MODBUS_ENABLE_SLAVE ///< Включить обработку МАСТЕР режима +//#define MODBUS_ENABLE_MASTER ///< Включить обработку СЛЕЙВ режима + +#define MODBUS_ENABLE_COILS ///< Включить обработку коилов +#define MODBUS_ENABLE_HOLDINGS ///< Включить обработку регистров хранения +#define MODBUS_ENABLE_INPUTS ///< Включить обработку входных регистров +#define MODBUS_ENABLE_DEVICE_IDENTIFICATIONS ///< Включить обработку идентификаторы устройства +#define MODBUS_ENABLE_DIAGNOSTICS ///< Включить обработку диагностики модбас + ``` ### 4. Инициализация в коде -В `main()` после инициализации HAL: +Чтобы настроить Slave-режим `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) - { - // Основной цикл - } + // Инициализация HAL + HAL_Init(); + SystemClock_Config(); + MX_GPIO_Init(); + MX_USART1_UART_Init(); + MX_TIM3_Init(); + + // Инициализация Modbus + MODBUS_FirstInit(&hmodbus1, &mb_huart, &mb_htim); + MODBUS_Config(&hmodbus1, 1, 1000, MODBUS_MODE_SLAVE); + + // Запуск приема Modbus + MODBUS_SlaveStart(&hmodbus1, NULL); + + while (1) + { + // Основной цикл + } } ``` +Чтобы настроить Master-режим `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_FirstInit(&hmodbus1, &mb_huart, &mb_htim); + MODBUS_Config(&hmodbus1, 0, 1000, MODBUS_MODE_MASTER); + + // Запуск приема Modbus + // Запрос на 1 ID, считать холдинг регистры с 0 адреса 10 штук + RS_MsgTypeDef msg = MB_MASTER_READ_HOLDING_REGS(1, 0, 10); + MODBUS_MasterRequest(&hmodbus1, &msg, &callback_func); + void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg) + { + // MB_RespGet_... Чтобы достать нужные данные из ответа + } +} +``` ### 5. Настройка карты данных В `modbus_data.h` настройте регистры и coils под ваше устройство: @@ -134,6 +174,7 @@ typedef struct ### 6. Доступ к данным в коде +В режиме слейва есть дефайны для удобного выставления Коилов. На случай если они не упакованы в битовые поля ```c // Чтение входных регистров uint16_t temp = MB_DATA.InRegs.Temperature; @@ -151,6 +192,41 @@ if (MB_Read_Coil_Local(&MB_DATA.Coils, 2)) { } ``` +В режиме мастера есть функции для получения информации из ответа `MB_RespGet_...()` +```c +// Чтение регистров: Получить запрошенные регистры + uint16_t value; + if(MB_RespGet_RegisterValue(&MODBUS_MSG, 105, ®_value)) + { + printf("Register 105 value: %d\n", reg_value); + } +// Чтение коилов: Получить запрошенные коилы + int state; + if(MB_RespGet_CoilState(&MODBUS_MSG, 25, &coil_state)) + { + printf("Coil 25 state: %s\n", coil_state ? "ON" : "OFF"); + } +// Чтение диагностики: Получить запрошенныую диагностику + uint16_t counter_value; + if(MB_RespGet_DiagnosticResponse(&MODBUS_MSG, &counter_value)) + { + printf("Counter value: %d\n", counter_value); + } +// Чтение идентификаторов: Получить запрошенные идентификаторы + uint8_t length; + char vendor_name[64]; + if(MB_RespGet_ObjectById(&MODBUS_MSG, 0x00, vendor_name, &length)) + { + printf("Vendor Name: %s (length: %d)\n", vendor_name, length); + } + + uint8_t obj_id, obj_length; + char obj_data[64]; + if(MB_RespGet_ObjectByIndex(&MODBUS_MSG, 0x00, &obj_id, obj_data, &obj_length)) + { + printf("First object - ID: 0x%02X, Data: %s\n", obj_id, obj_data); + } +``` ## Поддерживаемые функции Modbus | Функция | Код | Описание | @@ -160,6 +236,7 @@ if (MB_Read_Coil_Local(&MB_DATA.Coils, 2)) { | Read Holding Registers | 0x03 | Чтение регистров хранения | | Write Single Coil | 0x05 | Запись одиночного coil | | Write Single Register | 0x06 | Запись одиночного регистра | +| Diagnostics (Serial Line only) | 0x08 | Чтение диагностически и управление режимом работы | | Write Multiple Coils | 0x0F | Запись множественных coils | | Write Multiple Registers | 0x10 | Запись множественных регистров | | Read Device Identification | 0x2B | Чтение идентификации устройства | diff --git a/STM32F103_Example/Core/Src/main.c b/STM32F103_Example/Core/Src/main.c index e0460f5..ba2e6ab 100644 --- a/STM32F103_Example/Core/Src/main.c +++ b/STM32F103_Example/Core/Src/main.c @@ -61,7 +61,7 @@ int coil_state = 0; int coil_real_state = 0; void master_callback(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *msg) { - if(MB_GetCoilState(msg, coil_to_toggle, &coil_real_state)) + if(MB_RespGet_CoilState(msg, coil_to_toggle, &coil_real_state)) { coil_state = coil_real_state; }