НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра ССОД
Расчетно-графическая работа
по дисциплине «Операционные системы»
Вариант №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(§); //Входим в критическую секцию
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(§);
//"отключаем" все генераторы
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(§); //входим в критическую секцию
P = P1 + P2 + P3;
buf.sprintf("%3.1lf", P);
Form1->Label11->Caption = buf;
Form2->Series1->AddXY(h, P, h, clRed);
LeaveCriticalSection(§);
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
{
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.