а) Если очередной момент времени равен моменту поступления детали в накопитель Н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;