/** ****************************************************************************** * @file modbus_inputregs.c * @brief Реализация работы с входными регистрами Modbus ****************************************************************************** * @details Модуль обработки команды чтения input registers (0x04): - Чтение множественных входных регистров Копирование данных из структур устройства в буфер ответа - Поддержка знаковых и беззнаковых значений ******************************************************************************/ #include "modbus_inputregs.h" /** * @brief Proccess command Read Input Registers (04 - 0x04). * @param modbus_msg Указатель на структуру собщения modbus. * @return fMessageHandled Статус о результате обработки комманды. * @details Обработка команды Read Input Registers. */ uint8_t MB_Proccess_Read_Input_Regs(RS_MsgTypeDef *modbus_msg) { //---------CHECK FOR ERRORS---------- // get origin address for data uint16_t *pInRegs; modbus_msg->Except_Code = MB_DefineRegistersAddress(&pInRegs, modbus_msg->Addr, modbus_msg->Qnt, RegisterType_Input); // определение адреса регистров if(modbus_msg->Except_Code != NO_ERRORS) return 0; //-----------READING REGS------------ // setup output message data size modbus_msg->ByteCnt = modbus_msg->Qnt*2; // *2 because we transmit 8 bits, not 16 bits // read data int i; for (i = 0; iQnt; i++) { if(*((int16_t *)pInRegs) > 0) modbus_msg->DATA[i] = (*pInRegs++); else modbus_msg->DATA[i] = (*pInRegs++); } return 1; }