/** ****************************************************************************** * @file modbus_diag.h * @brief Диагностика устройства Modbus ****************************************************************************** @addtogroup MODBUS_DIAG Diagnostics Tools @ingroup MODBUS_INTERNAL ****************************************************************************** * @details Модуль реализации Diagnostics (Serial Line only) (0x08): - Полная поддержка всех подфункций диагностики - Возможность выставить/сбросить любой бит в диагностическом регистре - Сбор статистики работы устройства - Управление режимами работы ****************************************** ************************************/ #ifndef __MODBUS_DIAG_H_ #define __MODBUS_DIAG_H_ #include "modbus_core.h" ///////////////////////////////////////////////////////////////////// /////////////////---DEVICE DIAGNOSTICS DEFINES---//////////////////// /** * @addtogroup MODBUS_DIAG * @{ */ /** @brief Режимы работы устройства */ typedef enum { MODBUS_NORMAL_MODE = 0, MODBUS_LISTEN_ONLY_MODE = 1 } MB_DeviceModeTypeDef; /** @brief Структура со диагностической информацией устройства модбас */ typedef struct { uint16_t DiagnosticRegister; ///< Регистр диагностики. 0 бит - overrun. Остальное заполняется пользователем MB_DeviceModeTypeDef DeviceMode;///< Режим устройства - NORMAL/LISTEN_ONLY struct { uint16_t BusMessage; ///< Все принятые фреймы modbus на линии (с всех адресов) uint16_t BusCommunicationErr; ///< Ошибки при приеме фрейма modbus uint16_t BusExceptionErr; ///< Ошибки при обработке фрейма modbus uint16_t SlaveMessage; ///< Принятые сообщения (только запросы на адрес данного устройства) uint16_t SlaveNoResponse; ///< Счетчик сколько мы раз не ответили на запрос uint16_t SlaveNAK; ///< Счетчик аномальной ошибки при обработке фрейма uint16_t SlaveBusy; ///< Счетчик принятых запросов когда устройство занято. Здесь не работает: из-за архитектуры отследить невозможно uint16_t BusCharacterOverrun; ///< Overrun Error } Counters; } MB_DiagnosticsInfoTypeDef; extern MB_DiagnosticsInfoTypeDef MB_DIAG; /////////////////---DEVICE DIAGNOSTICS DEFINES---//////////////////// ///////////////////////////////////////////////////////////////////// /////////////////////////---FUNCTIONS---///////////////////////////// /* Инициализация диагностических счетчиков */ void MB_DiagnosticsInit(void); /** MODBUS_DIAG * @} */ /** * @addtogroup MODBUS_REQ_DIAG_API API for Diagnostics * @ingroup MODBUS_REQUEST_MSG * @brief API для чтения диагностической информации из ответа в режиме мастер * @details Примеры использования: * * @code * // Получить данные диагностики (значение счетчика) * uint16_t counter_value; * if(MB_RespGet_Diagnostic(&MODBUS_MSG, &counter_value)) * { * printf("Counter value: %d\n", counter_value); * } * @endcode * @{ */ int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data); /** MODBUS_REQ_DIAG_API * @} */ /** * @addtogroup MODBUS_DATA_ACCESS_FUNCTIONS @{ */ /* Выставить бит в регистре диагностике */ int MB_Diagnostics_WriteBit(int bit_num, int bit_state); /*ь Прочитать состояние бита диагностического регистра */ int MB_Diagnostics_GetBit(int bit_num); /* Получение текущего режима устройства */ MB_DeviceModeTypeDef MB_GetDeviceMode(void); /* Функции для обновления счетчиков диагностики */ void MB_Diagnostics_BusMessageCnt(void); void MB_Diagnostics_CommunicationErrorCnt(void); void MB_Diagnostics_ExceptionErrorCnt(void); void MB_Diagnostics_CharacterOverrunCnt(void); void MB_Diagnostics_SlaveMessageCnt(void); void MB_Diagnostics_SlaveNoResponseCnt(void); void MB_Diagnostics_SlaveNAKCnt(void); void MB_Diagnostics_SlaveBusyCnt(void); /** MODBUS_CMD_PROCESS_FUNCTIONS * @} */ //---------PROCESS MODBUS COMMAND FUNCTIONS--------- /** * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS @{ */ /* Обработка команды диагностики (0x08) */ uint8_t MB_Process_Diagnostics(RS_MsgTypeDef *modbus_msg); /** MODBUS_CMD_PROCESS_FUNCTIONS * @} */ /////////////////////////---FUNCTIONS---///////////////////////////// #endif //__MODBUS_DIAG_H_ /** MODBUS_DIAG * @} */