Имитационное моделирование фрагмента центра коммутации и анализ его параметров, страница 4

N:integer;                                     { общее количество вызовов}

procedure generate;                 {подпрограмма генерации вызовов}

var

g:integer;

begin

if i mod Ty=0

then

begin

N:=N+1;        {счетчик вызовов}

if sl>=m then sl:=1

else sl:=sl+1;

if  s_line[sl]=0 then

begin

if wait[h]=0     {проверка занятости очереди}

then

begin

s_line[sl]:=-1;{занятие линии номер sl}

wait[h]:=sl;   {запись в конец очереди номера соединительной линии}

writeln('возникла заявка линия номер=',sl,'); 

N_Tsr[sl]:=N_Tsr[sl]+1;   {счетчик кол-ва вызовов линии sl}

end

else otk2:=otk2+1;    {отказ занят буфер}

end

else otk1:=otk1+1       {отказ т.к. занята линия}

end

end;

procedure structuir_bufer ;  {подпрограмма упорядочивания очереди}

var y:integer;

begin

for y:=1 to h-1 do

begin

wait[y]:=wait[y+1];

end;

wait[h]:=0;

end;                {конец подпрограммы}

procedure bufer ;

var r,n,a:integer;

begin

r:=wait[1];

if s_line[r]>=Tog then    {проверка порога ожидания}

begin

otk3:=otk3+1;      {отказ по ожиданию}

a:=wait[1];

s_line[a]:=0;        {сброс ожидания}

wait[1]:=0;          {сброс буфера}

structuir_bufer;

end;

n:=0;

if wait[h]<>0

then              {выстраивание в очередь}

begin

while n<>h do begin

n:=n+1;

if wait[n]=0 then

begin

if n<>h then

begin

wait[n]:=wait[h];

wait[h]:=0;

n:=h;

end;

end;

end;end;

end;    {end procedure}

procedure ent_bufer(v:integer);

var b:integer;

begin

if wait[1]<>0 then

begin     {если очередь не пуста }

server[v]:=wait[1];        {запись из буфера в сервер}

writeln('  линии =',server[v]); 

wait[1]  :=0;              {сброс буфера }

b:=server[v];  {начало отсчета обслуживания в сервере}

s_line[b]:=-1;

structuir_bufer;

end

end;

procedure serv ;

var v,b:integer;

begin

for v:=1 to l do

begin

if server[v]=0 then

begin       

writeln(' свободна линия сервера --',v);

ent_bufer(v); 

end

else

begin

writeln(' server[',v,']=',server[v]);  

b:= server[v];     {считывание номера обслуживаемой линии}

if s_line[b]>=Tm then    {проверка конца обслуживания}

begin

writeln('конец обслуживания линии ',server[v],'такт',i);  {test}

s_line[b]:=0;

server[v]:=0;

ent_bufer(v);

end

end;

end;

end;

end;    {end procedure}

procedure itog;

var z:integer;

begin

writeln('N=',n);

writeln('otk1=',otk1);

writeln('otk2=',otk2);

writeln('otk3=',otk3);

for i:=1 to m do

begin

if N_Tsr[i]=0 then

Tsr[i]:=0

Else                

Tsr[i]:=Tsr[i] / N_Tsr[i];

writeln('Tsr[',i,']=',Tsr[i]);

end;     

end;  {end procedure}

begin     {начало основной программы}

clrscr;

write('введите величину интервала между заявками');

read(Ty);

for i:=1 to Tend do

begin

for u:=1 to m do

begin

if s_line[u]<>0 then

begin

if s_line[u]=-1 then

s_line[u]:=1 else

s_line[u]:=s_line[u]+1; 

Tsr[u]:=Tsr[u]+1;        { подсчет времени использования}

writeln('s_line[',u,']=',s_line[u]);

end;

end;

generate;

bufer;

serv;

for u:=1 to h do

write('wait[',u,']=',wait[u],' ');

writeln;

writeln('*****************************  такт', i );

readln;

end;        {конец времени моделирования}

itog;

end.         {конец программы}

Алгоритм и описание работы программы моделирующей      функционирование системы ступени коммутации

Программа SETY написана на языке программирования  TURBO PASCAL 7.0.

Для большей читабельности и удобства отладки программы каждый самостоятельный фрагмент выделен в отдельную подпрограмму.

Таким образом, программа содержит шесть подпрограмм:

Generate-  подпрограмма эмулирует вызовы с заданной интенсивностью а также производит  подсчет общего количества вызовов и отказов первого и второго типа,

Bufer -подпрограмма модулирует такие функции буфера как подсчет времени обслуживания заявки в буфере и продвижение заявок в очереди ,