unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, TeEngine, Series, ExtCtrls, TeeProcs, Chart, ComCtrls, TeeFunci, GanttCh, Menus, Math, OleServer, Word2000 ; type TForm1 = class(TForm) Timer1: TTimer; Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Label2: TLabel; RadioGroup1: TRadioGroup; Button1: TButton; Image1: TImage; Edit6: TEdit; Edit7: TEdit; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Chart1: TChart; Series1: TGanttSeries; BitBtn2: TBitBtn; Button2: TButton; Label7: TLabel; Image2: TImage; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); Function RasprVeibula(T1,Nu:double):double; Function ExpRaspr(Lyambda:double):double; procedure BitBtn2Click(Sender: TObject); procedure closeForm(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TSysElement = class Sost:Array[1..6] of Boolean; T:Array[1..6] of double; end; TSistema = class Sost:Array[1..1000] of Boolean; T:Array[1..1000] of double; end; var Form1: TForm1; Elems:TSysElement; Sistema:TSistema; s:Integer; Tm,Srto,Srtb,Kg:Double; i,x: Double; tim: Cardinal; implementation {$R *.dfm} Uses Ver, Unit3; procedure TForm1.FormCreate(Sender: TObject); begin i:=1; Tm:=StrToFloat(Form1.Edit7.Text); Chart1.BottomAxis.AutomaticMaximum:=False; Chart1.BottomAxis.AutomaticMinimum:=False; Chart1.BottomAxis.Maximum:=Tm; Chart1.BottomAxis.Minimum:=0; Chart1.SeriesList.Clear; Chart1.Repaint; Chart1.Title.Text.Clear; Chart1.Title.Text.Add('Работа/отказ элементов системы'); Chart1.SeriesList.Add(Series1); Chart1.Repaint; Form1.Label7.Hide; Form1.Timer1.Interval:=100; Form1.Button2.Click; end; procedure TForm1.Button1Click(Sender: TObject); begin Close; end; Function Tform1.RasprVeibula(T1,Nu:double):double; Begin if (Nu>0) and (T1>0) then result:=Exp((1/Nu)*ln(-T1*ln(Random))) else result:=0; end; Function Tform1.ExpRaspr(Lyambda:Double):Double; var n: double; begin n:= Random; if (n>0) and (n<1) then n:=-(1/Lyambda)*ln(n) else n:=0; if n<0 then Result:=0 else Result:=n; end; procedure TForm1.BitBtn2Click(Sender: TObject); begin Form2.Show; Form1.Hide; end; procedure TForm1.closeForm(Sender: TObject); begin close; end; procedure TForm1.Button2Click(Sender: TObject); var st: string; r,Si,Tn,Mu,Nu,T_1,Lam:double; tt,i,t,z,k,t1,t2,ser1,ser2,cr,co:integer; MaT,Mot,Mrab: array [0..2,0..50] of integer; MO,MR,MO1,MR1: array [0..2,0..100] of integer; MOi,MRi: array [0..300] of integer; begin Chart1.Repaint; Series1.Clear; Tm:=StrToFloat(Form1.Edit7.Text); Tm:=round(Tm); T_1:=StrToFloat(Form1.Edit5.Text); T_1:=Round(T_1); Nu:=StrToFloat(Form1.Edit3.Text); Chart1.BottomAxis.Maximum:=Tm; Si := StrToFloat(Form1.Edit1.Text); Tn:=StrToFloat(Form1.Edit6.Text); Mu:=StrToFloat(Form1.Edit2.Text); Lam:=StrToFloat(Form1.Edit4.Text); Tn:=round(Tn); Form1.Label7.Hide; For i:= 0 to 2 do begin MaT[i,1]:=0; t:=2; z:=0; k:=1; repeat begin case Form1.RadioGroup1.ItemIndex of 0: r:= RandG(Tn,Si); 1: r:= ExpRaspr(Lam); 2: r:= RasprVeibula(T_1,Nu); end; tt:=Round(r); z:=z+1; if (z=5000) then begin Form1.Label7.Show; MaT[i,t-1]:= Round(Tm); Series1.AddGanttColor(MaT[i,t-1],MaT[i,t-2],i+1,IntToStr(i+1),ClBlack); end; if (MaT[i,t-1] Tm) or (z=5000); end; For tt:= 0 to 2 do begin case tt of 0: begin ser1:=0; ser2:=1; end; 1: begin ser1:=1; ser2:=2; end; 2: begin ser1:=2; ser2:=0; end; end; i:=1; while Mrab[ser1,i]<>7777777 do begin MR[tt,i]:=Mrab[ser1,i]; i:= i+1; end; i:= i-1; t:=1; while Mrab[ser2,t]<>7777777 do begin MR[tt,i+t]:=Mrab[ser2,t]; t:= t+1; end; MR[tt,i+t]:= 7777777; for k:=1 to 100 do begin i:=0; While MR[tt,i+1]<>7777777 do begin if (MR[tt,i+1]7777777 do begin MO[tt,i+1]:=Mot[ser1,i]; i:= i+1; end; t:=1; while Mot[ser2,t]<>7777777 do begin MO[tt,i+t]:=Mot[ser2,t]; t:= t+1; end; MO[tt,i+t]:= 7777777; for k:=1 to 100 do begin i:=0; While MO[tt,i+1]<>7777777 do begin if (MO[tt,i+1]=MR[tt,i] then begin Series1.AddGanttColor(MR[tt,i],t,4+tt,IntToStr(ser1+1)+','+IntToStr(ser2+1),ClWhite); t:=MR[tt,i]; MR1[tt,cr]:=t; cr:=cr+1; if (t<>0) and (t0) and (t7777777 do begin if MR1[k,i]>0 then MRi[i+tt]:=MR1[k,i]; i:= i+1; end; tt:=tt+i-1; end; MRi[tt+1]:= 7777777; // исключение двойных значений безотказности t:=0; i:=0; Repeat Repeat if (MRi[t]= MRi[i]) and (i<>t)then MRi[t]:=0; t:=t+1; Until MRi[t]=7777777; i:= i+1; t:=0; Until MRi[i]=7777777; //сортировка по возрастанию безотказности for k:=1 to 100 do begin i:=0; While MRi[i+1]<>7777777 do begin if (MRi[i+1]0; //создание массива отказов tt:=0; for k:= 0 to 2 do begin i:=0; repeat begin if MO1[k,i]>0 then MOi[i+tt]:=MO1[k,i]; i:= i+1; end; until MO1[k,i]=7777777; tt:=tt+i-1; end; MOi[tt+1]:= 7777777; // исключение двойных значений отказов t:=0; i:=0; Repeat Repeat if (MOi[t]= MOi[i]) and (i<>t)then MOi[t]:=0; t:=t+1; Until MOi[t]=7777777; i:= i+1; t:=0; Until MOi[i]=7777777; //сортировка по возрастанию безотказности for k:=1 to 100 do begin i:=0; While MOi[i+1]<>7777777 do begin if (MOi[i+1]0; i:=0; if MOi[0]<>0 then begin repeat t:=MOi[i+1]; MOi[i+1]:=MOi[i]; i:=i+1; MOi[i]:=t; until MOi[i]=0; MOi[0]:=0; end; i:=0; repeat i:=i+1; until MOi[i-1]=7777777; i:=0; repeat Series1.AddGanttColor(MRi[i],MOi[i],7,'итог',ClWhite); if (MRi[i+1]=7777777) then Series1.AddGanttColor(Tm,MRi[i],7,'итог',ClBlack) else Series1.AddGanttColor(MOi[i+1],MRi[i],7,'итог',ClBlack); i:=i+1; until MRi[i]=7777777; Form1.Label1.Caption:='Время наработки устройства до первого отказа = ' + IntToStr(MRi[0])+' часов'; if MOi[1]=7777777 then Form1.Label5.Caption:='Отказа на заданном интервале не происходит' else Form1.Label5.Caption:='Время для 1 восстановления устройства = ' + IntToStr(MOi[1]-MRi[0])+' часов'; str ((MRi[0]/MOi[1]):2:3,st); if MOi[1]=7777777 then Form1.Label6.Caption:='Коэффициент готовности = 1' else Form1.Label6.Caption:='Коэффициент готовности = ' + st; end; end.