Files
Balsam_167/Doc/UMP_LOGGER.md
Andrey 1e911e5250 Обновить логгер УМП и исправить запуск UART и EEPROM
Перейти на компактные 12-словные записи v4 и сохранять 10 процентов банка после отключения. Добавить трёхсекундное ожидание роста ЗПТ и настраиваемый лимит пусков. Явно инициализировать состояние UART и гарантировать публикацию параметров EEPROM перед запуском Timer2. Сохранить воспроизводимые сборки, регрессионные проверки, документацию и обновлённые результаты сборки; исключить временные артефакты.
2026-10-12 12:25:41 +03:00

24 KiB
Raw Blame History

Логгер запуска и отключения УМП: прошивка Бальзам 167 и SetGUI

Назначение и работа оператора

В SetGUI открыть ПМ35 → Настройки, выбрать COM, скорость (обычно 115200) и адрес контроллера (для рассматриваемого УМП — 5). Затем открыть вкладку Логгер УМП. Подключение используется существующее: прямой RS232/RS485 Modbus RTU. CAN-команды от управляющего контроллера фиксируются самой платой нагрузки.

  1. Начать запись включает только регистратор, не пуск УМП. Период снимков по умолчанию 20 мс, диапазон 1–1000 мс.
  2. Левые флажки выбирают отображаемые сигналы. Аналоги рисуются линиями, дискретные сигналы — отдельными дорожками. Выбор не меняет состав записи на плате: скрытую кривую можно включить после захвата.
  3. Онлайн подключает график к уже идущей записи, в том числе после восстановления соединения. Тайм-аут не посылает плате команду останова.
  4. Фактическое включение STOP при переходе работающей нагрузки к снятому разрешению запускает фиксацию отключения. Постинтервал содержит 10% банка — 76 последующих точек, включая события CAN и I/O. Повторные STOP при уже остановленной нагрузке архив не заменяют.
  5. Прочитать отключение загружает архив, не останавливая запись на плате. На время чтения и просмотра архива онлайн-график приостанавливается; вернуться к нему можно кнопкой Онлайн.
  6. Остановить и прочитать останавливает только регистратор и читает текущий банк. При этом существующий архив отключения остаётся доступным.
  7. Сохранить CSV сохраняет поля загруженного/онлайн-буфера, выбранные правыми флажками «Запись в лог», а также время и код события. Выбор не зависит от видимости кривой. Множители графика не изменяют значения CSV. Буфер GUI задаёт число последних точек: от 800 до 100000, по умолчанию 10000. Это отдельный буфер ПК, не ёмкость банка платы и не непрерывная запись на диск. Сохранить график из GUI позволяет выгрузить накопленную онлайн-историю после чтения архива платы.

При разрыве связи журнал на плате продолжает работать. Архив хранится в ОЗУ до следующей фиксации отключения либо перезагрузки/пропадания питания. EEPROM не используется: под отключением в этой задаче понимается команда управляющего контроллера, а не потеря питания.

Память и точность

Использована существующая секция .logg по адресу 0x200000: 64000 16-битных слов. Два банка по 760 записей × 12 слов занимают 18240 слов. Ёмкость в точках сохранена; сокращённая запись освобождает оставшуюся часть выделенного массива. При триггере сохраняются до 683 предыдущих точек, событие отключения и 76 последующих точек. При периоде 20 мс и отсутствии дополнительных событий постинтервал составляет примерно 1,52 секунды. События CAN и дискретов сокращают его временную длительность, но не число зарезервированных точек. Архив после заполнения постинтервала фиксируется, а запись продолжается в другом банке.

Время — 32-битный счётчик миллисекунд записи. Он идёт только при включённом регистраторе и не является абсолютным временем. События в одном тике имеют одинаковую отметку; порядок сохраняется порядком записей. На перезапуске регистратора счётчик продолжает прежнюю шкалу, при перезагрузке платы — 0.

Онлайн-опрос возвращает до десяти последних записей каждые 40 мс. Он не гарантирует передачу каждого события при высоком CAN-трафике, медленном UART или паузах GUI. Номера записей позволяют убрать дубликаты и явно показать пропуски. Полный сохранившийся фрагмент следует читать кнопкой архива. Частота 20 мс выбрана с учётом размера кадра; на низких скоростях нужна большая пауза снимков и подходящий тайм-аут RS.

Все писатели и чтение одного Modbus-блока используют короткие критические секции с восстановлением прежнего состояния IRQ. Внутри нет ожидания UART, EEPROM, выделения памяти или копирования целого банка. Реальную задержку прерываний и длительность критических секций нужно измерить на F28335.

Состав записи v4: 12 слов

Из прошивки и списка графиков удалены 32 неотмеченных канала с двух скриншотов: остатки импульса/инициализации, код и калибровки ЦАП, измерения, ошибки, сырые CAN-слова/счётчики, маска команд, параметры разгона и каналы АЦП. Рабочие калибровочные регистры и сами измерения для управления платой продолжают использоваться по назначению.

В интерфейсе осталось 15 каналов:

Группа Каналы
Ток и уставки Расчётное задание тока, начальная уставка, конечная уставка — мА
Напряжения ЗПТ1: U1 + U2 (ПМ67, рег. 306); ЗПТ2: U3 + U4 (ПМ67, рег. 9) — В
Команды Пуск УМП, сброс УМП
Входы OMEGA, Start_1, Res_in
Выходы START_DPTB, STOP_DPTB, RES_OUT_2
События Событие отключения, усечение постинтервала

«Усечение постинтервала» оставлено для чтения прежних журналов; текущая прошивка v4 бит 9 события не устанавливает. Расчётное задание тока — команда аналоговому выходу, а не измеренный физический ток петли. Для отображения физических единиц у пяти аналоговых каналов нужен множитель ×1,000. Сохранённые пользовательские множители восстанавливаются при запуске GUI; например, ×94,000 меняет только высоту кривой, не ток платы.

Слова Данные Единицы/смысл
0–1 Время, младшее/старшее слово мс записи
2 Событие 1 — период, 2 — CAN, 3 — I/O, 4 — RS, 5 — конец постинтервала
2, бит 8 Событие отключения флаг поверх причины
2, бит 9 Усечение постинтервала совместимость со старыми журналами; в текущем v4 равен 0
3 Команды пуска и сброса только биты 7 и 6; отдельной кривой маски команд больше нет
4 Входы OMEGA, Start_1, Res_in биты 0, 1, 2
5 Выходы START_DPTB, STOP_DPTB, RES_OUT_2 биты 0, 1, 2
6 Расчётное задание тока 0,1 мА; GUI/CSV показывает мА
7–8 Начальная/конечная уставки целые мА
9–10 ЗПТ1/ЗПТ2 беззнаковые слова, масштаб 1 В/ед.
11 Нулевой резерв чётная длина для передачи CAN парами слов

Напряжения принимаются из технологических CAN-кадров с нулевыми индексами 305 и 8. Учитываются все три позиции и биты маски 0x8000/0x4000/0x2000. Они хранятся отдельно от массива modbus[0..127], обновляются и при выключенном логгере. Запись содержит последние принятые значения; до первого приёма — 0. При потере связи остаётся последнее значение: отдельного признака свежести нет. Клиент не преобразует напряжения в знаковые измерения. Свежесть выбранного ЗПТ и защита роста напряжения описаны отдельно в UMP_VOLTAGE_PROTECTION.md. При штатных 6 мА пуск сначала передаёт это задание и получает 3 секунды на рост ЗПТ до 30 В; после этого работает прежняя защита и лимит попыток.

Протокол расширения Modbus

Технологические адреса 0..127 сохранены. Новая область использует полный 16-битный адрес; исходная реализация игнорировала старший байт. Сначала GUI читает 16 слов 0x1000 и проверяет сигнатуру, версию, размер записи и тип платы. До успешной проверки расширенные записи запрещены. Обычный ответ расширения не содержит исторических хвостовых нулей. Между ответом и следующим запросом GUI выдерживает паузу RTU.

FC03, 0x1000, 16 слов:

Смещение Значение
0,1 0x554D, версия 4
2,3 состояние и число записей выбранного источника
4,5 12 слов в записи, 760 записей в банке
6 период периодических снимков, мс
7,8 счётчик времени, младшее/старшее слово
9,10 Desk (требуется 6 / dsk_LOAD), Mode
11 частота временной базы, 1000 Гц
12 поколение архива, mod 65536
13 число записей архива
14 верхняя оценка оставшихся миллисекунд: число точек × период, до 65535
15 состояние текущего регистратора независимо от выбора источника

Состояния: 0 — ещё не запущен, 1 — запись, 3 — остановлен/архив.

FC06:

  • 0x1000: 1 — новый текущий журнал, 0 — остановить его;
  • 0x1001: период 1..1000, менять только при остановленном журнале;
  • 0x1002: хронологический индекс первой записи окна 0..759;
  • 0x1003: источник окна, 0 — текущий остановленный банк, 1 — архив отключения.

FC03, 0x1010, до 120 слов: окно от установленного индекса; для целых записей v4 читать 12, 24, …, 120 слов. CAN допускает кратные 12 до 120 слов и прежние размеры v2/v3; RTU допускает 1..120 слов. Чтение текущего банка этим окном во время записи не выдаёт изменяющиеся данные. GUI сначала останавливает его; архив можно читать при работающем текущем банке. После всех блоков GUI повторно проверяет поколение архива; при замене во время чтения результат не подменяет предыдущий график.

FC03, 0x1100, ровно 124 слова: онлайн-блок. Слова 0,1 — 32-битный номер первой записи, 2 — число записей 0..10, 3 — поколение архива, далее до десяти записей по 12 слов. Неиспользованные слова равны нулю. Окно онлайн не зависит от курсора/выбора архива. Разделение 0x1010 и 0x1100 предотвращает пересечение двух окон.

Недопустимые диапазоны и значения возвращают исключения Modbus 2/3. CRC и разбор стандартного ответа GUI используют существующее общее ядро. SetGUI распознаёт v2 (40 слов, 800 записей), v3 (42 слова, 760 записей) и v4 (12 слов, 760 записей). Для v2 ЗПТ недоступны (NaN). Старые архивы декодируются по прежним индексам, но удалённые каналы в панели и CSV больше не создаются. Валидаторы RTU/CAN поддерживают компактные размеры записи. Исходники протокола подключаются к прошивке из templates/c/set-protocol.

Проверка и запуск

Текущая проверенная сборка с пуском 3 секунды и сокращённым журналом: Bin/StartupWait3s/UKSSTMS320F28335_startup_3s_378e06a+.bin. Размер — 32180 байт; для AT25256B допустимы 32508 байт, запас — 328 байт. Рядом находятся OUT, MAP, манифест и SHA-256. Для чтения v4 используйте обновлённый SETGUI и перезапустите приложение после изменения исходников.

Воспроизводимая сборка из корня проекта: python Bin/StartupWait3s/rebuild.py. Скрипт использует установленный TI C2000 22.6, ABI COFF, -O2, --opt_for_speed=0 и секции функций. Все модули пересобираются в отдельный каталог; до формирования готового BIN проверяются профиль AT25256B, граница 32508 байт, блоки RAM и точка входа SCI8. Сохраняются паспорт и SHA-256. Из CCS используется та же карта памяти и настройки проекта. В include-path нужны каталоги общего c/set-protocol, его порта ports/tms320f28335 и сгенерированного паспорта. Обе используемые копии библиотеки поддерживают v4: ../newProject/templates и ../newProject/SETGUI/third_party/templates.

При загрузке main() вызывает ump_log_init() до включения прерываний. Это обязательно для TI COFF: стартовый код не обнуляет неинициализированные переменные .ebss. Без явной инициализации состояние, счётчики и номера банков могут содержать остаточные значения RAM. Очистка .logg функцией clear_mem() эти переменные не затрагивает. Повторный запуск записи через FC06 не вызывает загрузочную инициализацию и сохраняет архив и шкалу времени. Регрессия python tests/ump_logger/run_init_test.py (GCC в PATH) проверяет запуск с ненулевой RAM и отрицательный контроль без инициализации; внешняя библиотека templates/c/set-protocol для этого теста не нужна.

Изменены исходники прошивки и SetGUI; новый образ собран в отдельном каталоге. Проверены TI-компиляция, линковка и формат SCI8 для AT25256B. Физические уровни GPIO и ток после загрузки образа проверяются на плате.

Автотест C в tests/ump_logger компилирует непосредственно log_to_mem.c с подменой GPIO/IRQ. Проверяет кольцо, граничные адреса, обе команды отключения, защиту триггера от переполнения, переключение банков, сохранность архива во время дальнейшей записи, токовое задание и оба ЗПТ. Это проверка алгоритма на компьютере, не проверка таймингов и 16-битной ABI TI. Отдельно выполнена синтаксическая проверка изменённых C-файлов Clang с исходными заголовками и декларациями TI-интринсиков.

Проверенный набор SetGUI: tests/test_ump_logger.py, tests/test_ump_logger_can.py, tests/test_ump_voltage_protection.py — 93 теста. Они проверяют единицы мА, битовые сигналы, временные метки, несовместимую прошивку, порядок команд, архив при активной записи, замену поколения, дубликаты/пропуски онлайн, потерю связи и флажки графиков.

Проверка на стенде: включить запись → подать CAN-пуск → изменить уставку → подать откл. → дождаться заполнения 76 точек постинтервала → прочитать архив и сверить задание, внешний ток и дискретные уровни; затем повторить с разрывом RS. Период 1 мс проверить отдельно под максимальной CAN-нагрузкой.

Исторически для сборки v3 требовался templates/main начиная с коммита c0ee7c4 (поддержка CAN-чтения 42/84 слов и порт TMS320F28335).

Пересечение образа 34a95bc5 с параметрами EEPROM

Образ UKSSTMS320F28335_34a95bc5.bin имеет размер 32518 байт. Save_params записывает 129 слов с адреса 0x3FFF-(128+1); драйвер EEPROM умножает адрес на 2. Параметры начинаются с байта 32508. Последние 10 байт BIN пересекаются с параметрами: два последних адреса таблицы переходов ump_log_read (регистры 0x100E/0x100F) и завершающее нулевое слово загрузочной таблицы. Сохранение параметров повреждает эту часть образа для последующей загрузки. Это установленный дефект образа; причину таймаута на конкретной плате нужно подтвердить повторной проверкой.

В исправлении временный снимок RS перенесён со стека в статический буфер: обработчики RS вызываются последовательно из main, а перед возвратом снимок полностью кодируется в собственный буфер UART. CAN имеет свой буфер. Сборка build_logger.ps1 использует параметры CCS Debug (-O1, speed=3) и создаёт отдельный Bin/LoggerEepromFix/UKSSTMS320F28335_logger_eeprom_fix.bin. Проверенный размер — 32494 байта, запас до параметров — 14 байт.

Оба сценария сборки вызывают check_firmware.ps1 до публикации BIN. Проверяются размер, формат SCI8, полнота блоков и конец загрузочной таблицы. При превышении границы остаётся только файл .pending; готовый BIN не публикуется. Проверка: python tests/ump_logger/test_firmware_image.py. После перепрошивки требуется проверка на плате; проверка на ПК её не заменяет.

Исправление ожидания EEPROM при запуске через CCS

В сборке CCS с O3 подтверждён перенос записей полей readData и writeData за цикл ожидания spiSe2pFree(). Указатель msgPtr и флаг csr были volatile, но содержимое дескриптора — нет. Timer2 получал запрос с незаполненными адресом, длиной и указателем буфера, поэтому Load_params() мог не завершиться, хотя UART уже принял команду. Все три поля SE2P_DATA теперь volatile. В дизассемблере исправленного OUT записи всех полей предшествуют флагу запроса.

Для проверки старой AT25256B подготовлен Bin/EepromPublishFix/UKSSTMS320F28335_eeprom_fix.out и одноимённый BIN с build_id. Сборка python Bin/EepromPublishFix/rebuild.py явно задаёт EEPROM_M95M02=0 и O3; размер проверенного BIN — 32074 байта, запас до параметров — 434 байта. Проверка порядка инструкций: python tests/eeprom_profiles/check_publication.py Bin/EepromPublishFix/disassembly.txt. На листинге прежнего OUT эта проверка падает, на исправленном проходит для чтения и записи. Пройдены модели обоих профилей EEPROM и UART. Запуск на плате после загрузки исправленного OUT ещё требует подтверждения.