45 lines
1.8 KiB
C
45 lines
1.8 KiB
C
/**
|
||
******************************************************************************
|
||
* @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; i<modbus_msg->Qnt; i++)
|
||
{
|
||
if(*((int16_t *)pInRegs) > 0)
|
||
modbus_msg->DATA[i] = (*pInRegs++);
|
||
else
|
||
modbus_msg->DATA[i] = (*pInRegs++);
|
||
}
|
||
return 1;
|
||
}
|