/// <summary> /// 整车控制器1 驱动信息 /// ID:0x0C61D1D0 /// 波特率:250Kbps /// 数据长度:8bytes /// 周期:10ms /// </summary> CanStandardData ScmEvcu1ToBytes(Scm_TCU1 scmTcu1) { CanStandardData scmCanByte = new CanStandardData(); scmCanByte.canId = Scm_TCU1.canId; scmCanByte.baudrate = Scm_TCU1.baudrate; //250K scmCanByte.datas = new byte[8]; //数据长度为8 //byte0 scmCanByte.datas[0] = (byte)(Convert.ToByte(scmTcu1.eop_ctrl_ena_dmd_sd) + //电机使能指令,分辨率1,偏移量0,范围0~2,byte0,bit0,1,2bits,00无效,01有效,10清故障 (Convert.ToByte(scmTcu1.eop_ctrl_mod_dmd_sd) << 2)); //电机控制模式,分辨率1,偏移量0,默认值1,2bits,00自由转,01转速控制,02扭矩控制 //byte1电机需求扭矩/电机扭矩限制,8bits,偏移量0,范围0-32,默认值0,分辨率0.125 scmCanByte.datas[1] = (byte)(scmTcu1.eop_tq_dmd_sd / 0.125); //byte2,byte3,电机转速扭矩/电机转速限制,6bits,偏移量-0,低位在前,范围0-5000,默认值0,分辨率1 scmCanByte.datas[2] = Convert.ToByte(scmTcu1.eop_spd_dmd_sd & 0xff); //低位 scmCanByte.datas[3] = Convert.ToByte((scmTcu1.eop_spd_dmd_sd >> 8) & 0xff); //高位 //byte4,清故障 scmCanByte.datas[3] = scmTcu1.eop_clear_fault; //byte 7/6/5 保留 return(scmCanByte); }
/// <summary> /// 发送命令给电控 /// 00备用,01转速,02转矩,03放电 /// </summary> /// <param name="scmSendData"></param> /// <returns></returns> public override List <ScmCanSendMsg> TransformEcuSendData(uint canIndex, Ecm_WorkMode cmdType, short data, uint motorIndex = 0) { List <ScmCanSendMsg> canSendDatas = new List <ScmCanSendMsg>(); Scm_TCU1 scmTcu1 = new Scm_TCU1(); ScmCanSendMsg canSendData = new ScmCanSendMsg(); canSendData.FeedBkMtclMode = cmdType; string strCmdDetail = string.Empty; //命令解析字符串信息 //电机转速模式设定 scmTcu1.eop_ctrl_ena_dmd_sd = 0x00; //mcu使能 scmTcu1.eop_clear_fault = 0x00; //不清故障 switch (cmdType) { case Ecm_WorkMode.None: //备用 scmTcu1.eop_ctrl_mod_dmd_sd = 0x00; //控制模式 strCmdDetail += "备用" + "\r\n"; break; case Ecm_WorkMode.SpeedMode: //转速模式 { canSendData.FeedBkMotorSpeed = scmTcu1.eop_spd_dmd_sd = Convert.ToInt16(data); scmTcu1.eop_ctrl_ena_dmd_sd = 0x02; //mcu使能 scmTcu1.eop_ctrl_mod_dmd_sd = 0x01; //控制模式 strCmdDetail += "转速命令:" + data.ToString() + "\r\n"; break; } case Ecm_WorkMode.TorqueMode: //转矩模式 { canSendData.FeedBkMotorTorque = scmTcu1.eop_tq_dmd_sd = (byte)data; scmTcu1.eop_ctrl_ena_dmd_sd = 0x02; //mcu使能 scmTcu1.eop_ctrl_mod_dmd_sd = 0x02; //控制模式 strCmdDetail += "扭矩命令:" + data.ToString() + "\r\n"; break; } default: scmTcu1.eop_ctrl_mod_dmd_sd = 0x00; break; } CanStandardData canData = ScmEvcu1ToBytes(scmTcu1); canSendData.canId = canData.canId; canSendData.baudrate = canData.baudrate; canSendData.datas = canData.datas; canSendData.canIndex = canIndex; canSendData.cmdDetail = strCmdDetail; canSendDatas.Add(canSendData); return(canSendDatas); }
public override ScmCanSendMsg EcuClearMcuFault() { ScmCanSendMsg scmSendMsg = new ScmCanSendMsg(); Scm_TCU1 scmEvcu1 = new Scm_TCU1(); scmEvcu1.eop_ctrl_ena_dmd_sd = 0x01; //清故障 scmEvcu1.eop_clear_fault = 1; //清故障 scmEvcu1.eop_ctrl_mod_dmd_sd = 0x00; scmEvcu1.eop_spd_dmd_sd = 0; scmEvcu1.eop_tq_dmd_sd = 0; CanStandardData canData = ScmEvcu1ToBytes(scmEvcu1); scmSendMsg.canId = canData.canId; scmSendMsg.baudrate = canData.baudrate; scmSendMsg.datas = canData.datas; return(scmSendMsg); }