|
|
|
@@ -10,6 +10,11 @@ uint8_t ModbusErr; |
|
|
|
uint8_t ModbusCoil[1250]; /*10000/8=1250*/ |
|
|
|
uint16_t ModbusReg[10000]; |
|
|
|
|
|
|
|
/*附加功能:页寄存器*/ |
|
|
|
uint16_t ModbusExtPage[1] = {0}; /*设置地址为0xFFFE*/ |
|
|
|
/*附加功能:读取所有单数个寄存器*/ |
|
|
|
uint16_t ModbusExtOdd[1] = {0}; /*设置地址为0xFFFF*/ |
|
|
|
|
|
|
|
uint8_t ModbusRxBuf[MODBUS_RX_BUF_SIZE]; /*接收数组*/ |
|
|
|
uint16_t ModbusRxLen = 0; /*接收数据长度*/ |
|
|
|
uint8_t ModbusTxBuf[MODBUS_TX_BUF_SIZE]; /*发送数组*/ |
|
|
|
@@ -298,6 +303,7 @@ uint8_t ModbusReadRegs(uint16_t addres, uint16_t num) |
|
|
|
uint8_t readValH; |
|
|
|
uint8_t readValL; |
|
|
|
uint8_t dataLen; |
|
|
|
uint32_t addresExt; |
|
|
|
|
|
|
|
/*操作地址超限*/ |
|
|
|
if(addres > 0x270F || (addres + (num - 1)) > 0x270F) |
|
|
|
@@ -311,16 +317,35 @@ uint8_t ModbusReadRegs(uint16_t addres, uint16_t num) |
|
|
|
} |
|
|
|
|
|
|
|
dataLen = num * 2; |
|
|
|
for(uint16_t i = 0; i < num; i++) |
|
|
|
if(ModbusExtPage[0] == 1) |
|
|
|
{ |
|
|
|
index = 3 + (i * 2); |
|
|
|
/*将16位寄存器值拆分为两个8位*/ |
|
|
|
readValH = (uint8_t)(ModbusReg[addres + i] >> 8); |
|
|
|
readValL = (uint8_t)(ModbusReg[addres + i] & 0x00FF); |
|
|
|
addresExt = ((uint32_t)1 << 16) | addres; |
|
|
|
|
|
|
|
for(uint16_t i = 0; i < num; i++) |
|
|
|
{ |
|
|
|
index = 3 + (i * 2); |
|
|
|
/*将16位寄存器值拆分为两个8位*/ |
|
|
|
readValH = (uint8_t)(ModbusReg[addresExt + i] >> 8); |
|
|
|
readValL = (uint8_t)(ModbusReg[addresExt + i] & 0x00FF); |
|
|
|
|
|
|
|
ModbusTxBuf[index] = readValH; |
|
|
|
ModbusTxBuf[index + 1] = readValL; |
|
|
|
ModbusTxBuf[index] = readValH; |
|
|
|
ModbusTxBuf[index + 1] = readValL; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
for(uint16_t i = 0; i < num; i++) |
|
|
|
{ |
|
|
|
index = 3 + (i * 2); |
|
|
|
/*将16位寄存器值拆分为两个8位*/ |
|
|
|
readValH = (uint8_t)(ModbusReg[addres + i] >> 8); |
|
|
|
readValL = (uint8_t)(ModbusReg[addres + i] & 0x00FF); |
|
|
|
|
|
|
|
ModbusTxBuf[index] = readValH; |
|
|
|
ModbusTxBuf[index + 1] = readValL; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ModbusTxBuf[0] = SLAVE_ADDRES; |
|
|
|
ModbusTxBuf[1] = 0x03; |
|
|
|
ModbusTxBuf[2] = dataLen; |
|
|
|
@@ -341,7 +366,14 @@ uint8_t ModbusWriteRegs(uint16_t addres, uint16_t num, uint8_t *data) |
|
|
|
/*操作地址超限*/ |
|
|
|
if(addres > 0x270F || (addres + (num - 1)) > 0x270F) |
|
|
|
{ |
|
|
|
return ModbusErrReply(0x10, ERR_OPE_ADDRES); |
|
|
|
if(addres == 0xFFFE && num == 1) |
|
|
|
{ |
|
|
|
return ModbusWriteReg(addres, data); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
return ModbusErrReply(0x10, ERR_OPE_ADDRES); |
|
|
|
} |
|
|
|
} |
|
|
|
/*操作数量超限*/ |
|
|
|
if(num == 0 || num > 123) |
|
|
|
@@ -435,7 +467,14 @@ uint8_t ModbusWriteReg(uint16_t addres, uint8_t *data) |
|
|
|
/*操作地址超限*/ |
|
|
|
if(addres > 0x270F) |
|
|
|
{ |
|
|
|
return ModbusErrReply(0x10, ERR_OPE_ADDRES); |
|
|
|
if(addres == 0xFFFE) |
|
|
|
{ |
|
|
|
; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
return ModbusErrReply(0x10, ERR_OPE_ADDRES); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
writeValH = data[0]; |
|
|
|
|