리크 테스트 gui
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
14 KiB

# [5단계] 프로젝트 전체 구현 현황 및 개발 과정 이력 (Project Implementation & Development History)
본 문서는 Windows 기반 Air Leak Test 장비의 제어 및 모니터링 시스템(WPF Leak Test System)의 전체적인 기능 명세, 하드웨어 연동 규격, 그리고 프로젝트가 시작된 이래의 개발 이력 전체를 포괄하여 기록한 문서입니다.
---
## 1. 프로젝트 개요 (Project Summary)
본 시스템은 생산 라인(EOL)의 Air Leak Test(기밀 시험) 장비를 직접 제어하고, 실시간 계측값을 수집하여 합불 판정(OK/NG)을 내리는 Windows 데스크톱 GUI 프로그램입니다.
* **구조**: WPF(C#) 기반의 MVVM 패턴을 충족하며, UI 컴포넌트(View)와 비즈니스 서비스(Service), 하드웨어 통신 드라이버가 서로 역할 분리(Decoupling)되어 있습니다.
* **통신 핵심**: RS-232/Serial 기반의 누수 감지 센서 및 ADLINK DIO/ID 판독용 스마트 보드와의 실시간 동기 및 제어를 지원합니다.
---
## 2. 프로젝트 전체 핵심 기능 명세 (Core Features)
### 2.1 실시간 시험 모니터링 (Home View)
* **독립 2채널 제어**: 좌(LEFT) 및 우(RIGHT) 채널이 개별 워커 스레드로 구동되어 상호 간섭 없이 동시에 또는 순차적으로 기밀 시험을 제어하고 측정값(sccm)을 시각화합니다.
* **실시간 상태 지시**: 판정 결과(`OK`=녹색, `NG`=적색)에 따라 각 채널 카드배경이 반응형으로 자동 전환되며, 하드웨어 레벨의 진행 상태 및 에러 메시지를 표시합니다.
* **센서 ID 실시간 매핑**: 각 채널 아래 제품 ID(제조년월일, 시리얼, 제품 모델 기종 등)를 실시간 바인딩합니다.
* **독립 ID 테스트**: 좌/우 별도의 'ID Test' 동작 모드를 지원하여 시험 프로세스 동작 없이 센서와의 단독 연결 및 데이터 복구 상태를 점검할 수 있습니다.
### 2.2 자동 시험 제어 프로세스 (TestProcessService Loop)
생산 장비의 DIO 시작 스위치 물리 접점 신호를 수집하여 작동하는 백그라운드 스레드 제어 루프입니다.
1. **시작 신호 트리거**: `LEFT_START` / `RIGHT_START` 접점 신호 OFF $\rightarrow$ ON 감지 시 락(Lock) 획득 및 기상.
2. **제품 정보 판독**: `Board4251SensorService`를 통해 제품 센서 메모리에서 16자리 ID 취득.
3. **LEAK 시험 및 수집**: Sentinel C28 누수 측정기로부터 최종 패킷 수신 대기 (최대 30초).
4. **교차 검증 및 판정**: 설정된 상하한 스펙(SpecUL/LL) 기반 합불 판정과 C28 기기 자체 판정(Accept/Reject)을 비교 검증(`SpecMismatch` 감지 시 경고 팝업).
5. **데이터 영속화**: 로컬 CSV 로그와 MSSQL 서버 데이터베이스에 이중 쓰기 수행.
6. **디지털 물리 출력**: 판정 결과에 맞춰 `LEFT_OK` / `LEFT_NG` 등 하드웨어 포트에 전송.
### 2.3 입출력 모니터링 (In/Out Monitor)
* **실시간 접점 스캔**: ADLINK DIO 입력 접점(32비트) 및 출력 접점의 상태를 500ms 주기로 스캔하여 비주얼 온/오프 상태를 화면에 표출합니다.
* **페이징 제공**: 30개씩 분할 표출하는 페이징 제어와 화면 종료 시 불필요한 폴링 타이머 자원 해제 루틴을 지원합니다.
### 2.4 데이터 조회 및 CSV 내보내기 (Data History)
* **고성능 조회 및 필터링**: 기간, 판정 결과, 작업자, 로트 번호, 모델 등의 조건으로 MSSQL 이력 데이터를 신속 조회합니다. (DB 단절 시 로컬 일일 CSV 백업 파일 자동 파싱 Fallback 내장)
* **격자 스타일 유지**: 데이터가 전혀 없는 상태에서도 엑셀 양식과 동일하게 최소 50행의 빈 격자를 유지하여 UI 일관성을 확보합니다.
### 2.5 환경 설정 및 핫 리로드 (Configuration & Hot Reload)
* **XML 설정 파일 (`config.xml`)**: C28 센서 통신 포트 및 보드레이트, ADLINK 보드 번호 및 연결 대기 시간 등을 영속 저장합니다. 설정 갱신 시 `ConfigChanged` 이벤트를 통해 가동 중인 스레드를 안전하게 자동 재시작(Hot Reload)합니다.
* **INI 설정 파일 (`Settings/DioConfig.ini`)**: DIO 보드의 모델과 접점 이름, 핀 설명 매핑 테이블을 관리하며 프로그램 재작동 시 해당 구조로 동적 빌딩됩니다.
---
## 3. 기기 통신 프로토콜 및 예외 처리 규격 (Hardware Interface)
### 3.1 Sentinel C28 (Leak Test 장비)
* **통신 조건**: RS-232, 9600 Baud, 8N1.
* **프레임 구조**: `[CRC-8 체크섬 (2자리 Hex)][Sequence 번호 (2자리 Hex)][Payload 길이 (3자리 Hex)] [Data Type][Data Payload]\r\n`
* **교차 판정**: C28 기기의 자체 판정값(Pass/Fail/Accept/Reject)과 프로그램 상하한 스펙 판정 결과를 A/R 형식으로 정규화하여 교차 검증을 강제합니다.
### 3.2 ADLINK Board 4251 (ID 판독기 및 컨트롤러)
* **채널 다중화**: 1개의 시리얼 포트를 좌/우 채널이 공유하며, 패킷 헤더 내 채널 번호(`001`=좌, `002`=우)로 식별합니다.
* **ID 판독 2단계**:
1. 보드 상태 조회 명령: `x00c_00{ch}101:owt28006727ea97c7801\r\n` $\rightarrow$ `Success` 시 다음 단계 진행.
2. 16자리 ID 조회 명령: `x00c_00{ch}101:ow2800326003e\r\n` $\rightarrow$ `[A-Za-z0-9]{16}` 매칭 필터링.
* **끝자리 'F' 재시도 알고리즘**:
* 제품 ID를 읽었을 때 끝자리가 'F'인 경우, 데이터 불안정 오류일 수 있으므로 **350ms 간격으로 최대 3회(초회 포함)**까지 재시도 통신을 수행합니다. 3회 모두 'F'일 경우 최종 실패 경고 로깅 후 그대로 전달합니다.
---
## 4. 전체 개발 이력 연혁 (Development Timeline History)
### 📅 2026-04-10 (4251 보드 통합 및 단독 테스트 기능 탑재)
* **내용**: 좌우 기밀 센서의 시리얼 통신 포트를 하나의 COM 포트로 묶는 듀얼 채널 통합(`Board4251Service.cs`)을 구현했습니다.
* **기능**: ID 센서 자체 상태를 확인하여 `Fail` 시 동작을 중단하는 게이트키퍼 코드를 안착시키고, 현장에서 센서만 별도로 연결 상태를 점검할 수 있는 `ExecuteSensorTestAsync` (ID Test L/R) 수동 모드를 추가하였습니다.
### 📅 2026-04-13 (측정 타임아웃 고도화 및 통신 리트라이 고안)
* **내용**: 기계식 누수 계측 도중 30초 시간 초과(Timeout)가 나면 로그 및 데이터 유실이 발생하던 문제를 해결했습니다.
* **기능**: 타임아웃 발생 시에도 `SensorJudgment="T/O"`, `Judgment="NG"`로 명확히 판정을 세팅하여 실시간 화면 Grid 및 일일 CSV 로그 파일에 기록하도록 개선하고, 이 시점에도 DIO 하드웨어 단에 불합격(NG) 디지털 출력을 물리 전송하게 하였습니다.
* **기능**: 4251 보드에서 간헐적으로 오동작 값이 수집되던 이슈를 방지하기 위해 **끝자리 'F' 판별 재시도 알고리즘(최대 3회)**을 개발해 연동했습니다.
### 📅 2026-06-22 ~ 2026-06-23 (사용자 로그인 및 DB 프로시저 확장)
* **내용**: DB 사용자 로그인 기능 및 사내 보안 프로시저 연동 스펙을 접목했습니다.
* **기능**: `Database.ini` 파일 설정값에 따라 사내 MSSQL 데이터베이스에 등록된 `Users` 테이블 조회를 일반 쿼리와 저장 프로시저 호출 방식으로 동적 지원하게 구현했습니다.
### 📅 2026-06-24 (성능 고도화, SRP 파일 분해, DI 연동 및 다이얼로그 추상화)
* **내용**: 공장 24시간 가동 환경에서의 리소스 누수 및 불필요 오버헤드를 타파하기 위한 솔루션 리팩토링 단계입니다.
* **기능**:
1. 검사 저장 시마다 발생하던 `Database.ini` 파싱 디스크 I/O 최적화 (시간 감지 캐시 적용).
2. 스레드 폴링 부하(`Thread.Sleep(2)`)를 `AutoResetEvent` 대기 구조로 마이그레이션 (대기 시 CPU 점유율 0%).
3. `LoginServicesStub.cs` 파일에 들어있던 4개 클래스를 개별 독립 파일로 분리하고 구형 csproj에 정상 바인딩.
4. 수동 문자열 결합 JSON 이력 관리를 단일 닷넷 어셈블리 `XmlSerializer` 방식으로 교체하여 의존성 없는 안전성 확보.
5. `EolDatabaseService`에서 `App.LoginResult` 전역 참조를 차단하고 파라미터 주입형태로 리팩토링.
6. 뷰모델 및 헬퍼 파일 내 WPF `MessageBox.Show` 호출부를 `IDialogService` 인터페이스로 격리 설계 (비-UI 환경 단위 테스트 자동화 지원).
7. 리팩토링 최종 결과 MSBuild를 통해 0 warnings, 0 errors 빌드 무결성 검증 통과.
8. 최신 개편 스펙(16개 컬럼 및 MERGE)에 맞추어 DB 스키마 정의 파일(`dbo.EOL_Schema.sql`) 동기화 완료.
9. **[금일 추가]** 데이터베이스(MSSQL) 저장 실패 시 기존 검사 화면의 "오류 메시지" TextBox 영역에 실시간으로 `"DB 저장 실패"` 에러 문구를 노출하도록 예외 피드백 흐름 구현 및 검증 완료.
### 📅 2026-06-25 (배포 편의성 향상, DB 개별 키 파싱 지원, 설정 파일 가독성 고도화, 데이터 조회 오류 수정 및 CSV-DB 저장 정합성 일원화)
* **내용**: 배포 대상 컴퓨터에 프로그램 설치 시 `Database.ini` 설정 파일이 누락되어 생기는 오류를 방지하고, 모든 설정 파일의 포맷을 사람이 읽기 쉽도록 개선했습니다. 또한 데이터 이력 조회 화면의 조회 실패 오류 및 버그(파일 잠금, 날짜 포맷 로캘 불일치)를 예방하기 위한 정교한 방어적 프로그래밍을 적용했으며, 로컬 CSV와 데이터베이스 저장 시 발생하던 데이터 필드 불일치(Mismatch) 현상을 완벽하게 동기화했습니다.
* **기능**:
1. **설정 자동 생성**: 프로그램 시작 시점(`App.xaml.cs`의 `OnStartup`)에 `Database.ini`가 없을 경우 기본 접속 템플릿 정보(MSSQL 설정 및 로그인 프로시저 양식)를 담은 파일을 자동 생성하도록 예외 방지 및 파일 생성 로직을 구축했습니다.
2. **DB 개별 설정 파싱 및 결합**: 기존 한 줄로 길게 늘어지던 `ConnectionString` 대신, 사용자가 직관적으로 여러 줄에 작성할 수 있도록 `Db_Server`, `Db_Name`, `Db_User`, `Db_Password` 개별 키를 파싱하는 구조(`DatabaseSettings.cs`)로 개선했습니다. (이전 방식의 `ConnectionString` 통째 입력 방식도 하위 호환을 위해 Fallback 지원)
3. **가독성 향상 및 주석화**: 자동 생성 및 실제 로컬 파일들의 `Database.ini``Settings/DioConfig.ini` 파일에 넉넉한 줄바꿈(개행) 및 상세한 주석 설명을 달아, 사람이 직접 열어서 편집할 때 직관적으로 파악할 수 있도록 서식을 대폭 수정했습니다.
4. **XML 정밀 포맷팅**: `config.xml` 저장 시(`ConfigManager.Save`), 불필요한 XML 네임스페이스를 소거하고 들여쓰기 4칸(`Indent = true`, `IndentChars = " "`)을 강제하여 XML 구조 가독성을 고도화했습니다.
5. **데이터 조회 안정성 및 예외 처리 강화**:
* **공유 파일 읽기(FileShare)**: 현장 작업자가 로컬 백업 CSV 파일을 엑셀 등으로 열어 두어 파일 잠금(Lock)이 걸렸을 때, 이력 조회 기능에서 발생하던 파일 접근 오류(`IOException`)를 해결하기 위해 `FileShare.ReadWrite` 모드로 CSV 파일을 안전하게 읽어오도록 수정했습니다.
* **로캘 독립적 날짜 파싱**: Windows의 시스템 언어/문화권 설정(Locale)에 따라 날짜 포맷이 파싱되지 않는 문제를 예방하고자, 파일명 및 CSV 내부 날짜 데이터 해석 시 `DateTime.TryParseExact`를 명시하여 해외 공장 PC 등 어떠한 OS 환경에서도 날짜가 안정적으로 필터링되도록 보장했습니다.
* **DB 쿼리 시간 범위 경계값 정밀화**: `DATETIME2(0)`의 소수점 밀리초 오차로 인한 경계 시점(23시 59분 59초 등) 데이터 누락을 원천 차단하기 위해, SQL 조건식을 `Production_Date < @EndLimit` 형식으로 변경하고 익일 00:00:00 미만으로 설정하여 인덱스 스캔의 안정성과 조회 신뢰도를 향상시켰습니다.
* **로컬 CSV 조회 시 중복 데이터 최신화 필터링**: 동일한 제품 일련번호(`IcSn`/`ProductId`)로 재검사를 진행하는 경우, DB는 `MERGE` 구문에 의해 최종 결과로 덮어쓰기(UPDATE)되는 반면 CSV는 계속 행이 누적되는 차이로 인해 발생할 수 있는 데이터 조회 불일치를 보완했습니다. CSV 조회 엔진(`ParseLogsFromCsv`)에서 동일 제품에 대해서는 가장 최근 날짜/시간의 1건만 화면에 출력하도록 필터링을 적용하여 DB와 정합성을 일치시켰습니다. (식별 불가 코드인 `"-"` 및 공란 데이터는 필터링에서 제외)
6. **로컬 CSV 및 DB 저장 데이터 일치성 보장**:
* **InspectData 메타데이터 주입**: `TestProcessService.cs`에서 합격, 불합격(Fail), 타임아웃(Timeout) 판정 데이터를 로컬 CSV에 쓸 때 로그인 정보(Maker, Model, Variant, Operator 등)를 누락하고 쓰던 문제를 해결하기 위해, 인스턴스 생성 시 로그인 정보와 개별 `IcSn`, `PcbBarcode``ProductionDate`를 완벽하게 기입하여 CSV에도 빈틈없이 기록되도록 동기화했습니다.
* **DB 파라미터 정합성 확보**: `EolDatabaseService.cs`에서 레거시 `ProductId``@IC_SN``@PCB_Barcode`에 중복 할당하던 로직을 변경하여, 매칭된 `IcSn``PcbBarcode`를 독립적으로 바인딩하고, 시간 정보도 CSV에 기록된 것과 동일하게 `inspectData.ProductionDate`를 사용하도록 수정하여 두 스토리지 간의 데이터 정합성을 일치시켰습니다.
---