Files
CCSModuleSW30Web/plan.md

16 KiB
Raw Permalink Blame History

name, overview, todos, isProject
name overview todos isProject
gbt-to-ccs-port Перенос прошивки модуля GBT на CCS с сохранением логики силовой части и веб-интерфейса, интеграцией готового CCS-стека из проекта CS60DC_CCS_STM32 и разделением двух независимых UART-протоколов.
id content status
analyze-gbt-project Просмотреть проект `GbTModuleSW30Web` (main, PSU, CONN, LED, веб/диагностика) и зафиксировать все места, где используется GBT-логика (функции GBT_*, структуры, CAN2 и т.п.). completed
id content status
extract-ccs-modules Выделить из `CS60DC_CCS_STM32` полный набор CCS-модулей (cp, serial, charger_ccs, структуры CCS_EDCAN_*) и их зависимости (EDCAN, board, adc_filter) для переноса. completed
id content status
wire-cp-and-uart3 Спланировать привязку CP (ADC1_IN4 и PWM на PA7) и перенастройку CCS-протокола на USART3 в проекте модуля, учитывая текущую конфигурацию таймеров и UART в `GbTModuleSW30Web`. completed
id content status
rewrite-main-loop Спроектировать новое содержимое `main()` и `ED_Delay()` в `GbTModuleSW30Web`, убрав GBT-задачи и интегрировав CCS_SerialLoop, CP_Loop, EDCAN_Loop и существующие PSU/METER/CONN/LED/StopButton задачи. completed
id content status
clean-gbt-and-keep-can1 Определить, какие файлы/части кода GBT можно удалить или заглушить, при этом оставив инициализацию CAN1 и минимально необходимый код для корректной работы bootloader и EDCAN. completed
id content status
adapt-web-diagnostics Наметить изменения веб-интерфейса и диагностического протокола: заменить источники данных с GBT на CCS-структуры, сохранив максимально существующую функциональность. in_progress
id content status
define-test-plan Уточнить и зафиксировать подробный тест-план для стендовой проверки новой CCS-прошивки (переходы состояний CP/EVSE, обмен по USART3, защитные сценарии и регрессия веб/диагностики). pending
false

Цель

Сделать новую прошивку для платы модуля, основанную на проекте GbTModuleSW30Web, которая:

  • полностью избавлена от GBT-логики и GBT-протоколов,
  • использует CCS-алгоритмы и протокол из проекта [CS60DC_CCS_STM32](CS60DC_CCS_STM32/Core/Src/main.c),
  • сохраняет силовую часть и веб/диагностический функционал существующей GBT-прошивки,
  • использует два независимых UART: существующий (как в GBT) + новый USART3 под CCS-протокол,
  • сохраняет инициализацию CAN1 как заглушку, но не использует старый GBTCAN.

Архитектура на целевом проекте

  • Базовый проект: берем за основу прошивку модуля GBT — [GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c).
  • Источник CCS-логики: переносим state machine и протокол CCS из [CS60DC_CCS_STM32](CS60DC_CCS_STM32/Core/Src/main.c) и связанных файлов:
    • [Core/Src/serial.c](CS60DC_CCS_STM32/Core/Src/serial.c) — протокол MCU↔Everest (через UART, сейчас huart1),
    • [Core/Src/cp.c](CS60DC_CCS_STM32/Core/Src/cp.c) — формирование и измерение CP (PWM+ADC),
    • [Core/Src/charger_ccs.c](CS60DC_CCS_STM32/Core/Src/charger_ccs.c) + соответствующие заголовки и типы CCS_* и CCS_EDCAN_*.
  • Распределение UART:
    • существующий UART из GBTпрошивки оставляем без изменений (диагностика / веб / что используется сейчас),
    • добавляем USART3 для CCSпротокола, берём настройки (baud, parity и т.п.) из CS60DC_CCS_STM32 (там CCS сейчас сидит на USART1, но параметры переносим на USART3).
  • CAN1:
    • оставляем MX_CAN1_Init() и базовую инициализацию как заглушку (по требованию),
    • старые GBTобработчики CAN и GBT_CAN_ReInit() удаляем или заменяем пустыми/адаптированными вызовами к EDCAN при необходимости.
  • Силовая часть, реле, измерения:
    • логика PSU_*, METER_*, CONN_*, LED_* и Stop/EStop остаётся из GBTпроекта,
    • управление главным DCконтактором остаётся как в [GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c) и связанных файлах, но команды/состояния будут приходить из CCSлогики.

