Browse Source

새 도안 적용

main
최승민 1 week ago
parent
commit
3a3afcacc0
  1. 59
      leak_test_project/Manual/01_시스템_개요.md
  2. 104
      leak_test_project/Manual/02_초기_설정.md
  3. 81
      leak_test_project/Manual/03_메인_화면.md
  4. 43
      leak_test_project/Manual/04_통신_설정.md
  5. 8
      leak_test_project/Manual/05_시험_설정.md
  6. 94
      leak_test_project/Manual/06_데이터_조회.md
  7. 112
      leak_test_project/Manual/07_시험_프로세스.md
  8. 61
      leak_test_project/Manual/08_로그_관리.md
  9. 37
      leak_test_project/Manual/09_오류_대응.md
  10. 903
      leak_test_project/Manual/Manual_Merged.html
  11. 787
      leak_test_project/Manual/Manual_Merged.md
  12. 8
      leak_test_project/Manual/build_pdf.py
  13. 117
      leak_test_project/Manual/pdf_style.css
  14. 75
      leak_test_project/Manual/사용자_메뉴얼.md
  15. 104
      leak_test_project/Services/LotEngravingService.cs
  16. 20
      ob/05_Implementation_History.md

59
leak_test_project/Manual/01_시스템_개요.md

@ -8,19 +8,6 @@
**Pressure Leak Inspect System**은 제품의 압력 누설(Leak)을 자동으로 검사하는 데스크탑 프로그램입니다. 생산 라인에서 DIO 시작 신호를 받아 제품 ID를 판독하고, 누설 시험을 수행한 뒤 합격/불합격을 자동 판정합니다. **Pressure Leak Inspect System**은 제품의 압력 누설(Leak)을 자동으로 검사하는 데스크탑 프로그램입니다. 생산 라인에서 DIO 시작 신호를 받아 제품 ID를 판독하고, 누설 시험을 수행한 뒤 합격/불합격을 자동 판정합니다.
### 주요 기능 요약
| 기능 | 설명 |
| ------------------- | ---------------------------------------------------- |
| **좌/우 2채널 관리** | LEFT / RIGHT 두 개의 독립적인 시험 채널을 운영합니다 |
| **자동 시험 프로세스** | DIO 시작 신호 감지 → ID 판독 → 누설 시험 → 판정 → 결과 출력까지 전 과정 자동화 |
| **Sentinel C28 연동** | RS-232 시리얼 통신으로 누설 센서의 실시간 측정값을 수신합니다 |
| **4251 보드 연동** | 제품 ID 판독을 위한 시리얼 통신을 수행합니다 |
| **PCI-7432 DIO 보드** | 디지털 입출력 제어 (시작 신호 수신, OK/NG 출력) |
| **검사 기록 관리** | 날짜/판정/ID별 필터링 검색 및 CSV 파일 내보내기를 지원합니다 |
| **SPEC 교차 검증** | 프로그램 판정과 센서 자체 판정을 비교하여 불일치 시 경고합니다 |
| **순차 실행 보장** | 중복 실행 방지 기능으로 좌/우 채널의 동시 시험을 방지합니다 |
--- ---
## 1.2 소프트웨어 요구사항 ## 1.2 소프트웨어 요구사항
@ -47,9 +34,9 @@
### 케이블 연결도 ### 케이블 연결도
<div style="display: flex; align-items: center; justify-content: center; gap: 20px; margin: 25px auto; max-width: 600px; page-break-inside: avoid; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;"> <div style="display: flex; align-items: center; justify-content: center; gap: 20px; margin: 25px auto; max-width: 600px; page-break-inside: avoid;">
<!-- PC Box --> <!-- PC Box -->
<div style="border: 2px solid #2f3542; border-radius: 6px; padding: 35px 20px; background-color: #f1f2f6; text-align: center; min-width: 100px; font-weight: bold; color: #2f3542; box-shadow: 0 2px 4px rgba(0,0,0,0.06); font-size: 11pt;"> <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 본체 PC
</div> </div>
@ -57,30 +44,30 @@
<div style="display: flex; flex-direction: column; gap: 12px; flex-grow: 1;"> <div style="display: flex; flex-direction: column; gap: 12px; flex-grow: 1;">
<!-- C28 센서 --> <!-- C28 센서 -->
<div style="display: flex; align-items: center; justify-content: space-between; gap: 10px;"> <div style="display: flex; align-items: center; justify-content: space-between; gap: 10px;">
<div style="flex-grow: 1; text-align: center; font-size: 8.5pt; border-bottom: 2px dashed #007acc; padding-bottom: 4px; color: #007acc; font-weight: 500;"> <div style="flex-grow: 1; text-align: center; border-bottom: 2px dashed #007acc; padding-bottom: 4px; color: #007acc; font-weight: 500;">
RS-232 통신 ➔ RS-232 통신 ➔
</div> </div>
<div style="border: 1px solid #007acc; border-radius: 4px; padding: 8px 12px; background-color: #f0f7ff; min-width: 140px; text-align: center; font-size: 9pt; font-weight: bold; color: #005999; box-shadow: 0 1px 3px rgba(0,0,0,0.04);"> <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 센서 Sentinel C28 센서
</div> </div>
</div> </div>
<!-- 4251 보드 --> <!-- 4251 보드 -->
<div style="display: flex; align-items: center; justify-content: space-between; gap: 10px;"> <div style="display: flex; align-items: center; justify-content: space-between; gap: 10px;">
<div style="flex-grow: 1; text-align: center; font-size: 8.5pt; border-bottom: 2px dashed #007acc; padding-bottom: 4px; color: #007acc; font-weight: 500;"> <div style="flex-grow: 1; text-align: center; border-bottom: 2px dashed #007acc; padding-bottom: 4px; color: #007acc; font-weight: 500;">
RS-232 통신 ➔ RS-232 통신 ➔
</div> </div>
<div style="border: 1px solid #007acc; border-radius: 4px; padding: 8px 12px; background-color: #f0f7ff; min-width: 140px; text-align: center; font-size: 9pt; font-weight: bold; color: #005999; box-shadow: 0 1px 3px rgba(0,0,0,0.04);"> <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 리더) 4251 보드 (ID 리더)
</div> </div>
</div> </div>
<!-- ADLINK --> <!-- ADLINK -->
<div style="display: flex; align-items: center; justify-content: space-between; gap: 10px;"> <div style="display: flex; align-items: center; justify-content: space-between; gap: 10px;">
<div style="flex-grow: 1; text-align: center; font-size: 8.5pt; border-bottom: 2px solid #2ed573; padding-bottom: 4px; color: #2ed573; font-weight: 500;"> <div style="flex-grow: 1; text-align: center; border-bottom: 2px solid #2ed573; padding-bottom: 4px; color: #2ed573; font-weight: 500;">
PCI 슬롯 ══➔ PCI 슬롯 ══➔
</div> </div>
<div style="border: 1px solid #2ed573; border-radius: 4px; padding: 8px 12px; background-color: #f1fff5; min-width: 140px; text-align: center; font-size: 9pt; font-weight: bold; color: #157a38; box-shadow: 0 1px 3px rgba(0,0,0,0.04);"> <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 ADLINK PCI-7432
</div> </div>
</div> </div>
@ -116,34 +103,4 @@
--- ---
<div class="page-break"></div>
## 1.5 프로그램 창 구조 개요
프로그램은 3개의 영역으로 구성됩니다:
<div style="border: 1px solid #ccd0d5; border-radius: 6px; overflow: hidden; max-width: 500px; margin: 20px auto; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; box-shadow: 0 2px 6px rgba(0,0,0,0.05); page-break-inside: avoid;">
<!-- Header -->
<div style="background-color: #2f3542; color: #ffffff; padding: 12px; font-weight: bold; font-size: 9.5pt; text-align: center; border-bottom: 2px solid #ccd0d5;">
상단 타이틀 바 <span style="font-weight: normal; font-size: 8.5pt; color: #a4b0be; margin-left: 5px;">(프로그램명, 시간, 배지, 창 제어)</span>
</div>
<!-- Content -->
<div style="background-color: #ffffff; padding: 45px 15px; text-align: center; color: #2f3542; border-bottom: 2px solid #ccd0d5;">
<div style="font-weight: bold; font-size: 11pt; margin-bottom: 6px;">메인 콘텐츠 영역</div>
<div style="color: #747d8c; font-size: 9pt;">(Home / Data View 전환)</div>
</div>
<!-- Footer -->
<div style="background-color: #f1f2f6; color: #2f3542; padding: 12px; font-size: 9pt; text-align: center; font-weight: bold;">
하단 메뉴 바 <span style="font-weight: normal; font-size: 8.5pt; color: #57606f; margin-left: 5px;">(Data, Parameters, Comm.Settings, ID Test L/R)</span>
</div>
</div>
| 영역 | 설명 |
|------|------|
| 상단 타이틀 바 | 프로그램 제목, 실시간 날짜/시간, 현재 로그인된 작업자/모델/라인 정보 배지, 세션 로그아웃 버튼, 시스템 창 제어 버튼 배치 |
| 메인 콘텐츠 영역 | 선택된 기능 화면(Home 검사 모니터 또는 Data 데이터 조회)이 표시되는 주 콘텐츠 영역 |
| 하단 메뉴 바 | 각 화면 전환 및 설정을 위한 조작 버튼 영역 |
---
[다음: 초기 설정 가이드 →](02_초기_설정.md) [다음: 초기 설정 가이드 →](02_초기_설정.md)

104
leak_test_project/Manual/02_초기_설정.md

