/** ****************************************************************************** * @file modbus_devid.h * @brief Идентификаторы устройства Modbus ****************************************************************************** @addtogroup MODBUS_DEVID Device Identifications Tools @ingroup MODBUS_INTERNAL ****************************************************************************** * @details Модуль реализации функции Read Device Identifications (0x2B): - Базовая идентификация (Vendor, Product, Revision) - Расширенная идентификация (URL, Model, User fields) - Поддержка потоковой передачи больших объектов @section Объекты идентификации: - VendorName, ProductCode, Revision - обязательные - VendorUrl, ProductName, ModelName - опциональные - User objects - пользовательские поля - Поддержка до 128 пользовательских объектов ******************************************************************************/ #ifndef __MODBUS_DEVID_H_ #define __MODBUS_DEVID_H_ #include "modbus_core.h" ///////////////////////////////////////////////////////////////////// ///////////////---DEVICE IDENTIVICATIONS DEFINES---////////////////// /** * @addtogroup MODBUS_DEVID * @{ */ /** @brief Структура для объекта (идентификатора устройства модбас) */ typedef struct { unsigned length; char *name; }MB_DeviceObjectTypeDef; /** @brief Структура со идентификаторами устройства модбас */ typedef struct { MB_DeviceObjectTypeDef VendorName; MB_DeviceObjectTypeDef ProductCode; MB_DeviceObjectTypeDef Revision; MB_DeviceObjectTypeDef VendorUrl; MB_DeviceObjectTypeDef ProductName; MB_DeviceObjectTypeDef ModelName; MB_DeviceObjectTypeDef UserApplicationName; MB_DeviceObjectTypeDef Reserved[0x79]; MB_DeviceObjectTypeDef User[MODBUS_NUMB_OF_USEROBJECTS]; }MB_DeviceIdentificationsTypeDef; extern MB_DeviceIdentificationsTypeDef MB_DEVID; void MB_DeviceInentificationInit(void); ///////////////---DEVICE IDENTIVICATIONS DEFINES---////////////////// ///////////////////////////////////////////////////////////////////// ////////////////////---MODBUS FUNCTION DEFINES---//////////////////// /** * @brief Инициализация объектов * @details С помозью этого дефайна инициализируются объекты в @ref MB_DeviceInentificationInit */ #define MB_ObjectInit(_p_obj_, _userstring_) \ (_p_obj_)->length = sizeof(_userstring_);\ (_p_obj_)->name = _userstring_; /** * @brief Инициализация пользовательских объектов * @details С помозью этого дефайна инициализируются пользовательские объекты в MB_DeviceInentificationInit */ #define MB_UserObjectInit(_pinfostruct_, _user_numb_) MB_ObjectInit(&(_pinfostruct_)->User[_user_numb_], MODBUS_USEROBJECT##_user_numb_##_NAME) /** MODBUS_DEVID * @} */ ////////////////////---MODBUS MESSAGE DEFINES---///////////////////// ///////////////////////////////////////////////////////////////////// /////////////////////////---FUNCTIONS---///////////////////////////// /** * @addtogroup MODBUS_REQ_DEFID_API API for Device Identifications * @ingroup MODBUS_REQUEST_MSG * @brief API для чтения идентификторов из ответа в режиме мастер * @details Примеры использования: * * @code * // Пример 1: Получить VendorName (ID = 0x00) * uint8_t length; * char vendor_name[64]; * if(MB_RespGet_ObjectById(&MODBUS_MSG, 0x00, vendor_name, &length)) * { * // получено * } * * // Пример 2: Перебрать все объекты в сообщении * uint8_t obj_id, obj_length; * char obj_data[256]; * * int obj_count = MB_RespGet_NumberOfObjects(&MODBUS_MSG); * printf("Total objects: %d\n", obj_count); * * for(int i = 0; i < obj_count; i++) * { * if(MB_RespGet_ObjectByIndex(&MODBUS_MSG, i, &obj_id, obj_data, &obj_length)) * { * // получено * } * } * @endcode * @{ */ /* Получить количество объектов в сообщении */ int MB_RespGet_NumberOfObjects(RS_MsgTypeDef *modbus_msg); /* Найти объект по ID в сообщении */ int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length); /* Получить объект по индексу в сообщении */ int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length); /** MODBUS_REQ_DEFID_API * @} */ /** * @addtogroup MODBUS_DEVID * @{ */ /* Записать Один Объект Идентификатора в массив данных */ void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj); /* Записать Массив Объектов Идентификатора в массив данных */ void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj); /** MODBUS_DEVID * @} */ //---------PROCESS MODBUS COMMAND FUNCTIONS--------- /** * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS @{ */ /* Обработать функцию Read Device Identifications (43/14 - 0x2B/0E) */ uint8_t MB_Process_Read_Device_Identifications(RS_MsgTypeDef *modbus_msg); /** MODBUS_CMD_PROCESS_FUNCTIONS * @} */ /////////////////////////---FUNCTIONS---///////////////////////////// #endif //__MODBUS_DEVID_H_