План изменения main.c и ядра логики

  • Инициализация (startup):
    • в [GbTModuleSW30Web/Core/Src/main.c](GbTModuleSW30Web/Core/Src/main.c) сохраняем логику OpenBLT/VectorBase (VectorBase_Config() и т.п.);
    • после стандартной HALинициализации (HAL_Init, HAL_RCC_DeInit, SystemClock_Config, MX_GPIO_Init и т.д.)
      • оставляем инициализацию общих периферий: GPIO, ADC1, CAN1, RTC, TIM4 (если используется для других задач), существующие UART (2/5/1) и USART3;
      • убираем GBTспецифичные инициализации: GBT_Init(), GBT_SetConfig(), GBT_CAN_ReInit(), прямые вызовы charger_gbt.h, j1939.h и т.п.;
      • добавляем CCSинициализации по образцу из CS60DC_CCS_STM32/Core/Src/main.c:
        • ADC_Init() (если в проект переносится фильтрация АЦП / adc_filter.c),
        • CP_Init() и первоначальное CP_SetDuty(100);,
        • CCS_Init();,
        • инициализацию EDCAN/адреса: EDCAN_Init(SW_GetAddr()); и возможный CAN_ReInit();, если EDCAN используется.
  • Главный цикл:
    • исходно в GBTпрошивке основной цикл делает:
      • PSU_ReadWrite();, PSU_Task();, METER_CalculateEnergy();, CONN_Loop();, LED_Write();, StopButtonControl(); и несколько ED_Delay(...), в которых вызываются GBTтаски (GBT_ChargerTask(), GBT_ManageLockMotor(), CONN_CC_ReadStateFiltered() и т.п.);
    • заменяем содержимое ED_Delay() и цикла while(1) так, чтобы:
      • в основном цикле выполнялись:
        • CCS_SerialLoop(); (как в [CS60DC_CCS_STM32/Core/Src/main.c](CS60DC_CCS_STM32/Core/Src/main.c)),
        • EDCAN_Loop(); (если EDCAN используется для обмена с главным контроллером),
        • CP_Loop(); (обновление состояния CP и заполнение CCS_EDCAN_Output.cpState),
        • существующие PSU_*, METER_*, CONN_Loop(), LED_Write(), StopButtonControl();
      • ED_Delay() больше не опирается на GBTтаски, а, при необходимости, просто крутит CCS_SerialLoop() / CP_Loop() и необязательные сервисные задачи.

Интеграция CCSпротокола в проект модуля

  • Перенос файлов CCS:
    • добавляем в проект модуля исходники и заголовки из CS60DC_CCS_STM32:
      • [Core/Src/cp.c](CS60DC_CCS_STM32/Core/Src/cp.c) + Core/Inc/cp.h,
      • [Core/Src/serial.c](CS60DC_CCS_STM32/Core/Src/serial.c) + Core/Inc/serial.h,
      • [Core/Src/charger_ccs.c](CS60DC_CCS_STM32/Core/Src/charger_ccs.c) + Core/Inc/charger_ccs.h,
      • необходимые типы CCS_* и CCS_EDCAN_* (структуры состояний, входов/выходов, команд).
    • подправляем includeпути и зависимости под структуру каталогов GbTModuleSW30Web.
  • Привязка к USART3:
    • в перенесённом serial.c заменяем все использования huart1 на huart3:
      • глобальный extern UART_HandleTypeDef huart1;huart3;,
      • HAL_UARTEx_ReceiveToIdle_IT(&huart1, ...)&huart3,
      • HAL_UART_Transmit(&huart1, ...)&huart3;
    • обновляем HAL_UARTEx_RxEventCallback так, чтобы он реагировал на huart3;
    • убеждаемся, что MX_USART3_UART_Init() в GbTModuleSW30Web/Core/Src/usart.c настроен на тот же baud/формат, что и USART1 в CS60DC_CCS_STM32.
  • CPцепь (CP ADC + PWM на PA7):
    • в переносимом cp.c уже есть логика расчёта напряжения CP по ADC_CP_CHANNEL и управление PWM через TIM2;
    • на целевой плате:
      • настраиваем канал ADC, соответствующий ADC1_IN4, как ADC_CP_CHANNEL в конфигурационных файлах/enumах ADC;
      • убеждаемся, что ножка PA7 привязана к нужному таймеру (по CubeMXконфигу) и совпадает с тем, что ожидает cp.c (сейчас TIM2/CH1/CH2) — при необходимости в план добавим правку конфигурации таймера и каналов;
    • оставляем границы состояний CP (A/B/C/D/E/F) и формулы из текущего cp.c без изменений, чтобы поведение соответствовало проверенной CCSпрошивке.
  • Связка CCS ↔ силовая часть/EDCAN:
    • CCS_SerialLoop() управляет структурами CCS_EDCAN_Output и читает CCS_EDCAN_Input;
    • в коде модуля (там, где сейчас GBTлогика связывает CAN/силовую часть с протоколом) заменяем связь на работу с CCS_EDCAN_*:
      • измеренные ток/напряжение из силовой части кладём в CCS_EDCAN_Input.measuredVoltage и measuredCurrent,
      • команды включения/отключения питания (PSU_ON/OFF/PREPARE) и ошибки записываем в CCS_EDCAN_Input.*,
      • из CCS_EDCAN_Output читаем:
        • enablePSU/requestedVoltage/requestedCurrent — для управления источником питания,
        • connectorState, cpState, chargingPercentage — для индикации, логов и веб‑интерфейса.

