conductor_tension/core.cs

301 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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/T5: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;
}
}
}