Бета добавление новых кодов исключения
Улучшение механики ответа с задержкой, когда время ответа определяется пользователем, а не в прерывании сразу
This commit is contained in:
@@ -7,6 +7,8 @@
|
||||
Файл содержит реализацию функций для работы Modbus в режиме слейва.
|
||||
|
||||
@section slave Функции и макросы
|
||||
- MB_Slave_ResponseLater() — Выставить флаг на ответ вне прерывания
|
||||
- MB_Slave_SendResponse() — Ответить на запрос
|
||||
|
||||
- MB_Slave_Response() — Ответ на запрос
|
||||
- MB_Slave_Collect_Message() — Сбор сообщения в режиме слейва.
|
||||
@@ -15,6 +17,66 @@
|
||||
#include "modbus.h"
|
||||
|
||||
#ifdef MODBUS_ENABLE_SLAVE
|
||||
|
||||
/**
|
||||
* @brief Ответить позже, не в прерывании.
|
||||
* @param hmodbus Указатель на хендлер RS.
|
||||
* @param ResponseCode Код запроса на который надо ответить.
|
||||
* @return HAL Status.
|
||||
* @details Отменяет ответ в прерывании на запрос.
|
||||
Используется вместе с @ref MB_Slave_SendResponse
|
||||
*/
|
||||
HAL_StatusTypeDef MB_Slave_ResponseLater(RS_HandleTypeDef *hmodbus, uint8_t ResponseCode)
|
||||
{
|
||||
hmodbus->f.DeferredResponse = ResponseCode;
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Ответить на запрос.
|
||||
* @param hmodbus Указатель на хендлер RS.
|
||||
* @param ResponseCode Код запроса на который надо ответить.
|
||||
* @param error Тип ошибки или её отсутствия в ответе.
|
||||
* @return HAL Status.
|
||||
* @details Ответить на запрос вне прерывания.
|
||||
Используется вместе с @ref MB_Slave_ResponseLater
|
||||
*/
|
||||
HAL_StatusTypeDef MB_Slave_SendResponse(RS_HandleTypeDef *hmodbus, uint8_t ResponseCode, MB_ExceptionTypeDef error)
|
||||
{
|
||||
RS_StatusTypeDef MB_RES = 0;
|
||||
if(hmodbus->f.DeferredResponse == ResponseCode)
|
||||
{
|
||||
hmodbus->f.DeferredResponse = 0;
|
||||
switch(error)
|
||||
{
|
||||
case ET_NO_ERRORS:
|
||||
break;
|
||||
|
||||
case ET_ACKNOWLEDGE:
|
||||
MB_Diagnostics_SlaveNAKCnt();
|
||||
break;
|
||||
case ET_SLAVE_DEVICE_BUSY:
|
||||
MB_Diagnostics_SlaveBusyCnt();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if(error != ET_NO_ERRORS)
|
||||
{
|
||||
MB_Diagnostics_ExceptionErrorCnt();
|
||||
TrackerCnt_Warn(hmodbus->rs_err);
|
||||
hmodbus->pMessagePtr->FuncCode |= FC_ERR_VALUES_START;
|
||||
hmodbus->pMessagePtr->Except_Code = error;
|
||||
}
|
||||
|
||||
hmodbus->RS_STATUS = RS_Handle_Transmit_Start(hmodbus, hmodbus->pMessagePtr);
|
||||
}
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Ответ на сообщение в режиме слейва.
|
||||
* @param hmodbus Указатель на хендлер RS.
|
||||
@@ -115,8 +177,7 @@ RS_StatusTypeDef MB_Slave_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *mod
|
||||
/* unknown func code */
|
||||
default:
|
||||
modbus_msg->Except_Code = 0x01; /* set exception code: illegal function */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Проверяем режим устройства - если Listen Only, не обрабатываем команды
|
||||
if (MB_GetDeviceMode() == MODBUS_LISTEN_ONLY_MODE)
|
||||
@@ -152,8 +213,8 @@ RS_StatusTypeDef MB_Slave_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *mod
|
||||
}
|
||||
else
|
||||
{
|
||||
RS_Handle_Receive_Start(hmodbus, modbus_msg);
|
||||
hmodbus->f.DeferredResponse = 0;
|
||||
// RS_Handle_Receive_Start(hmodbus, modbus_msg);
|
||||
// hmodbus->f.DeferredResponse = 0;
|
||||
}
|
||||
|
||||
hmodbus->RS_STATUS = MB_RES;
|
||||
@@ -173,7 +234,7 @@ RS_StatusTypeDef MB_Slave_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeD
|
||||
{
|
||||
int ind = 0; // ind for modbus-uart buffer
|
||||
|
||||
if(hmodbus->f.EchoResponse && hmodbus->f.MessageHandled) // if echo response need
|
||||
if(hmodbus->f.EchoResponse && (modbus_msg->Except_Code == ET_NO_ERRORS)) // if echo response need
|
||||
ind = hmodbus->RS_Message_Size;
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user