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.
14 KiB
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 시작 스위치 물리 접점 신호를 수집하여 작동하는 백그라운드 스레드 제어 루프입니다.
- 시작 신호 트리거:
LEFT_START/RIGHT_START접점 신호 OFF $\rightarrow$ ON 감지 시 락(Lock) 획득 및 기상. - 제품 정보 판독:
Board4251SensorService를 통해 제품 센서 메모리에서 16자리 ID 취득. - LEAK 시험 및 수집: Sentinel C28 누수 측정기로부터 최종 패킷 수신 대기 (최대 30초).
- 교차 검증 및 판정: 설정된 상하한 스펙(SpecUL/LL) 기반 합불 판정과 C28 기기 자체 판정(Accept/Reject)을 비교 검증(
SpecMismatch감지 시 경고 팝업). - 데이터 영속화: 로컬 CSV 로그와 MSSQL 서버 데이터베이스에 이중 쓰기 수행.
- 디지털 물리 출력: 판정 결과에 맞춰
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단계:
- 보드 상태 조회 명령:
x00c_00{ch}101:owt28006727ea97c7801\r\n$\rightarrow$Success시 다음 단계 진행. - 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시간 가동 환경에서의 리소스 누수 및 불필요 오버헤드를 타파하기 위한 솔루션 리팩토링 단계입니다.
- 기능:
- 검사 저장 시마다 발생하던
Database.ini파싱 디스크 I/O 최적화 (시간 감지 캐시 적용). - 스레드 폴링 부하(
Thread.Sleep(2))를AutoResetEvent대기 구조로 마이그레이션 (대기 시 CPU 점유율 0%). LoginServicesStub.cs파일에 들어있던 4개 클래스를 개별 독립 파일로 분리하고 구형 csproj에 정상 바인딩.- 수동 문자열 결합 JSON 이력 관리를 단일 닷넷 어셈블리
XmlSerializer방식으로 교체하여 의존성 없는 안전성 확보. EolDatabaseService에서App.LoginResult전역 참조를 차단하고 파라미터 주입형태로 리팩토링.- 뷰모델 및 헬퍼 파일 내 WPF
MessageBox.Show호출부를IDialogService인터페이스로 격리 설계 (비-UI 환경 단위 테스트 자동화 지원). - 리팩토링 최종 결과 MSBuild를 통해 0 warnings, 0 errors 빌드 무결성 검증 통과.
- 최신 개편 스펙(16개 컬럼 및 MERGE)에 맞추어 DB 스키마 정의 파일(
dbo.EOL_Schema.sql) 동기화 완료. - [금일 추가] 데이터베이스(MSSQL) 저장 실패 시 기존 검사 화면의 "오류 메시지" TextBox 영역에 실시간으로
"DB 저장 실패"에러 문구를 노출하도록 예외 피드백 흐름 구현 및 검증 완료.
- 검사 저장 시마다 발생하던
📅 2026-06-25 (배포 편의성 향상, DB 개별 키 파싱 지원, 설정 파일 가독성 고도화, 데이터 조회 오류 수정 및 CSV-DB 저장 정합성 일원화)
- 내용: 배포 대상 컴퓨터에 프로그램 설치 시
Database.ini설정 파일이 누락되어 생기는 오류를 방지하고, 모든 설정 파일의 포맷을 사람이 읽기 쉽도록 개선했습니다. 또한 데이터 이력 조회 화면의 조회 실패 오류 및 버그(파일 잠금, 날짜 포맷 로캘 불일치)를 예방하기 위한 정교한 방어적 프로그래밍을 적용했으며, 로컬 CSV와 데이터베이스 저장 시 발생하던 데이터 필드 불일치(Mismatch) 현상을 완벽하게 동기화했습니다. - 기능:
- 설정 자동 생성: 프로그램 시작 시점(
App.xaml.cs의OnStartup)에Database.ini가 없을 경우 기본 접속 템플릿 정보(MSSQL 설정 및 로그인 프로시저 양식)를 담은 파일을 자동 생성하도록 예외 방지 및 파일 생성 로직을 구축했습니다. - DB 개별 설정 파싱 및 결합: 기존 한 줄로 길게 늘어지던
ConnectionString대신, 사용자가 직관적으로 여러 줄에 작성할 수 있도록Db_Server,Db_Name,Db_User,Db_Password개별 키를 파싱하는 구조(DatabaseSettings.cs)로 개선했습니다. (이전 방식의ConnectionString통째 입력 방식도 하위 호환을 위해 Fallback 지원) - 가독성 향상 및 주석화: 자동 생성 및 실제 로컬 파일들의
Database.ini와Settings/DioConfig.ini파일에 넉넉한 줄바꿈(개행) 및 상세한 주석 설명을 달아, 사람이 직접 열어서 편집할 때 직관적으로 파악할 수 있도록 서식을 대폭 수정했습니다. - XML 정밀 포맷팅:
config.xml저장 시(ConfigManager.Save), 불필요한 XML 네임스페이스를 소거하고 들여쓰기 4칸(Indent = true,IndentChars = " ")을 강제하여 XML 구조 가독성을 고도화했습니다. - 데이터 조회 안정성 및 예외 처리 강화:
- 공유 파일 읽기(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와 정합성을 일치시켰습니다. (식별 불가 코드인"-"및 공란 데이터는 필터링에서 제외)
- 공유 파일 읽기(FileShare): 현장 작업자가 로컬 백업 CSV 파일을 엑셀 등으로 열어 두어 파일 잠금(Lock)이 걸렸을 때, 이력 조회 기능에서 발생하던 파일 접근 오류(
- 로컬 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를 사용하도록 수정하여 두 스토리지 간의 데이터 정합성을 일치시켰습니다.
- InspectData 메타데이터 주입:
- 설정 자동 생성: 프로그램 시작 시점(