리크 테스트 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.
 
 
 
 
 

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 형식으로 정규화하여 교차 검증을 강제합니다.
  • 채널 다중화: 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.csOnStartup)에 Database.ini가 없을 경우 기본 접속 템플릿 정보(MSSQL 설정 및 로그인 프로시저 양식)를 담은 파일을 자동 생성하도록 예외 방지 및 파일 생성 로직을 구축했습니다.
    2. DB 개별 설정 파싱 및 결합: 기존 한 줄로 길게 늘어지던 ConnectionString 대신, 사용자가 직관적으로 여러 줄에 작성할 수 있도록 Db_Server, Db_Name, Db_User, Db_Password 개별 키를 파싱하는 구조(DatabaseSettings.cs)로 개선했습니다. (이전 방식의 ConnectionString 통째 입력 방식도 하위 호환을 위해 Fallback 지원)
    3. 가독성 향상 및 주석화: 자동 생성 및 실제 로컬 파일들의 Database.iniSettings/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, PcbBarcodeProductionDate를 완벽하게 기입하여 CSV에도 빈틈없이 기록되도록 동기화했습니다.
      • DB 파라미터 정합성 확보: EolDatabaseService.cs에서 레거시 ProductId@IC_SN@PCB_Barcode에 중복 할당하던 로직을 변경하여, 매칭된 IcSnPcbBarcode를 독립적으로 바인딩하고, 시간 정보도 CSV에 기록된 것과 동일하게 inspectData.ProductionDate를 사용하도록 수정하여 두 스토리지 간의 데이터 정합성을 일치시켰습니다.