Пример #1
0
        private void MinMaxGraphs(GraphPane pane, int ID)
        {
            MathModel main = Owner as MathModel;
            List <MathModel.MinMax> minmax = new List <MathModel.MinMax>();

            minmax = main.GetMin_Max(ID);

            PointPairList MinPoints = new PointPairList();

            for (int j = 1; j <= n; j++)
            {
                MinPoints.Add(h * j * 60, minmax[0].min);
            }

            PointPairList MaxPoints = new PointPairList();

            for (int j = 1; j <= n; j++)
            {
                MaxPoints.Add(h * j * 60, minmax[0].max);
            }
            LineItem MinCurve = pane.AddCurve("", MinPoints, Color.Blue, SymbolType.None);
            LineItem MaxCurve = pane.AddCurve("", MaxPoints, Color.Blue, SymbolType.None);


            MinCurve.Line.Style = DashStyle.Dash;
            MinCurve.Line.Width = 3;
            MaxCurve.Line.Style = DashStyle.Dash;
            MaxCurve.Line.Width = 3;
        }
Пример #2
0
 private void MainForm_Load(object sender, EventArgs e)
 {
     if (!Program._IsAdmUser)
     {
         математическаяМодельToolStripMenuItem.Checked = true;
         математическаяМодельToolStripMenuItem.Enabled = false;
         СправочныйМатериалToolStripMenuItem.Checked   = false;
         СправочныйМатериалToolStripMenuItem.Enabled   = true;
         MathModel MathModel = new MathModel();
         MathModel.MdiParent = this;
         this.SetClientSizeCore(MathModel.Width + 4, MathModel.Height + 20 + 26 + 4);
         toolStripStatusLabel1.Text = "Математическая модель";
         //this.Size = SizeFromClientSize(MathModel.Size);
         MathModel.Show();
     }
     else if (Program._IsAdmUser)
     {
         модульToolStripMenuItem.Visible = false;
         AdmnForm admnForm = new AdmnForm();
         admnForm.MdiParent = this;
         this.SetClientSizeCore(admnForm.Width + 4, admnForm.Height + 20 + 26 + 4);
         toolStripStatusLabel1.Text = "Модуль администратора";
         //this.Size = SizeFromClientSize(MathModel.Size);
         admnForm.Show();
     }
 }
Пример #3
0
        private void математическаяМодельToolStripMenuItem_Click(object sender, EventArgs e)
        {
            математическаяМодельToolStripMenuItem.Checked = true;
            математическаяМодельToolStripMenuItem.Enabled = false;
            СправочныйМатериалToolStripMenuItem.Checked   = false;
            СправочныйМатериалToolStripMenuItem.Enabled   = true;
            ActiveMdiChild.Close();
            MathModel MathModel = new MathModel();

            MathModel.MdiParent = this;
            this.SetClientSizeCore(MathModel.Width + 4, MathModel.Height + 20 + 26 + 4);
            toolStripStatusLabel1.Text = "Математическая модель";
            //this.Size = SizeFromClientSize(MathModel.Size);
            MathModel.Show();
        }
