close

Вход

Забыли?

вход по аккаунту

?

Приложение 1. Текст ИП

код для вставкиСкачать
ЗАКЛЮЧЕНИЕ
Приложение1. Текст имитационной программы
unit Unit_model;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, UModellingClasses, Buttons,
UVarList, UModelVars, UModelStructVars, ToolWin,
UFrameGraphicStat, URendererList, UListStruc, URandomStreams, Grids,
ValEdit, UReportGenerator, UControlWindow_base, UModelController, ImgList;
type
TForm_Model1 = class(TForm)
Panel_controls: TPanel;
RE_trace: TRichEdit;
Splitter_model: TSplitter;
Panel_Model: TPanel;
Splitter_controls: TSplitter;
PC_Info: TPageControl;
TracePage: TTabSheet;
Panel_trace: TPanel;
TB_buttons: TToolBar;
TB_exit: TToolButton;
PC_model: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
PC_main: TPageControl;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
TB_resize: TToolBar;
TB_min: TToolButton;
TB_mid: TToolButton;
TB_max: TToolButton;
ToolButton5: TToolButton;
Model1: TModel;
Criteria: TVarsGroup;
Vars: TVarsGroup;
Parameters: TVarsGroup;
RandomStreams: TRandomStreamsGroup;
ListStrucsGroup: TListStrucsGroup;
RenderersFrame1: TRenderersFrame;
VLE_params: TValueListEditor;
VLE_results: TValueListEditor;
PC_Controls: TPageControl;
TabSheet6: TTabSheet;
ModelController1: TModelController;
TabSheet7: TTabSheet;
ReportGenerator1: TReportGenerator;
IL_resize: TImageList;
Lambda: TModelVarReal;
Mu: TModelVarReal;
M: TModelVarInteger;
TP: TModelVarInteger;
KVZ: TModelVarInteger;
KPZ: TModelVarInteger;
KZS: TModelVarInteger;
ModelEvent1: TModelEvent;
ModelEvent2: TModelEvent;
ModelEvent3: TModelEvent;
PlanLink1_1: TPlanLink;
PlanLink1_2: TPlanLink;
PlanLink2_2: TPlanLink;
PlanLink2_3: TPlanLink;
PlanLink3_3: TPlanLink;
Queue_1: TListStruc;
Queue_2: TListStruc;
Queue_3: TListStruc;
RS_enter_1: TRandomStream;
RS_enter_2: TRandomStream;
RS_exit_1: TRandomStream;
RS_exit_2: TRandomStream;
KOZ: TModelVarInteger;
PPZ: TModelVarReal;
PZKO: TModelVarReal;
TZKO: TModelVarReal;
KZ: TModelVarBoolean;
TNZS: TModelVarReal;
procedure TraceVars(Model: TModel);
procedure FormCreate(Sender: TObject);
procedure TB_exitClick(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure TB_minClick(Sender: TObject);
procedure TB_midClick(Sender: TObject);
procedure TB_maxClick(Sender: TObject);
function Model1MustFinishModelling(Model: TModel; SBSRec: PSBSRecord;
nVariant, nCount: Integer): Boolean;
procedure Model1SetNextVariant(Model: TModel; nVariant: Integer);
procedure Model1StartModelling(Model: TModel; nVariant,
nCount: Integer);
procedure RenderersFrame1RenderData(renderer: TCustomizableRenderer);
procedure Model1FinishVariant(Model: TModel; nVariant: Integer);
function ModelController1ProgressPercentsFunction(
model: TModel): Integer;
procedure PlanLink1_1DefineSBSAttibutes(Model: TModel;
SBSRec: PSBSRecord; PlanLink: TEventLink; newSBSRecord: PSBSRecord;
rec_pointer: Pointer);
procedure ModelEvent2PerformEvent(Model: TModel; Event: TModelEvent;
SBSRec: PSBSRecord);
procedure PlanLink1_2DefineSBSAttibutes(Model: TModel;
SBSRec: PSBSRecord; PlanLink: TEventLink; newSBSRecord: PSBSRecord;
rec_pointer: Pointer);
procedure ModelEvent1PerformEvent(Model: TModel; Event: TModelEvent;
SBSRec: PSBSRecord);
procedure PlanLink2_2DefineSBSAttibutes(Model: TModel;
SBSRec: PSBSRecord; PlanLink: TEventLink; newSBSRecord: PSBSRecord;
rec_pointer: Pointer);
procedure PlanLink3_3DefineSBSAttibutes(Model: TModel;
SBSRec: PSBSRecord; PlanLink: TEventLink; newSBSRecord: PSBSRecord;
rec_pointer: Pointer);
procedure ModelEvent3PerformEvent(Model: TModel; Event: TModelEvent;
SBSRec: PSBSRecord);
procedure PlanLink2_3DefineSBSAttibutes(Model: TModel;
SBSRec: PSBSRecord; PlanLink: TEventLink; newSBSRecord: PSBSRecord;
rec_pointer: Pointer);
private
{ Private declarations }
public
{ Public declarations }
end;
//типы действий в модели (для визуализации)
TModelAction = (actNONE, actEnterToQuene, actEnterToKanal, actFinishInKanal, actFinishInKanalAndStartNew, actLoose);
const ActionStr:array[TModelAction] of string = //название действий в модели (для визуализации)
('',
'Вход и добавление в очередь',
'Вход и заполнение канала',
'Завершение обслуживания',
'Завершение обслуживание и выбор следующей',
'Потеря заявки');
var
Form_Model1: TForm_Model1;
LastAction:TModelAction = actNONE; //последние действие в модели (для визуализации)
F:text;
NPC, NCS:integer; //номер потока и номер канала обслуживания
Times: array[0..2] of real;
implementation
{$R *.dfm}
//*******************************************************
// Вспомогательные процедуры
procedure TForm_Model1.FormCreate(Sender: TObject);
begin
//Вспомогательные процедуры по настроке видимости компонентов формы
Panel_controls.Width := 250;
TB_buttons.AutoSize := true;
Panel_trace.Height := PC_model.Height div 2;
PC_main.TabWidth := 1;
PC_main.TabHeight := 1;
//RenderersFrame1.CheckAllRenderers(true);
RenderersFrame1.Grid.GridParams.XTxt.Show := false;
RenderersFrame1.Grid.GridParams.YTxt.Show := false;
RenderersFrame1.Grid.GridParams.AxisColor := RenderersFrame1.Grid.GridParams.Background;
RenderersFrame1.Grid.GridParams.GridColor := RenderersFrame1.Grid.GridParams.Background;
RenderersFrame1.PanelRenderers.Height := 100;
end;
procedure TForm_Model1.TB_exitClick(Sender: TObject);
begin
//обработка нажатия на кнопку "Выход"
Application.Terminate;
end;
procedure TForm_Model1.ToolButton1Click(Sender: TObject);
begin
//обработка кнопок - переключателей закладок
PC_main.ActivePageIndex := (Sender as TToolButton).Tag;
end;
procedure TForm_Model1.TB_minClick(Sender: TObject);
begin
Panel_trace.Height := - Panel_trace.Font.Height*5;
end;
procedure TForm_Model1.TB_midClick(Sender: TObject);
begin
Panel_trace.Height := PC_Main.Height div 2;
end;
procedure TForm_Model1.TB_maxClick(Sender: TObject);
begin
Panel_trace.Height := PC_Main.Height + Panel_trace.Font.Height*5 - Splitter_Model.MinSize -Splitter_Model.Height;
// if (PC_model.Height<Splitter_Model.MinSize) then
//Splitter_Model.Top := Splitter_Model.MinSize;
end;
//**********************************************//
function TForm_Model1.Model1MustFinishModelling(Model: TModel;
SBSRec: PSBSRecord; nVariant, nCount: Integer): Boolean;
begin
{ TODO : Реализовать условие завершения моделирования }
result := Model.Time >= TP[0]; //моделировать пока не достигнем время прогона
RenderersFrame1.OnWindowUpdate; //обновление окна визуализации
end;
function TForm_Model1.ModelController1ProgressPercentsFunction(
model: TModel): Integer;
begin
//функция получения процентов выполненного моделирования
//для рисования линейки прогресса
if (TP[0] > 0) then
result := trunc(Model.Time / TP[0] * 100)
else
result := 0;
end;
procedure TForm_Model1.Model1SetNextVariant(Model: TModel;
nVariant: Integer);
var i:integer;
begin
assignFile(F,'trace.log');
rewrite(F);
//задание параметров модели
for i:=0 to 1 do
Mu[i]:=1 / StrToFloat(VLE_params.Cells[1, i + 1]);
for i:=0 to 1 do
Lambda[i]:=1 / StrToFloat(VLE_params.Cells[1, 3 + i]);
for i:=0 to 2 do
M[i]:=StrToInt(VLE_params.Cells[1, 5 + i]);
TP[0]:=StrToInt(VLE_params.Cells[1, 8]);
//Установка свойств элементов в соответствии с параметрами модели
RS_enter_1.Par_A:=Lambda[0];
RS_enter_2.Par_A:=Lambda[1];
RS_exit_1.Par_A:=Mu[0];
RS_exit_2.Par_A:=Mu[1];
for i:=0 to 2 do
ListStrucsGroup[i].MaxCount:=M[i];
//трассировка
writeln(F,'ПАРАМЕТРЫ МОДЕЛИ:');
writeln(F,'Интенсивности поступления заявок в систему:');
for i:=0 to 1 do
writeln(F, 'Lamda[', i, '] = ', Lambda[i]); //интенсивности
writeln(F,'Интенсивности обслуживания заявок в системе:');
for i:=0 to 1 do
writeln(F, 'Mu[', i, '] = ', Mu[i]);
writeln(F,'Ограничения длин очередей:');
for i:=0 to 2 do
writeln(F, 'M[', i,'] = ', M[i]); //длины
writeln(F, 'Время прогона модели:');
writeln(F, 'TP = ', TP[0]);
//Установка свойств элементов в соответствии с параметрами модели
end;
//процедура трассировки переменных модели
procedure TForm_Model1.TraceVars(Model: TModel);
var
str:string;
i,j:integer;
begin
//формирование строки состояния по массивам KVZ, KPZ, KZS, KOZ
str:=' KVZ=['; //по массиву KVZ
for i:=0 to 2 do begin
str:=str+IntToStr(KVZ[i]);
if i<2 then str:=str+', ';
end;
str:=str+'], KPZ=['; //по массиву KPZ
for i:=0 to 2 do begin
str:=str+IntToStr(KPZ[i]);
if i<2 then str:=str+', ';
end;
str:=str+'], KOZ=['; //по массиву KOZ
for i:=0 to 1 do begin
str:=str+IntToStr(KOZ[i]);
if i<2 then str:=str+', ';
end;
str:=str+'], KZS=['; //по массиву KZS
str:=str+IntToStr(KZS[0]);
str:=str+'], TZKO=['; //по массиву TZKO;
for i:=0 to 1 do begin
str:=str+FloatToStr(TZKO[i]);
if i<1 then str:=str+', ';
end;
str:=str+']';
write(F,str,''); //трассировка состояния переменых
str:=', ';
//форсирование строки состояния очередей (время входа заявок в ситему)
for i:=0 to ListStrucsGroup.ListsCount - 1 do begin //цикл по очередям...
str:=str+'Queue_'+IntToStr(i+1)+'=[';
if ListStrucsGroup.List[i].Length>0 then //если очередь не пуста...
for j:=0 to ListStrucsGroup.List[i].Length-1 do begin //цикл по эл-м очереди
str:=str+IntToStr(ListStrucsGroup.List[i].GetRecord(j).VarList.VarsInteger['NZ'][0]);
if j<ListStrucsGroup.List[i].Length-1 then str:=str+', ';
end;
str:=str+']';
if i<ListStrucsGroup.ListsCount-1 then str:=str+', ';
end;
writeln(F,str); //трассировка строки состояния очередей
writeln(F,'');
end;
procedure TForm_Model1.Model1StartModelling(Model: TModel; nVariant,
nCount: Integer);
var
i: integer;
begin
//задание начального состояния модели
KZS[0]:=0;
for i:=0 to 2 do
begin
KVZ[i]:=0;
KPZ[i]:=0;
Times[i]:=0;
end;
for i:=0 to 1 do
begin
KZ[i]:=false;
TZKO[i]:=0;
KOZ[i]:=0;
end;
ListStrucsGroup.Reset;
RandomStreams.Reset;
Vars.ResetStatistic;
ListStrucsGroup.ResetStatistic;
Criteria.ResetStatistic;
writeln(F,'Начальное состояние модели:');
TraceVars(Model); //трассировка нач. сост. модели.
//планирование начальных событий
writeln(F,'Планирование начальных событий:');
NPC:=0;
Model.PlanEvent(PlanLink1_1);
NPC:=1;
Model.PlanEvent(PlanLink1_1);
end;
procedure TForm_Model1.Model1FinishVariant(Model: TModel;
nVariant: Integer);
var
i: integer;
begin
//Действие по завершению моделированию варианта
//расчет критериев
for i:=0 to 2 do
begin
PPZ[i]:=KPZ[i]/KVZ[i];
VLE_results.Cells[1,i+1]:=FloatToStr(PPZ[i]);
end;
for i:=0 to 1 do
begin
PZKO[i]:= TZKO[i]/TP[0];
VLE_results.Cells[1,i+4]:=FloatToStr(PZKO[i]);
end;
for i:=0 to 1 do
begin
VLE_results.Cells[1, 3 * i + 6]:=FloatToStr(TNZS.Stat[i].getMin);
VLE_results.Cells[1, 3 * i + 7]:=FloatToStr(TNZS.Stat[i].getMax);
VLE_results.Cells[1, 3 * i + 8]:=FloatToStr(TNZS.Stat[i].GetMO);
end;
writeln(F);
writeln(F);
writeln(F,'Расчет показателей критерия:');
writeln(F,' Вероятности потери заявок: PPZ(1,2,3)=['+FloatToStrf(PPZ[0],ffgeneral,4,3)+
', '+FloatToStrf(PPZ[1],ffgeneral,4,3)+', '+FloatToStrf(PPZ[2],ffgeneral,4,3)+']');
writeln(F,' Вероятность занятости каналов обслуживания: PZKO(1,2)=['+FloatToStrf(PZKO[0],ffgeneral,4,3)
+', '+FloatToStrf(PZKO[1],ffgeneral,4,3)+']');
writeln(F,' Статистические характеристики времени нахождения заявок в системе:');
writeln(F,' Min(1,2)= ['+ FloatToStrf(TNZS.Stat[0].getMin,ffgeneral,5,4)+', '+
FloatToStrf(TNZS.Stat[1].getMin,ffgeneral,5,4)+']');
writeln(F,' Max(1,2)= ['+ FloatToStrf(TNZS.Stat[0].getMax,ffgeneral,5,4)+', '+
FloatToStrf(TNZS.Stat[1].getMax,ffgeneral,5,4)+']');
writeln(F,' MO(1,2)= ['+ FloatToStrf(TNZS.Stat[0].getMO,ffgeneral,5,4)+', '+
FloatToStrf(TNZS.Stat[1].getMO,ffgeneral,5,4)+']');
closeFile(F);
end;
procedure TForm_Model1.RenderersFrame1RenderData(
renderer: TCustomizableRenderer);
begin
//процедура отрисовки рендереров
case (renderer.ID) of
0: begin
end;
1: begin
end;
2: begin
end;
end;
end;
//--------------------------------------------------//
procedure TForm_Model1.PlanLink1_1DefineSBSAttibutes(Model: TModel;
SBSRec: PSBSRecord; PlanLink: TEventLink; newSBSRecord: PSBSRecord;
rec_pointer: Pointer);
begin
//NPC:= Random(2);
//NPC:=NPC + 1;
//if NPC > 1 then NPC:=0;
newSBSRecord.Time:=Model.Time + RandomStreams[NPC].GetNumber;
newSBSRecord.Attributes.VarsInteger['NZ'][0]:=KVZ[NPC] + 1;
newSBSRecord.Attributes.VarsInteger['NP'][0]:=NPC + 1;
newSBSRecord.Attributes.VarsReal['t_input'][0] := newSBSRecord.Time;
//трассировка планирования события K=1
writeln(F,' k=1 PlanLink1_1 t='+FloatToStrf(newSBSRecord.Time,ffgeneral,4,3)+
', NZ='+IntToStr(newSBSRecord.Attributes.VarsInteger['NZ'][0])+
', NP='+IntToStr(newSBSRecord.Attributes.VarsInteger['NP'][0]));
end;
procedure TForm_Model1.ModelEvent1PerformEvent(Model: TModel;
Event: TModelEvent; SBSRec: PSBSRecord);
var
NP: byte;
begin
NP:= SBSRec.Attributes.VarsInteger['NP'][0] - 1;
//печать состояния СБС
Writeln(F,'-------------------------------------------------------------------');
Writeln(F,'|t1='+FloatToStr(SBSRec.Time)+'|k=1|'+'|NZ='
+IntToStr(SBSRec.Attributes.VarsInteger['NZ'][0])+'|NP='
+IntToStr(SBSRec.Attributes.VarsInteger['NP'][0])+'|t_input='+
FloatToStr(SBSRec.Attributes.VarsReal['t_input'][0])+'|');
Writeln(F,'-------------------------------------------------------------------');
KVZ[NP]:=KVZ[NP] + 1; //сбор статистики о количестве вошедших заявок
KZS[0]:= KZS[0] + 1; //общее количество заявок в системе
//если канал обслуживания свободен
If not KZ[0] then
begin
Times[NP] := Model.Time;
Model.PlanEvent(PlanLink1_2);
KZ[0] := True; //канал занят
end
else //если канал обслуживания занят
begin
//если очередь занята
if ListStrucsGroup[NP].Length = M[NP] then
begin
KPZ[NP] := KPZ[NP] + 1; //увеличиваем счетчик потерянных заявок
KZS[0]:= KZS[0] - 1; //уменьшаем количество заявок, находящихся в системе
end
else
begin
//Ставим заявку в очередь
ListStrucsGroup[NP].VarListType.VarsReal['t_input'][0] := SBSRec.Time;
ListStrucsGroup[NP].VarListType.VarsInteger['NP'][0] := SBSRec.Attributes.VarsInteger['NP'][0];
ListStrucsGroup[NP].VarListType.VarsInteger['NZ'][0] := SBSRec.Attributes.VarsInteger['NZ'][0];
ListStrucsGroup[NP].PutRecord;
end;
end;
if NP = 1 then
begin
NPC:=0;
Model.PlanEvent(PlanLink1_1);
end
else
begin
NPC:=1;
Model.PlanEvent(PlanLink1_1);
end;
TraceVars(Model1);
end;
procedure TForm_Model1.ModelEvent2PerformEvent(Model: TModel;
Event: TModelEvent; SBSRec: PSBSRecord);
var
NP: byte;
begin
NP:= SBSRec.Attributes.VarsInteger['NP'][0] - 1;
//печать состояния СБС
Writeln(F,'-------------------------------------------------------------------');
Writeln(F,'|t2='+FloatToStr(SBSRec.Time)+'|k=2|'+'|NZ='
+IntToStr(SBSRec.Attributes.VarsInteger['NZ'][0])+'|NP='
+IntToStr(SBSRec.Attributes.VarsInteger['NP'][0])+'|t_input='+
FloatToStr(SBSRec.Attributes.VarsReal['t_input'][0])+'|');
Writeln(F,'-------------------------------------------------------------------');
KVZ[2]:=KVZ[2] + 1; //сбор статистики о количестве вошедших заявок
If not KZ[1] then
begin
Times[1] := Model.Time;
Model.PlanEvent(PlanLink2_3);
KZ[1] := True; //канал занят
end
else //если канал обслуживания занят
begin
//если очередь занята
if ListStrucsGroup[2].Length = M[2] then
begin
KPZ[2] := KPZ[2] + 1; //увеличиваем счетчик потерянных заявок
KZS[0]:= KZS[0] - 1; //уменьшаем количество заявок, находящихся в системе
end
else
begin
//Ставим заявку в очередь
ListStrucsGroup[2].VarListType.VarsReal['t_input'][0] := SBSRec.Time;
ListStrucsGroup[2].VarListType.VarsInteger['NP'][0] := SBSRec.Attributes.VarsInteger['NP'][0];
ListStrucsGroup[2].VarListType.VarsInteger['NZ'][0] := SBSRec.Attributes.VarsInteger['NZ'][0];
ListStrucsGroup[2].PutRecord;
end;
end;
if ((ListStrucsGroup[0].Length <> 0) or (ListStrucsGroup[1].Length <> 0)) then begin
if ListStrucsGroup[0].Length <> 0 then begin
NPC2 := 0;
end
else if ListStrucsGroup[1].Length <> 0 then begin
NPC2 := 1;
end;
TZKO[0] := TZKO[0] + (Model.Time - Times[0]);
Times[0] := Model.Time;
KOZ[0]:= KOZ[0] + 1;
Model.PlanEvent(PlanLink2_2);
end
else begin
TZKO[0] := TZKO[0] + (Model.Time - Times[0]);
Times[0] := Model.Time;
KOZ[0]:= KOZ[0] + 1;
KZ[0]:= false;
end;
TraceVars(Model);
end;
procedure TForm_Model1.PlanLink1_2DefineSBSAttibutes(Model: TModel;
SBSRec: PSBSRecord; PlanLink: TEventLink; newSBSRecord: PSBSRecord;
rec_pointer: Pointer);
var
NP: byte;
begin
NP:= SBSRec.Attributes.VarsInteger['NP'][0];
newSBSRecord.Time:=Model.Time + RandomStreams[2].GetNumber;
newSBSRecord.Attributes.VarsInteger['NZ'][0]:=SBSRec.Attributes.VarsInteger['NZ'][0]; //
newSBSRecord.Attributes.VarsInteger['NP'][0]:=SBSRec.Attributes.VarsInteger['NP'][0]; //
newSBSRecord.Attributes.VarsReal['t_input'][0]:=Model.Time; //
//трассировка планирования события K=2
writeln(F,' k=2 PlanLink1_2 t='+FloatToStrf(newSBSRecord.Time,ffgeneral,4,3)+
', NZ='+IntToStr(newSBSRecord.Attributes.VarsInteger['NZ'][0])+
', NP='+IntToStr(newSBSRecord.Attributes.VarsInteger['NP'][0])+
', t_input='+FloatToStrf(newSBSRecord.Attributes.VarsReal['t_input'][0],ffgeneral,4,3));
end;
procedure TForm_Model1.PlanLink2_2DefineSBSAttibutes(Model: TModel;
SBSRec: PSBSRecord; PlanLink: TEventLink; newSBSRecord: PSBSRecord;
rec_pointer: Pointer);
var
PRec: PListRecord;
NP: byte;
begin
NP:= NPC2;
PRec:=ListStrucsGroup[NP].ExtractRecord; inc(NP);
//устанавливаем время события
newSBSRecord.Time := Model1.Time + RandomStreams[2].GetNumber; //устанавливаем время входа
newSBSRecord.Attributes.VarsReal['t_input'].Value[0] := PRec.VarList.VarsReal['t_input'].Value[0];
//устанавливаем номер события по потоку
newSBSRecord.Attributes.VarsInteger['NZ'][0] := PRec.VarList.VarsInteger['NZ'].Value[0];
//устанавливаем номер потока события
newSBSRecord.Attributes.VarsInteger['NP'].Value[0] := PRec.VarList.VarsInteger['NP'].Value[0];
writeln(F,' k=2 PlanLink2_2 t='+FloatToStrf(newSBSRecord.Time,ffgeneral,4,3)+
', NZ='+IntToStr(newSBSRecord.Attributes.VarsInteger['NZ'][0])+
', NP='+IntToStr(newSBSRecord.Attributes.VarsInteger['NP'][0])+
', t_input='+FloatToStrf(newSBSRecord.Attributes.VarsReal['t_input'][0],ffgeneral,4,3));
end;
procedure TForm_Model1.PlanLink3_3DefineSBSAttibutes(Model: TModel;
SBSRec: PSBSRecord; PlanLink: TEventLink; newSBSRecord: PSBSRecord;
rec_pointer: Pointer);
var
PRec: PListRecord;
begin
PRec:=ListStrucsGroup[2].ExtractRecord;
//устанавливаем время события
newSBSRecord.Time := Model1.Time + RandomStreams[3].GetNumber;
//устанавливаем время входа
newSBSRecord.Attributes.VarsReal['t_input'].Value[0] := PRec.VarList.VarsReal['t_input'].Value[0];
//устанавливаем номер события по потоку
newSBSRecord.Attributes.VarsInteger['NZ'][0] := PRec.VarList.VarsInteger['NZ'].Value[0];
//устанавливаем номер потока события
newSBSRecord.Attributes.VarsInteger['NP'].Value[0] := PRec.VarList.VarsInteger['NP'].Value[0];
writeln(F,' k=3 PlanLink3_3 t='+FloatToStrf(newSBSRecord.Time,ffgeneral,4,3)+
', NZ='+IntToStr(newSBSRecord.Attributes.VarsInteger['NZ'][0])+
', NP='+IntToStr(newSBSRecord.Attributes.VarsInteger['NP'][0])+
', t_input='+FloatToStrf(newSBSRecord.Attributes.VarsReal['t_input'][0],ffgeneral,4,3));
end;
procedure TForm_Model1.ModelEvent3PerformEvent(Model: TModel;
Event: TModelEvent; SBSRec: PSBSRecord);
begin
//печать состояния СБС
Writeln(F,'-------------------------------------------------------------------');
Writeln(F,'|t3='+FloatToStr(SBSRec.Time)+'|k=3|'+'|NZ='
+IntToStr(SBSRec.Attributes.VarsInteger['NZ'][0])+'|NP='
+IntToStr(SBSRec.Attributes.VarsInteger['NP'][0])+'|t_input='+
FloatToStr(SBSRec.Attributes.VarsReal['t_input'][0])+'|');
Writeln(F,'-------------------------------------------------------------------');
if ListStrucsGroup[2].Length <> 0 then
begin
TZKO[1] := TZKO[1] + (Model.Time - Times[1]);
Times[1] := Model.Time;
TNZS[SbsRec.Attributes.VarsInteger['NP'][0] - 1]:=
Model1.Time - SBSRec.Attributes.VarsReal['t_input'][0];
KOZ[1]:= KOZ[1] + 1;
KZS[0]:= KZS[0] - 1;
Model.PlanEvent(PlanLink3_3);
end
else
begin
TZKO[1] := TZKO[1] + (Model.Time - Times[1]);
TNZS[SbsRec.Attributes.VarsInteger['NP'][0] - 1]:=
Model1.Time - SBSRec.Attributes.VarsReal['t_input'][0];
KOZ[1]:= KOZ[1] + 1;
KZS[0]:= KZS[0] - 1;
KZ[1]:= false;
end;
TraceVars(Model);
end;
procedure TForm_Model1.PlanLink2_3DefineSBSAttibutes(Model: TModel;
SBSRec: PSBSRecord; PlanLink: TEventLink; newSBSRecord: PSBSRecord;
rec_pointer: Pointer);
begin
newSBSRecord.Time:=Model.Time + RandomStreams[3].GetNumber;
newSBSRecord.Attributes.VarsInteger['NZ'][0]:=SBSRec.Attributes.VarsInteger['NZ'][0]; //
newSBSRecord.Attributes.VarsInteger['NP'][0]:=SBSRec.Attributes.VarsInteger['NP'][0]; //
newSBSRecord.Attributes.VarsReal['t_input'][0]:=Model.Time; //
//трассировка планирования события k = 3
writeln(F,' k=3 PlanLink2_3 t='+FloatToStrf(newSBSRecord.Time,ffgeneral,4,3)+
', NZ='+IntToStr(newSBSRecord.Attributes.VarsInteger['NZ'][0])+
', NP='+IntToStr(newSBSRecord.Attributes.VarsInteger['NP'][0])+
', t_input='+FloatToStrf(newSBSRecord.Attributes.VarsReal['t_input'][0],ffgeneral,4,3));
end;
end.
13
Документ
Категория
Разное
Просмотров
12
Размер файла
23 Кб
Теги
текст, приложение
1/--страниц
Пожаловаться на содержимое документа