public static DimensionInfo Create(FileInfo file) { if (file is null || !File.Exists(file.FullName)) { throw new ArgumentNullException(nameof(file)); } using (StreamReader sr = File.OpenText(file.FullName)) { string json = sr.ReadToEnd(); DimensionInfo result = JsonConvert.DeserializeObject <DimensionInfo>(json); return(result); } }
public static DimensionInfo CreateDefault(int axleCount, DateTime time) { int vehicleCount = (int)Math.Ceiling(axleCount / 4.0); DimensionInfo dimensionInfo = new DimensionInfo(); dimensionInfo.BaseInfo.DetectionTime = time.ToString("yyyyMMddHHmmss"); for (int i = 0; i < vehicleCount; i++) { dimensionInfo.Coaches.Add(new CoachInfo(4)); dimensionInfo.Orders.Add(new PassOrder { Index = i, VehicleType = "CX" }); } return(dimensionInfo); }
public static DimensionInfo Analyze(byte[] Message) { DimensionInfo dimensinInfo = new DimensionInfo(); // 解析报头区 dimensinInfo.Head.Flag = Message[0]; //报头 dimensinInfo.Head.Length = BSum(Message[1], Message[2]); //长度 dimensinInfo.Head.MessageType = Message[3].ToString(); //种类 dimensinInfo.Head.LuYouCode = BSum(Message[4], Message[5]).ToString(); //路由号 dimensinInfo.Head.XinYuanCode = BSum(Message[6], Message[7]).ToString(); //本站号 dimensinInfo.Head.XinSuCode = BSum(Message[8], Message[9]).ToString(); //目的站号 dimensinInfo.Head.MessageLength = BSum(Message[10], Message[11]); //长度 // 解析基本信息区 dimensinInfo.BaseInfo.Flag = (char)Message[12]; //A区标志 dimensinInfo.BaseInfo.Length = BSum(Message[13], Message[14]); //长度 dimensinInfo.BaseInfo.StationCode = BSum(Message[15], Message[16], Message[17]); //探测站号 dimensinInfo.BaseInfo.DiscNo = BSum(Message[18], Message[19]); //探测站存盘号 //应在此处格式化日期为yyyyMMddHHmmss dimensinInfo.BaseInfo.DetectionTime = string.Format("{0}{1}{2}{3}{4}{5}", BSum(Message[20], Message[21]).ToString("0000"), Message[22].ToString("00"), Message[23].ToString("00"), Message[24].ToString("00"), Message[25].ToString("00"), Message[26].ToString("00")); //日期 dimensinInfo.BaseInfo.Type = ((char)Message[27]).ToString(); //客货 dimensinInfo.BaseInfo.TrainTimes = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}", ((char)Message[28]).ToString(), ((char)Message[29]).ToString(), ((char)Message[30]).ToString(), ((char)Message[31]).ToString(), ((char)Message[32]).ToString(), ((char)Message[33]).ToString(), ((char)Message[34]).ToString(), ((char)Message[35]).ToString(), ((char)Message[36]).ToString(), ((char)Message[37]).ToString()); dimensinInfo.BaseInfo.Direction = Message[38]; // 运行方向 dimensinInfo.BaseInfo.AVGSpeed = BSum(Message[39], Message[40]) / (double)100; // 平均速度 dimensinInfo.BaseInfo.MinSpeed = BSum(Message[41], Message[42]) / (double)100; // 最低速度 dimensinInfo.BaseInfo.MaxSpeed = BSum(Message[43], Message[44]) / (double)100; // 最高速度 dimensinInfo.BaseInfo.VehicleCount = BSum(Message[45], Message[46]); // 总辆数 dimensinInfo.BaseInfo.LocomotiveCount = Message[47]; // 机车数 dimensinInfo.BaseInfo.AxleCount = BSum(Message[48], Message[49]); // 总轴数 dimensinInfo.BaseInfo.State = (Message[50] == 0) ? ("正常") : (Message[50] == 1 ? "异常" : ""); // 运行状态 dimensinInfo.BaseInfo.OpenDoorCnt = BSum(Message[51], Message[52]); // 开门次数 dimensinInfo.BaseInfo.CloseDoorCnt = BSum(Message[53], Message[54]); // 关门次数 dimensinInfo.BaseInfo.StartCount = BSum(Message[55], Message[56]); // 开机次数 dimensinInfo.BaseInfo.IsExceed = (Message[57] == 0) ? ("无超标") : (Message[57] == 1 ? "有超标" : ""); // 是否超标 dimensinInfo.BaseInfo.IsDeviceFail = (Message[58] == 0) ? ("无故障") : (Message[58] == 1 ? "有故障" : ""); // 是否设备故障 // 轴距表区 int cursorIndex = 59; // 当前位置 cursorIndex = GetFlagIndex(cursorIndex, 'B', Message); dimensinInfo.AxleDistance = new AxisDistanceArea(dimensinInfo.BaseInfo.AxleCount) { Flag = (char)Message[cursorIndex], // B区标志; Length = BSum(Message[cursorIndex++], Message[cursorIndex++]), // 长度 TableLength = BSum(Message[cursorIndex++], Message[cursorIndex++]) // 轴距表长度 }; // 总轴数的 轴距初始化 for (int i = 0; i < dimensinInfo.BaseInfo.AxleCount; i++) { dimensinInfo.AxleDistance.AxleDistances[i] = BSum(Message[++cursorIndex], Message[++cursorIndex]); } // 轴距数组 单位:cm 以2550结束 cursorIndex = GetFlagIndex(++cursorIndex, 'C', Message); dimensinInfo.BaseInfo.VehicleFlag = (char)Message[cursorIndex++]; // 车辆信息区标志C dimensinInfo.BaseInfo.VehicleLength = BSum(Message[cursorIndex++], Message[cursorIndex++]); // 车辆信息区长度 ///////////////////////////////////////////////////////////////////////////////////// for (int TAi = 0; TAi < dimensinInfo.BaseInfo.VehicleCount; TAi++) { //char SIGchar = (char)M[m_CurI + 25]; if (((char)Message[cursorIndex] == 'J' || Message[cursorIndex + 24] < 128))// 机车 { LocomotiveInfo locomotive = new LocomotiveInfo(); locomotive.Index = TAi; //保存机车位置 locomotive.Property = (char)Message[cursorIndex++]; // 车辆信息 属性码 J机车 locomotive.VehicleModel = string.Format("{0}{1}{2}", (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++]); // 车辆种类 locomotive.VehicleNumber = string.Format("{0}{1}{2}{3}", (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++]); // 车辆车号 locomotive.Bureau = string.Format("{0}{1}", (char)Message[cursorIndex++], (char)Message[cursorIndex++]); // 配属局 locomotive.State = (char)Message[cursorIndex++]; // 机车状态 locomotive.KorH = (char)Message[cursorIndex++]; // 客货 locomotive.TrainTimes = string.Format("{0}{1}{2}{3}{4}{5}{6}", (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++]); //车次 locomotive.EndPosition = (char)Message[cursorIndex++]; // 端码 locomotive.AxleCount = Message[cursorIndex++]; // 轴数 cursorIndex++; locomotive.AeiEndPosition = (Message[cursorIndex] == 'A') ? ("一端位") : (Message[cursorIndex] == 'B' ? "二端位" : ""); // AEI 端位 locomotive.Speed = BSum(Message[cursorIndex++], Message[cursorIndex++]); // 速度 locomotive.HasAeiLabel = (char)Message[cursorIndex++]; // 车辆标志属性码,判断是否有标签 dimensinInfo.Locomotives.Add(locomotive); // 机车信息 PassOrder xlun = new PassOrder(); xlun.Index = dimensinInfo.Locomotives.Count - 1; xlun.VehicleType = "JC";//机车 dimensinInfo.Orders.Add(xlun); } else// if (M[m_CurI] == 128 || M[m_CurI] > 128) //车厢: 客车 || 货车 { CoachInfo cxin = new CoachInfo(); cxin.Flag = (char)Message[cursorIndex++]; // 标志T路用货车 或者Q企业自备车 cxin.Property = (char)Message[cursorIndex++]; // 车种 cxin.VehicleModel = string.Format("{0}{1}{2}{3}{4}", (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++]); // 车型 cxin.Name = string.Format("{0}{1}{2}{3}{4}{5}{6}", (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++]); //车号 cxin.HuanChang = string.Format("{0}.{1}", (char)Message[cursorIndex++], (char)Message[cursorIndex++]); // 换长?有待确定 cxin.Manufactor = (char)Message[cursorIndex++]; // 制造商 cxin.ProductionDate = string.Format("{0}{1}年{2}月", (char)Message[cursorIndex++], (char)Message[cursorIndex++], (char)Message[cursorIndex++]); // 制造日期 YY年M月 cxin.AxleCount = Message[cursorIndex++]; // 轴数 cxin.AeiEndPosition = (Message[cursorIndex] == 'A') ? ("一端位") : (Message[cursorIndex] == 'B' ? "二端位" : "");; // AEI 端位 cursorIndex++; cxin.Speed = BSum(Message[cursorIndex++], Message[cursorIndex++]).ToString(); cxin.HasAeiLabel = (char)Message[cursorIndex++]; // 车辆标志属性码,判断是否有标签 dimensinInfo.Coaches.Add(cxin); //车厢信息 PassOrder xlun = new PassOrder(); xlun.Index = dimensinInfo.Coaches.Count - 1; xlun.VehicleType = "CX";//货车 或者 客车 dimensinInfo.Orders.Add(xlun); } } // 轮对 dimensinInfo.BaseInfo.WheelSetFlag = (char)Message[cursorIndex++]; // 大写字母D //m_CurI = SearchSigIndex(m_CurI, 'D', M); dimensinInfo.BaseInfo.WheelSetLength = BSum(Message[cursorIndex++], Message[cursorIndex++], Message[cursorIndex++]); // 长度 foreach (PassOrder order in dimensinInfo.Orders) { if (order.VehicleType == "JC") // 机车轮对解析 { for (int wheelOrder = 0; wheelOrder < dimensinInfo.Locomotives[order.Index].AxleCount * 2; wheelOrder++) { WheelInfo wheel = new WheelInfo(); wheel.Name = Index2LR(wheelOrder); //名字 wheel.Diameter = BSum100(Message[cursorIndex++], Message[cursorIndex++], Message[cursorIndex++]); // 直径 wheel.FlangeThickness = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // 厚度 wheel.FlangeHeight = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // 高度 if ((wheelOrder % 2) == 0) { wheel.WheelsetDistance = BSum100(Message[cursorIndex++], Message[cursorIndex++], Message[cursorIndex++]); // 内侧距偶数有 ,奇数没有 } wheel.QR = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // QR 值 wheel.ChuiZhiChaoXian = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // 垂直磨耗超限 wheel.RimThickness = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // 轮辋厚度 wheel.TreadWear = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // 踏面磨耗深度 wheel.TaMianPointCount = Message[cursorIndex++]; // 踏面坐标点数 for (int PointIndex = 0; PointIndex < wheel.TaMianPointCount; PointIndex++) { wheel.PointCollection = wheel.PointCollection + string.Format("{0}{1},{2}{3};", ((Message[cursorIndex++] == 0) ? ("﹣") : ""), BSum10(Message[cursorIndex++], Message[cursorIndex++]), ((Message[cursorIndex++] == 0) ? ("﹣") : ""), BSum10(Message[cursorIndex++], Message[cursorIndex++])); //所有点的 字符串 x1,y1;x2,y2;x3,y3;…… } dimensinInfo.Locomotives[order.Index].Wheels.Add(wheel); //同转向架轮径差 if (wheelOrder % 4 == 3) { TongZhuanXiangLunJingCha tzxl = new TongZhuanXiangLunJingCha(); if (wheel.Diameter < tzxl.TongZhuanXiangLunJingMin) { tzxl.TongZhuanXiangLunJingMin = wheel.Diameter; } if (wheel.Diameter > tzxl.TongZhuanXiangLunJingMax) { tzxl.TongZhuanXiangLunJingMax = wheel.Diameter; } dimensinInfo.Locomotives[order.Index].TZXCs.Add(tzxl); } //同车轮径差 if (wheel.Diameter < dimensinInfo.Locomotives[order.Index].TongCheLunJingMin) { dimensinInfo.Locomotives[order.Index].TongCheLunJingMin = wheel.Diameter; } if (wheel.Diameter > dimensinInfo.Locomotives[order.Index].TongCheLunJingMax) { dimensinInfo.Locomotives[order.Index].TongCheLunJingMax = wheel.Diameter; } } } else if (order.VehicleType == "CX")// 车厢轮对解析 { for (int i = 0; i < dimensinInfo.Coaches[order.Index].AxleCount * 2; i++) { WheelInfo wheel = new WheelInfo(); wheel.Name = Index2LR(i); //名字 wheel.Diameter = BSum100(Message[cursorIndex++], Message[cursorIndex++], Message[cursorIndex++]); // 直径 wheel.FlangeThickness = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // 轮缘厚度 wheel.FlangeHeight = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // 高度 if ((i % 2) == 0) { wheel.WheelsetDistance = BSum100(Message[cursorIndex++], Message[cursorIndex++], Message[cursorIndex++]); // 内侧距偶数有 ,奇数没有 } wheel.QR = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // QR 值 wheel.ChuiZhiChaoXian = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // 垂直磨耗超限 wheel.RimThickness = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // 轮辋厚度 wheel.TreadWear = BSum100(Message[cursorIndex++], Message[cursorIndex++]); // 磨耗深度 wheel.TaMianPointCount = Message[cursorIndex++]; // 点数 for (int PointI = 0; PointI < wheel.TaMianPointCount; PointI++) { wheel.PointCollection = wheel.PointCollection + string.Format("{0}{1},{2}{3};", ((Message[cursorIndex++] == 0) ? ("﹣") : ""), BSum10(Message[cursorIndex++], Message[cursorIndex++]), ((Message[cursorIndex++] == 0) ? ("﹣") : ""), BSum10(Message[cursorIndex++], Message[cursorIndex++])); //所有点的 字符串 x1,y1;x2,y2;x3,y3;、、、、、、 } dimensinInfo.Coaches[order.Index].Wheels.Add(wheel); //同转向架轮径差 if (i % 4 == 3) { TongZhuanXiangLunJingCha tzxl = new TongZhuanXiangLunJingCha(); if (wheel.Diameter < tzxl.TongZhuanXiangLunJingMin) { tzxl.TongZhuanXiangLunJingMin = wheel.Diameter; } if (wheel.Diameter > tzxl.TongZhuanXiangLunJingMax) { tzxl.TongZhuanXiangLunJingMax = wheel.Diameter; } dimensinInfo.Coaches[order.Index].TZXCs.Add(tzxl); } //同车轮径差 if (wheel.Diameter < dimensinInfo.Coaches[order.Index].TongCheLunJingMin) { dimensinInfo.Coaches[order.Index].TongCheLunJingMin = wheel.Diameter; } if (wheel.Diameter > dimensinInfo.Coaches[order.Index].TongCheLunJingMax) { dimensinInfo.Coaches[order.Index].TongCheLunJingMax = wheel.Diameter; } } } } return(dimensinInfo); }