/* Двухбанковый регистратор событий нагрузки во внешней RAM. Русские пояснения сохранены в UTF-8. */ /* Начинает условие: _LOG_TO_MEM ещё не определён; защищает повторное включение или задаёт значение сборки. */ #ifndef _LOG_TO_MEM /* Определяет защитный символ или переключатель _LOG_TO_MEM для последующей компиляции. */ #define _LOG_TO_MEM /* Включает следующий блок только при определённом символе __cplusplus. */ #ifdef __cplusplus /* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ extern "C" { /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #endif /* Определениa длa работы логгера */ /* Задаёт LOG_PAGE_START = 0x0200000; данные LOG_PAGE_START. */ #define LOG_PAGE_START 0x0200000 /* Задаёт LOG_PAGE_LEN = 0xFA00; данные LOG_PAGE_LEN. */ #define LOG_PAGE_LEN 0xFA00 /* Объявляет no_write — no запись; never_write — never запись. Память определена в другом модуле. */ extern int no_write, never_write; // Флаги, чтобы не писать (если что) /* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ typedef struct /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Объявляет Start — данные Start. */ unsigned long Start; /* Объявляет Finis — данные Finis. */ unsigned long Finis; /* Объявляет Adres — данные Adres. */ unsigned long Adres; /* Объявляет Circl — данные Circl. */ unsigned int Circl; /* Продолжает список аргументов, полей или выражение } LOG;; порядок элементов сохраняется. */ } LOG; /* Объявляет Log — данные Log. Память определена в другом модуле. */ extern LOG Log; /* Запись словa в памать, где логи лежат */ /* Задаёт Log_to_mem = *(int *)(Log.Adres++) = x; данные Log_to_mem. */ #define Log_to_mem(x) *(int *)(Log.Adres++) = x /* Проверка границы памати дла логов */ //#define Test_mem_limit(x) if(Log.Adres > (Log.Finis - (x))) Log.Adres = Log.Start /* Задаёт Test_mem_limit = if(Log.Adres > (Log.Finis - (x))) Log.Adres -=(x); данные Test_mem_limit. */ #define Test_mem_limit(x) if(Log.Adres > (Log.Finis - (x))) Log.Adres -=(x) /* Очистка памати (обнуление) */ /* Обнуляет выделенный диапазон внешней RAM журнала и задаёт границы кольцевого буфера. */ void clear_mem(); /* Логгер УМП: отдельное адресное пространство Modbus, без изменения * 128 технологических регистров. Два банка по 760 записей: * текущий кольцевой журнал и зафиксированный фрагмент отключения. */ /* Задаёт UMP_LOG_BASE = 0x1000U; данные UMP_LOG_BASE. */ #define UMP_LOG_BASE 0x1000U /* Задаёт UMP_LOG_DATA = 0x1010U; UMP LOG данные. */ #define UMP_LOG_DATA 0x1010U /* Задаёт UMP_LOG_WORDS = 42U; UMP LOG слова. */ #define UMP_LOG_WORDS 42U /* Задаёт UMP_LOG_CAPACITY = 760U; данные UMP_LOG_CAPACITY. */ #define UMP_LOG_CAPACITY 760U /* Задаёт UMP_LOG_LIVE_RECORDS = (120U / UMP_LOG_WORDS); данные UMP_LOG_LIVE_RECORDS. */ #define UMP_LOG_LIVE_RECORDS (120U / UMP_LOG_WORDS) /* Задаёт UMP_LOG_LIVE = 0x1100U; данные UMP_LOG_LIVE. */ #define UMP_LOG_LIVE 0x1100U /* Объявляет ump_dac_ramp — ump ЦАП ramp; ump_dac_duration — ump ЦАП duration; ump_dac_go10 — ump ЦАП go 10; ump_dac_stop10 — ump ЦАП stop 10; ump_dac_position — ump ЦАП position. Память определена в другом модуле. */ extern unsigned int ump_dac_ramp, ump_dac_duration, ump_dac_go10, ump_dac_stop10, ump_dac_position; /* Явно инициализирует оба банка регистратора до включения IRQ; повторный старт записи архив не стирает. */ void ump_log_init(void); /* Продвигает время регистратора в Timer1 и снимает записи с заданным периодом. */ void ump_log_tick(void); /* Обслуживает изменения дискретных входов и выходов из главного цикла. */ void ump_log_io(void); /* Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */ void ump_log_can(unsigned int header, unsigned int a, unsigned int b, unsigned int c); /* Регистрирует изменение слова команд после записи по последовательному интерфейсу. */ void ump_log_rs(void); /* Проверяет область чтения регистратора и возвращает слова состояния либо архивной записи. */ unsigned int ump_log_read(unsigned int address); /* Применяет допустимые команды управления регистратором, сохраняя ограничения адресов. */ int ump_log_write(unsigned int address, unsigned int value); /* Включает следующий блок только при определённом символе __cplusplus. */ #ifdef __cplusplus /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #endif #endif /* _LOG_TO_MEM */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */