Example #1
0
        private void button_save_Click(object sender, EventArgs e)
        {
            saveFileDialog1.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //  Points_table.Table_start_graph.Clear();
                Points_table.Table_restore.Clear();
                Points_table.Table_baze.Clear();
                Points_table.Table_yitog.Clear();
                //  Points_table.Table_yitog_calc.Clear();
                for (int i = 0; i < dataGridView1.RowCount - 1; i++)
                {
                    DUTConfig_V3.Forms.etc.Point Temp = new DUTConfig_V3.Forms.etc.Point();
                    Temp.number = i + 1;
                    Temp.x      = (double)dataGridView1.Rows[i].Cells[1].Value;
                    Temp.y      = (double)dataGridView1.Rows[i].Cells[2].Value;
                    Points_table.Table_baze.Add(Temp);
                }

                Points_table.Table_current.Clear();
                for (int i = 0; i < dataGridView2.RowCount; i++)
                {
                    Point_Current Temp = new Point_Current();
                    Temp.x = "X^" + i.ToString();
                    Temp.y = (double)dataGridView2.Rows[i].Cells[1].Value;
                    Points_table.Table_current.Add(Temp);
                }

                XmlSerializer mySerializer = new XmlSerializer(typeof(Points));
                StreamWriter  myWriter     = new StreamWriter(saveFileDialog1.FileName);

                try
                {
                    mySerializer.Serialize(myWriter, Points_table);
                    myWriter.Close();
                }
                catch (Exception)
                { }
            }
        }
