|
|
|
@@ -301,26 +301,40 @@ static uint16_t ModbusProcessReadHolding(const uint8_t *request,uint16_t request |
|
|
|
ModbusSlaveStatistics.illegalValueCount++; |
|
|
|
return ModbusBuildException(request[1], MODBUS_EX_ILLEGAL_VALUE); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (ModbusAddressRangeIsValid(start, quantity) == 0U)//地址检查 |
|
|
|
{ |
|
|
|
if ((start >= 20000U) && |
|
|
|
(start < 25000U) && |
|
|
|
(quantity > 0U) && |
|
|
|
(quantity <= (25000U - start)))goto tx; |
|
|
|
ModbusSlaveStatistics.illegalAddressCount++; |
|
|
|
return ModbusBuildException(request[1], MODBUS_EX_ILLEGAL_ADDRESS); |
|
|
|
} |
|
|
|
|
|
|
|
tx: |
|
|
|
ModbusTxFrame[0] = ModbusSlaveAddress; |
|
|
|
ModbusTxFrame[1] = 0X03; |
|
|
|
ModbusTxFrame[2] = (uint8_t)(quantity * 2U); |
|
|
|
|
|
|
|
for (index = 0U; index < quantity; index++) |
|
|
|
{ |
|
|
|
value = ModbusHoldingRegisters[start + index]; |
|
|
|
uint16_t address = start + index; |
|
|
|
/* D20000~D24999映射到D1、D3、D5……D9999 */ |
|
|
|
if (address >= 20000U) |
|
|
|
{ |
|
|
|
address = (address - 20000U) * 2U + 1U; |
|
|
|
} |
|
|
|
value = ModbusHoldingRegisters[address]; |
|
|
|
ModbusTxFrame[3U + index * 2U] = (uint8_t)(value >> 8U); |
|
|
|
ModbusTxFrame[4U + index * 2U] = (uint8_t)(value & 0x00FFU); |
|
|
|
} |
|
|
|
|
|
|
|
ModbusAppendCrc(ModbusTxFrame, (uint16_t)(3U + quantity * 2U)); |
|
|
|
return (uint16_t)(5U + quantity * 2U); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
|