| @@ -108,12 +108,8 @@ void AppTaskModbusParse (void *p_arg) | |||||
| ModbusErr = ModbusErrReply(frame.func, ERR_FUNC); | ModbusErr = ModbusErrReply(frame.func, ERR_FUNC); | ||||
| break; | break; | ||||
| } | } | ||||
| /*实现附加功能时不在这里启动发送*/ | |||||
| if(frame.func == 0x03 && frame.opeAddres == 0XFFFF); | |||||
| else | |||||
| { | |||||
| ModbusSend(ModbusTxBuf, ModbusTxLen); | |||||
| } | |||||
| /*发送响应帧*/ | |||||
| ModbusSend(ModbusTxBuf, ModbusTxLen); | |||||
| if(ModbusErr == 0 && (frame.func == 0x0F || frame.func == 0x10 | if(ModbusErr == 0 && (frame.func == 0x0F || frame.func == 0x10 | ||||
| || frame.func == 0x05 || frame.func == 0x06)) | || frame.func == 0x05 || frame.func == 0x06)) | ||||
| @@ -292,11 +288,6 @@ uint8_t ModbusReadRegs(uint16_t addres, uint16_t num) | |||||
| ModbusTxBuf[3] = readValH; | ModbusTxBuf[3] = readValH; | ||||
| ModbusTxBuf[4] = readValL; | ModbusTxBuf[4] = readValL; | ||||
| } | } | ||||
| /*附加功能:读取大量奇数寄存器*/ | |||||
| else if(addres == 0xFFFF && num == 1) | |||||
| { | |||||
| return ModbusExtReadOdd(ModbusExtOdd[0]); | |||||
| } | |||||
| else | else | ||||
| { | { | ||||
| for(uint16_t i = 0; i < num; i++) | for(uint16_t i = 0; i < num; i++) | ||||
| @@ -492,69 +483,6 @@ uint8_t ModbusWriteReg(uint16_t addres, uint8_t *data) | |||||
| } | } | ||||
| uint8_t ModbusExtReadOdd(uint16_t num) | |||||
| { | |||||
| uint8_t i = 0; | |||||
| uint8_t numJ = (num + 124) / 125; | |||||
| uint8_t numI = num % 125; | |||||
| uint8_t index; | |||||
| uint16_t indexR; | |||||
| uint8_t readValH; | |||||
| uint8_t readValL; | |||||
| uint8_t dataLen; | |||||
| for(uint16_t j = 0; j < numJ; j++) | |||||
| { | |||||
| if(j == numJ - 1) | |||||
| { | |||||
| for(i = 0; i < numI; i++) | |||||
| { | |||||
| index = 3 + (i * 2); | |||||
| indexR = j * 250 + 2 * i + 1; | |||||
| /*将16位寄存器值拆分为两个8位*/ | |||||
| readValH = (uint8_t)(ModbusReg[indexR] >> 8); | |||||
| readValL = (uint8_t)(ModbusReg[indexR] & 0x00FF); | |||||
| ModbusTxBuf[index] = readValH; | |||||
| ModbusTxBuf[index + 1] = readValL; | |||||
| } | |||||
| dataLen = 2 * numI; | |||||
| ModbusTxBuf[0] = SLAVE_ADDRES; | |||||
| ModbusTxBuf[1] = 0x03; | |||||
| ModbusTxBuf[2] = dataLen; | |||||
| AddCrc16(ModbusTxBuf, 3 + dataLen); | |||||
| ModbusTxLen = 5 + dataLen; | |||||
| } | |||||
| else | |||||
| { | |||||
| for(i = 0; i < 125; i++) | |||||
| { | |||||
| index = 3 + (i * 2); | |||||
| indexR = j * 250 + 2 * i + 1; | |||||
| /*将16位寄存器值拆分为两个8位*/ | |||||
| readValH = (uint8_t)(ModbusReg[indexR] >> 8); | |||||
| readValL = (uint8_t)(ModbusReg[indexR] & 0x00FF); | |||||
| ModbusTxBuf[index] = readValH; | |||||
| ModbusTxBuf[index + 1] = readValL; | |||||
| } | |||||
| dataLen = 250; | |||||
| ModbusTxBuf[0] = SLAVE_ADDRES; | |||||
| ModbusTxBuf[1] = 0x03; | |||||
| ModbusTxBuf[2] = dataLen; | |||||
| AddCrc16(ModbusTxBuf, 3 + dataLen); | |||||
| ModbusTxLen = 5 + dataLen; | |||||
| } | |||||
| /*演示2ms*/ | |||||
| OSTimeDly(OS_TICKS_PER_SEC / 500); | |||||
| ModbusSend(ModbusTxBuf, ModbusTxLen); | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| uint8_t ModbusErrReply(uint8_t func, uint8_t err) | uint8_t ModbusErrReply(uint8_t func, uint8_t err) | ||||
| { | { | ||||