@ -16,8 +16,6 @@
| 4 | PCI-7432 DIO 보드 장착 | 장치 관리자에서 ADLINK PCI-7432 인식 확인 | PCI 슬롯에 장착 | | 4 | PCI-7432 DIO 보드 장착 | 장치 관리자에서 ADLINK PCI-7432 인식 확인 | PCI 슬롯에 장착 |
| 5 | COM 포트 번호 메모 | C28 센서와 4251 보드 각각의 COM 포트 번호를 기록 | 설정 시 필요 | | 5 | COM 포트 번호 메모 | C28 센서와 4251 보드 각각의 COM 포트 번호를 기록 | 설정 시 필요 |
> **⚠️ 중요**: C28 센서와 4251 보드는 **서로 다른 COM 포트**에 연결해야 합니다. 동일한 포트를 지정하면 통신 충돌이 발생합니다.
--- ---
## 2.2 프로그램 실행 ## 2.2 프로그램 실행
@ -37,54 +35,6 @@
| `LoginHistory.json` | `C:\LeakTest\` | 최근 로그인 정보 최대 10건 자동 저장 | | `LoginHistory.json` | `C:\LeakTest\` | 최근 로그인 정보 최대 10건 자동 저장 |
| `Logs\` 폴더 | `C:\LeakTest\Logs\` | 날짜별 CSV 검사 로그 및 시스템 로그 저장 위치 | | `Logs\` 폴더 | `C:\LeakTest\Logs\` | 날짜별 CSV 검사 로그 및 시스템 로그 저장 위치 |
### 프로그램 시작 시 자동 수행 동작
프로그램이 실행되면 아래 동작이 자동으로 수행됩니다:
<div style="border-left: 3px solid #007acc; padding-left: 20px; margin: 25px auto; max-width: 550px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; page-break-inside: avoid;">
<div style="margin-bottom: 15px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #007acc; border-radius: 50%;"></span>
<div style="font-weight: bold; color: #1e272e; font-size: 10pt;">프로그램 실행 시작</div>
</div>
<div style="margin-bottom: 12px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #007acc; border-radius: 50%;"></span>
<strong style="color: #007acc; font-size: 9.5pt;">1. DIO 보드 초기화</strong>
<span style="font-size: 8.5pt; color: #57606f; display: block; margin-top: 2px;">PCI-7432 보드를 확인하며, 실패 시 시뮬레이션 모드로 전환</span>
</div>
<div style="margin-bottom: 12px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #007acc; border-radius: 50%;"></span>
<strong style="color: #007acc; font-size: 9.5pt;">2. PC_ON 출력 신호 ON</strong>
<span style="font-size: 8.5pt; color: #57606f; display: block; margin-top: 2px;">외부 설비에 PC 가동 상태를 실시간 알림</span>
</div>
<div style="margin-bottom: 12px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #007acc; border-radius: 50%;"></span>
<strong style="color: #007acc; font-size: 9.5pt;">3. 설정값 로드</strong>
<span style="font-size: 8.5pt; color: #57606f; display: block; margin-top: 2px;">`config.xml` 파일로부터 통신 포트 및 판정 규격(SPEC) 로드</span>
</div>
<div style="margin-bottom: 12px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #007acc; border-radius: 50%;"></span>
<strong style="color: #007acc; font-size: 9.5pt;">4. Sentinel C28 연결</strong>
<span style="font-size: 8.5pt; color: #57606f; display: block; margin-top: 2px;">리크 센서 시리얼 통신 포트 연결 시도</span>
</div>
<div style="margin-bottom: 12px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #007acc; border-radius: 50%;"></span>
<strong style="color: #007acc; font-size: 9.5pt;">5. 4251 보드 연결</strong>
<span style="font-size: 8.5pt; color: #57606f; display: block; margin-top: 2px;">ID 판독 보드 시리얼 통신 포트 연결 시도</span>
</div>
<div style="margin-bottom: 12px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #007acc; border-radius: 50%;"></span>
<strong style="color: #007acc; font-size: 9.5pt;">6. 시험 프로세스 스레드 기동</strong>
<span style="font-size: 8.5pt; color: #57606f; display: block; margin-top: 2px;">LEFT 및 RIGHT 채널의 백그라운드 계측 제어 스레드 개시</span>
</div>
<div style="position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #2ed573; border-radius: 50%;"></span>
<strong style="color: #2ed573; font-size: 9.5pt;">7. 메인 화면(Home View) 표시</strong>
<span style="font-size: 8.5pt; color: #57606f; display: block; margin-top: 2px;">프로그램 UI 전체 활성화 및 측정 대기 상태 진입</span>
</div>
</div>
> **참고**: 시리얼 포트 연결에 실패하면 메인 화면의 **오류 메시지** 영역에 해당 오류가 표시됩니다. 이 경우 `Comm. Settings`에서 올바른 포트를 선택한 후 저장하면 자동으로 재연결됩니다.
--- ---
## 2.3 프로그램 로그인 및 오프라인 모드 설정 ## 2.3 프로그램 로그인 및 오프라인 모드 설정
@ -100,32 +50,41 @@
| **Variant 1** | `V1` | 세부 파생 모델 정보 1 | | **Variant 1** | `V1` | 세부 파생 모델 정보 1 |
| **Variant 2** | `V2` | 세부 파생 모델 정보 2 | | **Variant 2** | `V2` | 세부 파생 모델 정보 2 |
| **ID (Operator)** | `sa` | 작업자 ID | | **ID (Operator)** | `sa` | 작업자 ID |
| **PW (Password)** | `****` | 비밀번호 (DB 조회용) | | **PW (Password)** | `****` | 비밀번호 |
| **Line** | `EOL_01` | 생산 라인 번호 | | **Line** | `EOL_01` | 생산 라인 번호 |
| **Lot No** | `LOT001` | 로트 번호 | | **Lot No** | `LOT001` | 로트 번호 |
| **Jig No** | `JIG_L` | 지그 번호 | | **Jig No** | `JIG_L` | 지그 번호 |
> **참고 (자동완성)**: 각 필드에 마우스를 클릭하거나 포커스를 두면, 이전 로그인 이력이 팝업 메뉴 형식으로 나열되어 간편하게 자동 완성을 사용할 수 있습니다. ### 로그인 설정 관리 (LoginOptions.json)
### 로그인 방식 설정 (Database.ini) 프로그램 실행 폴더 내의 `LoginOptions.json` 파일을 편집하여 로그인 계정 정보(`loginAccounts`)를 관리하고, 로그인 화면의 옵션 목록(제조사, 모델, 라인, 지그 번호 등)을 추가하거나 변경할 수 있습니다.
프로그램 배포 폴더(`C:\LeakTest\Database.ini`)에 위치한 `Database.ini` 파일 설정에 따라 로그인 인증 방식이 달라집니다. 해당 파일이 누락된 경우 프로그램 최초 실행 시 기본 템플릿 정보와 함께 해당 경로에 자동으로 생성됩니다. 모든 설정 파일이 배포 폴더에 함께 위치하므로 경로 관리가 단순합니다. ```json
{
```ini "loginAccounts": [
; [데이터베이스 접속 상세 설정] {
Db_Server=[데이터베이스_서버_IP],[포트번호] "id": "su",
Db_Name=[데이터베이스_이름] "password": "su"
Db_User=[접속_계정_ID] }
Db_Password=[접속_비밀번호] ],
"makers": [
[Login] "AMO",
Procedure=dbo.CheckOperator "ABC"
ProcessName=EOL ],
OfflinePreview=false "models": [
"MODEL-1"
],
"lineValues": [
"LINE-1"
],
"jigNoValues": [
"JIG-1"
]
}
``` ```
- **온라인 인증 모드 (`OfflinePreview=false`)**: 지정된 데이터베이스 접속 정보(`Db_Server`, `Db_Name`, `Db_User`, `Db_Password`)를 기반으로 데이터베이스에 접속하여 사용자 계정의 유효성을 검증합니다. DB 서버 연결 실패나 미등록 사용자일 경우 로그인이 거부됩니다. - **계정 추가/변경**: `loginAccounts` 배열에 ID(`id`)와 비밀번호(`password`)를 추가하거나 수정하여 접속 가능한 계정을 설정합니다.
- **오프라인 테스트 모드 (`OfflinePreview=true`)**: 데이터베이스를 거치지 않고, 필수 입력 값을 채우면 즉시 로그인이 허용됩니다. 네트워크 연결이 안 된 시뮬레이션 및 테스트 환경에서 사용합니다. - **드롭다운 항목 변경**: `makers`, `models`, `lineValues`, `jigNoValues` 등의 배열 항목을 수정하면 로그인 화면의 선택 항목 목록이 자동으로 업데이트됩니다.
--- ---
@ -158,11 +117,12 @@ OfflinePreview=false
3. 모든 항목을 설정한 후 **`설정 저장`** 버튼을 클릭합니다. 3. 모든 항목을 설정한 후 **`설정 저장`** 버튼을 클릭합니다.
4. "통신 설정이 저장되었습니다." 메시지가 표시되면 설정 완료입니다. 4. "통신 설정이 저장되었습니다." 메시지가 표시되면 설정 완료입니다.
> **⚠️ 중요**: 저장 시 기존의 모든 시리얼 통신 연결이 해제되고, 새로운 설정으로 자동 재연결됩니다. 이 과정에서 진행 중인 시험이 있다면 중단될 수 있습니다.
> **참고**: COM 포트 목록에는 현재 PC에 물리적으로 연결된 시리얼 장치만 표시됩니다. 원하는 포트가 보이지 않으면: > **참고**: COM 포트 목록에는 현재 PC에 물리적으로 연결된 시리얼 장치만 표시됩니다. 원하는 포트가 보이지 않으면:
> - USB-시리얼 케이블이 PC에 연결되어 있는지 확인 > - USB-시리얼 케이블이 PC에 연결되어 있는지 확인
> - 장치 관리자에서 해당 포트의 드라이버가 정상 설치되었는지 확인 > - 장치 관리자에서 해당 포트의 드라이버가 정상 설치되었는지 확인
> - 다른 프로그램이 해당 포트를 점유하고 있지 않은지 확인 > - 다른 프로그램이 해당 포트를 점유하고 있지 않은지 확인
--- ---

81
leak_test_project/Manual/03_메인_화면.md

@ -14,16 +14,16 @@
## 3.2 상단 타이틀 바 ## 3.2 상단 타이틀 바
프로그램 최상단에 위치한 짙은 블랙 그레이 배경의 바입니다. 프로그램 최상단에 위치한 타이틀 영역입니다.
![[Pasted image 20260626093648.png]] ![[Pasted image 20260626093648.png]]
| 위치 | 요소 | 설명 | | 위치 | 요소 | 설명 |
|------|------|------| |------|------|------|
| 좌측 | **프로그램 제목 & 버전** | "Pressure Leak" (백색 볼드) 및 `v1.0.0 (Updated: 2026-06-05)` 표시 | | 좌측 | **프로그램 제목 & 버전** | `Pressure Leak System` 및 버전 정보 표시 |
| 중앙 | **현재 날짜/시간** | `yyyy-MM-dd [요일] HH:mm:ss` 형식, 1초 주기로 실시간 갱신 | | 중앙 | **현재 날짜/시간** | `yyyy-MM-dd [요일] HH:mm:ss` 형식, 1초 주기로 실시간 갱신 |
| 우측 | **작업 정보 배지** | 현재 로그인 상태에 따른 `작업자 ID`, `검사 모델`, `생산 라인` 정보를 배지로 시각화하여 현재 작업 상태 인지 | | 우측 | **작업 정보 배지** | 현재 로그인 `작업자 ID`, `검사 모델`, `생산 라인` 정보 표시 |
| 우측 | **로그아웃 버튼** | 현재 세션을 로그아웃하고, 다시 로그인 모달 창을 띄웁니다 | | 우측 | **로그아웃 버튼** | 현재 세션을 로그아웃하고 로그인 창을 호출합니다 |
| 최우측 | **창 제어 버튼** | 최소화(─) / 최대화·복원(□) / 종료(X)를 수행하는 윈도우 창 제어 아이콘 배치 | | 최우측 | **창 제어 버튼** | 최소화(─) / 최대화·복원(□) / 종료(X) 창 제어 아이콘 |
### 타이틀 바 조작 ### 타이틀 바 조작
@ -32,7 +32,7 @@
| 타이틀 바 **드래그** | 창 이동 | | 타이틀 바 **드래그** | 창 이동 |
| 타이틀 바 **더블 클릭** | 최대화 ↔ 일반 크기 전환 | | 타이틀 바 **더블 클릭** | 최대화 ↔ 일반 크기 전환 |
| **─** 버튼 클릭 | 작업표시줄로 최소화 | | **─** 버튼 클릭 | 작업표시줄로 최소화 |
| **□** 버튼 클릭 | 최대화 ↔ 일반 크기 전환 (아이콘도 변경됨) | | **□** 버튼 클릭 | 최대화 ↔ 일반 크기 전환 |
| **X** 버튼 클릭 | 종료 확인 대화상자 표시 → "예" 선택 시 종료 | | **X** 버튼 클릭 | 종료 확인 대화상자 표시 → "예" 선택 시 종료 |
--- ---
@ -44,66 +44,61 @@
### 각 채널의 구성 요소 (위에서 아래 순서) ### 각 채널의 구성 요소 (위에서 아래 순서)
#### ① 채널 타이틀 (Row 0) #### ① 채널 타이틀
- **LEFT LEAK TESTER** 또는 **RIGHT LEAK TESTER** - **LEFT LEAK TESTER** 또는 **RIGHT LEAK TESTER** 채널 구분을 명시합니다.
- 짙은 남색 배경에 백색 볼드 텍스트로 채널 구분을 명시합니다.
#### ② 시작/종료 시간 (Row 1) #### ② 시작/종료 시간
| 항목 | 설명 | | 항목 | 설명 |
|------|------| |------|------|
| 라벨 | `시작/종료` (회색 헤더 배경) | | 라벨 | `시작/종료` |
| 값 | `시작시간 / 종료시간` 형식 (예: `2026-05-08 10:30:15 / -` 또는 `2026-05-08 10:30:15 / 10:30:45`) | | 값 | `시작시간 / 종료시간` 형식 (예: `2026-05-08 10:30:15 / -` 또는 `2026-05-08 10:30:15 / 10:30:45`) |
| 갱신 시점 | 시험이 시작될 때 `시작시간 / -` 형태로 갱신되며, 시험 완료(DB 저장) 시점에 종료 시간이 함께 기록됩니다. | | 갱신 시점 | 시험이 시작될 때 `시작시간 / -` 형태로 갱신되며, 시험 완료(DB 저장) 시점에 종료 시간이 기록됩니다. |
#### ③ IC_SN / PCB_Barcode (Row 2~3) - **식별자 2행 분리 표시** #### ③ IC_SN / PCB_Barcode
| 항목 | 설명 | | 항목 | 설명 |
|------|------| |------|------|
| 라벨 | `IC_SN` / `PCB_Barcode` (각각 회색 헤더 배경, 개별 행으로 표시) | | 라벨 | `IC_SN` / `PCB_Barcode` |
| 값 | 각각 제품의 IC 일련번호 및 이에 매핑되는 PCB 바코드 고유 식별 정보 | | 값 | 제품의 IC 일련번호 및 이에 매핑되는 PCB 바코드 고유 식별 정보 |
| 데이터 소스 | **IC_SN**: 4251 보드로 제품 ID 센서에서 판독한 값<br>**PCB_Barcode**: 판독한 `IC_SN`을 기준으로 데이터베이스에서 조회한 바코드 값 (오프라인 모드 시 임시 데이터 주입) | | 데이터 소스 | **IC_SN**: 4251 보드로 제품 ID 센서에서 판독한 값<br>**PCB_Barcode**: 판독한 `IC_SN`을 기준으로 데이터베이스에서 조회한 바코드 값 |
| 갱신 시점 | 시험 시작 시 빈 값(`-`)으로 초기화, 판독 및 조회 완료 시 표시 | | 갱신 시점 | 시험 시작 시 빈 값(`-`)으로 초기화, 판독 및 조회 완료 시 표시 |
> **참고**: 텍스트 잘림 방지 및 가독성 향상을 위해 IC_SN과 PCB_Barcode를 별도의 행으로 나누어 표시합니다. 프로그램 창 크기를 소형으로 조절하더라도 텍스트가 잘리지 않고 정상 표시됩니다. > **참고**: IC_SN과 PCB_Barcode를 별도의 행으로 나누어 표시합니다.
#### ④ 측정값 + SPEC (Row 3) - **가장 큰 영역** #### ④ 측정값 + SPEC
좌측에 측정값, 우측에 SPEC 규격이 함께 표시됩니다. 좌측에 측정값, 우측에 SPEC 규격이 함께 표시됩니다.
**측정값 영역:** **측정값 영역:**
| 항목 | 설명 | | 항목 | 설명 |
|------|------| |------|------|
| 라벨 | `측정값` (볼드) | | 라벨 | `측정값` |
| 값 | Sentinel C28에서 수신한 누설량 (소수점 4자리, 예: `0.5234`) | | 값 | Sentinel C28에서 수신한 누설량 (소수점 4자리, 예: `0.5234`) |
| 단위 | `sccm` (우측 하단에 표시) | | 단위 | `sccm` (우측 하단에 표시) |
| 폰트 크기 | 원거리에서도 쉽게 식별할 수 있도록 대형 폰트로 강조 표시 |
| 색상 | 파란색 볼드 |
| 갱신 시점 | C28 센서 스트리밍 데이터 수신 시 실시간 갱신 | | 갱신 시점 | C28 센서 스트리밍 데이터 수신 시 실시간 갱신 |
**SPEC 영역 (우측):** **SPEC 영역 (우측):**
| 항목 | 설명 | | 항목 | 설명 |
|------|------| |------|------|
| `UL` | 상한 규격값 (예: `1.00`) 볼드 | | `UL` | 상한 규격값 (예: `1.00`) |
| `LL` | 하한 규격값 (예: `-1.00`) 볼드 | | `LL` | 하한 규격값 (예: `-1.00`) |
| 갱신 시점 | Parameters에서 저장 시 즉시 반영 | | 갱신 시점 | Parameters에서 저장 시 즉시 반영 |
#### ⑤ 판정 (Row 4) - **두 번째로 큰 영역** #### ⑤ 판정
| 항목 | 설명 | | 항목 | 설명 |
|------|------| |------|------|
| 라벨 | `판정` (볼드) | | 라벨 | `판정` |
| 값 | **OK** 또는 **NG** (대형 볼드) | | 값 | **OK** 또는 **NG** |
| OK 표시 | 녹색 텍스트 + 연녹색 배경으로 가시성 극대화 |
| NG 표시 | 빨간색 텍스트 + 연빨간색 배경으로 가시성 극대화 |
> **판정 기준**: `SPEC LL ≤ 측정값 ≤ SPEC UL`**OK**, 그 외 → **NG** > **판정 기준**: `SPEC LL ≤ 측정값 ≤ SPEC UL`**OK**, 그 외 → **NG**
#### ⑥ 진행 메시지 (Row 5) #### ⑥ 진행 메시지
| 항목 | 설명 | | 항목 | 설명 |
|------|------| |------|------|
| 라벨 | `진행 메시지` (연파랑 배경) | | 라벨 | `진행 메시지` |
| 값 | 현재 시험 단계를 나타내는 파란색 볼드 텍스트 | | 값 | 현재 시험 단계 메시지 표시 |
표시되는 메시지 목록: 표시되는 메시지 목록:
@ -119,31 +114,30 @@
| `ID 테스트 실패` | 수동 ID 테스트 실패 | | `ID 테스트 실패` | 수동 ID 테스트 실패 |
| `통신 대기 중` | 통신 설정 변경 후 재연결 대기 | | `통신 대기 중` | 통신 설정 변경 후 재연결 대기 |
#### ⑦ 오류 메시지 (Row 6) #### ⑦ 오류 메시지
| 항목 | 설명 | | 항목 | 설명 |
|------|------| |------|------|
| 라벨 | `오류 메시지` (연주황 배경, 갈색 텍스트) | | 라벨 | `오류 메시지` |
| 값 | 오류 내용 (빨간색 볼드). 스크롤 가능 | | 값 | 발생한 오류 상세 내용 표시 |
| 특징 | 읽기 전용 텍스트 박스, 텍스트 줄바꿈 자동, 세로 스크롤바 |
| 초기화 시점 | 새 시험 시작 시 자동 초기화 | | 초기화 시점 | 새 시험 시작 시 자동 초기화 |
--- ---
## 3.4 SPEC 교차 검증 경고 ## 3.4 SPEC 교차 검증 경고
프로그램의 판정 결과(SPEC UL/LL 기준)와 Sentinel C28 센서의 **자체 판정 결과**가 서로 다를 경우: 프로그램의 판정 결과(SPEC UL/LL 기준)와 Sentinel C28 센서의 자체 판정 결과가 서로 다를 경우:
1. 해당 채널의 **오류 메시지** 영역에 `SPEC 불일치 - 프로그램: OK, 센서: R` 등의 메시지가 표시됩니다. 1. 해당 채널의 **오류 메시지** 영역에 `SPEC 불일치 - 프로그램: OK, 센서: NG` 등의 메시지가 표시됩니다.
2. **팝업 경고 대화상자**가 표시됩니다: "프로그램 스팩과 센서의 스팩이 서로 맞지 않습니다." 2. **팝업 경고 대화상자**가 표시됩니다: "프로그램 스팩과 센서의 스팩이 서로 맞지 않습니다."
> **조치**: 센서 측의 SPEC 설정과 프로그램의 SPEC UL/LL 설정이 동일한지 확인하세요. > **조치**: 센서 측의 SPEC 설정과 프로그램의 SPEC UL/LL 설정이 동일한지 확인하세요. (통신설정 참조)
--- ---
## 3.5 하단 메뉴 바 ## 3.5 하단 메뉴 바
프로그램 최하단의 연회색 배경 영역입니다. 5개의 버튼이 좌측부터 수평으로 배치됩니다. 프로그램 하단 메뉴 영역입니다. 5개의 버튼이 수평으로 배치됩니다.
![[Pasted image 20260624104445.png]] ![[Pasted image 20260624104445.png]]
| 순서 | BUTTON | 부제 | 동작 | 동작 방식 | | 순서 | BUTTON | 부제 | 동작 | 동작 방식 |
@ -151,13 +145,8 @@
| 1 | **Data** | (측정 데이터) | 검사 기록 조회 화면 전환 | 토글 (다시 클릭 시 Home으로 복귀) | | 1 | **Data** | (측정 데이터) | 검사 기록 조회 화면 전환 | 토글 (다시 클릭 시 Home으로 복귀) |
| 2 | **Parameters** | (시험 설정) | 시험 설정 팝업 창 열기 | 모달 팝업 (설정 후 자동 닫힘) | | 2 | **Parameters** | (시험 설정) | 시험 설정 팝업 창 열기 | 모달 팝업 (설정 후 자동 닫힘) |
| 3 | **Comm. Settings** | (통신 설정) | 통신 설정 팝업 창 열기 | 모달 팝업 (설정 후 자동 닫힘) | | 3 | **Comm. Settings** | (통신 설정) | 통신 설정 팝업 창 열기 | 모달 팝업 (설정 후 자동 닫힘) |
| 4 | **ID Test (L)** | (좌측 ID 테스트) | 좌측 채널 센서 ID 수동 판독 | 즉시 실행 (파란색 텍스트) | | 4 | **ID Test (L)** | (좌측 ID 테스트) | 좌측 채널 센서 ID 수동 판독 | 즉시 실행 |
| 5 | **ID Test (R)** | (우측 ID 테스트) | 우측 채널 센서 ID 수동 판독 | 즉시 실행 (파란색 텍스트) | | 5 | **ID Test (R)** | (우측 ID 테스트) | 우측 채널 센서 ID 수동 판독 | 즉시 실행 |
### 버튼 스타일
- 배경: 연회색, 마우스 오버 시 시각적 피드백을 위해 약간 어둡게 변함
- 테두리: 회색
- 텍스트: 볼드 (부제는 일반 텍스트)
--- ---

43
leak_test_project/Manual/04_통신_설정.md

@ -16,45 +16,34 @@
## 4.2 4251 보드 설정 (좌측 영역) ## 4.2 4251 보드 설정 (좌측 영역)
| 항목 | UI 타입 | 선택 가능 값 | 기본값 | 설명 | | 항목 | 선택 가능 값 | 기본값 | 설명 |
|------|---------|-------------|--------|------| |------|-------------|--------|------|
| **4251 BaudRate** | 드롭다운 | 9600 / 19200 / 38400 / 115200 | `115200` | 4251 보드 통신 속도. 보드 설정과 일치해야 함 | | **4251 BaudRate** | 9600 / 19200 / 38400 / 115200 | `115200` | 4251 보드 통신 속도. 보드 설정과 일치해야 함 |
| **4251 Port** | 드롭다운 | 시스템 감지 COM 포트 목록 | `COM3` | 4251 보드가 연결된 시리얼 포트 | | **4251 Port** | 시스템 감지 COM 포트 목록 | `COM3` | 4251 보드가 연결된 시리얼 포트 |
## 4.3 Sentinel C28 설정 (우측 영역) ## 4.3 Sentinel C28 설정 (우측 영역)
| 항목 | UI 타입 | 선택 가능 값 | 기본값 | 설명 | | 항목 | 선택 가능 값 | 기본값 | 설명 |
|------|---------|-------------|--------|------| |------|-------------|--------|------|
| **Sensor BaudRate** | 드롭다운 | 9600 / 19200 / 38400 / 115200 | `9600` | C28 센서 통신 속도. 센서 설정과 일치해야 함 | | **Sensor BaudRate** | 9600 / 19200 / 38400 / 115200 | `9600` | C28 센서 통신 속도. 센서 설정과 일치해야 함 |
| **Sensor Port** | 드롭다운 | 시스템 감지 COM 포트 목록 | `COM1` | C28 센서가 연결된 시리얼 포트 | | **Sensor Port** | 시스템 감지 COM 포트 목록 | `COM1` | C28 센서가 연결된 시리얼 포트 |
## 4.4 스펙 불일치 알림 설정 (화면 하단 영역) ## 4.4 스펙 불일치 알림 설정 (화면 하단 영역)
| 항목 | UI 타입 | 선택 가능한 값 | 기본값 | 설명 | | 항목 | 선택 가능한 값 | 기본값 | 설명 |
|------|---------|---------------|--------|------| |------|---------------|--------|------|
| **스펙 불일치 알림 활성화** | 체크박스 | 체크(ON) / 체크 해제(OFF) | `체크(ON)` | 프로그램 판정과 센서 자체 판정이 맞지 않을 때의 알림 팝업 창 발생 여부 설정 | | **스펙 불일치 알림 활성화** | 체크(ON) / 체크 해제(OFF) | `체크(ON)` | 프로그램 판정과 센서 자체 판정이 맞지 않을 때의 알림 팝업 창 발생 여부 설정 |
> **동작 설명**: > **동작 설명**:
> - **ON (기본값)**: 판정이 불일치할 때 메인 화면의 오류 메시지 창에 로그가 기재됨과 동시에, 경고 대화상자("프로그램 스펙과 센서의 스펙이 서로 맞지 않습니다.") 팝업이 출력되어 작업자 인지를 강제합니다. > - **ON (기본값)**: 판정이 불일치할 때 메인 화면의 오류 메시지 창에 로그가 기재됨과 동시에, 경고 대화상자("프로그램 스펙과 센서의 스펙이 서로 맞지 않습니다.") 팝업이 출력되어 작업자 인지를 강제합니다.
> - **OFF**: 판정이 불일치하더라도 경고 팝업을 띄우지 않고, 화면의 오류 메시지 영역에만 텍스트로 기록을 남깁니다. (콘솔 로그 기록 등은 유지) > - **OFF**: 판정이 불일치하더라도 경고 팝업을 띄우지 않고, 화면의 오류 메시지 영역에만 텍스트로 기록을 남깁니다.
> - 이 설정은 `config.xml` 내의 `EnableSpecMismatchAlarm` 옵션에 영속 저장되어 프로그램 재작동 시에도 마지막 상태가 자동 유지됩니다.
## 4.5 버튼 설명 ## 4.5 버튼 설명
| 버튼 | 특징 | 동작 | | 버튼 | 동작 |
|------|------|------| |------|------|
| **설정 저장** | 녹색 계열 | config.xml에 저장 → 기존 연결 해제 → 새 설정으로 재연결 → "통신 설정이 저장되었습니다." 메시지 → 창 닫힘 | | **설정 저장** | config.xml에 저장 → 기존 연결 해제 → 새 설정으로 재연결 → "통신 설정이 저장되었습니다." 메시지 → 창 닫힘 |
| **닫기** | 회색 계열 | 변경 사항 저장하지 않고 창 닫기 | | **닫기** | 변경 사항 저장하지 않고 창 닫기 |
## 4.6 저장 시 내부 동작 순서
1. 현재 선택된 값을 `config.xml`에 저장 (스펙 불일치 알림 활성화 여부 포함)
2. 기존 Sentinel C28 시리얼 연결 해제
3. 기존 4251 보드 시리얼 연결 해제
4. 시험 프로세스 스레드 종료
5. 새 설정값으로 Sentinel C28 재연결
6. 새 설정값으로 4251 보드 재연결
7. 시험 프로세스 스레드 재시작
> **⚠️ 주의**: COM 포트를 동일하게 설정하면 충돌이 발생합니다. 4251 보드와 C28 센서는 반드시 다른 포트를 사용하세요. > **⚠️ 주의**: COM 포트를 동일하게 설정하면 충돌이 발생합니다. 4251 보드와 C28 센서는 반드시 다른 포트를 사용하세요.

8
leak_test_project/Manual/05_시험_설정.md

@ -16,10 +16,10 @@
## 5.2 설정 항목 ## 5.2 설정 항목
| 항목 | UI 타입 | 입력 형식 | 기본값 | 설명 | | 항목 | 입력 형식 | 기본값 | 설명 |
|------|---------|----------|--------|------| |------|----------|--------|------|
| **SPEC UL (sccm)** | 텍스트 입력 | 소수점 숫자 | `1.00` | 누설 상한 규격값. 이 값 이하일 때 OK | | **SPEC UL (sccm)** | 소수점 숫자 | `1.00` | 누설 상한 규격값. 이 값 이하일 때 OK |
| **SPEC LL (sccm)** | 텍스트 입력 | 소수점 숫자 | `-1.00` | 누설 하한 규격값. 이 값 이상일 때 OK | | **SPEC LL (sccm)** | 소수점 숫자 | `-1.00` | 누설 하한 규격값. 이 값 이상일 때 OK |
> **입력 팁**: 소수점 2자리까지 입력합니다 (예: `1.50`, `-0.80`). 정수도 입력 가능합니다 (예: `2`). > **입력 팁**: 소수점 2자리까지 입력합니다 (예: `1.50`, `-0.80`). 정수도 입력 가능합니다 (예: `2`).

94
leak_test_project/Manual/06_데이터_조회.md

@ -5,78 +5,64 @@
--- ---
하단 메뉴에서 **Data (측정 데이터)** 버튼을 클릭하면 표시됩니다. 다시 클릭하면 메인 화면으로 복귀합니다. 하단 메뉴에서 **Data (측정 데이터)** 버튼을 클릭하면 표시됩니다. 다시 클릭하면 메인 화면으로 복귀합니다.
![[Pasted image 20260624104558.png]]
## 6.1 화면 구성
로컬 PC의 CSV 데이터를 기준으로 조회됩니다. (데이터베이스는 서버 PC에서 조회)
## 6.1 화면 구성
![[Pasted image 20260624104558.png]]
## 6.2 필터 조건 상세 ## 6.2 필터 조건 상세
### 1행: 공통 기본 필터 ### 1행: 공통 기본 필터
| 항목 | UI 타입 | 기본값 | 설명 | | 항목 | 기본값 | 설명 |
|------|---------|--------|------| |------|--------|------|
| **조회 기간** | DatePicker (달력) x 2 | 오늘로부터 7일 전 ~ 오늘 | 조회 대상 날짜 범위를 설정합니다. (달력 확대 표시 적용) | | **조회 기간** | 오늘로부터 7일 전 ~ 오늘 | 조회 대상 날짜 범위를 설정합니다. |
| **판정 결과** | 드롭다운 ComboBox | `[전체]` / `OK` / `NG` | 판정 결과에 따른 필터링을 수행합니다. (기본값: 전체) | | **판정 결과** | `[전체]` / `OK` / `NG` | 판정 결과에 따른 필터링을 수행합니다. |
### 2행: 상세 검색 필터 (DB 스키마 필드 교차 검색) ### 2행: 상세 검색 필터 (DB 스키마 필드 교차 검색)
| 항목 | UI 타입 | 설명 | 기본값 | | 항목 | 설명 | 기본값 |
|------|---------|------|--------| |------|------|--------|
| **ID 검색** | TextBox (텍스트 입력) | `IC_SN` 또는 `PCB_Barcode` 열에 대한 부분 일치 (LIKE) 검색을 수행합니다. | (빈 값 = 필터 제외) | | **ID 검색** | `IC_SN` 또는 `PCB_Barcode` 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) |
| **작업자** | TextBox (텍스트 입력) | 작업자 ID (`Operator`) 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) | | **작업자** | 작업자 ID (`Operator`) 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) |
| **Lot No** | TextBox (텍스트 입력) | 로트 번호 (`Lot_No`) 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) | | **Lot No** | 로트 번호 (`Lot_No`) 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) |
| **모델** | TextBox (텍스트 입력) | 모델명 (`Model`) 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) | | **모델** | 모델명 (`Model`) 열에 대한 부분 일치 검색을 수행합니다. | (빈 값 = 필터 제외) |
## 6.3 조회 및 취소 버튼 ## 6.3 조회 및 취소 버튼
| 버튼 | 색상 | 동작 | | 버튼 | 동작 |
|------|------|------| |------|------|
| **Search** | 파란색 계열 | 설정된 필터 조건으로 로컬 로그 CSV 백업 파일을 검색하여 그리드에 표시합니다. (시스템 안정성을 위해 데이터베이스 직접 조회 대신 로컬 백업 파일을 조회하도록 설계되었습니다.) | | **Search** | 설정된 필터 조건으로 로컬 로그 CSV 백업 파일을 검색하여 그리드에 표시합니다. |
| **Cancel (취소)** | 빨간색 계열 | 조회 중일 때 로딩 화면 내부에 나타나며, 진행 중인 파일 검색 작업을 중단하고 이전 화면으로 복귀합니다. | | **Cancel (취소)** | 조회 중일 때 로딩 화면 내부에 나타나며, 진행 중인 파일 검색 작업을 중단하고 이전 화면으로 복귀합니다. |
### Search 버튼 동작 상세 ### Search 버튼 동작 상세
1. 지정된 조회 기간에 해당하는 일별 로그 CSV 파일만 조회하여 검색을 수행합니다. (불필요한 파일 스캔을 제한하여 검색 속도를 향상시켰습니다.) 1. 지정된 조회 기간에 해당하는 일별 로그 CSV 파일만 조회하여 검색을 수행합니다.
2. 검색 조건(판정, ID, 작업자, Lot No, 모델)에 맞는 데이터를 인메모리 부분 일치 방식으로 검색합니다. 2. 검색 조건(판정, ID, 작업자, Lot No, 모델)에 맞는 데이터를 부분 일치 방식으로 검색합니다.
3. 검색 결과가 존재하지 않을 경우 "해당 조건의 데이터가 없습니다." 알림을 표시합니다. 3. 검색 결과가 존재하지 않을 경우 "해당 조건의 데이터가 없습니다." 알림을 표시합니다.
### 조회 중 로딩 및 Cancel 버튼 동작 상세
1. Search 버튼 클릭 시 화면 전체에 "Searching Logs..." 라는 반투명 오버레이가 활성화되어 검색이 진행 중임을 나타냅니다.
2. 검색이 지연될 경우 로딩 오버레이의 **Cancel (취소)** 버튼을 누르면 즉시 조회가 중단되고, "조회가 취소되었습니다." 메시지 박스 팝업 후 자동으로 메인 화면으로 복귀합니다.
## 6.4 데이터 조회 결과 표(그리드) 항목 안내 ## 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` 빨강 볼드 강조) |
### 표(그리드) 스타일
- 격자선: 수평 및 수직 연회색 격자선을 표시합니다.
- 교대 행 배경: 홀수 행은 흰색, 짝수 행은 연회색 배경을 적용하여 가독성을 높였습니다.
- 선택된 행: 연파란색 배경에 파란색 텍스트로 강조합니다.
- 컬럼 헤더 정렬: 헤더 클릭 시 해당 열 기준으로 오름차순 또는 내림차순 정렬이 가능합니다. (컬럼 순서 변경은 제한됩니다.)
- 격자 유지: 조회된 데이터 개수가 50개 미만이더라도 화면 구성을 유지하기 위해 나머지 행은 빈 칸으로 채워져 표시됩니다.
## 6.5 화면 닫기
| 방법 | 설명 |
|------|------| |------|------|
| 하단 **Close** 버튼 클릭 | 메인 화면으로 복귀합니다. | | **IC_SN** | 제품 고유 IC 시리얼 번호 |
| 하단 메뉴 **Data** 버튼 재클릭 | 토글 동작을 통해 메인 화면으로 복귀합니다. | | **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`) |
### 표(그리드) 기능
- 컬럼 정렬: 헤더 클릭 시 해당 열 기준으로 오름차순 또는 내림차순 정렬이 가능합니다.
--- ---
[← 이전: 시험 설정](05_시험_설정.md) | [다음: 자동 시험 프로세스 →](07_시험_프로세스.md) [← 이전: 시험 설정](05_시험_설정.md) | [다음: 자동 시험 프로세스 →](07_시험_프로세스.md)

112
leak_test_project/Manual/07_시험_프로세스.md

@ -10,101 +10,101 @@
## 7.2 전체 프로세스 흐름도 ## 7.2 전체 프로세스 흐름도
<div style="border-left: 3px solid #1e3799; padding-left: 20px; margin: 25px auto; max-width: 600px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; page-break-inside: avoid; font-size: 9pt; line-height: 1.5;"> <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 --> <!-- Trigger -->
<div style="margin-bottom: 15px; position: relative;"> <div style="margin-bottom: 10px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #1e3799; border-radius: 50%;"></span> <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; font-size: 8pt; color: #747d8c;">(좌/우 시작 신호 입력 시)</span></div> <div style="font-weight: bold; color: #2f3542;">시작 신호 감지 <span style="font-weight: normal; color: #747d8c;">(좌/우 시작 신호)</span></div>
</div> </div>
<!-- Semaphore --> <!-- Semaphore -->
<div style="margin-bottom: 20px; position: relative; background-color: #f1f2f6; padding: 10px; border-radius: 4px; border-left: 3px solid #f6b93b;"> <div style="margin-bottom: 10px; padding: 6px 8px; border-radius: 4px; border-left: 3px solid #f6b93b;">
<span style="position: absolute; left: -26px; top: 14px; width: 10px; height: 10px; background-color: #f6b93b; border-radius: 50%;"></span> <strong style="color: #d97706;">중복 실행 방지 대기</strong>
<strong>중복 실행 방지 대기</strong> <div style="color: #57606f; margin-top: 2px;">
<div style="font-size: 8.5pt; color: #57606f; margin-top: 3px;"> • 타 채널 시험 중 시 "대기중" 메시지 및 순서 대기<br>
• 다른 채널이 시험 중인 경우: "대기중" 메시지를 표시하며 순서 대기<br> • 시험 가능 시 개시 (좌/우 동시 시험 방지)
• 시험 가능 상태인 경우: 다음 단계 진행 (좌/우 채널 동시 시험 방지)
</div> </div>
</div> </div>
<!-- Step 1 --> <!-- Step 1 -->
<div style="margin-bottom: 15px; position: relative;"> <div style="margin-bottom: 10px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #1e3799; border-radius: 50%;"></span> <span style="position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;"></span>
<strong style="color: #1e3799;">1단계: 시험 시작 (초기화)</strong> <strong style="color: #1e3799;">1단계: 시험 시작 (초기화)</strong>
<div style="font-size: 8.5pt; color: #57606f; margin-top: 3px;"> <div style="color: #57606f; margin-top: 2px;">
• 합격/불합격 신호 출력 초기화 (OFF)<br> • OK/NG 판정 출력 초기화 (OFF)<br>
• 메인 화면 결과 표시 초기화 및 시작 시간 갱신<br> • 메인 화면 결과 표시 초기화 및 시작 시간 갱신<br>
• 누설 센서 수신 데이터 초기화 • 누설 센서 수신 데이터 초기화
</div> </div>
</div> </div>
<!-- Step 2 --> <!-- Step 2 -->
<div style="margin-bottom: 15px; position: relative;"> <div style="margin-bottom: 10px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #1e3799; border-radius: 50%;"></span> <span style="position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;"></span>
<strong style="color: #1e3799;">2단계: 제품 ID 판독</strong> <strong style="color: #1e3799;">2단계: 제품 ID 판독</strong>
<div style="font-size: 8.5pt; color: #57606f; margin-top: 3px;"> <div style="color: #57606f; margin-top: 2px;">
• 판독 장치(4251 보드)를 통해 제품 ID 센서에서 16자리 ID 판독<br> • 4251 보드를 통해 16자리 ID 판독<br>
<span style="color: #ff4757; font-weight: bold;">[실패 시]</span> "ID 읽기 실패" 오류 출력 후 시험이 종료되며 결과는 기록 및 저장에서 제외됩니다. <span style="color: #ff4757; font-weight: bold;">[실패 시]</span> "ID 읽기 실패" 출력 후 기록/저장 제외 종료
</div> </div>
</div> </div>
<!-- Step 3 --> <!-- Step 3 -->
<div style="margin-bottom: 15px; position: relative; background-color: #f8f9fa; padding: 10px; border-radius: 4px; border-left: 3px solid #1e3799;"> <div style="padding: 6px 8px; border-radius: 4px; border-left: 3px solid #1e3799;">
<span style="position: absolute; left: -26px; top: 14px; width: 10px; height: 10px; background-color: #1e3799; border-radius: 50%;"></span> <strong style="color: #1e3799;">3단계: PCB 바코드 DB 조회</strong>
<strong style="color: #1e3799;">3단계: PCB 바코드 데이터베이스 조회</strong> <div style="color: #57606f; margin-top: 2px;">
<div style="font-size: 8.5pt; color: #57606f; margin-top: 3px;"> • DB에서 `IC_SN` 매칭 `PCB_Barcode` 조회 (5초 제한)<br>
• 데이터베이스에서 제품 ID(`IC_SN`)에 매칭되는 `PCB_Barcode` 조회 (5초 대기 시간 초과 제한)<br> <span style="color: #ff4757; font-weight: bold;">[실패/누락 시]</span> "바코드 매핑 실패" 출력 후 즉시 종료
<span style="color: #ff4757; font-weight: bold;">[실패/누락 시]</span> "바코드 매핑 실패" 오류 출력 후 즉시 종료되며 결과는 기록 및 저장에서 제외됩니다. </div>
</div> </div>
</div> </div>
<!-- 우측 컬럼: 4단계 ~ 종료 -->
<div style="border-left: 2px solid #1e3799; padding-left: 14px;">
<!-- Step 4 --> <!-- Step 4 -->
<div style="margin-bottom: 15px; position: relative;"> <div style="margin-bottom: 10px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #1e3799; border-radius: 50%;"></span> <span style="position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;"></span>
<strong style="color: #1e3799;">4단계: 누설 시험 수행 (계측)</strong> <strong style="color: #1e3799;">4단계: 누설 시험 수행 (계측)</strong>
<div style="font-size: 8.5pt; color: #57606f; margin-top: 3px;"> <div style="color: #57606f; margin-top: 2px;">
• 화면에 "LEAK 시험중" 표시<br> • "LEAK 시험중" 표시 & C28 센서 수신 대기 (최대 30초)<br>
• 누설 센서(Sentinel C28)로부터 측정 결과 수신 대기 (최대 30초)<br> <span style="color: #ff4757; font-weight: bold;">[초과 시]</span> 통신 초과 NG 자동 종료 (측정값 9.9999 DB 저장)
<span style="color: #ff4757; font-weight: bold;">[시간 초과 시]</span> 통신 시간 초과 오류 발생 및 불합격(NG) 판정으로 자동 종료 (측정값 9.9999로 데이터베이스에 저장)
</div> </div>
</div> </div>
<!-- Step 5 --> <!-- Step 5 -->
<div style="margin-bottom: 15px; position: relative;"> <div style="margin-bottom: 10px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #1e3799; border-radius: 50%;"></span> <span style="position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;"></span>
<strong style="color: #1e3799;">5단계: 합격 판정</strong> <strong style="color: #1e3799;">5단계: 합격 판정</strong>
<div style="font-size: 8.5pt; color: #57606f; margin-top: 3px;"> <div style="color: #57606f; margin-top: 2px;">
• 규격 하한값 ≤ 측정값 ≤ 규격 상한값 이면 **OK (합격)**, 범위를 벗어나면 **NG (불합격)**로 판정합니다. • 규격 하한값 ≤ 측정값 ≤ 규격 상한값 범위 내 OK, 이외 NG
</div> </div>
</div> </div>
<!-- Step 6 --> <!-- Step 6 -->
<div style="margin-bottom: 15px; position: relative;"> <div style="margin-bottom: 10px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #1e3799; border-radius: 50%;"></span> <span style="position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;"></span>
<strong style="color: #1e3799;">6단계: 판정 스펙 교차 검증</strong> <strong style="color: #1e3799;">6단계: 판정 스펙 교차 검증</strong>
<div style="font-size: 8.5pt; color: #57606f; margin-top: 3px;"> <div style="color: #57606f; margin-top: 2px;">
• 프로그램 판정과 센서 자체 판정을 비교 분석합니다.<br> • SW 판정과 센서 자체 판정 비교 분석 (상이 시 경고 창 표시)
• 판정이 서로 다를 경우 화면에 경고 창을 표시합니다. (통신 설정에서 알림 창 표시를 끌 수 있습니다.)
</div> </div>
</div> </div>
<!-- Step 7 --> <!-- Step 7 -->
<div style="margin-bottom: 20px; position: relative;"> <div style="margin-bottom: 10px; position: relative;">
<span style="position: absolute; left: -26px; top: 4px; width: 10px; height: 10px; background-color: #1e3799; border-radius: 50%;"></span> <span style="position: absolute; left: -19px; top: 4px; width: 8px; height: 8px; border-radius: 50%;"></span>
<strong style="color: #1e3799;">7단계: 결과 출력 및 저장</strong> <strong style="color: #1e3799;">7단계: 결과 출력 및 저장</strong>
<div style="font-size: 8.5pt; color: #57606f; margin-top: 3px;"> <div style="color: #57606f; margin-top: 2px;">
• 로컬 CSV 백업 파일 기록 및 데이터베이스에 검사 결과 저장<br> • 로컬 CSV 및 DB 저장, 외부 설비 출력 신호(OK/NG) 전송<br>
• 판정 결과에 따라 외부 설비에 출력 신호(OK 또는 NG 포트) 전송<br> • 메인 화면 결과 및 "시험 완료" 표시
• 메인 화면에 최종 측정값 및 판정 출력 ("시험 완료" 표시)
</div> </div>
</div> </div>
<!-- End --> <!-- End -->
<div style="position: relative; background-color: #f1fff5; padding: 10px; border-radius: 4px; border-left: 3px solid #2ed573;"> <div style="padding: 6px 8px; border-radius: 4px; border-left: 3px solid #2ed573;">
<span style="position: absolute; left: -26px; top: 14px; width: 10px; height: 10px; background-color: #2ed573; border-radius: 50%;"></span>
<strong style="color: #2f855a;">순서 잠금 해제</strong> <strong style="color: #2f855a;">순서 잠금 해제</strong>
<div style="font-size: 8.5pt; color: #57606f; margin-top: 3px;"> <div style="color: #57606f; margin-top: 2px;">
• 시험 종료 후 순서 대기가 해제되며, 대기 중이던 다른 채널이 0.35초 대기 후 자동으로 시험을 개시합니다. • 순서 대기 해제, 대기 중 타 채널 0.35초 후 자동 시험 개시
</div>
</div> </div>
</div> </div>
</div> </div>
@ -119,8 +119,6 @@
| 양쪽 채널 동시 신호 발생 | 먼저 순서를 획득한 채널이 시험을 진행하며, 다른 채널은 "대기중"을 표시하며 대기합니다. | | 양쪽 채널 동시 신호 발생 | 먼저 순서를 획득한 채널이 시험을 진행하며, 다른 채널은 "대기중"을 표시하며 대기합니다. |
| 시험 완료 후 | 대기 중이던 채널이 자동으로 시험을 시작합니다. (안정화를 위해 0.35초의 대기 시간이 적용됩니다.) | | 시험 완료 후 | 대기 중이던 채널이 자동으로 시험을 시작합니다. (안정화를 위해 0.35초의 대기 시간이 적용됩니다.) |
> **참고**: 하드웨어 통신 안정화를 위해 이전 채널의 시험 종료 후 **0.35초의 여유 시간**이 자동으로 적용됩니다.
## 7.4 시간 초과 (타임아웃) 처리 ## 7.4 시간 초과 (타임아웃) 처리
누설 센서에서 30초 이내에 계측 결과 응답이 없으면 다음과 같이 처리됩니다. 누설 센서에서 30초 이내에 계측 결과 응답이 없으면 다음과 같이 처리됩니다.
@ -132,8 +130,6 @@
## 7.5 제품 ID 및 PCB 바코드 연동 예외 처리 ## 7.5 제품 ID 및 PCB 바코드 연동 예외 처리
데이터 일관성과 무결성을 확보하기 위해 제품 식별 정보가 불완전한 상태에서의 데이터 저장을 차단하는 안전 검증 절차가 작동합니다.
### 1. 제품 ID(IC_SN) 판독 실패 시 ### 1. 제품 ID(IC_SN) 판독 실패 시
- **동작**: 제품 ID 판독 장치(4251 보드)로부터 16자리 ID 취득을 실패하는 경우 진행 메시지에 `"ID 읽기 실패"`를 표시하고, 해당 채널의 NG 물리 신호를 즉시 출력합니다. - **동작**: 제품 ID 판독 장치(4251 보드)로부터 16자리 ID 취득을 실패하는 경우 진행 메시지에 `"ID 읽기 실패"`를 표시하고, 해당 채널의 NG 물리 신호를 즉시 출력합니다.
- **저장 제한**: 이 경우에는 로컬 CSV 로그 기록 및 데이터베이스 저장을 **완전히 건너뜁니다**. - **저장 제한**: 이 경우에는 로컬 CSV 로그 기록 및 데이터베이스 저장을 **완전히 건너뜁니다**.
@ -156,14 +152,6 @@
하단 메뉴의 **ID Test (L)** 또는 **ID Test (R)** 버튼을 사용하면 시험 시작 신호 없이 센서 ID 판독 동작만 단독으로 수행할 수 있습니다. 하단 메뉴의 **ID Test (L)** 또는 **ID Test (R)** 버튼을 사용하면 시험 시작 신호 없이 센서 ID 판독 동작만 단독으로 수행할 수 있습니다.
### 실행 흐름
1. 중복 방지 잠금 획득 (다른 채널이 시험 중인 경우 대기)
2. 결과 표시 초기화 및 0.5초 대기
3. "센서 정보 읽는 중" 메시지 표시 후 ID 판독 시작
4. 성공 시: 판독된 ID 표시 및 "ID 테스트 완료" 메시지 표시
5. 실패 시: ID 영역에 "-" 표시 및 "ID 테스트 실패" 메시지 표시
6. 잠금 해제
> **용도**: 장비 설치 후 통신 상태 확인 및 디버깅 시 사용합니다. 실제 누설 시험(압력 계측)은 수행하지 않습니다. > **용도**: 장비 설치 후 통신 상태 확인 및 디버깅 시 사용합니다. 실제 누설 시험(압력 계측)은 수행하지 않습니다.
## 7.8 측정 판정 및 저장 기준 ## 7.8 측정 판정 및 저장 기준

61
leak_test_project/Manual/08_로그_관리.md

@ -17,10 +17,6 @@
### CSV 헤더 및 컬럼 ### CSV 헤더 및 컬럼
```
IC_SN,PCB_Barcode,Maker,Model,Variant_1,Variant_2,Operator,Production_Date,Line,Lot_No,Jig_No,Channel,Spec_UL,Spec_LL,Leak_Value,Result
```
| 컬럼 | 예시 | 설명 | | 컬럼 | 예시 | 설명 |
|------|------|------| |------|------|------|
| `IC_SN` | `260508A00123B01C` | 제품 고유 시리얼 번호 (PK/FK) | | `IC_SN` | `260508A00123B01C` | 제품 고유 시리얼 번호 (PK/FK) |
@ -40,16 +36,7 @@ IC_SN,PCB_Barcode,Maker,Model,Variant_1,Variant_2,Operator,Production_Date,Line,
| `Leak_Value` | `0.5234` | 측정된 릭 측정값 (소수점 4자리) | | `Leak_Value` | `0.5234` | 측정된 릭 측정값 (소수점 4자리) |
| `Result` | `OK` | 최종 판정 결과 (OK 또는 NG) | | `Result` | `OK` | 최종 판정 결과 (OK 또는 NG) |
### CSV 예시 > **참고**: 타임아웃 발생 시에도 측정값 `9.9999`, 판정 `NG`로 로그에 기록됩니다.
```csv
IC_SN,PCB_Barcode,Maker,Model,Variant_1,Variant_2,Operator,Production_Date,Line,Lot_No,Jig_No,Channel,Spec_UL,Spec_LL,Leak_Value,Result
260508A00123B01C,260508A00123B01C,Hyundai,NE1aW,PT,SENSOR,op001,2026-05-08 10:30:15,L1,LOT001,JIG01,LEFT,1.00,-1.00,0.5234,OK
260508A00456D02E,260508A00456D02E,Hyundai,NE1aW,PT,SENSOR,op002,2026-05-08 10:30:45,L1,LOT001,JIG01,RIGHT,1.00,-1.00,1.2000,NG
```
> **참고**: 타임아웃 발생 시에도 측정값 `0.0000`, 판정 `NG`로 로그에 기록됩니다.
> **참고**: CSV 값에 쉼표, 따옴표, 줄바꿈이 포함된 경우 자동으로 이스케이프 처리됩니다.
--- ---
@ -68,13 +55,6 @@ IC_SN,PCB_Barcode,Maker,Model,Variant_1,Variant_2,Operator,Production_Date,Line,
[HH:mm:ss.fff] [TAG] 메시지 내용 [HH:mm:ss.fff] [TAG] 메시지 내용
``` ```
### 예시
```
[10:30:00.123] [SYSTEM] 프로그램 시작
[10:30:01.456] [COMM] Sentinel C28 포트 연결 성공 (COM1)
[10:35:15.789] [ERROR] Sentinel C28 통신 타임아웃
```
--- ---
## 8.3 설정 파일 ## 8.3 설정 파일
@ -120,28 +100,16 @@ IC_SN,PCB_Barcode,Maker,Model,Variant_1,Variant_2,Operator,Production_Date,Line,
| **수정** | 메모장 등의 텍스트 에디터를 통해 연결 주소 및 프로시저 정보 직접 수정 | | **수정** | 메모장 등의 텍스트 에디터를 통해 연결 주소 및 프로시저 정보 직접 수정 |
```ini ```ini
; =====================================================================
; Leak Test System - 데이터베이스 및 로그인 설정 파일 (Database.ini)
; =====================================================================
; [데이터베이스 접속 상세 설정]
; Db_Server : 중앙 MSSQL 데이터베이스 서버의 IP 주소 또는 호스트명
; Db_Name : 검사 데이터를 저장할 대상 데이터베이스 이름
; Db_User : 데이터베이스 접속 계정 ID (예: sa)
; Db_Password: 데이터베이스 접속 계정의 비밀번호
Db_Server=127.0.0.1, 1433 Db_Server=127.0.0.1, 1433
Db_Name=Test_DB Db_Name=Test_DB
Db_User=db_user Db_User=db_user
Db_Password=db_password Db_Password=db_password
[Login] [Login]
; Procedure: 로그인 검증에 사용할 DB 저장 프로시저명입니다. (공란일 경우 기본 테이블 조회 쿼리 작동)
Procedure=dbo.CheckOperator Procedure=dbo.CheckOperator
; ProcessName: 로그인 검증 시 전달할 공정 이름입니다.
ProcessName=EOL ProcessName=EOL
; OfflinePreview: 오프라인 모드 활성화 여부 (true = DB 연결 없이 로그인 통과, false = 실제 DB 인증)
OfflinePreview=false OfflinePreview=false
``` ```
@ -155,8 +123,6 @@ OfflinePreview=false
| `ProcessName` | EOL | 검증 공정명 | | `ProcessName` | EOL | 검증 공정명 |
| `OfflinePreview` | false | true 시 DB 연결 없이 로그인 즉시 성공 (오프라인 모드) | | `OfflinePreview` | false | true 시 DB 연결 없이 로그인 즉시 성공 (오프라인 모드) |
> **SSL 인증 오류 방지**: DB 연결 시 SSL 인증서 신뢰 오류가 발생하는 환경을 방지하기 위해 프로그램 내부에서 자동으로 `TrustServerCertificate=True;` 옵션을 연결 문자열 끝에 추가하여 안정적인 동작을 보장합니다.
### LoginOptions.json / LoginHistory.json ### LoginOptions.json / LoginHistory.json
| 항목 | 내용 | | 항목 | 내용 |
@ -178,29 +144,6 @@ OfflinePreview=false
| **생성** | 최초 실행 시 자동 생성 | | **생성** | 최초 실행 시 자동 생성 |
| **수정** | 일반적으로 수정 불필요 (하드웨어 변경 시에만) | | **수정** | 일반적으로 수정 불필요 (하드웨어 변경 시에만) |
```ini
[DIO]
CompanyName=ADLink
BoardCnt=1
[BOARD_1]
BoardType=PCI_7432
BoardNumber=0
[BOARD_1_IN]
0=LEFT_START,1,좌측 시험 시작 신호
1=RIGHT_START,1,우측 시험 시작 신호
[BOARD_1_OUT]
0=LEFT_OK,1,좌측 합격 출력
1=RIGHT_OK,1,우측 합격 출력
2=PC_ON,1,PC 가동 신호
3=LEFT_NG,1,좌측 불합격 출력
4=RIGHT_NG,1,우측 불합격 출력
```
**INI 포맷 설명**: `비트인덱스=신호명,활성여부,설명`
--- ---
## 8.4 파일 관리 주의사항 ## 8.4 파일 관리 주의사항
@ -214,6 +157,8 @@ BoardNumber=0
--- ---
<div class="page-break"></div>
## 8.5 데이터베이스 데이터 관리 (dbo.EOL) ## 8.5 데이터베이스 데이터 관리 (dbo.EOL)
매 시험 완료 시 검사 결과 및 로그인 정보가 데이터베이스에 실시간으로 저장(MERGE/UPSERT)됩니다. 매 시험 완료 시 검사 결과 및 로그인 정보가 데이터베이스에 실시간으로 저장(MERGE/UPSERT)됩니다.

37
leak_test_project/Manual/09_오류_대응.md

@ -36,13 +36,8 @@
프로그램 판정과 센서 판정이 불일치할 때, 통신 설정 화면의 **`스펙 불일치 알림 활성화`** 옵션이 켜져(ON) 있는 경우 팝업 경고가 표시됩니다: 프로그램 판정과 센서 판정이 불일치할 때, 통신 설정 화면의 **`스펙 불일치 알림 활성화`** 옵션이 켜져(ON) 있는 경우 팝업 경고가 표시됩니다:
```
[!] SPEC 교차 검증 경고
"프로그램 스팩과 센서의 스팩이 서로 맞지 않습니다."
[확인]
```
- 만약 이 옵션을 **해제(OFF)**한 경우, 이 팝업 경고 대화상자는 나타나지 않으며, 메인 화면 하단의 **오류 메시지** 텍스트 박스에만 불일치 로그가 기록됩니다. - 만약 이 옵션을 **해제(OFF)**한 경우, 이 팝업 경고 대화상자는 나타나지 않으며, 메인 화면 하단의 **오류 메시지** 텍스트 박스에만 불일치 로그가 기록됩니다.
- 이 경고는 검사 자체를 중단하지는 않으며, **프로그램의 판정 결과**가 최종 DB 및 로컬 로그 기록에 사용됩니다. - 이 경고는 검사 자체를 중단하지는 않으며, **프로그램의 판정 결과**가 최종 DB 및 로컬 로그 기록에 사용됩니다.
--- ---
@ -75,36 +70,8 @@
### 종료 방법 ### 종료 방법
1. 상단 타이틀 바 우측의 **X (빨간색)** 버튼을 클릭합니다. 1. 상단 타이틀 바 우측의 **X (빨간색)** 버튼을 클릭합니다.
2. 종료 확인 대화상자가 표시됩니다: 2. 종료 확인 대화상자가 표시됩니다
```
[?] 종료 확인
"프로그램을 종료하시겠습니까?"
[예] [아니오]
```
3. **"예"**를 선택하면 종료, **"아니오"**를 선택하면 취소됩니다. 3. **"예"**를 선택하면 종료, **"아니오"**를 선택하면 취소됩니다.
### 종료 시 자동 처리 사항
아래 순서로 자동 정리가 수행됩니다:
| 순서 | 처리 내용 |
|------|----------|
| 1 | 시험 프로세스 스레드 종료 (좌/우 모두) |
| 2 | 대기 중인 순서 잠금 해제 |
| 3 | 디지털 입출력(DIO) 신호 감지 중단 |
| 4 | 누설 센서 신호 감지 중단 |
| 5 | Sentinel C28 시리얼 통신 연결 해제 |
| 6 | 4251 보드 시리얼 통신 연결 해제 |
| 7 | DIO `PC_ON` 출력 **OFF** |
| 8 | DIO 보드 자원 해제 |
| 9 | 타이틀 바 시계 타이머 정지 |
> **⚠️ 주의**: 시험 진행 중에 프로그램을 종료하면 진행 중인 시험이 **즉시 중단**됩니다. 해당 시험의 결과는 로그에 기록되지 않을 수 있습니다. 가급적 시험이 완료된 후 종료하세요.
> **참고**: 프로그램 종료 시 현재 설정값은 이미 `config.xml`에 저장되어 있으므로 별도로 저장할 필요가 없습니다. 다음 실행 시 마지막 설정이 자동으로 로드됩니다.
--- ---
[← 이전: 로그 관리](08_로그_관리.md) | [메뉴얼 목차로 돌아가기](사용자_메뉴얼.md) [← 이전: 로그 관리](08_로그_관리.md) | [메뉴얼 목차로 돌아가기](사용자_메뉴얼.md)

903
leak_test_project/Manual/Manual_Merged.html

File diff suppressed because it is too large

787
leak_test_project/Manual/Manual_Merged.md

File diff suppressed because it is too large

8
leak_test_project/Manual/build_pdf.py

@ -29,7 +29,13 @@ def clean_markdown_content(filename, content, link_mapping):
# 3. 마크다운 파일 참조 링크 -> 로컬 앵커로 치환 # 3. 마크다운 파일 참조 링크 -> 로컬 앵커로 치환
for md_file, anchor in link_mapping.items(): for md_file, anchor in link_mapping.items():
content = content.replace(f"({md_file})", f"({anchor})") # HTML href 속성 치환 (서브 앵커 지원)
pattern_href = r'href="' + re.escape(md_file) + r'(?:#([^"]+))?"'
content = re.sub(pattern_href, lambda m: f'href="#{m.group(1)}"' if m.group(1) else f'href="{anchor}"', content)
# 마크다운 (file.md) 또는 (file.md#anchor) 링크 치환
pattern_md = r'\(' + re.escape(md_file) + r'(?:#([^)]+))?\)'
content = re.sub(pattern_md, lambda m: f'(#{m.group(1)})' if m.group(1) else f'({anchor})', content)
# 4. 각 파일 시작 전에 페이지 나누기 추가 (표지 파일은 제외) # 4. 각 파일 시작 전에 페이지 나누기 추가 (표지 파일은 제외)
is_cover = "사용자" in filename or "메뉴얼" in filename is_cover = "사용자" in filename or "메뉴얼" in filename

117
leak_test_project/Manual/pdf_style.css

@ -185,7 +185,7 @@ img {
/* 내비게이션 숨김 (인쇄 시) */ /* 내비게이션 숨김 (인쇄 시) */
.nav-link, .nav-links, .back-to-toc, .manual-nav, .nav-link, .nav-links, .back-to-toc, .manual-nav,
a[href$=".md"] { a[href$=".md"]:not(.toc-title a) {
display: none !important; display: none !important;
} }
@ -211,3 +211,118 @@ a:hover {
color: #24292e; color: #24292e;
margin-right: 4px; 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;
}

75
leak_test_project/Manual/사용자_메뉴얼.md

@ -1,26 +1,57 @@
# Pressure Leak Inspect System - 사용자 메뉴얼 <div class="page-break"></div>
> **버전**: 1.0.0 | **최종 수정**: 2026-07-01 <div class="toc-container">
<h1 class="toc-heading">목차</h1>
<div class="toc-list">
<div class="toc-item">
<span class="toc-title"><a href="01_시스템_개요.md">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="02_초기_설정.md">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="03_메인_화면.md">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="04_통신_설정.md">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="05_시험_설정.md">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="06_데이터_조회.md">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="07_시험_프로세스.md">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="08_로그_관리.md">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="09_오류_대응.md">9. 오류 대응 및 프로그램 종료</a></span>
<span class="toc-leader"></span>
<span class="toc-page">27</span>
</div>
</div>
</div>
--- <div class="page-break"></div>
## 메뉴얼 목차
본 메뉴얼은 각 주제별로 별도 문서로 구성되어 있습니다. 아래 링크를 클릭하여 해당 문서로 이동하세요.
| 번호 | 문서 | 설명 |
|------|------|------|
| 1 | [시스템 개요 및 요구사항](01_시스템_개요.md) | 프로그램 소개, 주요 기능, 하드웨어/소프트웨어 요구사항, DIO 신호 매핑 |
| 2 | [초기 설정 가이드](02_초기_설정.md) | 설치 전 준비, 로그인 및 프로그램 실행, 최초 설정 순서 (통신→시험→동작 테스트) |
| 3 | [메인 화면 (Home View)](03_메인_화면.md) | 타이틀 바(작업자/모델/라인 정보 배지 및 로그아웃), 좌/우 채널 모니터링 영역, 하단 메뉴 바 상세 설명 |
| 4 | [통신 설정 (Comm. Settings)](04_통신_설정.md) | 4251 보드 및 Sentinel C28 센서의 COM 포트/BaudRate 설정 방법 |
| 5 | [시험 설정 (Parameters)](05_시험_설정.md) | SPEC UL/LL 판정 규격값 설정 방법 |
| 6 | [측정 데이터 조회 (Data View)](06_데이터_조회.md) | 검사 기록 검색, 필터링, CSV 내보내기 방법 |
| 7 | [자동 시험 프로세스](07_시험_프로세스.md) | 7단계 자동 시험 흐름, 순차 실행, ID 수동 테스트 |
| 8 | [로그 및 데이터 관리](08_로그_관리.md) | 검사 데이터 로그, 시스템 로그, 설정 파일 구조 |
| 9 | [오류 대응 및 프로그램 종료](09_오류_대응.md) | 통신 오류, 시험 중 오류, DIO 보드 오류 대응, 종료 절차 |
---
## 빠른 시작 가이드 (Quick Start) ## 빠른 시작 가이드 (Quick Start)
@ -32,6 +63,4 @@
4. **시험 설정** → 하단 메뉴 `Parameters` → SPEC UL/LL 입력 → `설정 저장` 4. **시험 설정** → 하단 메뉴 `Parameters` → SPEC UL/LL 입력 → `설정 저장`
5. **시험 시작** → DIO 시작 신호 또는 `ID Test (L/R)` 버튼으로 동작 확인 5. **시험 시작** → DIO 시작 신호 또는 `ID Test (L/R)` 버튼으로 동작 확인
---
*본 문서는 Pressure Leak Inspect System v1.0.0 기준으로 작성되었습니다.*

104
leak_test_project/Services/LotEngravingService.cs

@ -0,0 +1,104 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
namespace leak_test_project.Services
{
/// <summary>
/// 로트번호(Lot No)별 각인 순번을 저장하고 관리하는 서비스.
/// DB COUNT(*) 의존성을 제거하고, Lot No별로 검사할 때마다 무조건 +1씩 증가하며,
/// Lot No 변경 시 1부터 시작하고, 기존 Lot No로 복귀 시 이전 진행 번호부터 이어받아 증가합니다.
/// </summary>
public class LotEngravingService
{
private static readonly object _fileLock = new object();
private static LotEngravingService _instance;
public static LotEngravingService Instance => _instance ??= new LotEngravingService();
private readonly string _filePath;
private readonly Dictionary<string, int> _sequences = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
public LotEngravingService()
{
string appDir = AppDomain.CurrentDomain.BaseDirectory;
_filePath = Path.Combine(appDir, "lot_sequences.json");
LoadSequences();
}
private void LoadSequences()
{
lock (_fileLock)
{
try
{
if (File.Exists(_filePath))
{
string json = File.ReadAllText(_filePath);
var data = JsonSerializer.Deserialize<Dictionary<string, int>>(json);
if (data != null)
{
_sequences.Clear();
foreach (var kvp in data)
{
_sequences[kvp.Key] = kvp.Value;
}
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[LotEngravingService] LoadSequences Error: {ex.Message}");
}
}
}
private void SaveSequences()
{
lock (_fileLock)
{
try
{
string json = JsonSerializer.Serialize(_sequences, new JsonSerializerOptions { WriteIndented = true });
File.WriteAllText(_filePath, json);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[LotEngravingService] SaveSequences Error: {ex.Message}");
}
}
}
/// <summary>
/// 지정한 Lot No의 현재 마지막 각인 순번을 조회합니다. (없을 경우 0)
/// </summary>
public int GetLastSequence(string lotNo)
{
if (string.IsNullOrWhiteSpace(lotNo)) return 0;
string key = lotNo.Trim();
lock (_fileLock)
{
return _sequences.TryGetValue(key, out int seq) ? seq : 0;
}
}
/// <summary>
/// 지정한 Lot No의 다음 각인 순번을 가져오고, 카운터를 +1 증가시켜 영구 저장합니다.
/// </summary>
public int GetNextSequence(string lotNo)
{
if (string.IsNullOrWhiteSpace(lotNo)) lotNo = "DEFAULT";
string key = lotNo.Trim();
lock (_fileLock)
{
int current = _sequences.TryGetValue(key, out int seq) ? seq : 0;
int next = current + 1;
_sequences[key] = next;
SaveSequences();
return next;
}
}
}
}

20
ob/05_Implementation_History.md

@ -224,3 +224,23 @@
- **Visual Studio 게시 시**: 다운로드 폴더(`C:\Users\COMPUTER1\Downloads\`)로 게시가 수행되며, 게시 완료 직후 정화 스크립트가 `leak_test_project.exe`, `leak_test_project.pdb`, `libs` 서브 폴더 및 부속 파편 파일 일체를 다운로드 폴더에서 깨끗이 삭제하여 **오직 `LeakTestSetup.exe` 단 1개의 단일 설치 파일만 남도록 복구**했습니다. - **Visual Studio 게시 시**: 다운로드 폴더(`C:\Users\COMPUTER1\Downloads\`)로 게시가 수행되며, 게시 완료 직후 정화 스크립트가 `leak_test_project.exe`, `leak_test_project.pdb`, `libs` 서브 폴더 및 부속 파편 파일 일체를 다운로드 폴더에서 깨끗이 삭제하여 **오직 `LeakTestSetup.exe` 단 1개의 단일 설치 파일만 남도록 복구**했습니다.
- **설치 구동 시**: 다운로드 폴더에 생성된 `LeakTestSetup.exe`를 실행하면 **`C:\LeakTest\`** 경로에 프로그램 바이너리 및 설정/DLL이 설치되고, **바탕화면에 `Leak Test System` 바로가기 아이콘이 자동 생성**됩니다. - **설치 구동 시**: 다운로드 폴더에 생성된 `LeakTestSetup.exe`를 실행하면 **`C:\LeakTest\`** 경로에 프로그램 바이너리 및 설정/DLL이 설치되고, **바탕화면에 `Leak Test System` 바로가기 아이콘이 자동 생성**됩니다.
### 📅 2026-07-28 (사용자 매뉴얼 목차 개편 및 단독 페이지/Dot Leader 적용, 표지 제거)
* **내용**: 사용자 매뉴얼(`leak_test_project/Manual/사용자_메뉴얼.md`)의 표지 구성을 제거하고, 목차를 단독 페이지로 독립 구성하였으며 Dot Leader 스타일이 적용된 1~14번 항목 양식으로 개편하였습니다.
* **기능**:
1. **표지 구문 제거**: 기존 매뉴얼 첫 페이지의 타이틀 및 버전 정보, 구분선 등 표지 역할을 하던 구문을 삭제하고 목차가 문서 첫 단독 페이지로 시작되도록 구성함.
2. **Dot Leader 목차 스타일 및 HTML 구조 도입**: `pdf_style.css``.toc-container`, `.toc-item`, `.toc-leader` 등 점선 리더 TOC 스타일을 정의하고, `사용자_메뉴얼.md`의 목차를 1~14 번 항목(개요 ~ 부록) 및 해당 페이지 번호가 포함된 HTML 리더 구조로 구성함.
3. **목차 단독 페이지화**: 목차 컨테이너 하단에 `<div class="page-break"></div>` 구문을 추가하여 인쇄 및 PDF/HTML 변환 시 목차가 한 페이지를 독립적으로 차지하고 빠른 시작 가이드 및 본문이 다음 페이지부터 출력되도록 처리함.
4. **목차 텍스트 숨김 결함 수정**: `pdf_style.css`의 기존 `a[href$=".md"] { display: none !important; }` 인쇄 내비게이션 숨김 예외 규칙으로 인해 `.toc-title a` 링크 텍스트가 노출되지 않던 현상을 해결하기 위해 선택자를 `a[href$=".md"]:not(.toc-title a)`로 세밀화하고 `.toc-title a``display: inline !important;`를 부여함.
5. **통합 PDF/HTML 빌드 갱신 및 서브 앵커 정합성 보완**: `build_pdf.py` 스크립트의 링크 치환 정규식을 고도화하여 1~14번 목차 항목이 파일 단위뿐만 아니라 문서 내 세부 단락 앵커(`href="#11-개요"`, `href="#73-좌우-채널-..."` 등)로도 정확히 이동하도록 정합성을 맞추고 병합 문서(`Manual_Merged.md`, `Manual_Merged.html`) 갱신을 완료함.
6. **목차 스타일만 갱신 (기존 1~9번 매뉴얼 내용/항목 보존)**: `사용자_메뉴얼.md`의 기존 1~9번 매뉴얼 항목(시스템 개요 및 요구사항 ~ 오류 대응 및 프로그램 종료) 및 원본 내용을 변형 없이 온전히 유지하고, 표기 스타일만 이미지의 Dot Leader 디자인으로 적용하여 통합 문서 빌드를 완료함.
7. **안내 문구 삭제**: `사용자_메뉴얼.md` 하단의 '본 문서는 Pressure Leak Inspect System v1.0.0 기준으로 작성되었습니다' 문구를 삭제함.
8. **자동 시험 프로세스 흐름도 컴팩트화**: `07_시험_프로세스.md`의 전체 프로세스 흐름도를 2열 컴팩트 그리드(`grid-template-columns: 1fr 1fr`) 및 슬림 패딩으로 개편하여 페이지가 잘리거나 다음 페이지로 오버플로우되는 현상을 해결함.
9. **인라인 배경색/폰트 설정 제거**: 매뉴얼 본문 문서(`01_시스템_개요.md`, `02_초기_설정.md`, `03_메인_화면.md`, `07_시험_프로세스.md` 등) 내부에 불필요하게 명시되어 있던 `background-color`, `font-family`, `font-size` 등 인라인 CSS 스타일 및 표 내 폰트/색상 설명 항목을 전면 제거하여 표준 마크다운 스타일로 정돈함.
10. **사용자 매뉴얼 사족/디자인 기술문구 전면 제거**: 매뉴얼 전반에서 "가시성 극대화", "볼드", "(연녹색 배경)", "(연주황 배경, 갈색 텍스트)", "시각적 피드백" 등 사용자 매뉴얼에 불필요한 디자인/디스플레이 스타일 서술 수식어 표현을 전면 삭제 및 정돈함.
11. **데이터 조회 표 정렬 열 삭제**: `06_데이터_조회.md`의 데이터 조회 결과 표(그리드) 항목 안내에서 불필요한 '정렬' (좌측/우측/중앙) 컬럼을 삭제하여 명확하게 표 구조를 정리함.
12. **개발자용 사족 표기 및 UI 타입 전면 정화**: `03_메인_화면.md``(Row 0)` ~ `(Row 6)` 레이아웃 행 번호 사족 표기 삭제, 그리고 `04_통신_설정.md`, `05_시험_설정.md`, `06_데이터_조회.md` 표 헤더의 불필요한 `UI 타입` (`TextBox`, `ComboBox`, `DatePicker` 등) 열 및 개발자적 서술 표현을 전면 정돈함.
13. **오류 대응 문서 줄바꿈 교정**: `09_오류_대응.md`의 9.3 SPEC 교차 검증 경고 팝업 단락 문장과 서브 항목 리스트 간에 줄바꿈(빈 줄)을 넣어 정돈함.
14. **로그인 설정 안내 갱신**: `02_초기_설정.md`에서 기존 `Database.ini` 로그인 방식 설명을 삭제하고, `LoginOptions.json` 파일의 `loginAccounts` 계정 추가/수정 및 옵션 드롭다운 필드 설정 안내로 갱신함.
15. **데이터 조회 문단 줄바꿈 교정**: `06_데이터_조회.md` 상단 서술 문장 간 및 `## 6.1 화면 구성` 헤더 사이의 공백 줄(줄바꿈)을 정돈함.
16. **로그 관리 타임아웃 측정값 오기 수정**: `08_로그_관리.md`에서 타임아웃 발생 시 오기 기재되어 있던 측정값 `0.0000`을 실제 소스 코드 동작값인 `9.9999` (판정 `NG`, 센서 판정 `T/O`)로 올바르게 수정함.
17. **로그 관리 페이지 분리**: `08_로그_관리.md``8.5 데이터베이스 데이터 관리 (dbo.EOL)` 단락 앞에 `<div class="page-break"></div>` 태그를 삽입하여 다음 페이지로 독립 배치되도록 개선함.

Loading…
Cancel
Save