# 충전 시퀀스 분석 (Charging Sequence Analysis)

## 1. 개요 (Overview)
이 문서는 AGV의 자동 및 수동 충전 프로세스에 대한 분석 결과를 기술합니다. UI 트리거부터 이동, 도킹, 충전 명령 전송 및 확인까지의 전체 흐름을 포함합니다.

## 2. UI 트리거 (UI Trigger)
*   **관련 컨트롤**: `btCharge` (자동충전/해제), `btChargeM` (수동충전 모드 토글)
*   **이벤트 핸들러**: `btCharge_Click`, `btChargeM_Click` (in `fMain.cs`)
*   **동작 로직**:
    *   **자동 충전 (`btCharge`)**:
        *   이미 충전 관련 상태(`GOCHARGE`, `CHARGECHECK`)이거나 충전 중(`FLAG_CHARGEONA`)인 경우: → 충전 중지 여부 확인 후 `GOTO`(이동) 상태로 전환하여 충전 해제.
        *   대기 상태인 경우: → 충전 시작 여부 확인 후 `GOCHARGE` RunStep 설정 및 `RUN` 상태 시작.
    *   **수동 충전 (`btChargeM`)**:
        *   `FLAG_CHARGEONM` 플래그를 토글합니다. 자동 충전 중일 때는 진입 불가.

## 3. 상태 머신 로직 (State Machine Logic)

### 3.1 충전 이동 (`_SM_RUN_GOCHARGE.cs`)
충전기를 찾아 이동하고 도킹하는 핵심 시퀀스입니다.

**사전 검사 (Prerequisites)**
1.  **초기화**: `PUB.Result.CurrentPos` 초기화.
2.  **하드웨어 체크**: AGV 연결 상태 확인.
3.  **충전 상태 확인 (최적화)**: 이미 충전 중(`FLAG_CHARGEONA` or `Battery_charging`)인 경우, 충전 시퀀스를 진행하지 않고 즉시 `READY` 상태로 전환합니다. (불필요한 충전 해제/재시작 방지).
4.  **충전 해제 확인 (`_SM_RUN_CHGOFF`)**: 충전 중이 아니라면(위 단계 통과), 확실한 시작을 위해 충전 해제 상태를 보장합니다.
5.  **위치 확인 (`_SM_RUN_POSCHK`)**: 현재 위치를 모를 경우 위치 찾기 수행.

**시퀀스 단계 (Step-by-Step)**
1.  **목표 설정**: `NodeMAP_RFID_Charger` 값을 읽어 충전기 노드를 목표(`TargetNode`)로 설정.
2.  **충전기 위치 이동**:
    *   `UpdateMotionPositionForCharger` 함수를 사용해 충전기 앞단까지 이동.
    *   제한시간(`ChargeSearchTime`) 초과 시 실패 처리 (`CHARGEOFF` 이동).
3.  **정밀 검색 (Fine Search)**:
    *   항상 **전진(Forward)**으로 미세 조정 이동하며 충전기를 검색합니다. (경로 예측 시 전진 진입하도록 설정됨).
    *   음성 안내: "충전기를 검색합니다".
4.  **마크 정지 (Mark Stop)**:
    *   AGV가 기동 중이면 `MarkStop` 명령 전송.
    *   정지할 때까지 대기. 
    *   60초 내 정지 확인 안 되면 실패 처리.
5.  **위치 확정**:
    *   정지 후 3초 대기(센서 안정화).
    *   현재 위치를 `CHARGE`로 설정.
6.  **충전 명령**:
    *   `AGVCharge(true)` 호출하여 하드웨어에 충전 시작 명령 전송.
    *   `WAIT_CHARGEACK` 플래그 설정.
7.  **ACK 확인**:
    *   AGV로부터 "CBT" 응답 대기.
    *   응답 없을 시 재전송(최대 5회), 실패 시 취소 처리.

### 3.2 충전 확인 (`_SM_RUN_GOCHARGECHECK.cs`)
충전 명령 후 실제 배터리 충전이 시작되었는지 검증합니다.

*   **조건**: `Battery_charging` 신호 및 `FLAG_CHARGEONA` 확인.
*   **에러 처리**:
    *   `Charger_pos_error` (위치 에러) 또는 `Charger_run_error` 발생 시 취소.
    *   30초 타임아웃: 충전이 시작되지 않으면 `CHARGEOFF`로 전환하여 프로세스 취소.

### 3.3 충전 해제 (`_SM_RUN_CHGOFF.cs`)
충전 상태를 안전하게 종료합니다.

*   **로직**:
    *   `Battery_charging`이 true면 `AGVCharge(false)` 전송.
    *   충전이 해제될 때까지 대기 (최대 1분).
    *   안전하게 해제되면 `true` 반환.

## 4. 이동 제어 상세 (Movement Control)
*   **핵심 함수**: `UpdateMotionPositionForCharger` (in `_Util.cs`)
*   **특징**:
    *   일반 이동과 달리 충전기 진입을 위한 전용 로직 사용.
    *   `MARK_SENSOR`를 확인하여 충전 위치 도달 여부 판단.
*   **안전 로직 추가 (`CheckStopCondition`)**:
    *   **비상 정지**: `Emergency` 상태이고 로봇이 멈췄을 경우 `IDLE`로 전환 및 중단.
    *   **수동 충전 중**: `FLAG_CHARGEONM` 상태일 경우 이동 불가 처리.

## 5. 주요 설정 및 변수
*   `PUB.setting.NodeMAP_RFID_Charger`: 충전기 위치의 RFID 태그 ID.
*   `PUB.setting.chargerpos`: 충전 진입 방식 (0:전진, 2:후진, 1:QC위치).
*   `PUB.setting.ChargeSearchTime`: 충전기 검색 제한 시간.
