Запуск лифта начинается с «холодного старта», закрытия двери и вывода лифта на нижний этаж и установка начальных настроек. Основная блок-схема алгоритма работы лифта представлена на рисунке 2. Далее запускается первый таймер с интервалом в 0,2 секунды (блок схема подпрограммы «Таймер 1» представлена на рисунке 3), в момент срабатывания которого на порту «А» на первом разряде формируется уровень напряжения соответствующий логической единице и запускается второй таймер с интервалом в 10 микросекунд (блок схема подпрограммы «Таймер 2» представлена на рисунке 4). В случае если лифт где либо вызван (произошло нажатие кнопки), сначала происходит проверка, находится ли лифт на нужном этаже, если да то открываются двери, если нет, то происходит проверка, находится ли лифт выше нужного этажа. Если лифт находится выше, то запускается подпрограмма «Движение вверх» (блок схема подпрограммы «Движение вверх» представлена на рисунке 5) и происходит изменение управляющего слова. Если лифт находится ниже, то запускается подпрограмма «Движение вниз» (блок схема подпрограммы «Движение вниз» представлена на рисунке 6) и также меняется управляющее слово.
#7 Как автоматически построить блок схему из JavaScript кода
При запуске подпрограммы «Движение вниз» происходит проверка необходимости изменения скорости. Если необходимо сменить скорость, то скорость меняется. Далее проверяем, достигнут ли нужный этаж. Если да то останавливаем лифт и открываем двери и выходим из подпрограммы. Если нет, то сразу выходим.
Движение вверх происходит по аналогичной схеме.
При запуске подпрограммы «Открытие дверей» (блок схема подпрограммы «Открытие дверей» представлена на рисунке 7) происходит проверка возможности открытия дверей.
Если дверь открывается: проверяем, открылась ли дверь. Если открылась, то запускаем таймер ожидания и переходим в начало подпрограммы. Если нет, то сразу переходим в начало.
Если дверь не открывается: проверяем, открыта ли дверь. Если не открыта, то ждем и снова проверяем, открывается ли дверь. Если открыта, то проверяем, истекло ли время ожидания. Если нет, то ждем и проверяем еще раз. Если да, то закрываем дверь и проверяем, поступил ли сигнал.
Если не поступил, то ждем и снова проверяем. Если поступил, то анализируем куда ехать и переходим на метку К.
Рисунок 2 — Основная блок-схема алгоритма
Рисунок 3 — Блок-схема алгоритма подпрограммы «Таймер 1»
Рисунок 4 — Блок-схема алгоритма подпрограммы «Таймер 2»
Рисунок 5 — Блок-схема алгоритма подпрограммы «Движение вверх»
Решаем задачи в виде блок-схемы (7 класс)
Рисунок 6 — Блок-схема алгоритма подпрограммы «Движение вниз»
Рисунок 7 — Блок-схема алгоритма подпрограммы «Открытие дверей»
УПРАВЛЯЮЩАЯ ПРОГРАММА
RamStart EQU $0000
RomStart EQU $E000
StartVector EQU $FFFE
INITRG EQU $0011
;Num1 EQU $60 ;Адрес младшего байта первого числа; ;
;MOVB #$08, $60; ;MOVB #$09, $61; ;LDAA Num1+1;
EtajGdeLift EQU $0020 ;Показывает на каком этаже находиться лифт;
OtkritiZakritiDvery EQU $0021 ;0 — закрыто 1 — открыть дверь 2 — дверь открыта 3 — закрыть дверь;
SkorostLifta EQU $0021 ;ячейка хранящая условие перехода но более высокую скорость;
SkorostDvijenia EQU $0023 ;0 — низкая скорость 1 — средняя скорость;
DvigatelLifta EQU $0024 ;0 — двигатель выключен 1 — двигатель включён;
TimerOtritihDverei EQU $0025 ;0 — таймер выключен 5 — таймер равен 5 секундам;
VizovLiftaVneKabini EQU $0026
VizovLiftaVKabine EQU $0027
EtajKudaNadoLifty EQU $0028
;Холодный старт. Сброс настроек. Закрыть двери. Вывести лифт на нулевой(первый этаж) уровень;
Lift: MOVB #$08, INITRG
MOVB #$01, EtajGdeLift ;этаж где лифт, по умолчанию 1 этаж;
MOVB #$00, TimerOtritihDverei ;по умолчанию таймер выключен, значит в переменной занесён 0;
MOVB #$00, OtkritiZakritiDvery ;по умолчанию закрыты, значит в переменной занесён 0;
MOVB #$00, DvigatelLifta ;по умолчанию выключен, значит в переменной занесён 0;
MOVB #$00, VizovLiftaVneKabini ;по умолчанию лифт не был вызван, значит переменная равна 0;
MOVB #$00, VizovLiftaVKabine ;по умолчанию лифт не был вызван, значит переменная равна 0;
MOVB #$02, SkorostLifta ;Скорость лифта увеличивается если расстояние больше двух этажей;
;Основной цикл лифта;
MOVB #$05, EtajKudaNadoLifty
LDAA #$01 ;Если равно 1 то нажали на кнопку вне кабиты;
CMPA VizovLiftaVneKabini ;Сравниваем ячейку А с переменной вызов лифта вне кабины;
BNE VizovLifta ;Если неравны но переходим на метку VizovLifta, иначе продолжаем работу программы;
LDAA #$01 ;Если равно 1 то нажали на кнопку в кабине;
CMPA VizovLiftaVKabine ;Сравниваем ячейку А с переменной вызов лифта вне кабины;
LDAA EtajKudaNadoLifty ;Здесь указываем этаж на котором мы нажали кнопку вызова;
SUBB EtajGdeLift ;Вычитаем из B значение где находиться лифт, а потом заномим в Б это значение;
CMPB SkorostLifta ;Сравниваем ячейку B с переменной Скорость лифта;
BHI Skorost ;Если ячейка Б больше то переходим на метку Skorost, иначе продолжаем работу программы;
MOVB #$01, SkorostDvijenia
CMPA EtajGdeLift ;Сравниваем ячейку А с переменной ЭтажГдеЛифт;
BNE go ;Если неравны но переходим на метку go, иначе продолжаем работу программы;
CMPA EtajGdeLift ;Сравниваем ячейку А с переменной ЭтажГдеЛифт;
BHI Vverh ;Если мы находимся выше лифта то переходим на метку Vverh, иначе продолжаем работу;
STAA DvigatelLifta ;Включаем двигатель, значит в переменную заносим 1;
DEC EtajGdeLift ;Опускаем лифт на один этаж;
STAA DvigatelLifta ;Включаем двигатель, значит в переменную заносим 1;
INC EtajGdeLift ;Поднимаем лифт на один этаж;
;Мы на нужном этаже;
STAA DvigatelLifta ;Выключаем двигатель, значит в переменную заносим 0;
STAA OtkritiZakritiDvery ;Хотим открыть двери лифта, значит в переменную заносим 1;
STAA OtkritiZakritiDvery ;Открываем двери, значит в переменную заносим 2;
STAA TimerOtritihDverei ;в таймер ввели 5 секунд;
LDAA #$00 ;Здесь указываем когда закрыть двери;
CMPA TimerOtritihDverei ;Сравниваем ячейку А с переменной Таймера;
BNE goTimer ;Если неравны но переходим на метку goTimer, иначе продолжаем работу программы;
JMP TimerItsOk ;Время вышло;
goTimer: DEC TimerOtritihDverei
STAA OtkritiZakritiDvery ;Хотим закрыть двери, значит в переменную заносим 3;
STAA OtkritiZakritiDvery ;Закрываем двери, значит в переменную заносим 0;
Источник: studentopedia.ru
Прерывания. Блок-схема управляющей программы
Здесь: 9h – тип записи (конец файла); 03h-количество данных в полях 4-6; 0000h-адрес; FCh-контрольная сумма.
Исходным материалом для разработки управляющей программы МПК является блок-схема алгоритмического обеспечения мехатронной системы, разработанная на этапе синтеза мехатронной системы. Организацию работы управляющей программы МПК можно проиллюстрировать соответствующей блок-схемой управляющей программы. Сочетание блок-схемы алгоритмического обеспечения и блок-схемы управляющей программы дает достаточно полное представление о работе управляющей программы.
На рис.7 представлен типовой вариант блок-схемы управляющей программы МПК. На рис.7 обозначено: 1-подача питания на МПК; 2-инициализация управляющей программы; 3-фоновый режим работы управляющей программы (метка WAIT:); 4-одна или несколько команд «пусто» (NOP); 5-перезагрузка сторожевого таймера; 6-команда безусловного перехода на метку фонового режима (JMP WAIT); 7-сторожевой таймер; 8 – 10-внешние устройства (события), вызывающие прерывание работы процессора МПК; 11-контроллер прерываний; IRQ1-IRQn – запросы на прерывания от внешних устройств (событий); IR1 – IRn — сигналы прерываний; ISR1-ISRn – программы обработки соответствующих прерываний.
Запуск управляющей программы происходит автоматически при подаче питания на МПК (1) или при перезапуске сторожевого таймера (7). Сразу начинается этап инициализации (2), в котором происходит настройка периферийного оборудования МПК, необходимая для его согласованной работы. Обычно инициализация включает:
· Тестирование (необязательное) арифметическо-логического устройства процессора, ОЗУ, контрольной суммы ПЗУ;
· Инициализацию сторожевого таймера или его отключение;
· Загрузку управляющих слов и констант счета в таймеры;
· Загрузку управляющих слов в контроллер прерываний;
· Установку векторов прерываний;
· Установку начальных значений коэффициентов и постоянных времени, а также вспомогательных переменных (флагов) мехатронной системы.
На время инициализации все прерывания в МПК должны быть запрещены. Инициализация заканчивается разрешением прерываний и переходом в фоновый режим работы (3).
Фоновый режим представляет собой бесконечный замкнутый цикл из ряда «пустых» команд (4) и команды безусловного перехода (6). Если в МПК используется сторожевой таймер, то в фоновом режиме происходит его обязательная перезагрузка константой счета (5).
Сторожевой таймер (7) предназначен для устранения последствий «зависания» процессора в процессе работы. Если процессор «завис», то в фоновом цикле сторожевой таймер не будет перезагружен и, следовательно, выполнит свой счет до конца. Тогда после окончания счета сторожевой таймер произведет принудительную перезагрузку процессора.
В моменты появления n-го сигнала прерывания IRn происходит переход управляющей программы из фонового режима на выполнение соответствующей программы обработки прерываний (ПОП) ISRn. После окончания ее выполнения управляющая программа возвращается в фоновый режим. Контроль над запросами прерываний IRQn и выработку сигналов прерываний IRn осуществляет контроллер прерываний (11). По существу весь алгоритм управления мехатронной системы реализуется в виде совокупности указанных ПОП. При этом одной из важнейших функций контроллера прерываний является организация порядка выполнения всех ПОП мехатронной системы.
Как видно из блок-схемы управляющей программы (рис.7) прерывания являются ключевым моментом в организации работы управляющей программы МПК.
Источник: studopedia.su
5 Разработка блок-схемы управляющей программы
Обработка информации от цифровых датчиков и выдача управляющего воздействия y1 производится путем ввода значений x1, x2, x3, x4 и вычисления булевой функции f1(x1, x2, x3, x4)= y1= x2 x3.
При единичном значении f1 вырабатывается управляющий сигнал y1=1 длительностью t1=200мкс.
При обработке информации с аналоговых датчиков ПМ принимает коды NU1, NU2 с выходов АЦП и код константы К с регистра пульта управления. Далее вычисляется значение функции NU=f2(NU1,NU2, К)=max(NU1;NU2-K) и сравнивается с константой Q, хранящейся в ПЗУ. В зависимости от результатов сравнения вырабатывается (аналогично y1) один из двух двоичных управляющих сигналов y2 или y3 заданной длительности по следующему правилу: если NU2 длительностью t2=50 мкс, иначе выдать y3 длительностью t3=80мкс.
Далее формируется управляющее воздействие Y4, для чего с АЦП вводится значение NU3 и производится вычисление по формуле:
Значение Y4 в виде 8-разрядного кода выдается на вход ЦАП.
Все двоичные переменные и константы, участвующие в вычислениях: NU1, NU2, NU3, К, Q, A0, A1, Y4 рассматриваются как целые без знака.
После выдачи всех управляющих воздействий проверяется состояние тумблера «СТОП» на пульте управления. Если СТОП=0, цикл управления начинается с начала, иначе выполняется процедура останова системы, включающая следующие действия: формируется сигнал установки системы в исходное состояние путем подачи на линию начальной установки интерфейса двух прямоугольных импульсов длительностью 30 мкс интервалом 30 мкс, выполняется команда процессора СТОП.
Блок-схема заданного цикла управления разбита на две части (первая часть представлена на рисунок 21, вторая часть представлена на рисунке 22), общая блок-схема представлена на рисунке 23.
Источник: studfile.net