# 충전 시퀀스 분석 (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`: 충전기 검색 제한 시간.