void SciTransAckDataProcessvoid应答 uint8_t i; uint16_t CrcValueTemp = 0; fori=0;i50;i++ SCI_ModbusAckDatai = 0; ifSciRxDataModbusOptComd == 0x03
SCI_ModbusAckData[6+(SciRxData.ModbusDataLenthLow2)] = CrcValueTemp; SciTransmitData(SCI_ModbusAckData,(2SciRxData.ModbusDataLenthLow + 7U)); //发送数据 } else { SCI_ModbusAckData[0] = 0xA5; SCI_ModbusAckData[1] = 0x5A; //header SCI_ModbusAckData[2] = SciRxData.MachineAddr; //设备地址 SCI_ModbusAckData[3] = SciRxData.ModbusOptComd; SCI_ModbusAckData[4] = 2*SciRxData.ModbusDataLenthLow; for(i=0;i<SciRxData.ModbusDataLenthLow;i++) {
if((SciRxData.ModbusDataAddrLow + i) < 0x2C)
{
SCI_ModbusAckData[5+(2*i)] = (SetDataRamArea.SystemSetData[(SciRxData.ModbusDataAddrLow + i)] >>8);
SCI_ModbusAckData[6+(2*i)] = (SetDataRamArea.SystemSetData[(SciRxData.ModbusDataAddrLow + i)]);
}
else
{
SCI_ModbusAckData[5+(2*i)] = 0U;
SCI_ModbusAckData[6+(2*i)] = 0U;
}
}
CrcValueTemp = ModBusCRC16(SCI_ModbusAckData,(2*SciRxData.ModbusDataLenthLow + 5U)); //Crc
SCI_ModbusAckData[5+(SciRxData.ModbusDataLenthLow*2)] = CrcValueTemp >> 8;
SCI_ModbusAckData[6+(SciRxData.ModbusDataLenthLow*2)] = CrcValueTemp;
SciTransmitData(SCI_ModbusAckData,(2*SciRxData.ModbusDataLenthLow + 7U)); //发送数据
}
}
}
else if((SciRxData.ModbusDataAddrHigh == 0x40) || (SciRxData.ModbusDataAddrHigh == 0x50)) //操作地址选择
{
SCI_ModbusAckData[0] = 0xA5;
SCI_ModbusAckData[1] = 0x5A; //header
SCI_ModbusAckData[2] = SciRxData.MachineAddr; //设备地址
SCI_ModbusAckData[3] = SciRxData.ModbusOptComd;
SCI_ModbusAckData[4] = 2*SciRxData.ModbusDataLenthLow;
for(i=0;i<SciRxData.ModbusDataLenthLow;i++)
{
if((SciRxData.ModbusDataAddrLow + i) < 0x32)
{
SCI_ModbusAckData[5+(2*i)] = (SetDataRamArea.UserSetData[(SciRxData.ModbusDataAddrLow + i)] >>8);
SCI_ModbusAckData[6+(2*i)] = (SetDataRamArea.UserSetData[(SciRxData.ModbusDataAddrLow + i)]);
}
else
{
SCI_ModbusAckData[5+(2*i)] = 0U;
SCI_ModbusAckData[6+(2*i)] = 0U;
}
}
CrcValueTemp = ModBusCRC16(SCI_ModbusAckData,(2*SciRxData.ModbusDataLenthLow + 5U)); //Crc
SCI_ModbusAckData[5+(SciRxData.ModbusDataLenthLow*2)] = CrcValueTemp >> 8;
SCI_ModbusAckData[6+(SciRxData.ModbusDataLenthLow*2)] = CrcValueTemp;
SciTransmitData(SCI_ModbusAckData,(2*SciRxData.ModbusDataLenthLow + 7U)); //发送数据
}
else if(SciRxData.ModbusDataAddrHigh == 0x80) //操作地址选择
{
SCI_ModbusAckData[0] = 0xA5;
SCI_ModbusAckData[1] = 0x5A; //header
SCI_ModbusAckData[2] = SciRxData.MachineAddr; //设备地址
SCI_ModbusAckData[3] = SciRxData.ModbusOptComd;
SCI_ModbusAckData[4] = 2*SciRxData.ModbusDataLenthLow;
for(i=0;i<SciRxData.ModbusDataLenthLow;i++)
{
if((SciRxData.ModbusDataAddrLow + i) == 0x00)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 24);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime() >> 16);
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x01)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 8);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime());
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x02)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 24);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime() >> 16);
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x03)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 8);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime());
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x04)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 24);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime() >> 16);
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x05)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 8);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime());
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x06)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 24);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime() >> 16);
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x07)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 8);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime());
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x08)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 24);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime() >> 16);
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x09)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 8);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime());
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x0A)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 24);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime() >> 16);
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x0B)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 8);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime());
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x0C)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 24);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime() >> 16);
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x0D)
{
SCI_ModbusAckData[5+(2*i)] = (uint8_t)(GetSysRunTime() >> 8);
SCI_ModbusAckData[6+(2*i)] = (uint8_t)(GetSysRunTime());
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x0E)
{
SCI_ModbusAckData[5+(2*i)] = 0x00;
SCI_ModbusAckData[6+(2*i)] = 0x01;
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x0F)
{
SCI_ModbusAckData[5+(2*i)] = 0x00;
SCI_ModbusAckData[6+(2*i)] = 0x00;
}
else if((SciRxData.ModbusDataAddrLow + i) == 0x10)
{
SCI_ModbusAckData[5+(2*i)] = 0x00;
SCI_ModbusAckData[6+(2*i)] = 0x00;
}
else
{
SCI_ModbusAckData[5+(2*i)] = 0U;
SCI_ModbusAckData[6+(2*i)] = 0U;
}
}
CrcValueTemp = ModBusCRC16(SCI_ModbusAckData,(2*SciRxData.ModbusDataLenthLow + 5U)); //Crc
SCI_ModbusAckData[5+(SciRxData.ModbusDataLenthLow*2)] = CrcValueTemp >> 8;
SCI_ModbusAckData[6+(SciRxData.ModbusDataLenthLow*2)] = CrcValueTemp;
SciTransmitData(SCI_ModbusAckData,(2*SciRxData.ModbusDataLenthLow + 7U)); //发送数据
}
else
{
//do nothing
}
}
else if(SciRxData.ModbusOptComd == 0x06) //读写命令判断
{
if(SciRxData.ModbusDataAddrHigh == 0x30) //操作地址选择
{
SCI_ModbusAckData[0] = 0xA5;
SCI_ModbusAckData[1] = 0x5A; //header
SCI_ModbusAckData[2] = SciRxData.MachineAddr; //设备地址
SCI_ModbusAckData[3] = SciRxData.ModbusOptComd;
SCI_ModbusAckData[4] = SciRxData.ModbusDataAddrLow;
SCI_ModbusAckData[5] = SciRxData.ModbusDataAddrHigh;
CrcValueTemp = ModBusCRC16(SCI_ModbusAckData,6U); //Crc
SCI_ModbusAckData[6] = CrcValueTemp >> 8;
SCI_ModbusAckData[7] = CrcValueTemp;
SciTransmitData(SCI_ModbusAckData,8U); //发送数据
}
else
{
//do nothing
}
}
else
{
//do nothing
}
}
原文地址: https://www.cveoy.top/t/topic/bJEM 著作权归作者所有。请勿转载和采集!