Example #1
0
        /// <summary>
        /// 从报文提取 ECU设定参数
        /// </summary>
        /// <param name="packet">报文</param>
        /// <param name="extraPacket">额外的报文</param>
        /// <returns>ECU设定参数</returns>
        public static Models.Settings.ECUSetting TOECUSetting(byte[] packet, byte[] extraPacket, byte[] O2Packet, byte[] OBDPacket = null, byte[] AnticipateInjPacket = null)//LDC提取接收到的设置参数
        {
            System.Diagnostics.Debug.WriteLine("Begin Packet To Model ECUSetting");
            packet      = packet.PacketData(1).ToArray();
            extraPacket = extraPacket.PacketData(1).ToArray();
            O2Packet    = O2Packet.PacketData(1).ToArray();
            if (OBDPacket != null)
            {
                OBDPacket = OBDPacket.PacketData(1).ToArray();
            }
            if (AnticipateInjPacket != null)
            {
                AnticipateInjPacket = AnticipateInjPacket.PacketData(1).ToArray();
            }
            var model = new Models.Settings.ECUSetting();

            //  model.GasLevel[0] = 2;
            //model.BaseData[0] = packet[0];
            //model.BaseData[1] = packet[1];
            //model.BaseData[2] = packet[2];
            //model.BaseData[3] = packet[3];
            model.BaseData  = new int[] { packet[0], packet[1], packet[2], packet[3] };
            model.FuelType  = ValueConvert.FuelTypeFrom(packet[0]);  //LDCYG  1 字节 bit1:燃料类型, 0-LPG, 1-CNG;
            model.O2Numbers = ValueConvert.O2NumbersFrom(packet[0]); //O2Numbers //1 字节 bit2:氧传感器 Number of bank, 0-2 个, 1-1 个;
            //1 字节 bit4:MAP 传感器类型, 1-IGT013;
            //1 字节 bit5:转换时没有油气混和过度, 0-禁止, 1-允许;
            model.InjectionMode = ValueConvert.InjectionModeFrom(packet[0], packet[3]);//LDCYG  1 字节 bit6:喷射方式, 0-Sequential, 1-Full group;
            // 1 字节 bit7:燃气电磁阀提前打开, 0-取消, 1-选中;
            //是否为单燃料2 字节 bit0  //需修改2 字节 bit0:转换方式, 0-other, 1-Monofuel(单燃料);
            model.ExtraInjectionSensitivityEnable = (packet[1] & 2) != 2; //2 字节 bit1:额外喷射灵敏度, 0-选中, 1-取消;
            // 2 字节 bit3:Switch from PC, 0-disable, 1-enable;
            //2 字节 bit4:Switch, 0-off, 1-on;
            // 2 字节 bit5:MAP 传感器类型, 1-IGT025;
            model.AutoDiagnosis = (packet[2] & 0x08) == 0x08;                                                       //3 字节 bit3:启用诊断, 0-取消, 1-选中;
            // 3 字节 bit6:加速密集喷射处理, 0-禁止, 1-允许;
            model.RunningGasStrategy = ValueConvert.GasStrategiesFrom(packet[2], extraPacket[15], extraPacket[16]); //处理异常 //3 字节 bit7:高速运行, 0-燃气/燃油, 1-燃油增加; 0燃气(转速8500)  1-燃油增加   0燃油
            model.MinOilEn           = (packet[3] & 1) == 1;                                                        //4 字节 bit0:最小运行, 0-转回燃油, 1-燃油 ; 0燃气 0转回燃油(有转速)   1燃油(有转速)
            //4 字节 bit4:燃料顺序转换, 0-选中, 1-取消;
            //4 字节 bit6:喷射方式, 0-Sequential, 1-MJ-Sequential;
            //4 字节 bit7:OBD 适应性, 0-取消, 1-选中;
            model.AutoAdaptive = (packet[3] & 0x80) == 0x80;                                      //4 字节 bit7:OBD 适应性, 0-取消, 1-选中;
            model.Cylinders    = ValueConvert.CylindersFrom(packet[4]);                           //LDC  5 字节:发动机参数-缸数;三缸:0x07,四缸:0x0F;
            //model.Coils = ValueConvert.CoilNumsFrom(packet[5]);//LDC转速信号类型 增加 & 0x40
            model.RevolutionSignalType = ValueConvert.RevolutionSignalTypeFrom(packet[5]);        //LDC转速信号类型 增加 & 0x40
            model.RPMInjectionSelect   = ValueConvert.RPMInjectionSelectFrom(packet[5]);          //LDC RPMInjectionSelect增加
            model.RPMSource            = ValueConvert.RPMSourceFrom(packet[5]);                   // 6 字节:Bit6:0-Standard,1-Weak;Bit7:0-传感器,1-喷油嘴
            model.SwitchRPM            = ValueConvert.SwitchRPMFrom(packet[6], packet[7]);        //7、8 字节:切换转速;单位 rpm;已改
            model.SwitchMode           = ValueConvert.SwitchModeFrom(packet[6], packet[7]);       //切换方式 转速的最后一位
            model.SwitchTemp           = ValueConvert.SingleTempFrom(packet[8]);                  //9 字节:切换温度;范围:0~80,单位℃
            model.OverlapTimes         = ValueConvert.OverlapTimesFrom(packet[9]);                //10 字节:切换延时时间;单位 s;//LDC已改
            //11 字节:重叠时间;单位 20ms;
            model.OrderDelay         = ValueConvert.OrderDelayFrom(packet[11]);                   //12 字节:顺序切换延时;真接数字不用转换
            model.ReducerTempSens    = ValueConvert.TempSensFrom(packet[12]);                     // 13 字节:减压器温度传感器类型;10Kohm:0x04,4K7ohm:0x00,2Kohm:0x02;
            model.GasTempSens        = ValueConvert.TempSensFrom(packet[13]);                     //14 字节:燃气温度传感器类型;10Kohm:0x05,4K7ohm:0x00,2Kohm:0x02;
            model.OperationalPress   = ValueConvert.OperationalPressFrom(packet[14], packet[15]); //15、16 字节:燃气工作压力;单位 0.001bar//需修改
            model.MinimumPress       = ValueConvert.MinimumPressFrom(packet[16], packet[17]);     //17、18 字节:最小燃气压力;单位 0.001bar//需修改
            model.PressErrorTime     = ValueConvert.PressErrorTimeFrom(packet[18]);               // 19 字节:压力故障时间;单位 20ms;//同A8
            model.MiniGasTemp        = ValueConvert.SingleTempFrom(packet[19]);                   //20 字节:燃气最低温度;范围:-20~15,单位℃;//同A8
            model.InjectorType       = ValueConvert.InjectorTypeFrom(packet[20]);                 //LDCYG 21 字节:燃气喷轨类型;0x00:Matrix,0x12:3ohm,0x52:1ohm; 0x16:IGT
            model.LevelIndicatorSens = ValueConvert.LevelIndicatorSensFrom(packet[21]);           // 22 字节:液位传感器类型;//还需修改
            model.GasLevel           = ValueConvert.GasLevelSetFrom(packet[22], packet[23]        //液位传感器电压档   LDCYG
                                                                    , packet[24], packet[25]);
            if (packet.Count() >= 27)
            {
                model.BackTransitionTm = packet[26];
            }
            else
            {
                model.BackTransitionTm = 0xf000;
            }
            //model.MinGasRPM = ValueConvert.MinGasRPMFrom(packet[20]);
            //  model.RPMVoltage = ValueConvert.RPMVoltageFrom(packet[9]);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            model.ExtraData = new int[] { extraPacket[0], extraPacket[1], extraPacket[2], extraPacket[3], extraPacket[4] };
            if (AnticipateInjPacket != null)
            {
                model.AnticipateInjSetting = new int[] { AnticipateInjPacket[0], AnticipateInjPacket[1], AnticipateInjPacket[2], AnticipateInjPacket[3] }
            }
            ;
            else
            {
                model.AnticipateInjSetting = new int[] { 0xf0, 0xf0, 0xf0, 0xf0 }
            };
            //model.MinGasRPM = ValueConvert.MinGasRPMFrom(packet[20]);
            //model.ExtraInjectionCutting = (packet[4] & 1) == 1;
            model.HotStart    = ValueConvert.HotStartFrom(extraPacket[0]);
            model.Valvetronik = ValueConvert.ValvetronikFrom(extraPacket[0]);

            model.CompleteResetOfErrors  = (extraPacket[0] & 0x10) == 0x10; //OBD
            model.SelectiveResetOfErrors = (extraPacket[0] & 0x80) == 0x80; //OBD

            model.StartAndStop           = ValueConvert.StartAndStopForm(extraPacket[1]);
            model.InjetPositiveDrive     = ((extraPacket[4] & 0x01) == 0x01);
            model.ExtraInjectionCutting  = (extraPacket[0] & 1) == 1; //  1 字节 bit0:额外喷射断开, 0-取消, 1-选中;
            model.InjectorPositiveDriver = extraPacket[0] == 0x01;
            //   model.EngineType = ValueConvert.EngineTypeFrom(extraPacket[1]);
            model.Weak         = extraPacket[7];
            model.SpeedThicken = extraPacket[8];
            //////////model.RunningTijiTime = extraPacket[7] * 0.1f;
            //////////model.RunningOilCompensation = extraPacket[8] * 0.1f;
            //////////model.Lambda1Type = ValueConvert.LambdaTypeFrom(extraPacket[9]);//O2Packet
            model.ExtrainjSensitivity     = ValueConvert.ExtrainjSensitivityFrom(extraPacket[9], extraPacket[10]);      //额外喷射灵敏度
            model.ExtraInjectionIdentTime = ValueConvert.ExtraInjectionIdentTimeFrom(extraPacket[11], extraPacket[12]); //额外喷射起始时间
            model.MinGasRPM              = ValueConvert.MinGasRPMFrom(extraPacket[13], extraPacket[14]);                //最低转速  气的时候为00
            model.RunningMinRPM          = ValueConvert.RunningRPMFrom(extraPacket[15], extraPacket[16]);               //最高转速(低)
            model.RunningMaxRPM          = ValueConvert.RunningRPMFrom(extraPacket[17], extraPacket[18]);               //最高转速(高)
            model.RunningTijiTime        = ValueConvert.RunningTimeFrom(extraPacket[19], extraPacket[20]);
            model.RunningOilCompensation = ValueConvert.RunningTimeFrom(extraPacket[21], extraPacket[22]);

            //if (extraPacket.Length > 25)
            //{
            //    model.HighGasTempLowRPM = (sbyte)extraPacket[25];
            //    model.HighGasTempHighRPM = (sbyte)extraPacket[26];
            //}
            if (extraPacket.Length > 27)
            {
                model.GasFillTime = extraPacket[27];
            }
            //model.Lambda1HV = ValueConvert.SingleVoltageFrom(extraPacket[11]);
            //model.Lambda1LV = ValueConvert.SingleVoltageFrom(extraPacket[12]);
            //model.Lambda2HV = ValueConvert.SingleVoltageFrom(extraPacket[13]);
            //model.Lambda2LV = ValueConvert.SingleVoltageFrom(extraPacket[14]);
            //model.LambdaDelay = extraPacket[15];
            //model.LambdaInjectNum = extraPacket[16];

            //model.AutoAdaptive = extraPacket[18] == 0x01;
            //model.AdaptiveRange = extraPacket[19];
            //model.AutoStopAdaptive = extraPacket[20] == 0x01;
            //model.AdaptiveAssist = extraPacket[21] == 0x01;
            //model.ODBReverseAssist = extraPacket[22] == 0x01;
            //model.ODBAdaptRange = extraPacket[23];
            //model.ODBBank1Correct =ValueConvert.ConvetToSbyteSafe(extraPacket[24]);
            //model.ODBBank2Correct = ValueConvert.ConvetToSbyteSafe(extraPacket[25]);
            //model.ODBErrorAutoClear = ValueConvert.ODBErrorAutoClearFrom(extraPacket[26]);
            model.O2Type      = ValueConvert.O2TypeFrom(O2Packet[0]);
            model.Lambda1Type = ValueConvert.LambdaTypeFrom(O2Packet[1]);//O2Packet
            model.Lambda2Type = ValueConvert.LambdaTypeFrom(O2Packet[2]);

            if (OBDPacket != null)
            {
                model.OBDStandard = ValueConvert.OBDStandardFrom(OBDPacket[0]);
                model.Reserve     = OBDPacket[1];
                model.OBDType     = ValueConvert.OBDTypeFrom(OBDPacket[2]);
                if (OBDPacket.Length > 3)
                {
                    model.OBDAdaptiveRange = OBDPacket[3];
                }
            }


            System.Diagnostics.Debug.WriteLine("End Packet To Model ECUSetting");
            return(model);
        }