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.
-----------------
Hosted by uCoz