Рефлекс. Язык программирования. Пример кода

Материал из ТХАБ.РФ
Перейти к: навигация, поиск

Прогр BottleFillingSystem 02 /* Демонстрационная программа управления эталонным процессом

* "Автоматизированная линия розлива" 
* 
* ДАТА СОЗДАНИЯ: 4.01.2006
* АВТОР: Зюбин Владимир
*/

03

{ 04

ТАКТ 100; 05 КОНСТ ВКЛ 1; КОНСТ ВЫКЛ 0;

/*===========================================================*/ /*========= БАЗОВЫЕ АДРЕСА МОДУЛЕЙ УСО ======================*/ /*===========================================================*/

КОНСТ BA_FPGA1_U1 0XA110; /* ВХОД */ КОНСТ BA_FPGA3_U1 0XA910; /* ВЫХОД */ КОНСТ BA_FPGA1_U2 0XA120; /* АНАЛОГОВЫЙ ВХОД 8 бит */ 06 /*################################################*/ /*######## ОПИСАНИЕ РЕГИСТРОВ МОДУЛЕЙ УСО ########*/ /*################################################*/ ВХОД ЛОГ_ВХОДЫ BA_FPGA1_U1 0 8; /* имя, базовый адрес, № Регистра, 8бит */ ВЫХОД ЛОГ_ВЫХОДЫ BA_FPGA3_U1 0 8; ВХОД ВХОД_АЦП BA_FPGA1_U2 0 8; 07 /*##########################*/ /*######## ПРОЦЕССЫ ########*/ /*##########################*/

ПРОЦ Инициализация{ 08 /*===========================================================*/ /*=========== ОПИСАНИЕ ПЕРЕМЕННЫХ ===========================*/ /*===========================================================*/

/* ВХОДНЫЕ СИГНАЛЫ: */ ЛОГ К_КНОПКА_ПУСКА_СИСТЕМЫ = {ЛОГ_ВХОДЫ[1]} ДЛЯ ВСЕХ; ЛОГ К_БУТЫЛКА_ПОД_СОПЛОМ = {ЛОГ_ВХОДЫ[1]} ДЛЯ ВСЕХ; ЛОГ К_БУТЫЛКА_НАПОЛНЕНА = {ЛОГ_ВХОДЫ[1]} ДЛЯ ВСЕХ; ЛОГ К_БАК_ПУСТ = {ЛОГ_ВХОДЫ[1]} ДЛЯ ВСЕХ; ЛОГ К_БАК_ПОЛОН = {ЛОГ_ВХОДЫ[1]} ДЛЯ ВСЕХ;

/* ВЫХОДНЫЕ СИГНАЛЫ: */ ЛОГ У_НАПОЛНЕНИЕ_БАКА = {ЛОГ_ВЫХОДЫ[1]} ДЛЯ ВСЕХ; ЛОГ У_РАЗОГРЕВ_БАКА = {ЛОГ_ВЫХОДЫ[1]} ДЛЯ ВСЕХ; ЛОГ У_ЗАПОЛНЕНИЕ_БУТЫЛКИ = {ЛОГ_ВЫХОДЫ[1]} ДЛЯ ВСЕХ; ЛОГ У_ВКЛ_КОНВЕЙЕРА_1 = {ЛОГ_ВЫХОДЫ[1]} ДЛЯ ВСЕХ; ЛОГ У_ВКЛ_КОНВЕЙЕРА_2 = {ЛОГ_ВЫХОДЫ[1]} ДЛЯ ВСЕХ;

/* СИГНАЛ ОТ АЦП: */ ЦЕЛ ФП_ТЕМПЕРАТУРА = {ВХОД_АЦП[8]} ДЛЯ ВСЕХ; 09 СОСТ Начало{ /* именно отсюда все и начинается после включения питания */

   У_НАПОЛНЕНИЕ_БАКА = ВЫКЛ; /* выключаем все */
   У_РАЗОГРЕВ_БАКА = ВЫКЛ;
   У_ЗАПОЛНЕНИЕ_БУТЫЛКИ = ВЫКЛ;
   У_ВКЛ_КОНВЕЙЕРА_1 = ВЫКЛ;
   У_ВКЛ_КОНВЕЙЕРА_2 = ВЫКЛ;
   В СЛЕДУЮЩЕЕ; /* переходим в следующее состояние */ 

} 10 СОСТ ОжиданиеНажатияКнопкиСтарт{

   ЕСЛИ (К_КНОПКА_ПУСКА_СИСТЕМЫ == ВКЛ) { /* каждые 100 мс проверяем кнопку */
       У_ВКЛ_КОНВЕЙЕРА_2 = ВКЛ; /* если нажата - включаем конвейер 2 */
       СТАРТ ПРОЦ НаполнениеБака;
       СТАРТ ПРОЦ ПодачаБутылок;
       В СЛЕДУЮЩЕЕ; /* и уходим в следующее */
   } /* а иначе - ничего не делаем */

} 11 СОСТ ОжиданиеОстанова{

   ЕСЛИ (К_КНОПКА_ПУСКА_СИСТЕМЫ == ВЫКЛ) { /* каждые 100 мс проверяем кнопку */
       СТОП ПРОЦ НаполнениеБака;
       СТОП ПРОЦ ПодогревБака;
       СТОП ПРОЦ РозливБутылок;
       СТОП ПРОЦ ПодачаБутылок;
       В СОСТ Начало; /* по выключению и уходим в */
   } /* Начало, там все выключится */
} 

12 } 13 ПРОЦ НаполнениеБака{

ИЗ ПРОЦ Инициализация К_БАК_ПУСТ, /* описывать уже не надо, */
                      К_БАК_ПОЛОН, /* просто ссылка */
                      У_НАПОЛНЕНИЕ_БАКА,
                      У_РАЗОГРЕВ_БАКА, 
                      У_ЗАПОЛНЕНИЕ_БУТЫЛКИ;

14 СОСТ Начало{

   ЕСЛИ (К_БАК_ПУСТ) В СЛЕДУЮЩЕЕ;
   ИНАЧЕ {
       СТАРТ ПРОЦ ПодогревБака; /* если есть жидкость, то можно нагревать */
       В СЛЕДУЮЩЕЕ; 
   }
}
СОСТ КонтрольУровня_в_Баке{
   ЕСЛИ (К_БАК_ПУСТ) { /* если бак опустел, то */
       СТОП ПРОЦ ПодогревБака;
        СТОП ПРОЦ РозливБутылок;
       У_РАЗОГРЕВ_БАКА = ВЫКЛ; /* разогревать нельзя */
       У_ЗАПОЛНЕНИЕ_БУТЫЛКИ = ВЫКЛ; /* в бутылки лить тоже нельзя */
       У_НАПОЛНЕНИЕ_БАКА = ВКЛ; /* можно только наполнять бак */
       В СЛЕДУЮЩЕЕ;
   }
}
СОСТ КонтрольНаполненияБака{
   ЕСЛИ (К_БАК_ПОЛОН) { /* если бак наполнился до отказа, то */
       СТАРТ ПРОЦ ПодогревБака; /* можно разогревать */ 
       У_НАПОЛНЕНИЕ_БАКА = ВЫКЛ; /* а наполнять уже не надо */
       В СОСТ КонтрольУровня_в_Баке;
   } 
}

} 15 ПРОЦ ПодогревБака{ ИЗ ПРОЦ Инициализация ФП_ТЕМПЕРАТУРА,

                      У_РАЗОГРЕВ_БАКА,
                      У_ЗАПОЛНЕНИЕ_БУТЫЛКИ; 
СОСТ Начало{
   ЕСЛИ (ФП_ТЕМПЕРАТУРА < 100) В СЛЕДУЮЩЕЕ;
   ИНАЧЕ {
       СТАРТ ПРОЦ РозливБутылок; /* если температура в норме, то можно разливать */
       В СЛЕДУЮЩЕЕ; 
   }
}
СОСТ КонтрольОстыванияБака{
   ЕСЛИ (ФП_ТЕМПЕРАТУРА < 100) { /* если бак остыл, то */
       СТОП ПРОЦ РозливБутылок;
       У_ЗАПОЛНЕНИЕ_БУТЫЛКИ = ВЫКЛ; /* в бутылки лить нельзя */
       У_РАЗОГРЕВ_БАКА = ВКЛ;       /* а надо греть бак */
       В СЛЕДУЮЩЕЕ;
   }
}
СОСТ КонтрольНагреваБака{
   ЕСЛИ (ФП_ТЕМПЕРАТУРА > 110) { /* если бак нагрелся до максимума, то */
       СТАРТ ПРОЦ РозливБутылок; /* можно разливать */ 
       У_РАЗОГРЕВ_БАКА = ВЫКЛ; /* а греть уже не надо */
       В СОСТ КонтрольОстыванияБака;
   }
}

} 16 ПРОЦ РозливБутылок{ ИЗ ПРОЦ Инициализация К_БУТЫЛКА_ПОД_СОПЛОМ,

                      К_БУТЫЛКА_НАПОЛНЕНА, 
                      У_ЗАПОЛНЕНИЕ_БУТЫЛКИ;  
СОСТ Начало{
   ЕСЛИ (К_БУТЫЛКА_ПОД_СОПЛОМ && !К_БУТЫЛКА_НАПОЛНЕНА) 
       У_ЗАПОЛНЕНИЕ_БУТЫЛКИ = ВКЛ;
   ИНАЧЕ 
       У_ЗАПОЛНЕНИЕ_БУТЫЛКИ = ВЫКЛ;
   ЗАЦИКЛИТЬ; /* снимем контроль ошибки по отсутствию перехода из */
}

} 17 ПРОЦ ПодачаБутылок{ ИЗ ПРОЦ Инициализация К_БУТЫЛКА_ПОД_СОПЛОМ,

                      К_БУТЫЛКА_НАПОЛНЕНА,
                      У_ВКЛ_КОНВЕЙЕРА_1; 
СОСТ Начало{
   ЕСЛИ (К_БУТЫЛКА_НАПОЛНЕНА || !К_БУТЫЛКА_ПОД_СОПЛОМ)
       У_ВКЛ_КОНВЕЙЕРА_1 = ВКЛ; 
   ИНАЧЕ 
       У_ВКЛ_КОНВЕЙЕРА_1 = ВЫКЛ;
   ЗАЦИКЛИТЬ;
}

} 18 }

Ссылки