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
}

}

void SciTransAckDataProcessvoid应答

 uint8_t i;
 uint16_t CrcValueTemp = 0;
 fori=0;i50;i++
 
 SCI_ModbusAckDatai = 0;
 
 ifSciRxDataModbusOptComd == 0x03

原文地址: https://www.cveoy.top/t/topic/bJEM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录