Гидроаккумулирующая электростанция

Автор — школьник Кузьма прислал модель работы ГАЭС.

Известно, что ГАЭС работает в двух режимах — насосном и турбинном.
В первом режиме ГАЭС, потребляя избыточную энергию от тепловых электростанций в часы наименьших нагрузок в системе (обычно 7—-12 часов в сутки), перекачивает воду из нижнего питающего водохранилища в верхний аккумулирующий бассейн (зарядка станции).
Во втором режиме ГАЭС работает в часы максимального потребления энергии в системе (2—6 час. в сутки). Расходуя воду из верхнего бассейна, она вырабатывает электроэнергию в систему (разрядка станции).
Подробности о ГАЭС, см. например: Гидроаккумулирующая электростанция

Автор программы расположил на форме элементы: pictureBox1 (для рисования); четыре кнопки: Начать, Выработка электроэнергии, Аккумуляция воды, Стоп;  label1 и textBox1 для информации о заполнении бассейнов; label2 и label3 (на pictureBox1) для индикации выработанной/запасенной энергии. Невизуальный компонент timer1 автор использует для отображения динамики заполнения/сработки бассейнов (Interval=500 мс). А вот и текст файла Form1.cs, присланный автором:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace ГАЭС
{
    public partial class Form1 : Form
    {
        Graphics gr;        // графический объект
        SolidBrush brw;     // кисть - Вода
        SolidBrush brs;     // кисть - Небо
        HatchBrush brg;     // кисть - ГАЭС   
        Color DashBug = Color.LimeGreen;    // цвет штриховки
        Color C_water = Color.Blue;         // цвет воды
        Color C_sky = Color.MintCream;      // цвет неба
        Color C_kontur = Color.Maroon;      // цвет контуров

        Pen peng;           // перо - границы
        Pen penw;           // перо - труба
        Pen pent;           // труба без воды

        int x;              // % заполнения верхнего водохранилища
        bool generator;     // генерация электроэнергии (true) или гидроаккумуляция (false)
        int Ev;             // Выработка электроэнергии, кВт-ч
        int Ez;             // запас гидроэнергии, кВт-ч

        // начальная загрузка 
        public Form1()
        {
            InitializeComponent();
            brw = new SolidBrush(C_water);
            brs = new SolidBrush(C_sky);
            brg= new HatchBrush(HatchStyle.DashedUpwardDiagonal, DashBug, Color.Gray);
            penw = new Pen(C_water, 6);
            peng = new Pen(C_kontur, 3);
            pent = new Pen(Color.Gray,6);
            gr = pictureBox1.CreateGraphics();  //инициализируем объект типа графики, привязав его к PictureBox          
        }

        // Показать схему ГАЭС
        private void button1_Click(object sender, EventArgs e)
        {
            x = Convert.ToInt32(textBox1.Text);
            foto();
        }

        // Схема ГАЭС с некоторым уровнем воды, x в %
        private void foto()
        {
            gr.Clear(C_sky);
            gr.FillRectangle(brw, 0, 100-x, 100, 100);
            gr.DrawRectangle(peng, 0, 0, 101, 101);
            gr.FillRectangle(brw, 0, 301+x, 200, 100-x);
            gr.DrawRectangle(peng, 0, 301, 200,100);
            gr.FillRectangle(brg, 0, 101, 101, 201);
            gr.DrawBezier(penw, 99, 99, 200,200,100,200,120,400);
            timer1.Enabled = true;
        }
       
        // Выработка электроэнергии
        private void button2_Click(object sender, EventArgs e)
        {
            generator = true;
            timer1.Start();
            Ev = 0;
        }

        // Гидроаккумуляция
        private void button3_Click(object sender, EventArgs e)
        {
            generator = false;
            timer1.Start();
            Ez = 0;
        }

        // динамика процесса
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (generator)
            {
                if (x > 10)         // генерация
                {
                    gr.DrawBezier(penw, 99, 99, 200, 200, 100, 200, 120, 400);
                    gr.FillRectangle(brs, 2, 100 - x, 98, 1);
                  
                    gr.FillRectangle(brw, 2, 301 + x, 197, 1);
                    x = x - 1;
                    Ev = Ev + 1000;
                    textBox1.Text = x.ToString();
                    label2.Text = "Выработано " + Ev.ToString() + " кВт-ч электроэнергии";
                    label3.Text = "";
                }
                else                //  x=10% - минимальный запас
                    gr.DrawBezier(pent, 99, 99, 200, 200, 100, 200, 120, 400);
            }
            else
            {
                if (x < 90)         // аккумулирование
                {
                    gr.FillRectangle(brw, 2, 100 - x, 98, 1);
                    gr.FillRectangle(brs, 2, 301 + x, 197, 1);
                    gr.DrawBezier(penw, 99, 99, 200, 200, 100, 200, 120, 400);
                    x = x + 1;
                    Ez = Ez + 1000;
                    textBox1.Text = x.ToString();
                    label3.Text = "Запасено " + Ez.ToString() + " кВт-ч гидроэнергии";
                    label2.Text = "";
                }
                else              //  заполнение не более 90% 
                    gr.DrawBezier(pent, 99, 99, 200, 200, 100, 200, 120, 400);
            }
        }

        // стоп
        private void button4_Click(object sender, EventArgs e)
        {
            gr.DrawBezier(pent, 99, 99, 200, 200, 100, 200, 120, 400);
            Ev = 0;
            Ez = 0;
            timer1.Stop();
        }

    }
}

Окно программы в режиме аккумуляции воды:
ГАЭС

КОММЕНТАРИИ к программе:

1.  Для школьных занятий предложена полезная демонстрация принципа работы ГАЭС в динамике.

2. Класс Form1 содержит 15 полей и 7  методов,  динамика процесса определяется методом  timer1_Tick(). Программа имеет понятную структуру.

3. Для задания режима работы ГАЭС используется булева переменная generator=true/false.

4. Текст программы снабжен достаточными комментариями.

5. Для раскраски фундамента верхнего бассейна автор неожиданно использовал кисть со стилем штриховки класса  HatchBrush из библиотеки System.Drawing.Drawing2D.

6. Для рисования используются методы векторной графики класса Graphics, что обеспечивает быструю анимацию процесса.

7. Данный пример может быть полезен для приобретения навыков визуального программирования и освоения графики.

Спасибо Кузьме!

 

 

 

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх