/// <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);
        }
Exemple #5
0
 public abstract ScmCanReceiveMsg TransformMcuReceiveData(CanStandardData canRecDatas);
Exemple #6
0
        /// <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); //推送数据
        }