Рефлекс. Язык программирования. Пример кода — различия между версиями
Админ (обсуждение | вклад) (Новая страница: «Прогр BottleFillingSystem 02 /* Демонстрационная программа управления эталонным процессом * "Автом…») |
Админ (обсуждение | вклад) м |
||
Строка 162: | Строка 162: | ||
} | } | ||
18 } | 18 } | ||
+ | |||
+ | == Ссылки == | ||
+ | * [http://reflex-language.narod.ru/bottle/00frame.htm источник] |
Текущая версия на 21:36, 29 сентября 2016
Прогр 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 }