Пример #4
0
        static int n;      //Convert.ToInt32(tau / h);

        #region  асчет СКИ
        /// <summary>
        /// Расчет СКИ
        /// </summary>
        /// <param name="mvx">Концентрация изопрена в шихте</param>
        /// <param name="Tvx">Температура шихты</param>
        /// <param name="G">Расход шихты</param>
        /// <param name="Gk">Расход каталитического комплекса</param>
        /// <param name="Ghl">Расход хладагента</param>
        /// <param name="Thl">Температура ладагента</param>
        /// <param name="ch2vx">Концентрация водорода в шихте</param>
        public void Calculation(double mvx, double Tvx, double G, double Gk, double Ghl, double Thl, double ch2vx)
        {
            MathModel main = Owner as MathModel;

            h   = Convert.ToDouble(main.numericUpDown15.Value);
            tau = Convert.ToDouble(main.numericUpDown16.Value);
            n   = Convert.ToInt32(tau / h);

            //---Вектор входных переменных---
            double V    = GetParameters("Входной", 14); //.AsEnumerable().Where(p => p.Field<long>("ID") == 14).Select(p => p.Field<double>("Value")).Single();//4.1; //Объем реактора
            double alfa = GetParameters("Входной", 15); //.AsEnumerable().Where(p => p.Field<long>("ID") == 15).Select(p => p.Field<double>("Value")).Single();//1.22; //Активность катализатора
            double beta = GetParameters("Входной", 16); //.AsEnumerable().Where(p => p.Field<long>("ID") == 16).Select(p => p.Field<double>("Value")).Single();//0.3;  //Коэффициент, учитывающий примеси в шихте
            double cp   = GetParameters("Входной", 17); //.AsEnumerable().Where(p => p.Field<long>("ID") == 17).Select(p => p.Field<double>("Value")).Single();//0.55; //Теплоемкость реакционной смеси
            double A    = GetParameters("Входной", 18); //.AsEnumerable().Where(p => p.Field<long>("ID") == 18).Select(p => p.Field<double>("Value")).Single();//0.5; //Коэффициент, учитывающий гидродинамические характеристики реактора
            double s    = GetParameters("Входной", 19); //.AsEnumerable().Where(p => p.Field<long>("ID") == 19).Select(p => p.Field<double>("Value")).Single();//12; //Поверхность теплосъема
            double chl  = GetParameters("Входной", 20); //.AsEnumerable().Where(p => p.Field<long>("ID") == 20).Select(p => p.Field<double>("Value")).Single();//0.6; //теплоемкость хладагента
            double ro   = GetParameters("Входной", 21); //.AsEnumerable().Where(p => p.Field<long>("ID") == 21).Select(p => p.Field<double>("Value")).Single();//630; //Плотность реакционной смеси
            double q    = GetParameters("Входной", 22); //.AsEnumerable().Where(p => p.Field<long>("ID") == 22).Select(p => p.Field<double>("Value")).Single();//263; //Тепловой эффект реакции

            //Console.WriteLine($"{V} {alfa} {beta} {cp} {A} {s} {chl} {ro} {q}") ;

            //---Вектор параметров модели---
            //double E = 10000;
            double R  = GetParameters("Константа", 8);  //8.314; //Универсальная газовая постоянная
            double k0 = GetParameters("Константа", 9);  //500000000; //Константа для расчета скорости реакции полимеризаии
            double k1 = GetParameters("Константа", 10); //10.0; //Константа для расчета скорости реакции полимеризаии
            double k2 = GetParameters("Константа", 11); //1.3; //Константа для расчета скорости реакции полимеризаии
            double u  = GetParameters("Константа", 12); //40; //Коэффициент теплопередачи
            double kh = GetParameters("Константа", 13); //1.56; //Коэффициент для расчета реакции переноса цепи по водороду

            double[] tp    = new double[n + 1];
            double[] micp0 = new double[n + 1]; //Среднеинтегральные значения мономера
            double[] Tcp0  = new double[n + 1]; //Среднеинтегральные значения температуры
            double[] m0    = new double[n + 1]; //---!!!Нигде не используется!!!---
            double[] T0    = new double[n + 1]; //---!!!Нигде не используется!!!---
            double[] Ki    = new double[n + 1]; //Для расчета скорости реакции полимеризации
            double[] r     = new double[n + 1]; //Скорость реакции полимеризации
            double[] ch20  = new double[n + 1];
            double[] rh2   = new double[n + 1];
            double[] rd    = new double[n + 1]; //Скорость реакции образования димеров

            //---Выходные параметры---
            double[] muni = new double[n + 1]; //Вязкость по Муни
            double[] pl   = new double[n + 1]; //Пластичность по Карреру
            double[] pm   = new double[n + 1]; //Потери массы
            double[] m    = new double[n + 1]; //Концентрация полимера
            double[] T    = new double[n + 1]; // Выходная температура смеси
            double[] ch2  = new double[n + 1]; //Выходная концентрация водорода
            double[] d    = new double[n + 1]; //Концентрация димеров

            m[0]     = 0;
            d[0]     = 0;
            T[0]     = 0 + 273;
            m0[0]    = 0;
            micp0[0] = 0;
            Tcp0[0]  = 0;
            T0[0]    = Tvx;
            ch2[0]   = 20;
            ch20[0]  = 0;

            for (int j = 1; j <= n; j++)
            {
                double no;
                if (alfa * Gk / G > beta)
                {
                    no = alfa * Gk / G - beta;
                }
                else
                {
                    no = 0;
                }
                tp[j]    = h * j;
                micp0[j] = (micp0[j - 1] + A * mvx) / (1 + A);
                Tcp0[j]  = (Tcp0[j - 1] + A * Tvx) / (1 + A);
                //m0[j] = m0[j - 1] + h * G * (mvx - m0[j - 1]);
                //T0[j] = T0[j - 1] + h * (G * cp * (Tvx - T0[j - 1]) - (2 * u * s * Ghl * chl * (Tcp0[j] - Thl)) / (2 * Ghl * chl + u * s));
                Ki[j] = k0 * Math.Exp(-Math.Pow((k1 * (mvx - micp0[j])), k2));
                r[j]  = Ki[j] * no *Math.Sqrt(micp0[j]) * Math.Exp(-21.5 / R * Tcp0[j] + 273);

                m[j] = m[j - 1] + h * G * (0.9 * mvx - m[j - 1]) - h * V * r[j] * ro;
                T[j] = T[j - 1] + h * (G * cp * (Tvx - T[j - 1]) - (2 * u * s * Ghl * chl * Tcp0[j]) / (2 * Ghl * chl + u * s) + V * ro * q * r[j]);

                ch20[j] = ch20[j - 1] + h * G / 100 * (ch2vx - ch20[j - 1]);
                rh2[j]  = kh * ch20[j];
                ch2[j]  = ch2[j - 1] + h * G * (ch2vx - ch2[j - 1]) - h * V * ro * rh2[j];

                rd[j] = Gk * (4.2e13 * ch2[j] + 2.4e14) * micp0[j] * Math.Exp(-280 / R * Tcp0[j] + 273) / G;
                d[j]  = d[j - 1] + h * G * (0.1 * Gk * mvx - d[j - 1]) - h * V * rd[j] * ro;

                muni[j] = 20 * Math.Pow(micp0[j], 0.28) * Math.Exp(25 / Tcp0[j]);
                pl[j]   = 20 * Math.Exp(50 / Tcp0[j]) / muni[j];
                pm[j]   = Gk * d[j - 1] / m[j];

                if (ch2[j] < 0)
                {
                    ch2[j] = 0;
                }
                if (d[j] < 0)
                {
                    d[j] = 0;
                }
                if (m[j] < 0)
                {
                    m[j] = 0;
                }
                if (pm[j] < 0)
                {
                    pm[j] = 0;
                }
            }

            main.dataGridView1.Rows[11].Cells["Value"].Value = main.textBox3.Text = main.textBox1.Text = Convert.ToString(string.Format("{0:N1}", muni[n]));
            main.dataGridView1.Rows[12].Cells["Value"].Value = main.textBox4.Text = main.textBox9.Text = Convert.ToString(string.Format("{0:N3}", pl[n]));
            main.dataGridView1.Rows[13].Cells["Value"].Value = main.textBox5.Text = main.textBox10.Text = Convert.ToString(string.Format("{0:N3}", pm[n]));
            main.dataGridView1.Rows[14].Cells["Value"].Value = main.textBox11.Text = Convert.ToString(string.Format("{0:N1}", m[n]));
            main.dataGridView1.Rows[15].Cells["Value"].Value = main.textBox2.Text = main.textBox12.Text = Convert.ToString(string.Format("{0:N1}", T[n] - 200));
            main.dataGridView1.Rows[16].Cells["Value"].Value = main.textBox13.Text = Convert.ToString(string.Format("{0:N3}", ch2[n]));
            main.dataGridView1.Rows[17].Cells["Value"].Value = main.textBox14.Text = Convert.ToString(string.Format("{0:N2}", d[n]));

            //Уменьшение выходной температура на 200 для графика
            double[] TClone = new double[n + 1];
            Array.Copy(T, TClone, n + 1);
            for (int j = 0; j <= n; j++)
            {
                TClone[j] = TClone[j] - 200;
            }

            DrawGraph(muni, pl, pm, m, TClone, ch2, d);
        }
