Добавим к модели пешеходного перехода второй светофор, для пешеходов. Он имеет только два света, зеленый и красный, и три состояния: разрешающее переход (зеленый), внимание (мигающий зеленый) и запрещающее переход (красный). В модель добавим еще две булевские переменные greenP и redp, их значения будут устанавливаться в состояниях еще одного стейт-чарта, который будет управлять светофором пешеходов. Добавим новый стейтчарт в окне редактора объекта Model, назвав его pedestrian_light (рис. 6.16).
Поскольку управление светофором пешеходов похоже на управление светофором трафика, новый стейтчарт можно построить изменением уже построенного стейтчарта traffic-light. Откройте окно редактора объекта Model и, нажав клавишу <Ctrl> на клавиатуре, перетащите иконку traffic_light в другое место. Этот объект скопируется, и ему будет дано имя traffic_light1. Измените имя стейтчарта на pedestrial_light и от-
редактируйте сам стейтчарт так, чтобы в нем были только состояния go, attention и stop. Поскольку эти имена принадлежат элементам объекта pedestrian_light, конфликта имен с так же названными состояниями другого стейтчарта не будет.
Изменения, которые должны быть проведены с этим стейтчартом, такие:
- начальное состояние для светофора пешеходов должно быть stop — противоположным начальному состоянию светофора трафика;
- нужно удалить состояния slow и ready.
В результате новый стейтчарт должен иметь вид рис. 6.17.
Установка переменных при входе и выходе из состояний этого стейтчарта д олжна, конечно, относиться к переменным redp и greenp, управляющих зажиганием света именно пешеходного светофора.
Рассмотрим теперь условия срабатывания переходов стейтчартов между со
стояниями. Очевидно, что необходимо корректно синхронизировать срабатывания переходов двух стейтчартов так, чтобы всегда, когда светофор пешеходов находится в состояниях до или attention, светофор траффика обязательно находился бы в состоянии stop. Этого можно добиться подбо-ром таймаутов срабатывания переходов. Однако более разумно сделать это, посылая специальные разрешающие сигналы из одного стейтчарта в другой рис. 6.18).
Введем два сигнала, траффик и пешеходы. Пусть в стейтчарте управления светофором пешеходов переход t5 может сработать, только если получен сигнал пешеходы, который будет генерироваться в стейтчарте управления
трафиком при переходе t5 в состояние, в котором запрещено движение транспорта. Пусть в стейтчарте traffic_light переход t6 может сработать, только если получен сигнал траффик, который генерируется в стейтчарте управления движением пешеходов при переходе t4 в состояние, запрещающее движение пешеходов.
В AnyLogic для генерации сигналов существует функция fireEvent (<сигнал>), которая должна вызываться в том стейтчарте, которому предназначен сигнал. Если из некоторого активного объекта мы хотим послать (произвольный) сигнал ааа стейтчарту с именем stchart, то необходимо В ЭТОМ активном объекте вызвать функцию fireEvent (<сигнал>) этого стейтчарта, т. е. выполнить действие stchart. fireEvent ("ааа"). Если стейтчарт stchart находится в состоянии, в котором он ожидает этот сигнал, то соответствующий переход сработает. Если стейтчарт находится в состоянии, в котором он не ожидает этого сигнала, никакой реакции не будет, а полученный сигнал потеряется. В состоянии s стейтчарт ожидает сигнала ааа, если в поле Происходит окна свойств одного из переходов из состояния s выбран вариант По сигналу, а в поле Сигнал этого окна указан этот сигнал ааа.
В нашей модели в поле Действие перехода t5 стейтчарта traffic_light вставьте команду
pedestrian_light.fireEvent("ПЕШЕХОДЫ");
а в это же поле перехода t4 стейтчарта pedestrian_iight вставьте команду traffic_light.fireEvent("ТРАФФИК");
Таким образом, каждый из светофоров будет информировать другого о своем переходе в состояние запрещения движения. Для перехода по разрешающему сигналу в стейтчарте traffic_iight, в поле Происходит окна свойств перехода t€ выберите вариант По сигналу, а в поле Сигнал этого же окна наберите сигнал "траффик". Для перехода по разрешающему сигналу в стейтчарте pedestrian_light в поле Происходит окна свойств перехода t5 выберите вариант По сигналу, а в поле Сигнал этого же окна наберите сиг-вал "пешеходы". Остальные переходы этих стейтчартов пусть срабатывают по таймаутам. Рисунок 6.19 показывает, как задать параметры переходов стейтчарта traffic_iight. Запустите модель на выполнение.
Анимацию модели легко дополнить светофором пешеходов с двумя сигналами — красным и зеленым, значением цвета которых управляют логиче-ские переменные redp и greenP. Изображения идущего человека в окне светофора можно нарисовать ломаной линией, увеличив анимацию, например, в 5 раз. Ваша модель должна быть похожа на модель
PedestrianCross3.