/** ******************************************************************************* * @file modbus_diag.h * @brief Диагностика устройства Modbus ******************************************************************************* @addtogroup MODBUS_DIAG Diagnostics Tools @ingroup MODBUS_INTERNAL @brief Функции для работы с диагностикой ******************************************************************************* * @details Модуль реализации Diagnostics (Serial Line only) (0x08): - Полная поддержка всех подфункций диагностики - Возможность выставить/сбросить любой бит в диагностическом регистре - Сбор статистики работы устройства - Управление режимами работы ******************************************************************************/ #ifndef __MODBUS_DIAG_H_ #define __MODBUS_DIAG_H_ #include "modbus_core.h" #ifdef MODBUS_ENABLE_DIAGNOSTICS ///////////////////////////////////////////////////////////////////// /////////////////---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_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 * @} */ /** * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS * @{ */ /* Обработка команды диагностики (0x08) */ uint8_t MB_Process_Diagnostics(RS_MsgTypeDef *modbus_msg); /** MODBUS_CMD_PROCESS_FUNCTIONS * @} */ /////////////////////////---FUNCTIONS---///////////////////////////// #endif //MODBUS_ENABLE_DIAGNOSTICS #endif //__MODBUS_DIAG_H_ /** MODBUS_DIAG * @} */