/// <summary> /// 转换发送数据 /// 30 /// </summary> public List <AbstractMotorControl.CanStandardData> TransformEcuSendData30(bool forbidMotorCmd, UInt16[] regList) { List <AbstractMotorControl.CanStandardData> canSendDatas = new List <AbstractMotorControl.CanStandardData>(); //config 30 ElecOilPump_Scm_EVCU1 scmTcu1 = new ElecOilPump_Scm_EVCU1(); scmTcu1.forbidMotorControlCmd = Convert.ToByte(forbidMotorCmd); scmTcu1.N = 30; scmTcu1.ConfigRegN = regList[30]; AbstractMotorControl.CanStandardData canData1 = ElecOilPump_ScmEvcu1ToBytes(scmTcu1); canSendDatas.Add(canData1); return(canSendDatas); }
/// <summary> /// 整车控制器1 数据反解析回结构体 /// ID:0x0C61D5D3 /// 波特率:250Kbps /// 数据长度:8bytes /// 周期:按需发送 /// </summary> public ElecOilPump_Scm_EVCU1 ElecOilPump_ScmBytesToEvcu1(byte[] canData) { ElecOilPump_Scm_EVCU1 scmEvcu1 = new ElecOilPump_Scm_EVCU1(); //byte0 scmEvcu1.forbidMotorControlCmd = (byte)(canData[0] & 0x01); //电机命令禁止 //byte1,寄存器索引N,默认值0,分辨率1 scmEvcu1.N = canData[1]; //低位 //byte2,byte3,Config[N],默认值0,分辨率1 scmEvcu1.ConfigRegN = (ushort)(canData[3] * 256 + canData[2]); //高位 //byte4、5、6、7保留 return(scmEvcu1); }
public override ScmCanSendMsg EcuClearMcuFault() { ScmCanSendMsg scmSendMsg = new ScmCanSendMsg(); ElecOilPump_Scm_EVCU1 scmEvcu1 = new ElecOilPump_Scm_EVCU1(); scmEvcu1.control_mode = 0x01; //清故障 scmEvcu1.request_speed = 0; scmEvcu1.request_torque = 0x00; scmEvcu1.running_enable = 0; CanStandardData canData = ElecOilPump_ScmEvcu1ToBytes(scmEvcu1); scmSendMsg.canId = canData.canId; scmSendMsg.baudrate = canData.baudrate; scmSendMsg.datas = canData.datas; return(scmSendMsg); }
/// <summary> /// 转换发送数据 /// forbidMotorCmd表示是否禁用汽车帧,采用一问一答模式 /// 0~28 /// </summary> public List <AbstractMotorControl.CanStandardData> TransformEcuSendData0To26(bool forbidMotorCmd, UInt16[] regList) { List <AbstractMotorControl.CanStandardData> canSendDatas = new List <AbstractMotorControl.CanStandardData>(); //config 0~26 for (byte i = 0; i <= 26; i++) { ElecOilPump_Scm_EVCU1 scmTcu1 = new ElecOilPump_Scm_EVCU1(); scmTcu1.forbidMotorControlCmd = Convert.ToByte(forbidMotorCmd); scmTcu1.N = i; scmTcu1.ConfigRegN = regList[i]; AbstractMotorControl.CanStandardData canData1 = ElecOilPump_ScmEvcu1ToBytes(scmTcu1); canSendDatas.Add(canData1); } return(canSendDatas); }
/// <summary> /// 整车控制器1 /// ID:0x0C61D5D3 /// 波特率:250Kbps /// 数据长度:8bytes /// 周期:按需发送 /// </summary> AbstractMotorControl.CanStandardData ElecOilPump_ScmEvcu1ToBytes(ElecOilPump_Scm_EVCU1 scmEvcu1) { AbstractMotorControl.CanStandardData scmCanByte = new AbstractMotorControl.CanStandardData(); scmCanByte.canId = ElecOilPump_Scm_EVCU1.canId; scmCanByte.datas = new byte[8]; //byte0 scmCanByte.datas[0] = scmEvcu1.forbidMotorControlCmd; //电机命令禁止 //byte1,寄存器索引N,默认值0,分辨率1 scmCanByte.datas[1] = (byte)((scmEvcu1.N) & 0xff); //低位 //byte2,byte3,Config[N],默认值0,分辨率1 scmCanByte.datas[2] = (byte)((scmEvcu1.ConfigRegN) & 0xff); //低位 scmCanByte.datas[3] = (byte)((scmEvcu1.ConfigRegN >> 8) & 0xff); //高位 //byte4、5、6、7保留 return(scmCanByte); }
/// <summary> /// 整车控制器1 驱动信息 /// ID:0x0C41D503 /// 波特率:250Kbps /// 数据长度:8bytes /// 周期:10ms /// </summary> CanStandardData ElecOilPump_ScmEvcu1ToBytes(ElecOilPump_Scm_EVCU1 scmEvcu1) { CanStandardData scmCanByte = new CanStandardData(); scmCanByte.canId = ElecOilPump_Scm_EVCU1.canId; scmCanByte.datas = new byte[8]; //byte0 scmCanByte.datas[0] = (byte)(scmEvcu1.running_enable + //电机使能指令 (scmEvcu1.control_mode << 2)); //电机控制模式 //byte1,电机需求扭矩/电机扭矩限制,8bits,偏移量0,0范围0-32,默认值0,分辨率0.125 scmCanByte.datas[1] = (byte)(scmEvcu1.request_torque * 8); //byte2,byte3,电机转速扭矩/电机转速限制,16bits,偏移量0,低位在前,范围0-5000,默认值0,分辨率1 scmCanByte.datas[2] = (byte)((scmEvcu1.request_speed) & 0xff); //低位 scmCanByte.datas[3] = (byte)((scmEvcu1.request_speed >> 8) & 0xff); //高位 //uint8_t 7/6/5/4 保留 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>(); ElecOilPump_Scm_EVCU1 scmTcu1 = new ElecOilPump_Scm_EVCU1(); ScmCanSendMsg canSendData = new ScmCanSendMsg(); canSendData.FeedBkMtclMode = cmdType; string strCmdDetail = string.Empty; //命令解析字符串信息 //电机转速模式设定 scmTcu1.running_enable = 0x00; //mcu使能 scmTcu1.control_mode = 0x00; //不清故障 switch (cmdType) { case Ecm_WorkMode.None: //备用 scmTcu1.control_mode = 0x00; //控制模式 strCmdDetail += "备用" + "\r\n"; break; case Ecm_WorkMode.TorqueMode: //转矩模式 { canSendData.FeedBkMotorTorque = scmTcu1.request_torque = (byte)data; scmTcu1.running_enable = 0x02; //mcu使能 scmTcu1.control_mode = 0x01; //控制模式 strCmdDetail += "扭矩命令:" + data.ToString() + "\r\n"; break; } case Ecm_WorkMode.SpeedMode: //转速模式 { canSendData.FeedBkMotorSpeed = (short)(scmTcu1.request_speed = Convert.ToUInt16(data)); scmTcu1.running_enable = 0x02; //mcu使能 scmTcu1.control_mode = 0x02; //控制模式 strCmdDetail += "转速命令:" + data.ToString() + "\r\n"; break; } default: scmTcu1.control_mode = 0x00; break; } CanStandardData canData = ElecOilPump_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); }