Смекни!
smekni.com

Моделирование работы цеха (стр. 5 из 6)

а) Если очередной момент времени равен моменту поступления детали в накопитель Н0, то в накопитель Н0 добавляется 1 деталь. Затем вычисляется случайным образом и запоминается время поступления следующей детали.

б) Если очередь не пуста и станок №1 или станок №2 свободен, то уменьшается счетчик очереди и вычисляется время обработки детали. В это время станок находится в состоянии занят.

в) Если общее время моделирования равно времени обработки детали, то станок освобождается и с некоторой (различной для разных станков) вероятностью деталь отправляется во второй накопитель или возвращается на повторную обработку, если брак. После этого для этого станка повторяется пункт б).

г) Если деталь поступила в накопитель Н1, то увеличивается счётчик элементов очереди.

д) Если станок №1 повторной обработки свободен, то деталь поступает на свободный станок, а счетчик элементов очереди уменьшается на 1. Иначе если в очереди больше трёх деталей, то подключается ещё один станок. Если же оба станка заняты, то ожидается освобождение одного из них.

После запуска на экран монитора будет выведено основное рабочее окно программы. Интерфейс программы содержит в верхней части меню пользователя, в котором содержатся пункты, позволяющие вывести сведения о программе и разработчике, просмотреть задание моделирования, произвести запуск, приостановление и продолжение моделирования работы цеха, просмотреть Q-схему и A-схему задачи, а также осуществить выход из программы.

2.3. Используемые технические средства, вызов и загрузка.

Для успешной работы с представленной программой "Моделирование работы цеха" необходим персональный компьютер на базе микропроцессора Intel 80586 и выше, VGA совместимая видеокарта, накопитель на жестком или гибком магнитном диске. Требования к операционной системе ограничены требованиями компилятора языка Delphi версии 6.0, то есть Windows 98 и выше.

Исходный текст программы находится в файлах под именами Progr1.pas, Progr2.pas, Progr3.pas, Progr4.pas, которые занимают соответственно 10 938, 622, 788, 2 383 байт, а исполняемый модуль под именем Kurs_project.exe – 1 067 088 байт.

Для запуска программы необходимо загрузить Windows и запустить указанный исполняемый файл Kurs_project.exe.

2.4. Входные и выходные данные.

К входным данным относятся данные, которые могут изменяться пользователем – время обработки заявок на каждом станке, максимально возможный процент брака и общая скорость моделирования.

К выходным данным следует отнести информацию, выводимую в процессе функционирования процесса моделирования:

- общее количество заявок;

- количество заявок, возвращённых на повторную обработку(первичный брак);

- количество деталей, которые попали в разряд бракованных дважды.

Следует отметить, что выполнение данной программы возможно лишь в случае наличия на компьютере всех необходимых технических средств.

2.5. Контрольный пример.

Для времени моделирования, равному поступлению 500 заявок, состояние системы (все параметры – по умолчанию):

- общее количество заявок – 500;

- количество деталей, возвращённых на повторную обработку – 31;

- количество бракованных деталей – 3.


2.6. Инструкция пользователю.

Работа с программой не представляет особой сложности даже для пользователя, не имеющего большого опыта работы с персональным компьютером. После запуска программы на экране появляется главное окно программы.

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

Программа запускается с помощью вызова исполняемого файла Kurs_project.exe в операционной системе Windows 98 или выше. На экране появится окно с изображением модели цеха.

Для того, чтобы запустить программу, необходимо выполнить команду Запуск меню Выполнение. Для остановки работы программы следует выполнить команду Стоп меню Выполнение. В этом же меню находится команда Параметры, которая позволяет установить вывод в окне статистики выполнения программы и текущего времени, а также команды Сброс и Выход, позволяющие, соответственно, "сбросить" данные и выйти из программы. При выходе из программы с помощью команды Выход меню Выполнение появляется окно с вопросом о подтверждении выхода из программы. Из программы можно выйти также с помощью нажатия соответствующей кнопки в правом верхнем углу окна программы.

