|
|
|
@@ -108,12 +108,8 @@ void AppTaskModbusParse (void *p_arg) |
|
|
|
ModbusErr = ModbusErrReply(frame.func, ERR_FUNC); |
|
|
|
break; |
|
|
|
} |
|
|
|
/*实现附加功能时不在这里启动发送*/ |
|
|
|
if(frame.func == 0x03 && frame.opeAddres == 0XFFFF); |
|
|
|
else |
|
|
|
{ |
|
|
|
ModbusSend(ModbusTxBuf, ModbusTxLen); |
|
|
|
} |
|
|
|
/*发送响应帧*/ |
|
|
|
ModbusSend(ModbusTxBuf, ModbusTxLen); |
|
|
|
|
|
|
|
if(ModbusErr == 0 && (frame.func == 0x0F || frame.func == 0x10 |
|
|
|
|| frame.func == 0x05 || frame.func == 0x06)) |
|
|
|
@@ -292,11 +288,6 @@ uint8_t ModbusReadRegs(uint16_t addres, uint16_t num) |
|
|
|
ModbusTxBuf[3] = readValH; |
|
|
|
ModbusTxBuf[4] = readValL; |
|
|
|
} |
|
|
|
/*附加功能:读取大量奇数寄存器*/ |
|
|
|
else if(addres == 0xFFFF && num == 1) |
|
|
|
{ |
|
|
|
return ModbusExtReadOdd(ModbusExtOdd[0]); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
|