Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ПП.doc
Скачиваний:
30
Добавлен:
17.03.2016
Размер:
5.83 Mб
Скачать

In al,1dh

test al, 01H

jnz m2

; Перевірка наявності сигналу готовності D2 и D3 (якщо так – п. 14.1, інакше – п.11)

In al, 1DH

test al , 06H

jnz m2

; Декремент Ст1.

mov al, 05H 00000101B

out 1FH, al

; Перевірка Out1 (Якщо Out1=0, то перехід п.9, інакше п.13)

in al,1EH

test al 20H

jz m1

; Перехід на кінець

jmp exit

; Виділення Коду ІД1, ІД2, ІД3

; Порівняння з кодом 03Н (якщо так – п.18, інакше – п.14.2)

m2:

in al,1CH

test al,03H

jnz m3

; Порівняння з кодом 05Н (якщо так – п.18, інакше – п.14.3)

in al, 1ch

test al,05H

jnz m3

; Порівняння з кодом 06Н (якщо так – п.18, інакше – п.14.4)

in al, 1ch

test al,06H

jnz m3

; Порівняння з кодом 07Н (якщо так – п.18, інакше – п.15)

in al, 1ch

test al,07H

jnz m3

; Декремент Ст.2.

mov al, 07H

out 1FH, al

; Перевірка Out2 (Out2 = 0 – перехід до п.14.1, іначе 17)

in al,1EH

test al,40H

jz m2

; Перехід на кінець.

jmp exit

; Включення лінії «Control»

mov al, 01H

out 1FH, al

; Перезапуск Ст.0.

mov al ,10H

out 1BH, al

; Очікування Out0 = 1

m4:

in al ,1EH

test al, 10H

jz m4

; Виключення лінії «Control»

mov al, 00H

out 1FH, al

; Перезапуск Ст.0.

mov al ,10H

out 1BH, al

; Очікування Out0 = 1

m5:

in al ,1EH

test al, 10H

jz m5

; Перехід на п. 9

jmp begin

; Кінець

exit:

Питання до лабораторної роботи №8

  1. Архітектура системи. Особливості схемотехніки

  2. Мажоритарний принцип контролю інформаційних сигналів датчиків: ІD1, ІD2, ІD3

  3. Програмування МС І8255. Керуюче слово

  4. Програмування МС І8253. Керуюче слово

  5. Використання лічильників Ст0, Ст1, Ст2 в системі управління

  6. Використання режиму реального часу функціонування лічильників Ст1, Ст2

  7. Логічна обробка сигналів готовності: D1, D2, D3

  8. Перевірка динаміки системи в залежності від сигналів готовності в різних комбінаціях окремо від інформаційних сигналів

  9. Перевірка динаміки системи в залежності від інформаційних сигналів (ID1, ID2, ID3) в різних комбінаціях окремо від сигналів готовності

  10. Оптимізація архітектури системи

Приклади виконання залікової робіи Імітація роботи з/д вокзалу

Завдання

Розробити програму , яка моделює з/д вокзал.

План

Коли приходить поїзд виводиться інформація про його маршрут, кількість пасажирів,кількість вагонів, тривалість маршруту. Вокзал має дві колії (в два напрямки) тому одночасно завантажуватися можуть лише два потяги , інші чекають своєї черги на додаткових тупикових коліях(по 3 штуки на кожну колію). Семафори(10 штуки): два - на в’їзді до вокзалу , два - на виїзді, шість – на додаткових коліях. В програмі існує 4 потяги , які курсують різними маршрутами і зупиняються на вокзалі , семафори повинні просигналізувати їм, коли треба зупинитися , поїхати або стати на додаткову колію. Також у потягів існують пріоритети , які можуть змінюватися. Залежно від них потяги допускають на вокзал. На пріоритет певним чином впливають: середня швидкість потяга, кількість пасажирів, кількість вантажу, пріоритет маршруту, час потрібний на завантаження, надійність.

Кружечки - семафори

Рис.4.3 Схема розташування колій

Сигнал прибулих потягів формується так:

PC(7)- 1-якщо ліва колія

PC(4)- 1-якщо права колія

Рис. 4.4 Схема електрична функціональна

Опис функціонування

Програма імітує роботу з/д вокзалу. Програма використовує бібліотеку тривимірної графіки OpenGL для графічної реалізації алгоритму. Тому координати об’єктів мають вигляд дробових чисел. Для анімації використовується таймер form5.timer1 , який приймає значення від 1 до 551 мілісекунд , відповідно прискорюючись чи сповільнюючись, шаг таймера 50 мілісекунд. В прграмі рухаються 4 потяги. Кожен потяг може мати від 1-го до 10-ти вагонів.

Структура потяга:

tr=record //поїзд

coun:byte; // кількість вагонів

vagon:array [1..10] of va; // масив вагонів

name:string; // ім’я

num:byte; // номер

cond:byte; // стан

prio:integer; // пріоритет

timez:integer; // час на завантаження

track:byte; // доп. Трек який відповідає потягу

trk:boolean; // лівий/правий напрямок руху

speed:byte; // швидкість (середня)

pas:integer; // кількість пасажирів

timemar:string; // час маршруту (середній)

goods:integer; // кількість товарів

mail:integer; // кількість пошти

end;

Структура вагона:

va=record // вагон

nametxt:string; // ім’я вагона

num:byte; // номер

xa,xb,xc,xd:real; // коорд

ya,yb,yc,yd:real; // коорд

typev:byte; // тип вагона

vert:boolean; // вертикальний

end;

Існують такі типи вагонів:

1-локомотив

2-поштовий

3-пасажирський

4-товарний (вантажний)

Відповідно до типу вагон приймає колір:

Пасажирський – зелений

Поштовий – фіолетовий

