using MetroGauges.General;
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace MetroGauges.Model
{
///
/// MetroGaugeFormulae(限界计算公式)
///
public class KineModel : DataModel
{
public KineModel() { }
public KineModel(string strPosition, string name, double x, double y)
{
StrPosition = strPosition;
Name = name;
X = x;
Y = y;
}
///
/// 所在位置
///
public override PositionI Position
{
get
{
if (StrPosition == "受电弓")
{
return PositionI.Pantograph;
}
else if (StrPosition == "受流器")
{
return PositionI.Collector;
}
else if (StrPosition == "车体")
{
return PositionI.Body;
}
else if (StrPosition == "转向架构架")
{
return PositionI.BogieFrame;
}
else if (StrPosition == "簧下")
{
return PositionI.Unsprung;
}
else if (StrPosition == "轮缘")
{
return PositionI.Rim;
}
else if (StrPosition == "踏面")
{
return PositionI.Tread;
}
else
{
return PositionI.INVAIL;
}
}
}
#region Parameters
///
/// A型车:B型车
///
public static NMetro nMetro;
///
/// 工况
///
public static WorkCondition Condition;
///
/// 上受流切除向上:下受流释放反弹量
///
public static CollectorStatus collectorStatus;
///
/// 车辆限界-整体道床:碎石道床
///
public static Ballast m_Bal;
///
/// 站台:区间
///
public static Location location;
///
/// 直线:曲线
///
public static CurveType CurType;
///
/// 车辆运行环境
/// 88
public static General.Environment Env;
///
/// 判断高度阀点数
///
public static HeightValve heightValve;
///
/// 接触网物理性质
///
public static Physics Catenary;
///
/// 车轮物理性质
///
public static Physics Wheel;
///
/// 高架受电弓高度
///
public static ElvateHeight Eh;
///
/// 销内:销外
///
public static Pin pin;
///
/// 车辆结构
///
public static Structure structure;
///
/// 含钢轨内侧磨耗的最大轨距(mm)
///
private double l => 1441;
///
/// 轮对轮缘最大磨耗量时的最小外侧距(mm)
///
private double d => 1397;
///
/// 线路中心线横向位差值(mm)
///
private double Δ_c
{
get
{
switch (m_Bal)
{
case Ballast.Monolithic:
return 5;
case Ballast.Gravel:
return 25;
default:
return double.NaN;
}
}
}
///
/// 转向架轴箱轴承横向游隙(mm)
///
private double Δ_q1 => 1;
///
/// 车轮横向弹性变形量(mm)
///
private double Δ_q2
{
get
{
switch (Wheel)
{
case Physics.Flexibility:
return 2;
case Physics.Inflexibility:
return 0;
default:
return double.NaN;
}
}
}
///
/// 转向架一系弹簧横向弹性变形量(mm)
///
private double Δ_q3
{
get
{
switch (location)
{
case Location.Platform:
return 3;
case Location.Region:
return 6;
default:
return double.NaN;
}
}
}
///
/// 转向架中心销径向间隙及磨耗量(mm)
///
private double Δ_w1 => 0;
#region 用户设置参数
//public double result => 15;
private static double δ_w2;
///
/// 转向架二系弹簧相对名义中心位置的横向弹性变形量(mm)15~20:20~25
///
public double Δ_w2 { get => δ_w2; set { δ_w2 = value; OnPropertyChanged(); } }
//{
// get
// {
//switch (loc)
//{
// case Location.Platform:
// if (result >= 15 && result <= 20)
// {
// return result;
// }
// else
// {
// throw new ArgumentOutOfRangeException("Δ_w2需在15~20mm之间");
// }
// case Location.Region:
// if (result >= 20 && result <= 25)
// {
// return result;
// }
// else
// {
// throw new ArgumentOutOfRangeException("Δ_w2需在20~25mm之间");
// }
// default:
// return double.NaN;
//}
//}
//set
//{
//double result = 15;
//if (loc == Location.Platform)
//{
// if (value > 15 && value < 20)
// {
// result = value;
// }
// else
// {
// throw new ArgumentOutOfRangeException("位于站台时,Δ_w2需在15~20mm之间");
// }
//}
//else if (loc == Location.Region)
//{
// if (value > 20 && value < 25)
// {
// result = value;
// }
// else
// {
// throw new ArgumentOutOfRangeException("位于区间时,Δ_w2需在20~25mm之间");
// }
//}
//}
//}
private static double δX_Bxgpx;
///
/// 悬挂故障引起的车体横向偏移量(mm)
///
public double ΔX_Bxgpx { get => δX_Bxgpx; set { δX_Bxgpx = value; OnPropertyChanged(); } }
private static double δY_Bxgpx1;
///
/// 悬挂故障引起的车体竖向向上偏移量(mm)
///
public double ΔY_Bxgpx1 { get => δY_Bxgpx1; set { δY_Bxgpx1 = value; OnPropertyChanged(); } }
private static double δY_Bxgpx2;
///
/// 悬挂故障引起的车体竖向向下偏移量(mm)
///
public double ΔY_Bxgpx2 { get => δY_Bxgpx2; set { δY_Bxgpx2 = value; OnPropertyChanged(); } }
///
/// 转向架高度阀杆横向间距(mm)
///
private double _b_h;
public double b_h { get => _b_h; set { _b_h = value; OnPropertyChanged(); } }
///
/// 计算ΔXa 或ΔXi 时取线路最小平面曲线半径(m)
///
public double R_min;
///
/// 设备限界在曲线地段标准加宽量(mm)
///
public double ΔX_bz;
///
/// 车体销外AW3 上翘量/AW0 下垂量或车体销内AW0上拱量(mm)
///
public double ΔM_t9
{
get
{
switch (pin)
{
case Pin.Inside:
switch (Condition)
{
case WorkCondition.AW0:
return 8;
case WorkCondition.AW3:
return 0;
default:
return 0;
}
case Pin.Outside:
switch (Condition)
{
case WorkCondition.AW0:
return -5;
case WorkCondition.AW3:
return 0;
default:
return 0;
}
default:
return double.NaN;
}
}
}
private static double _n;
private static double _m;
///
/// 转向架计算断面至相邻轴距离
///
public double m { get => _m; set { _m = value; OnPropertyChanged(); } }
///
/// 车体计算断面至相邻中心销距离
///
public double n { get => _n; set { _n = value; OnPropertyChanged(); } }
private static double δX_txgpx;
///
/// 悬挂故障引起的构架横向偏移量(mm)
///
public double ΔX_txgpx { get => δX_txgpx; set { δX_txgpx = value; OnPropertyChanged(); } }
private static double δY_txgpx1;
///
/// 悬挂故障引起的构架竖向向上偏移量(mm)
///
public double ΔY_txgpx1 { get => δY_txgpx1; set { δY_txgpx1 = value; OnPropertyChanged(); } }
private static double δY_txgpx2;
///
/// 悬挂故障引起的构架竖向向下偏移量(mm)
///
public double ΔY_txgpx2 { get => δY_txgpx2; set { δY_txgpx2 = value; OnPropertyChanged(); } }
///
/// 曲线加宽校验补偿量(mm)(A2B2受电弓,A1B1撤下与接触轨接近部分轮廓线校核时)
///
private double _ΔX => 0;
#endregion
///
/// 轨道横向弹性变形量(mm)
///
private double Δ_e
{
get
{
switch (CurType)
{
case CurveType.Straight:
return 1;
case CurveType.Curve:
return 3;
default:
return double.NaN;
}
}
}
///
/// AW3 时载客不对称的计算载客重量(kg),AW0 时不对称的计算,载客重量为0
///
public double m_z
{
get
{
switch (nMetro)
{
case NMetro.A:
return 12600;
case NMetro.B:
return 10200;
default:
return double.NaN;
}
}
}
///
/// 转向架高度阀不感度(mm)
///
private double _f_2 => 5;
///
/// 两条钢轨的相对高度误差值(mm)
///
public double Δh_c1
{
get
{
switch (m_Bal)
{
case Ballast.Monolithic:
return 4;
case Ballast.Gravel:
return 10;
default:
return double.NaN;
}
}
}
///
/// 两条钢轨的相对高度的弹性变化量(mm)
///
public double Δh_c2
{
get
{
switch (m_Bal)
{
case Ballast.Monolithic:
return 1;
case Ballast.Gravel:
return 2;
default:
return double.NaN;
}
}
}
///
/// 车体受风面积(m2)
///
private double A_w
{
get
{
switch (nMetro)
{
case NMetro.A:
return 70;
case NMetro.B:
return 57;
default:
return double.NaN;
}
}
}
///
/// 风压 (N/m2)
///
private double P_w
{
get
{
switch (location)
{
case Location.Platform:
return 210;
case Location.Region:
return 400;
default:
return double.NaN;
}
}
}
///
/// 横向加速度(m/s2)
///
public double a_B
{
get
{
switch (location)
{
case Location.Platform:
switch (CurType)
{
case CurveType.Straight:
return 0.3;
case CurveType.Curve:
return 0.6;
default:
return double.NaN;
}
case Location.Region:
return 1.0;
default:
return double.NaN;
}
}
}
///
/// 受电弓相对车体横向晃动量(mm)
///
public double ΔS_hd => 25;
///
/// 轮对横向制造误差值(mm)
///
public double Δ_d => 2;
///
/// 转向架中心销安装定位误差值(mm)
///
public double ΔM_t1 => 1;
///
/// 转向架一系弹簧横向定位误差值(mm)
///
public double ΔM_t2 => 1;
///
/// 车体半宽横向制造误差值(mm)
///
public double ΔM_t3 => 5;
///
/// 车体表面设备安装误差值(mm)
///
public double ΔM_t4 => 2;
///
/// 受电弓横向安装误差值(mm)
///
private double ΔM_t5 => 5;
///
/// 车体倾斜量(mm)
///
private double ΔX_Bq => 15;
///
/// 车体侧墙高度(mm)
///
private double H_cq
{
get
{
switch (nMetro)
{
case NMetro.A:
return 2500;
case NMetro.B:
return 2300;
default:
return double.NaN;
}
}
}
///
/// 车底架边梁底面距轨顶平面高度(mm)
///
private double h_sj
{
get
{
switch (nMetro)
{
case NMetro.A:
return 870;
case NMetro.B:
return 870;
default:
return double.NaN;
}
}
}
///
/// 车辆一侧一系弹簧并列数
///
private double n_p => 4;
///
/// 每一轴箱一系弹簧垂向刚度值 (N/mm)
///
private double c_p
{
get
{
switch (nMetro)
{
case NMetro.A:
return 1200;
case NMetro.B:
return 1200;
default:
return double.NaN;
}
}
}
///
/// 转向架一系弹簧横向间距(mm)
///
private double b_p
{
get
{
switch (nMetro)
{
case NMetro.A:
return 1940;
case NMetro.B:
return 1930;
default:
return double.NaN;
}
}
}
///
/// 车辆一侧二系弹簧并列数,四点高度阀为2,三点高度阀为1,二点高度阀为0
///
private double n_s
{
get
{
switch (heightValve)
{
case HeightValve.Two:
return 0;
case HeightValve.Three:
return 1;
case HeightValve.Four:
return 2;
default:
return double.NaN;
}
}
}
///
/// 转向架一侧二系弹簧垂向刚度值 (N/mm)
///
private double c_s
{
get
{
switch (Condition)
{
case WorkCondition.AW0:
return 200;
case WorkCondition.AW3:
switch (nMetro)
{
case NMetro.A:
return 350;
case NMetro.B:
return 400;
default:
return double.NaN;
}
default:
return double.NaN;
}
}
}
///
/// 转向架二系弹簧横向间距(mm)
///
private double b_s
{
get
{
switch (nMetro)
{
case NMetro.A:
return 1880;
case NMetro.B:
return 1850;
default:
return double.NaN;
}
}
}
///
/// 每根抗侧滚扭杆的抗侧滚刚度(N.mm/rad)
///
private double K_φn
{
get
{
switch (nMetro)
{
case NMetro.A:
return 2.5 * 1E9;
case NMetro.B:
return 2.5 * 1E9;
default:
return double.NaN;
}
}
}
///
/// AW0 或含AW3 载客的车体重量(kg)
///
public double m_B
{
get
{
switch (Condition)
{
case WorkCondition.AW0:
return 23400;
case WorkCondition.AW3:
switch (nMetro)
{
case NMetro.A:
return 48000;
case NMetro.B:
return 42000;
default:
return double.NaN;
}
default:
return double.NaN;
}
}
}
///
/// 重力加速度(m/s2),取9.81m/s2
///
private double g => 9.81;
///
/// 车体重心距轨顶平面高度(mm)
///
private double h_sc
{
get
{
switch (Condition)
{
case WorkCondition.AW0:
switch (nMetro)
{
case NMetro.A:
return 1600;
case NMetro.B:
return 1450;
default:
return double.NaN;
}
case WorkCondition.AW3:
switch (nMetro)
{
case NMetro.A:
return 1800;
case NMetro.B:
return 1650;
default:
return double.NaN;
}
default:
return double.NaN;
}
}
}
///
/// 转向架一系弹簧上支承面距轨顶平面高度(mm)
///
private double h_cp
{
get
{
switch (nMetro)
{
case NMetro.A:
return 500;
case NMetro.B:
return 500;
default:
return double.NaN;
}
}
}
///
/// 转向架二系弹簧上支承面距轨顶平面高度(mm)
///
private double h_cs
{
get
{
switch (nMetro)
{
case NMetro.A:
return 890;
case NMetro.B:
return 860;
default:
return double.NaN;
}
}
}
///
/// 车体受风面积形心距轨顶平面高度(mm)
///
private double h_sw
{
get
{
switch (nMetro)
{
case NMetro.A:
return 2350;
case NMetro.B:
return 2350;
default:
return double.NaN;
}
}
}
///
/// 车辆地板面未能补赏的高度误差值(mm)
///
private double ΔM_t6 => 10;
///
/// 车体下部及吊挂物高度尺寸制造安装误差值(mm)
///
private double ΔM_t7 => -10;
///
/// 车体上部或上部安装设备的高度尺寸制造安装误差值(mm)
///
private double ΔM_t8 => 12;
///
/// 转向架构架横向制造误差值(mm)
///
private double ΔM_t10
{
get
{
switch (nMetro)
{
case NMetro.A:
return 2;
case NMetro.B:
return 2;
default:
return double.NaN;
}
}
}
///
/// 转向架构架向上竖向制造误差值(mm)
///
private double ΔM_t11
{
get
{
switch (nMetro)
{
case NMetro.A:
return 1.5;
case NMetro.B:
return 1.5;
default:
return double.NaN;
}
}
}
///
/// 转向架构架向下竖向制造误差值(mm);
///
private double ΔM_t12
{
get
{
switch (nMetro)
{
case NMetro.A:
return 1.5;
case NMetro.B:
return 1.5;
default:
return double.NaN;
}
}
}
///
/// 转向架簧下部分横向制造误差值(mm)
///
private double ΔM_t13 => 1;
///
/// 转向架簧下部分竖向制造误差值(mm)
///
private double ΔM_t14
{
get
{
switch (nMetro)
{
case NMetro.A:
return 1;
case NMetro.B:
return 1;
default:
return double.NaN;
}
}
}
///
/// 受流器横向安装误差值及受流器横向尺寸公差值(mm)
///
private double ΔM_t15 => 2;
///
/// 受流器竖向安装误差值及受流器竖向尺寸公差值(mm)
///
private double ΔM_t16 => 2;
///
/// 转向架一系弹簧竖向动挠度(mm)
///
private double Δf_p
{
get
{
switch (nMetro)
{
case NMetro.A:
return 12;
case NMetro.B:
return 15;
default:
return double.NaN;
}
}
}
///
/// 转向架二系弹簧竖向动挠度(mm)
///
private double Δf_s
{
get
{
switch (nMetro)
{
case NMetro.A:
return 15;
case NMetro.B:
return 20;
default:
return double.NaN;
}
}
}
///
/// 线路中心线竖向位差值(mm)
///
private double δ_c
{
get
{
switch (m_Bal)
{
case Ballast.Monolithic:
return 5;
case Ballast.Gravel:
return 10;
default:
return double.NaN;
}
}
}
///
/// 轨道竖向弹性变形量(mm)
///
private double δ_e
{
get
{
switch (m_Bal)
{
case Ballast.Monolithic:
return -2;
case Ballast.Gravel:
return -5;
default:
return double.NaN;
}
}
}
///
/// 轨道竖向磨耗量(mm)
///
private double δ_w0 => 10.0;
///
/// 车轮最大镟削量(mm)
///
private double δ_w1 => -35.0;
///
/// 两次镟轮间不可补偿的踏面磨耗量(mm)
///
private double _δ_w1
{
get
{
switch (Position)
{
case PositionI.Body:
return -12;
case PositionI.Rim:
return -8;
default:
return δ_w1;
}
}
}
///
/// 转向架一系弹簧空重车挠度变化量
///
private double f_1
{
get
{
switch (nMetro)
{
case NMetro.A:
return -25;
case NMetro.B:
return -19;
default:
return double.NaN;
}
}
}
///
/// 转向架一系弹簧垂向永久变形量(mm)
///
private double f_01 => -5.0;
///
/// 车轮竖向弹性变形量(mm)
///
private double _f_01
{
get
{
switch (Wheel)
{
case Physics.Flexibility:
return -1;
case Physics.Inflexibility:
return 0;
default:
return double.NaN;
}
}
}
///
/// 转向架二系弹簧垂向永久变形量(mm)
///
private double f_02 => 0;
///
/// 转向架二系弹簧空重车挠度变化量(mm)
///
private double f_2 => 5.0;
///
/// 车辆定距
///
public double a
{
get
{
switch (nMetro)
{
case NMetro.A:
return 15700;
case NMetro.B:
return 12600;
default:
return double.NaN;
}
}
}
///
/// 转向架固定轴距 A:2.5 B 2.2,2.3
///
public double p
{
get
{
switch (nMetro)
{
case NMetro.A:
return 2.5;
case NMetro.B:
return 2.3;
default:
return double.NaN;
}
}
}
///
/// 柔性架空线抬升量或刚性架空线安装误差(mm)
///
private double ΔJ_vd
{
get
{
switch (Catenary)
{
case Physics.Flexibility:
return 25;
case Physics.Inflexibility:
return 10;
default:
return double.NaN;
}
}
}
///
/// 架空线磨耗量(mm)
///
private double ΔJ_vw
{
get
{
switch (Catenary)
{
case Physics.Flexibility:
return 3.7;
case Physics.Inflexibility:
return 6;
default:
return double.NaN;
}
}
}
///
/// 受电弓炭精板磨耗量(mm)
///
private static double ΔS_vw => 15.0;
///
/// 轨道横向弹性变形直线与曲线差值
///
private double Δ_de => 0;
///
/// 上部受流器切除竖向向上位移量或下部受流工作释放反弹量(mm)
///
private double ΔH_vt
{
get
{
switch (collectorStatus)
{
case CollectorStatus.Upper:
return 55;
case CollectorStatus.Lower:
return 70;
default:
return double.NaN;
}
}
}
///
/// 接触轨距走行轨轨顶平面高度公差值(mm)
///
private double ΔC_vt => 6.0;//Δcvt取正公差+6mm
#endregion
///
/// 被比较式子
///
private double ComparedFormula => 2 * _f_2 / b_h;
///
/// 整车一系弹簧侧滚刚度 (N.mm/rad)
///
///
private double K_φp => 0.5 * n_p * c_p * b_p * b_p;
///
/// 整车二系弹簧侧滚刚度 (N.mm/rad)
///
///
private double K_φs => 0.5 * n_s * c_s * b_s * b_s + 2 * K_φn;
///
/// 含一、二系影响的重力倾角附加系数
///
///
private double S => m_B * g * ((h_sc - h_cp) / K_φp + (h_sc - h_cs) / K_φs);
///
/// 只含一系影响的重力倾角附加系数
///
private double S_1 => m_B * g * (h_sc - h_cp) / K_φp;
///
/// 只含二系影响的重力倾角附加系数
///
private double S_2 => m_B * g * (h_sc - h_cs) / K_φs;
#region 车辆限界
///
/// 侧风载荷引起侧倾的转换系数
///
private double C_h => (Y - h_cp) * (h_sw - h_cp) / K_φp + (Y - h_cs) * (h_sw - h_cs) / K_φs;
///
/// 横向加速度载荷引起侧倾的转换系数
///
private double _C_h => (Y - h_cp) * (h_sc - h_cp) / K_φp + (Y - h_cs) * (h_sc - h_cs) / K_φs;
///
/// 横向制造误差值(mm)
///
private double ΔM()
{
double result;
result = Squa(Δ_d / 2) + Squa(ΔM_t1) + Squa(ΔM_t2) + Squa(ΔM_t3) + Squa(ΔM_t4) + Squa(ΔM_t5) + Math.Sqrt(ΔX_Bq / H_cq * (Y - h_sj) * (Y - h_sj));
return result;
}
#region 车体横向平移和倾角产生横向偏移方向相同时
///
/// 车体侧倾横向偏移量(mm)
///
public double ΔX_Bcp()
{
//Formula
double F1 = 100 * m_z * g * (1 + S_1) / K_φp;
double F2 = 100 * m_z * g * (1 + S_2) / K_φs;
if (F2 > ComparedFormula)
{
F2 = ComparedFormula;
}
double F3 = Squa(Δh_c1 / 1500 * Y * (1 + S));
double F4 = Squa(Δh_c2 / 1500 * Y * (1 + S));
double F5 = Squa(A_w * P_w * (1 + S) * C_h);
double F6 = Squa(m_B * a_B * (1 + S) * _C_h);
double F7 = ΔS_hd;
if (Env == General.Environment.Tunnel)
{
F5 = 0.0;
}
if (Position != PositionI.Pantograph)
{
F7 = 0;
}
return F2 * Math.Abs(Y - h_cs) + F1 * Math.Abs(Y - h_cp) + Math.Sqrt(F3 + F4 + F5 + F6 + Squa(F7));
}
private double δX_BP()
{
double result;
double F1 = Math.Sqrt(Squa((l - d) / 2) + Squa(Δ_c));
double F2 = (Δ_q1 + Δ_q2 + Δ_q3);
double F3 = Δ_w1 + Δ_w2;
result = (F1 + F2 + F3) * (2 * n + a) / a + Δ_e + ΔM() + _ΔX + ΔX_Bxgpx + ΔX_Bcp();
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 横向平移和倾角产生横向偏移方向相同时,车体横向偏移量
///
public double ΔX_BP
{
get
{
double result = δX_BP();
if (Position != PositionI.Body)
{
result = double.NaN;
}
return result;
}
set
{
double result = δX_BP();
if (Position != PositionI.Body)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double δY_BPu()
{
double result;
double F1 = Squa(ΔM_t6) + Squa(ΔM_t8) + Squa(ΔX_Bq / H_cq * X);
double F2 = Squa(Δf_s * (2 * n + a) / a) + Squa(Δf_p * (2 * n + a) / a) + Squa(δ_c);
double F3 = 100 * m_z * g * (1 + S_2) / K_φs;
if (F3 > ComparedFormula)
{
F3 = ComparedFormula;
}
double F4 = 100 * m_z * g * (1 + S_1) / K_φp;
double F5 = Squa(Δh_c1 / 1500 * (1 + S) * X) + Squa(Δh_c2 / 1500 * (1 + S) * X);
double F6 = Squa(A_w * P_w * (1 + S) * X * ((h_sw - h_cp) / K_φp + (h_sw - h_cs) / K_φs));
double F7 = Squa(m_B * a_B * (1 + S) * X * ((h_sc - h_cp) / K_φp + (h_sc - h_cs) / K_φs));
if (Env == General.Environment.Tunnel)
{
F6 = 0.0;
}
result = ΔM_t9 + Math.Sqrt(F1) + Math.Sqrt(F2) - (X * F3 + X * F4 + ΔY_Bxgpx1 + Math.Sqrt(F5 + F6 + F7));
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 横向平移和倾角产生横向偏移方向相同时,车体竖向向上偏移量
///
public double ΔY_BPu
{
get
{
double result = δY_BPu();
if (Position != PositionI.Body)
{
result = double.NaN;
}
return result;
}
set
{
double result = δY_BPu();
if (Position != PositionI.Body)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
///
/// 横向平移和倾角产生横向偏移方向相同时,车体侧倾竖向偏移量
///
///
///
private double ΔY_Bcpd()
{
double result;
double F1 = 100 * m_z * g * (1 + S_2) / K_φs;
if (F1 > ComparedFormula)
{
F1 = ComparedFormula;
}
double F2 = 100 * m_z * g * (1 + S_1) / K_φp;
double F3 = Squa(Δf_s * (2 * n + a) / a) + Squa(Δf_p * (2 * n + a) / a) + Squa(δ_c);
double F4 = Squa(Δh_c1 / 1500 * (1 + S) * X) + Squa(Δh_c2 / 1500 * (1 + S) * X);
double F5 = Squa(A_w * P_w * (1 + S) * X * ((h_sw - h_cp) / K_φp + (h_sw - h_cs) / K_φs));
double F6 = Squa(m_B * a_B * (1 + S) * X * ((h_sc - h_cp) / K_φp + (h_sc - h_cs) / K_φs));
if (Env == General.Environment.Tunnel)
{
F5 = 0;
}
result = F1 * X + F2 * X + Math.Sqrt(F3 + F4 + F5 + F6);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
private double δY_BPd()
{
double result;
double F1 = Squa(ΔM_t6) + Squa(ΔM_t7) + Squa(ΔX_Bq / H_cq * X);
var value = f_01 + _f_01 + f_1 + f_02 + f_2 + δ_e + δ_w0 + _δ_w1;
result = value + Math.Sqrt(F1) + ΔY_Bxgpx2 + ΔY_Bcpd();
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 横向平移和倾角产生横向偏移方向相同时,车体竖向向下偏移量
///
public double ΔY_BPd
{
get
{
double result = δY_BPd();
if (Position != PositionI.Body)
{
result = double.NaN;
}
return result;
}
set
{
double result = δY_BPd();
if (Position != PositionI.Body)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
#endregion
#region 车体横向平移和倾角产生横向偏移方向相反时
private double _δX_BP()
{
double result;
double F1 = Math.Sqrt(Squa(l - d) / 2 + Squa(Δ_c));
double F2 = (Δ_q1 + Δ_q2 + Δ_q3);
double F3 = (Δ_w1 + Δ_w2);
result = (F1 + F2 + F3) * (2 * n + a) / a + Δ_e + ΔM() + _ΔX - ΔX_Bxgpx - ΔX_Bcp();
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 横向平移和倾角产生横向偏移方向相反时,车体横向偏移量
///
public double _ΔX_BP
{
get
{
double result = _δX_BP();
if (Position != PositionI.Body)
{
result = double.NaN;
}
return result;
}
set
{
double result = _δX_BP();
if (Position != PositionI.Body)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
/////
///// 横向平移和倾角产生横向偏移方向相反时,车体侧倾竖向偏移量
/////
/////
/////
//private double _ΔY_Bcpd()
//{
// double result;
// double F1 = 100 * m_z * g * (1 + S_2) / K_φs;
// double F2 = 100 * m_z * g * (1 + S_1) / K_φp;
// double F3 = Squa(Δf_s * (2 * n + a) / a) + Squa(Δf_p * (2 * n + a) / a) + Squa(δ_c);
// double F4 = Squa(Δh_c1 / 1500 * (1 + S) * X) + Squa(Δh_c2 / 1500 * (1 + S) * X);
// double F5 = Squa(A_w * P_w * (1 + S) * X * ((h_sw - h_cp) / K_φp + (h_sw - h_cs) / K_φs));
// double F6 = Squa(m_B * a_B * (1 + S) * X * ((h_sc - h_cp) / K_φp + (h_sc - h_cs) / K_φs));
// if (F1 > ComparedFormula)
// {
// F1 = ComparedFormula;
// }
// if (Env == General.Environment.Tunnel)
// {
// F5 = 0;
// }
// result = -F2 * X - F1 * X + F3 - Math.Sqrt(F4 + F5 + F6);
// return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
//}
private double _δY_BPu()
{
double result;
double F1 = Squa(ΔM_t6) + Squa(ΔM_t8) + Squa(ΔX_Bq / H_cq * X);
double F2 = Squa(Δf_s * (2 * n + a) / a) + Squa(Δf_p * (2 * n + a) / a) + Squa(δ_c);
double F3 = 100 * m_z * g * (1 + S_2) / K_φs;
if (F3 > ComparedFormula)
{
F3 = ComparedFormula;
}
double F4 = 100 * m_z * g * (1 + S_1) / K_φp;
double F5 = Squa(Δh_c1 / 1500 * (1 + S) * X) + Squa(Δh_c2 / 1500 * (1 + S) * X);
double F6 = Squa(A_w * P_w * (1 + S) * X * ((h_sw - h_cp) / K_φp + (h_sw - h_cs) / K_φs));
double F7 = Squa(m_B * a_B * (1 + S) * X * ((h_sc - h_cp) / K_φp + (h_sc - h_cs) / K_φs));
if (Env == General.Environment.Tunnel)
{
F6 = 0.0;
}
result = ΔM_t9 + Math.Sqrt(F1) + Math.Sqrt(F2) + X * F3 + X * F4 + ΔY_Bxgpx1 + Math.Sqrt(F5 + F6 + F7);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 横向平移和倾角产生横向偏移方向相反时,车体竖向向上偏移量
///
public double _ΔY_BPu
{
get
{
double result = _δY_BPu();
if (Position != PositionI.Body)
{
result = double.NaN;
}
return result;
}
set
{
double result = _δY_BPu();
if (Position != PositionI.Body)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double _δY_BPd()
{
double result;
double F1 = Squa(ΔM_t6) + Squa(ΔM_t7) + Squa(ΔX_Bq / H_cq * X);
double F2 = Squa(Δf_s * (2 * n + a) / a) + Squa(Δf_p * (2 * n + a) / a) + Squa(δ_c);
double F3 = 100 * m_z * g * (1 + S_2) / K_φs;
if (F3 > ComparedFormula)
{
F3 = ComparedFormula;
}
double F4 = 100 * m_z * g * (1 + S_1) / K_φp;
double F5 = Squa(Δh_c1 / 1500 * (1 + S) * X) + Squa(Δh_c2 / 1500 * (1 + S) * X);
double F6 = Squa(A_w * P_w * (1 + S) * X * ((h_sw - h_cp) / K_φp + (h_sw - h_cs) / K_φs));
double F7 = Squa(m_B * a_B * (1 + S) * X * ((h_sc - h_cp) / K_φp + (h_sc - h_cs) / K_φs));
result = f_01 + _f_01 + f_1 + f_02 + f_2 + δ_e + δ_w0 + _δ_w1 + Math.Sqrt(F1) + Math.Sqrt(F2) - (X * F3 + X * F4 + ΔY_Bxgpx2 + Math.Sqrt(F5 + F6 + F7));
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 横向平移和倾角产生横向偏移方向相反时,车体竖向向下偏移量
///
public double _ΔY_BPd
{
get
{
double result = _δY_BPd();
if (Position != PositionI.Body)
{
result = double.NaN;
}
return result;
}
set
{
double result = _δY_BPd();
if (Position != PositionI.Body)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
#endregion
private double δX_t()
{
double result;
double F1 = Math.Sqrt(Squa(l - d) / 2 + Squa(Δ_c));
double F2 = (Δ_q1 + Δ_q2 + Δ_q3);
double F3 = Squa(ΔM_t10) + Squa(Δ_d / 2);
double F4 = 100 * m_z * g * (1 + S_1) / K_φp;
double F5 = Squa(Δh_c1 / 1500 * Y * (1 + S_1));
double F6 = Squa(Δh_c2 / 1500 * Y * (1 + S_1));
double F7 = Squa(A_w * P_w * (1 + S_1) * (Y - h_cp) * (h_sw - h_cp) / K_φp);
double F8 = Squa(m_B * a_B * (1 + S_1) * (Y - h_cp) * (h_sc - h_cp) / K_φp);
if (Position == PositionI.Collector)
{
F3 = Squa(ΔM_t15) + Squa(Δ_d / 2);
}
if (Env == General.Environment.Tunnel)
{
F7 = 0.0;
}
result = (F1 + F2) * ((2 * m) + p) / p + Δ_e + Math.Sqrt(F3) + F4 * Math.Abs(Y - h_cp) + ΔX_txgpx + _ΔX + Math.Sqrt(F5 + F6 + F7 + F8);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 横向平移和倾角产生横向偏移方向相同,构架横向偏移量
///
public double ΔX_t
{
get
{
double result = δX_t();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
return result;
}
set
{
double result = δX_t();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double _δY_tu()
{
double result;
double F1 = ΔM_t11;
double F2 = Squa(Δf_p * ((2 * m + p) / p)) + Squa(δ_c);
double F3 = 100 * m_z * g * (1 + S_1) / K_φp;
double F4 = Squa(((Δh_c1 / 1500) * (1 + S_1)) * X);
double F5 = Squa(((Δh_c2 / 1500) * (1 + S_1)) * X);
double F6 = Squa(A_w * P_w * (1 + S_1) * X * (h_sw - h_cp) / K_φp);
double F7 = Squa(m_B * a_B * (1 + S_1) * X * (h_sc - h_cp) / K_φp);
if (Position == PositionI.Collector)
{
F1 = Squa(ΔM_t16);
}
if (Env == General.Environment.Tunnel)
{
F6 = 0.0;
}
result = F1 + F3 * X + _ΔX + ΔY_txgpx1 + Math.Sqrt(F2 + F4 + F5 + F6 + F7);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 竖向平移和倾角产生竖向偏移方向相反,构架竖向向上偏移量
///
public double _ΔY_tu
{
get
{
double result = _δY_tu();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
return result;
}
set
{
double result = _δY_tu();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double δY_td()
{
double result;
double F1 = ΔM_t12;
double F2 = 100 * m_z * g * (1 + S_1) / K_φp;
double F3 = Squa(Δf_p * ((2 * m + p) / p)) + Squa(δ_c);
double F4 = Squa(((Δh_c1 / 1500) * (1 + S_1)) * X);
double F5 = Squa(((Δh_c2 / 1500) * (1 + S_1)) * X);
double F6 = Squa((A_w * P_w) * (1 + S_1) * X * (h_sw - h_cp) / K_φp);
double F7 = Squa(m_B * a_B * (1 + S_1) * X * (h_sc - h_cp) / K_φp);
if (Position == PositionI.Collector)
{
F1 = ΔM_t16;
}
if (Env == General.Environment.Tunnel)
{
F6 = 0.0;
}
result = _f_01 + δ_w1 + f_01 + f_1 + δ_e + δ_w0 + F1 + F2 * X + _ΔX + ΔY_txgpx2 + Math.Sqrt(F3 + F4 + F5 + F6 + F7);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 竖向平移和倾角产生竖向偏移方向相同,构架竖向向下偏移量
///
public double ΔY_td
{
get
{
double result = δY_td();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
return result;
}
set
{
double result = δY_td();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double _δX_t()
{
double result;
double F1 = Math.Sqrt(Squa(l - d) / 2 + Squa(Δ_c));
double F2 = (Δ_q1 + Δ_q2 + Δ_q3);
double F3 = Squa(ΔM_t10) + Squa(Δ_d / 2);
double F4 = 100 * m_z * g * (1 + S_1) / K_φp;
double F5 = Squa(Δh_c1 / 1500 * Y * (1 + S_1));
double F6 = Squa(Δh_c2 / 1500 * Y * (1 + S_1));
double F7 = Squa(A_w * P_w * (1 + S_1) * (Y - h_cp) * (h_sw - h_cp) / K_φp);
double F8 = Squa(m_B * a_B * (1 + S_1) * (Y - h_cp) * (h_sc - h_cp) / K_φp);
if (Position == PositionI.Collector)
{
F3 = Squa(ΔM_t15) + Squa(Δ_d / 2);
}
if (Env == General.Environment.Tunnel)
{
F7 = 0.0;
}
result = (F1 + F2) * (2 * m + p) / p + Δ_e + Math.Sqrt(F3) + F4 * Math.Abs(Y - h_cp) - ΔX_txgpx + _ΔX - Math.Sqrt(F5 + F6 + F7 + F8);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 横向平移和倾角产生横向偏移方向相反,水平偏移量
///
public double _ΔX_t
{
get
{
double result = _δX_t();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
return result;
}
set
{
double result = _δX_t();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double δY_tu()
{
double result;
double F1 = ΔM_t11;
double F2 = Squa(Δf_p * ((2 * m + p) / p)) + Squa(δ_c);
double F3 = 100 * m_z * g * (1 + S_1) / K_φp;
double F4 = Squa(((Δh_c1 / 1500) * (1 + S_1)) * X);
double F5 = Squa(((Δh_c2 / 1500) * (1 + S_1)) * X);
double F6 = Squa(A_w * P_w * (1 + S_1) * X * (h_sw - h_cp) / K_φp);
double F7 = Squa(m_B * a_B * (1 + S_1) * X * (h_sc - h_cp) / K_φp);
if (Position == PositionI.Collector)
{
F1 = Squa(ΔM_t16);
}
if (Env == General.Environment.Tunnel)
{
F6 = 0.0;
}
result = F1 + Math.Sqrt(F2) - (F3 * X) + _ΔX - ΔY_txgpx1 - Math.Sqrt(F4 + F5 + F6 + F7);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 竖向平移和倾角产生竖向偏移方向相同,构架竖向向上偏移量
///
public double ΔY_tu
{
get
{
double result = δY_tu();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
return result;
}
set
{
double result = δY_tu();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double _δY_td()
{
double result;
double F1 = ΔM_t12;
double F2 = 100 * m_z * g * (1 + S_1) / K_φp;
double F3 = Squa(Δf_p * ((2 * m + p) / p)) + Squa(δ_c);
double F4 = Squa(((Δh_c1 / 1500) * (1 + S_1)) * X);
double F5 = Squa(((Δh_c2 / 1500) * (1 + S_1)) * X);
double F6 = Squa((A_w * P_w) * (1 + S_1) * X * (h_sw - h_cp) / K_φp);
double F7 = Squa(m_B * a_B * (1 + S_1) * X * (h_sc - h_cp) / K_φp);
if (Position == PositionI.Collector)
{
F1 = ΔM_t16;
}
if (Env == General.Environment.Tunnel)
{
F6 = 0.0;
}
result = _f_01 + δ_w1 + f_01 + f_1 + δ_e + δ_w0 + F1 + _ΔX + Math.Sqrt(F3) - ΔY_txgpx2 - F2 * X - Math.Sqrt(F4 + F5 + F6 + F7);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 竖向平移和倾角产生竖向偏移方向相反,构架竖向向下偏移量
///
public double _ΔY_td
{
get
{
double result = _δY_td();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
return result;
}
set
{
double result = _δY_td();
if (Position != PositionI.BogieFrame)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
#endregion
private double δX_w()
{
double result;
double F1 = Squa((l - d) / 2) + Squa(Δ_c);
double F2 = Squa(ΔM_t13) + Squa(Δ_d / 2);
double F3 = Squa(Δh_c1) + Squa(Δh_c2);
result = F1 + Δ_e + Math.Sqrt(F2) + Y / 1500 * Math.Sqrt(F3);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 簧下部分横向偏移量
///
public double ΔX_w
{
get
{
double result = δX_w();
if (Position != PositionI.Unsprung)
{
result = double.NaN;
}
return result;
}
set
{
double result = δX_w();
if (Position != PositionI.Unsprung)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double δY_wd()
{
double result;
double F1 = Squa(δ_c) + Squa(Δh_c1 / 1500 * X) + Squa(Δh_c2 / 1500 * X);
result = _f_01 + δ_w1 + δ_e + δ_w0 + ΔM_t14 + Math.Sqrt(F1);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 簧下部分竖向偏移量
///
public double ΔY_wd
{
get
{
double result = δY_wd();
if (Position != PositionI.Unsprung)
{
result = double.NaN;
}
return result;
}
set
{
double result = δY_wd();
if (Position != PositionI.Unsprung)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double δY_f()
{
double result;
double F1 = Squa(δ_c) + Squa(Δh_c1 / 2) + Squa(Δh_c2 / 2);
result = _δ_w1 + δ_e + δ_w0 + Math.Sqrt(F1);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 轮缘部分竖向偏移量
///
public double ΔY_f
{
get
{
double result = δY_f();
if (Position != PositionI.Rim)
{
result = double.NaN;
}
return result;
}
set
{
double result = δY_f();
if (Position != PositionI.Rim)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double δY_m()
{
double result;
double F1 = Squa(δ_c) + Squa(Δh_c1 / 2) + Squa(Δh_c2 / 2);
result = δ_e + δ_w0 + Math.Sqrt(F1);
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 踏面部分竖向偏移量
///
public double ΔY_m
{
get
{
double result = δY_m();
if (Position != PositionI.Tread)
{
result = double.NaN;
}
return result;
}
set
{
double result = δY_m();
if (Position != PositionI.Tread)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double δX_gu()
{
double result;
double F1 = Math.Sqrt(Squa(l - d) / 2 + Squa(Δ_c));
double F2 = (Δ_q1 + Δ_q2 + Δ_q3);
double F3 = (Δ_w1 + Δ_w2);
result = (F1 + F2 + F3) + Δ_e + ΔM() + ΔX_Bxgpx + ΔX_Bcp();
return Math.Round(result, decimals, MidpointRounding.AwayFromZero);
}
///
/// 受电弓横向偏移量
///
public double ΔX_gu
{
get
{
double result = δX_gu();
if (Position != PositionI.Pantograph)
{
result = double.NaN;
}
return result;
}
set
{
double result = δX_gu();
if (Position != PositionI.Pantograph)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
private double δY_gu()
{
return ΔJ_vd + ΔJ_vw + ΔS_vw;
}
///
/// 受电弓竖向向上偏移量(mm),注:柔性接触网和刚性接触网的ΔJvd 25,10, ΔJvw 3.7,6
///
public double ΔY_gu
{
get
{
double result = δY_gu();
if (Position != PositionI.Pantograph)
{
result = double.NaN;
}
return result;
}
set
{
double result = δY_gu();
if (Position != PositionI.Pantograph)
{
result = double.NaN;
}
result = value;
OnPropertyChanged();
}
}
///
/// 受流器横向偏移量(mm)
///
///
///
private double δX_sd()
{
return δX_t() + Δ_de;
}
///
/// 上部受流工作状态时受流器根部转轴点的竖向向上偏移量(mm)
///
private double δY_su1()
{
return δY_tu() + ΔM_t16;
}
///
/// 上部受流工作状态时受流器与接触轨接触点的竖向向上偏移量(mm)
///
private double δY_su2 => ΔC_vt;
///
/// 上部受流工作释放状态的竖向向上偏移量(mm)
///
private double δY_su3()
{
return δY_tu() + ΔH_vt + ΔM_t16;
}
///
/// 上部受流工作状态时受流器根部转轴的竖向向下偏移量(mm)
///
///
private double δY_sd1()
{
return δY_td() + ΔM_t16;
}
///
/// 上部受流工作状态时受流器与接触轨接触点的竖向向下偏移量(mm)
///
private double δY_sd2 => ΔC_vt;
///
/// 上部受流工作释放状态的竖向向下偏移量(mm)
///
private double δY_sd3()
{
return δY_td() + ΔM_t16;
}
///
/// 下部受流工作状态的竖向向上偏移量(mm)
///
private double δY_su4 => ΔC_vt;
///
/// 下部受流工作状态的竖向向下偏移量(mm)
///
private double δY_su5()
{
return δY_tu() + ΔH_vt + ΔM_t16;
}
///
/// 下部受流工作状态的竖向向下偏移量(mm)
///
private double δY_sd4 => ΔC_vt;
///
/// 下部受流工作释放状态的竖向向下偏移量(mm)
///
public double δY_sd5()
{
return δY_td() + ΔM_t16;
}
public static KineModel Copy(KineModel kine)
{
return new KineModel(kine.StrPosition, kine.Name, kine.X, kine.Y);
}
}
}