コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
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
            {
                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); //推送数据
        }
コード例 #5
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
            {
                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); //推送数据
        }
コード例 #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); //推送数据
        }