В предыдущем статья Структурная модель систем контроля доступа рассматривалась как совокупность ролей объектов и двойных связей между ними.
Такая модель позволяет отразить результаты всех интересующих нас процессов, происходящих в системе.
Процессы в системе выражаются через взаимодействия объектов, а результаты взаимодействий сохраняются в связях.
Можно сказать, что связи — это память о взаимодействиях, но сами процессы взаимодействия никак не отражаются в структурной модели.
Наблюдатель видит взаимодействия через изменения в поведении или изменениях состояния объектов, которые мы будем называть устройствами.
Например, когда вы подносите к считывателю карту с RFID-меткой, последний сообщает о считывании звуковым сигналом и миганием светодиода.
Это можно интерпретировать как изменение состояния физического считывателя, при этом взаимодействие карты и считывателя, само чтение, не рассматривается.
Предполагается, что читатель проходит через ряд дискретных состояний.
Такие дискретные состояния удобно моделировать с помощью конечных автоматов, но для этого необходимо установить канал между физическим миром и виртуальным миром (компьютерная модель).
По такому каналу, управляемому контроллером канала, передаются физические сигналы от устройства, которые преобразуются специальным модулем связи в сигналы, управляющие конечным автоматом устройства.
Канал может быть двусторонним:
Одно устройство может быть подключено к нескольким каналам, а один канал – к нескольким устройствам, при этом один модуль связи может обслуживать все каналы:
Устройства в модели СКУД
Мы называем устройства устройствами, поведение которых можно описать набором дискретных состояний, моделируемых машинами.Определение набора состояний для каждого устройства осуществляет разработчик моделируемой системы.
Конечный автомат считывателя
Внедренная система контроля доступа использовала два считывателя.Один считыватель был установлен на турникете, а второй на картридере.
При таком расположении считывателей посетитель с одноразовым пропуском может покинуть зону доступа только при возврате карты через картридер: считыватель картридера будет формировать метку статус «Выход разрешен», а считыватель на турникете - Выход запрещен.
Оба читателя обслуживаются двумя каналами; информация об имени считывателя поступает по одному каналу, а информация об имени карты - по второму каналу.
Таким образом, читатель имеет следующие дискретные состояния:
- считыватель готов к приему сигналов;
- получено имя читателя;
- полученное имя карты;
- Получены имена считывателей и карт.
Использование отдельного состояния Retrived считывателя и имен карт вместо объединения его с исходным состоянием связано с тем, что считыватель является частью системы.
В этом случае возврат в исходное состояние будет осуществляться по сигналу турникета.
Переход в эти состояния осуществляется при поступлении одного из сигналов: имя считывателя определено, имя карты определено, переход осуществлен или сработал таймер (сигнал от турникетного автомата), получена ошибка.
Обозначим эти сигналы для примера так: определяется имя считывателя - nr, определяется имя карты - nc, поступает сигнал от турникета - ts, поступает ошибка - er. Поскольку в общем случае неизвестно, что будет определено первым — имя считывателя или карты, конечный автомат с сигналами и соответствующими переходами будет иметь вид:
Автомат реализован очень просто: поскольку новое состояние однозначно определяется текущим состоянием и сигналом, то в качестве ключа, определяющего переход, берется текстовое значение state_signal. Зная исходное состояние и новое состояние, легко определить переход, который будет задан текстовым значением.
текущее_состояние#новое_состояние .
Тогда для считывающей машины получаем следующие соответствия между ключом и новым состоянием, а также переход:
Состояние | Сигнал | Декодирование сигнала | Ключ | Состояние | Переход |
0 | номер | Имя читателя | 0_номер | 1 | 0#1 |
0 | NC | Название карты | 0_nc | 2 | 0#2 |
1 | NC | Название карты | 1_nc | 3 | 1#3 |
1 | эээ | Ошибка | 1_er | 0 | 1#0 |
2 | номер | Имя читателя | 2_номер | 3 | 2#3 |
2 | эээ | Ошибка | 2_er | 0 | 2#0 |
3 | тс | Сигнал турникета | 3_ц | 0 | 3#0 |
Алгоритм работы конечного автомата совершенно очевиден (исходное состояние задается при запуске программы):gen=[[0_nr, 0_nc, 1_nc, 1_er, 2_nr, 2_er, 3_ts], [1, 2, 3, 0, 3, 0, 0]]
Все действия, происходящие при изменении состояний, выполняются только на переходах соответствующими скриптами.
Для считывающей машины эти действия показаны в таблице:
Переход | Действия |
0#1 | Определение имени считывателя в системе |
0#2 | Определение имени карты в системе |
1#3, 2#3 | Вызов турникетного автомата (сигналы eo, xo) |
1#0, 2#0, 3#0 | Бездействие |
В этом случае взаимодействие между ним и турникетом отсутствует, и данный автомат не будет работать, так как не сможет выйти из состояния 3. Для перехода автомата в режим регистрации после определения номера считывателя и номера карты , для возврата в исходное состояние его необходимо заменить на следующее:
А как насчет того, что из состояний 1 и 2 можно перейти через два разных перехода (на этих переходах совершаются разные действия)? Дадим переходам названия (на рисунке они обозначены ромбиками)
Например, между состояниями 1 и 0 есть два перехода через сигнал nc и сигнал er. Для одного перехода он имел имя 1#0; для нескольких переходов мы будем использовать имена текущее_состояние#имя_перехода#новое_состояние .
Состояние | Сигнал | Декодирование сигнала | Ключ | Состояние | Переход |
0 | номер | Имя читателя | 0_номер | 1 | 0#1 |
0 | номер | Название карты | 0_nc | 2 | 0#2 |
1 | NC | Название карты | 1_nc | 0 | 1#0#0 |
1 | эээ | Ошибка | 1_er | 0 | 1#1#0 |
2 | номер | Имя читателя | 2_номер | 0 | 2#0#0 |
2 | эээ | Ошибка | 2_er | 0 | 2#1#0 |
Тогда вектор gen, определяющий поведение машины, будет иметь вид: gen=[[0_nr, 0_nc, 1_nc, 1_er, 2_nr, 2_er], [1, 2, 0#0, 1#0, 0#0, 1#0]]
Минимальные изменения в алгоритме связаны с определением нового состояния, поскольку nState=gen[1][keyInd] содержит не имя нового состояния, а его комбинацию с именем перехода, но это вполне очевидно как его найти.
Машина в режиме регистрации на переездах выполняет и другие действия; он не связывается с турникетом
Переход | Действия |
0#1 | Определение имени считывателя в системе |
0#2 | Определение имени карты в системе |
1#0#0, 2#0#0 | Запись новых данных |
1#1#0, 2#1#0 | Сообщение об ошибке |
Государственный автомат турникета
Турникет – это «сложное» устройство, имеющее два замка и устройство, фиксирующее переход, обычно геркон.Также имеются сигнальные лампы, указывающие состояние замков и, возможно, источник звука.
Назовем один замок входом, а другой выходом.
Поскольку каждый замок может находиться в одном из двух состояний (открыт/закрыт), турникет может иметь следующие состояния:
Управление турникетом осуществляется по командам считывателя, командам устройства управления (в нашем случае тачскрину планшета), а также сигналу геркона.
Кроме того, чтобы система не зависала в случае сбоя перехода (сработал считыватель, открылся замок, но посетитель не прошел), в систему добавлен таймер, который также влияет на переходы в турникетный автомат. Переход в эти состояния осуществляется при поступлении одного из сигналов: открыть вход, открыть выход (со считывателя), закрыть вход/выход (с геркона - турникета), открыть/закрыть вход/выход (с тачскрина), закрываем вход/выход (с таймера):
Состояние | Сигнал | Декодирование сигнала | Ключ | Состояние | Переход |
0 | эо | Открытый вход (считыватель) | 0_eo | 1 | 0#0#1 |
0 | хо | Открытый выход (считыватель) | 0_xo | 2 | 0#0#2 |
0 | эп.
|
Открыть вход в систему (сенсорный экран) | 0_эп | 1 | 0#1#1 |
0 | опыт | Открытый выход (сенсорный экран) | 0_xp | 2 | 0#1#2 |
1 | ГТ | Закрыть вход (геркон) | 1_gt | 0 | 1#0#0 |
1 | тт | Закрыть вход (таймер) | 1_тт | 0 | 1#1#0 |
2 | ГТ | Закрыть выход (геркон) | 2_gt | 0 | 2#0#0 |
2 | тт | Закрыть выход (таймер) | 2_тт | 0 | 2#1#0 |
Турникет-автомат выполняет на переходах следующие действия:
Переход | Действия |
0#0#1, 0#1#1 | Открытие входа, включение таймера, вызов интерфейсной машины (сигнал eo) |
0#0#2, 0#1#2 | Открытие выхода, включение таймера, вызов интерфейсной машины (сигнал eo) |
1#0#0 | Закрытие входа, запись данных связи, вызов считывающей машины (сигнал ts), вызов машины интерфейса (сигнал ts) |
1#1#0 | Закрытие входа, вызов считывающей машины (сигнал ts), вызов интерфейсной машины (сигнал ts) |
2#0#0 | Закрытие выхода, запись данных связи, вызов считывающей машины (сигнал ts), вызов интерфейсной машины (сигнал ts) |
2#1#0 | Закрытие выхода, вызов считывающей машины (сигнал ts), вызов интерфейсной машины (сигнал ts) |
Также возможно управление турникетом с планшета (нажатие на стрелку 1 откроет вход, а 2 – выход. Закрытие происходит по сигналам геркона и таймера):
При этом периодически возникают случаи, когда необходимо открыть или закрыть вход/выход с помощью кнопки, независимо от наличия карты.
Для этого используются «светофоры» слева (вход) и справа (выход).
Карты въезда или выезда работают только тогда, когда соответствующий светофор желтый.
Красный сигнал закрывает соответствующий замок и ни одна карта не может его открыть, а зеленый сигнал, наоборот, открывает его и ни геркон, ни таймер не могут его закрыть.
И вот теперь возникает вопрос: если мы при нажатии на зеленую кнопку светофора открываем вход, т.е.
если мы совершаем переход в состояние 1 в турникетном автомате, то как можно предотвратить переход в состояние 0 по сигналу геркона? гт или таймер тт? Понятно, что при «машинном» подходе вы не хотите рассматривать работу с флагами и т.п.
, а хотите работать с машиной, заданной векторным геном.
Давайте расширим понятие ключа в векторном генераторе.
Добавим в строку формирования ключа значение, которое будем называть условием, т.е.
ключ — это состояние_сигнал+условие.
Определим следующие значения условия в зависимости от того, какой свет «включен» на светофоре и какой ключ будет для сигналов геркона гт и таймера тт в состоянии 1:
Светофор | Цвет светофора | Состояние | Ключ |
Оба светофора | Желтый | 1_гт, 1_тт | |
Только вход | Не желтый (красный или зеленый) | лс | 1_gtIs, 1_ttIs |
Единственный выход | Не желтый (красный или зеленый) | РС | 1_гтр, 1_ттр |
Оба светофора | Не желтый (красный или зеленый) | бс | 1_gtbs, 1_ttbs |
После открытия входа зеленой кнопкой левого светофора сигнал с геркона создаст ключ 1_gtIs, а сигнал таймера создаст 1_ttIs, которых нет в векторе gen и поэтому никакого перехода не произойдет. Турникет останется в состоянии 1. Рассмотрим дополнительные переходы в турникете-автомате, связанные с нажатием кнопок светофора.
Сигналы от въездного светофора обозначим как lr – красный, ly – желтый, lg – зеленый, а от выездного светофора – как rr – красный, ry – желтый, rg – зеленый.
Состояние | Сигнал | Декодирование сигнала | Ключ | Состояние | Переход |
0 | LG | Открытый вход с кнопкой зеленого светофора | 0_lg, 0_lgls, 0_lgrs, 0_lgbs | 1 | 0#2#1 |
1 | лр, ли | Закрыть подъезд красной или желтой кнопкой светофора | 1_lrls, 1_lrbs, 1_lyls, 1_lybs | 0 | 1#2#0 |
0 | рг | Открытый выход с кнопкой зеленого светофора | 0_rg, 0_rgls, 0_rgrs, 0_rgbs | 2 | 0#2#2 |
2 | ура, RR | Закройте выход красной или желтой кнопкой светофора.
|
2_рыр,2_ррр, 2_рырс,2_ррбс | 0 | 2#2#0 |
1 | рг | Открыть выход зеленой кнопкой светофора (при открытом входе) | 1_rgls,1_rgbs | 3 | 1#2#3 |
2 | LG | Открыть подъезд зеленой кнопкой светофора (при открытом выходе) | 2_lgrs,2_lgbs | 3 | 2#2#3 |
3 | лр, ли | Закрыть подъезд красной или желтой кнопкой светофора | 3_lybs,3_lrbs | 1 | 3#2#1 |
3 | ура, RR | Закройте выход красной или желтой кнопкой светофора.
|
3_рыб,3_рбс | 2 | 3#2#2 |
Полная генерация вектора для конечного автомата турникета:
gen=[[0_eo, 0_xo, 0_ep, 0_xp, 1_gt, 1_tt, 2_gt, 2_tt, 0_lg, 0_lgls, 0_lgrs, 0_lgbs, 1_lrls, 1_lrbs, 1_lyls, 1_lybs,
0_rg, 0_rgls, 0_rgrs, 0_rgbs, 2_ryrs, 2_rrrs, 2_ryrs, 2_rrbs, 1_rgls, 1_rgbs, 2_lgrs, 2_lgbs,
3_lybs, 3_lrbs, 3_rybs, 3_rrbs, 1_xols, 1_xpls, 3_gtls, 3_ttls, 2_eors, 2_eprs, 3_gtrs, 3_ttrs],
[0#1, 0#2, 1#1, 1#2, 0#0,1#0, 0#0, 1#0, 2#1, 2#1, 2#1, 2#1, 2#0, 2#0, 2#0, 2#0,
2#2, 2#2, 2#2, 2#2, 2#0, 2#0, 2#0, 2#0, 2#3, 2#3, 2#3, 2#3,
2#1, 2#1, 2#2, 2#2, 0#3, 1#3, 0#1, 1#1, 0#3, 1#3, 0#2, 1#2]].
Действия при дополнительных переходах ясны из транскриптов сигналов.
Конечный автомат интерфейса
Турникетами можно управлять с планшета и наоборот; состояние интерфейса зависит от сигналов считывателя и турникета.Как видно из исходного состояния интерфейса (картинка выше), для управления используются две кнопки в форме стрелок и три кнопки на каждом светофоре.
Стрелки работают только тогда, когда соответствующий светофор желтый.
Если светофор красный или зеленый, то стрелка не работает. Другими словами, светофор имеет включенное и выключенное состояние.
Стрелки также имеют два одинаковых состояния.
В результате мы получаем следующие возможные состояния интерфейса:
- все выключено.
Ждем нажатия кнопки;
- стрелочный ввод включен;
- стрелка выхода включена;
- светофор-въезд включен;
- светофор-выход включен;
- оба светофора включены;
- горит стрелка – выезд, когда горит светофор – въезд;
- горит стрелка - въезд, когда горит светофор - выезд.
Соберем, как и раньше, все сигналы и переходы в таблицу (укажем сигналы, относящиеся только к левой половине диаграммы, а вектор gen представим полностью).
Состояние | Сигнал | Декодирование сигнала | Ключ | Состояние | Переход |
0 | ае | Нажмите на стрелку-вход | 0_ae | 1 | 0#0#1 |
0 | эо | Открытый вход (считыватель) | 0_eo | 1 | 0#1#1 |
1 | тс | Закрыть вход (турникет) | 1_ц | 0 | 1#0 |
0 | лр | Нажмите красный светофор-въезд | 0_lr | 3 | 0#0#3 |
0 | LG | Нажмите зеленый светофор-въезд. | 0_lg | 3 | 0#1#3 |
3 | лр | Нажмите красный светофор-въезд | 3_lr | 3 | 3#0#3 |
3 | LG | Нажмите зеленый светофор-въезд. | 3_lg | 3 | 3#1#3 |
3 | ли | Нажмите желтый светофор-вход. | 3_ly | 0 | 3#0 |
3 | рр | Нажмите красный светофор-выход. | 3_рр | 5 | 3#0#5 |
3 | рг | Нажать зеленый светофор – выйти.
|
3_rg | 5 | 3#1#5 |
3 | топор | Нажмите на стрелку выхода | 3_ax | 6 | 3#0#6 |
3 | хо | Открытый выход (считыватель) | 3_xo | 6 | 3#1#6 |
5 | рай | Нажмите желтый светофор-выход. | 5_ry | 3 | 5#3 |
6 | тс | Закрыть вход (турникет) | 6_ц | 3 | 6#3 |
Полный вектор генерации конечного автомата интерфейса:
gen=[[0_ae, 0_eo, 0_ax, 0_ex, 1_ts, 2_ts, 0_lr, 0_lg, 0_rr, 0_rg, 3_ly, 4_ry, 3_ax, 3_xo, 6_ts,
Теги: #скуд #скуд #конечный автомат #Аномальное программирование #Анализ и проектирование систем #Алгоритмы
-
Контрольный Список Готовности Производства
19 Oct, 24