public static FunctionResult Execute(TechDoc3 TechDoc, TechVariables[] TVSArray) { CreateReferencList(TechDoc); //Общая оформительская часть TechDoc.SetMainBlock("Tag_MainText"); TechDoc.Add_TechNumberSection("Задача расчета"); TechDoc.Add_TechNumberLine("Задачей расчета является определение пропускной способности предохранительных клапанов, установленных на котле."); TechDoc.Add_TechLine(""); TechDoc.Add_TechNumberSection("Условия расчета"); TechDoc.Add_TechNumberLine("Расчет выполнен в соответствии с методиками расчета " + TechDoc.GetReference("PB10-574", "GOST24570")); TechDoc.Add_TechNumberLine("Данные для расчета приняты по:"); TechDoc.Add_TechLine(" - технической характеристике котла"); TechDoc.Add_TechLine(" - технической характеристике клапана " + TechDoc.GetReference("CATALOGKL")); TechDoc.Add_TechLine(""); //Расчёт TechFormulaA[] Var_G = new TechFormulaA[TVSArray.Length]; //для подсчёта пропускной способности на каждом участке var ListSuperHeatG = new List<TechFormula>(); //список пропускных способностей участков с перегревом (для заключения) //return new FunctionResult(true, "ok"); for (int N = 0; N < TVSArray.Length; N++) { TechVariables TVS = TVSArray[N]; #region Блок в котором происходит определение это перегретый пар или насыщенный и получаются температуры для них double VolumeSteam; double Temperature = TVS.GetTechVariable("T").getDoubleValue(); double PressureAbsolut = TVS.GetTechVariable("P_изб").getDoubleValue() + 0.1; double Bkr; double Kad; bool isSuperHeat = Math.Abs(Temperature) > Double.Epsilon; var DB = new TechDB(); if (isSuperHeat) { var SHP = new SuperHeatParam(); if (!DB.GetSuperHeatParam(ref SHP, PressureAbsolut, Temperature)) return new FunctionResult(false, "Значения параметров перегретого пара в базе не найдены"); Temperature = SHP.Temperature; VolumeSteam = SHP.VolumeSteam; Bkr = 0.546; Kad = 1.31; } else { var SP = new SaturationParam(); if (!DB.GetSaturationParam(ref SP, PressureAbsolut)) return new FunctionResult(false, "Значения параметров насыщеного пара в базе не найдены"); Temperature = SP.Temperature; VolumeSteam = SP.VolumeSteam; Bkr = 0.577; Kad = 1.35; } //Блок завершен #endregion //Установка переменных по умолчанию var Var_D = new TechFormulaC( TVS.GetTechVariable("D"), "" ); var Var_Pizb = new TechFormulaC( TVS.GetTechVariable("P_изб"), "" ); var Var_Count = new TechFormulaC( TVS.GetTechVariable("N"), "" ); var Var_F = new TechFormulaC( TVS.GetTechVariable("F"), TechDoc.GetReference("CATALOGKL")); var Var_A1 = new TechFormulaC( TVS.GetTechVariable("α_1"), TechDoc.GetReference("CATALOGKL")); var Var_T = new TechFormulaC( TVS.GetTechVariable("T").setDoubleValue(Temperature), TechDoc.GetReference("TEPLONORM")); var Var_V1 = new TechFormulaC("V_1", VolumeSteam, "Удельный объём пара перед предохранительным клапаном", "м³/кг", TechDoc.GetReference("TEPLONORM")); var Var_Bkr = new TechFormulaC("β_кр", Bkr, "Критическое отношение давлений", "", TechDoc.GetReference("GOST24570")); var Var_K = new TechFormulaC("K", Kad, "Показатель адиабаты", "", TechDoc.GetReference("GOST24570")); //Непосредственный расчет var Var_P1 = new TechFormulaA("P_1", "1,1∙P_изб", "Максимальное избыточное давление перед предохранительными клапанами", "МПа", TechDoc.GetReference("GOST24570")); Var_P1.AddVariable(Var_Pizb); if (!Var_P1.GetResult()) return new FunctionResult(false, "ERROR: " + Var_P1.MainDescription); var Var_P2 = new TechFormulaC("P_2", "0", "Давление за предохранительным клапаном", "МПа", TechDoc.GetReference("GOST24570")); if (!Var_P2.GetResult()) return new FunctionResult(false, "ERROR: " + Var_P2.MainDescription); var Var_IF1 = new TechFormulaL("P_1", "(P_2 + 0,1) ≤ (P_1 + 0,1)∙β_кр", "Условие применимости формулы для расчета пропускной способности предохранительных клапанов", "", TechDoc.GetReference("GOST24570")); Var_IF1.AddVariable(Var_P1); Var_IF1.AddVariable(Var_P2); Var_IF1.AddVariable(Var_Bkr); Var_IF1.GetResult(); //if (!Var_IF1.GetResult()) return new FunctionResult(false, "ERROR: " + Var_IF1.MainDescription); даже если условие не выполнено расчёт не прерывать var Var_A = new TechFormulaA("α", "0,9∙α_1", "Расчётный коэффициент расхода клапанов", "", TechDoc.GetReference("GOST24570")); Var_A.AddVariable(Var_A1); if (!Var_A.GetResult()) return new FunctionResult(false, "ERROR: " + Var_A.MainDescription); var Var_B1 = new TechFormulaA("B_1", "[0,5∙(2/(K+1))^(1/(K-1))∙√((K/(K+1)) )]∙1/√((P_1+0,1)∙V_1 )", "Коэффициент, учитывающий физико-химические свойства пара", "", TechDoc.GetReference("GOST24570")); Var_B1.AddVariable(Var_P1); Var_B1.AddVariable(Var_K); Var_B1.AddVariable(Var_V1); if (!Var_B1.GetResult()) return new FunctionResult(false, "ERROR: " + Var_B1.MainDescription); var Var_Gnp = new TechFormulaA("G", "10∙B_1∙α∙F∙(P_1 + 0,1)", "Количество пара, которое может пропустить клапан при полном открытии", "кг/час", TechDoc.GetReference("GOST24570")); Var_Gnp.AddVariable(Var_B1); Var_Gnp.AddVariable(Var_A); Var_Gnp.AddVariable(Var_F); Var_Gnp.AddVariable(Var_P1); if (!Var_Gnp.GetResult()) return new FunctionResult(false, "ERROR: " + Var_Gnp.MainDescription); Var_G[N] = new TechFormulaA("∑G" + ((TVSArray.Length > 1)? "_уч" + (N+1).ToString(): ""), "N∙G", "Суммарная пропускная способность предохранительных клапанов на участке", "кг/час", ""); Var_G[N].AddVariable(Var_Count); Var_G[N].AddVariable(Var_Gnp); if (!Var_G[N].GetResult()) return new FunctionResult(false, "ERROR: " + Var_G[N].MainDescription); if (isSuperHeat) ListSuperHeatG.Add(Var_G[N]); //для заключения //Оформительская часть TechDoc.Add_TechNumberSection("Данные для расчета участка" + ((TVSArray.Length > 1)? " " + (N+1).ToString(): "")); TechDoc.Add_TechLine(""); string CurrentSectorName = TVS.GetTechVariable("SectorName").Value; TechDoc.Add_Table(CurrentSectorName, 3, TVS.Variables.Count + 1); TechDoc.Set_TableALLRowHeight(CurrentSectorName, 8); TechDoc.Set_TableColumnWidth(CurrentSectorName, 1, 90); TechDoc.Set_TableColumnWidth(CurrentSectorName, 2, 15); TechDoc.Set_TableColumnWidth(CurrentSectorName, 3, 70); TechDoc.Set_TableColumnAlignment(CurrentSectorName, 1, 0, -1); TechDoc.Set_TableColumnAlignment(CurrentSectorName, 2, 0, 0); TechDoc.Set_TableColumnAlignment(CurrentSectorName, 3, 0, 0); TechDoc.Set_TableCellText(CurrentSectorName, 1, 1, "Тип теплоносителя"); if (isSuperHeat) TechDoc.Set_TableCellText(CurrentSectorName, 3, 1, "Перегретый пар"); else TechDoc.Set_TableCellText(CurrentSectorName, 3, 1, "Насыщенный пар"); int i = 2; foreach (var element in TVS.Variables) { TechDoc.Set_TableCellText(CurrentSectorName, 1, i, element.Description); TechDoc.Set_TableCellText(CurrentSectorName, 2, i, element.MU); TechDoc.Set_TableCellText(CurrentSectorName, 3, i, element.Value); i++; } TechDoc.Add_TechLine(""); TechDoc.Add_TechNumberSection("Расчет участка" + ((TVSArray.Length > 1)? " " + (N+1).ToString(): "")); var ListFormula = new List<TechFormula>(); ListFormula.Add(Var_P1); ListFormula.Add(Var_P2); ListFormula.Add(Var_Bkr); ListFormula.Add(Var_IF1); ListFormula.Add(Var_A); ListFormula.Add(Var_K); ListFormula.Add(Var_V1); ListFormula.Add(Var_B1); ListFormula.Add(Var_Gnp); ListFormula.Add(Var_G[N]); AddListFormula(TechDoc, ListFormula); } //завершение расчёта string NameVar = ""; foreach(TechFormulaA TF in Var_G) NameVar += TF.MainVariable + " + "; NameVar = NameVar.Substring(0, NameVar.Length - 3); var Var_MainG = new TechFormulaA("∑G", NameVar, "Суммарная пропускная способность всех предохранительных клапанов на котле", "", ""); foreach(TechFormulaA TF in Var_G) Var_MainG.AddVariable(TF); Var_MainG.GetResult(); var Var_MainIF = new TechFormulaL("∑∑G", "∑G ≥ D", "Условие суммарной пропускной способности всех предохранительных клапанов на котле", "", TechDoc.GetReference("GOST24570")); Var_MainIF.AddVariable(Var_MainG); Var_MainIF.AddVariable(new TechFormulaC(TVSArray[0].GetTechVariable("D"), "")); Var_MainIF.GetResult(); NameVar = ""; foreach(TechFormula TF in ListSuperHeatG) NameVar += TF.MainVariable + " + "; if (NameVar.Length >= 3) NameVar = NameVar.Substring(0, NameVar.Length - 3); var Var_MainIF2 = new TechFormulaL("∑∑GG", NameVar + " ≥ 0.5∙D", "Условие суммарной пропускной способности предохранительных клапанов, установленных за пароперегревателем", "", TechDoc.GetReference("PB10-574")); foreach(TechFormulaA TF in Var_G) Var_MainIF2.AddVariable(TF); Var_MainIF2.AddVariable(new TechFormulaC(TVSArray[0].GetTechVariable("D"), "")); Var_MainIF2.GetResult(); //оформление завершения расчёта TechDoc.Add_TechNumberSection("Заключение"); TechDoc.Add_TechLine(""); var LF = new List<TechFormula>(); LF.Add(Var_MainG); LF.Add(Var_MainIF); if (ListSuperHeatG.Count > 0) LF.Add(Var_MainIF2); AddListFormula(TechDoc, LF); //TechDoc.DrawBiblio(); //Отрисовка списка литературы //TechDoc.Refresh_TablesOfContents(); //Обновления содержания TechDoc.ClearTableList(); //Очистка имён таблиц return new FunctionResult(true, ""); }
public TechVariables Clone() { var newTVS = new TechVariables(); foreach (TechVariable TV in Variables) newTVS.AddTechVariable(TV.Clone()); return newTVS; }
//Функция получения основных переменных которые надо передавать в Execute public static TechVariables GetMainVariable() { var TVS = new TechVariables(); TVS.AddTechVariable(new TechVariable<string>("SectorName", "", "Имя участка где установлены клапаны", "")); TVS.AddTechVariable(new TechVariable<double>("D", "кг/час", "Паропроизводительность котла", "")); TVS.AddTechVariable(new TechVariable<double>("P_изб", "МПа", "Давление пара на участке (изб.)", "")); TVS.AddTechVariable(new TechVariable<double>("T", "°C", "Температура пара", "")); //если больше нуля то пар перегретый, в противном случае пар - насыщенный TVS.AddTechVariable(new TechVariable<int> ("N", "шт", "Количество клапанов на участке", "")); TVS.AddTechVariable(new TechVariable<string>("NameKlapan", "", "Наименование клапана", "")); TVS.AddTechVariable(new TechVariable<double>("F", "мм²", "Наименьшая площадь сечения проточной части", "")); TVS.AddTechVariable(new TechVariable<double>("α_1", "", "Коэф. расхода клапана", "")); return TVS; }