Пример #5
0
        /// <summary>
        /// Добавление графиков
        /// </summary>
        /// <param name="muni">Муни</param>
        /// <param name="pl">Пластичность по Карреру</param>
        /// <param name="pm">Потери массы</param>
        /// <param name="m">Концентрация полимера</param>
        /// <param name="T">Выходная температура смеси</param>
        /// <param name="ch2">Выходная концентрация водорода</param>
        /// <param name="d">Концентрация димеров</param>
        private void DrawGraph(double[] muni, double[] pl, double[] pm, double[] m, double[] T, double[] ch2, double[] d)
        {
            MathModel main = Owner as MathModel;
            // Получим панель для рисования
            GraphPane paneMuni = main.zedGraphControl1.GraphPane;

            // Изменим текст заголовка графика
            paneMuni.Title.Text = "";
            // Изменим тест надписи по оси X
            paneMuni.XAxis.Title.Text = "Время, мин";
            // Изменим текст по оси Y
            paneMuni.YAxis.Title.Text = "Vm, ед.";
            // Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы
            paneMuni.CurveList.Clear();
            MinMaxGraphs(paneMuni, 1);
            Graphs(paneMuni, muni);

            GraphPane panePl = main.zedGraphControl2.GraphPane;

            panePl.Title.Text       = "";
            panePl.XAxis.Title.Text = "Время, мин";
            panePl.YAxis.Title.Text = "Pl, ед.";
            panePl.CurveList.Clear();
            MinMaxGraphs(panePl, 2);
            Graphs(panePl, pl);

            GraphPane panePm = main.zedGraphControl3.GraphPane;

            panePm.Title.Text       = "";
            panePm.XAxis.Title.Text = "Время, мин";
            panePm.YAxis.Title.Text = "Pm, ед.";
            panePm.CurveList.Clear();
            MinMaxGraphs(panePm, 3);
            Graphs(panePm, pm);

            GraphPane paneM = main.zedGraphControl4.GraphPane;

            paneM.Title.Text       = "";
            paneM.XAxis.Title.Text = "Время, мин";
            paneM.YAxis.Title.Text = "m, %";
            paneM.CurveList.Clear();
            MinMaxGraphs(paneM, 4);
            Graphs(paneM, m);

            GraphPane paneT = main.zedGraphControl5.GraphPane;

            paneT.Title.Text       = "";
            paneT.XAxis.Title.Text = "Время, мин";
            paneT.YAxis.Title.Text = "Tвых, °C";
            paneT.CurveList.Clear();
            MinMaxGraphs(paneT, 5);
            Graphs(paneT, T);

            GraphPane paneCh2 = main.zedGraphControl6.GraphPane;

            paneCh2.Title.Text       = "";
            paneCh2.XAxis.Title.Text = "Время, мин";
            paneCh2.YAxis.Title.Text = "h, %";
            paneCh2.CurveList.Clear();
            MinMaxGraphs(paneCh2, 6);
            Graphs(paneCh2, ch2);

            GraphPane paneD = main.zedGraphControl7.GraphPane;

            paneD.Title.Text       = "";
            paneD.XAxis.Title.Text = "Время, мин";
            paneD.YAxis.Title.Text = "d, %";
            paneD.CurveList.Clear();
            MinMaxGraphs(paneD, 7);
            Graphs(paneD, d);

            // Вызываем метод AxisChange (), чтобы обновить данные об осях.
            // В противном случае на рисунке будет показана только часть графика,
            // которая умещается в интервалы по осям, установленные по умолчанию
            main.zedGraphControl1.AxisChange();
            main.zedGraphControl2.AxisChange();
            main.zedGraphControl3.AxisChange();
            main.zedGraphControl4.AxisChange();
            main.zedGraphControl5.AxisChange();
            main.zedGraphControl6.AxisChange();
            main.zedGraphControl7.AxisChange();
            // Обновляем график
            main.zedGraphControl1.Invalidate();
            main.zedGraphControl2.Invalidate();
            main.zedGraphControl3.Invalidate();
            main.zedGraphControl4.Invalidate();
            main.zedGraphControl5.Invalidate();
            main.zedGraphControl6.Invalidate();
            main.zedGraphControl7.Invalidate();
        }