Example #2
0
        private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            try
            {
                if (dataGridView1.RowCount != 0)
                {
                    DUTConfig_V3.Forms.etc.Point[] temparray = new DUTConfig_V3.Forms.etc.Point[dataGridView1.RowCount - 1];
                    bindingSource_point.CopyTo(temparray, 0);

                    if (temparray[temparray.Length - 1].y != 0)
                    {
                        Sort_numbers(temparray, temparray.Length);
                        bindingSource_point.Clear();

                        for (int i = 0; i < temparray.Length; i++)
                        {
                            bindingSource_point.Add(temparray[i]);
                        }
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message, Properties.Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
Example #3
0
        private void Fl_termo_window_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                Points_table.Table_baze.Clear();
                Points_table.Table_current.Clear();
                Points_table.Table_read_from_device.Clear();
                for (int i = 0; i < dataGridView1.RowCount - 1; i++)
                {
                    DUTConfig_V3.Forms.etc.Point Temp = new DUTConfig_V3.Forms.etc.Point();
                    Temp.number = i + 1;
                    Temp.x      = (double)dataGridView1.Rows[i].Cells[1].Value;
                    Temp.y      = (double)dataGridView1.Rows[i].Cells[2].Value;
                    Points_table.Table_baze.Add(Temp);
                }

                for (int i = 0; i < dataGridView2.RowCount; i++)
                {
                    Point_Current Temp = new Point_Current();
                    Temp.x = "X^" + i.ToString();
                    Temp.y = (double)dataGridView2.Rows[i].Cells[1].Value;
                    Points_table.Table_current.Add(Temp);
                }


                Points_table.STEP_POLINOM         = Convert.ToInt32(textBox_m.Text);
                Points_table.STEP_POLINOM_CURRENT = Convert.ToInt32(textBox_mcurr.Text);

                XmlSerializer mySerializer = new XmlSerializer(typeof(Points));
                StreamWriter  myWriter     = new StreamWriter(AppSettings.AppFolder + "Points.xml");
                mySerializer.Serialize(myWriter, Points_table);

                myWriter.Close();
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, Properties.Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
Example #4
0
        bool Reading = false; // поможет прятать 3й график

        private void button_read_polinom_Click(object sender, EventArgs e)
        {
            try
            {
                Reading = true;

                bindingSource_current.Clear();

                modbus.Open();                                                                                          //открываем порт
                float[] rez = modbus.ReadFloat(Termo.Adress_polinom_termo_correct, Termo.polinom_termo_correct.Length); // считываем в массив коэффициенты полинома из датчика
                rez = rotate_array(rez);                                                                                // разворачиваем массив
                double[] rez_double = new double[rez.Length];                                                           // создаём массив размером с первый, чтобы перевести числа в double (для аппроксимации)

                for (int i = 0; i < rez_double.Length; i++)
                {
                    rez_double[i] = Convert.ToDouble(rez[i]); // переводим коэффициенты в double
                }

                for (int i = 0; i < rez_double.Length; i++)
                {
                    Point_Current Temp = new Point_Current();
                    Temp.x = "X^" + i.ToString();
                    Temp.y = rez_double[i];
                    bindingSource_current.Add(Temp);
                }

                Points_table.Table_read_from_device.Clear();                     // очищаем таблицу, в которой будут хранится значения для графика

                int koeff = (Termo.high + Math.Abs(Termo.low)) / Termo.step + 1; // рассчитываем количество точек на графике, основываясь на настройках

                double[] Xes = new double[koeff];                                // Массив со значениями оси Х графика
                for (int i = 0; i < Xes.Length; i++)
                {
                    Xes[i] = Termo.low + i * Termo.step;
                }

                for (int i = 0; i < koeff; i++)
                {
                    DUTConfig_V3.Forms.etc.Point temp = new DUTConfig_V3.Forms.etc.Point(); // локальная переменная, нужна для корректной передачи данных на отрисовку
                    temp.number = i + 1;
                    temp.x      = Xes[i];
                    temp.y      = polinom_calc(Xes[i], rez_double); // рассчитываем частоту
                    Points_table.Table_read_from_device.Add(temp);
                }
                Points_table.Table_yitog.Clear();
                // Points_table.Table_yitog_calc.Clear();
                //Points_table.Table_start_graph.Clear();
                Points_table.Table_restore.Clear();
                DrawGraph(Points_table);

                string s = "";
                for (int i = 0; i < rez.Length; i++)
                {
                    s += i + 1 + ": " + rez[i] + ";  ";
                    itog_poly.Add(rez[i]);
                }
                textBox_a.Text = s;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, Properties.Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                modbus.Close();
            }
        }
Example #5
0
        private void button_calculate_Click(object sender, EventArgs e)
        {
            Reading = false;

            alglib.barycentricinterpolant p;
            alglib.polynomialfitreport    rep;
            p   = new alglib.barycentricinterpolant();
            rep = new alglib.polynomialfitreport();
            double[] a_start, a_rest, a_itog;
            int      m     = Points_table.STEP_POLINOM;
            int      m_cur = Points_table.STEP_POLINOM_CURRENT;
            // double t = 0.1;
            int info = 0;

            // double v = 0;
            double[] x = new double[dataGridView1.RowCount - 1];
            double[] y = new double[dataGridView1.RowCount - 1];

            int koeff = (Termo.high + Math.Abs(Termo.low)) / Termo.step + 1;


            double[] Y_user    = new double[koeff]; // пользовательские
            double[] Y_restore = new double[koeff]; // восстановленные
            double[] Y_norm    = new double[koeff]; // нормированные по p25
            double[] Y_itog    = new double[koeff]; // итоговые
            //double[] yitog_calc = new double[koeff];

            // массив Stock_koeff - c заводскими значениями, переведёнными в double
            double[] Current_koeff = new double[Termo.polinom_termo_correct.Length];
            for (int i = 0; i < Current_koeff.Length; i++)
            {
                Current_koeff[i] = Convert.ToDouble(dataGridView2.Rows[i].Cells[1].Value);
            }

            Points_table.Table_yitog.Clear();
            Points_table.Table_restore.Clear();
            itog_poly.Clear();
            try
            {
                for (int i = 0; i < dataGridView1.RowCount - 1; i++)
                {
                    x[i] = (double)dataGridView1.Rows[i].Cells[1].Value;
                    y[i] = (double)dataGridView1.Rows[i].Cells[2].Value;
                }


                // 1. Приводим F в период Р = 1 / F и сохраняем в массиве
                double[] P = new double[dataGridView1.RowCount - 1];
                for (int i = 0; i < P.Length; i++)
                {
                    if (Points_table.f)
                    {
                        P[i] = 14745600 / y[i];
                    }
                    else
                    {
                        P[i] =
                            (14745600 / Points_table.Fmax) + ((y[i] / Points_table.Diap)
                                                              * (14745600 / Points_table.Fmin - 14745600 / Points_table.Fmax));
                        P[i] = P[i] / polinom_calc(x[i], Current_koeff);
                    }
                }
                // 2. Получаем коэффициенты полинома а_start
                alglib.polynomialfit(x, P, m, out info, out p, out rep);
                alglib.polynomialbar2pow(p, out a_start);

                // 3. Вычисляем y_user по пользовательским данным и заносим значения в таблицу
                int itest = Termo.low;
                for (int i = 0; itest <= Termo.high; i++)
                {
                    Y_user[i] = polinom_calc(itest, a_start);
                    itest    += Termo.step;
                }
                itest = Termo.low;

                // 4. Получаем Pвосстановленное = (Pi * полином(Aтек, Ti))

                double P25 = polinom_calc(25, a_start);

                // 5. Нормируем Y : Y_norm = P25 / Y_user если в диапазоне пользователя, иначе Y_norm по полиному текущих значений
                // 6. Получаем Y восстановленное: Y_restore = Y_user если в диапазоне пользователя, иначе Y_restore = P25 / значение по полиному текущих значений

                for (int i = 0; itest <= Termo.high; i++)
                {
                    DUTConfig_V3.Forms.etc.Point temp = new DUTConfig_V3.Forms.etc.Point();

                    if (itest >= x[0] && itest <= x[x.Length - 1])
                    {
                        Y_restore[i] = Y_user[i];
                        //Y_norm[i] = P25 / Y_user[i];
                    }
                    else
                    {
                        Y_restore[i] = P25 / polinom_calc(itest, Current_koeff);
                        //Y_norm[i] = polinom_calc(itest, Current_koeff);
                    }
                    temp.number = i + 1;
                    temp.x      = itest;
                    temp.y      = Y_restore[i];
                    Points_table.Table_restore.Add(temp);
                    itest += Termo.step;
                }
                itest = Termo.low;
                // массив значений X на интервале от Termo.low до Termo.high c шагом Termo.step
                double[] Xes = new double[koeff];
                for (int i = 0; i < Xes.Length; i++)
                {
                    Xes[i] = Termo.low + i * Termo.step;
                }

                // 7. Получаем коэффициенты восстановленного полинома, прогоняем калькуляцией полинома Y_restore для уточнения данных
                alglib.polynomialfit(Xes, Y_restore, m, out info, out p, out rep);
                alglib.polynomialbar2pow(p, out a_rest);
                for (int i = 0; itest <= Termo.high; i++)
                {
                    Y_restore[i] = polinom_calc(itest, a_rest);
                    Y_norm[i]    = polinom_calc(25, a_rest) / Y_restore[i];
                    itest       += Termo.step;
                    Points_table.Table_restore[i].y = 14745600 / Y_restore[i];
                }
                itest = Termo.low;

                // 8. Получаем коэффициенты итогового полинома
                alglib.polynomialfit(Xes, Y_norm, m_cur, out info, out p, out rep);
                alglib.polynomialbar2pow(p, out a_itog);

                // 9. Получаем массив Y_itog, с помощью его и массива Y_restore получаем точки графика
                for (int i = 0; itest <= Termo.high; i++)
                {
                    Y_itog[i] = polinom_calc(itest, a_itog);
                    DUTConfig_V3.Forms.etc.Point temp2 = new DUTConfig_V3.Forms.etc.Point();
                    temp2.number = i + 1;
                    temp2.x      = itest;
                    temp2.y      = Y_itog[i] * Y_restore[i];
                    temp2.y      = 14745600 / temp2.y;
                    //Y_itog[i] = temp2.y;
                    Points_table.Table_yitog.Add(temp2);
                    itest += Termo.step;
                }
                itest = Termo.low;

                // 10. показываем коэффициенты итогового полинома в текстбоксе на форме
                string s = "";
                for (int i = 0; i < a_itog.Length; i++)
                {
                    s += i + 1 + ": " + a_itog[i] + ";  ";
                    itog_poly.Add(a_itog[i]);
                }
                textBox_a.Text = s;

                // 11. Рисуем графики
                DrawGraph(Points_table);
                button_SMS.Enabled = true;
            }
            catch (Exception)
            {
                MessageBox.Show(currentTranslation.ThermoCalcFailMessage, Properties.Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }