unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, TabNotBk, Math, Series, Buttons, GanttCh; type pointType=record tk: real; //время конца текущего участка моделирования work: boolean; //признак работоспособности элемента end; TFMain = class(TForm) MainMenu: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem; N5: TMenuItem; StatusBar: TStatusBar; GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox3: TGroupBox; Button1: TButton; Button2: TButton; TabbedNotebook: TTabbedNotebook; ChartGen: TChart; Series1: TBarSeries; Series2: TBarSeries; Series3: TBarSeries; ChartEl: TChart; Series4: TGanttSeries; ChartSys: TChart; Series5: TGanttSeries; LabeledEdit1: TLabeledEdit; LabeledEdit2: TLabeledEdit; LabeledEdit3: TLabeledEdit; LabeledEdit4: TLabeledEdit; LabeledEdit5: TLabeledEdit; LabeledEdit6: TLabeledEdit; Memo1: TMemo; Chart1: TChart; Chart2: TChart; Series6: TBarSeries; Series7: TBarSeries; Image1: TImage; procedure N2Click(Sender: TObject); procedure N1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure SystemOutput(p: array of pointType); //вывод procedure Input; //ввод исходных данных procedure N4Click(Sender: TObject); procedure N5Click(Sender: TObject); private public end; function RandE(r,n: real): real; //Экспоненциальный закон function RandV(r,t,v: real): real; //Закон Вейбулла function LogicF: boolean; //логическая функция работоспособности function MinEl: integer; //индекс минимального элемента на шаге function TheEnd: boolean; //условие выхода из цикла procedure Test(Chart: Tchart); //тест генераторов procedure Create_pSys; //создание массива системы const testnum=50; // кол-во тестовых значений elnum=3; // кол-во элементов var FMain: TFMain; v,T1,T,sigma,n,Tm: real; pEl: array[1..elnum] of pointType; // массив времен элементов pSys0: array of pointType; // массив времен системы по участкам pSys: array of pointType; // массив времен системы t_na: array of real; // массив времен восстановления системы t_av: array of real; // массив времен отказа системы crash: integer; // количество отказов системы srto: real; // средняя наработка на отказ srtv: real; // среднее время восстановления Kg: real; implementation {$R *.dfm} {------------------------------------------------------ ФУНКЦИИ -------------------------------------------------------} function RandE(r,n: real): real; begin result:=-(1/n)*ln(r); end; function RandV(r,t,v: real): real; begin result:=Power((-t*ln(r)),1/v); end; //закон Гаусса стандартный, в модуле Math function LogicF: boolean; begin result:=(pEl[1].work and pEl[2].work) or (pEl[1].work and pEl[3].work) or (pEl[2].work and pEl[3].work); end; function MinEl: integer; var i,imin: byte; max: real; Begin imin:=0; max:=10e38; for i:=1 to elnum do if pEl[i].tkpSys0[i+1].work then begin SetLength(pSys,k+1); pSys[k].work:=pSys0[i].work; pSys[k].tk:=pSys0[i].tk; inc(k); end; end; procedure TFMain.Input; var c: integer; begin Val(LabeledEdit1.Text,v,c); Val(LabeledEdit2.Text,T1,c); Val(LabeledEdit3.Text,T,c); Val(LabeledEdit4.Text,sigma,c); Val(LabeledEdit5.Text,n,c); Val(LabeledEdit6.Text,Tm,c); end; procedure TFMain.SystemOutput(p: array of pointType); var i,i_na,i_av: integer; begin crash:=0; i_na:=0; i_av:=0; srto:=0; srtv:=0; Memo1.Lines.Add(''); //вывод отказов for i:=0 to high(p) do if not p[i].work then inc(crash); if crash=0 then Memo1.Lines.Add(' Отказов в системе нет!') else begin crash:=0; for i:=0 to high(p) do if not p[i].work then begin inc(crash); Memo1.Lines.Add(' Отказ №'+ IntToStr(crash)+ ' произойдет при t='+FloatToStrF(p[i-1].tk,ffFixed,6,1)+' ч.'); end; Memo1.Lines.Add(''); Memo1.Lines.Add(' Всего отказов: '+IntToStr(crash)); end; Memo1.Lines.Add(''); //вывод диаграммы системы Series5.AddGanttColor(0,p[high(p)].tk,1,'',clGreen); for i:=1 to high(p) do if not (p[i].work) then Series5.AddGanttColor(p[i-1].tk,p[i].tk,1,'',clRed); for i:=0 to high(p) do if (p[i].work) then //вывод времен отказа begin SetLength(t_av,i_av+1); t_av[i_av]:=p[i].tk-p[i-1].tk; Series6.AddXY(i_av+1,t_av[i_av],'',clGreen); srto:=srto+t_av[i_av]; inc(i_av); end else //вывод времен восстановления begin SetLength(t_na,i_na+1); t_na[i_na]:=p[i].tk-p[i-1].tk; Series7.AddXY(i_na+1,t_na[i_na],'',clRed); srtv:=srtv+t_na[i_na]; inc(i_na); end; //подсчет итоговых значений if crash<>0 then {если отказы есть} begin srto:=srto/(i_av); srtv:=srtv/(i_na); Kg:=srto/(srto+srtv); Memo1.Lines.Add(' Средняя наработка на отказ: '+ FloatToStrF(srto,ffFixed,6,1)+' ч.'); Memo1.Lines.Add(' Среднее время восстановления: '+ FloatToStrF(srtv,ffFixed,6,1)+' ч.'); Memo1.Lines.Add(' Коэффициент готовности: '+ FloatToStrF(Kg,ffFixed,6,6)); end else {если отказов нет} begin Memo1.Lines.Add(' Средняя наработка на отказ: '+ FloatToStrF(srto,ffFixed,6,1)+' ч.'); Memo1.Lines.Add(' Среднее время восстановления: '+ FloatToStrF(srtv,ffFixed,6,1)+' ч.'); Kg:=1; Memo1.Lines.Add(' Коэффициент готовности: '+ FloatToStrF(Kg,ffFixed,1,0)); end; end; {------------------------------------------------------ ИНТЕРФЕЙСНЫЕ ПРОЦЕДУРЫ -------------------------------------------------------} procedure TFMain.N1Click(Sender: TObject); begin ShowMessage('Автор: Смирнов Сергей (ИУ2-103) 2005 г.'); end; procedure TFMain.N2Click(Sender: TObject); begin FMain.Close; //выход из программы end; procedure TFMain.N4Click(Sender: TObject); begin // Вариант №21 LabeledEdit1.Text:='1.2'; LabeledEdit2.Text:='10000'; LabeledEdit3.Text:='10000'; LabeledEdit4.Text:='2000'; LabeledEdit5.Text:='0.015'; LabeledEdit6.Text:='100000'; end; procedure TFMain.N5Click(Sender: TObject); begin //значпения для отладки LabeledEdit1.Text:='1.0'; LabeledEdit2.Text:='10000'; LabeledEdit3.Text:='10000'; LabeledEdit4.Text:='5000'; LabeledEdit5.Text:='0.0001'; LabeledEdit6.Text:='30000'; end; //запуск тестовой процедуры procedure TFMain.Button2Click(Sender: TObject); begin TabbedNotebook.ActivePage:='Тест генераторов'; ChartGen.Repaint; Test(ChartGen); end; {------------------------------------------------------ ЗАПУСК СЧЕТА -------------------------------------------------------} procedure TFMain.Button1Click(Sender: TObject); var i,j,k: integer; tmp: real; begin Finalize(pSys0); Finalize(pSys); Randomize; //запуск генератора Series1.Clear; Series2.Clear; Series3.Clear; Series4.Clear; Series5.Clear; Series6.Clear; Series7.Clear; Memo1.Clear; TabbedNotebook.ActivePage:='Работа элементов'; Input; //ввод исходных данных tmp:=0; for i:=1 to elnum do begin pEl[i].work:=true; {от нуля времени все элементы работают} case i of {генерируем длительности} 1,2: tmp:=RandV(random,T1,v); 3: tmp:=RandG(T,sigma); end; if tmpTm then if pEl[j].work then begin Series4.AddGanttColor(pEl[j].tk,Tm,j,IntToStr(j),clGreen); pEl[j].tk:=Tm; end else pEl[j].tk:=Tm else if pEl[j].work then begin pEl[j].tk:=pEl[j].tk+tmp; Series4.AddGanttColor(pEl[j].tk-tmp,pEl[j].tk,j,IntToStr(j), clGreen); end else pEl[j].tk:=pEl[j].tk+tmp; end; j:=MinEl; SetLength(pSys0,k+1); pSys0[k].work:=LogicF; {признак работы системы} pSys0[k].tk:=pEl[j].tk; {длительность работы/неработы системы} Create_pSys; {создаем массив системы} SystemOutput(pSys); {выводим диаграмму системы} Finalize(pSys0); Finalize(pSys); end; end.