# SeqAutoRunPTOP 시퀀스 전체 분석 > 대상: `Machines/ILSOS_PrismaticRD_PTOP/Sequences/SeqAutoRunPTOP.cs` > 기준일: 2026-06-23 / 현재 코드(field/ptop-1st) 기준 --- ## 1. 전체 노드 흐름 ``` Init → Sequence_Enter 장비 핸들 확보, RecipeManager 확보, PC_AUTO_STATUS=ON → CheckInitCondition (분기) 정상 → CheckPageNo / Resume → UploadList 스킵진입 → CheckPageNo PLC_PAGE_CHANGE_REQ(0x08) ON 대기 (단일 게이트) → CheckRecipeNoComp PLC_RECIPE_NO 읽고 필요 시 레시피 전환·Layers 동기 reload·PC_RECIPE_NO 에코 → CheckPageNoComp PLC_PAGE_NO 3회 검증 → PC_PAGE_NO 에코 + PC_PAGE_CHANGE_COMPLETE → SetUploadWeldingList PageNo로 Layer 선택, 용접 대상 오브젝트 구성 → UploadWeldingList(sub) 스캐너에 용접 리스트 업로드 → GetUploadWeldingList 업로드 결과 확인 (실패 시 중단) → WeldingStartReadBit PLC_WELD_TRIGGER_REQ(M70516) ON 대기 ──────────────────────────── [용접 전 Scout 분기] ──────────────────────────── → PreScoutCheck (분기) M70509(Scout Enable) 읽기 ├ ON → PreScoutSetParams → PreScoutRun(SeqScoutNormal) → PreScoutDone(0.1s) └ OFF → WaitWeldingStart 로 점프 (촬영 스킵) → WaitWeldingStart PC_WELD_TRIGGER_ACK=ON / PC_WELD_BUSY=ON / PC_WELD_COMPLETE=OFF → ExecuteWelding ★ 실제 레이저 발진 (완료비트는 보류) ──────────────────────────── [용접 후 Scout 분기] ──────────────────────────── → PostScoutCheck (분기) M70509(Scout Enable) 읽기 ├ ON → PostScoutSetParams → PostScoutRun(SeqScoutNormal) → PostScoutDone(0.1s) └ OFF → WriteWeldComplete 로 점프 (촬영 스킵) → WriteWeldComplete ACK=OFF / BUSY=OFF / COMPLETE=ON (용접 완료 통보) → CheckCycleStop (분기) Resume 사이클 정리 → CheckPageNo 로 루프백 → SaveResultData 스캐너 파형 저장(SaveRecord), 결과 true → WriteCompletionPLCBit RestoreDeviceStatus()로 PLC 출력 비트 리셋 → Complete 생산 카운트 +1, 다음 사이클 진입 → Final ``` --- ## 2. 핸드셰이크 단계 (PLC ↔ PC) | 단계 | PLC 입력(읽기) | PC 출력(쓰기) | |------|----------------|----------------| | 페이지 변경 요청 | PLC_PAGE_CHANGE_REQ(0x08), PLC_PAGE_NO, PLC_RECIPE_NO | PC_RECIPE_NO, PC_PAGE_NO, PC_PAGE_CHANGE_COMPLETE | | 용접 트리거 | PLC_WELD_TRIGGER_REQ(M70516) | PC_WELD_TRIGGER_ACK, PC_WELD_BUSY | | 용접 완료 | — | PC_WELD_COMPLETE | | Scout 분기 | PLC_SCOUT_ENABLE(M70509) | — (분기 판정용, 출력 없음) | - **단일 게이트**: 매 사이클 `CheckPageNo`의 PAGE_CHANGE_REQ(0x08) 하나로 진입을 통제. Recipe→Page 순서로 확정. - **에코 비트 보존**: 정지 시(`OnSeqActionStop`) PC_PAGE_NO/PC_RECIPE_NO 워드는 0으로 지우지 않음 — PLC 정합 확인용 마지막 값 유지. --- ## 3. 레이저 발진 구간 (ExecuteWelding) ``` 1. HeadTheta 인터락(옵션 ON 시): PLC 미연결/각도 벗어남 → AlarmManager.Alarm + return null (발진 차단, fail-closed) 2. DO9 CoreLaser_Control = ON DO13 RingLaser_Control = ON → Laser Gate ON 3. 15ms 대기 (laserEmissionGateDelayMs, 매뉴얼 ≥10ms + 여유) 4. _Scanner.ExecuteList(LIST1) → 스캐너 발진 5. _Scanner.WaitForListTaskCompleted(1000) 6. DO9/DO13 = OFF → Laser Gate OFF (발진 완료 즉시) 7. JumpAbs(0,0) + SelectCorrectionTable(1) (비전용 보정테이블 복원) 8. 완료비트 송신 보류 → PostScoutCheck 로 이동 ``` - **게이트 DO 주소**: Core=9, Ring=13 (`ePrismaticDOAddress`). PLC 입력 비트 M70509("9번 신호")와는 별개 도메인. --- ## 4. Scout(M70509) 동작 특성 - **판정 시점이 독립적**: PreScoutCheck와 PostScoutCheck가 각각 그 시점에 M70509를 재읽기 → pre/post 사이 값이 바뀌면 한쪽만 촬영 가능. - **완전 직렬**: pre 촬영 → 0.1s → 발진 → post 촬영 → 0.1s → 완료비트. 촬영과 발진은 겹치지 않음. - **완료비트 지연**: M70509 ON이면 PC_WELD_COMPLETE가 (post 촬영시간 + 0.1s)만큼 늦게 전달됨 → Tact 영향 구간. - **OFF면 기존 흐름과 동일**: 촬영 노드 자체를 건너뛰고 바로 용접/완료비트로 점프. - **파일 태그**: `auto_{recipeNo}_{pageNo}_{pre|post}` (`ScoutSaveTag`), 페이지는 현재 `_CurrentPageNo`(0-base) 기준. --- ## 5. 사이클 종료/리셋 처리 - **WriteWeldComplete**: ACK→BUSY→COMPLETE 순으로 50ms 간격 송신. - **SaveResultData → SaveScannerRecordFileForamt**: `SaveRecord("AutoRunTDC")` 후 JumpAbs(0,0)+CorrectionTable(1) 복귀. - **WriteCompletionPLCBit → RestoreDeviceStatus**: PC_PAGE_CHANGE_COMPLETE / WELD_TRIGGER_ACK / WELD_BUSY / WELD_COMPLETE 모두 OFF. - **Complete**: 성공 시 Total/Today 생산 카운트 +1, 다음 사이클 진입(루프백은 CheckCycleStop이 CheckPageNo로). --- ## 6. 정지/예외 처리 (OnStopped / OnForceError → OnSeqActionStop) - PLC 출력 음극 비트 전부 OFF (AUTO_STATUS, TRIGGER_ACK, BUSY, COMPLETE, PAGE_CHANGE_COMPLETE). - 에코 워드(PC_PAGE_NO/PC_RECIPE_NO)는 보존(0 초기화 안 함). - DO9/DO13 Laser Control OFF (try/catch). - 스캐너 StopExecution + JumpAbs(0,0) + CorrectionTable(1) 복귀. --- ## 7. Resume 모드 (bit15 연계) - `ResumeMode=true`면 `CheckInitCondition`이 핸드셰이크를 스킵하고 UploadWeldingList부터 진입. - 1사이클 완료 후 `CheckCycleStop`에서 PC_WELD_READY_ACK=OFF + ResumeMode 해제 → 정상 루프 복귀. --- ## 8. 비고 — 비활성 코드 - `CheckCondition` / `CheckDeviceReady` / `CheckCondition_Interlock` / Alarm 체크 일부는 `[TEST_BYPASS]`로 주석 처리 상태(항상 통과). 현장 안정화 후 복원 검토 대상.