LGES-OC5-PtoP-Welder/Doc/인수인계/260904_레이저출사표시_및_출사조건로그.md
NohDoyeon241104 3b8e64b9be feat: 레이저 출사중 표시 및 출사조건 로그 (ISSUE-260904-01)
메뉴얼/레시피 화면에 DI Laser_EMISSION_ON(10) 기반 출사중 램프 추가. 260904 현장 실측으로 DI 10 이 DO 9 의 에코가 아닌 실제 발진 피드백임을 확증하여 LaserIOControl 주석도 정정. 출사조건 스냅샷은 [LaserCond] 로그로 4개 시점(ShotOn/Heartbeat/ShotOff/DoorForceOff)에 기록. 표시·기록 전용이며 출사 차단 로직은 변경 없음.
2026-09-04 14:13:13 +09:00

11 KiB

메뉴얼 화면 레이저 출사중 표시 및 출사조건 로그 (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 이라는 것이다.

<view:BoolConverter x:Key="convTrueVisible" TrueValue="Visible" FalseValue="Hidden"/>

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 주석 정정 노도연