Лeoнид Ивaнoвич (15.09.2011 13:30, просмотров: 641) ответил Vladimir Ljaschko на Я спрашивал автора 100 автоматов, но не получил ответа. В моих приборах реальных автоматов состояний с переменной состояния до 15. Поддержку функции с одним -двумя флагами/счетчиками, функционирующую без воздействия извне(ну, например, усреднение
Тут больше жонглирование словами. Как назвать - автомат, процесс, задача, от этого суть не меняется. Я обычно называю "процесс" (от одноименного произведения Франца Кафки :) Процессы реализованы в отдельных модулях программы и отвечают за какую-то подсистему устройства. Например, автомат промывки трубопроводов.
Main.с - основной модуль. Главный исполняемый фрагмент:
while(1)
{
tick = Main_GetTick(); //проверка системного таймера
sec = RTC_Update_Time(); //обновление текущего времени
Process_Exe(tick, sec); //выполнение процессов
Menu_Exe(tick, sec); //обработка меню
Main_Rst_Wdt(tick); //рестарт watchdog-таймера
}
Process.с - руководит всеми процессами, собирает их в единую последовательность.
void Process_Exe(bool t, bool s)
{
Flow_Exe(t); //измерение расхода воды
Level_Exe(t); //измерение уровня воды
DS18B20_Exe(t); //измерение температуры воды
Fill_Exe(s); //выполнение процесса наполнения
Solute_Exe(s); //выполнение процесса смешивания
Heat_Exe(s); //выполнение процесса нагрева
if((Proc != PR_STOP) && //если запущен какой-то процесс
(Proc != PR_DONE) &&
(Proc != PR_ERROR))
{ ... выполнение алгоритмов
Menu.с - редактирует параметры для Process и запускает ту или иную последовательность. Также индицирует прогресс.
Fill.с - процесс налива
Solute.с - процесс смешивания
Heat.с - процесс нагрева
Вспомогательные модули:
Flow.с - измерение расхода
Level.с - измерение уровня
DS18B20.с - измерение температуры
RTC.с - служба времени
Relays.с - управление аппаратурой
и т.д.
Каждый процесс имеет простой интерфейс, который описан в соответствующем h-файле. Например, Fill.h:
void Fill_Init(void); //инициализация модуля налива
void Fill_Exe(bool t); //выполнение процесса налива
void Fill_Start(char w, int v); //запуск процесса налива
void Fill_Stop(void); //остановка процесса налива
bool Fill_TopOrDone(void); //проверка верхнего уровня или объема
bool Fill_Done(void); //проверка объема
int Fill_GetV(void); //чтение текущего объема
Вспомогательные модули тоже имеют простой интерфейс. Например, Flow.h:
void Flow_Init(void); //инициализация измерителя уровня
void Flow_Exe(bool t); //выполнение процесса измерения
int Flow_GetV(void); //чтение показаний
void Flow_Clear(void); //очистка показаний