# 메뉴얼 화면 레이저 출사중 표시 및 출사조건 로그 (2026-09-04) > **목적** : 메뉴얼 조작 중 레이저가 실제로 출사되고 있는지 화면에서 즉시 알 수 있게 하고, > 출사가 안 될 때 무엇이 걸렸는지 로그로 추적할 수 있게 한다. > > - 대상 설비 : PtoP 각형화 단동 용접기 (유니셀) > - 이슈번호 : `ISSUE-260904-01` > - 관련 문서 : `Doc/인수인계/260903_Door인터락_현장검증_가이드.html` (260902 Door 인터락) **표기 규칙** (기존 인수인계 문서와 동일) | 표기 | 의미 | |---|---| | 🟩 **소스확인** | PC 소스/설정 파일에서 직접 대조해 확인한 사실 | | 🟦 **현장기록** | 현장 로그·시험 기록에 남아 있는 값 | | 🟨 **미확보** | 아직 확인되지 않음. 이어받는 사람이 채워야 할 항목 | --- ## 1. 한 줄 요약 `Manual > Scanner Operation` 화면에 **레이저 출사중 램프**를 추가했다. 판정은 **DI `Laser_EMISSION_ON`(10)** 과 **DO `Laser_REMOTE`(9)** 두 신호를 함께 보고, 출사 조건 스냅샷은 화면이 아니라 **로그(`[LaserCond]`)** 로 남긴다. > **출사 차단 로직은 한 줄도 바꾸지 않았다.** 표시·기록 전용이다. > 차단은 260902 에 넣은 Door 인터락이 여전히 유일하다. --- ## 2. 배경 현장 요청 두 가지였다. 1. 메뉴얼에서 레이저 출사 시 IO EMISSION 이 점등되니, 그걸 화면에도 표시해 달라. 2. 출사가 안 되면 무엇이 체크되지 않았는지(도어락 OPEN, 알람 미해제 등) 알 수 있으면 좋겠다. 2번은 **화면에 체크리스트를 띄우지 않고 로그로만** 남기기로 확정했다(260904 협의). 현장에서 이미 돌고 있는 코드라 화면·동작 변경을 최소화하는 쪽을 택했다. --- ## 3. 판정 신호 두 개 | 신호 | 의미 | 근거 | |---|---|---| | DI `Laser_EMISSION_ON` = **10** | **실제 발진 피드백** | 🟦 260904 현장 실측 — 이 램프가 들어올 때 실제로 레이저가 출사 중이었다 | | DO `Laser_REMOTE` = **9** | External Start = **Emission 게이트** | 🟩 레이저 38핀 매뉴얼. 🟦 260826 현장 검증 완료 | ### 3.1 코드 주석 정정 🟩 `LaserIOControl.cs` 의 DI 10 주석에 **"DO Laser_REMOTE(External Start) 의 에코"** 라고 적혀 있었으나 **오기**다. 260904 현장 실측으로 실제 발진 피드백임이 확인되어 주석을 정정했다(동작 무관, 주석만). > 260826 에 레시피 화면 `Laser Ready` 표시를 DI 10 대신 DO 9 되읽기로 정한 판단은 **그대로 유효**하다. > DI 10 은 출사 중에만 뜨는 신호라 애초에 Ready 램프로는 쓸 수 없다. ### 3.2 왜 두 신호를 같이 보나 DI 가 현장에서 어떻게 거동할지 확신이 없는 상태라, **이미 검증되어 돌고 있는 DO 9 표시를 빼지 않고** 새 DI 를 함께 얹었다. 램프 안에 `DI:ON / DO:ON` 을 같이 찍으므로 두 신호를 각각 대조할 수 있다. --- ## 4. 화면 표시 규칙 `Manual > Scanner Operation` 우측 **최상단** `Laser Emission` 그룹박스. > **왜 최상단인가 (260904 현장 확인 후 이동)** 🟦 > 처음에는 패널 맨 아래(비어 있던 4번째 행)에 뒀는데 현장에서 **화면에 보이지 않았다.** > 원인은 `UCScannerLaserControl.xaml` 의 컨버터가 `Collapsed` 가 아니라 **`Hidden`** 이라는 것이다. > > ```xml > > ``` > > `Marking On The Fly` 그룹이 이 컨버터를 쓰는데 PTOP 은 `IsUseMarkingOnTheFly = false` > (`EquipmentSetup.cs:297` 에서 `false` 주입) 라 **안 보이면서도 높이는 그대로 점유**한다. > 그 아래 행은 패널 밖으로 밀려난다. → 램프를 0행으로 올려 다른 행 상태와 무관하게 항상 보이도록 했다. | DI 10 | DO 9 | 표시 문구 | 색 | |---|---|---|---| | ON | — | `레이저 출사중` | 적색 `#C62828` | | OFF | ON | `출사 대기 (Remote ON)` | 주황 `#EF6C00` | | OFF | OFF | `OFF` | 회색 `#3E3E42` | | \- | \- | `IO 미연결` / `IO 읽기 실패` | 어두운 회색 `#2A2A2E` | 단순 OR 로 "출사중"만 쓰면 레시피 화면에서 `Laser Ready` 버튼만 켜 둔 상태에서도 출사중으로 보이기 때문에 문구를 3단으로 나눴다. **갱신 주기 200ms.** 기존 100ms `DispatcherTimer`(`OnMonitoring`)에 얹었고 2틱마다 읽는다. PAIX·Ajin 드라이버 모두 비트 1개를 읽을 때마다 DI(DO) 배열 전체를 조회하므로 매 틱 읽지 않는다. > ⚠️ **화면을 벗어나면 타이머가 멈춘다.** 단, 직접 출사(`No Use Spot Time`) 중에는 260902 조치로 > 타이머가 유지된다. 롱텀 출사 중에는 화면을 벗어나지 말 것. --- ## 5. 출사조건 로그 ### 5.1 형식 ``` [LaserCond][ShotOn(Percent)] Door=CLOSE(PLC=False,IO=False) EMO=False Alarm=없음 DI8_READY=T DI9_ALARM=정상 DO9_REMOTE=T NoLaser=False SpotTime=True Busy=False Model=U-Frame SeqTeaching=Idle ``` | 필드 | 의미 | 비고 | |---|---|---| | `Door` | PLC 비트 OR IO DI 4점 | 괄호 안이 계통별 값 | | `EMO` | PLC EMO 비트 | | | `Alarm` | 현재 발생 알람 코드 | **표시 전용 — 출사를 막지 않는다** | | `DI8_READY` | 레이저 Ready (전원 ON & No error) | 전원만 들어오면 상시 T | | `DI9_ALARM` | 레이저 알람 | **Active-Low** — `정상`/`알람` 으로 변환해 기록 | | `DO9_REMOTE` | Emission 게이트 | F 면 출사 자체가 불가 | | `NoLaser` | `No Laser (전압만)` 토글 | **T 면 발진신호를 생략** — 출사 안 되는 흔한 원인 | | `SpotTime` | `Use Spot Time` 토글 | 아래 5.3 참고 | | `Busy` / `Model` / `SeqTeaching` | 스캐너·모델·시퀀스 상태 | | ### 5.2 찍히는 시점 | 태그 | 시점 | |---|---| | `ShotOn(Percent)` / `ShotOn(Watt)` | Laser On 버튼을 누른 즉시 (**Door 차단 여부와 무관하게 먼저**) | | `Heartbeat` | 직접 출사 중 10초 주기 (기존 Door 하트비트에 편승) | | `ShotOff` | Laser Off 실행 후 | | `DoorForceOff` | Door Open 감지로 강제 OFF 한 직후 | `DoorForceOff` 로그의 `DI8/DI9/DO9` 값으로 **강제 OFF 가 실제로 먹었는지**를 신호로 증명할 수 있다. ### 5.3 알아둘 것 — 출사 경로가 두 개다 🟩 Laser On 버튼은 `Use Spot Time` 토글에 따라 완전히 다른 코드로 갈린다. | | Use Spot Time (ON) | **No Use Spot Time (OFF) = 직접 출사** | |---|---|---| | 방식 | `SeqTeachingRun` 시퀀스 경유 | `LaserSignalOn()` 직타 | | 자동 OFF | 있음 | **없음. Shot Off 누를 때까지 계속 출사** | | 사전 검사 | Scanner Busy / Laser Ready / 시퀀스 중복 / Model 선택 | **Door 게이트가 유일** | 파워측정·파워캘·롱텀은 전부 오른쪽이다. 260902 사고가 여기서 났다. --- ## 6. 아직 확인되지 않은 것 🟨 | 항목 | 내용 | |---|---| | 적색(`레이저 출사중`) 표시 | 🟨 **아직 미확인.** 회색·주황은 확인됨(아래 §7 참고) | | Door 인터락 극성 | 260902 조치의 DI/PLC 비트 극성이 **실장비 미검증**. 이 로그의 `Door=...(PLC=,IO=)` 로 검증 가능 | | `_Laser.GetLaserReady()` | `Laser.json` 이 `IsSimul:true` 라 현장에서 항상 true 로 알려져 있음. `Use Spot Time` 경로의 Ready 검사가 실질 무력일 가능성 | --- ## 7. 현장 검증 절차 및 결과 ### 검증 결과 (2026-09-04) 🟦 | 단계 | 결과 | |---|---| | `OFF`(회색) | ✅ 확인 | | `출사 대기 (Remote ON)`(주황) | ✅ 확인 | | `레이저 출사중`(적색) | 🟨 미확인 | | Door 강제 OFF 연동 | 🟨 미확인 | > **주황 확인의 의미** — `Laser Ready`(DO 9) 만 ON 인 상태에서 램프가 주황(`DI:OFF / DO:ON`)이라는 것은 > **DI 10 이 DO 9 의 에코가 아님**을 뜻한다. 에코였다면 그 즉시 적색으로 갔어야 한다. > §3.1 의 주석 오기 판정과 3단 표시 설계가 현장에서 확증됐다. ### 절차 1. `Manual > Scanner Operation` 진입 → 램프가 `OFF` / `IO 미연결` 중 무엇인지 확인 2. 레시피 화면에서 `Laser Ready` 버튼 ON → 램프가 **`출사 대기 (Remote ON)`(주황)** 으로 바뀌는지 - 이때 `DI:` 가 `OFF` 여야 정상. `ON` 이면 DI 10 은 게이트 에코이며 3단 판정을 재검토해야 한다 3. `Laser On` → 램프가 **`레이저 출사중`(적색)** 으로 바뀌는지 4. `Laser Off` → 램프 복귀 확인 5. 출사 중 문을 열어 강제 OFF 동작 + 램프 복귀 + `[LaserCond][DoorForceOff]` 로그 확인 6. 로그에서 `[LaserCond]` 로 검색해 위 4개 태그가 모두 남는지 확인 --- ## 8. 변경 파일 | 파일 | 변경 | |---|---| | `Views/Manual/Scanner/UCScannerLaserControl.xaml` | `Laser Emission` 그룹박스 신설 (**0행 = 최상단**). 기존 그룹박스 3개는 `Grid.Row` 번호만 +1 | | `Views/Manual/Scanner/UCScannerLaserControlViewModel.cs` | 램프 프로퍼티 3개, `RefreshEmissionIndicator()`, `LogLaserCondition()` 추가 및 호출 5곳 | | `Views/Recipes/UCScannerObjectTeachingControlBox.xaml` | `Laser Control` 그룹박스에 4행 추가 — 출사중 박스 1개 | | `Views/Recipes/UCScannerObjectTeachingControlBoxViewModel.cs` | `EmissionText`/`EmissionColor` + `SetEmission()`, 기존 `OnMonitoring` 3개 분기에 반영 | | `Devices/Laser/LaserIOControl.cs` | DI 10 주석 정정 (동작 무관) | 전부 `WeldingComponents/WeldingCommon/` 하위다. ### 8.1 레시피 화면은 2단이다 `Recipe > Scanner Object Teaching` 의 `Laser Control` 그룹박스, `Laser Ready` 버튼 아래. | DI 10 | 표시 | 색 | |---|---|---| | ON | `레이저 출사중` | 적색 `#C62828` | | OFF | `출사 없음` | 회색 `#3E3E42` | | \- | `IO 미연결` | 어두운 회색 `#2A2A2E` | 메뉴얼 화면의 주황(`출사 대기`) 단계가 없는 이유는, 이 화면에는 바로 위에 **`Laser Ready Status` 박스가 이미 DO 9 를 초록으로 보여주고 있어** 중복이기 때문이다. 여기서는 출사중 여부만 본다. 색 의미는 메뉴얼 화면과 동일하게 맞췄다 — 같은 신호가 화면마다 다른 색이면 위험하다. 신규 파일 없음 → **`.csproj` 수정 불필요.** 전부 `[출사 표시 2026-09-04]` 마커가 붙어 있어 원복 시 검색으로 찾을 수 있다. --- ## 9. 하지 않은 것 (의도적 범위 밖) - **알람 미해제 시 출사 차단** — 표시·기록만 한다. 현재 메뉴얼 출사 경로에는 알람 검사가 전혀 없으며, 차단을 넣으면 상시 알람이 떠 있을 때 파워캘·롱텀 작업이 막힐 수 있어 협의 후 진행하기로 했다. - **직접 출사 분기에 Laser Ready / Busy 게이트 추가** - **EMO 차단 추가** - `OnMonitoring` 의 기존 결함 — 스캐너 미활성 시 `_MonitorTimer.Stop()` 후 `return` 이 없어 바로 아래 `GetEncoder()` 를 호출한다. 이번 건과 무관해 손대지 않았다. --- ## 변경 이력 | 일자 | 내용 | 작성 | |---|---|---| | 2026-09-04 | 최초 작성. 출사중 램프 + `[LaserCond]` 로그 추가, DI 10 주석 정정 | 노도연 |