Files
CCSModuleSW30Web/plan.md

147 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: gbt-to-ccs-port
overview: Перенос прошивки модуля GBT на CCS с сохранением логики силовой части и веб-интерфейса, интеграцией готового CCS-стека из проекта CS60DC_CCS_STM32 и разделением двух независимых UART-протоколов.
todos:
- id: analyze-gbt-project
content: Просмотреть проект `GbTModuleSW30Web` (main, PSU, CONN, LED, веб/диагностика) и зафиксировать все места, где используется GBT-логика (функции GBT_*, структуры, CAN2 и т.п.).
status: completed
- id: extract-ccs-modules
content: Выделить из `CS60DC_CCS_STM32` полный набор CCS-модулей (cp, serial, charger_ccs, структуры CCS_EDCAN_*) и их зависимости (EDCAN, board, adc_filter) для переноса.
status: completed
- id: wire-cp-and-uart3
content: Спланировать привязку CP (ADC1_IN4 и PWM на PA7) и перенастройку CCS-протокола на USART3 в проекте модуля, учитывая текущую конфигурацию таймеров и UART в `GbTModuleSW30Web`.
status: completed
- id: rewrite-main-loop
content: Спроектировать новое содержимое `main()` и `ED_Delay()` в `GbTModuleSW30Web`, убрав GBT-задачи и интегрировав CCS_SerialLoop, CP_Loop, EDCAN_Loop и существующие PSU/METER/CONN/LED/StopButton задачи.
status: completed
- id: clean-gbt-and-keep-can1
content: Определить, какие файлы/части кода GBT можно удалить или заглушить, при этом оставив инициализацию CAN1 и минимально необходимый код для корректной работы bootloader и EDCAN.
status: completed
- id: adapt-web-diagnostics
content: "Наметить изменения веб-интерфейса и диагностического протокола: заменить источники данных с GBT на CCS-структуры, сохранив максимально существующую функциональность."
status: in_progress
- id: define-test-plan
content: Уточнить и зафиксировать подробный тест-план для стендовой проверки новой CCS-прошивки (переходы состояний CP/EVSE, обмен по USART3, защитные сценарии и регрессия веб/диагностики).
status: pending
isProject: 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`).
- **Регрессионные проверки существующей функциональности**:
- веб‑страницы открываются, основные параметры (напряжение, ток, энергии, состояния коннектора) отображаются корректно;
- сохранены привычные логи/формат сообщений (насколько возможно) для удобства отладки.