/// <summary> /// 计算绝缘子串的风荷载和垂直荷载 /// </summary> public void CalsStrLoad() { foreach (var weaItem in WireData.WeatherParas.WeathComm) { double wload = Math.Round(ElecCalsToolBox2.StringWind(HangStr.PieceNum, HangStr.LNum, HangStr.GoldPieceNum, weaItem.IceThickness, weaItem.WindSpeed, weaItem.BaseWindSpeed, out string str1), 3); double vload = HangStr.Weight + WeightIceIn(weaItem.IceThickness) * (HangStr.PieceNum * HangStr.LNum + HangStr.GoldPieceNum); StrLoad.Add(weaItem.Name, new StrLoadResult { WindLoad = wload, VerLoad = vload, }); } WindArea = 0.04 * (HangStr.PieceNum * HangStr.LNum + HangStr.GoldPieceNum); }
/// <summary> /// /// </summary> /// <param name="span"></param> public override void CalDFCure(double span, double repStrLen, double cl, char terrainType, double wireHei) { double bzHighTemp = WireData.BzDic["最高气温"].BiZai; double ylHighTemp = WireData.YLTableXls["最高气温"]; HC1 = Math.Round(bzHighTemp / ylHighTemp / 8 * Math.Pow(span, 2), 1); HC2 = SpaceStr.GDHei - repStrLen - cl; HC = Math.Min(HC1, HC2); double windHBizai = WireData.BzDic["换算最大风速"].HorBizai; double windVBizai = WireData.BzDic["换算最大风速"].VerBizai; WindAngle = Math.Atan(windHBizai / windVBizai) / Math.PI * 180; CalHei = SpaceStr.GDHei - (repStrLen + 2d / 3 * HC) * Math.Cos(WindAngle / 180 * Math.PI); WireWindPara = ElecCalsToolBox2.UZFunction(CalHei, terrainType, wireHei); double terrainPara = ElecCalsToolBox2.TerrainValue(terrainType); StrWindPara = Math.Round(Math.Pow(SpaceStr.GDHei / wireHei, terrainPara * 2), 3); }
/// <summary> /// 计算跳线绝缘子串的风荷载 /// </summary> /// <param name="volt">电压</param> /// <param name="anSideWkCdtList">另一侧的工况</param> public void CalsWindLoad(string volt, List <ElecCalsWorkCondition> anSideWkCdtList) { foreach (var weaItem in WireData.WeatherParas.WeathComm) { var anWea = anSideWkCdtList.Where(wea => wea.Name == weaItem.Name).FirstOrDefault(); JumpStrLoadResult rslt = new JumpStrLoadResult(); rslt.Temperature = weaItem.Temperature; //冰厚,风速和基本风速需要比较大号侧和小号侧相应的工况,取其中的较大值 rslt.IceThickness = (anWea != null && anWea.IceThickness > weaItem.IceThickness) ? anWea.IceThickness : weaItem.IceThickness; rslt.WindSpeed = (anWea != null && anWea.WindSpeed > weaItem.WindSpeed) ? anWea.WindSpeed : weaItem.WindSpeed; rslt.BaseWindSpeed = (anWea != null && anWea.BaseWindSpeed > weaItem.BaseWindSpeed) ? anWea.BaseWindSpeed : weaItem.BaseWindSpeed; rslt.JumpStrWindLoad = Math.Round(ElecCalsToolBox2.StringWind(JumpStr.PieceNum, JumpStr.LNum, JumpStr.GoldPieceNum, rslt.IceThickness, rslt.WindSpeed, rslt.BaseWindSpeed, out string str1), 3); rslt.JumpWindLoad = Math.Round(ElecCalsToolBox2.WindPaT(volt, JmWireData.Dia, rslt.IceThickness, rslt.WindSpeed, rslt.BaseWindSpeed, out string str2) / 1000, 3) * JumpStr.SoftLineLen; rslt.SuTubleWindLoad = Math.Round(ElecCalsToolBox2.WindPaT(volt, JumpStr.SuTubleDia, rslt.IceThickness, rslt.WindSpeed, rslt.BaseWindSpeed, out string str3) / 1000, 3) * JumpStr.SuTubleLen; JumpStrLoad.Add(weaItem.Name, rslt); } }
/// <summary> /// 计算给定档距下各个工况的应力 /// </summary> /// <param name="span"></param> /// <returns></returns> protected Dictionary <string, double> CalFTable(double span) { if (bGrd == 0) { EffectPara = SideParas.IndEffectPara; SafePara = SideParas.IndSafePara; AvePara = SideParas.IndAnPara; } else if (bGrd == 1) { EffectPara = SideParas.GrdEffectPara; SafePara = SideParas.GrdSafePara; AvePara = SideParas.GrdAnPara; } else { //为什么单独给OPGW列出来呢,这样使用还不方便 OPGWEffectPara = SideParas.OPGWEffectPara; OPGWSafePara = SideParas.OPGWSafePara; OPGWAnPara = SideParas.OPGWAnPara; EffectPara = SideParas.OPGWEffectPara; SafePara = SideParas.OPGWSafePara; AvePara = SideParas.OPGWAnPara; } #region 照Excel的算法 var maxWindWkCdt = WeatherParas.WeathComm.Where(item => item.Name == "换算最大风速").First(); var minTempWkCdt = WeatherParas.WeathComm.Where(item => item.Name == "最低气温").First(); var maxIceWkCdt = WeatherParas.WeathComm.Where(item => item.Name == "最大覆冰").First(); var aveTempWkCdt = WeatherParas.WeathComm.Where(item => item.Name == "平均气温").First(); List <ElecCalsWorkCondition> wkCdtList = new List <ElecCalsWorkCondition>(); wkCdtList.Add(maxWindWkCdt); wkCdtList.Add(minTempWkCdt); wkCdtList.Add(maxIceWkCdt); wkCdtList.Add(aveTempWkCdt); CtrlStress = Math.Round(Fore / Sec / CommParas.GraAcc * EffectPara / SafePara, 3); AvaStress = Math.Round(Fore / Sec / CommParas.GraAcc * EffectPara * AvePara / 100, 3); CtrlGkName = ElecCalsToolBox2.GetCtrlWorkConditionName(BzDic, wkCdtList, span, Elas, CtrlStress, AvaStress, Coef); CtrlGkStress = CtrlGkName == "平均气温" ? AvaStress : CtrlStress; CtrlGk = WeatherParas.WeathComm.Where(item => item.Name == CtrlGkName).First(); YLTableXls = new Dictionary <string, double>(); foreach (var wd in WeatherParas.WeathComm) { double stress = ElecCalsToolBox2.StressNew(CtrlGkStress, BzDic[CtrlGkName].BiZai, CtrlGk.Temperature, Math.Round(Elas / CommParas.GraAcc, 0), Coef, span, BzDic[wd.Name].BiZai, wd.Temperature); YLTableXls.Add(wd.Name, stress); } #endregion //最大允许应力 double maxPerFor = Fore * CommParas.NewPerPara / SafePara / Sec; MaxPerFor = maxPerFor / CommParas.GraAcc; //年均应力 double avePerFor = Fore * CommParas.NewPerPara * AvePara / Sec; AvePerFor = avePerFor / CommParas.GraAcc / 100; //控制工况计算 //存储中间计算结果 Dictionary <string, double> YLCalDic = new Dictionary <string, double>(); Dictionary <string, double> ForCalDic = new Dictionary <string, double>(); foreach (var nameWd in WeatherParas.NameOfCtrWkCdt) { double calFor = nameWd != "平均气温" ? maxPerFor : avePerFor; //均采用综合比载计算 double calBz = BzDic[nameWd].g7; double temVal = WeatherParas.WeathComm.Where(item => item.Name == nameWd).First().Temperature; double fm = (Elas * Math.Pow(calBz, 2) * Math.Pow(span, 2) / 24 / Math.Pow(calFor, 2)) - (calFor + Coef * Elas * temVal); YLCalDic.Add(nameWd, fm); //存储每个工况初始控制应力取值 ForCalDic.Add(nameWd, calFor); } //确定控制工况 //存储各个工况应力,采用字典模式 Dictionary <string, double> ForDic = new Dictionary <string, double>(); YLCalDic = (from entry in YLCalDic orderby entry.Value descending select entry).ToDictionary(pair => pair.Key, pair => pair.Value); string CtrName = YLCalDic.First().Key; double CtrFm = YLCalDic.First().Value; ForDic.Add(CtrName, ForCalDic[CtrName]); //将控制工况存储下来 CtrNaSave = CtrName; CtrYLSave = CtrFm; foreach (var wd in WeatherParas.WeathComm) { if (wd.Name == CtrName) { continue; } double calBz = BzDic[wd.Name].g7; double temVal = WeatherParas.WeathComm.Where(item => item.Name == wd.Name).First().Temperature; double temA = CtrFm + Coef * Elas * temVal; double temB = Elas * Math.Pow(calBz, 2) * Math.Pow(span, 2) / 24; double calFor = ElecCalsToolBox.caculateCurDelta(temA, temB); ForDic.Add(wd.Name, calFor); } return(ForDic); }
/// <summary> /// #计算导线比载,默认采用老规范计算,计算参数取1,新规范取2 /// </summary> /// <param name="CalType"></param> public void CalBZ(int CalType = 1) { //计算比载 var graAcc = CommParas.GraAcc; BzDic = new Dictionary <string, BZResult>(); //换算最大风速值 var maxWindCon = WeatherParas.WeathComm.Where(item => item.Name == "换算最大风速").First().WindSpeed; var maxWindSt = WeatherParas.WeathComm.Where(item => item.Name == "最大风速").First().WindSpeed; double maxUpbaWindSt = 0, maxUpbaWindCon = 0; //如果存在不均匀风工况 if (WeatherParas.WeathComm.Where(item => item.Name == "不均匀风").Count() > 0) { maxUpbaWindSt = WeatherParas.WeathComm.Where(item => item.Name == "不均匀风").First().WindSpeed; maxUpbaWindCon = WeatherParas.WeathComm.Where(item => item.Name == "换算不均匀风").First().WindSpeed; } //g1为统一值 Comg1 = Wei * graAcc / Sec; foreach (var weaItem in WeatherParas.WeathComm) { if (CalType == 1) { BZResult bz = new BZResult(); //温度 var temVal = weaItem.Temperature; double winVal; // 大风工况采用换算后的数值计算 if (weaItem.Name == "最大风速") { winVal = maxWindCon; } else if (weaItem.Name == "不均匀风") { winVal = maxUpbaWindCon; } else { winVal = weaItem.WindSpeed; } double iceVal = weaItem.IceThickness; double alpha = ElecCalsToolBox.WindAlpha(winVal, iceVal, 1); bz.g1 = Comg1; double g2 = graAcc * 0.9 * Math.PI * iceVal * (iceVal + Dia) * 1e-3 / Sec; bz.g2 = g2; double g3 = Comg1 + g2; bz.g3 = g3; // Usc系数不区分覆冰与不覆冰 double usc = ElecCalsToolBox.WindEpson(iceVal, Dia); //横向比载 double g4 = 0.625 * Math.Pow(winVal, 2) * Dia * alpha * usc * 1e-3 / Sec; bz.g4 = g4; //在覆冰计算中,计入覆冰增大系数 double bex = ElecCalsToolBox.WindLoadEnlargeCoe(iceVal); double g5 = 0.625 * Math.Pow(winVal, 2) * (Dia + 2 * iceVal) * alpha * usc * bex * 1e-3 / Sec; bz.g5 = g5; double g6 = Math.Sqrt(Math.Pow(Comg1, 2) + Math.Pow(g4, 2)); bz.g6 = g6; double g7 = Math.Sqrt(Math.Pow(g3, 2) + Math.Pow(g5, 2)); bz.g7 = g7; //按照Excel的算法 bz.BiZai = ElecCalsToolBox2.BiZai(Wei * 1000, Dia, Sec, weaItem.IceThickness, weaItem.WindSpeed, weaItem.BaseWindSpeed) / 1000; bz.HorBizai = ElecCalsToolBox2.BiZaiH(Dia, weaItem.IceThickness, weaItem.WindSpeed, weaItem.BaseWindSpeed, Sec) / 1000; bz.VerHezai = ElecCalsToolBox2.Weight(Wei * 1000, Dia, weaItem.IceThickness) / 1000; bz.VerBizai = bz.VerHezai / Sec; bz.WindHezai = ElecCalsToolBox2.WindPa(CommParas.VoltStr, Dia, weaItem.IceThickness, weaItem.WindSpeed, weaItem.BaseWindSpeed) / 1000; BzDic.Add(weaItem.Name, bz); } } }