program Imitacia_SMO;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
----------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, jpeg;
Const
ME_POKAZA = WM_USER + 120;
ME_POKAZB = WM_USER + 180;
ME_POKAZC = WM_USER + 260;
ME_POKAZTIME1 = WM_USER + 140;
ME_POKAZAB1 = WM_USER + 160;
ME_POKAZAB2 = WM_USER + 165;
ME_POKAZBC1 = WM_USER + 220;
ME_POKAZBC2 = WM_USER + 230;
type
TForm1 = class(TForm)
Label1: TLabel;
edTemp: TEdit;
Timer1: TTimer;
btnStart: TButton;
reZadanie: TRichEdit;
btnExit: TButton;
imEA: TImage;
pbEA: TProgressBar;
pbEB: TProgressBar;
stEA: TStaticText;
StaticText1: TStaticText;
Label2: TLabel;
edT1: TEdit;
Label3: TLabel;
edTTT: TEdit;
Label4: TLabel;
edT2: TEdit;
Label5: TLabel;
edT3: TEdit;
Label6: TLabel;
edT6: TEdit;
Label7: TLabel;
edT4: TEdit;
Label8: TLabel;
edT5: TEdit;
imEB: TImage;
StaticText2: TStaticText;
stEB: TStaticText;
imAB1: TImage;
imAB2: TImage;
imPaket: TImage;
Label9: TLabel;
edEA: TEdit;
Label10: TLabel;
edEB: TEdit;
Label11: TLabel;
edEP: TEdit;
imC: TImage;
pbC: TProgressBar;
StaticText3: TStaticText;
stC: TStaticText;
imBC1: TImage;
imBC2: TImage;
Label12: TLabel;
edPaket: TEdit;
stBC1: TStaticText;
stBC2: TStaticText;
stAB2: TStaticText;
stAB1: TStaticText;
btnStop: TButton;
st2AB1: TStaticText;
st2AB2: TStaticText;
st2BC1: TStaticText;
st2BC2: TStaticText;
StaticText4: TStaticText;
stT1: TStaticText;
cbSboi: TCheckBox;
btnSxema: TButton;
Button1: TButton;
procedure btnStartClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure btnSxemaClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure MEDobava();
procedure MEPokazA(var Msg: TMessage); message ME_POKAZA;
procedure MEPokazB(var Msg: TMessage); message ME_POKAZB;
procedure MEPokazC(var Msg: TMessage); message ME_POKAZC;
procedure MEPokazTime1(var Msg: TMessage); message ME_POKAZTIME1;
procedure MEZapuskAB1(Sboi: Boolean);
procedure MEZapuskAB2(Sboi: Boolean);
procedure MEZapuskBC1(Sboi: Boolean);
procedure MEZapuskBC2(Sboi: Boolean);
procedure MEPokazAB1(var Msg: TMessage); message ME_POKAZAB1;
procedure MEPokazAB2(var Msg: TMessage); message ME_POKAZAB2;
procedure MEPokazBC1(var Msg: TMessage); message ME_POKAZBC1;
procedure MEPokazBC2(var Msg: TMessage); message ME_POKAZBC2;
procedure MEStopAB1(Var Sboi: Boolean);
procedure MEStopAB2(Var Sboi: Boolean);
procedure MEStopBC1(Var Sboi: Boolean);
procedure MEStopBC2(Var Sboi: Boolean);
procedure MERezervBC1();
procedure MERezervBC2();
procedure Konec();
function funtt1(Lambda1: double): double;
function funtt2(): double;
function funtt3(): double;
function funtt4(): double;
function funtt5(): double;
function funtt6(): double;
function funNN(): word;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation uses Math, Unit2;
Const Lambd1 = 0.1;
{$R *.dfm}
Type
TReal1DArray = array of Double;
var
// Time1 время текущее, мсек
Time1, TimePred, ttt2, ttt3, ttt5, ttt6, Acount, B1count, B2count,
TimeStartAB2, TimeStartAB1, TimeStartBC1, TimeStartBC2,
EmkEA, EmkEB, EmkEP, ResultCount, maxPaketov,
DlinaA, DlinaB, SumAB1, SumAB2, SumBC1, SumBC2:cardinal;
att1, att2, att3, att4, att5, att6 : array of double;
iiA, iiAB1, iiAB2, iiBC1, iiBC2, iiC : cardinal;
lent1, lent2, lent3, lent4, lent5, lent6, SbAB1,SbAB2, SbBC1, SbBC2 : cardinal;
Mean1, StdDev1, Mean2, StdDev2, Mean3, StdDev3, Mean4, StdDev4,
Mean5, StdDev5, Mean6, TRez, StdDev6, ttt1: double;
First: Boolean = true;
t1, t2, t3, t4, t4_2, t5, t6, ttt4 : Double;
{вероятность подключения резервной аппаратуры,
время работы резервной аппаратуры,
средняя длина очередей в п. А и В.
}
LiniaAB1Zanata: Boolean = false;
LiniaAB2Zanata: Boolean = false;
LiniaAB1Activna: Boolean = false;
LiniaAB2Activna: Boolean = false;
LiniaBC1Zanata: Boolean = false;
LiniaBC1Activna: Boolean = false;
LiniaBC2Zanata: Boolean = false;
LiniaBC2Activna: Boolean = false;
SboiAB1, SboiAB2, SboiBC1, SboiBC2: Boolean;
procedure MeanAndSD(A: array of Double; Nmax: Cardinal;
var Sredn, Sigma: double);
var ii, ii2: cardinal; // lent6
begin
Sredn := 0; Sigma := 0;
if (Nmax = 0) then exit;
for ii:=0 to Nmax-1 do
begin ii2:= ii + 2*ii - (ii + ii); Sredn := Sredn + A[ii];
end;
Sredn := Sredn / Nmax;
for ii := 0 to Nmax-1 do
Sigma := Sigma + sqr(A[ii] - Sredn);
Sigma := sqrt (Sigma /(Nmax - 1));
end;
function TForm1.funtt1(Lambda1: double): double;
// Интеграл от -беск до +беск от x*exp(-0.1*x)*dx = 100;
// поэтому мат ожидание (среднее знач ) для
// экспоненциального распределения с ламбда=0.1
// равно 0.1 * 100 = 10; = Lambda1 * 100; = ttt1 * 100;
var XM: double;
begin
XM := Lambda1 * 100;
Result := -XM*ln(1-Random);
end;
function TForm1.funtt2(): double;
begin
Result := RandG(ttt2, 0.2*ttt2);
// RandG из библиотеки Math генерирует случайные числа,
// распределенные по нормальному закону со среднм = ttt2 и
// стандартным отклонением = 0,2*ttt2
// В примере генерируются по простой формуле:
// Result := Sigma*sqrt(-2*ln(x1))*sin(2*pi*x2)+Среднее_знач;
// где x1,x2 - случайные числа (random)
// Так что можно записать:
// Result := 0.2*ttt2*sqrt(-2*ln(random))*sin(2*pi*random) + ttt2;
end;
function TForm1.funtt3(): double;
begin
Result := RandG(ttt3, 0.2*ttt3);
end;
function TForm1.funtt4(): double;
begin
Result := RandG(ttt4, 0.2*ttt4);
t4_2 := Result;
end;
function TForm1.funtt5(): double;
begin
Result := RandG(ttt5, 0.2*ttt5);
end;
function TForm1.funtt6(): double;
begin
Result := RandG(ttt6, 0.2*ttt6);
end;
function TForm1.funNN(): word;
// Задано : N является стационарным случайным процессом
// с нормальным законом распределения и интервалом разброса [0...4].
// => параметры распределения: M = 2.5 Sigma = 0.5 (правило 3 sigma)
var RR1: double;
begin
RR1 := RandG(2.5, 0.5);
if RR1 < 0 then RR1 := 0 else if RR1 > 4 then RR1 := 4;
if cbSboi.Checked then Result := Round(RR1) else Result := 0;
end;
procedure TForm1.MEDobavA();
begin
TimePred := Time1; Acount := Acount + 1;
att1[iiA]:= t1; lent1 := lent1 + 1; iiA:= iiA + 1;
t1 := funtt1(ttt1);
PostMessage(Form1.Handle,ME_POKAZA,0,0);
end;
procedure TForm1.MEPokazA(var Msg: TMessage);
var bufsi : string;
begin
pbEA.Position := Acount; // отображаю число пакетов в А
stEA.Caption := IntToStr(Acount); // отображаю число пакетов в А
imPaket.Visible := true; str(t1:0:2, bufsi); stT1.Caption := bufsi;
Application.ProcessMessages;
sleep(40);
imPaket.Visible := false;
if imPaket.Top < 160 then
imPaket.Top := imPaket.Top + 2 else
imPaket.Top := 16;
end;
procedure TForm1.MEPokazB(var Msg: TMessage);
begin
pbEB.Position := B1count + B2Count; // отображаю число пакетов в B
stEB.Caption := IntToStr(B1count + B2Count);
// отображаю число пакетов в B
end;
procedure TForm1.MEPokazC(var Msg: TMessage);
begin
pbC.Position := ResultCount; // отображаю число пакетов в B
stC.Caption := IntToStr(ResultCount);
// отображаю число пакетов в C
end;
procedure TForm1.MEPokazTime1(var Msg: TMessage);
begin
edTTT.Text := IntToStr(Time1);
end;
procedure TForm1.MEZapuskAB1(Sboi: Boolean);
begin
LiniaAB1Zanata:= true;
TimeStartAB1:= Time1;
if not Sboi then
begin
Acount := Acount - 1; SumAB1 := SumAB1 + 1;
end;
PostMessage(Form1.Handle,ME_POKAZAB1,0,0); //медленная операция - показ АВ1
PostMessage(Form1.Handle,ME_POKAZA,0,0); //медленная операция - показ А
end;
procedure TForm1.MEZapuskAB2(Sboi: Boolean);
begin
LiniaAB2Zanata:= true;
TimeStartAB2:= Time1;
if not Sboi then
begin
Acount := Acount - 1; SumAB2 := SumAB2 + 1;
end;
PostMessage(Form1.Handle,ME_POKAZAB2,0,0); //медленная операция - показ АВ2
PostMessage(Form1.Handle,ME_POKAZA,0,0); //медленная операция - показ А
end;
procedure TForm1.MEZapuskBC1(Sboi: Boolean);
begin
LiniaBC1Zanata:= true;
TimeStartBC1:= Time1;
if not Sboi then
begin
B1count := B1count - 1; SumBC1 := SumBC1 + 1;
end;
PostMessage(Form1.Handle,ME_POKAZBC1,0,0); //медленная операция - показ АВ2
PostMessage(Form1.Handle,ME_POKAZB,0,0); //медленная операция - показ А
end;
procedure TForm1.MEZapuskBC2(Sboi: Boolean);
begin
LiniaBC2Zanata:= true;
TimeStartBC2:= Time1;
if not Sboi then
begin
B2count := B2count - 1; SumBC2 := SumBC2 + 1;
end;
PostMessage(Form1.Handle,ME_POKAZBC2,0,0); //медленная операция - показ АВ2
PostMessage(Form1.Handle,ME_POKAZB,0,0); //медленная операция - показ А
end;
procedure TForm1.MEPokazAB1(var Msg: TMessage);
begin
if LiniaAB1Zanata then
begin imAB1.Visible := true; stAB1.Visible:= true;
st2AB1.Caption := IntToStr(SumAB1);
end else
begin imAB1.Visible := false; stAB1.Visible:= false;
end;
end;
procedure TForm1.MEPokazAB2(var Msg: TMessage);
begin
if LiniaAB2Zanata then
begin imAB2.Visible := true; stAB2.Visible:= true;
st2AB2.Caption := IntToStr(SumAB2);
end else
begin imAB2.Visible := false; stAB2.Visible:= false;
end;
end;
procedure TForm1.MEPokazBC1(var Msg: TMessage);
begin
if LiniaBC1Zanata then
begin imBC1.Visible := true; stBC1.Visible:= true;
st2BC1.Caption := IntToStr(SumBC1);
end else
begin imBC1.Visible := false; stBC1.Visible:= false;
end;
end;
procedure TForm1.MEPokazBC2(var Msg: TMessage);
begin
if LiniaBC2Zanata then
begin imBC2.Visible := true; stBC2.Visible:= true;
st2BC2.Caption := IntToStr(SumBC2);
end else
begin imBC2.Visible := false; stBC2.Visible:= false;
end;
end;
procedure TForm1.MEStopAB1(Var Sboi: Boolean);
Var Busi: string; NSboev: word;
begin
att2[iiAB1]:= t2;
NSboev := funNN(); if NSboev > 3 then
begin Sboi := true; stAB1.Font.Color := clRed;
stAB1.Caption := 'СБОЙ'; LiniaAB1Zanata:= true;
MEZapuskAB1(Sboi);
end else
begin Sboi := false; stAB1.Font.Color := clWindowText;
str(t2:6:2, busi); stAB1.Caption := busi;
LiniaAB1Zanata:= false;
B1count:= B1count + 1;
end;
lent2 := lent2 + 1; iiAB1:= iiAB1 + 1;
t2 := funtt2();
PostMessage(Form1.Handle,ME_POKAZAB1,0,0); //медленная операция - показ В
PostMessage(Form1.Handle,ME_POKAZB,0,0); //медленная операция - показ В
end;
procedure TForm1.MEStopAB2(Var Sboi: Boolean);
Var Busi: string; NSboev: word;
begin
att3[iiAB2]:= t3;
NSboev := funNN(); if NSboev > 3 then
begin Sboi := true; stAB2.Font.Color := clRed;
stAB2.Caption := 'СБОЙ';
LiniaAB2Zanata:= true; MEZapuskAB2(Sboi);
end else
begin Sboi := false; stAB2.Font.Color := clWindowText;
str(t3:6:2, busi); stAB2.Caption := busi; LiniaAB2Zanata:= false;
B2count:= B2count + 1;
end;
lent3 := lent3 + 1; iiAB2:= iiAB2 + 1;
t3 := funtt3();
PostMessage(Form1.Handle,ME_POKAZAB2,0,0); //медленная операция - показ AВ2
PostMessage(Form1.Handle,ME_POKAZB,0,0); //медленная операция - показ В
end;
procedure TForm1.MEStopBC1(Var Sboi: Boolean);
Var Busi: string; NSboev: word;
begin
att4[iiAB2]:= t4;
NSboev := funNN(); if NSboev > 3 then
begin Sboi := true; stBC1.Font.Color := clRed;
stBC1.Caption := 'СБОЙ'; LiniaBC1Zanata:= true; MEZapuskBC1(Sboi);
end else
begin Sboi := false; stBC1.Font.Color := clWindowText;
str(t4:6:2, busi); stBC1.Caption := busi; LiniaBC1Zanata:= false;
ResultCount := ResultCount + 1;
end;
lent4 := lent4 + 1; iiBC1:= iiBC1 + 1;
t4 := funtt4();
PostMessage(Form1.Handle,ME_POKAZBC1,0,0); //медленная операция - показ BC1
PostMessage(Form1.Handle,ME_POKAZC,0,0); //медленная операция - показ C
end;
procedure TForm1.MEStopBC2(Var Sboi: Boolean);
Var Busi: string; NSboev: word;
begin
att5[iiBC1]:= t5;
NSboev := funNN(); if NSboev > 3 then
begin Sboi := true; stBC2.Font.Color := clRed;
stBC2.Caption := 'СБОЙ'; LiniaBC2Zanata:= true; MEZapuskBC2(Sboi);
end else
begin Sboi := false; stBC2.Font.Color := clWindowText;
str(t5:6:2, busi); stBC2.Caption := busi; LiniaBC2Zanata:= false;
ResultCount := ResultCount + 1;
end;
lent5 := lent5 + 1; iiBC2:= iiBC2 + 1;
t5 := funtt5();
PostMessage(Form1.Handle,ME_POKAZBC2,0,0); //медленная операция - показ BC2
PostMessage(Form1.Handle,ME_POKAZC,0,0); //медленная операция - показ C
end;
procedure TForm1.MERezervBC1();
Var Busi: string;
begin
if (B1count + B2count >= EmkEP) then
begin t4:= t6; t6 := funtt6();
TRez := TRez + t6;
att6[iiC]:= t6;
lent6 := lent6 + 1;
iiC:= iiC + 1;
end;
// else t4:= StrToFloat(edT4.Text); - вероятно, это не нужно
str(t4:6:2, busi); stBC1.Caption := busi;
end;
procedure TForm1.MERezervBC2();
Var Busi: string;
begin
if (B1count + B2count >= EmkEP) then
begin t5:= t6; t6 := funtt6();
TRez := TRez + t6;
att6[iiC]:= t6;
lent6 := lent6 + 1;
iiC:= iiC + 1;
end;
// else t5:= StrToInt(edT5.Text); - вероятно, это не нужно
str(t5:6:2, busi); stBC2.Caption := busi;
end;
procedure TForm1.Konec();
var bufsi, bufsi2: string;
begin
Timer1.Enabled:= false;
// Вызывается процедура MeanAndSD которая
// вычисляет среднее значение Mean и стандартное отклонение StdDev
// для массива чисел att1 и т п
MeanAndSd(att1, lent1, Mean1, StdDev1);
att1:= nil;
MeanAndSd(att2, lent2, Mean2, StdDev2);
att2:= nil;
MeanAndSd(att3, lent3, Mean3, StdDev3);
att3:= nil;
MeanAndSd(att4, lent4, Mean4, StdDev4);
att4:= nil;
MeanAndSD(att5, lent5, Mean5, StdDev5);
att5:= nil;
MeanAndSD(att6, lent6, Mean6, StdDev6);
att6:= nil;
if first then reZadanie.Lines.Clear; first := false;
reZadanie.Lines.Add(DateTimeToStr(Now) + ' Работа модели закончена. '+
'Результаты:');
reZadanie.SelStart := 0; reZadanie.SelLength := 100000;
reZadanie.SelAttributes.Color := clNavy;
reZadanie.SelAttributes.Name := 'Courier New';
reZadanie.SelAttributes.Size := 11;
{ reZadanie.SelStart := 0; reZadanie.SelLength := 37;
reZadanie.SelAttributes.Color := clNavy;
reZadanie.SelAttributes.Size := 14;
reZadanie.SelAttributes.Style := [fsBold, fsUnderline];
reZadanie.SelStart := 38;
reZadanie.SelLength := 1000;
reZadanie.SelAttributes.Color := clBlack;
reZadanie.SelAttributes.Size := 11;
reZadanie.SelAttributes.Name := 'Courier New';
}
str(TRez:0:2,bufsi);
reZadanie.Lines.Append('время работы резервной аппаратуры = '
+ bufsi); str(100*TRez/Time1:0:2,bufsi);
reZadanie.Lines.Append( 'вероятность подключ резерв. = '
+bufsi+'%'); str(DlinaA/Time1:0:2,bufsi);
reZadanie.Lines.Append('средняя длина очередей A = '
+bufsi); str(DlinaB/Time1:0:2,bufsi);
reZadanie.Lines.Append('средняя длина очередей B = '
+bufsi);
reZadanie.Lines.Append(' ---------- СТАТИСТИКА: ------------- ');
str(Mean1:0:2,bufsi); str(stddev1:0:2,bufsi2);
reZadanie.Lines.Append('t1: среднее знач = '+ bufsi+
' станд. отклонен = ' + bufsi2);
str(Mean2:0:2,bufsi); str(stddev2:0:2,bufsi2);
reZadanie.Lines.Append('t2: среднее знач = '+ bufsi+
' станд. отклонен = ' + bufsi2);
str(Mean3:0:2,bufsi); str(stddev3:0:2,bufsi2);
reZadanie.Lines.Append('t3: среднее знач = '+ bufsi+
' станд. отклонен = ' + bufsi2);
str(Mean4:0:2,bufsi); str(stddev4:0:2,bufsi2);
reZadanie.Lines.Append('t4: среднее знач = '+ bufsi+
' станд. отклонен = ' + bufsi2);
str(Mean5:0:2,bufsi); str(stddev5:0:2,bufsi2);
reZadanie.Lines.Append('t5: среднее знач = '+ bufsi+
' станд. отклонен = ' + bufsi2);
str(Mean6:0:2,bufsi); str(stddev6:0:2,bufsi2);
reZadanie.Lines.Append('t6: среднее знач = '+ bufsi+
' станд. отклонен = ' + bufsi2);
reZadanie.Lines.Append(' ----------------------- ');
reZadanie.Lines.Append('затраченное время = '+edTTT.Text);
reZadanie.Lines.Append('Сбоев АВ1, АВ2, ВС1, ВС2 = '+
IntToStr(SbAB1) + ' '+ IntToStr(SbAB2)+' '+ IntToStr(SbBC1)+' '
+ IntToStr(SbBC2));
reZadanie.Lines.Append('===============================================');
reZadanie.Lines.Append('');
btnStop.Enabled := false;
end;
procedure TForm1.btnStartClick(Sender: TObject);
begin
// if fileexists('Zadanie2.rtf') then
// reZadanie.Lines.LoadFromFile('Zadanie2.rtf') else
// showmessage('Кто-то удалил файл Zadanie2.rtf'+#13#10+
// 'в котором описано задание !');
btnStop.Enabled := true;
Time1 := 0; // Время модели. Увеличивается в каждом цикле на 1
Acount := 0; // Число пакетов в накопителе А
B1count := 0; // Число пакетов в накопителе В1 (это часть накопителя В)
B2count := 0; // Число пакетов в накопителе В2
ResultCount := 0; // Число пакетов на выходе (прошли систему и вышли)
TimePred := 52; // Время начала работы (накопитель А готов к приему пакетов)
// ttt1:= StrToInt(edT1.Text);
ttt1:= StrToFloat(edT1.Text); // среднее значение для t1 (задается в окошке edT1.Text)
ttt2:= StrToInt(edT2.Text);
ttt3:= StrToInt(edT3.Text);
ttt4:= StrToFloat(edT4.Text);
ttt5:= StrToInt(edT5.Text);
ttt6:= StrToInt(edT6.Text);
t1 := funtt1(ttt1);
t2 := funtt2(); // Текущее значение для t2 (случайная величина. см функц funtt2)
t3 := funtt3();
t4 := funtt4();
t5 := funtt5();
t6 := funtt6();
stAB1.Caption := edT2.Text; // вначале эти окна показывают среднее значение t2 - t6,
// которое берут из окон edT2.Text - edT6.Text. Правильнее было бы отображать
// текущие значения t2 - t6, т е str(t2:0:2, bufsi); stAB2.Caption := bufsi;
stAB2.Caption := edT3.Text;
stBC1.Caption := FloatToStr(t4);
stBC2.Caption := FloatToStr(t5);
EmkEA := StrToInt(edEA.Text); // Емкости накопителей А, В и пороговое значение
// EP для включения резервной аппаратуры.
EmkEB := StrToInt(edEB.Text);
EmkEP := StrToInt(edEP.Text);
maxPaketov := StrToInt(edPaket.Text); // Число пакетов, корые должны пройти через
// систему (по заданию эот 1000, но ри отдадке 200 ибо долго ждать 1000)
SetLength(att1, maxPaketov + 10); // первоначальное выделение памяти для
// динамических массивов att1 - att6 и установление длины этих массивов
// (сколько чисел хранить). Массивы служат для запоминания случайных значений
// t1 - t6 во время работы моделей, а это нужно, чтобы вычислить характеристики
// случайных величин t1 - t6 и сопоставить с заданными (хотя в задании этого
// вроде бы нет, но полезно проверить, иначе нет уверенности, что прога работает
// правильно. Перед вычислением характеристик я устанавливаю фактические длины
// массивов. Для этого счетчики lent1 - lent6 считают количестово чисел в массивах. )
SetLength(att2, maxPaketov + 10); SetLength(att3, maxPaketov + 10);
SetLength(att4, maxPaketov + 10); SetLength(att5, maxPaketov + 10);
SetLength(att6, maxPaketov + 10);
iiA:=0; iiAB1:=0; iiAB2:=0; iiBC1:=0; iiBC2:=0; iiC:=0;
// индексы - порядковые номера чисел в массивах att1 - att6
pbEA.Max := EmkEA; // Устанавливаю максимальное значение дл pbEA (TProgressBar)
// котрый будет графически отображать текущее число пакетов в накопителе А
pbEB.Max := EmkEB;
pbC.Max := maxPaketov; // аналогично
DlinaA:=0; DlinaB:=0; // Текущая длина очереди (т е число пакетов) в накопителе А
TRez:=0; // Здесь будет накапливаться время работы резервной аппаратуры
Timer1.Interval := Round(StrToFloat(edTemp.Text)*1000); // Здесь задается
// период повторения цикла по времени. т е это период внутренних часов модели
Timer1.Enabled := true; // часы включены
LiniaAB1Zanata:= false; // линии АВ1, АВ2, ВС1, Вс2 - свободны (не заняты)
LiniaAB2Zanata:= false; LiniaBC1Zanata:= false; LiniaBC2Zanata:= false;
SboiAB1 := false; SboiAB2 := false; SboiBC1 := false; SboiBC2 := false;
TimeStartAB1 := 10000; // т е много-много. Чтобы раньше времени не срабатывало:
// if LiniaAB1Zanata AND (Time1 >= TimeStartAB1 + t2) then
// MESTOPAB1();
TimeStartAB2 := 10000; // т е много-много
TimeStartBC1 := 10000; // т е много-много
TimeStartBC2 := 10000; // т е много-много
PostMessage(Form1.Handle,ME_POKAZA,0,0);// Показать начальное состояние накопителей
PostMessage(Form1.Handle,ME_POKAZB,0,0);
PostMessage(Form1.Handle,ME_POKAZC,0,0);
SumAB1 := 0; // число запусков линии АВ1, т е сколько пакетов прошло через АВ1
SumAB2 := 0; // аналогично
SumBC1 := 0; SumBC2 := 0;
lent1 := 0; // счетчики длины массивов att1 - att6
lent2 := 0; lent3 := 0; lent4 := 0; lent5 := 0; lent6 := 0;
SbAB1 := 0; SbAB2 := 0; SbBC1 := 0; SbBC2 := 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin Randomize;
if fileexists('Zadanie2.rtf') then
reZadanie.Lines.LoadFromFile('Zadanie2.rtf') else
showmessage('Кто-то удалил файл Zadanie2.rtf'+#13#10+
'в котором описано задание !');
end;
procedure TForm1.btnExitClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.btnStopClick(Sender: TObject);
begin
Timer1.Enabled := not Timer1.Enabled;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Time1 := Time1 + 1;
if (Time1 >= TimePred + t1) AND (lent1 < maxPaketov) then
MEDOBAVA();
PostMessage(Form1.Handle,ME_POKAZTIME1,0,0);
if not LiniaAB1Zanata AND ( Acount > 0 ) then
MEZAPUSKAB1(false);
if (not LiniaAB2Zanata) and (Acount > 0) then
MEZAPUSKAB2(false);
if (not LiniaBC1Zanata) and (B1count > 0) then
MEZAPUSKBC1(false);
if (not LiniaBC2Zanata) and (B2count > 0) then
MEZAPUSKBC2(false);
if LiniaAB1Zanata AND (Time1 >= TimeStartAB1 + t2) then
MESTOPAB1(SboiAB1);
if SboiAB1 then inc(SbAB1);
if LiniaAB2Zanata AND (Time1 >= TimeStartAB2 + t3) then
MESTOPAB2(SboiAB2);
if SboiAB2 then inc(SbAB2);
if LiniaBC1Zanata AND (Time1 >= TimeStartBC1 + t4) then
MESTOPBC1(SboiBC1);
if SboiBC1 then inc(SbBC1);
if LiniaBC2Zanata AND (Time1 >= TimeStartBC2 + t5) then
MESTOPBC2(SboiBC2);
if SboiBC2 then inc(SbBC2);
if not LiniaBC1Zanata AND (B1count > 0) then
MERezervBC1()
else
PostMessage(Form1.Handle,ME_POKAZBC1,0,0); //медленная операция - показ BC1
if not LiniaBC2Zanata AND (B2count > 0) then
MERezervBC2()
else
PostMessage(Form1.Handle,ME_POKAZBC2,0,0); //медленная операция - показ BC2
if ResultCount >= maxPaketov then Konec();
DlinaA:= DlinaA + Acount;
DlinaB:= DlinaB + B1count + B2count;
end;
procedure TForm1.btnSxemaClick(Sender: TObject);
begin
Form2.ShowModal;
end;
procedure TForm1.Button1Click(Sender: TObject);
var buf: string; ii, len: integer;
begin
buf := DateTimeToStr(Now);
len := length(buf);
for ii:=1 to len do
begin if buf[ii] = ':' then buf[ii]:= '-';
end;
reZadanie.Lines.SaveToFile('Отчет ' + buf+'.rtf');
end;
end.
{
TDateTime
DateTimeToStr(DateTime: TDateTime): string;
DateTimeToStr(Now);
}
--------------------
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm2 = class(TForm)
ScrollBox1: TScrollBox;
Button1: TButton;
Image1: TImage;
Button2: TButton;
Button3: TButton;
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button3Click(Sender: TObject);
begin
if fileexists('block_Sxema.bmp') then
Image1.Picture.LoadFromFile('block_Sxema.bmp') else
showmessage('Потерян файл схемы block_Sxema.bmp');
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
if fileexists('block_Sxema2.bmp') then
Image1.Picture.LoadFromFile('block_Sxema2.bmp') else
showmessage('Потерян файл схемы block_Sxema2.bmp');
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
Button3Click(Sender);
end;
end.
-----------------