/** ****************************************************************************** * @file modbus_master.h * @brief Главный заголовочный файл Modbus библиотеки ****************************************************************************** @addtogroup MODBUS_MASTER Modbus master funtions @ingroup MODBUS_CMD_PROCESS_FUNCTIONS @{ ****************************************************************************** * @details Модуль реализации обработки UART сообщение в режиме мастер ******************************************************************************/ #ifndef __MODBUS_MASTER_H_ #define __MODBUS_MASTER_H_ #include "rs_message.h" #ifdef MODBUS_ENABLE_MASTER #define MODBUS_MODE_MASTER 1 #endif /** * @addtogroup MODBUS_REQUEST_MSG API for Master Requests * @ingroup MODBUS_FUNCTIONS * @brief Макросы для создания запросов в режиме мастер * @details Примеры использования: * * // Чтение 10 holding registers начиная с адреса 0 * RS_MsgTypeDef read_msg = MB_REQUEST_READ_HOLDING_REGS(1, 0, 10); * * // Запись одного coil * RS_MsgTypeDef write_coil_msg = MB_REQUEST_WRITE_SINGLE_COIL(1, 5, 1); * * // Диагностический запрос * RS_MsgTypeDef diag_msg = MB_REQUEST_RETURN_BUS_MESSAGE_COUNT(1); * * // Идентификация устройства * RS_MsgTypeDef dev_id_msg = MB_REQUEST_READ_DEVICE_ID_BASIC(1); */ //---------КЛАССИЧЕСКИЕ ДАННЫЕ----------- RS_MsgTypeDef MB_REQUEST_READ_COILS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity); RS_MsgTypeDef MB_REQUEST_READ_DISCRETE_INPUTS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity); RS_MsgTypeDef MB_REQUEST_READ_HOLDING_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity); RS_MsgTypeDef MB_REQUEST_READ_INPUT_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity); RS_MsgTypeDef MB_REQUEST_WRITE_SINGLE_COIL(uint8_t slave_addr, uint16_t coil_addr, uint8_t value); RS_MsgTypeDef MB_REQUEST_WRITE_SINGLE_REG(uint8_t slave_addr, uint16_t reg_addr, uint16_t value); RS_MsgTypeDef MB_REQUEST_WRITE_MULTIPLE_COILS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity, uint8_t *coils_data); RS_MsgTypeDef MB_REQUEST_WRITE_MULTIPLE_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity, uint16_t *regs_data); //---------ДИАГНОСТИЧЕСКИЕ ДАННЫЕ----------- RS_MsgTypeDef MB_REQUEST_DIAGNOSTIC_QUERY(uint8_t slave_addr, uint16_t sub_function, uint16_t data); RS_MsgTypeDef MB_REQUEST_RETURN_QUERY_DATA(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_RESTART_COMMUNICATIONS(uint8_t slave_addr, uint16_t data); RS_MsgTypeDef MB_REQUEST_RETURN_DIAGNOSTIC_REGISTER(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_FORCE_LISTEN_ONLY_MODE(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_CLEAR_COUNTERS_AND_DIAGNOSTIC_REGISTER(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_RETURN_BUS_MESSAGE_COUNT(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_RETURN_BUS_COMMUNICATION_ERROR_COUNT(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_EXCEPTION_ERROR_COUNT(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_MESSAGE_COUNT(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_NO_RESPONSE_COUNT(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_NAK_COUNT(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_BUSY_COUNT(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_RETURN_BUS_CHARACTER_OVERRUN_COUNT(uint8_t slave_addr); //---------ИДЕНТИФИКАТОРЫ МОДБАС----------- RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_BASIC(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_REGULAR(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_EXTENDED(uint8_t slave_addr); RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t object_id); /** MODBUS_REQUEST_MSG * @} */ /** * @addtogroup MODBUS_REGS_API API for Registers * @ingroup MODBUS_REQUEST_MSG * @brief API для чтения регистров из ответа в режиме мастер * @details Примеры использования: * * @code * // Пример: Запросили 10 регистров с адреса 100, хотим получить значение регистра 105 * uint16_t reg_value; * if(MB_GetRegisterValue(&MODBUS_MSG, 105, ®_value)) * { * printf("Register 105 value: %d\n", reg_value); * } * * // Пример: Получить все запрошенные регистры * for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++) * { * uint16_t value; * if(MB_GetRegisterValue(&MODBUS_MSG, addr, &value)) * { * printf("Register %d: %d\n", addr, value); * } * } * @endcode */ int MB_GetRegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value); /** MODBUS_REQ_REGS_API * @} */ /* Сбор сообщения в буфер UART в режиме мастер (фрейм мастера из msg -> uart) */ RS_StatusTypeDef MB_Master_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff); /* Парс сообщения в режиме мастер (фрейм слейва из uart -> msg) */ RS_StatusTypeDef MB_Master_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff); #endif //__MODBUS_MASTER_H_ /** MODBUS_MASTER * @} */