Особенности драйвера:
1. Автоматическая обработка команды.
2. Автоматический переход в режим ожидания после выполнения всех команд.
3. Стабильность временных отсчетов.
4. Встроенный стек команд.
5. Смена показаний светофора происходит с фиксированной скоростью, между отключением прежнего показания и зажиганием нового предусмотрено полное отключение огней, имитирующее переходные процессы в блоке АЛСН.
6. Простота использования.
Описание принципа работы:
Алгоритм драйвера состоит из 2 блоков - тактового и командного.
Командный блок предназначен для обработки команд.
При поступлении команды производится сверка текущего режима светофора или, если светофор находится в состоянии переключения - следующего режима; в случае совпадения команда игнорируется. Благодаря этому нет надобности контролировать отправку команд на драйвер - командный блок с этим справится, отсеяв дубликаты.
Также командный блок формирует последовательности команд и загружает их в стек. Благодаря этому можно отправлять любые команды в любой последовательности и с любой скоростью, все они будут помещены в стек и выполняться по заданному времени.
Если поступила команда на новое показание, в стек предварительно будет загружена команда полного гашения. На практике это даст такой эффект работы - гашение предыдущего показания, задержка, включение нового показания.
Если поступила команда тестирования, в стек предварительно будут загружены: команда полного гашения, команда теста, команда полного гашения и текущая выполняемая команда. Эффект работы - гашение текущего показания, задержка, включение всех огней (тест), гашение всех огней, задержка, восстановление предыдущего показания.
При получении команды, командный блок переводит драйвер в активный режим.
Тактовый блок обрабатывает команды, помещенные в стек, с привязкой ко времени .
Как только драйвер переводится в активный режим, проверяется наличие команд в стеке. Если команд нет, драйвер перейдет в режим ожидания. Это означает, что получив тактовый запрос, драйвер проверит свой режим и, если ничего не изменилось, будет выход из функции. Если же команда в стеке обнаружена, драйвер перейдет в активный режим и запустит команду на выполнение. После того, как время, заданное на выполнение команды, истечет, команда будет удалена из стека и цикл повторится. Таким образом, драйвер будет в активном режиме до тех пор, пока последовательно не выполнит все команды, помещенные в стек.
Для обеспечения таймеризации драйвер использует функцию Timer (), опубликованную ранее. По завершении отсчетов производится удаление использованных каналов таймера.
Использование:
Светофор АЛСН должен обслуживаться одним контролом, интерфейс которого состоит из вкладок Interior visibility object - по одной вкладке на каждый режим работы:

В моем случае это 7 вкладок - З, Ж, КЖ, К, Б, КЖ+Б и "тест".
Как видно по скрину, в каждой вкладке нужно прописать имя нода огонька светофора и значение контрола, при котором этот огонек будет активироваться.
В скрипте нужно создать таблицу, в которой будут указаны команды управления и соответствующие им значения контрола, при которых активируется требуемый нод:
- Код: Выделить всё
TabALSN = {
["red"] = {node = 1},
["white"] = {node = 2},
["yellow-red"] = {node = 3},
["yellow"] = {node = 4},
["green"] = {node = 5},
["YRW"] = {node = 6},
["test"] = {node = 7},
["clear"] = {node = 0}
}
Команды, за исключением жестко заданных "clear" и "test", могут быть любые, но, естественно, удобнее применять очевидные имена.
Также надо проинициализировать используемые драйвером переменные:
- Код: Выделить всё
TabComALSN = {}
StatusALSN = "none"
ProcessALSN = "waiting"
DisplayAdjustment ("clear") -- гашение светофора
В функции Update (time) делаем тактирование драйвера:
- Код: Выделить всё
DisplayAdjustment (time)
Для отсылки команды делаем вызов, указав команду (какую команду указываем, такой нод по таблице TabALSN и включится, например:
- Код: Выделить всё
DisplayAdjustment ("green"), для включения зеленого огня,
DisplayAdjustment ("red"), для включения красного огня,
DisplayAdjustment ("clear"), для гашения всех огней.
Код функции: