그동안 미추적으로 쌓여 있던 인수인계 문서를 정리해 올린다. 260903 Door 인터락 현장검증 가이드 / 파워캘 3000W 오적용 환산 260907 Arc 출사 파라미터 시각화 / LaserFrequency 단위계통 / NRE 위험구간 점검 / 레시피화면 사용설명서 260915 레시피화면 작업매뉴얼 260916 PTOP 프로그램 사용설명서 / 자동운전 전환 사전점검 현장용 작업 중 임시본(_backup)은 제외했다.
294 lines
14 KiB
HTML
294 lines
14 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ko">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Door 인터락 현장 검증 가이드 (2026-09-03)</title>
|
|
<style>
|
|
:root{
|
|
--bg:#1b1d21; --panel:#25282d; --panel2:#2c3037; --line:#3d434c;
|
|
--txt:#d8dce2; --dim:#9aa2ad; --key:#bbbbbb;
|
|
--blue:#3f7fd0; --blue2:#4f92e8;
|
|
--ok:#3fa66b; --warn:#d9a441; --bad:#d15b5b;
|
|
}
|
|
*{box-sizing:border-box}
|
|
body{margin:0;padding:28px;background:var(--bg);color:var(--txt);
|
|
font-family:"Malgun Gothic","맑은 고딕",Segoe UI,sans-serif;font-size:14px;line-height:1.65}
|
|
h1{font-size:22px;margin:0 0 4px;color:#fff}
|
|
h2{font-size:16px;margin:32px 0 12px;padding-bottom:6px;border-bottom:1px solid var(--line);color:#fff}
|
|
.sub{color:var(--dim);font-size:13px;margin-bottom:22px}
|
|
.wrap{max-width:1100px;margin:0 auto}
|
|
|
|
.banner{background:linear-gradient(90deg,#2a3d55,#25282d);border-left:4px solid var(--blue);
|
|
padding:14px 18px;border-radius:4px;margin-bottom:8px}
|
|
.badge{display:inline-block;padding:2px 9px;border-radius:10px;font-size:11px;font-weight:bold;
|
|
margin-right:6px;vertical-align:1px}
|
|
.b-blue{background:var(--blue);color:#fff}
|
|
.b-warn{background:var(--warn);color:#1b1d21}
|
|
.b-bad{background:var(--bad);color:#fff}
|
|
.b-ok{background:var(--ok);color:#fff}
|
|
|
|
/* ---- 화면 목업 ---- */
|
|
.mock{background:var(--panel);border:1px solid var(--line);border-radius:5px;padding:14px;margin:14px 0}
|
|
.gb{border:1px solid var(--line);border-radius:4px;padding:10px 12px 12px;margin:0 0 10px;position:relative}
|
|
.gb>.hdr{position:absolute;top:-9px;left:12px;background:var(--panel);padding:0 7px;
|
|
font-size:11px;font-weight:bold;color:var(--blue2);letter-spacing:.3px}
|
|
.gb.inner{background:var(--panel2)}
|
|
.gb.inner>.hdr{background:var(--panel2)}
|
|
.cols{display:flex;gap:12px;align-items:flex-start}
|
|
.c-l{flex:1.5}.c-r{flex:2}
|
|
.row{display:flex;align-items:center;gap:8px;margin:5px 0}
|
|
.k{flex:0 0 108px;text-align:right;color:var(--key);font-size:12px;font-weight:bold}
|
|
.v{flex:1;background:#15171a;border:1px solid var(--line);border-radius:3px;
|
|
padding:4px 8px;font-size:12px;min-height:26px;display:flex;align-items:center}
|
|
.v.set{border-color:var(--blue);color:#fff;font-weight:bold}
|
|
.v.ro{background:#1f2226;color:var(--dim)}
|
|
.u{flex:0 0 44px;color:var(--dim);font-size:11px}
|
|
|
|
.tgl{display:flex;border:1px solid var(--line);border-radius:14px;overflow:hidden;margin:7px 0;font-size:11px}
|
|
.tgl div{flex:1;text-align:center;padding:5px 4px;color:var(--dim)}
|
|
.tgl div.on{background:var(--blue);color:#fff;font-weight:bold}
|
|
.tgl div.pick{background:var(--warn);color:#1b1d21;font-weight:bold}
|
|
|
|
.btns{display:flex;gap:8px;margin-top:10px}
|
|
.btn{flex:1;text-align:center;padding:9px 6px;border-radius:3px;background:var(--blue);
|
|
color:#fff;font-weight:bold;font-size:12px;border:1px solid #35659f}
|
|
.btn.off{background:#3a3f47;border-color:var(--line)}
|
|
|
|
.n{display:inline-flex;align-items:center;justify-content:center;width:19px;height:19px;
|
|
border-radius:50%;background:var(--warn);color:#1b1d21;font-size:11px;font-weight:bold;
|
|
margin-right:6px;flex:0 0 19px}
|
|
.n.red{background:var(--bad);color:#fff}
|
|
|
|
table{width:100%;border-collapse:collapse;margin:10px 0;font-size:13px}
|
|
th,td{border:1px solid var(--line);padding:8px 10px;text-align:left;vertical-align:top}
|
|
th{background:var(--panel2);color:#fff;font-size:12px}
|
|
td.c{text-align:center;white-space:nowrap}
|
|
|
|
pre{background:#15171a;border:1px solid var(--line);border-left:3px solid var(--blue);
|
|
border-radius:3px;padding:10px 12px;font-size:12px;overflow-x:auto;
|
|
font-family:Consolas,monospace;color:#c9d1d9;margin:8px 0}
|
|
pre.bad{border-left-color:var(--bad)}
|
|
pre.ok{border-left-color:var(--ok)}
|
|
code{background:#15171a;padding:1px 5px;border-radius:3px;font-size:12px;
|
|
font-family:Consolas,monospace;color:#e6b673}
|
|
|
|
.note{border-left:3px solid var(--warn);background:#2e2a20;padding:10px 14px;margin:12px 0;border-radius:0 3px 3px 0}
|
|
.danger{border-left:3px solid var(--bad);background:#2f2222;padding:10px 14px;margin:12px 0;border-radius:0 3px 3px 0}
|
|
.good{border-left:3px solid var(--ok);background:#1f2c25;padding:10px 14px;margin:12px 0;border-radius:0 3px 3px 0}
|
|
ul{margin:6px 0;padding-left:20px}
|
|
li{margin:3px 0}
|
|
.foot{margin-top:34px;padding-top:12px;border-top:1px solid var(--line);color:var(--dim);font-size:12px}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="wrap">
|
|
|
|
<div class="banner">
|
|
<h1>메뉴얼 Door 인터락 현장 검증 가이드</h1>
|
|
<div style="color:var(--dim);font-size:13px;margin-top:4px">
|
|
커밋 <code>7c97462</code> · ISSUE-260902-01 · 검증일 2026-09-03
|
|
</div>
|
|
</div>
|
|
<div class="sub">
|
|
<span class="badge b-blue">대상 화면</span> Manual → Scanner → <b>Manual Laser Power Control</b>
|
|
· 소스 <code>UCScannerLaserControl.xaml</code>
|
|
</div>
|
|
|
|
<div class="danger">
|
|
<b>시작 전 필수</b>
|
|
<ul>
|
|
<li>레이저 파워미터(측정기)는 <b>치우고 덤프 타겟</b>을 놓을 것 — 어제 누수 건도 있고 테스트 중 재파손 위험</li>
|
|
<li>출력은 <b>10%</b> 로 낮춰서 진행. 정상 파워측정 조건으로 하지 말 것</li>
|
|
<li>보안경 착용, 문 여는 사람과 화면 보는 사람 <b>2인</b> 권장</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<h2>1. 화면 배치와 조작 위치</h2>
|
|
<p style="color:var(--dim);font-size:13px;margin:0 0 4px">
|
|
아래는 XAML 기준 실제 배치입니다. <b>Watt 패널은 <code>Visibility="Collapsed"</code> 라 화면에 안 나옵니다</b> — % 패널로만 진행합니다.
|
|
</p>
|
|
|
|
<div class="mock">
|
|
<div class="gb">
|
|
<div class="hdr">Manual Laser Power Control</div>
|
|
<div class="cols">
|
|
|
|
<div class="c-l">
|
|
<div class="gb inner">
|
|
<div class="hdr">Control Setting</div>
|
|
<div class="row"><span class="k"><span class="n">2</span>Power #1</span><span class="v set">10</span><span class="u">%</span></div>
|
|
<div class="row"><span class="k">Power #2</span><span class="v set">0</span><span class="u">%</span></div>
|
|
<div class="row"><span class="k">Frequency</span><span class="v">1</span><span class="u">kHz</span></div>
|
|
<div class="row"><span class="k">Pulse Width</span><span class="v">1000000</span><span class="u">us</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="c-r">
|
|
<div class="gb inner">
|
|
<div class="hdr">Laser Shot Control</div>
|
|
<div class="cols">
|
|
<div style="flex:1">
|
|
<div class="gb" style="background:#212429">
|
|
<div class="hdr" style="background:#212429">Timer Set</div>
|
|
<div style="font-size:11px;color:var(--dim);margin-bottom:2px"><span class="n">3</span>연속출사로 전환</div>
|
|
<div class="tgl">
|
|
<div class="pick">No Use Spot Time</div><div>Use Spot Time</div>
|
|
</div>
|
|
<div style="font-size:10px;color:var(--dim);margin:-2px 0 8px 2px">
|
|
← 이쪽이 <b>자동 오프 없는 연속출사</b> (이번 사고 경로)
|
|
</div>
|
|
|
|
<div style="font-size:11px;color:var(--dim);margin-bottom:2px"><span class="n">4</span>실제 발진</div>
|
|
<div class="tgl">
|
|
<div class="pick">Laser Fire</div><div>No Laser (전압만)</div>
|
|
</div>
|
|
<div style="font-size:10px;color:var(--dim);margin:-2px 0 0 2px">
|
|
※ DA1/DA2 전압 표시는 <b>No Laser 쪽일 때만</b> 보임
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div style="flex:1">
|
|
<div class="gb" style="background:#212429">
|
|
<div class="hdr" style="background:#212429">Laser Shot Result</div>
|
|
<div class="row"><span class="k">List</span><span class="v ro">N/A</span></div>
|
|
<div class="row"><span class="k">Repeat Count</span><span class="v ro">0</span></div>
|
|
</div>
|
|
<div class="btns">
|
|
<div class="btn"><span class="n red">5</span>Laser On</div>
|
|
<div class="btn off">Laser Off</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="note">
|
|
<b><span class="n">1</span> 이 화면을 반드시 먼저 띄워야 합니다.</b>
|
|
출사 중 Door 감시 타이머는 <code>VisibleChanged</code> 로 시작됩니다. 화면을 한 번도 안 열면
|
|
감시가 돌지 않습니다. (단, 이 작업 자체가 이 화면에서만 하는 것이라 실사용상 문제는 없습니다)
|
|
</div>
|
|
|
|
<h2>2. 검증 순서</h2>
|
|
<table>
|
|
<tr><th style="width:36px">#</th><th style="width:190px">조작</th><th>기대 결과</th><th style="width:150px">판정</th></tr>
|
|
|
|
<tr>
|
|
<td class="c"><b>T1</b></td>
|
|
<td><b>문을 연 채</b> [Laser On]<br><span style="color:var(--dim);font-size:12px">(가장 안전한 첫 테스트)</span></td>
|
|
<td>출사 <b>안 됨</b> + 노란 경고 토스트<br>
|
|
<code>Door Open 상태입니다. 문을 닫고 다시 시도하세요.</code></td>
|
|
<td class="c"><span class="badge b-ok">차단</span> 정상<br><span class="badge b-bad">출사</span> → §3</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="c"><b>T2</b></td>
|
|
<td>문 닫고 [Laser On]</td>
|
|
<td>정상 출사 시작. 계속 출사 상태 유지<br>(자동 오프 없음)</td>
|
|
<td class="c"><span class="badge b-ok">출사</span> 정상<br><span class="badge b-bad">차단</span> → §3</td>
|
|
</tr>
|
|
|
|
<tr style="background:#2a2226">
|
|
<td class="c"><b>T3</b></td>
|
|
<td><b>출사 중에 문을 연다</b><br><span style="color:var(--bad);font-size:12px">★ 이번 사고 시나리오</span></td>
|
|
<td><b>약 0.2초 내 강제 OFF</b> + 빨간 토스트<br>
|
|
<code>Door Open 감지 → 레이저를 강제 OFF 했습니다.</code></td>
|
|
<td class="c"><span class="badge b-ok">OFF</span> 정상<br><span class="badge b-bad">유지</span> → §3</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="c"><b>T4</b></td>
|
|
<td>문을 다시 닫는다<br>(아무것도 누르지 않음)</td>
|
|
<td><b>자동 재출사 안 됨</b> — 의도된 동작</td>
|
|
<td class="c"><span class="badge b-ok">정지유지</span></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="c"><b>T5</b></td>
|
|
<td>[Laser On] 다시 누름</td>
|
|
<td>정상 출사 재개</td>
|
|
<td class="c"><span class="badge b-ok">출사</span></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="c"><b>T6</b></td>
|
|
<td>[Laser Off] 로 종료</td>
|
|
<td>출사 종료, 감시 래치 해제</td>
|
|
<td class="c">—</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<h2>3. 로그 확인 — 극성 판별</h2>
|
|
<p style="margin:0 0 6px">로그에서 <code>[DoorInterlock]</code> 으로 검색하면 전부 나옵니다.</p>
|
|
|
|
<div class="good">
|
|
<b>정상 (문 열림에서 True 가 하나라도 뜸)</b>
|
|
<pre class="ok">[DoorInterlock][ScannerLaserControl] Door OPEN 감지 → 이후 레이저 출사 차단 (PLC=True, IO_DI=True)
|
|
[DoorInterlock] 출사 중 Door OPEN 감지 → 레이저 강제 OFF 실행 (직접 출사 중). PLC비트=True, IO접점=True, PLC연결=True, IO연결=True
|
|
[DoorInterlock] 레이저 강제 OFF 완료. 재출사하려면 문을 닫고 Shot On 을 다시 누르십시오.</pre>
|
|
<div style="font-size:12px;color:var(--dim)">PLC / IO 둘 중 하나만 True 여도 정상 동작합니다(OR 판정). 어느 쪽이 False 인지는 알려주세요 — 배선/맵 확인 대상입니다.</div>
|
|
</div>
|
|
|
|
<div class="danger">
|
|
<b>이상 ①: 문 열었는데 둘 다 False</b> → T1/T3 에서 차단이 안 됨
|
|
<pre class="bad">[DoorInterlock] ... (PLC=False, IO_DI=False)</pre>
|
|
<ul style="font-size:13px">
|
|
<li><code>PLC연결=False</code> / <code>IO연결=False</code> 면 → 디바이스 미연결. 연결부터 확인</li>
|
|
<li>둘 다 연결인데 False 면 → <b>접점 극성 반대(b접점)</b> 또는 PLC 비트 미할당</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="danger">
|
|
<b>이상 ②: 문 닫았는데 True</b> → T2 에서 출사가 막힘 (반대 증상)
|
|
<pre class="bad">문 닫힘 상태인데 → (PLC=True, IO_DI=True)</pre>
|
|
<div style="font-size:13px">극성 반대 확정입니다. 판정부 한 줄만 뒤집으면 되니 로그값 그대로 보내주세요.</div>
|
|
</div>
|
|
|
|
<div class="note">
|
|
<b>롱텀 추적용 하트비트</b> — 출사 중에는 10초마다 아래가 남습니다. 1시간 출사 구간 로그 공백이 없어집니다.
|
|
<pre>[DoorInterlock] 직접 출사 중... Door=CLOSE, DA1=1.000V, DA2=0.000V, PLC비트=False, IO접점=False, ...</pre>
|
|
</div>
|
|
|
|
<h2>4. 이 인터락이 <u>못 막는</u> 구간</h2>
|
|
<table>
|
|
<tr><th style="width:210px">경로</th><th>차단 시점</th><th style="width:110px">완전성</th></tr>
|
|
<tr>
|
|
<td>파워측정 직접 출사<br><span style="color:var(--dim);font-size:12px">(No Use Spot Time)</span></td>
|
|
<td>출사 시작 전 + <b>출사 중 100ms 주기</b></td>
|
|
<td class="c"><span class="badge b-ok">즉시</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Teaching Run 시퀀스</td>
|
|
<td>시퀀스 진입 시 + <b>객체 사이사이</b><br>
|
|
<span style="color:var(--dim);font-size:12px">리스트 1개 실행 중에는 개입 불가</span></td>
|
|
<td class="c"><span class="badge b-warn">부분</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Auto 운전</td>
|
|
<td><b>이번 범위 아님</b> — <code>SeqAutoRunPTOP</code> 은 자체 <code>ExecuteWelding</code> 사용</td>
|
|
<td class="c"><span class="badge b-bad">미적용</span></td>
|
|
</tr>
|
|
</table>
|
|
|
|
<div class="danger">
|
|
<b>본질적 한계 — 반드시 같이 보고할 것</b><br>
|
|
이건 <b>SW 방어이지 안전 인터락이 아닙니다.</b> Door 감시가 UI 스레드 DispatcherTimer 기반이라
|
|
UI가 멈추면 감시도 같이 멈춥니다. Class 4 레이저 기준 최종 차단은
|
|
<b>PLC / 하드와이어 안전회로</b>로 별도 협의가 필요합니다.
|
|
</div>
|
|
|
|
<div class="foot">
|
|
변경 파일 3개 — <code>AlarmManager.cs</code> (PLC비트 OR IO접점 판정) ·
|
|
<code>UCScannerLaserControlViewModel.cs</code> (시작 게이트 + 출사 중 감시) ·
|
|
<code>SeqComponentTeachingRun.cs</code> (주석 처리됐던 차단 복구 + 출사 직전 게이트)<br>
|
|
미결: EMO 차단 복구 · Auto 시작 게이트(<code>UCMainAutoRunViewModel</code> 399~431행 블록 주석) · 하드와이어 안전회로
|
|
</div>
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|