using System; namespace conductortension { public partial class Core { //alpha 是膨胀系数 //E 弹性模量 //area 导线截面 //t 温度 // l 档距 public static double Fx(double E, double load, double tension, double alpha, double area, double t,double l) { return E * Math.Pow(load*l / tension, 2) / 24 - tension / area - alpha * E * t; } public static bool CalZhangLi(calStressLoadNew inPut, ref double ZhangLi) { //张力=T6 //计算最大使用张力 double ZuiDaShiYongZhangLi; //最大使用张力=计算拉断力*保证破断张力取计算拉断力的/安全系数 ZuiDaShiYongZhangLi = inPut.LaDuanLi * inPut.BaoZhengPoDuanZhangLiXiShu/100 / inPut.AnQuan; //ZuiDaShiYongZhangLi = inPut.LaDuanLi / inPut.AnQuan; //计算温度线膨胀系数 double XianPengZhang = inPut.XianPengZhang; //计算平均运行张力 //先判断年平均运行张力(%)是否为百分数,如果是百分数则变为小数计算。 if (inPut.NianPingJun > 100 || inPut.NianPingJun <= 0) { return false; } else if (inPut.NianPingJun >= 1) { inPut.NianPingJun = inPut.NianPingJun / 100; } double PingJunYunXingZhangLi = inPut.LaDuanLi * inPut.BaoZhengPoDuanZhangLiXiShu/100 * inPut.NianPingJun;///////////////////////////////////////////////////////////////////////年平均是20%还是0.2,这里要求的是小数 if (inPut.SheJiFengSuGaoDu == 0) { inPut.SheJiFengSuGaoDu = 10; } if (inPut.PingJunGaoDu == 0) { inPut.PingJunGaoDu = 20;//TODO:需要依据电压等级选择 } //double a, b, T1, T2, T3, T4, T5, T6; //计算待求工况比载 double DaiHeZai = 0; //待求工况比载 if (CalHeZai(inPut, ref DaiHeZai) == false) { return false; } //计算控制工况、气温、比载、应力 int KongZhiGongKuang;//1:最低气温,2:覆冰,3大风,4,年平均气温 double KongZhiQiWen; double KongZhiBiZai; double KongZhiYingLi; //临界档距表计算 //一、初始计算数组,5项分别代表:1:气温,2:荷载,3:容许张力,4:P/T,5:Fo=-(T+A*E*a*t)(N) double[] ChuShiZuiDiQiWen = new double[5]; //最低温 double[] ChuShiNianPingJun = new double[5]; //年平均气温 double[] ChuShiDaFeng = new double[5]; //大风 double[] ChuShiFuBing = new double[5]; //最大覆冰 //1:存储各工况温度 ChuShiZuiDiQiWen[0] = inPut.DiWen; ChuShiNianPingJun[0] = inPut.PingWen; ChuShiDaFeng[0] = inPut.FengWen; ChuShiFuBing[0] = inPut.BingWen; //定义各个工况结构体,将每个结构体中的待求工况设置为对应工况数据,因为计算荷载时前面写的计算荷载函数中调取的是待求工况的温度等信息,所以需要对应各个工况 calStressLoadNew ZuiDiWen = inPut; calStressLoadNew NianPingJun = inPut; calStressLoadNew DaFeng = inPut; calStressLoadNew FuBing = inPut; ZuiDiWen.DaiBing = ZuiDiWen.DiBing; ZuiDiWen.DaiFeng = ZuiDiWen.DiFeng; ZuiDiWen.DaiWen = ZuiDiWen.DiWen; NianPingJun.DaiBing = NianPingJun.PingBing; NianPingJun.DaiFeng = NianPingJun.PingFeng; NianPingJun.DaiWen = NianPingJun.PingWen; DaFeng.DaiBing = DaFeng.FengBing; double wind_velocity; wind_velocity = Math.Round(DaFeng.FengFeng * Math.Pow(DaFeng.PingJunGaoDu / DaFeng.SheJiFengSuGaoDu, 0.16), 2); DaFeng.DaiFeng = wind_velocity;//大风工况风速折算到平均高。 DaFeng.DaiWen = DaFeng.FengWen; FuBing.DaiBing = FuBing.BingBing; FuBing.DaiFeng = FuBing.BingFeng; FuBing.DaiWen = FuBing.BingWen; //2:计算并存储各个工况荷载 CalHeZai(ZuiDiWen, ref ChuShiZuiDiQiWen[1]); CalHeZai(NianPingJun, ref ChuShiNianPingJun[1]); CalHeZai(DaFeng, ref ChuShiDaFeng[1]); CalHeZai(FuBing, ref ChuShiFuBing[1]); //3:存储各工况容许张力 ChuShiZuiDiQiWen[2] = ZuiDaShiYongZhangLi; ChuShiNianPingJun[2] = PingJunYunXingZhangLi; ChuShiDaFeng[2] = ZuiDaShiYongZhangLi; ChuShiFuBing[2] = ZuiDaShiYongZhangLi; //4:计算并存储P/T 荷载/张力 ChuShiZuiDiQiWen[3] = ChuShiZuiDiQiWen[1] / ChuShiZuiDiQiWen[2]; ChuShiNianPingJun[3] = ChuShiNianPingJun[1] / ChuShiNianPingJun[2]; ChuShiDaFeng[3] = ChuShiDaFeng[1] / ChuShiDaFeng[2]; ChuShiFuBing[3] = ChuShiFuBing[1] / ChuShiFuBing[2]; //计算4个工况下的Fx by 杜孟远2020.4.17 //t_dangju 试探最大Fx时使用的档距 int[] MaxFxConditionFlag = new int[inPut.DangJu+1];//记录不同t_dangju下,哪种工况的Fx最大。1代表最低温,2代表年平均温,3代表大风,4代表覆冰。0位置元素无效。 MaxFxConditionFlag[0]=1; for (int t_dangju = inPut.DangJu-1; t_dangju <= inPut.DangJu; t_dangju++) { double Fx_dangjuZuiDiWen; double Fx_dangjuNianPingJun; double Fx_dangjuDaFeng; double Fx_dangjuFuBing; Fx_dangjuZuiDiWen = Fx(inPut.MoLiang, ChuShiZuiDiQiWen[1], ChuShiZuiDiQiWen[2], inPut.XianPengZhang, inPut.JieMianJi, ChuShiZuiDiQiWen[0], t_dangju); Fx_dangjuNianPingJun = Fx(inPut.MoLiang, ChuShiNianPingJun[1], ChuShiNianPingJun[2], inPut.XianPengZhang, inPut.JieMianJi, ChuShiNianPingJun[0], t_dangju); Fx_dangjuDaFeng = Fx(inPut.MoLiang, ChuShiDaFeng[1], ChuShiDaFeng[2], inPut.XianPengZhang, inPut.JieMianJi, ChuShiDaFeng[0], t_dangju); Fx_dangjuFuBing = Fx(inPut.MoLiang, ChuShiFuBing[1], ChuShiFuBing[2], inPut.XianPengZhang, inPut.JieMianJi, ChuShiFuBing[0], t_dangju); double maxFx; maxFx = Fx_dangjuZuiDiWen; MaxFxConditionFlag[t_dangju] = 1; if (maxFx < Fx_dangjuNianPingJun) { maxFx = Fx_dangjuNianPingJun; MaxFxConditionFlag[t_dangju] = 2; } if (maxFx < Fx_dangjuDaFeng) { maxFx = Fx_dangjuDaFeng; MaxFxConditionFlag[t_dangju] = 3; } if (maxFx < Fx_dangjuFuBing) { maxFx = Fx_dangjuFuBing; MaxFxConditionFlag[t_dangju] = 4; } if (MaxFxConditionFlag[t_dangju]!=MaxFxConditionFlag[t_dangju-1] )//有突变,找到了临界档距的范围 { double criticalSpan; double formerTension=0; double formerLoad=0; double formerTemperature=0; switch (MaxFxConditionFlag[t_dangju - 1]) { case 1: formerLoad = ChuShiZuiDiQiWen[1]; formerTension = ChuShiZuiDiQiWen[2]; formerTemperature = ChuShiZuiDiQiWen[0]; break; case 2: formerLoad = ChuShiNianPingJun[1]; formerTension = ChuShiNianPingJun[2]; formerTemperature = ChuShiNianPingJun[0]; break; case 3: formerLoad = ChuShiDaFeng[1]; formerTension = ChuShiDaFeng[2]; formerTemperature = ChuShiDaFeng[0]; break; case 4: formerLoad = ChuShiFuBing[1]; formerTension = ChuShiFuBing[2]; formerTemperature = ChuShiFuBing[0]; break; default: break; } double currentTension=0; double currentLoad=0; double currentTemperature=0; switch (MaxFxConditionFlag[t_dangju]) { case 1: currentLoad = ChuShiZuiDiQiWen[1]; currentTension = ChuShiZuiDiQiWen[2]; currentTemperature = ChuShiZuiDiQiWen[0]; break; case 2: currentLoad = ChuShiNianPingJun[1]; currentTension = ChuShiNianPingJun[2]; currentTemperature = ChuShiNianPingJun[0]; break; case 3: currentLoad = ChuShiDaFeng[1]; currentTension = ChuShiDaFeng[2]; currentTemperature = ChuShiDaFeng[0]; break; case 4: currentLoad = ChuShiFuBing[1]; currentTension = ChuShiFuBing[2]; currentTemperature = ChuShiFuBing[0]; break; default: break; } double t1=24 / inPut.MoLiang * (formerTension - currentTension) / inPut.JieMianJi; double t2=24 * inPut.XianPengZhang * (formerTemperature - currentTemperature) ; double t3= Math.Pow(formerLoad / formerTension, 2) - Math.Pow(currentLoad / currentTension, 2); criticalSpan = Math.Sqrt( (t1+ t2)/t3);//TODO:暂时不用 Console.WriteLine("{0}", criticalSpan); } //Console.WriteLine("{0}:{1}",t_dangju,MaxFxConditionFlag[t_dangju]); } Console.ReadKey(); ZhangLi = BaoLiuLiangWei(ZhangLi); return true; } public struct calStressLoadNew { public double WaiJing; //电线外径(mm) public double LaDuanLi; //电线计算拉断力(N) public double ZhongLiang; //电线单位重量(kg/km) public double JieMianJi; //电线截面积(mm2) public double MoLiang; //电线弹性模量(N/mm2) public double XianPengZhang; //电线线性膨胀系数(10e-6/C) public double AnQuan; //安全系数 public double NianPingJun; //年平均运行系数 //public double XinXian; //新线系数 //public double FuBingGuoZai; //覆冰过载系数 public double DiBing; //最低温工况覆冰(mm) public double DiFeng; //最低温工况风速(m/s) public double DiWen; //最低温工况气温(C) public double PingBing; //年平均温工况覆冰(mm) public double PingFeng; //年平均温工况风速(m/s) public double PingWen; //年平均温工况气温(C) public double BingBing; //最大覆冰工况覆冰(mm) public double BingFeng; //最大覆冰工况风速(m/s) public double BingWen; //最大覆冰工况气温(C) public double FengBing; //最大风工况覆冰(mm) public double FengFeng; //最大风工况风速(m/s) public double FengWen; //最大风工况气温(C) public double PingJunGaoDu; //导线平均高度(m) 20 public int CuCaoDu; //地面粗糙度类别(1-田野、乡村、山丘, 2-海岛, 3-城市) public double CuCaoDu_K; //地面粗糙度系数K public double CuCaoDu_a; //地面粗糙度指数a //public double TiXingXiShu; //电线体形系数 1.2 //public double FengYaBuJunYun; //风压不均匀系数(不需要可以删掉,计算得来) 0.75 public double DaiBing; //待求工况覆冰(mm) public double DaiFeng; //待求工况风速(m/s) public double DaiWen; //待求工况气温(C) public int DangJu; //档距(m) public double SheJiFengSuGaoDu; //设计基准风速高度 public double BaoZhengPoDuanZhangLiXiShu; //保证破断张力取计算拉断力的%,即张力系数 public double dxLoad; //线荷载 } public static bool CalHeZai(calStressLoadNew inPut, ref double HeZai) { // //综合荷载=Math.Pow(Math.Pow(垂直荷载,2)+Math.Pow(水平荷载,2),0.5) double ChuiZhiHeZai = 0; //垂直荷载=自重荷载+9.80665*0.9*PI*待求工况覆冰厚度*(待求工况覆冰厚度+导线直径)/1000 double ZiZhongHeZai = 0; //自重荷载=导线单位重量*9.80665/1000/ double bi = 1;//覆冰增大系数B //导线力学计算不考虑覆冰增大系数 by 杜孟远 20200406 double u;//体型系数 if (inPut.DaiBing > 0 || inPut.WaiJing < 17) u = 1.2; else u = 1.1; ZiZhongHeZai = inPut.ZhongLiang * 9.80665 / 1000;//'导线自荷载 ChuiZhiHeZai = 9.80665 * 0.9 * Math.PI * inPut.DaiBing * (inPut.DaiBing + inPut.WaiJing) / 1000; //'导线冰荷载 double a = 1;//定义风压不均匀系数a double dx3 = 0;// if (inPut.DaiBing == 0) //'无冰工况 { if (inPut.DaiFeng < 20) a = 1; else if (inPut.DaiFeng < 27) a = 0.85; else if (inPut.DaiFeng < 31.5) a = 0.75; else a = 0.7; dx3 = Math.Pow(inPut.DaiFeng, 2) * inPut.WaiJing * u * a * bi / 1600;// '导线无冰风荷载 } else { //a = 1; // '有冰工况定义风压不均匀系数a=1 dx3 = 1.2 * Math.Pow(inPut.DaiFeng, 2) * (inPut.WaiJing + 2 * inPut.DaiBing) * a * bi / 1600; // '导线有冰风荷载 } HeZai = Math.Sqrt(Math.Pow((ZiZhongHeZai + ChuiZhiHeZai), 2) + Math.Pow(dx3, 2));// '存储导线荷载 return true; } } }