На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 5 / Пример упрощенной системы управления домашним хозяйством Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Пример упрощенной системы управления домашним хозяйством

Давайте рассмотрим упрощенную систему управления домашним хозяйством, предназначенную следить за расходом тепла, предупреждать о пожаре и управлять орошением газонов, что показано на рисунке 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. Мы предположили, что соответствующие устройства и преобразователи для ввода/вывода данных уже связаны с процессором через интерфейс. Теперь мы готовы обсудить общую конструкцию системы реального времени для упрощенного управления домашним хозяйством.


Мы будем рассматривать три синхронных метода: упорядоченного опроса (без прерываний), основного цикла с прерываниями циклических планировщиков. Как мы уже упоминали, синхронные методы требуют наличия только одного и задачи в системе для их реализации.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz