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 { // Слейв: перезапускаем прием