From a69ba578e603894b92b6b08b2e78959b8a4c3976 Mon Sep 17 00:00:00 2001 From: NohDoyeon241104 Date: Tue, 23 Jun 2026 00:38:59 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20SeqAutoRunPTOP=20=EC=8B=9C=ED=80=80?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=84=EC=B2=B4=20=EB=B6=84=EC=84=9D=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=20+=20=EC=9E=91=EC=97=85=EC=9D=BC=EC=A7=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 현재 코드 기준 노드 흐름·PLC 핸드셰이크·레이저 발진 구간 정리 - M70509(Scout, 9번) 분기 특성, 정지/Resume 처리 포함 - 현장 레이저 발진·Scout 이미지 촬영 정상 확인 Co-Authored-By: Claude Opus 4.8 --- docs/분석_SeqAutoRunPTOP_시퀀스.md | 110 +++++++++++++++++++++++++++++ docs/작업일지/2026_06_23.md | 7 ++ 2 files changed, 117 insertions(+) create mode 100644 docs/분석_SeqAutoRunPTOP_시퀀스.md create mode 100644 docs/작업일지/2026_06_23.md diff --git a/docs/분석_SeqAutoRunPTOP_시퀀스.md b/docs/분석_SeqAutoRunPTOP_시퀀스.md new file mode 100644 index 0000000..5ddf315 --- /dev/null +++ b/docs/분석_SeqAutoRunPTOP_시퀀스.md @@ -0,0 +1,110 @@ +# 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]`로 주석 처리 상태(항상 통과). 현장 안정화 후 복원 검토 대상. diff --git a/docs/작업일지/2026_06_23.md b/docs/작업일지/2026_06_23.md new file mode 100644 index 0000000..cf3cb44 --- /dev/null +++ b/docs/작업일지/2026_06_23.md @@ -0,0 +1,7 @@ +# 작업일지 — 2026-06-23 + +## 분석 +- SeqAutoRunPTOP 시퀀스 전체 분석 문서 작성 (`docs/분석_SeqAutoRunPTOP_시퀀스.md`) +- 현재 코드 기준 노드 흐름 / PLC 핸드셰이크 / 레이저 발진 구간 / M70509(Scout, "9번") 분기 특성 / 정지·Resume 처리 정리 +- 현장 레이저 발진은 정상 확인됨 (시퀀스 문제 아님) +- 현장 시퀀스 확인 중 Scout 이미지 촬영까지 확인 완료