Відображення динаміки моделі СКУД

У попередньої статті розглядалася структурна модель СКУД як сукупності ролей об'єктів і подвійних зв'язків між ними. Така модель дозволяє відобразити результати всіх нас цікавлять процесів, що протікають в системі. Процеси в системі виражаються через взаємодії об'єктів, а результати взаємодій запам'ятовуються в зв'язках. Можна сказати, що зв'язки — це пам'ять про взаємодіях, але самі процеси взаємодії у структурній моделі ніяк не відбиваються. Спостерігач бачить взаємодії через зміни в поведінці або зміни стану об'єктів, які ми будемо називати пристроями. Наприклад, при тому, що піднесло карти c RFID міткою до зчитувача останній повідомляє про зчитуванні звуковим сигналом і миготінням світлодіода. Це може інтерпретуватися як зміна стану фізичної зчитувача, при цьому сама взаємодія між картою і зчитувачем, власне читання, не розглядається. Передбачається, що зчитувач проходить через ряд дискретних станів. Такі дискретні стану зручно моделювати за допомогою машин станів, але для цього потрібно встановити канал між фізичним світом і віртуальним світом (комп'ютерною моделлю). Такий канал, керований контролером каналу, передає фізичні сигнали від пристрою, які спеціальним модулем зв'язку перетворюються в сигнали, що керують машиною станів пристрою. Канал може бути двостороннім:




Один пристрій може бути пов'язано з декількома каналами і один канал може бути пов'язаний з декількома пристроями, при цьому обслуговувати всі канали може один модуль зв'язку:



Пристрою в моделі СКУД



Пристроями ми називаємо об'єкти, поведінка яких може бути описано набір дискретних станів модельованих машинами станів. Визначення набору станів для кожного пристрою здійснюється конструктором модельованої системи.

Машина станів зчитувача



У реалізованій СКУД використовувалися два зчитувача. Один зчитувач був встановлений на турнікеті, а другий на картоприймачі. При такій схемі розташування зчитувачів відвідувач з разовою перепусткою може покинути зону доступу тільки при поверненні картки через картоприймач: зчитувач картоприймача сформує статус мітки Вихід дозволений, а зчитувач на турнікеті — Вихід заборонений. Обидва зчитувача обслуговуються двома каналами, через один канал надходить інформація про ім'я зчитувача, а з другого — про ім'я карти.

Тому у зчитувача є такі дискретні стани:

  • зчитувач готовий до отримання сигналів;
  • отримано ім'я зчитувача;
  • отримано ім'я карти;
  • отримані імена зчитувача і карти.




Використання окремого стану Отримані імена зчитувача і карти замість суміщення його з початковим станом викликано тим, що зчитувач є частиною системи. У цьому випадку повернення в початковий стан буде здійснюватися за сигналом від турнікета.
Перехід у ці стани здійснюються при отриманні одного з сигналів: визначено ім'я зчитувача, визначено ім'я карти, здійснено перехід або спрацював таймер (сигнал від машини турнікета), отримана помилка. Позначимо ці сигнали для прикладу наступним чином: визначено ім'я зчитувача — nr, визначено ім'я карти — nc, отриманий сигнал від турнікета — ts, отримана помилка — er. Так як в загальному випадку невідомо, що визначиться раніше — ім'я зчитувача або карти, то машина станів з сигналами і відповідними переходами буде мати вигляд:



Машина реалізована дуже просто: так як новий стан однозначно визначається поточним станом і сигналом, то в якості ключа, що визначає перехід береться текстова величина состояние_сигнал. Знаючи початковий стан і новий стан легко визначити і перехід, який буде задаватися текстової величиною текущее_состояние#новое_состояние.Тоді для машини зчитувача ми отримаємо наступні відповідності між ключем і новим станом, а також переходом:

Стан Сигнал Розшифровка сигналу Ключ Стан Перейти
0 nr Ім'я зчитувача 0_nr 1 0#1
0 nc Ім'я карти 0_nc 2 0#2
1 nc Ім'я карти 1_nc 3 1#3
1 er Помилка 1_er 0 1#0
2 nr Ім'я зчитувача 2_nr 3 2#3
2 er Помилка 2_er 0 2#0
3 ts Сигнал турнікета 3_ts 0 3#0


Іншими словами, сигнали і переходи в машині станів зчитувача повністю описуються вектором gen

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 nr Ім'я зчитувача 0_nr 1 0#1
0 nr Ім'я карти 0_nc 2 0#2
1 nc Ім'я карти 1_nc 0 1#0#0
1 er Помилка 1_er 0 1#1#0
2 nr Ім'я зчитувача 2_nr 0 2#0#0
2 er Помилка 2_er 0 2#1#0


Для того, щоб можна було використовувати алгоритм, наведений вище, змінимо правило освіти імені стану в gen[1]: имя_перехода#имя_нового_состояния. Тоді вектор 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 eo Відкрити вхід (зчитувач) 0_eo 1 0#0#1
0 xo Відкрити вихід (зчитувач) 0_xo 2 0#0#2
0 ep Відкрити вхід (тачскрін) 0_ep 1 0#1#1
0 xp Відкрити вихід (тачскрін) 0_xp 2 0#1#2
1 gt Закрити вхід (геркон) 1_gt 0 1#0#0
1 tt Закрити вхід (таймер) 1_tt 0 1#1#0
2 gt Закрити вихід (геркон) 2_gt 0 2#0#0
2 tt Закрити вихід (таймер) 2_tt 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 за сигналом геркона gt або таймера tt? Зрозуміло, що при «машинному» підході не хочеться розглядати роботу з прапорами і т. п., а хочеться працювати з машиною, заданої вектором gen.

Розширимо поняття ключа у векторі gen. Додамо до рядка для формування ключа величину, яку будемо називати умовою, тобто це ключ состояние_сигнал+умова. Визначимо наступні значення умови в залежності, який світло «горить» на світлофорах і який ключ буде для сигналів від геркона gt і таймера tt в стані 1:

Світлофор Колір світлофора Умова Ключ
Обидва світлофора Жовтий 1_gt, 1_tt
Тільки вхід Не жовтий (червоний або зелений) ls 1_gtIs, 1_ttIs
Тільки вихід Не жовтий (червоний або зелений) rs 1_gtrs, 1_ttrs
Обидва світлофора Не жовтий (червоний або зелений) bs 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 lr,ly Закрити вхід червоною або жовтою кнопкою світлофора 1_lrls, 1_lrbs, 1_lyls, 1_lybs
0 1#2#0
0 rg Відкрити вихід зеленою кнопкою світлофора 0_rg, 0_rgls, 0_rgrs,0_rgbs 2 0#2#2
2 ry,rr Закрити вихід червоною або жовтою кнопкою світлофора 2_ryrs,2_rrrs, 2_ryrs,2_rrbs 0 2#2#0
1 rg Відкрити вихід зеленою кнопкою світлофора (при відкритому вході) 1_rgls,1_rgbs 3 1#2#3
2 lg Відкрити вхід зеленою кнопкою світлофора (при відкритому виході) 2_lgrs,2_lgbs 3 2#2#3
3 lr,ly Закрити вхід червоною або жовтою кнопкою світлофора 3_lybs,3_lrbs 1 3#2#1
3 ry,rr Закрити вихід червоною або жовтою кнопкою світлофора 3_rybs,3_rrbs 2 3#2#2


Відповідні переходи в машині станів:



Повний вектор gen для машини станів турнікета:

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 ae Натиснути на стрілку-вхід 0_ae 1 0#0#1
0 eo Відкрити вхід (зчитувач) 0_eo 1 0#1#1
1 ts Закрити вхід (турнікет) 1_ts 0 1#0
0 lr Натиснути червоний сигнал світлофора-вхід 0_lr 3 0#0#3
0 lg Натиснути зелений сигнал світлофора-вхід 0_lg 3 0#1#3
3 lr Натиснути червоний сигнал світлофора-вхід 3_lr 3 3#0#3
3 lg Натиснути зелений сигнал світлофора-вхід 3_lg 3 3#1#3
3 ly Натиснути жовтий сигнал світлофора-вхід 3_ly 0 3#0
3 rr Натиснути червоний сигнал світлофора-вихід 3_rr 5 3#0#5
3 rg Натиснути зелений сигнал світлофора-вихід 3_rg 5 3#1#5
3 ax Натиснути на стрілку-вихід 3_ax 6 3#0#6
3 xo Відкрити вихід (зчитувач) 3_xo 6 3#1#6
5 ry Натиснути жовтий сигнал світлофора-вихід 5_ry 3 5#3
6 ts Закрити вхід (турнікет) 6_ts 3 6#3


Відповідні переходи в машині:



Повний вектор gen для машини станів інтерфейсу:

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, 
4_ae, 4_eo, 7_ts, 3_lr, 3_lg, 3_rr, 3_rg, 4_rr, 4_rg, 4_lr, 4_lg, 5_ry, 5_ly, 5_lr, 5_lg, 5_rr, 5_rg],
[0#1, 1#1, 0#2, 1#2, 0, 0, 0#3, 1#3, 0#4, 1#4, 0, 0, 0#6, 1#6, 3,
0#7, 1#7, 4, 0#3, 1#3, 0#5, 1#5, 0#4, 1#4, 0#5, 1#5, 3, 4, 0#5, 1#5, 2#5, 3#5]]


Дії на переходах ілюструються станами інтерфейсу.



Крім того, на переходах змінюється умова для машини турнікета і відбувається її виклик (сигнали ep,xp,lr,lg,ly,rr,rg,ry):

Перейти Умова
0#0#3,0#1#3 ls
3#0
3#0#5,3#1#5 bs
5#3 ls
0#0#4,0#1#4 rs
4#0
4#0#5,4#1#5 bs
5#4 rs


Таким чином, ми побудували за допомогою трьох машин станів, синхронизирующихся за допомогою обмінів сигналами, просту динамічну модель СКУД, що дозволяє реалізовувати досить складну систему управління.
Надалі буде наведено живий приклад реалізації СКУД, заснованої на принципах, викладених в цій та попередній статтях.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.