
- •Тема: "Имитационное моделирование динамических систем и процессов с использованием объектно-ориентированного подхода.
- •Задание на курсовой проект
- •Реферат
- •Перечень условных обозначений, символов, единиц, сокращений и терминов
- •Содержание
- •Введение
- •1. Постановка задачи
- •1.1 Описание предметной области
- •1.2 Цели и задачи
- •1.3 Выбор средств
- •2. Выбор метода решения
- •2.1 Теоретические сведения
- •2.2 Описание входных и выходных данных
- •3. Метод решения
- •3.1 Объектно-ориентированный анализ
- •3.2 Объектно-ориентированное проектирование
- •3.2.1 Диаграмма классов
- •3.2.2 Диаграмма объектов
- •3.2.3 Диаграмма состояний и переходов
- •3.2.4 Диаграмма взаимодействия
- •3.3 Объектно-ориентированное программирование
- •3.3.1Диаграмма модулей
- •3.3.2 Диаграмма процессов
- •3.3.3 Протоколы классов
- •Список литературы
- •Приложения Приложение а
- •Приложение б
- •Приложение в
- •Приложение г
Приложение б
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
SAL - это программа предназначенная для моделирования производственной линии с пунктами конечного контроля.
Основная задача моделирования - это проследить загруженность контролера и настройщика.
После двойного нажатия по файлу start. exe откроется программное меню. Вначале программа предложит выбрать пункт меню (смотри рис. В.1). При выборе первого пункта, программа запустит симуляцию и запросит ввести следующие значения:
шаг времени. Любая величина в диапазоне от 1 до 2;
время моделирования системы. Общее время, которое будет потраченное на моделирования. Любая величина в диапазоне от 1 до 1500;
максимальное количество телевизоров в очереди к контролерам. Любая величина в диапазоне от 1 до 15.
Во время моделирования на экран вводятся все подробности моделирования производственной линии (смотри рис. В.2).
В конце на экран будут выведены требуемые статистические данные, которые и являются целью моделирования системы:
время, затрачиваемое на обслуживание каждого телевизора на последнем этапе производства. Данные сведенья представлены в виде списка, который отображает все результаты симуляции в реальном времени;
загрузка контролеров. Данное значение показывает, на сколько во время симуляции, были загружены контроллеры;
загрузка настройщика. Данное значение показывает, на сколько во время симуляции, был загружен настройщик;
После вывода всех статистических данных снова выведется меню. Пользователь может, как повторить симуляцию (нажав "1") указав другие исходные данные, так и выйти из программы (нажав "Esc") и завершить работу с приложением.
Приложение в
ЭКРАННЫЕ ФОРМЫ
На рисунке В.1 начальное меню.
Рисунок В.1 - Меню
Рисунок В.2 - Моделирование
Приложение г
ЛИСТИНГ ПРОГРАММЫ
#include <iostream>
#include <stdio. h>
#include <stdlib. h>
#include <conio. h>
using namespace std;
// Simulator assembly line. Симулятор сборочной линии
float current_time = 0; // текущее время
float TIME_STEP; // шаг времени
float MODELING_TIME; // время моделирования
float MAX_TV_ON_CONTROLER; // макс. количество телевизоров в очереди у контролера
float tested_time=0; // время работы настройщика
float servicecon_time=0; // время работы, двух контролеров
float get_current_time () // функция получающая текущее время
{
return current_time; // возвращает значение времени
}
float frand (float a, float b) // функция генерирующая числа на определенном промежутке
{
return float (rand ()) /RAND_MAX* (b-a) +a; // возвращает случайные числа на промежутке
}
class Queue // класс Очередь
{
public:
Queue (size_t in_id): id (in_id) // конструктор по умолчанию
{
TV_count = 0; // количество TV
}
size_t Id () // идентификатор
{
return id;
}
void AddTV () // Добавление телевизора на проверку
{
if (TV_count == MAX_TV_ON_CONTROLER) // условие добавление TV
return;
printf ("%.1f: Телевизор на контроллере\n", get_current_time (), id);
TV_count++;
}
void RemoveTV () // извлечение TV
{
if (! TV_count) // условие извлечения TV
return;
printf ("%.1f: Телевизор в рабочем состоянии \n", get_current_time (), id);
TV_count--;
}
void RemoveTVAd ()
{
if (! TV_count)
return;
TV_count--;
}
bool IsFull () // проверка на переполнение
{
return TV_count == MAX_TV_ON_CONTROLER;
}
bool IsEmpty () // проверка на пустоту
{
return TV_count == 0;
}
private:
size_t TV_count; // количество TV
size_t id; // идентификатор TV
};
class TV // класс Телевизор
{
public:
TV () // конструктор по умолчанию
{
tv_generation_next_time = 0;
}
void Process (Queue& queue1, Queue& queue2) // функция заполнения очередей
{
if (get_current_time () <tv_generation_next_time)
return;
Queue* q;
Queue* q1;
q = &queue1;
q1 = &queue2;
if (! q->IsFull ()) // условие добавления в очередь 1
q->AddTV ();
else if (! q1->IsFull ()) // условие добавления в очередь 2
q1->AddTV ();
tv_generation_next_time = get_current_time () + frand (3.5, 7.5); // время между поступлениями телевизоров в пункт контроля
}
private:
float tv_generation_next_time; // время поступления нового TV
};
class Controler // класс Контролер
{
public:
Controler () // конструктор по умолчанию
{
TV_next_time = 0;
}
void Process (Queue& q,Queue& q_ad) // процесс прохождениятелевизором контроля
{
if (get_current_time () < TV_next_time)
return;
q. RemoveTV ();
if (frand (0, 100) <15) // процент возращаемых TV
{
printf ("%.1f: Телевизоров не работает\n", get_current_time ());
q. RemoveTVAd ();
q_ad. AddTV ();
}
else
q. AddTV ();
float c=frand (6,12); // среднее время необходимое на проверку одного TV
TV_next_time = get_current_time () +c;
servicecon_time+=c;
}
void Delay (float dt) // задержка
{
TV_next_time = get_current_time () + dt;
}
private:
float TV_next_time; // значение задержки
};
class Adjuster // класс Настройщик
{
public:
Adjuster () // конструктор по умолчанию
{
TV_next_time = 0;
}
void Process (Queue& q_ad)
{
if (get_current_time () < TV_next_time)
return;
else
{
printf ("%.1f: Телевизоров настроен\n", get_current_time ());
}
q_ad. RemoveTVAd ();
float C=frand (20,40); // среднее время настройки
TV_next_time = get_current_time () + C;
tested_time+=C;
}
private:
float TV_next_time; // значение задержки
};
class Conveyor // класс Конвеер
{
public:
Conveyor (): queue1 (1), queue2 (2), queue3 (3) // заполнение очередей
{
}
void Process () // процесс работы конвеера
{
tv_generator. Process (queue1, queue2); // процесс генерации TV с использованием очередей 1 и 2
controler1. Process (queue1,queue3); // провера TV контроллером 1 с использованием очередей 1 и 3
controler2. Process (queue2,queue3); // провера TV контроллером 2 с использованием очередей 2 и 3
adjuster1. Process (queue3); // настройка TV с использованием очереди 3
}
private:
TVtv_generator; // генератор TV
Queue queue1; // очередь 1
Queue queue2; // очередь 2
Queue queue3; // очередь 3
Controler controler1; // контроллер 1
Controler controler2; // контроллер 2
Adjuster adjuster1; // настройщик
};
int main ()
{
setlocale (LC_ALL,"Russian");
int ch;
do
{
cout<<"-----------------------------"<<endl;
cout<<"| SAL v0.21 |"<<endl;
cout<<"| 1 - Старт моделирования |"<<endl;
cout<<"| Esc - Выход |"<<endl;
cout<<"-----------------------------"<<endl;
ch=getch (); // ввод пункта меню
switch (ch)
{
case '1':
{
system ("cls"); // функция очистки экрана
cout<<"----Старт симуляции----\n";
cout<<"Введите шаг времени (от 0.1 до 2): ";
cin>>TIME_STEP; // ввод значения шага времени
if (TIME_STEP<=0.1||TIME_STEP>2) TIME_STEP=0.1;
cout<<"Введите время моделирования (от 1 до 1500): ";
cin>>MODELING_TIME; // ввод значения времени моделирования
if (MODELING_TIME<=1||MODELING_TIME>1500) MODELING_TIME=1000;
cout<<"Введите максимальное значение очереди контроллера (от 1 до 15): ";
cout<<endl;
cin>>MAX_TV_ON_CONTROLER; // ввод значения максимального количества TV на контроллере
if (MAX_TV_ON_CONTROLER<=1||MAX_TV_ON_CONTROLER>15) MAX_TV_ON_CONTROLER=5;
Conveyor conveyor1;
while (get_current_time () <MODELING_TIME)
{
conveyor1. Process ();
current_time += TIME_STEP;
}
cout<<"----Конец симуляции----\n";
cout<<"\n\n";
cout<<"Статистика: "<<endl;
cout<<"Загрузка контроллеров = "<< ( ( (servicecon_time) *100) / (2*get_current_time ())) <<"%"<<endl; // статистика загрузки контроллеров
cout<<"Загрузка настройщика = "<< ( (tested_time*100) /get_current_time ()) <<"%"<<endl; // статистика загрузки настройщика
cout<<"\n\n";
break;
}
case 27: // выход из программы
return 0;
}
}
while (1);
getch ();
return 0;
}
Размещено на Allbest.ru