/// <summary> /// 电机控制器1 反馈第1帧 使能及控制信息等反馈 /// ID:0x0C62D0D1 /// 波特率:250Kbps /// 数据长度:8bytes /// 周期:50ms /// </summary> Scm_MCU1_Frame1 ByteToScmMcu1Frame1(CanStandardData scmCanByte1) { Scm_MCU1_Frame1 scmMcu1Frame1 = new Scm_MCU1_Frame1(); //byte0 //bit0,1 scmMcu1Frame1.isg_ena_act = (byte)(scmCanByte1.datas[0] & 0x03); //电机实际使能状况,bit0,bit1,偏移量0,00未使能,01使能 //bit2,3 scmMcu1Frame1.isg_run_dir_act = (byte)(scmCanByte1.datas[0] >> 2 & 0x03); //电机实际运行方向,00停止,01正转,10反转 //bit4,5,6,7 scmMcu1Frame1.isg_ctrl_mod_act = (byte)(scmCanByte1.datas[0] >> 4 & 0x0f); //工作模式,0初始化,1低压上电正常,2保留,3电机允许运行,4转速环,5转矩环,6放强电,7放弱电,8错误 //byte1保留 //byte2,3,转矩,偏移量-2000,范围-2000-2000,默认值-2000,分辨率1 scmMcu1Frame1.isg_tq_acu = (short)(scmCanByte1.datas[3] * 256 + scmCanByte1.datas[2] - 2000); //byte4,5,速度,偏移量-12000,范围-12000-12000,默认值-12000,分辨率1 scmMcu1Frame1.isg_spd_acu = (short)(scmCanByte1.datas[5] * 256 + scmCanByte1.datas[4] - 12000); //byte6,7,最大转矩,偏移量-2000,范围-2000-2000,默认值-2000,分辨率1 scmMcu1Frame1.isg_tq_acu_max = (short)(scmCanByte1.datas[7] * 256 + scmCanByte1.datas[6] - 2000); return(scmMcu1Frame1); }
/// <summary> /// 电机控制器1 反馈第1帧 使能及控制信息等反馈 /// 电机1 ID:0x0C62D0D1 /// 电机1 ID:0x0C52D0D2 /// 波特率:250Kbps /// 数据长度:8bytes /// 周期:50ms /// </summary> Scm_MCU1_Frame1 ByteToScmMcu1Frame1(CanStandardData scmCanByte1) { Scm_MCU1_Frame1 scmMcu1Frame1 = new Scm_MCU1_Frame1(); //byte0 //bit0,1,2,3 scmMcu1Frame1.dualsource_run_dir_act = (byte)(scmCanByte1.datas[0] & 0x0f); //电机实际运行方向,00停止,01正转,10反转 //bit4,5 scmMcu1Frame1.dualsource_ctrl_mod_act = (byte)((scmCanByte1.datas[0] >> 4) & 0x03); //工作模式,01转速环,10转矩环 //bit6,7 scmMcu1Frame1.dualsource_errorlevel = (byte)((scmCanByte1.datas[0] >> 6) & 0x03); //故障等级 //byte1,2,转矩,偏移量-2000,范围-2000-2000,默认值-2000,分辨率1 scmMcu1Frame1.dualsource_tq_acu = (short)(scmCanByte1.datas[2] * 256 + scmCanByte1.datas[1] - 2000); //byte3,4,速度,偏移量-12000,范围-12000-12000,默认值-12000,分辨率1 scmMcu1Frame1.dualsource_spd_acu = (short)(scmCanByte1.datas[4] * 256 + scmCanByte1.datas[3] - 12000); //byte5,6,最大转矩,偏移量-2000,范围-2000-2000,默认值-2000,分辨率1 scmMcu1Frame1.dualsource_tq_acu_max = (short)(scmCanByte1.datas[6] * 256 + scmCanByte1.datas[5] - 2000); //byte7,基本故障 scmMcu1Frame1.dualsource_error_code = scmCanByte1.datas[7]; return(scmMcu1Frame1); }
/// <summary> /// 电机控制器1 反馈第1帧 使能及控制信息等反馈 /// ID:0x0C62D0D1 /// 波特率:250Kbps /// 数据长度:8bytes /// 周期:50ms /// </summary> Scm_MCU1_Frame1 ByteToScmMcu1Frame1(CanStandardData scmCanByte1) { Scm_MCU1_Frame1 scmMcu1Frame1 = new Scm_MCU1_Frame1(); //byte0 //bit0,1 scmMcu1Frame1.eop_ctrl_mod_act = (byte)(scmCanByte1.datas[0] & 0x03); //工作模式,0:无控制,1:电机转速闭环运行,2:电机转矩闭环运行 //byte1,电机实际运行电流,分辨率0.2 scmMcu1Frame1.eop_act_i = (byte)(scmCanByte1.datas[0] * 0.2); //byte2,3,转矩,偏移量0,范围0-32,默认值0,分辨率1 scmMcu1Frame1.eop_spd_acu = (short)(scmCanByte1.datas[3] * 256 + scmCanByte1.datas[2]); //byte4、5、6保留 //byte7故障码 scmMcu1Frame1.eop_error_code = scmCanByte1.datas[7]; return(scmMcu1Frame1); }
/// <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 Scm_MCU1_Frame1.canId: // 0x0C62D0D1: //反馈第一帧,使能,方向,扭矩,转速 { Scm_MCU1_Frame1 scmMcu1 = ByteToScmMcu1Frame1(canRecDatas); //电机使能 recMsg.containFeedBkMcuEnable = true; recMsg.FeedBkMcuEnable = scmMcu1.isg_ena_act == 1 ? false : true; //工作模式 recMsg.containFeedBkMtclMode = true; switch (scmMcu1.isg_ctrl_mod_act) { case 0: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; //初始化 case 1: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; //低压上电正常 case 2: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; //保留 case 3: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; //电机允许运行 case 4: recMsg.FeedBkMtclMode = Ecm_WorkMode.SpeedMode; break; //转速环 case 5: recMsg.FeedBkMtclMode = Ecm_WorkMode.TorqueMode; break; //转矩环 case 6: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; //下强电 case 7: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; //下弱电 case 8: recMsg.FeedBkMtclMode = Ecm_WorkMode.ErrorProtected; break; //故障 default: break; } recMsg.containFeedBkGear = true; switch (scmMcu1.isg_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.isg_tq_acu; //转速 recMsg.containFeedBkMotorSpeed = true; recMsg.FeedBkMotorSpeed = scmMcu1.isg_spd_acu; //最大转矩 recMsg.containFeedBkMotorMaxTorque = true; recMsg.FeedbkMotorMaxTorque = scmMcu1.isg_tq_acu_max; break; } case Scm_MCU1_Frame2.canId: // 0x0C63D0D1: //反馈第二帧,故障等级及故障码 { Scm_MCU1_Frame2 scmMcu2 = ByteToScmMcu1Frame2(canRecDatas); //故障等级 recMsg.containFeedBkErrorLevel = true; recMsg.FeedBkErrorLevel = scmMcu2.isg_err_lvl; //故障码 recMsg.containFeedBkErrorCode = true; recMsg.FeedBkErrorCode = new byte[1] { scmMcu2.isg_err_cod }; //故障位 recMsg.containFeedBkErrorBits = true; recMsg.FeedBkErrorBits = new byte[6] { scmMcu2.isg_err_bit1, scmMcu2.isg_err_bit2, (byte)(scmMcu2.isg_err_bit3 & 0xff), (byte)((scmMcu2.isg_err_bit3 >> 8) & 0xff), (byte)((scmMcu2.isg_err_bit3 >> 16) & 0xff), scmMcu2.isg_err_bit4 }; //故障名称 recMsg.containFeedBkErrorStr = true; recMsg.FeedBkErrorStr = ReceiveErrorTransform(recMsg.FeedBkErrorLevel, scmMcu2.isg_err_cod, scmMcu2.isg_err_bit1, scmMcu2.isg_err_bit2, scmMcu2.isg_err_bit3, scmMcu2.isg_err_bit4); break; } case Scm_MCU1_Frame3.canId: // 0x1864D0D1: //反馈第三帧,电流电压 { Scm_MCU1_Frame3 scmMcu3 = ByteToScmMcu1Frame3(canRecDatas); //直流电压 recMsg.containFeedBkDcVoltage = true; recMsg.FeedBkDcVoltage = scmMcu3.isg_dc_u; //直流电流 recMsg.containFeedBkDcCurrent = true; recMsg.FeedBkDcCurrent = scmMcu3.isg_dc_i; //交流电压 recMsg.containFeedBkAcVoltage = true; recMsg.FeedBkAcVoltage = scmMcu3.isg_ac_u; //交流电流 recMsg.containFeedBkAcCurrent = true; recMsg.FeedBkAcCurrent = scmMcu3.isg_ac_i; break; } case Scm_MCU1_Frame4.canId: // 0x1865D0D1: //反馈第四帧,功率、温度 { Scm_MCU1_Frame4 scmMcu4 = ByteToScmMcu1Frame4(canRecDatas); //功率 recMsg.containFeedBkActPower = true; recMsg.FeedBkActPower = scmMcu4.isg_pwr_acu; recMsg.containFeedBkMotorWindingTemp = true; recMsg.FeedBkMotorWindingTemp = scmMcu4.isg_wind_t; recMsg.containFeedBkMtclInvTemp = true; recMsg.FeedBkMtclInvTemp = scmMcu4.isg_inv_t; //isg_bear_t; //isg_life_cyc; break; } case Scm_MCU1_Frame5.canId: //版本 { Scm_MCU1_Frame5 scmMcu5 = ByteToScmMcu1Frame5(canRecDatas); recMsg.containFeekBkMtclVersion = true; recMsg.FeekBkMtclVersion = scmMcu5.sys_type_isg.ToString("X2") + "." + scmMcu5.mcu_type_isg.ToString("X2") + "." + scmMcu5.soft_rev_isg.ToString("X2") + "." + scmMcu5.cmc_pro_ver_isg.ToString("X2") + "." + scmMcu5.rating_data_isg[0].ToString("X2") + scmMcu5.rating_data_isg[1].ToString("X2"); break; } default: //continue; //其他ID的数据一律不接收 break; } return(recMsg); //推送数据 }
/// <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 Scm_MCU1_Frame1.canId: //反馈第一帧,使能,方向,扭矩,转速 { Scm_MCU1_Frame1 scmMcu1 = ByteToScmMcu1Frame1(canRecDatas); //工作模式 recMsg.containFeedBkMtclMode = true; switch (scmMcu1.eop_ctrl_mod_act) { case 0: recMsg.FeedBkMtclMode = Ecm_WorkMode.None; break; //初始化 case 1: recMsg.FeedBkMtclMode = Ecm_WorkMode.SpeedMode; break; //转速环 case 2: recMsg.FeedBkMtclMode = Ecm_WorkMode.TorqueMode; break; //转矩环 default: recMsg.FeedBkMtclMode = Ecm_WorkMode.ErrorProtected; break; } //实际电流 recMsg.containFeedBkDcCurrent = true; recMsg.FeedBkDcCurrent = scmMcu1.eop_act_i; //转速 recMsg.containFeedBkMotorSpeed = true; recMsg.FeedBkMotorSpeed = scmMcu1.eop_spd_acu; //故障码 recMsg.containFeedBkErrorCode = true; recMsg.FeedBkErrorCode = new byte[1] { scmMcu1.eop_error_code }; //故障名称 recMsg.containFeedBkErrorStr = true; recMsg.FeedBkErrorStr = ReceiveErrorTransform(scmMcu1.eop_error_code); break; } default: //continue; //其他ID的数据一律不接收 break; } return(recMsg); //推送数据 }
/// <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); //推送数据 }