Сократить запись логгера УМП до 12 слов формата v4

This commit is contained in:
2026-10-16 11:26:14 +03:00
parent ba9a54959e
commit 1955f2c98f
6 changed files with 246 additions and 147 deletions
+44 -38
View File
@@ -2,7 +2,7 @@
Текущая логика дискретов описана в [SIFU_START_STOP.md](SIFU_START_STOP.md):
CAN-фронты обрабатываются при приёме, импульсы снимаются таймером, STOP
имеет приоритет. Формат записи v2 и интерфейс SetGUI сохранены.
имеет приоритет. Компактный формат записи v4 совпадает с исполнением 167.
## Назначение и работа оператора
@@ -13,8 +13,9 @@ CAN-фронты обрабатываются при приёме, импуль
Общий RS-адрес 16 здесь не рекомендуется: ответ содержит собственный адрес,
и SetGUI проверяет совпадение адресов. CAN-настройки: [PERIPH28335_CAN.md](PERIPH28335_CAN.md).
Перенесён протокол v2 из 167: 40 слов на запись, два банка по 800 записей.
Существующий SetGUI понимает эту прошивку без изменений программы.
Используется формат v4 из 167: 12 слов на запись вместо прежних 40;
ёмкость исполнения 166 сохранена — два банка по 800 записей.
Для чтения нужен SetGUI с поддержкой компактного формата v4, как для 167.
Кнопки записи управляют регистратором; команду запуска УМП подаёт контроллер.
1. **Начать запись** включает только регистратор, не пуск УМП.
@@ -45,7 +46,8 @@ EEPROM не используется: под отключением в этой
## Память и точность
Использована существующая секция `.logg` по адресу 0x200000: 64000
16-битных слов. Два банка по 800 записей × 40 слов занимают её целиком.
16-битных слов. Два банка по 800 записей × 12 слов используют 19200 слов;
размер выделенной секции сохранён. Одна запись занимает 24 байта вместо 80.
Текущий банк кольцевой. При триггере сохраняются последние до 399 записей,
добавляется событие отключения, оставшаяся половина банка отведена
постинтервалу. При 20 мс это до примерно 8 секунд до отключения и 1 секунды
@@ -61,7 +63,7 @@ EEPROM не используется: под отключением в этой
одинаковую отметку; порядок сохраняется порядком записей. На перезапуске
регистратора счётчик продолжает прежнюю шкалу, при перезагрузке платы — 0.
Онлайн-опрос возвращает три последних записи каждые 40 мс. Он не гарантирует
Онлайн-опрос возвращает до десяти последних записей каждые 40 мс. Он не гарантирует
передачу каждого события при высоком CAN-трафике, медленном UART или паузах
GUI. Номера записей позволяют убрать дубликаты и явно показать пропуски.
Полный сохранившийся фрагмент следует читать кнопкой архива. Частота 20 мс
@@ -73,7 +75,12 @@ GUI. Номера записей позволяют убрать дублика
EEPROM, выделения памяти или копирования целого банка. Реальную задержку
прерываний и длительность критических секций нужно измерить на F28335.
## Состав записи: 40 слов
## Состав записи v4: 12 слов
Состав и позиции полей совпадают с компактным логгером 167. Убраны сырые
данные АЦП и CAN, ошибки, счётчики, код и калибровки ЦАП, состояние разгона
и прочие дополнительные диагностические поля. Управление нагрузкой 166,
ёмкость банка и секундный постинтервал отключения сохранены.
| Слова | Данные | Единицы/смысл |
|---|---|---|
@@ -81,33 +88,21 @@ EEPROM, выделения памяти или копирования целог
| 2 | Событие | 1 период, 2 CAN RX, 3 изменение I/O, 4 RS-команда, 5 конец постинтервала |
| 2, бит 8 | Триггер отключения | флаг поверх причины события |
| 2, бит 9 | Усечён постинтервал | установлен в конечном снимке |
| 3 | Commands / modbus[0x7F] | все 16 бит, в том числе пуск, сброс, инициализация и калибровка ЦАП |
| 3 | Commands & 0xC0 | только пуск УМП (бит 7) и сброс УМП (бит 6) |
| 4 | Входы OMEGA, Start_1, Res_in | биты 0,1,2, активный уровень приведён к 1 |
| 5 | START_DPTB, STOP_DPTB, RES_OUT_2 | биты 0,1,2, активный уровень приведён к 1 |
| 6 | IMPowse | остаток импульса, мс |
| 7 | WAKEpowse | остаток инициализации, тики DAC_FREQ |
| 8 | modbus[0x7B] | 12-битный код, переданный функцией dSEND в ЦАП |
| 9 | modbus[0x1C] | расчётное задание в 0.1 мА; GUI/CSV переводит в мА |
| 10–13 | sens_data[0..3] | измеренные сигналы, знаковое 16-битное значение в исходном масштабе |
| 14–17 | modbus[0..3] | маски ошибок измерений |
| 18 | CAN заголовок | адрес регистра в младших 13 битах и маска трёх слов в старших |
| 19–21 | Три слова последнего принятого CAN-кадра | без преобразования |
| 22 | Счётчик записанных CAN RX | младшие 16 бит |
| 23 | CanTimeOutErrorTR | младшие 16 бит счётчика тайм-аутов CAN TX |
| 24–25 | Фиксированные границы разгона 166 | 6 и 16 мА; это не регистры настройки |
| 26–28 | DAC_min(), DAC_max(), DAC_cal() | коды калибровки и ручного задания ЦАП |
| 29–30 | DAC_04, DAC_20 | значения соответствующих регистров |
| 31–32 | count_load, time_dac | положение и длительность разгона в тиках |
| 33–34 | Эффективные границы разгона 166 | 60 и 160 в 0.1 мА; GUI показывает 6 и 16 мА |
| 35 | kod | целочисленное положение, используемое Anal_output |
| 36–39 | adc_table_lem[0..3] | ADCRESULT2..5 после сдвига на 4, диапазон 0..4095 |
| 6 | modbus[0x1C] | расчётное задание в 0.1 мА; GUI/CSV переводит в мА |
| 7–8 | Фиксированные начальная и конечная уставки 166 | 6 и 16 мА; это не регистры настройки |
| 9 | ЗПТ1: U1 + U2 | ПМ67, регистр 306 / нулевой CAN-индекс 305, В |
| 10 | ЗПТ2: U3 + U4 | ПМ67, регистр 9 / нулевой CAN-индекс 8, В |
| 11 | Резерв | всегда ноль; чётная длина нужна для парной передачи CAN |
**Отправленный код ЦАП не является измеренным током выхода.** В этом проекте
не установлено, какой вход аппаратно измеряет ток ЦАП. При включённом
**Расчётное задание тока не является измеренным током выхода.** При включённом
`cCalibrDac` отправляется `DAC_cal()`, а расчётное задание 0x1C остаётся
результатом алгоритма разгона. Для диагностики это различие сохранено.
В 166 каналы «АЦП 0..3» берутся из `adc_table_lem`, обновляемой в режиме
нагрузки. Таблица `adc_table_tpl` в этом режиме не обновляется и не используется.
результатом алгоритма разгона. Сырой код ЦАП и каналы АЦП в запись v4 не входят.
Напряжения обновляются по подтверждённым маской словам CAN даже при остановленной
записи: первый снимок содержит последние принятые значения. До первого приёма
они равны нулю; отдельного флага свежести в формате v4 нет.
Управляющая формула 166 сохранена: `sinus = 10/16 * count_load + 2/16 * time_dac`.
Регулируемый разгон и ограничители 167 не переносились. Поля границ показывают
@@ -128,9 +123,9 @@ FC03, 0x1000, 16 слов:
| Смещение | Значение |
|---|---|
| 0,1 | 0x554D, версия 2 |
| 0,1 | 0x554D, версия 4 |
| 2,3 | состояние и число записей выбранного источника |
| 4,5 | 40 слов в записи, 800 записей в банке |
| 4,5 | 12 слов в записи, 800 записей в банке |
| 6 | период периодических снимков, мс |
| 7,8 | счётчик времени, младшее/старшее слово |
| 9,10 | Desk (требуется 6 / dsk_LOAD), Mode |
@@ -148,15 +143,17 @@ FC06:
- 0x1002: хронологический индекс первой записи окна 0..799;
- 0x1003: источник окна, 0 — текущий остановленный банк, 1 — архив отключения.
FC03, 0x1010, до 120 слов: окно до трёх записей от установленного индекса.
FC03, 0x1010, до 120 слов: окно до десяти записей от установленного индекса.
Для CAN длина должна быть кратна 12 словам: 12, 24, ..., 120; прежние
блоки v2 по 40 или 80 слов отклоняются как обрывающие компактную запись.
Чтение текущего банка этим окном во время записи не выдаёт изменяющиеся
данные. GUI сначала останавливает его; архив можно читать при работающем
текущем банке. После всех блоков GUI повторно проверяет поколение архива;
при замене во время чтения результат не подменяет предыдущий график.
FC03, 0x1100, ровно 124 слова: онлайн-блок. Слова 0,1 — 32-битный номер
первой записи, 2 — число записей 0..3, 3 — поколение архива, далее до трёх
записей по 40 слов. Неиспользованные слова равны нулю. Окно онлайн не
первой записи, 2 — число записей 0..10, 3 — поколение архива, далее до десяти
записей по 12 слов. Неиспользованные слова равны нулю. Окно онлайн не
зависит от курсора/выбора архива. Разделение 0x1010 и 0x1100 предотвращает
пересечение двух окон.
@@ -167,7 +164,14 @@ CRC и разбор стандартного ответа GUI использую
## Проверка и запуск
Перенесены регистратор и RS/CAN-доступ из коммитов 167 `df71922` и `a3633d8`.
Для компактного формата v4 пройден host-тест настоящего `log_to_mem.c`
с MSVC 14.30.30705. Модули `log_to_mem.c`, `ecan.c` и `message.c`
скомпилированы TI C2000 22.6.0.LTS с COFF, FPU32 и O1 без ошибок.
Полная линковка и обновление образов BIN/HEX для этой правки не выполнялись.
Первоначально регистратор и RS/CAN-доступ перенесены из коммитов 167
`df71922` и `a3633d8`. Приведённые ниже результаты полной сборки относятся
к исходному формату v2 до сокращения полей.
Сборка всех 27 C/ASM-файлов и линковка TI C2000 22.6.1.LTS (Debug, COFF,
FPU32, O1) прошли. Остались шесть прежних предупреждений в measure.c/peripher.c.
В MAP: RAML0 занято 0x38D1 из 0x4000 слов, .ebss — 0xFA9 из 0x3000,
@@ -176,8 +180,10 @@ FPU32, O1) прошли. Остались шесть прежних предуп
Сборка проверки лежит вне репозитория, штатные файлы Bin не заменены.
Host-тест компилирует настоящий log_to_mem.c с подменой GPIO/IRQ.
Проверяет кольцо, архив, переполнение постинтервала, онлайн-окно, CAN-протокол,
готовность именно 166, фиксированные границы и четыре канала АЦП.
Проверяет кольцо, архив, переполнение постинтервала, онлайн-окно из десяти
12-словных записей, CAN-протокол v4, готовность именно 166, фиксированные
уставки 6/16 мА, маску команд и получение ЗПТ из трёх позиций CAN-кадра.
Сторожевые значения контролируют границу записи и разделение банков.
Запуск из корня 166: `py -3 tests/ump_logger/run_test.py` (Clang/lld или MSVC
в PATH); при необходимости передать `--compiler "полный путь к cl.exe"`.
Тест не проверяет физические GPIO, тайминги прерываний и 16-битную ABI TI.
@@ -186,7 +192,7 @@ Host-тест компилирует настоящий log_to_mem.c с подм
начать запись → подать CAN-пуск → подать отключение → через секунду прочитать
архив. Сверить START/STOP с физическими выходами и измерениями, повторить с
разрывом RS/CAN. Проверить период 1 мс и задержки IRQ под нагрузкой.
Тесты существующего SetGUI (`test_ump_logger.py`, `test_ump_logger_can.py`,
Для первоначального формата v2 тесты SetGUI (`test_ump_logger.py`, `test_ump_logger_can.py`,
`test_periph28335_tab.py`) в окружении Qt 5: **47 passed**. Проверены протокол,
онлайн/архив, CAN-фрагменты, графики, курсоры и CSV.
Проверка на устройстве не выполнялась.