/// <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_EVCU1 scmEvcu1 = new Scm_EVCU1(); ScmCanSendMsg canSendData = new ScmCanSendMsg(); canSendData.FeedBkMtclMode = cmdType; string strCmdDetail = string.Empty; //命令解析字符串信息 AbstractMotorControl.Ecm_Gear gear; //0空挡,1前进,2后退 if (data > 0) { gear = AbstractMotorControl.Ecm_Gear.DriveGear; } else if (data < 0) { gear = AbstractMotorControl.Ecm_Gear.ReverseGear; } else { gear = AbstractMotorControl.Ecm_Gear.NeutralGear; } switch (gear) { case Ecm_Gear.NeutralGear: scmEvcu1.isg_run_dir_dmd_sd = 0x00; strCmdDetail = "空挡" + "\r\n"; break; case Ecm_Gear.DriveGear: scmEvcu1.isg_run_dir_dmd_sd = 0x01; strCmdDetail = "D档" + "\r\n"; break; case Ecm_Gear.ReverseGear: scmEvcu1.isg_run_dir_dmd_sd = 0x02; strCmdDetail = "倒档" + "\r\n"; break; case Ecm_Gear.ErrorGear: scmEvcu1.isg_run_dir_dmd_sd = 0x03; strCmdDetail = "错误" + "\r\n"; break; default: scmEvcu1.isg_run_dir_dmd_sd = 0x00; break; } //电机转速模式设定 scmEvcu1.isg_ctrl_ena_dmd_sd = 0x00; //mcu使能 switch (cmdType) { case Ecm_WorkMode.None: //备用 scmEvcu1.isg_ctrl_mod_dmd_sd = 0x00; //控制模式 strCmdDetail += "备用" + "\r\n"; break; case Ecm_WorkMode.SpeedMode: //转速模式 { scmEvcu1.isg_spd_dmd_sd = data; //偏移12000,0表示-12000 canSendData.FeedBkMotorSpeed = data; scmEvcu1.isg_ctrl_ena_dmd_sd = 0x01; //mcu使能 scmEvcu1.isg_ctrl_mod_dmd_sd = 0x01; //控制模式 strCmdDetail += "转速命令:" + data.ToString() + "\r\n"; break; } case Ecm_WorkMode.TorqueMode: //转矩模式 { scmEvcu1.isg_tq_dmd_sd = data; //偏移2000,0表示-2000 canSendData.FeedBkMotorTorque = data; scmEvcu1.isg_ctrl_ena_dmd_sd = 0x01; //mcu使能 scmEvcu1.isg_ctrl_mod_dmd_sd = 0x02; //控制模式 strCmdDetail += "扭矩命令:" + data.ToString() + "\r\n"; break; } case Ecm_WorkMode.DisCharging: //放电模式 scmEvcu1.isg_ctrl_ena_dmd_sd = 0x01; //mcu使能 scmEvcu1.isg_ctrl_mod_dmd_sd = 0x03; //控制模式 strCmdDetail += "放电" + "\r\n"; break; default: scmEvcu1.isg_ctrl_mod_dmd_sd = 0x00; break; } CanStandardData canData = ScmEvcu1ToBytes(scmEvcu1); 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 ScmCanReceiveMsg TransformMcuReceiveData(CanStandardData canRecDatas) { return(null); }
/// <summary> /// 接收数据并处理 /// </summary> /// <param name="canRecDatas"></param> public override ScmCanReceiveMsg TransformEcuReceiveData(CanStandardData canRecDatas) { uint rec = CanDataFilterById(canRecDatas); ScmCanReceiveMsg recMsg = new ScmCanReceiveMsg(); //若是ID被筛选,则推送筛选ID if (rec != 0xffffffff) //筛选id { return(null); } //ID未被筛选 recMsg.canId = canRecDatas.canId; recMsg.baudrate = canRecDatas.baudrate; recMsg.datas = canRecDatas.datas; switch (canRecDatas.canId) { case ElecOilPump_Scm_MCU1_Frame1.canId: //反馈第一帧,使能,方向,扭矩,转速 { ElecOilPump_Scm_MCU1_Frame1 scmMcu1 = ElecOilPump_ByteToScmMcu1Frame1(canRecDatas); //工作模式 recMsg.containFeedBkMtclMode = true; switch (scmMcu1.actual_control_mode) { case 0: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; //初始化 case 1: recMsg.FeedBkMtclMode = Ecm_WorkMode.TorqueMode; break; //转矩环 case 2: recMsg.FeedBkMtclMode = Ecm_WorkMode.SpeedMode; break; //转速环 default: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; } //转速 recMsg.containFeedBkMotorSpeed = true; recMsg.FeedBkMotorSpeed = (short)scmMcu1.actual_speed; //转矩 recMsg.containFeedBkMotorTorque = true; recMsg.FeedBkMotorTorque = (short)scmMcu1.actual_torque; //故障等级 recMsg.containFeedBkErrorLevel = true; recMsg.FeedBkErrorLevel = scmMcu1.error_level; //故障码 recMsg.containFeedBkErrorCode = true; recMsg.FeedBkErrorCode = new byte[1] { scmMcu1.error_code }; //故障名称 recMsg.containFeedBkErrorStr = true; recMsg.FeedBkErrorStr = ReceiveErrorTransform(scmMcu1.error_code); break; } case ElecOilPump_Scm_MCU1_Frame2.canId: //电流电压 { ElecOilPump_Scm_MCU1_Frame2 scmMcu2 = ElecOilPump_ByteToScmMcu1Frame2(canRecDatas); //实际电流 recMsg.containFeedBkDcCurrent = true; recMsg.FeedBkDcCurrent = scmMcu2.dc_current; //相电压 recMsg.containFeedBkDcVoltage = true; recMsg.FeedBkDcVoltage = scmMcu2.dc_voltage; //实际电流 recMsg.containFeedBkAcCurrent = true; recMsg.FeedBkAcCurrent = scmMcu2.ac_current; //相电压 recMsg.containFeedBkAcVoltage = true; recMsg.FeedBkAcVoltage = scmMcu2.ac_voltage; //MCU电压 recMsg.containFeedBkMcuVoltage = true; recMsg.FeedBkMcuVoltage = scmMcu2.mcu_voltage; break; } case ElecOilPump_Scm_MCU1_Frame3.canId: //功率、温度 { ElecOilPump_Scm_MCU1_Frame3 scmMcu3 = ElecOilPump_ByteToScmMcu1Frame3(canRecDatas); recMsg.containFeedBkActPower = true; recMsg.FeedBkActPower = scmMcu3.actual_power; recMsg.containFeedBkMtclInvTemp = true; recMsg.FeedBkMtclInvTemp = scmMcu3.inverter_temperature; recMsg.containFeedBkMotorWindingTemp = true; recMsg.FeedBkMotorWindingTemp = scmMcu3.wind_temperature; recMsg.containFeedBkMtclChipTemp = true; recMsg.FeedBkMtclChipTemp = scmMcu3.mtclChip_temperature; break; } case ElecOilPump_Scm_MCU1_Frame4.canId: //软件版本 { ElecOilPump_Scm_MCU1_Frame4 scmMcu4 = ElecOilPump_ByteToScmMcu1Frame4(canRecDatas); recMsg.containFeekBkMtclVersion = true; recMsg.FeekBkMtclVersion = scmMcu4.year.ToString("X2") + "." + scmMcu4.month.ToString("X2") + "." + scmMcu4.day.ToString("X2") + "." + scmMcu4.hour.ToString("X2") + "." + scmMcu4.minute.ToString("X2"); break; } default: //continue; //其他ID的数据一律不接收 break; } return(recMsg); //推送数据 }
/// <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); }
public abstract ScmCanReceiveMsg TransformMcuReceiveData(CanStandardData canRecDatas);
/// <summary> /// 接收数据并处理 /// </summary> /// <param name="canRecDatas"></param> public override ScmCanReceiveMsg TransformEcuReceiveData(CanStandardData canRecDatas) { uint rec = CanDataFilterById(canRecDatas); ScmCanReceiveMsg recMsg = new ScmCanReceiveMsg(); //若是ID被筛选,则推送筛选ID if (rec != 0xffffffff) //筛选id { //if(m_receiveAbanCallback!=null) // m_receiveAbanCallback(rec); //推送筛选掉的ID return(null); } //ID未被筛选 recMsg.canId = canRecDatas.canId; recMsg.baudrate = canRecDatas.baudrate; recMsg.datas = canRecDatas.datas; switch (canRecDatas.canId) { #region 电机1 case Scm_MCU1_Frame1.motor1CanId: //反馈第一帧,使能,方向,扭矩,转速,故障 { Scm_MCU1_Frame1 scmMcu1 = ByteToScmMcu1Frame1(canRecDatas); //工作模式 recMsg.containFeedBkMtclMode = true; //转速转矩与其他协议的不一样,反的 switch (scmMcu1.dualsource_ctrl_mod_act) { case 1: recMsg.FeedBkMtclMode = Ecm_WorkMode.TorqueMode; break; //转矩环 case 2: recMsg.FeedBkMtclMode = Ecm_WorkMode.SpeedMode; break; //转速环 default: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; } recMsg.containFeedBkGear = true; switch (scmMcu1.dualsource_run_dir_act) { case 0: recMsg.FeedBkGear = Ecm_Gear.NeutralGear; break; //空档 case 1: recMsg.FeedBkGear = Ecm_Gear.DriveGear; break; //前进 case 2: recMsg.FeedBkGear = Ecm_Gear.ReverseGear; break; //后退 default: recMsg.FeedBkGear = Ecm_Gear.ErrorGear; break; } //扭矩 recMsg.containFeedBkMotorTorque = true; recMsg.FeedBkMotorTorque = scmMcu1.dualsource_tq_acu; //转速 recMsg.containFeedBkMotorSpeed = true; recMsg.FeedBkMotorSpeed = scmMcu1.dualsource_spd_acu; //最大转矩 recMsg.containFeedBkMotorMaxTorque = true; recMsg.FeedbkMotorMaxTorque = scmMcu1.dualsource_tq_acu_max; //故障等级 recMsg.containFeedBkErrorLevel = true; recMsg.FeedBkErrorLevel = scmMcu1.dualsource_errorlevel; //故障码 recMsg.containFeedBkErrorCode = true; recMsg.FeedBkErrorCode = new byte[1] { scmMcu1.dualsource_error_code }; ReceiveErrorTransform(recMsg.FeedBkErrorCode[0]); recMsg.motorIndex = 0; //电机1 } break; case Scm_MCU1_Frame2.motor1CanId: //反馈第二帧,电流电压 { Scm_MCU1_Frame2 scmMcu2 = ByteToScmMcu1Frame2(canRecDatas); //直流电压 recMsg.containFeedBkDcVoltage = true; recMsg.FeedBkDcVoltage = scmMcu2.dualsource_dc_u; //直流电流 recMsg.containFeedBkDcCurrent = true; recMsg.FeedBkDcCurrent = scmMcu2.dualsource_dc_i; //交流电压 recMsg.containFeedBkAcVoltage = true; recMsg.FeedBkAcVoltage = scmMcu2.dualsource_ac_u; //交流电流 recMsg.containFeedBkAcCurrent = true; recMsg.FeedBkAcCurrent = scmMcu2.dualsource_ac_i; recMsg.motorIndex = 0; //电机1 } break; case Scm_MCU1_Frame3.motor1CanId: //反馈第三帧,功率及温度 { Scm_MCU1_Frame3 scmMcu3 = ByteToScmMcu1Frame3(canRecDatas); //功率 recMsg.containFeedBkActPower = true; recMsg.FeedBkActPower = scmMcu3.dualsource_pwr_acu; recMsg.containFeedBkMotorWindingTemp = true; recMsg.FeedBkMotorWindingTemp = scmMcu3.dualsource_wind_t; recMsg.containFeedBkMtclInvTemp = true; recMsg.FeedBkMtclInvTemp = scmMcu3.dualsource_inv_t; //dualsource_bear_t; //dualsource_life_cyc; recMsg.motorIndex = 0; //电机1 } break; #endregion #region 电机2 //反馈第一帧,使能,方向,扭矩,转速,故障 case Scm_MCU1_Frame1.motor2CanId: { Scm_MCU1_Frame1 scmMcu1 = ByteToScmMcu1Frame1(canRecDatas); //工作模式 recMsg.containFeedBkMtclMode = true; //转速转矩与其他协议的不一样,反的 switch (scmMcu1.dualsource_ctrl_mod_act) { case 1: recMsg.FeedBkMtclMode = Ecm_WorkMode.TorqueMode; break; //转矩环 case 2: recMsg.FeedBkMtclMode = Ecm_WorkMode.SpeedMode; break; //转速环 default: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; } recMsg.containFeedBkGear = true; switch (scmMcu1.dualsource_run_dir_act) { case 0: recMsg.FeedBkGear = Ecm_Gear.NeutralGear; break; //空档 case 1: recMsg.FeedBkGear = Ecm_Gear.DriveGear; break; //前进 case 2: recMsg.FeedBkGear = Ecm_Gear.ReverseGear; break; //后退 default: recMsg.FeedBkGear = Ecm_Gear.ErrorGear; break; } //扭矩 recMsg.containFeedBkMotorTorque = true; recMsg.FeedBkMotorTorque = scmMcu1.dualsource_tq_acu; //转速 recMsg.containFeedBkMotorSpeed = true; recMsg.FeedBkMotorSpeed = scmMcu1.dualsource_spd_acu; //最大转矩 recMsg.containFeedBkMotorMaxTorque = true; recMsg.FeedbkMotorMaxTorque = scmMcu1.dualsource_tq_acu_max; //故障等级 recMsg.containFeedBkErrorLevel = true; recMsg.FeedBkErrorLevel = scmMcu1.dualsource_errorlevel; //故障码 recMsg.containFeedBkErrorCode = true; recMsg.FeedBkErrorCode = new byte[1] { scmMcu1.dualsource_error_code }; ReceiveErrorTransform(recMsg.FeedBkErrorCode[0]); recMsg.motorIndex = 1; //电机2 } break; //反馈第二帧,电流电压 case Scm_MCU1_Frame2.motor2CanId: { Scm_MCU1_Frame2 scmMcu2 = ByteToScmMcu1Frame2(canRecDatas); //直流电压 recMsg.containFeedBkDcVoltage = true; recMsg.FeedBkDcVoltage = scmMcu2.dualsource_dc_u; //直流电流 recMsg.containFeedBkDcCurrent = true; recMsg.FeedBkDcCurrent = scmMcu2.dualsource_dc_i; //交流电压 recMsg.containFeedBkAcVoltage = true; recMsg.FeedBkAcVoltage = scmMcu2.dualsource_ac_u; //交流电流 recMsg.containFeedBkAcCurrent = true; recMsg.FeedBkAcCurrent = scmMcu2.dualsource_ac_i; recMsg.motorIndex = 1; //电机2 } break; //反馈第三帧,功率及温度 case Scm_MCU1_Frame3.motor2CanId: { Scm_MCU1_Frame3 scmMcu3 = ByteToScmMcu1Frame3(canRecDatas); //功率 recMsg.containFeedBkActPower = true; recMsg.FeedBkActPower = scmMcu3.dualsource_pwr_acu; recMsg.containFeedBkMotorWindingTemp = true; recMsg.FeedBkMotorWindingTemp = scmMcu3.dualsource_wind_t; recMsg.containFeedBkMtclInvTemp = true; recMsg.FeedBkMtclInvTemp = scmMcu3.dualsource_inv_t; //dualsource_bear_t; //dualsource_life_cyc; recMsg.motorIndex = 1; //电机2 } break; #endregion default: //continue; //其他ID的数据一律不接收 break; } return(recMsg); //推送数据 }