Кадры.Кольцо.Перадача.Сеть.Приемники.

pX1 EQU 30  	;число байт в кадре
pX2 EQU 5	;число ПК в сети
pX3 EQU 35	;интервал поступления сообщений в систему
pX4 EQU 230	;число байт в сообщении
pX7 EQU 10	;задержка маркера с собщением
pX8 EQU 8		;объём информации маркера

TABL1 TABLE MP10,10,100,100
TABL2 TABLE MP10,10,100,100

GENERATE (Exponential(1,0,pX3#1000))		;поступление сообщений
SAVEVALUE Tran,(uniform(3,1,pX2)\1)			;равновероятным способом определяется ПК-передатчик
SAVEVALUE Recepter,(uniform(4,1,pX2)\1)		;равновероятным способом определяется ПК-приемник
SAVEVALUE ChisloKadrov,(Exponential(5,0,pX4)\pX1)	;вычисляем число кадров в сообщении

SPLIT (X$ChisloKadrov),VSPISOK1 	;разделение сообщения на кадры
ASSIGN Prochlo,0			;фиксируется тот факт, что первый кадр ещё не отправлялся соседним узлам
ASSIGN Tran,X$Tran			;кадру присваивается номер ПК-передатчика
ASSIGN Recep,X$Recepter		;кадру присваивается номер ПК-приемника
ASSIGN Next,P$Tran			;дублируем номер ПК в другом параметре
JOIN GDUT
;ASSIGN ChKa,X$ChisloKadrov		; дублируем число кадров сообщения в другом параметре
BEFORE_AG	MARK 10		;отметка времени начала передачи
TEST E F$MAGISTRAL,0,VSPISOK1 ; проверяется идёт ли уже передача с других ПК


AGAIN	QUEUE OCH_PERED	;в очередь кадров на передачу
	SEIZE MAGISTRAL	;занять магистраль передачи
	DEPART OCH_PERED	;из очереди
	ADVANCE (64+pX1)	;передача кадра
	ADVANCE (64+pX8)	;передача маркера
	ADVANCE pX7	;задержка кадра и маркера в ПК
	RELEASE MAGISTRAL	;освободить магистраль передачи
	ASSIGN Prochlo+,1	;зафиксировать факт передачи кадра соседнему ПК
	ASSIGN Next,((P$Next'L'pX2)#(P$Next+1)+(P$Next'E'pX2))	;передача идёт по часовой стрелке, поэтому номер соседнего узла больше номера текущего
	TEST GE Prochlo,(pX2/2),PROVERKA	
	TABULATE TABL2

PROVERKA	TEST E F$MAGISTRAL,1,IZVLECH   ; проверяем занята ли ещё магистраль другими кадрами
	TEST E P$Next,P$Recep,VSPISOK2 ; если нет, то проверяем достиг ли кадр ПК-приёмника
	REMOVE GDUT
	SCAN E GDUT,Tran,P$Tran,111,Tran	;поиск любого другого кадра из сообщения в ПК
	TEST NE P$Tran,0,ENDER1	;если не найден такой кадр, то считаем всё сообщение переданным
	TABULATE TABL1	;фиксируем время передачи сообщения
ENDER1	TERMINATE	;удаляем кадр, если да

VSPISOK1 	JOIN GDUT
	ASSIGN Tran,X$Tran	;присваиваем каждому кадру сообщения свой ПК-передатчик
	ASSIGN Recep,X$Recepter	;присваиваем каждому кадру сообщения свой ПК-приемник
	ASSIGN Prochlo,0	;учитываем тот факт, что кадры ещё не передавались по кольцу
	ASSIGN Next,P$Tran	;дублируем номер ПК в другом параметре
	;ASSIGN ChKa,X$ChisloKadrov		; дублируем число кадров сообщения в другом параметре
	MARK 10				;отметка времени появления в системе
	LINK OCH1_KADROV,FIFO	;заносим кадр в список1 новых кадров
VSPISOK2	LINK OCH2_KADROV,FIFO	;заносим кадр в список2 уже отправляемых кадров	

IZVLECH 	UNLINK E OCH1_KADROV,AGAIN,1,Tran,P$Next  ;? извлекаем из списка1 любой кадр, который принадлежит текущему ПК, к которому перешёл маркер
	UNLINK OCH2_KADROV,AGAIN,ALL ;извлекаем все передаваемые кадры из списка2 для передачи далее по кольцу 
	TEST E P$Next,P$Recep,AGAIN	;проверяем достиг ли кадр ПК-приёмника			
	REMOVE GDUT
	SCAN E GDUT,Tran,P$Tran,111,Tran	;поиск любого другого кадра из сообщения в ПК
	TEST NE P$Tran,0,ENDER2	;если не найден такой кадр, то считаем всё сообщение переданным
	TABULATE TABL1	;фиксируем время передачи сообщения

ENDER2	BUFFER 
	TEST E F$MAGISTRAL,0,ENDER3  
	TRANSFER ,AGAIN
ENDER3	TERMINATE	

GENERATE 	1000000
TERMINATE 1

start 1

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *