Перейти на компактные 12-словные записи v4 и сохранять 10 процентов банка после отключения. Добавить трёхсекундное ожидание роста ЗПТ и настраиваемый лимит пусков. Явно инициализировать состояние UART и гарантировать публикацию параметров EEPROM перед запуском Timer2. Сохранить воспроизводимые сборки, регрессионные проверки, документацию и обновлённые результаты сборки; исключить временные артефакты.
24 KiB
Логгер запуска и отключения УМП: прошивка Бальзам 167 и SetGUI
Назначение и работа оператора
В SetGUI открыть ПМ35 → Настройки, выбрать COM, скорость (обычно 115200) и адрес контроллера (для рассматриваемого УМП — 5). Затем открыть вкладку Логгер УМП. Подключение используется существующее: прямой RS232/RS485 Modbus RTU. CAN-команды от управляющего контроллера фиксируются самой платой нагрузки.
- Начать запись включает только регистратор, не пуск УМП. Период снимков по умолчанию 20 мс, диапазон 1–1000 мс.
- Левые флажки выбирают отображаемые сигналы. Аналоги рисуются линиями, дискретные сигналы — отдельными дорожками. Выбор не меняет состав записи на плате: скрытую кривую можно включить после захвата.
- Онлайн подключает график к уже идущей записи, в том числе после восстановления соединения. Тайм-аут не посылает плате команду останова.
- Фактическое включение STOP при переходе работающей нагрузки к снятому разрешению запускает фиксацию отключения. Постинтервал содержит 10% банка — 76 последующих точек, включая события CAN и I/O. Повторные STOP при уже остановленной нагрузке архив не заменяют.
- Прочитать отключение загружает архив, не останавливая запись на плате. На время чтения и просмотра архива онлайн-график приостанавливается; вернуться к нему можно кнопкой Онлайн.
- Остановить и прочитать останавливает только регистратор и читает текущий банк. При этом существующий архив отключения остаётся доступным.
- Сохранить 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 ещё требует подтверждения.