Browse Source

实现附加功能:读0x10000寄存器

main
the_deepest 6 days ago
parent
commit
50fefc2711
2 changed files with 922 additions and 883 deletions
  1. +874
    -874
      iar/uCOS_Modbus.dep
  2. +48
    -9
      modbus/modbus.c

+ 874
- 874
iar/uCOS_Modbus.dep
File diff suppressed because it is too large
View File


+ 48
- 9
modbus/modbus.c View File

@@ -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];


Loading…
Cancel
Save