Для того, чтобы просмотреть информацию о программе, необходимо выполнить команду О программе меню Справка. В этом же меню можно просмотреть задание, выбрав соответствующую команду.

В меню Схемы находятся команды, позволяющие выводить на экран соответственно Q-схему и A-схему программы.


3. ТЕКСТ ПРОГРАММЫ.

3.1. Модуль 1.

unitProgr1;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ExtCtrls, StdCtrls, Spin, Menus;

type

TForm1 = class(TForm)

P1_4: TPanel;

P2_4: TPanel;

P2_3: TPanel;

P1_3: TPanel;

P1_1: TPanel;

pb1: TProgressBar;

pb2: TProgressBar;

Panel8: TPanel;

Panel9: TPanel;

Panel10: TPanel;

Panel11: TPanel;

pb3: TProgressBar;

Panel14: TPanel;

pb4: TProgressBar;

Panel15: TPanel;

Panel16: TPanel;

Panel17: TPanel;

Panel18: TPanel;

Memo2: TMemo;

Memo3: TMemo;

Memo4: TMemo;

Memo5: TMemo;

Timer1: TTimer;

pb_start: TProgressBar;

Timer2: TTimer;

P1_2: TPanel;

P2_1: TPanel;

P2_2: TPanel;

Panel5: TPanel;

Panel21: TPanel;

Panel24: TPanel;

Panel25: TPanel;

Panel26: TPanel;

Panel27: TPanel;

Panel28: TPanel;

Panel31: TPanel;

Label1: TLabel;

Label3: TLabel;

Label2: TLabel;

Label4: TLabel;

p1: TPanel;

p2: TPanel;

Panel34: TPanel;

Panel35: TPanel;

Panel36: TPanel;

Panel38: TPanel;

Panel40: TPanel;

Panel41: TPanel;

Panel42: TPanel;

Panel44: TPanel;

Panel45: TPanel;

Panel12: TPanel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

indicator1: TProgressBar;

indicator2: TProgressBar;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

Q1: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N8: TMenuItem;

N9: TMenuItem;

N10: TMenuItem;

N11: TMenuItem;

Label11: TLabel;

Label12: TLabel;

Label13: TLabel;

Label14: TLabel;

Label15: TLabel;

Label16: TLabel;

Label17: TLabel;

Bevel1: TBevel;

Panel1: TPanel;

procedure Timer2Timer(Sender: TObject);

procedure add_new(ad:byte);

