/// <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);
        }