< style >
/*
* A4 용지 기준 PDF 출력을 위한 스타일시트 (pdf_style.css)
*/
@page {
size: A4;
margin: 20mm 15mm 20mm 15mm;
@top -left { content: none !important; }
@top -right { content: none !important; }
@bottom -left { content: none !important; }
@bottom -right { content: none !important; }
@bottom -center {
content: counter(page) !important;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans KR", sans-serif;
font-size: 8.5pt;
color: #7f8c8d ;
}
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans KR", sans-serif;
font-size: 10pt;
line-height: 1.6;
color: #333333 ;
background-color: #ffffff ;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
/* 제목 스타일 */
h1, h2, h3, h4, h5, h6 {
color: #111111 ;
font-weight: bold;
page-break-after: avoid;
page-break-inside: avoid;
}
h1 {
font-size: 18pt;
border-bottom: 2px solid #007acc ;
padding-bottom: 4px;
margin-top: 20px;
margin-bottom: 12px;
}
h2 {
font-size: 13pt;
border-bottom: 1px solid #e1e4e8 ;
padding-bottom: 3px;
margin-top: 16px;
margin-bottom: 10px;
}
h3 {
font-size: 11pt;
margin-top: 12px;
margin-bottom: 6px;
}
h4 {
font-size: 10pt;
margin-top: 10px;
margin-bottom: 6px;
}
/* 문단 및 리스트 */
p {
margin-top: 0;
margin-bottom: 8px;
text-align: justify;
}
ul, ol {
margin-top: 0;
margin-bottom: 8px;
padding-left: 20px;
}
li {
margin-bottom: 3px;
}
/* 구분선 */
hr {
height: 1px;
padding: 0;
margin: 15px 0;
background-color: #e1e4e8 ;
border: 0;
}
/* 테이블 스타일 */
table {
width: 100%;
border-collapse: collapse;
margin-top: 0;
margin-bottom: 10px;
page-break-inside: avoid;
}
table th, table td {
padding: 4px 8px;
border: 1px solid #dfe2e5 ;
font-size: 8.5pt;
word-break: keep-all;
}
table th {
font-weight: 600;
background-color: #f6f8fa ;
text-align: left;
}
table tr:nth-child(even) {
background-color: #f9fbfd ;
}
table tr {
page-break-inside: avoid; /* 표의 중간 행이 반으로 쪼개지는 것만 방지 */
}
/* 인용구 스타일 */
blockquote {
padding: 6px 12px;
color: #6a737d ;
border-left: 0.25em solid #007acc ;
background-color: #f6f8fa ;
margin: 0 0 10px 0;
page-break-inside: avoid;
}
blockquote p {
margin: 0;
}
/* 코드 블록 (아스키 아트 등 포함) */
pre, code {
font-family: "Consolas", "Monaco", "Andale Mono", "Ubuntu Mono", monospace;
font-size: 8.5pt;
background-color: #f6f8fa ;
border-radius: 3px;
}
code {
padding: 0.2em 0.4em;
margin: 0;
border: 1px solid #eaecef ;
}
pre {
padding: 12px;
overflow: auto;
line-height: 1.45;
border: 1px solid #e1e4e8 ;
word-wrap: normal;
white-space: pre; /* 아스키 아트 정렬 유지를 위해 강제 줄바꿈 해제 */
page-break-inside: avoid;
}
pre code {
padding: 0;
margin: 0;
background-color: transparent;
border: none;
font-size: inherit;
white-space: inherit;
}
/* 이미지 스타일 */
img {
max-width: 100%;
max-height: 100mm; /* A4 높이의 약 절반 이하로 제한 */
display: block;
margin: 15px auto;
object-fit: contain;
page-break-inside: avoid;
border: 1px solid #e1e4e8 ;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
/* 페이지 나누기 요소 */
.page-break {
page-break-before: always !important;
}
/* 내비게이션 숨김 (인쇄 시) */
.nav-link, .nav-links, .back-to-toc, .manual-nav,
a[href$=".md"]:not(.toc-title a) {
display: none !important;
}
/* 링크 스타일 */
a {
color: #007acc ;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* 특별 배지 스타일 */
.badge {
display: inline-block;
padding: 2px 6px;
font-size: 8pt;
font-weight: 600;
line-height: 1;
border-radius: 2px;
background-color: #e1e4e8 ;
color: #24292e ;
margin-right: 4px;
}
/* ==========================================
표지 (Cover Page) 스타일 (Minimal & Clean)
========================================== */
.cover-page {
text-align: center;
padding: 70mm 0 30mm 0;
page-break-after: always !important;
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: 220mm;
}
.cover-header {
margin-top: 20px;
}
.cover-title {
font-size: 28pt !important;
font-weight: 700 !important;
color: #1a1a1a !important;
margin: 0 0 16px 0 !important;
padding: 0 !important;
border: none !important;
letter-spacing: -0.5px;
line-height: 1.2;
}
.cover-subtitle {
font-size: 16pt;
font-weight: 500;
color: #007acc ;
margin: 0;
letter-spacing: 2px;
text-transform: uppercase;
}
.cover-meta {
margin-top: 100px;
font-size: 9.5pt;
color: #666666 ;
letter-spacing: 0.5px;
border-top: 1px solid #eaeaea ;
padding-top: 20px;
width: 60%;
margin-left: auto;
margin-right: auto;
}
/* ==========================================
점선 리더 목차 (Dot Leader TOC) 스타일
========================================== */
.toc-container {
padding: 10px 0;
}
.toc-heading {
font-size: 22pt !important;
font-weight: 800 !important;
color: #0f2942 !important;
border-bottom: none !important;
padding-bottom: 0 !important;
margin-top: 10px !important;
margin-bottom: 24px !important;
}
.toc-list {
display: flex;
flex-direction: column;
gap: 13px;
}
.toc-item {
display: flex;
align-items: baseline;
font-size: 11pt;
line-height: 1.5;
}
.toc-title {
font-weight: 700 !important;
color: #111827 ;
white-space: nowrap;
padding-right: 6px;
}
.toc-title a {
color: #111827 !important;
font-weight: 700 !important;
text-decoration: none !important;
display: inline !important;
}
.toc-title a:hover {
color: #007acc !important;
}
.toc-leader {
flex-grow: 1;
border-bottom: 1.2px dotted #4b5563 ;
margin: 0 4px;
position: relative;
top: -4px;
}
.toc-page {
font-weight: 700 !important;
color: #111827 ;
padding-left: 6px;
white-space: nowrap;
}
< / style >
< div class = "page-break" > < / div >
< div class = "toc-container" >
< h1 class = "toc-heading" > 목차< / h1 >
< div class = "toc-list" >
< div class = "toc-item" >
< span class = "toc-title" > < a href = "#1-시스템-개요-및-요구사항" > 1. 시스템 개요 및 요구사항< / a > < / span >
< span class = "toc-leader" > < / span >
< span class = "toc-page" > 3< / span >
< / div >
< div class = "toc-item" >
< span class = "toc-title" > < a href = "#2-초기-설정-가이드" > 2. 초기 설정 가이드< / a > < / span >
< span class = "toc-leader" > < / span >
< span class = "toc-page" > 5< / span >
< / div >
< div class = "toc-item" >
< span class = "toc-title" > < a href = "#3-메인-화면-home-view" > 3. 메인 화면 (Home View)< / a > < / span >
< span class = "toc-leader" > < / span >
< span class = "toc-page" > 9< / span >
< / div >
< div class = "toc-item" >
< span class = "toc-title" > < a href = "#4-통신-설정-comm-settings" > 4. 통신 설정 (Comm. Settings)< / a > < / span >
< span class = "toc-leader" > < / span >
< span class = "toc-page" > 13< / span >
< / div >
< div class = "toc-item" >
< span class = "toc-title" > < a href = "#5-시험-설정-parameters" > 5. 시험 설정 (Parameters)< / a > < / span >
< span class = "toc-leader" > < / span >
< span class = "toc-page" > 15< / span >
< / div >
< div class = "toc-item" >
< span class = "toc-title" > < a href = "#6-측정-데이터-조회-data-view" > 6. 측정 데이터 조회 (Data View)< / a > < / span >
< span class = "toc-leader" > < / span >
< span class = "toc-page" > 17< / span >
< / div >
< div class = "toc-item" >
< span class = "toc-title" > < a href = "#7-자동-시험-프로세스" > 7. 자동 시험 프로세스< / a > < / span >
< span class = "toc-leader" > < / span >
< span class = "toc-page" > 19< / span >
< / div >
< div class = "toc-item" >
< span class = "toc-title" > < a href = "#8-로그-및-데이터-관리" > 8. 로그 및 데이터 관리< / a > < / span >
< span class = "toc-leader" > < / span >
< span class = "toc-page" > 22< / span >
< / div >
< div class = "toc-item" >
< span class = "toc-title" > < a href = "#9-오류-대응-및-프로그램-종료" > 9. 오류 대응 및 프로그램 종료< / a > < / span >
< span class = "toc-leader" > < / span >
< span class = "toc-page" > 27< / span >
< / div >
< / div >
< / div >
< div class = "page-break" > < / div >
## 빠른 시작 가이드 (Quick Start)
처음 사용하는 경우 아래 순서를 따르세요:
1. **하드웨어 연결 확인** → [시스템 개요 및 요구사항 ](#1-시스템-개요-및-요구사항 ) 참조
2. **프로그램 실행 및 로그인** → 바탕화면의 **바로가기 아이콘**을 실행하여 로그인 완료 (오프라인 테스트는 `Database.ini` 에서 `OfflinePreview=true` 설정)
3. **통신 설정** → 하단 메뉴 `Comm. Settings` → COM 포트 선택 → `설정 저장`
4. **시험 설정** → 하단 메뉴 `Parameters` → SPEC UL/LL 입력 → `설정 저장`
5. **시험 시작** → DIO 시작 신호 또는 `ID Test (L/R)` 버튼으로 동작 확인
< div class = "page-break" > < / div >
# 1. 시스템 개요 및 요구사항
---
## 1.1 시스템 개요
**Pressure Leak Inspect System**은 제품의 압력 누설(Leak)을 자동으로 검사하는 데스크탑 프로그램입니다. 생산 라인에서 DIO 시작 신호를 받아 제품 ID를 판독하고, 누설 시험을 수행한 뒤 합격/불합격을 자동 판정합니다.
---
## 1.2 소프트웨어 요구사항
| 항목 | 요구사항 | 비고 |
|------|----------|------|
| **운영체제** | Windows 10 이상 (64bit 권장) | 32bit도 지원 가능 |
| ** .NET 런타임** | .NET 9 | 별도 설치 필요 없음 (자체 포함 배포) |
| **드라이버** | ADLINK PCIS-DASK 드라이버 | `PCI-Dask.dll` 필요 |
| **시리얼 포트** | 최소 2개의 COM 포트 | C28 센서용 + 4251 보드용 |
| **화면 해상도** | 1024×768 이상 | 최대화 실행 시 1920×1080 권장 |
> **참고**: ADLINK 드라이버가 설치되지 않은 환경에서는 프로그램이 **시뮬레이션 모드**로 자동 전환됩니다. 이 경우 DIO 입출력은 동작하지 않지만, 프로그램의 나머지 기능은 정상적으로 사용할 수 있습니다.
---
## 1.3 하드웨어 구성
| 장비 | 모델명 | 용도 | 통신 방식 |
|------|--------|------|-----------|
| **DIO 보드** | ADLINK PCI-7432 | 디지털 입출력 (시작 신호 수신, OK/NG 결과 출력) | PCI 슬롯 장착 |
| **ID 판독 보드** | 4251 | 제품 ID 데이터 판독 | RS-232 시리얼 (COM 포트) |
| **누설 센서** | Sentinel C28 | 압력 누설량(sccm) 측정 | RS-232 시리얼 (COM 포트) |
### 케이블 연결도
< div style = "display: flex; align-items: center; justify-content: center; gap: 20px; margin: 25px auto; max-width: 600px; page-break-inside: avoid;" >
<!-- PC Box -->
< div style = "border: 2px solid #2f3542 ; border-radius: 6px; padding: 35px 20px; text-align: center; min-width: 100px; font-weight: bold; color: #2f3542 ; box-shadow: 0 2px 4px rgba(0,0,0,0.06);" >
본체 PC
< / div >
<!-- Connections -->
< div style = "display: flex; flex-direction: column; gap: 12px; flex-grow: 1;" >
<!-- C28 센서 -->
< div style = "display: flex; align-items: center; justify-content: space-between; gap: 10px;" >
< div style = "flex-grow: 1; text-align: center; border-bottom: 2px dashed #007acc ; padding-bottom: 4px; color: #007acc ; font-weight: 500;" >
RS-232 통신 ➔
< / div >
< div style = "border: 1px solid #007acc ; border-radius: 4px; padding: 8px 12px; min-width: 140px; text-align: center; font-weight: bold; color: #005999 ; box-shadow: 0 1px 3px rgba(0,0,0,0.04);" >
Sentinel C28 센서
< / div >
< / div >
<!-- 4251 보드 -->
< div style = "display: flex; align-items: center; justify-content: space-between; gap: 10px;" >
< div style = "flex-grow: 1; text-align: center; border-bottom: 2px dashed #007acc ; padding-bottom: 4px; color: #007acc ; font-weight: 500;" >
RS-232 통신 ➔
< / div >
< div style = "border: 1px solid #007acc ; border-radius: 4px; padding: 8px 12px; min-width: 140px; text-align: center; font-weight: bold; color: #005999 ; box-shadow: 0 1px 3px rgba(0,0,0,0.04);" >
4251 보드 (ID 리더)
< / div >
< / div >
<!-- ADLINK -->
< div style = "display: flex; align-items: center; justify-content: space-between; gap: 10px;" >
< div style = "flex-grow: 1; text-align: center; border-bottom: 2px solid #2ed573 ; padding-bottom: 4px; color: #2ed573 ; font-weight: 500;" >
PCI 슬롯 ══➔
< / div >
< div style = "border: 1px solid #2ed573 ; border-radius: 4px; padding: 8px 12px; min-width: 140px; text-align: center; font-weight: bold; color: #157a38 ; box-shadow: 0 1px 3px rgba(0,0,0,0.04);" >
ADLINK PCI-7432
< / div >
< / div >
< / div >
< / div >
---
## 1.4 DIO 신호 매핑
### 입력 신호 (Inputs) - PCI-7432
| 주소 | 신호명 | 동작 | 설명 |
|------|--------|------|------|
| 0 | `LEFT_START` | OFF→ON 감지 | 좌측 채널 시험 시작 트리거 |
| 1 | `RIGHT_START` | OFF→ON 감지 | 우측 채널 시험 시작 트리거 |
> **동작 원리**: 시작 신호가 OFF→ON으로 전환되는 순간(Rising Edge)을 감지하여 시험을 시작합니다.
### 출력 신호 (Outputs) - PCI-7432
| 주소 | 신호명 | 초기값 | 설명 |
|------|--------|--------|------|
| 0 | `LEFT_OK` | OFF | 좌측 합격 시 ON 출력 |
| 1 | `RIGHT_OK` | OFF | 우측 합격 시 ON 출력 |
| 2 | `PC_ON` | **ON** | PC 가동 상태 신호 (프로그램 실행 시 자동 ON) |
| 3 | `LEFT_NG` | OFF | 좌측 불합격 시 ON 출력 |
| 4 | `RIGHT_NG` | OFF | 우측 불합격 시 ON 출력 |
> **참고**: `PC_ON` 신호는 프로그램 시작 시 자동으로 ON이 되며, 프로그램 종료 시 자동으로 OFF됩니다. 이를 통해 외부 시스템이 PC의 가동 상태를 확인할 수 있습니다.
> **참고**: 시험이 시작되면 해당 채널의 OK/NG 출력이 모두 OFF로 초기화된 후, 판정 완료 시 해당 결과에 맞는 출력만 ON됩니다.
< div class = "page-break" > < / div >
# 2. 초기 설정 가이드
---
## 2.1 설치 전 준비사항 체크리스트
프로그램을 실행하기 전에 아래 항목을 모두 확인하세요:
| # | 확인 항목 | 확인 방법 | 비고 |
|---|----------|----------|------|
| 1 | ADLINK PCIS-DASK 드라이버 설치 완료 | Windows 장치 관리자에서 PCI-7432 인식 확인 | 미설치 시 시뮬레이션 모드로 동작 |
| 2 | Sentinel C28 센서 시리얼 케이블 연결 | 장치 관리자 → 포트(COM & LPT)에서 COM 포트 번호 확인 | RS-232 케이블 사용 |
| 3 | 4251 보드 시리얼 케이블 연결 | 장치 관리자 → 포트(COM & LPT)에서 COM 포트 번호 확인 | RS-232 케이블 사용 |
| 4 | PCI-7432 DIO 보드 장착 | 장치 관리자에서 ADLINK PCI-7432 인식 확인 | PCI 슬롯에 장착 |
| 5 | COM 포트 번호 메모 | C28 센서와 4251 보드 각각의 COM 포트 번호를 기록 | 설정 시 필요 |
---
## 2.2 프로그램 실행
### 실행 방법
1. 바탕화면의 **바로가기 아이콘**을 더블 클릭하여 실행합니다.
2. 프로그램이 전체화면(Maximized) 모드로 시작됩니다.
### 최초 실행 시 자동 생성되는 파일
| 파일 / 폴더 | 위치 | 설명 |
|-------------|------|------|
| `config.xml` | 프로그램 실행 폴더 (`C:\LeakTest\`) | 통신 포트, BaudRate, SPEC 값 등 모든 설정을 저장 |
| `Settings\DioConfig.ini` | `C:\LeakTest\Settings\` | DIO 보드 타입, 입출력 포인트 정의 |
| `Database.ini` | `C:\LeakTest\` | DB 접속 정보 및 로그인 인증 방식 설정 (최초 실행 시 기본 템플릿으로 생성) |
| `LoginOptions.json` | `C:\LeakTest\` | 로그인 화면 자동완성 드롭다운 선택지 저장 |
| `LoginHistory.json` | `C:\LeakTest\` | 최근 로그인 정보 최대 10건 자동 저장 |
| `Logs\` 폴더 | `C:\LeakTest\Logs\` | 날짜별 CSV 검사 로그 및 시스템 로그 저장 위치 |
---
## 2.3 프로그램 로그인 및 오프라인 모드 설정
프로그램 실행이 완료되면 메인 화면이 활성화되기 전, **작업 정보 입력 및 로그인 창**이 모달로 표시됩니다. 로그인을 성공적으로 마쳐야 메인 화면을 조작할 수 있습니다.
### 로그인 필드 구성
| 입력 필드 | 예시 | 설명 |
|-----------|------|------|
| **Maker** | `MOBIS` | 제조사 정보 |
| **Model** | `C28_TEST` | 검사 모델명 |
| **Variant 1** | `V1` | 세부 파생 모델 정보 1 |
| **Variant 2** | `V2` | 세부 파생 모델 정보 2 |
| **ID (Operator)** | `sa` | 작업자 ID |
| **PW (Password)** | `****` | 비밀번호 |
| **Line** | `EOL_01` | 생산 라인 번호 |
| **Lot No** | `LOT001` | 로트 번호 |
| **Jig No** | `JIG_L` | 지그 번호 |
### 로그인 설정 관리 (LoginOptions.json)
프로그램 실행 폴더 내의 `LoginOptions.json` 파일을 편집하여 로그인 계정 정보(`loginAccounts`)를 관리하고, 로그인 화면의 옵션 목록(제조사, 모델, 라인, 지그 번호 등)을 추가하거나 변경할 수 있습니다.
```json
{
"loginAccounts": [
{
"id": "su",
"password": "su"
}
],
"makers": [
"AMO",
"ABC"
],
"models": [
"MODEL-1"
],
"lineValues": [
"LINE-1"
],
"jigNoValues": [
"JIG-1"
]
}
```
- **계정 추가/변경**: `loginAccounts` 배열에 ID(`id`)와 비밀번호(`password`)를 추가하거나 수정하여 접속 가능한 계정을 설정합니다.
- **드롭다운 항목 변경**: `makers` , `models` , `lineValues` , `jigNoValues` 등의 배열 항목을 수정하면 로그인 화면의 선택 항목 목록이 자동으로 업데이트됩니다.
---
## 2.4 최초 설정 순서 (Step-by-Step)
프로그램을 처음 사용할 때는 반드시 아래 순서로 설정을 진행하세요.
### Step 1: 통신 설정 (가장 먼저 수행)
> 하드웨어와의 통신이 설정되어야 이후 모든 기능이 정상 동작합니다.
1. 하단 메뉴 바에서 ** `Comm. Settings (통신 설정)` ** 버튼을 클릭합니다.
2. **통신 설정** 팝업 창이 메인 창 중앙에 표시됩니다.
**4251 보드 설정 (좌측 영역):**
| 설정 항목 | 설명 | 선택 방법 | 기본값 |
|-----------|------|----------|--------|
| `4251 BaudRate` | 통신 속도 | 드롭다운에서 선택 (9600/19200/38400/115200) | `115200` |
| `4251 Port` | COM 포트 | 드롭다운에서 연결된 포트 선택 | `COM3` |
**Sentinel C28 설정 (우측 영역):**
| 설정 항목 | 설명 | 선택 방법 | 기본값 |
|-----------|------|----------|--------|
| `Sensor BaudRate` | 통신 속도 | 드롭다운에서 선택 (9600/19200/38400/115200) | `9600` |
| `Sensor Port` | COM 포트 | 드롭다운에서 연결된 포트 선택 | `COM1` |
3. 모든 항목을 설정한 후 ** `설정 저장` ** 버튼을 클릭합니다.
4. "통신 설정이 저장되었습니다." 메시지가 표시되면 설정 완료입니다.
> **참고**: COM 포트 목록에는 현재 PC에 물리적으로 연결된 시리얼 장치만 표시됩니다. 원하는 포트가 보이지 않으면:
> - USB-시리얼 케이블이 PC에 연결되어 있는지 확인
> - 장치 관리자에서 해당 포트의 드라이버가 정상 설치되었는지 확인
> - 다른 프로그램이 해당 포트를 점유하고 있지 않은지 확인
---
### Step 2: 시험 설정 (SPEC 규격값 입력)
1. 하단 메뉴 바에서 ** `Parameters (시험 설정)` ** 버튼을 클릭합니다.
2. **시험 설정** 팝업 창이 표시됩니다.
| 설정 항목 | 설명 | 입력 형식 | 기본값 |
|-----------|------|----------|--------|
| `SPEC UL (sccm)` | 누설 상한 규격값 | 소수점 포함 숫자 (예: `1.00` ) | `1.00` |
| `SPEC LL (sccm)` | 누설 하한 규격값 | 소수점 포함 숫자 (예: `-1.00` ) | `-1.00` |
3. 값을 입력한 후 ** `설정 저장` ** 버튼을 클릭합니다.
4. "파라미터 설정이 저장되었습니다." 메시지가 표시되면 완료입니다.
> **참고**: SPEC UL/LL 값은 좌/우 양쪽 채널에 **공통으로 적용**됩니다.
> **판정 기준**: `SPEC LL ≤ 측정값 ≤ SPEC UL` 이면 **OK**, 범위를 벗어나면 **NG**로 판정됩니다.
---
### Step 3: 동작 테스트 (선택사항)
모든 설정이 완료되면 하단 메뉴의 ** `ID Test (L)` ** 또는 ** `ID Test (R)` ** 버튼으로 간단한 동작 테스트를 수행할 수 있습니다.
1. ** `ID Test (L)` ** 버튼을 클릭합니다.
2. 좌측 채널의 진행 메시지가 순서대로 표시됩니다:
- `시험 시작` → `센서 정보 읽는 중` → `ID 테스트 완료` (또는 `ID 테스트 실패` )
3. 좌측 채널의 **ID** 영역에 읽은 제품 ID가 표시되면 정상입니다.
> **참고**: ID Test는 DIO 시작 신호 없이도 4251 보드의 센서 판독 기능만 단독으로 테스트합니다. 실제 LEAK 시험은 수행하지 않습니다.
---
## 2.5 설정 변경 시 주의사항
| 상황 | 동작 | 주의 |
|------|------|------|
| 통신 설정 저장 | 모든 시리얼 연결 해제 → 새 설정으로 재연결 | 시험 중 변경 시 시험 중단 |
| 시험 설정 저장 | 즉시 메인 화면의 SPEC 표시 갱신 | 진행 중인 시험에는 영향 없음 |
| 프로그램 재시작 | `config.xml` 에서 마지막 저장된 설정 자동 로드 | 별도 작업 불필요 |
< div class = "page-break" > < / div >
# 3. 메인 화면 (Home View)
---
프로그램 실행 시 기본으로 표시되는 화면입니다. 좌/우 채널의 누설 시험 결과를 실시간으로 모니터링합니다.
## 3.1 전체 화면 레이아웃
< img src = "./Pasted image 20260626093617.png" alt = "Pasted image 20260626093617.png" / >
---
## 3.2 상단 타이틀 바
프로그램 최상단에 위치한 타이틀 영역입니다.
< img src = "./Pasted image 20260626093648.png" alt = "Pasted image 20260626093648.png" / >
| 위치 | 요소 | 설명 |
|------|------|------|
| 좌측 | **프로그램 제목 & 버전** | `Pressure Leak System` 및 버전 정보 표시 |
| 중앙 | **현재 날짜/시간** | `yyyy-MM-dd [요일] HH:mm:ss` 형식, 1초 주기로 실시간 갱신 |
| 우측 | **작업 정보 배지** | 현재 로그인된 `작업자 ID` , `검사 모델` , `생산 라인` 정보 표시 |
| 우측 | **로그아웃 버튼** | 현재 세션을 로그아웃하고 로그인 창을 호출합니다 |
| 최우측 | **창 제어 버튼** | 최소화(─) / 최대화·복원(□) / 종료(X) 창 제어 아이콘 |
### 타이틀 바 조작
| 조작 | 동작 |
|------|------|
| 타이틀 바 **드래그** | 창 이동 |
| 타이틀 바 **더블 클릭** | 최대화 ↔ 일반 크기 전환 |
| ** ─** 버튼 클릭 | 작업표시줄로 최소화 |
| ** □** 버튼 클릭 | 최대화 ↔ 일반 크기 전환 |
| **X** 버튼 클릭 | 종료 확인 대화상자 표시 → "예" 선택 시 종료 |
---
## 3.3 메인 영역 - 채널 모니터링
화면은 좌측(`LEFT LEAK TESTER`)과 우측(`RIGHT LEAK TESTER`)으로 균등 분할되며, 각 채널은 동일한 구조입니다.
< img src = "./Pasted image 20260626093712.png" alt = "Pasted image 20260626093712.png" / >
### 각 채널의 구성 요소 (위에서 아래 순서)
#### ① 채널 타이틀
- **LEFT LEAK TESTER** 또는 **RIGHT LEAK TESTER** 채널 구분을 명시합니다.
#### ② 시작/종료 시간
| 항목 | 설명 |
|------|------|
| 라벨 | `시작/종료` |
| 값 | `시작시간 / 종료시간` 형식 (예: `2026-05-08 10:30:15 / -` 또는 `2026-05-08 10:30:15 / 10:30:45` ) |
| 갱신 시점 | 시험이 시작될 때 `시작시간 / -` 형태로 갱신되며, 시험 완료(DB 저장) 시점에 종료 시간이 기록됩니다. |
#### ③ IC_SN / PCB_Barcode
| 항목 | 설명 |
|------|------|
| 라벨 | `IC_SN` / `PCB_Barcode` |
| 값 | 제품의 IC 일련번호 및 이에 매핑되는 PCB 바코드 고유 식별 정보 |
| 데이터 소스 | **IC_SN** : 4251 보드로 제품 ID 센서에서 판독한 값< br > **PCB_Barcode**: 판독한 `IC_SN` 을 기준으로 데이터베이스에서 조회한 바코드 값 |
| 갱신 시점 | 시험 시작 시 빈 값(`-`)으로 초기화, 판독 및 조회 완료 시 표시 |
> **참고**: IC_SN과 PCB_Barcode를 별도의 행으로 나누어 표시합니다.
#### ④ 측정값 + SPEC
좌측에 측정값, 우측에 SPEC 규격이 함께 표시됩니다.
**측정값 영역:**
| 항목 | 설명 |
|------|------|
| 라벨 | `측정값` |
| 값 | Sentinel C28에서 수신한 누설량 (소수점 4자리, 예: `0.5234` ) |
| 단위 | `sccm` (우측 하단에 표시) |
| 갱신 시점 | C28 센서 스트리밍 데이터 수신 시 실시간 갱신 |
**SPEC 영역 (우측):**
| 항목 | 설명 |
|------|------|
| `UL` | 상한 규격값 (예: `1.00` ) |
| `LL` | 하한 규격값 (예: `-1.00` ) |
| 갱신 시점 | Parameters에서 저장 시 즉시 반영 |
#### ⑤ 판정
| 항목 | 설명 |
|------|------|
| 라벨 | `판정` |
| 값 | **OK** 또는 **NG** |
> **판정 기준**: `SPEC LL ≤ 측정값 ≤ SPEC UL` → **OK**, 그 외 → **NG**
#### ⑥ 진행 메시지
| 항목 | 설명 |
|------|------|
| 라벨 | `진행 메시지` |
| 값 | 현재 시험 단계 메시지 표시 |
표시되는 메시지 목록:
| 메시지 | 의미 |
|--------|------|
| `시험 시작` | DIO 시작 신호 감지, 시험 프로세스 시작 |
| `대기중` | 다른 채널이 시험 중이어서 순서 대기 |
| `센서 정보 읽는 중` | 4251 보드를 통해 제품 ID 판독 중 |
| `LEAK 시험중` | Sentinel C28 센서의 측정 결과 대기 중 |
| `시험 완료` | 판정 완료 및 결과 출력 완료 |
| `오류 발생` | 시험 중 오류 발생 (상세 내용은 오류 메시지 참조) |
| `ID 테스트 완료` | 수동 ID 테스트 정상 완료 |
| `ID 테스트 실패` | 수동 ID 테스트 실패 |
| `통신 대기 중` | 통신 설정 변경 후 재연결 대기 |
#### ⑦ 오류 메시지
| 항목 | 설명 |
|------|------|
| 라벨 | `오류 메시지` |
| 값 | 발생한 오류 상세 내용 표시 |
| 초기화 시점 | 새 시험 시작 시 자동 초기화 |
---
## 3.4 SPEC 교차 검증 경고
프로그램의 판정 결과(SPEC UL/LL 기준)와 Sentinel C28 센서의 자체 판정 결과가 서로 다를 경우:
1. 해당 채널의 **오류 메시지** 영역에 `SPEC 불일치 - 프로그램: OK, 센서: NG` 등의 메시지가 표시됩니다.
2. **팝업 경고 대화상자**가 표시됩니다: "프로그램 스팩과 센서의 스팩이 서로 맞지 않습니다."
> **조치**: 센서 측의 SPEC 설정과 프로그램의 SPEC UL/LL 설정이 동일한지 확인하세요. (통신설정 참조)
---
## 3.5 하단 메뉴 바
프로그램 하단 메뉴 영역입니다. 5개의 버튼이 수평으로 배치됩니다.
< img src = "./Pasted image 20260624104445.png" alt = "Pasted image 20260624104445.png" / >
| 순서 | BUTTON | 부제 | 동작 | 동작 방식 |
|------|------------|------|------|----------|
| 1 | **Data** | (측정 데이터) | 검사 기록 조회 화면 전환 | 토글 (다시 클릭 시 Home으로 복귀) |
| 2 | **Parameters** | (시험 설정) | 시험 설정 팝업 창 열기 | 모달 팝업 (설정 후 자동 닫힘) |
| 3 | **Comm. Settings** | (통신 설정) | 통신 설정 팝업 창 열기 | 모달 팝업 (설정 후 자동 닫힘) |
| 4 | **ID Test (L)** | (좌측 ID 테스트) | 좌측 채널 센서 ID 수동 판독 | 즉시 실행 |
| 5 | **ID Test (R)** | (우측 ID 테스트) | 우측 채널 센서 ID 수동 판독 | 즉시 실행 |
< div class = "page-break" > < / div >
# 4. 통신 설정 (Comm. Settings)
---
하단 메뉴에서 **Comm. Settings (통신 설정)** 버튼 클릭 시 열리는 **모달 팝업 창**입니다.
< img src = "./Pasted image 20260624104506.png" alt = "Pasted image 20260624104506.png" / >
## 4.1 창 구성
| 속성 | 값 |
|------|-----|
| 창 크기 | 고정 (크기 변경 불가) |
| 위치 | 메인 창 중앙에 정렬되어 표시 |
| 타입 | 모달 (이 창이 열려있으면 메인 창 조작 불가) |
## 4.2 4251 보드 설정 (좌측 영역)
| 항목 | 선택 가능 값 | 기본값 | 설명 |
|------|-------------|--------|------|
| **4251 BaudRate** | 9600 / 19200 / 38400 / 115200 | `115200` | 4251 보드 통신 속도. 보드 설정과 일치해야 함 |
| **4251 Port** | 시스템 감지 COM 포트 목록 | `COM3` | 4251 보드가 연결된 시리얼 포트 |
## 4.3 Sentinel C28 설정 (우측 영역)
| 항목 | 선택 가능 값 | 기본값 | 설명 |
|------|-------------|--------|------|
| **Sensor BaudRate** | 9600 / 19200 / 38400 / 115200 | `9600` | C28 센서 통신 속도. 센서 설정과 일치해야 함 |
| **Sensor Port** | 시스템 감지 COM 포트 목록 | `COM1` | C28 센서가 연결된 시리얼 포트 |
## 4.4 스펙 불일치 알림 설정 (화면 하단 영역)
| 항목 | 선택 가능한 값 | 기본값 | 설명 |
|------|---------------|--------|------|
| **스펙 불일치 알림 활성화** | 체크(ON) / 체크 해제(OFF) | `체크(ON)` | 프로그램 판정과 센서 자체 판정이 맞지 않을 때의 알림 팝업 창 발생 여부 설정 |
> **동작 설명**:
> - **ON (기본값)**: 판정이 불일치할 때 메인 화면의 오류 메시지 창에 로그가 기재됨과 동시에, 경고 대화상자("프로그램 스펙과 센서의 스펙이 서로 맞지 않습니다.") 팝업이 출력되어 작업자 인지를 강제합니다.
> - **OFF**: 판정이 불일치하더라도 경고 팝업을 띄우지 않고, 화면의 오류 메시지 영역에만 텍스트로 기록을 남깁니다.
## 4.5 버튼 설명
| 버튼 | 동작 |
|------|------|
| **설정 저장** | config.xml에 저장 → 기존 연결 해제 → 새 설정으로 재연결 → "통신 설정이 저장되었습니다." 메시지 → 창 닫힘 |
| **닫기** | 변경 사항 저장하지 않고 창 닫기 |
> **⚠️ 주의**: COM 포트를 동일하게 설정하면 충돌이 발생합니다. 4251 보드와 C28 센서는 반드시 다른 포트를 사용하세요.
< div class = "page-break" > < / div >
# 5. 시험 설정 (Parameters)
---
하단 메뉴에서 **Parameters (시험 설정)** 버튼 클릭 시 열리는 **모달 팝업 창**입니다.
< img src = "./Pasted image 20260624104531.png" alt = "Pasted image 20260624104531.png" / >
## 5.1 창 구성
| 속성 | 값 |
|------|-----|
| 창 크기 | 고정 (크기 변경 불가) |
| 위치 | 메인 창 중앙에 정렬되어 표시 |
| 타입 | 모달 |
## 5.2 설정 항목
| 항목 | 입력 형식 | 기본값 | 설명 |
|------|----------|--------|------|
| **SPEC UL (sccm)** | 소수점 숫자 | `1.00` | 누설 상한 규격값. 이 값 이하일 때 OK |
| **SPEC LL (sccm)** | 소수점 숫자 | `-1.00` | 누설 하한 규격값. 이 값 이상일 때 OK |
> **입력 팁**: 소수점 2자리까지 입력합니다 (예: `1.50`, `-0.80`). 정수도 입력 가능합니다 (예: `2`).
< div class = "page-break" > < / div >
## 5.3 판정 로직 상세
* **합격 판정 기준** : `SPEC LL ≤ 측정값 ≤ SPEC UL`
* **불합격 판정 기준** : `측정값 < SPEC LL` 또는 `측정값 > SPEC UL`
**예시**:
| SPEC LL | SPEC UL | 측정값 | 판정 |
| :---: | :---: | :---: | :---: |
| -1.00 | 1.00 | 0.523 | ✅ OK |
| -1.00 | 1.00 | 1.200 | ❌ NG |
| -1.00 | 1.00 | -1.500 | ❌ NG |
| -1.00 | 1.00 | -1.00 | ✅ OK (경계값 포함) |
## 5.4 버튼 설명
| 버튼 | 동작 |
|------|------|
| **설정 저장** | config.xml에 저장 → 메인 화면의 SPEC 표시 즉시 갱신 → "파라미터 설정이 저장되었습니다." 메시지 → 창 닫힘 |
| **닫기** | 변경 사항 저장하지 않고 창 닫기 |
> **참고**: SPEC 값은 좌/우 양쪽 채널에 **공통으로 적용**됩니다. 채널별 개별 설정은 지원하지 않습니다.
> **참고**: SPEC 값 변경 후 저장하면, 이미 진행 중인 시험에는 영향을 주지 않으며, 다음 시험부터 새 값이 적용됩니다.
< div class = "page-break" > < / div >
# 6. 측정 데이터 조회 (Data View)
---
하단 메뉴에서 **Data (측정 데이터)** 버튼을 클릭하면 표시됩니다. 다시 클릭하면 메인 화면으로 복귀합니다.
로컬 PC의 CSV 데이터를 기준으로 조회됩니다. (데이터베이스는 서버 PC에서 조회)
## 6.1 화면 구성
< img src = "./Pasted image 20260624104558.png" alt = "Pasted image 20260624104558.png" / >
## 6.2 필터 조건 상세
### 1행: 공통 기본 필터
| 항목 | 기본값 | 설명 |
|------|--------|------|
| **조회 기간** | 오늘로부터 7일 전 ~ 오늘 | 조회 대상 날짜 범위를 설정합니다. |
| **판정 결과** | `[전체]` / `OK` / `NG` | 판정 결과에 따른 필터링을 수행합니다. |
### 2행: 상세 검색 필터 (DB 스키마 필드 교차 검색)
| 항목 | 설명 | 기본값 |
|------|------|--------|
| **ID 검색** | `IC_SN` 또는 `PCB_Barcode` 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) |
| **작업자** | 작업자 ID (`Operator`) 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) |
| **Lot No** | 로트 번호 (`Lot_No`) 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) |
| **모델** | 모델명 (`Model`) 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) |
## 6.3 조회 및 취소 버튼
| 버튼 | 동작 |
|------|------|
| **Search** | 설정된 필터 조건으로 로컬 로그 CSV 백업 파일을 검색하여 그리드에 표시합니다. |
| **Cancel (취소)** | 조회 중일 때 로딩 화면 내부에 나타나며, 진행 중인 파일 검색 작업을 중단하고 이전 화면으로 복귀합니다. |
### Search 버튼 동작 상세
1. 지정된 조회 기간에 해당하는 일별 로그 CSV 파일만 조회하여 검색을 수행합니다.
2. 검색 조건(판정, ID, 작업자, Lot No, 모델)에 맞는 데이터를 부분 일치 방식으로 검색합니다.
3. 검색 결과가 존재하지 않을 경우 "해당 조건의 데이터가 없습니다." 알림을 표시합니다.
## 6.4 데이터 조회 결과 표(그리드) 항목 안내
| 컬럼 헤더명 | 설명 |
|------|------|
| **IC_SN** | 제품 고유 IC 시리얼 번호 |
| **PCB_Barcode** | PCB 바코드 고유 식별 정보 |
| **Maker** | 로그인 시 입력된 제조사명 |
| **Model** | 로그인 시 입력된 검사 모델명 |
| **Variant_1** | 로그인 시 입력된 세부 파생 모델 1 |
| **Variant_2** | 로그인 시 입력된 세부 파생 모델 2 |
| **Operator** | 작업 진행자 사용자 ID |
| **Production_Date** | 검사 수행 및 완료 일시 (yyyy-MM-dd HH:mm:ss) |
| **Line** | 로그인 공정 작업 라인 |
| **Lot_No** | 생산 Lot 번호 |
| **Jig_No** | 사용 지그(Jig) 번호 |
| **Channel** | 검사 채널 (`LEFT` 또는 `RIGHT` ) |
| **Spec_UL** | 누설 상한 규격값 (sccm) |
| **Spec_LL** | 누설 하한 규격값 (sccm) |
| **Leak_Value** | 측정된 누설 리크량 |
| **Result** | 최종 판정 결과 (`OK` / `NG` ) |
### 표(그리드) 기능
- 컬럼 정렬: 헤더 클릭 시 해당 열 기준으로 오름차순 또는 내림차순 정렬이 가능합니다.
< div class = "page-break" > < / div >
# 7. 자동 시험 프로세스
---
## 7.1 개요
자동 시험은 시작 신호(LEFT_START 또는 RIGHT_START)에 의해 작동하며, 7단계로 진행됩니다. 좌/우 채널은 각각 독립적인 백그라운드 스레드에서 실행되지만, **중복 실행 방지 기능**을 통해 동시 시험은 방지됩니다.
## 7.2 전체 프로세스 흐름도
< div style = "display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin: 15px 0; page-break-inside: avoid; line-height: 1.4;" >
<!-- 좌측 컬럼: 시작 ~ 3단계 -->
< div style = "border-left: 2px solid #1e3799 ; padding-left: 14px;" >
<!-- Trigger -->
< div style = "margin-bottom: 10px; position: relative;" >
< span style = "position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;" > < / span >
< div style = "font-weight: bold; color: #2f3542 ;" > 시작 신호 감지 < span style = "font-weight: normal; color: #747d8c ;" > (좌/우 시작 신호)</ span ></ div >
< / div >
<!-- Semaphore -->
< div style = "margin-bottom: 10px; padding: 6px 8px; border-radius: 4px; border-left: 3px solid #f6b93b ;" >
< strong style = "color: #d97706 ;" > 중복 실행 방지 대기</ strong >
< div style = "color: #57606f ; margin-top: 2px;" >
• 타 채널 시험 중 시 "대기중" 메시지 및 순서 대기< br >
• 시험 가능 시 개시 (좌/우 동시 시험 방지)
< / div >
< / div >
<!-- Step 1 -->
< div style = "margin-bottom: 10px; position: relative;" >
< span style = "position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;" > < / span >
< strong style = "color: #1e3799 ;" > 1단계: 시험 시작 (초기화)</ strong >
< div style = "color: #57606f ; margin-top: 2px;" >
• OK/NG 판정 출력 초기화 (OFF)< br >
• 메인 화면 결과 표시 초기화 및 시작 시간 갱신< br >
• 누설 센서 수신 데이터 초기화
< / div >
< / div >
<!-- Step 2 -->
< div style = "margin-bottom: 10px; position: relative;" >
< span style = "position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;" > < / span >
< strong style = "color: #1e3799 ;" > 2단계: 제품 ID 판독</ strong >
< div style = "color: #57606f ; margin-top: 2px;" >
• 4251 보드를 통해 16자리 ID 판독< br >
• < span style = "color: #ff4757 ; font-weight: bold;" > [실패 시]</ span > "ID 읽기 실패" 출력 후 기록/저장 제외 종료
< / div >
< / div >
<!-- Step 3 -->
< div style = "padding: 6px 8px; border-radius: 4px; border-left: 3px solid #1e3799 ;" >
< strong style = "color: #1e3799 ;" > 3단계: PCB 바코드 DB 조회</ strong >
< div style = "color: #57606f ; margin-top: 2px;" >
• DB에서 `IC_SN` 매칭 `PCB_Barcode` 조회 (5초 제한)< br >
• < span style = "color: #ff4757 ; font-weight: bold;" > [실패/누락 시]</ span > "바코드 매핑 실패" 출력 후 즉시 종료
< / div >
< / div >
< / div >
<!-- 우측 컬럼: 4단계 ~ 종료 -->
< div style = "border-left: 2px solid #1e3799 ; padding-left: 14px;" >
<!-- Step 4 -->
< div style = "margin-bottom: 10px; position: relative;" >
< span style = "position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;" > < / span >
< strong style = "color: #1e3799 ;" > 4단계: 누설 시험 수행 (계측)</ strong >
< div style = "color: #57606f ; margin-top: 2px;" >
• "LEAK 시험중" 표시 & C28 센서 수신 대기 (최대 30초)< br >
• < span style = "color: #ff4757 ; font-weight: bold;" > [초과 시]</ span > 통신 초과 NG 자동 종료 (측정값 9.9999 DB 저장)
< / div >
< / div >
<!-- Step 5 -->
< div style = "margin-bottom: 10px; position: relative;" >
< span style = "position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;" > < / span >
< strong style = "color: #1e3799 ;" > 5단계: 합격 판정</ strong >
< div style = "color: #57606f ; margin-top: 2px;" >
• 규격 하한값 ≤ 측정값 ≤ 규격 상한값 범위 내 OK, 이외 NG
< / div >
< / div >
<!-- Step 6 -->
< div style = "margin-bottom: 10px; position: relative;" >
< span style = "position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;" > < / span >
< strong style = "color: #1e3799 ;" > 6단계: 판정 스펙 교차 검증</ strong >
< div style = "color: #57606f ; margin-top: 2px;" >
• SW 판정과 센서 자체 판정 비교 분석 (상이 시 경고 창 표시)
< / div >
< / div >
<!-- Step 7 -->
< div style = "margin-bottom: 10px; position: relative;" >
< span style = "position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;" > < / span >
< strong style = "color: #1e3799 ;" > 7단계: 결과 출력 및 저장</ strong >
< div style = "color: #57606f ; margin-top: 2px;" >
• 로컬 CSV 및 DB 저장, 외부 설비 출력 신호(OK/NG) 전송< br >
• 메인 화면 결과 및 "시험 완료" 표시
< / div >
< / div >
<!-- End -->
< div style = "padding: 6px 8px; border-radius: 4px; border-left: 3px solid #2ed573 ;" >
< strong style = "color: #2f855a ;" > 순서 잠금 해제</ strong >
< div style = "color: #57606f ; margin-top: 2px;" >
• 순서 대기 해제, 대기 중 타 채널 0.35초 후 자동 시험 개시
< / div >
< / div >
< / div >
< / div >
## 7.3 좌/우 채널 순차 실행 및 대기
좌/우 채널은 **동시에 시험을 수행할 수 없습니다** . 이는 하드웨어 통신 간섭 및 충돌을 방지하기 위함입니다.
| 상황 | 동작 |
|------|------|
| 한 채널만 시험 시작 신호 발생 | 즉시 시험을 시작합니다. |
| 양쪽 채널 동시 신호 발생 | 먼저 순서를 획득한 채널이 시험을 진행하며, 다른 채널은 "대기중"을 표시하며 대기합니다. |
| 시험 완료 후 | 대기 중이던 채널이 자동으로 시험을 시작합니다. (안정화를 위해 0.35초의 대기 시간이 적용됩니다.) |
## 7.4 시간 초과 (타임아웃) 처리
누설 센서에서 30초 이내에 계측 결과 응답이 없으면 다음과 같이 처리됩니다.
1. 화면의 오류 메시지 영역에 "통신 시간 초과" 오류 메시지를 표시합니다. (데이터베이스 저장 실패 시 "DB 저장 실패" 사유도 함께 노출)
2. 해당 채널의 불합격(NG) 물리 신호를 내보냅니다.
3. 측정값 `9.9999` , 판정 `NG` 로 기록을 생성합니다.
4. 로컬 CSV 로그 파일 및 데이터베이스에 검사 결과를 기록합니다. (단, 이전 단계인 제품 ID 판독에 성공한 상태여야 저장이 이루어집니다.)
## 7.5 제품 ID 및 PCB 바코드 연동 예외 처리
### 1. 제품 ID(IC_SN) 판독 실패 시
- **동작**: 제품 ID 판독 장치(4251 보드)로부터 16자리 ID 취득을 실패하는 경우 진행 메시지에 `"ID 읽기 실패"` 를 표시하고, 해당 채널의 NG 물리 신호를 즉시 출력합니다.
- **저장 제한**: 이 경우에는 로컬 CSV 로그 기록 및 데이터베이스 저장을 **완전히 건너뜁니다** .
### 2. PCB 바코드 DB 조회(매핑) 실패 시
- **동작**: 판독 완료 후 데이터베이스 서버에서 `IC_SN` 에 해당하는 `PCB_Barcode` 를 조회할 때, 정해진 시간(5초) 내에 응답이 없거나 일치하는 데이터가 없는 경우 화면에 `"바코드 매핑 실패"` 관련 오류를 표시하고 NG 신호를 출력합니다.
- **저장 제한**: 이 경우에도 제품 검사 자체를 진행하지 않고 즉시 스킵하며, **데이터베이스 및 로컬 CSV 로그 기록 저장을 건너뜁니다** . (오프라인 모드에서는 임시 바코드 정보를 주입하여 검사 동작을 테스트할 수 있습니다.)
## 7.6 누설 센서 측정 결과 채널 분류
누설 센서에서 수신한 데이터는 다음 채널 번호 정보를 기준으로 정렬됩니다.
| 채널 번호 | 대상 |
|----------|------|
| `C01` 또는 `1` | 좌측(LEFT) 채널 |
| `C02` 또는 `2` | 우측(RIGHT) 채널 |
| 채널 번호 식별 불가 | 현재 활성화되어 시험을 진행 중인 채널로 자동 배정 |
## 7.7 ID 수동 테스트
하단 메뉴의 **ID Test (L)** 또는 **ID Test (R)** 버튼을 사용하면 시험 시작 신호 없이 센서 ID 판독 동작만 단독으로 수행할 수 있습니다.
> **용도**: 장비 설치 후 통신 상태 확인 및 디버깅 시 사용합니다. 실제 누설 시험(압력 계측)은 수행하지 않습니다.
## 7.8 측정 판정 및 저장 기준
프로그램의 판정 스펙(상하한 규격) 기준과 누설 센서 자체의 내부 스펙 판정 기준이 일치하지 않는 경우, 저장소에는 다음과 같이 저장됩니다.
### 저장 기준 요약
* **최종 저장 판정 (Result)** : 센서 자체의 판정값과 무관하게, 항상 **프로그램 화면 판정 기준**으로 데이터베이스 및 로그에 저장됩니다.
* **동작 예시** : 프로그램 판정이 합격(`OK`)이지만 센서 자체의 내부 판정이 불합격(`NG` 등)인 경우에도, 최종 기록 및 CSV에는 ** `OK` (합격)**로 기록됩니다.
### 판정 스펙 불일치 시의 동작
* 양측의 판정 스펙이 다르면 불일치 로그가 기록되며 화면에 경고 팝업이 출력되지만, **최종 저장되는 판정 결과에는 영향을 미치지 않고 프로그램 판정값을 유지**합니다.
< div class = "page-break" > < / div >
# 8. 로그 및 데이터 관리
---
## 8.1 검사 데이터 로그 (CSV)
### 기본 정보
| 항목 | 내용 |
|------|------|
| **저장 위치** | `C:\LeakTest\Logs\yyyy-MM-dd.csv` |
| **파일 형식** | CSV (UTF-8 인코딩) |
| **파일 생성** | 날짜별 자동 생성 (해당 날짜 첫 시험 시) |
| **데이터 추가** | 매 시험 완료 시 자동으로 해당 날짜 파일에 1행 추가 |
### CSV 헤더 및 컬럼
| 컬럼 | 예시 | 설명 |
|------|------|------|
| `IC_SN` | `260508A00123B01C` | 제품 고유 시리얼 번호 (PK/FK) |
| `PCB_Barcode` | `260508A00123B01C` | PCB 바코드 고유 식별 정보 (UK) |
| `Maker` | `Hyundai` | 메이커 정보 |
| `Model` | `NE1aW` | 모델 정보 |
| `Variant_1` | `PT` | 변형1 정보 |
| `Variant_2` | `SENSOR` | 변형2 정보 |
| `Operator` | `op001` | 작업자 ID |
| `Production_Date` | `2026-05-08 10:30:15` | 검사 수행 일시 |
| `Line` | `L1` | 작업 라인 번호 |
| `Lot_No` | `LOT001` | Lot 번호 |
| `Jig_No` | `JIG01` | 지그 번호 |
| `Channel` | `LEFT` | 검사 채널 (LEFT 또는 RIGHT) |
| `Spec_UL` | `1.00` | 규격 상한값 |
| `Spec_LL` | `-1.00` | 규격 하한값 |
| `Leak_Value` | `0.5234` | 측정된 릭 측정값 (소수점 4자리) |
| `Result` | `OK` | 최종 판정 결과 (OK 또는 NG) |
> **참고**: 타임아웃 발생 시에도 측정값 `9.9999`, 판정 `NG`로 로그에 기록됩니다.
---
## 8.2 시스템 로그
### 기본 정보
| 항목 | 내용 |
|------|------|
| **저장 위치** | `C:\LeakTest\Logs\yyyy-MM-dd_system.log` |
| **파일 형식** | 텍스트 파일 (UTF-8 인코딩) |
| **내용** | 통신 오류, 시스템 이벤트 등 |
### 로그 형식
```
[HH:mm:ss.fff] [TAG] 메시지 내용
```
---
## 8.3 설정 파일
### config.xml
| 항목 | 내용 |
|------|------|
| **위치** | 프로그램 실행 폴더 (`C:\LeakTest\config.xml`) |
| **생성** | 최초 실행 시 기본값으로 자동 생성 |
| **수정** | Comm. Settings 또는 Parameters에서 저장 시 갱신 |
```xml
< AppConfig >
< SensorPort > COM1< / SensorPort >
< SensorBaudRate > 9600< / SensorBaudRate >
< Board4251Port > COM3< / Board4251Port >
< Board4251BaudRate > 115200< / Board4251BaudRate >
< Board4251Timeout > 5000< / Board4251Timeout >
< SpecUL > 1.00< / SpecUL >
< SpecLL > -1.00< / SpecLL >
< EnableSpecMismatchAlarm > true< / EnableSpecMismatchAlarm >
< / AppConfig >
```
| 설정 키 | 기본값 | 설정 위치 | 설명 |
|---------|--------|----------|------|
| `SensorPort` | COM1 | Comm. Settings | C28 센서 COM 포트 |
| `SensorBaudRate` | 9600 | Comm. Settings | C28 센서 통신 속도 |
| `Board4251Port` | COM3 | Comm. Settings | 4251 보드 COM 포트 |
| `Board4251BaudRate` | 115200 | Comm. Settings | 4251 보드 통신 속도 |
| `Board4251Timeout` | 5000 | (코드 내 고정) | 4251 보드 응답 대기 시간(ms) |
| `SpecUL` | 1.00 | Parameters | 누설 상한 규격값 |
| `SpecLL` | -1.00 | Parameters | 누설 하한 규격값 |
| `EnableSpecMismatchAlarm` | true | Comm. Settings | 스펙 불일치 알림 활성화 여부 (true/false) |
### Database.ini
| 항목 | 내용 |
|------|------|
| **위치** | `C:\LeakTest\Database.ini` |
| **생성** | 최초 실행 시 해당 파일이 없으면 기본 양식으로 자동 생성. 배포 폴더(`C:\LeakTest\`)와 동일 위치에 저장되어 경로 관리가 단순함 |
| **수정** | 메모장 등의 텍스트 에디터를 통해 연결 주소 및 프로시저 정보 직접 수정 |
```ini
Db_Server=127.0.0.1, 1433
Db_Name=Test_DB
Db_User=db_user
Db_Password=db_password
[Login]
Procedure=dbo.CheckOperator
ProcessName=EOL
OfflinePreview=false
```
| 설정 키 | 예시 / 기본값 | 설명 |
|---------|--------|------|
| `Db_Server` | `[서버IP], [포트번호]` (예: 127.0.0.1, 1433) | 데이터베이스 서버 IP 주소 및 포트 번호 |
| `Db_Name` | `[데이터베이스명]` (예: Test_DB) | 대상 데이터베이스(DB) 이름 |
| `Db_User` | `[사용자ID]` (예: db_user) | 데이터베이스 접속 계정 ID |
| `Db_Password` | `[비밀번호]` (예: db_password) | 데이터베이스 접속 계정 비밀번호 |
| `Procedure` | dbo.CheckOperator | 로그인 계정 검증용 데이터베이스 프로그램명 |
| `ProcessName` | EOL | 검증 공정명 |
| `OfflinePreview` | false | true 시 DB 연결 없이 로그인 즉시 성공 (오프라인 모드) |
### LoginOptions.json / LoginHistory.json
| 항목 | 내용 |
|------|------|
| **위치** | `C:\LeakTest\` |
| **생성** | 최초 실행 시 자동 생성 |
| **수정** | 프로그램 내 로그인 화면 사용 시 자동 갱신 |
| 파일 | 설명 |
|------|------|
| `LoginOptions.json` | 로그인 화면 각 필드(Maker, Model, Variant_1 등)의 자동완성 드롭다운 선택지 목록 저장 |
| `LoginHistory.json` | 최근 로그인 정보(작업자 ID, 라인, 모델 등 전체 세트)를 최대 10건 저장하여 재사용 |
### DioConfig.ini
| 항목 | 내용 |
|------|------|
| **위치** | `[프로그램 폴더]\Settings\DioConfig.ini` |
| **생성** | 최초 실행 시 자동 생성 |
| **수정** | 일반적으로 수정 불필요 (하드웨어 변경 시에만) |
---
## 8.4 파일 관리 주의사항
| 주의사항 | 설명 |
|---------|------|
| Logs 폴더 삭제 금지 | 검사 기록이 영구 삭제됩니다 |
| CSV 파일 직접 편집 | Excel 등으로 편집 시 인코딩이 변경될 수 있으므로 주의 |
| config.xml 직접 편집 | 잘못된 값 입력 시 프로그램 오작동 가능. 프로그램 내 설정 화면 사용 권장 |
| 디스크 용량 | 일일 수백 건 검사 기준, 연간 약 50~100MB 정도의 로그가 생성됩니다 |
---
< div class = "page-break" > < / div >
## 8.5 데이터베이스 데이터 관리 (dbo.EOL)
매 시험 완료 시 검사 결과 및 로그인 정보가 데이터베이스에 실시간으로 저장(MERGE/UPSERT)됩니다.
### 데이터베이스 저장 항목 안내
* **대상 테이블** : `[dbo].[EOL]`
* **매핑 상세** :
| 데이터베이스 항목명 | 구분 | 설명 |
| :--- | :--- | :--- |
| ** `IC_SN` ** | 문자형 (최대 10자) | 제품 고유 IC 일련번호 |
| ** `PCB_Barcode` ** | 문자형 (최대 10자) | 조회된 PCB 바코드 정보 |
| `Maker` | 문자형 (최대 10자) | 로그인 시 입력한 제조사명 |
| `Model` | 문자형 (최대 10자) | 로그인 시 입력한 검사 모델명 |
| `Variant_1` | 문자형 (최대 10자) | 로그인 시 입력한 파생 모델명 1 |
| `Variant_2` | 문자형 (최대 10자) | 로그인 시 입력한 파생 모델명 2 |
| `Operator` | 문자형 (최대 10자) | 검사자(작업자) ID |
| `Production_Date` | 날짜/시간형 | 검사가 완료된 시간 |
| `Line` | 문자형 (최대 30자) | 로그인 시 입력한 작업 라인명 |
| `Lot_No` | 문자형 (최대 8자) | 로그인 시 입력한 Lot 번호 |
| `Jig_No` | 문자형 (최대 10자) | 로그인 시 입력한 지그 번호 |
| `Channel` | 문자형 (최대 5자) | 검사가 수행된 채널 (LEFT / RIGHT) |
| `Spec_UL` | 숫자형 | 리크 판정 상한 기준값 |
| `Spec_LL` | 숫자형 | 리크 판정 하한 기준값 |
| `Leak_Value` | 숫자형 | 측정된 누설량 |
| `Result` | 문자형 (최대 5자) | 최종 판정 결과 (OK / NG) |
< div class = "page-break" > < / div >
# 9. 오류 대응 및 프로그램 종료
---
## 9.1 통신 연결 실패
프로그램 시작 또는 통신 설정 저장 시 발생할 수 있습니다.
| 오류 메시지 | 원인 | 조치 방법 |
|------------|------|----------|
| `Sentinel C28 포트 연결 실패 (COMx)` | C28 센서 미연결, 잘못된 포트, 다른 프로그램이 포트 점유 | ① 케이블 연결 확인 ② 장치 관리자에서 COM 포트 번호 확인 ③ Comm. Settings에서 올바른 포트 선택 후 `설정 저장` |
| `4251 보드 포트 연결 실패 (COMx)` | 4251 보드 미연결, 잘못된 포트 | ① 케이블 연결 확인 ② Comm. Settings에서 올바른 포트 선택 후 `설정 저장` |
> **참고**: 통신 설정을 저장하면 기존 연결을 모두 해제하고 새 설정으로 재연결을 시도합니다. 포트 변경 후 재시작 없이 바로 적용됩니다.
## 9.2 시험 중 오류
시험 프로세스 진행 중 발생하는 오류입니다. 메인 화면의 **오류 메시지** 영역에 표시됩니다.
| 오류 메시지 | 원인 | 조치 방법 |
|------------|------|----------|
| `Sentinel C28 통신 타임아웃` | 30초 내 C28 센서 응답 없음 | ① 센서 전원 ON 확인 ② 시리얼 케이블 연결 확인 ③ BaudRate 설정 확인 (기본: 9600) |
| `통신 실패 (4251 보드 CHx 상태 응답 시간 초과)` | 4251 보드가 대기 시간(15초) 내에 응답하지 않음 | ① 4251 보드 전원 공급 및 케이블 연결선 확인 ② 통신 노이즈 방지 조치 확인 |
| `통신 실패 (4251 보드 CHx 상태 이상 또는 Fail)` | 4251 보드로부터 정상 응답을 받지 못했거나 오류 코드가 반환됨 | ① 하드웨어 오결선 여부 점검 ② 채널 센서 구동 전원 확인 |
| `통신 실패 (4251 보드 CHx ID 대기 타임아웃)` | 4251 보드를 통해 제품 ID를 15초 내에 판독하지 못함 | ① 센서가 지그(Jig)에 올바르게 안착되었는지 물리적 확인 ② 접촉 단자 이물질 청소 |
| `SPEC 불일치 - 프로그램: OK, 센서: R` | 프로그램 SPEC과 센서 자체 SPEC의 판정이 다름 | ① 프로그램의 SPEC UL/LL 확인 (Parameters) ② C28 센서의 SPEC 설정 확인 ③ 양쪽 설정값 동기화 (※ 통신 설정에서 경고 알림 스위치 상태를 확인하세요) |
| `LEAK 센서 데이터 오류` | C28에서 수신된 데이터 파싱 실패 | ① 센서 통신 상태 확인 ② 케이블 접촉 불량 확인 ③ BaudRate 불일치 확인 |
| `DB 저장 실패: [오류 원인] 상세 메시지` | 데이터베이스 서버에 검사 데이터를 저장하지 못함 | ① 네트워크 케이블 및 서버 통신 연결 확인 ② Database.ini 설정 파일의 접속 정보(IP/비밀번호 등) 확인 ③ 로컬 일일 CSV 로그 파일에 백업이 정상적으로 저장되었는지 확인 |
| `바코드 매핑 실패: [오류 원인] 상세 메시지` | 데이터베이스에서 해당 `IC_SN` 에 매칭되는 바코드 정보를 찾지 못함 | ① 데이터베이스 서버 네트워크 연결 확인 ② Housing_Assembly 테이블에 대상 제품의 바코드 정보 매핑 상태 점검 |
---
## 9.3 SPEC 교차 검증 경고 팝업
프로그램 판정과 센서 판정이 불일치할 때, 통신 설정 화면의 ** `스펙 불일치 알림 활성화` ** 옵션이 켜져(ON) 있는 경우 팝업 경고가 표시됩니다:
- 만약 이 옵션을 **해제(OFF)**한 경우, 이 팝업 경고 대화상자는 나타나지 않으며, 메인 화면 하단의 **오류 메시지** 텍스트 박스에만 불일치 로그가 기록됩니다.
- 이 경고는 검사 자체를 중단하지는 않으며, **프로그램의 판정 결과**가 최종 DB 및 로컬 로그 기록에 사용됩니다.
---
## 9.4 DIO 보드 오류
| 상황 | 프로그램 동작 | 영향 |
|------|-------------|------|
| PCI-7432 보드 미인식 | **시뮬레이션 모드**로 자동 전환 | DIO 입출력이 동작하지 않음 (실제 입출력 포트 제어 불가) |
| 보드 런타임 오류 | 좌/우 채널 오류 메시지에 `[DIO Board Error]` 표시 | 오류 내용에 따라 조치 |
> **시뮬레이션 모드**: ADLINK 드라이버가 설치되지 않은 환경에서도 프로그램의 기능(통신 설정, 데이터 조회 등)을 사전에 테스트할 수 있도록 제공되는 가상 동작 모드입니다.
---
## 9.5 일반적인 문제 해결
| 증상 | 가능한 원인 | 해결 방법 |
|------|-----------|----------|
| 프로그램 시작 후 양쪽 채널에 오류 메시지 | COM 포트 설정 불일치 | Comm. Settings에서 올바른 포트 선택 후 저장 |
| 시험이 시작되지 않음 | DIO 시작 신호 미수신 | 외부 PLC 또는 시작 스위치의 접점 신호 상태 확인 |
| "대기중"에서 진행되지 않음 | 다른 채널이 타임아웃 대기 중 | 최대 30초 대기 후 자동 해제. 센서 연결 확인 |
| 측정값이 표시되지 않음 | C28 센서 스트리밍 데이터 미수신 | 센서 전원, 케이블, BaudRate 확인 |
| COM 포트 목록이 비어있음 | 시리얼 장치 미연결 | USB-시리얼 케이블 연결 확인, 드라이버 설치 확인 |
---
## 9.6 프로그램 종료
### 종료 방법
1. 상단 타이틀 바 우측의 **X (빨간색)** 버튼을 클릭합니다.
2. 종료 확인 대화상자가 표시됩니다
3. ** "예"**를 선택하면 종료, ** "아니오"**를 선택하면 취소됩니다.