From 52143ce07ce84baee2b1c414ac44816883c73397 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Wed, 5 Nov 2025 16:36:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B0=D1=81=D1=82=D0=B5=D1=80:=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BB=D0=BB=D0=B1=D0=B5=D0=BA=20=D0=B2=D1=8B=D0=B7=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B0=D1=83=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В коллбеке можно понять статус реквеста по hmodbus->RS_STATUS --- Inc/modbus.h | 21 ++++++++++++++++----- Inc/rs_message.h | 9 +++++++-- README.md | 11 +++++++---- Src/rs_message.c | 24 +++++++++++++++++------- 4 files changed, 47 insertions(+), 18 deletions(-) diff --git a/Inc/modbus.h b/Inc/modbus.h index fa3e458..38b7538 100644 --- a/Inc/modbus.h +++ b/Inc/modbus.h @@ -36,15 +36,26 @@ #include "modbus.h" MODBUS_FirstInit(&hmodbus1, &huart1, &htim3); - MODBUS_Config(&hmodbus1, 0, 1000, MODBUS_MODE_MASTER); // - если нужны другие настройки, не из modbus_config.h + MODBUS_Config(&hmodbus1, 0, 1000, MODBUS_MODE_MASTER); // Запрос на 1 ID, считать холдинг регистры с 0 адреса 10 штук RS_MsgTypeDef msg = MB_REQUEST_READ_HOLDING_REGS(1, 0, 10); MODBUS_MasterRequest(&hmodbus1, &msg, &callback_func); - void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg) - { - // modbus_msg содержит ответ от устройства - } + void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg) + { + // MB_RespGet_... Чтобы достать нужные данные из ответа + if(hmodbus->RS_STATUS == RS_OK) + { + for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++) + { + uint16_t value; + if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value)) + { + read_hold[i] = value; + } + } + } + } @endverbatim diff --git a/Inc/rs_message.h b/Inc/rs_message.h index 6fcdc71..ee8dd34 100644 --- a/Inc/rs_message.h +++ b/Inc/rs_message.h @@ -115,6 +115,10 @@ static int dummy; #ifndef RS_USER_VARS_NUMB #define RS_USER_VARS_NUMB 0 #endif + +#ifndef local_time +#define local_time() uwTick +#endif /** @endcond */ @@ -141,9 +145,10 @@ typedef enum // RS_StatusTypeDef /*0x03*/ RS_ABORTED, /*0x04*/ RS_BUSY, /*0x05*/ RS_SKIP, + /*0x06*/ RS_TIMEOUT, - /*0x06*/ RS_COLLECT_MSG_ERR, - /*0x07*/ RS_PARSE_MSG_ERR, + /*0x07*/ RS_COLLECT_MSG_ERR, + /*0x08*/ RS_PARSE_MSG_ERR, // reserved values // /*0x00*/ RS_UNKNOWN_ERR = 0x00, ///< reserved for case, if no one error founded (nothing changed response from zero) diff --git a/README.md b/README.md index 97ab023..7a4e12b 100644 --- a/README.md +++ b/README.md @@ -123,12 +123,15 @@ ProjectRoot/ void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg) { // MB_RespGet_... Чтобы достать нужные данные из ответа - for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++) + if(hmodbus->RS_STATUS == RS_OK) { - uint16_t value; - if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value)) + for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++) { - read_hold[i] = value; + uint16_t value; + if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value)) + { + read_hold[i] = value; + } } } } diff --git a/Src/rs_message.c b/Src/rs_message.c index 6572259..a298b97 100644 --- a/Src/rs_message.c +++ b/Src/rs_message.c @@ -348,16 +348,18 @@ void RS_UART_Handler(RS_HandleTypeDef *hRS) RS_Set_RX_End(hRS); // Парсим наше сообщение - RS_StatusTypeDef parse_res = RS_Parse_Message(hRS, hRS->pMessagePtr, hRS->pBufferPtr); + hRS->RS_STATUS = RS_Parse_Message(hRS, hRS->pMessagePtr, hRS->pBufferPtr); // Если сообещине принято корректно - if(parse_res == RS_OK) + if(hRS->RS_STATUS == RS_OK) { RS_Timeout_Stop(hRS); - hRS->lastPacketTick = uwTick; + hRS->lastPacketTick = local_time(); if(hRS->sRS_Mode < RS_MASTER_MODE_START) + { RS_Response(hRS, hRS->pMessagePtr); // отвечаем на запрос + } else { if(hRS->pCallback) @@ -435,12 +437,20 @@ void RS_TIM_Handler(RS_HandleTypeDef *hRS) HAL_TIM_IRQHandler(hRS->htim); RS_Abort(hRS, ABORT_RS); + - if(hRS->pMessagePtr->MbAddr == hRS->ID) // ошибка если таймаут по нашему сообщению - TrackerCnt_Err(hRS->rs_err); + hRS->RS_STATUS = RS_TIMEOUT; + + if(hRS->sRS_Mode < RS_MASTER_MODE_START) + if(hRS->pMessagePtr->MbAddr == hRS->ID) // ошибка если таймаут по нашему сообщению + TrackerCnt_Err(hRS->rs_err); - if(hRS->sRS_Mode == RS_MASTER_REQUEST) { - // Мастер: таймаут ответа -> освобождаем для нового запроса + if(hRS->sRS_Mode >= RS_MASTER_MODE_START) + { // Мастер: коллбек и освобождение для нового запроса + if(hRS->pCallback) + { + hRS->pCallback(hRS, hRS->pMessagePtr); // обрабатываем ответ + } RS_Set_Free(hRS); } else { // Слейв: перезапускаем прием