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