Представим себе, что в какой-либо системе, модель которой вы собираетесь разработать, имеются, например, два канала передачи данных - два ОКУ. Естественно, что если один канал занят, то выясняется: свободен ли второй канал? Если он не занят, надо попытаться передать по этому каналу. Но как проверить состояние каналов в модели?
В GPSS World блок GATE используется для определения состояния устройств без изменения их состояния.
Формат записи:
GATE X A,[B]Блок GATE работает в двух режимах:
- отказа во входе;
- разрешении во входе и альтернативном выходе.
При работе в режиме отказа блок GATE не пропускает транзакты, если соответствующий объект не находится в требуемом состоянии. Если же поставленное в блоке GATE условие удовлетворяется, то активный транзакт входит в него и затем переходит к следующему по порядку блоку. Операнд А определяет имя или номер ОКУ.
Условие задается одним из следующих условных операторов X, связанных с ОКУ:
NU - ОКУ, заданное операндом А, свободно;
U - ОКУ, заданное операндом А, занято.
|
|
Как видно, тип проверяемого объекта неявно задается условным оператором (позже мы рассмотрим применение блока GATE для проверки и других объектов аппаратной категории).
Операнд B содержит номер следующего блока для входящего транзакта, когда условный оператор имеет значение "ложь". Операнды А и B могут быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр. Если операнд B не используется, то проверка проводится в режиме отказа. Если результат этой проверки не будет "истина", то транзакт помещается в список повторных попыток проверяемого объекта. Когда состояние любого из объектов меняется, заблокированный транзакт снова активизируется, повторяется проверка заданного блоком GATEусловия. Если это условие выполняется, транзакту разрешается войти в блок GATE и далее перейти к следующему по порядку блоку. Например:
GATE U ZrkGATE NU (FN$Expert+4)GATE NU Bat,OperВ первом примере блок GATE не пропустит транзакт при условии незанятости ОКУ с именем Zrk. Во втором случае - когда занято ОКУ, номер которого определяется как результат вычисления и последующего округления выражения в скобках FN$Expert+4. В третьем примере в случае занятости ОКУ с именем Вat транзакт будет направлен к блоку с именем Oper.
Следует отметить, что несмотря на удобство применения блока GATE, в некоторых случаях это может привести при отсутствии операнда B к увеличению машинного времени за счет проведения проверок для заблокированных транзактов. Уменьшение числа проверок и исключение из проверяемых тех транзактов, для которых вряд ли когда-нибудь результат проверки будет истинным, может быть организовано с помощью блоков LINK и UNLINK. Методы применения этих блоков будут рассмотрены позже.
Для проверки состояния различных объектов, в том числе и ОКУ, можно использовать также булевы переменные и блок TEST.