procedure FormCreate(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure N11Click(Sender: TObject);

procedure N9Click(Sender: TObject);

procedure Q1Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure N7Click(Sender: TObject);

procedure N10Click(Sender: TObject);

procedure N8Click(Sender: TObject);

private { Private declarations }

public { Public declarations }

end;

var

Form1: TForm1;

t1,t2:byte;

ustanov,zapusk,ripit,

zanyat1,zanyat2,zanyat3,zanyat4:boolean;

have1,have2,have_povtor:boolean;

TotalTime,TotalMessages,

LostMessages,RepeatMessages:longint;

brak1,brak2,time1,time2,time3,time4,zadergka:byte;

implementation

uses Progr2, progr3, Progr4;

{$R *.DFM}

function where_go(w:byte):boolean;

var x:integer;

begin if (w=1)then begin

x:=trunc(random(100));

if (x>brak1)and(RepeatMessages<(5*(brak1+brak2))) then where_go:=true;end;

if (w=2)then begin

x:=trunc(random(100));if (x>brak2)and(RepeatMessages<(5*(brak1+brak2))) then where_go:=true;end;

end;

procedure prov_nak; {процедура проверки пустоты накопителей}

begin

have1:=false;have2:=false;have_povtor:=FALSE;

if strtoint(form1.label6.caption)>=1 then have1:=true;

if strtoint(form1.label8.caption)>=1 then have2:=true;

if strtoint(form1.label10.caption)>=1 then have_povtor:=true;

end;

procedure Tform1.add_new(ad:byte);

begin

if ad=1 then begin

label6.caption:=inttostr(strtoint(label6.caption)+1);

indicator1.Position:=strtoint(label6.caption)*10;

end

else begin

label8.Caption:=inttostr(strtoint(label8.Caption)+1);

indicator2.Position:=strtoint(label8.Caption)+2;

end;

end;

procedure run;

{переводит заявки из приборов в накопители и наоборот}

begin

if have1 then

if not(zanyat1) then

begin

form1.pb1.Max:=time1+round(random(80));{времяобработкизадания}

form1.pb1.Position:=2;

form1.label6.Caption:=inttostr(strtoint(form1.label6.Caption)-1);

form1.indicator1.Position:=strtoint(form1.label6.Caption)*10;

zanyat1:=true;prov_nak;end;

if have_povtor then if not(zanyat2) then

begin form1.pb2.Max:=time2+round(random(80));

form1.pb2.Position:=2; form1.label10.Caption:=inttostr(strtoint(form1.label10.Caption)-1);

zanyat2:=true;ripit:=true;prov_nak;end;

if have1 then

if not(zanyat2) then

begin

form1.pb2.Max:=time2+round(random(80)); form1.pb2.Position:=2;

form1.label6.Caption:=inttostr(strtoint(form1.label6.Caption)-1);

form1.indicator1.Position:=strtoint(form1.label6.Caption)*10;

zanyat2:=true;

prov_nak; end;

if (have2) and(not(zanyat3)) then

begin

form1.pb3.Max:=time3+round(random(80)); form1.pb3.Position:=2;

form1.label8.Caption:=inttostr(strtoint(form1.label8.Caption)-1);

form1.indicator2.Position:=form1.indicator2.Position-2;

zanyat3:=true;prov_nak;end;

if (strtoint(form1.label8.caption)>3) and( not(zanyat4)) then

begin

form1.pb4.Max:=time4+round(random(80)); form1.pb4.Position:=2;

form1.label8.Caption:=inttostr(strtoint(form1.label8.Caption)-1);

form1.indicator2.Position:=form1.indicator2.Position-2;

zanyat4:=true;

prov_nak;

end;

end;

procedure TForm1.Timer2Timer(Sender: TObject);

var t:real;

i:integer;

begin

if (zapusk)and(TotalMessages<500) then

begin

if not(ustanov)then

begin

t1:=5+trunc(random(10));

ustanov:=true;

zapusk:=ustanov;

t2:=0;

end

else

if t2=t1 then

begin

t:=0;

for i:=1 to 1000 do

begin

pb_start.Position:=(pb_start.Position+trunc(t));

t:=t+0.01;

end;

add_new(1);

inc(TotalMessages);{количество всех сообщений пришедших в систему}

pb_start.Position:=0;

t2:=0;

ustanov:=false;

end

else inc(t2);

prov_nak;

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

randomize;

label1.Caption:='Ждёт';label2.Caption:='Ждёт';

label3.Caption:='Ждёт';label4.Caption:='Ждёт';

zanyat1:=false;zanyat2:=false;zanyat3:=false;

zanyat4:=false;

brak1:=4;brak2:=8;time1:=40;time2:=60;

time3:=100;time4:=100;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

if zapusk then begin

if pb1.Position=pb1.max then begin

pb1.Position:=0;zanyat1:=false;

label1.Caption:='Ждёт';

if where_go(1)then add_new(2)

else

if RepeatMessages<((brak1+brak2)*5) then

begin

label10.Caption:=inttostr(strtoint(label10.Caption)+1);

inc(RepeatMessages);

end

else add_new(2);

end;

if pb2.Position=pb2.max then

begin

pb2.Position:=0;zanyat2:=false;label2.Caption:='Ждёт';

if where_go(2)then add_new(2)

else

if (ripit)and(LostMessages<trunc(RepeatMessages*brak2)/100) then

begin

p1.Color:=clred;p2.Color:=clred;

p1.Color:=$00400040;p2.Color:=$00400040;

ripit:=false;

inc(LostMessages);

end

else

if RepeatMessages<((brak1+brak2)*5) then

begin

label10.Caption:=inttostr(strtoint(label10.Caption)+1);

inc(RepeatMessages);

end

else add_new(2);

end;

if pb3.Position=pb3.max then

begin pb3.Position:=0;zanyat3:=false;label3.Caption:='Ждёт';end;

if pb4.Position=pb4.max then

begin pb4.Position:=0;zanyat4:=false;label4.Caption:='Ждёт';end;

if pb1.Position>0 then

begin pb1.Position:=pb1.Position+7;label1.Caption:='Выполняет';end;

if pb2.Position>0 then

begin pb2.Position:=pb2.Position+7;label2.Caption:='Выполняет';end;

if pb3.Position>0 then

begin pb3.Position:=pb3.Position+7;label3.Caption:='Выполняет';end;

if pb4.Position>0 then

begin pb4.Position:=pb4.Position+7;label4.Caption:='Выполняет';end;

run;

label12.Caption:=inttostr(TotalMessages);

label14.Caption:=inttostr(RepeatMessages);

label16.Caption:=inttostr(LostMessages);

end;

label17.Caption:=timetostr(time);

end;

procedure TForm1.N2Click(Sender: TObject);

begin

zapusk:=true;

n2.enabled:=false;

n3.enabled:=true;

end;

procedure TForm1.N3Click(Sender: TObject);

begin

zapusk:=false;

n2.enabled:=true;

n3.enabled:=false;

end;

procedure TForm1.N11Click(Sender: TObject);

begin

n2.Enabled:=true;

TotalMessages:=0;

LostMessages:=0;

RepeatMessages:=0;

label6.Caption:='0';

label8.Caption:='0';

label10.Caption:='0';

indicator1.Position:=0;

indicator2.Position:=0;

pb1.Position:=0;pb2.Position:=0;

pb3.Position:=0;pb4.Position:=0;

have1:=false;have2:=false;ripit:=false;

zanyat1:=false;zanyat2:=false;

zanyat3:=false;zanyat4:=false;

TotalTime:=0;TotalMessages:=0;

randomize;

end;

procedure TForm1.N9Click(Sender: TObject);

var c:integer;

begin

c:=application.MessageBox(pchar('Выуверенывтомчтохотитезавершитьработу ???'),pchar('Предупреждение'),4);

if c=6 then halt;

end;

procedure TForm1.Q1Click(Sender: TObject);

begin

form2.PageControl1.ActivePage:=form2.PageControl1.Pages[0] ;

form2.ShowModal;

end;

procedure TForm1.N5Click(Sender: TObject);

begin

form2.PageControl1.ActivePage:=form2.PageControl1.Pages[1] ;

form2.ShowModal;

end;

procedure TForm1.N7Click(Sender: TObject);

begin

form3.PageControl1.ActivePage:=form3.PageControl1.Pages[0];

form3.showmodal;

end;

procedure TForm1.N10Click(Sender: TObject);

begin

form4.showmodal;

end;

procedure TForm1.N8Click(Sender: TObject);

begin

form3.PageControl1.ActivePage:=form3.PageControl1.Pages[1];

form3.showmodal;

end;

end.


3.2. Модуль 2.

unit Progr2;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ExtCtrls, ComCtrls;

type

TForm2 = class(TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

Image1: TImage;

Image2: TImage;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

public

end;

var

Form2: TForm2;

implementation

{$R *.DFM}

procedure TForm2.Button1Click(Sender: TObject);

begin

form2.Close;

end;

end.


3.3. Модуль 3.

unit Progr3;