|
|
|
|
Пример упрощенной системы управления домашним хозяйством
Давайте рассмотрим упрощенную систему управления домашним
хозяйством, предназначенную следить за расходом тепла, предупреждать о пожаре и управлять орошением газонов, что показано на рисунке 5-10.
Температура регистрируется температурно-чувствительным устройством. Некоторый преобразователь преобразует
температуру из аналогового в цифровое значение. Это значение может быть считано из порта и сравнено с образцовой температурой.
Значение образцовой температуры может задаваться пользователем.
Для простоты давайте будем считать это значение постоянной величиной с именем ref_temp. Программа adjust_temp, предназначенная
управлять температурами, задана в листинге 5-2. Отметим, что эта
программа содержит только важные части программы. Менее существенные подробности (такие, как объявление и инициализация переменных) здесь не
показаны.
образцовая
температура
преобразова- преобразова-
тели тели
от датчика ЪДДДДДДДДї ЪДДДДДДДДДї ЪДДДДДДДДДї к наг-
температур і і і і і і рева-
ДДДДДДДДДДДі іДДі іДДі іДДтелю
АДДДДДДДДЩ і і АДДДДДДДДДЩ
от датчика ЪДДДДДДДДї ікомпьютері ЪДДДДДДДДДї к сигна-
огня(дыма) і і і і і і лу тре-
ДДДДДДДДДДДі іДДі іДДі іДДвоги
АДДДДДДДДЩ і і АДДДДДДДДДЩ
от таймера реального і і ЪДДДДДДДДДї к венти-
времени і і і і лю оро-
ДДДДДДДДДДДДДДДДДДДДДДДДі іДДі іДДшения
і і АДДДДДДДДДЩ газонов
АДДДДДДДДДЩ
Рис. 5-10. Упрощенная система управления домашним
хозяйством
|
Листинг 5-2. Программа adjust_temp
----------------------------------------------------------------
adjust_temp:
; delta- для избежания колебаний температур
; ref_temp- значение образцовой температуры
; temp_port- порт, через который выводится
; информация по управлению
температурой
; inc_cod- сегмент программы для повышения
температуры
; dec_code- сегмент программы для снижения
температуры
; read_port- порт, через который ведется
; считывание значений текущей
температуры
in al,read_port ; считать температуру в AL
mov bl,ref_temp ; получить ref_temp в BL
mov cl,bl ; BL будет использоваться позднее
sub cl,delta ; ref_temp - delta в CL
cmp al,cl ; текущая температура меньше
; ref_temp - delta ?
jl increase ; тогда увеличить температуру
add bl,delta ; ref_temp + delta в BL
cmp al,bl ; текущая температура больше
; ref_temp + delta ?
jg decrease ; тогда уменьшить температуру
ret ; сделано
decrease:
mov al,dec_code ; dec_code
out temp_port,al ; temp_port
ret
increase
mov al,inc_code ;inc_cod подлежит выводу в
out temp_port,al ; temp_port
ret
----------------------------------------------------------------
|
Отметим, что нагревание не меняется, когда температура остается в пределах диапазона от ( ref_temp - delta) до (ref_ temp +
delta), как это показано на рисунке 5-11. Здесь значение delta представляет собой маленькую величину допуска (например, в одном
градусе 1F * и он используется для избежания температурных колебаний.
Образцовая температура
(ref_temp)
і
низкая темпера- і высокая темпера-
тура іДdeltaДДіДДdeltaДі тура
ДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДД
повышение температура уменьшение
температуры не меняется температуры
Рис. 5-11. Использование допуска delta небольшой величины
для избежания температурных колебаний
|
Для того, чтобы понять концепцию колебаний, будем считать,
что значение delta равно нулю. В этом случае температуру следует
корректировать всякий раз, когда она точно не равна значению
ref_temp. Предположим, что температура оказалась немного меньше
значения ref_temp. Теперь при обращении к процедуре будет предпринято действие, повышающее температуру. В результате температура
повысится до значения, превышающего величину ref_temp. Теперь при
очередном вызове процедуры будет предпринято действие, понижающее
температуру. В результате таких действий температура будет то повышаться, то понижаться попеременно. Вот это и называется колебанием температур.
Таким образом, применение величины delta (малой, но не равной нулю) способствует погашению колебаний, потому что
температура не меняется при этом в небольшом диапазоне ref_temp.
Теперь давайте рассмотрим программу по активизации сигнала
пожарной тревоги. Нам следует только послать какой-нибудь сигнал,
который отключит потом сигнал о пожаре. Эта процедура под названием initiate_alarm представлена в Листинге 5-3.
Листинг 5-3. Программа initiate_alarm:
---------------------------------------------------------------
initiate_alarm:
; alarm_port -порт для подачи сигнала тревоги
; activate_signal - сигнал для активизации
тревоги
mov al,activate_signal
out alarm_port,al
ret
---------------------------------------------------------------
|
Далее рассмотрим процедуру управления орошением газонов.
Предположим, что нам нужно поливать газоны по вечерам с 18.30 до
20.30. Это требование диктует нам необходимость пользоваться реальным временем, то есть часами. В листинге 5-4 показана такая
процедура, имеющая имя water_lawn.
Листинг 5-4. Программа water_lawn
----------------------------------------------------------------
water_lawn:
; start_hours - компонент "часы" начального
; времени
; start_mins - компонент "минуты" начального
; времени
; stop_hours - компонент "часы" конечного
; времени
; stop_miins - компонент "минуты" конечного
; времени
; water_port - порт для управления
; орошением газона
; start_code - программа начала
; орошения
; stop_code - программа окончания
; орошения
; watering - переменная состояния,
; говорящая о том, что
; началось ли орошение
; или нет
mov ah,2ch ; функция считывания времени
int 21h ; обращение к DOS при возврате
; cx содержит часы и минуты
mov bl,watering ; началось ли орошение?
test bl,1 ;
jz start_or_not нет, тогда начать орошение
mov dh,stop_hours ; не пора ли кончить поливку?
mov dl,stop_mins ; сравнивать со временем ос-
танова
cmp cx,dx ; пора прекратить орошение?
jl exit ; нет,пусть орошение продолжается
mov watering,0 ; орошение прекращено
mov al, stop-code ; вывести код останова
out water_port, al ; через water_port
ret ; выполнено
start_or_not:
mov dh,start_hours ; время начала находится в DX
mov dl,start_mins ;
cmp cx,dx ; пора ли начать орошение?
jl exit ; нет еще
mov watering,1 ; да, орошение началось
mov al,start_code ; вывести код пуска
out water_port,al ; через water_port
exit:
ret ; выполнено
----------------------------------------------------------------
|
В этой программе предполагается, что время остановки (значение "stop_hours:stop_mins") больше времени начала орошения (значения
"start_hours:start_mins). Глобальная булевая переменная
"watering" используется здесь таким образом, что сигнал на запуск или останов поливки должен выдаваться только один раз в день.
Теперь, когда у нас есть индивидуальные процедуры управления
нагреванием, пожарной тревогой и орошением газонов, давайте проведем исследование требований ко всей системе. Температуру следует регулировать
повторно каждые несколько минут. Сигнал пожарной тревоги должен раздаваться сразу же после обнаружения огня (или
дыма) - здесь недопустима задержка!
Газон должен орошаться ежедневно в течение двух часов начиная с 18.30. Мы предположили, что соответствующие устройства и
преобразователи для ввода/вывода данных уже связаны с процессором
через интерфейс. Теперь мы готовы обсудить общую конструкцию системы реального времени для упрощенного управления домашним хозяйством.
Мы будем рассматривать три синхронных метода: упорядоченного
опроса (без прерываний), основного цикла с прерываниями циклических планировщиков. Как мы уже упоминали, синхронные методы требуют наличия
только одного и задачи в системе для их реализации.
|
|