Товарний - сірий

Локомотив - червоний

Також вагон має пріоритет чим він більший тим швидше потяг допустять на вокзал:

Локомотив-0

Пасажирський-2

Поштовий-3

Товарний-1

На кожній лінії розташовані по три доп. Треки , на яких чекають потяги.

Структура треку:

track=record // доп. трек

xa,xb:real; // коорд

ya,yb:real; // коорд

ok:byte; // наявність поїзда

end;

Якщо потяга на доп. Треку немає тоді змінна ok має значення 0, інакше від 1 до 4.

Рис. 4.5 Інтерфейс програми

На малюнку семафори відмічені цифрами.

Семафори присутні на кожній лінії ( по 5 штук) загалом їх 10.

Структура семафора:

sem=record // семафор

x:real; // коорд

y:real; // коорд

l:boolean; // вкл/викл

end;

Якщо l=true тоді семафор зелений , інакше червоний.

Рухаються потяги завдяки системі станів , стан потяга знаходиться у полі cond .

Відповідно до стану змінюються координати вагонів, потяг стоїть чи рухається.

Для кожної лінії існують свої номери станів: для верхньої(лівої) та нижньої(правої).

Стани змінюються послідовно, виконавши певні умови потяг приймає наступний з можливих станів. Таким чином , змінюючи стани, потяг рухається зліво-направо для верхньої(лівої) колії , чи зправа-наліво для нижньої(правої) колії.

Рух потяга можно зобразити послідовною зміною станів:

0->15->3->5->6->9->11->13->1 –для нижньої(правої) колії

1->14->2->4->7->8->10->12->0 –для верхньої(лівої) колії

Опис станів:

0 – лівий досяг кінця

1 – правий досяг кінця

2 – лівий перед семафором 1

3 – правий прерд семафором 6

4 – лівий їде на доп. трек

5 – правий їде на доп. трек

6 – правий стоїть на дор. треку

7 – лівий стоїть на дор. треку

8 – лівий їде на вокзал

9 – правий їде на вокзал

10 – лівий на вокзалі

11 – правий на вокзвлі

12 – лівий їде

13 – правий їде

14 – лівий піїзджає до семафора 1

15 – правий піїзджає до семафора 6

Опис системних змінних:

st,rst:real; // краї вокзалу

trackL:array [1..3] of track; // доп. треки

trackR:array [1..3] of track; // доп. треки

texturew,textureh:integer; // параметри текстури 1

texturew2,textureh2:integer;// параметри текстури 2

texture:^tex; // текстура 1

texture2:^tex; // текстура 2

im,im2:tbitmap; // рисунки

sema:array [1..10] of sem; // семафори

olg,org:byte; // поїзд їде на доп. трек

vlg,vrg:byte; // поїзд їде на вокзал

vlt,vrt:byte; // таймер находження поїзда на вокзале

slp,srp:byte; // таймер проїзду поїзда через семафор

vlp,vrp:byte; // таймер від’їзду поїзда з вокзалу

tabp:boolean; // змінна таблиці

vbn:boolean; // змінна кольору фону

Змінні olg(ліва),org(права) приймають значення більше 0 , якщо якийсь потяг їде на свії доп. Трек.Ця змінна існує для того щоб потяги не зіштовхувались. Тобто потяг не поїде на свій доп. Трек поки попередні робить це.

Змінні vlg(ліва),vrg(права) приймають значення більше 0, якщо якийсь потяг їде на вокзал.Ці змінні снують для того щоб потяги не зіштовхувались. Тобто для того ж що і olg,org.

Змінні vlt(ліва),vrt(права) це таймери , вони затримують потяг на вокзалі , вони імітують розвантаження/завантаження. Вони приймають значення поля time потяга. Time заповнюється відповідно до типу вагонів:

Локомотив -0

Пасажирський -2

Поштовий -3

Товарний -5

Потім сума часу всіх вагонів множиться на 4.

Змінні slp(ліва),srp(права) теж таймери. Ці таймери тримають семафори 1(slp) та 6(srp) ввімкненими відповідну кількість часу , вона вираховується за формулою:

Slp(srp):=(d+2*p)*coun;

d- довжина вагону(0,08)

p- щілини між вагонами(0,01)

coun- кількість вагонів

За один такт таймера потяг проходить 0,01 тому помноживши довжину вагона на кількість вагонів отримаємо час необхідний на проходження потяга повз семафор.

Змінні vlp(ліва),vrp(права) –таймери вони затримують ввімкненим семафори 10() та 5().

Їх розмір формується таким чином як і slp,srp.

Тепер можна описати алгоритм проходження потяга по верхній(лівій) колії:

14->2->4->7->8->10->12->0

Потяг має стан 14 і рухається до семафору 1.

Досягши семафору 1 Стан потягу стає 2.

Стан 2: перевіряється стан olg ,vlg якщо обидві 0 потяг отримує доп. Трек ,olg стає не 0 і стан потягу стає 4.

Стан 4: потяг рухається на свій доп трек,загорається семафор 1 (slp<>0), досягши його він отримує стан 7.Якщо vlg та olg рівні 0 тоді вибирається потяг з найбільшим пріоритетом , йому присвоюється 8 ,vlg стає не 0 і він рухається на вокзал, інакше чекає черги.

Приїхавши на вокзал розвантажується/завантажується , чекає vlp<>0 , а потім отримує стан 12 і їде.

Досягши певної точки за екраном отримає стан 0.

Доїхавши до кінця нижньої(правої) колії потяг отримує відповідні координати та стан і починає рухатися по верхній(лівій) колії і навпаки.

Рис. 4.6 Алгоритм для верхньої (лівої) колії

Рис. 4.7 Алгоритм для нижньої (правої) колії