Блоки SPLIT и ASSEMBLE
При необходимости в программе можно создать (или уничтожить уже имеющиеся) копии транзактов. Для создания копий транзактов, уже участвующих в моделировании, используется блок SPLIT («расщепление» транзакта). При этом создаются транзакты с точно такими же характеристиками (параметры, приоритет и т.д.), как и у оригинала. Порожденная группа транзактов называется ансамблем. Формат оператора SPLIT:
SPLIT A,B,C
Операнд А - положительное целое значение (число копий транзакта). Операнд В - адрес блока, в который следует послать копии транзакта. Операнд С - значение так называемого серийного параметра. Когда транзакт входит в блок SPLIT, значение этого параметра увеличивается на 1 для транзакта–оригинала, на 2- для его копии, на 3 - для второй копии и т.д.
Для имитации различных сборочных операций удобно применять блок ASSEMBLE, действие которого состоит в том, что он «собирает» определенное количество транзактов одного ансамбля. Число собираемых транзактов называется «счетчиком сборки» и определяется полем А блока ASSEMBLE.
Пример: через блок
ASSEMBLE 10
пройдет только первый транзакт некоторого семейства, причем он будет задержан до тех пор, пока на этот блок не поступит еще 9 транзактов того же ансамбля. Эти 9 транзактов при этом уничтожаются. После этого первый транзакт пройдет блок ASSEMBLE.
Имеется возможность косвенного задания счетчика сборки при помощи указания номера параметра первого транзакта, значение которого заносится в счетчик сборки данного блока ASSEMBLE. Кроме того, один блок ASSEMBLE может одновременно собирать транзакты, принадлежащие к разным ансамблям.
Пример программной конструкции GPSS с операторами SPLIT и ASSEMBLE:
simulate
generate ,,,100
seize mach1
arrive totti
advance 32,6
release mach1
split 1, mac3 ! Cоздать одну копию транзакта и
seize mach2 ! послать ее в блок с адресом mас3
advance 28,5
release mach2
goto mac4
mac3 seize mach3
advance 30,15
release mach3
mac4 assemble 2 ! Уничтожить созданную копию транзакта
seize mach4
advance 22,9
release mach4
depart totti
terminate 1
*
start 100
end