Удаление GBT и чистка кода

  • Удаление GBTзависимостей:
    • в GbTModuleSW30Web находим и удаляем/отключаем:
      • #include "charger_gbt.h", j1939.h, GBTспецифические модули блокировки/замка, если они не используются механически;
      • функции GBT_Init(), GBT_ChargerTask(), GBT_ManageLockMotor(), GBT_SetConfig(), GBT_CAN_ReInit() и т.п.;
    • оставляем общий код, не завязанный именно на GBT (питание, измерения, коннектор, индикация, веб‑сервер, логирование).
  • CAN:
    • инициализация CAN1 (MX_CAN1_Init()) должна остаться, чтобы bootloader/система не сломались;
    • если от GBT остался CAN2, его можно выключить из конфигурации, если он аппаратно не используется в CCSварианте;
    • при необходимости добавляем простую заглушку вместо старых GBTобработчиков, чтобы сборка прошла без ошибок.

Сохранение веб‑/диагностического функционала

  • Веб‑интерфейс и диагностика:
    • по вашему требованию сохраняем весь существующий веб‑функционал GbTModuleSW30Web, только:
      • удаляем/переписываем поля и страницы, завязанные на GBTсостояния/параметры,
      • вместо GBTпеременных и структур подставляем данные из CCS_EDCAN_Output, CCS_State, CCS_EvInfo и т.п.;
    • протокол диагностики через существующий UART не меняем по формату, только отключаем GBTкоманды/состояния и, при необходимости, добавляем новые поля/команды под CCS (по согласованию).

Тестирование и критерии приёмки

  • Юнит‑/модульные проверки на стенде:
    • запуск прошивки без подключенного EV — проверка, что станция в состоянии Unplugged/EV_STATE_A_IDLE, нет перезагрузок и ошибок;
    • подключение EV/эмулятора:
      • проверка переходов CPсостояний A→B→C, корректных значений напряжения CP,
      • проверка, что CCS_ConnectorState и CCS_EvseState меняются ожидаемо (Preparing, Charging, Finished и т.п.);
    • проверка обмена по USART3:
      • корректный приём/передача пакетов с CRC16,
      • реакция на команды Everest (ENABLE, START/STOP, PWM_DUTY, SET_OUTPUT_VOLTAGE, EV_INFO, EVSE_STATE, KEEP_ALIVE);
    • проверка защиты:
      • ESTOP/StopButton — немедленное отключение выхода и отправка CCS_SendEmergencyStop();
      • таймаут связи с хостом (last_host_seen) — перевод в безопасное состояние (отключение PSU, CP duty = 100%, лог Everest timeout).
  • Регрессионные проверки существующей функциональности:
    • веб‑страницы открываются, основные параметры (напряжение, ток, энергии, состояния коннектора) отображаются корректно;
    • сохранены привычные логи/формат сообщений (насколько возможно) для удобства отладки.