Написание программы, моделирующей работу энергосистемы ГЭС

Страницы работы

Содержание работы

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра ССОД

Расчетно-графическая работа

по дисциплине «Операционные системы»

Вариант №11

Факультет: АВТ                                                                                                      Преподаватель

Группа: АИ-82                                                                                                         Родников В.В.

Студент: Королёв А.А.

                                                                 Отметка о защите:

                                                                                                                    ________________

Дата защиты: «____»___________2010г.

Новосибирск

2010

Содержание

стр.

Введение………………………………………..………………………..……………………………. 2

Общая схема работы программы……………………..…………………………………. 2

Описание основных функций……………………………………………  3

Листинги ……………………………………………………………………………………………….  7

Список литературы ………………………………………………………………………………  12

Задание:

 ГЭС имеет 4 гидрогенератора  и снабжает электроэнергией 3 объекта.     Мощность, потребляемая каждым объектом, меняется в течение  суток относительно некоторого среднего значения  по синусоидальному   закону. Мощности гидрогенераторов фиксированы:

                              Ргг1 = 100 МВт

                              Ргг2 = 100 МВт

                              Ргг3 = 120 МВт

                              Ргг4 = 120 МВт

 Мощность, потребляемая объектами (МВт):

                             Р1   = 100 + 20*Sin(pi/2*(h/6 - 1))    

                             Р2   = 180 + 50*Sin(pi/2*(h/6 - 1))    

                             Р3   =  90  + 20*Sin(pi/2*(h/6 - 1))    

       где   h - текущий час в течение суток (0 - 24).

      Написать программу, моделирующую работу энергосистемы. Временной         

       масштаб моделирования 1 : 3600 (1 Сек соответствует 1 часу).

       Моделирование  потребления электроэнергии каждым объектом выполняется          

       в отдельном  потоке. Первичный поток процесса получает данные от каждого

       объекта  и  при необходимости отключает (или включает) гидрогенератор 4,

       если суммарной мощности оставшихся генераторов достаточно для

       энергоснабжения объектов.

           На главной форме визуально должны отображаться текущие мощности

      потребления всех объектов, а также состояние всех генераторов (включен -

      отключен).

Введение:

В качестве способа синхронизации была выбрана синхронизация через критическую секцию.

Принцип работы программы заключается в следующем:

Генераторы ГЭС генерируют мощность в зависимости от потребления P которое меняется по определенному закону – данные процессы моделируем в отдельных потоках. Разделяемым ресурсом между потоками являются переменные G1 и P которые хранят информацию G1 – о выработанной мощности на данный час, P – о потребленной мощности на данный час.

Общая схема работы программы:

 


Описание основных функций:

Приведем листинги функций потоков :

DWORD WINAPI ThreadFunc1(void *p) //1 поток - моделирует работу электростанции

{

     double G[4] = {100, 100, 120, 120}; //мощности генераторов

     while(1)

     {

        if(!Form1->stop)

        {

               Sleep(1000); //Задержка 1 с

               EnterCriticalSection(&sect); //Входим в критическую секцию

               G1 = 0;

               int i = 1;

               double s = 0;

               for( ;i <= 4; i++)

               { //определяем сколько генераторов покроет текущие потери

                  G1 += G[i-1];

                  if(G1 > P) break;

               }

                  //Выводим величину текущей выработки на график

                  AnsiString buf;

                  buf.sprintf("%3.1lf", G1);

               Form1->Label15->Caption = buf;

                  Form2->Series2->AddXY(h, G1, h, clGreen);

               LeaveCriticalSection(&sect);

                  //"отключаем" все генераторы

                Form1->Shape1->Brush->Color = clWhite;

                Form1->Shape2->Brush->Color = clWhite;

                Form1->Shape3->Brush->Color = clWhite;

                Form1->Shape4->Brush->Color = clWhite;

               switch(i) //включаем нужные

               {

                        case 1: { Form1->Shape1->Brush->Color = clGreen; } break;

                        case 2: { Form1->Shape1->Brush->Color = clGreen;

                                  Form1->Shape2->Brush->Color = clGreen;

                                } break;

                        case 3: { Form1->Shape1->Brush->Color = clGreen;

                                  Form1->Shape2->Brush->Color = clGreen;

                                  Form1->Shape3->Brush->Color = clGreen;

                                 } break;

                        case 4: { Form1->Shape1->Brush->Color = clGreen;

                                  Form1->Shape2->Brush->Color = clGreen;

                                  Form1->Shape3->Brush->Color = clGreen;

                                  Form1->Shape4->Brush->Color = clGreen;

                                 } break;

               };

         }

     }

}

//---------------------------------------------------------------------------

DWORD WINAPI ThreadFunc2(void *p) //2-ой поток моделирует потребление энергии

{

  while(1)

  {

          if(!Form1->stop)

          {

                Form1->Label8->Caption = h;

                  AnsiString buf;

                Sleep(1000);

                //расчёт потребления

                double P1 = 100 + 20 * sin((M_PI/6) * (h/6 - 1));

                  buf.sprintf("%3.1lf", P1);

                Form1->Label5->Caption = buf;

                double P2 = 180 + 50 * sin((M_PI/2) * (h/6 - 1));

                  buf.sprintf("%3.1lf", P2);

                Form1->Label6->Caption = buf;

                double P3 = 90 + 20 * sin((M_PI/2) * (h/6 - 1));

                  buf.sprintf("%3.1lf", P3);

                Form1->Label7->Caption = buf;

                EnterCriticalSection(&sect); //входим в критическую секцию

                P = P1 + P2 + P3;

                  buf.sprintf("%3.1lf", P);

                Form1->Label11->Caption = buf;

                Form2->Series1->AddXY(h, P, h, clRed);

                LeaveCriticalSection(&sect);

                h++; //переход на следующий час

                if(h == 24)

                {

                        h = 0;//"обнуляем" часы при наступлении новых суток

                        Form2->Series1->Clear();

                        Form2->Series2->Clear();

                }

         }

  }

}

Программа моделирует работу энергосистемы во временном масштабе с дискретностью 1 час, ход изменения генерации и потребления мощности за сутки нагляднее отображается на графике (форма 2) :

Рис 1. Форма с графиками

Также, как сказано в задании ход включения и отключения генераторов ГЭС отображается на форме 1 (состояние вкл/выкл) :

Рис 2. Главная форма

Листинги:

Листинг заголовочного файла программы:

//---------------------------------------------------------------------------

#ifndef MainUnitH

#define MainUnitH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ExtCtrls.hpp>

#include <jpeg.hpp>

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

Похожие материалы

Информация о работе