리크 테스트 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.
 
 
 
 
 
최승민 c9fd5cf0b9 설정파일 수정 1 month ago
.agents 설정파일 수정 1 month ago
ADLINK/PCIS-DASK fix: 기능수정 2 months ago
DB 설정파일 수정 1 month ago
docs fix: 기능수정 2 months ago
leak_test_project 설정파일 수정 1 month ago
ob 설정파일 수정 1 month ago
packages/Microsoft.VisualStudio.Setup.Configuration.Interop.3.14.2075 리크 테스트 gui 4 months ago
.gitignore 리크 테스트 gui 4 months ago
ADLINK.zip fix: 기능수정 2 months ago
C28-UserManual.pdf 리크 테스트 gui 4 months ago
C28_Communication.pdf 리크 테스트 gui 4 months ago
README.md fix: 기능수정 2 months ago
StartupLoginWindow.xaml.cs fix: 로그인화면 교체 및 디자인 수정 2 months ago
build_log.txt 리크 테스트 gui 4 months ago
leak_test_project.slnx fix: 기능수정 2 months ago

README.md

Pressure Leak Inspect System (기밀 시험 시스템 GUI)

Windows 기반 Air Leak Test 장비를 위한 제어 및 모니터링 GUI 프로그램입니다. WPF(C#)를 사용하여 제작되었으며, MVVM 패턴을 적용하여 하드웨어 통신 계층과 UI 계층이 분리된 구조를 가지고 있습니다.

📂 프로젝트 파일 구조

leak_test_project/
├── Infrastructure/            # 하드웨어 통신 및 DIO 계층 (Low-Level Communication)
│   ├── CommunicationBase.cs   # ICommunication 인터페이스 및 SerialProvider 구현체
│   ├── DioBoardBase.cs        # IDioBoard 인터페이스 및 RealDioBoard 구현체
│   └── Dask.cs                # ADLINK PCIS-DASK API P/Invoke 래퍼
├── Models/                    # 데이터 모델
│   └── ProjectModels.cs       # AppConfig, DioPoint, InOutItem, InspectData, ParsedData, SensorIdData 일괄 정의
├── Services/                  # 비즈니스 로직 및 기기 제어
│   ├── Board4251.cs           # [신규] 4251 보드 통신 및 서비스 통합 구현체 (서비스/DIO)
│   ├── IIdSensorService.cs    # [신규] ID 센서 추상화 인터페이스 (4251)
│   ├── DioBoardFactory.cs     # DIO 보드 팩토리 (DioConfig.ini 기반 보드 생성)
│   ├── IoBoardService.cs      # I/O 보드 서비스 (IDioBoard 연동, 상태 갱신/출력 제어)
│   ├── SentinelC28Service.cs  # Sentinel C28 프로토콜 (자동 재연결 포함)
│   └── TestProcessService.cs  # 자동 시험 프로세스 (DIO→센서→시험→판정→출력 사이클)
├── Utils/                     # 유틸리티
│   ├── ConfigHelper.cs        # XML 설정 관리 (ConfigManager) 및 INI 설정 파서 (DioConfigParser)
│   ├── LogUtils.cs            # FileLogger (일일 로그), LogParser, CsvExporter 통합 유틸리티
│   └── SentinelParser.cs      # C28 데이터 파싱 및 SentinelCrc8 (CRC-8 체크섬) 구현
├── ViewModels/                # MVVM ViewModel
│   ├── Core/
│   │   ├── ObservableObject.cs # INotifyPropertyChanged 베이스 클래스
│   │   └── RelayCommand.cs     # ICommand 구현
│   ├── DataViewModel.cs       # 데이터 조회/CSV 내보내기/더미 데이터 로드
│   ├── HomeViewModel.cs       # 2채널 자동 시험, 4251/C28 통신, SPEC 교차 검증
│   ├── InOutViewModel.cs      # I/O 모니터 페이징 로직
│   ├── MainViewModel.cs       # 화면 전환, DIO 보드 생성, 앱 생명주기 관리
│   └── ParametersViewModel.cs # 파라미터 설정 (빈 클래스, 로직은 Window에서 직접 처리)
├── Views/                     # UI 화면
│   ├── CommunicationWindow.xaml(.cs) # 통신 설정 (포트/보드레이트)
│   ├── DataView.xaml(.cs)            # 검사 이력 조회/검색/CSV 저장
│   ├── HomeView.xaml(.cs)            # 좌/우 2채널 시험 모니터링
│   ├── InOutView.xaml(.cs)           # I/O 모니터 (INPUT/OUTPUT 구분)
│   └── ParametersWindow.xaml(.cs)    # SPEC UL/LL 설정
├── Manual/                    # 사용자 매뉴얼
│   ├── 01_시스템_개요.md
│   ├── 02_초기_설정.md
│   ├── 03_메인_화면.md
│   ├── 04_통신_설정.md
│   ├── 05_시험_설정.md
│   ├── 06_IO_모니터.md
│   ├── 07_데이터_조회.md
│   ├── 08_시험_프로세스.md
│   ├── 09_로그_관리.md
│   ├── 10_오류_대응.md
│   └── 사용자_메뉴얼.md
├── PCI-Dask.dll               # ADLINK PCIS-DASK 네이티브 DLL
├── App.xaml                   # DataTemplate 매핑 + 공통 스타일
├── MainWindow.xaml            # 메인 Shell (상단바 + 하단 메뉴)
└── MainWindow.xaml.cs         # 시계, 창 관리, 종료 확인

주요 기능

1. 메인 시험 화면 (Home)

  • 좌(LEFT) / 우(RIGHT) 독립 2채널 기밀 시험 상태 실시간 표시
  • 측정값(sccm), SPEC 범위(UL/LL), 판정(OK/NG) 실시간 확인
  • 판정 결과에 따른 배경색 자동 변경 (OK=녹색, NG=빨간색)
  • 좌/우 채널별 상태(Status) 및 오류(Error) 메시지 표시
  • 센서 ID 정보 (LowID, 제조일, 시리얼, 라인, 제품 구분) 실시간 표시
  • ID 테스트 (L/R) 버튼을 통한 센서 단독 통신 테스트 기능

2. 자동 시험 프로세스 (TestProcessService)

DIO 시작 신호를 기반으로 좌/우 독립 백그라운드 스레드에서 아래 사이클을 반복합니다:

  1. DIO 시작 신호 대기: LEFT_START / RIGHT_START 입력 신호 OFF→ON 감지
  2. 센서 ID 읽기: IIdSensorService를 통해 제품 ID 파싱 (4251 보드)
  3. 불량 제품 필터링: 센서의 이전 검사 결과(PrevResult) 확인
  4. LEAK 시험 수행: Sentinel C28 최종 결과 수신 대기 (30초 타임아웃)
  5. 판정: 프로그램 SPEC(UL/LL) 기반 OK/NG 판정
  6. SPEC 교차 검증: 프로그램 판정과 센서 자체 판정(A/R) 비교, 불일치 시 경고
  7. 로그 기록: 일일 CSV 파일에 검사 결과 자동 저장
  8. DIO 출력: 판정 결과에 따라 OK/NG 출력 신호 전송

판정 로직 상세

프로그램 판정 (SentinelParser.EvaluateJudgment)

측정값(sccm)이 하한(SpecLL) ≤ 값 ≤ 상한(SpecUL) 범위 내 → OK
범위 밖 → NG

센서 판정 (C28 장비 내장)

  • C28 장비가 자체적으로 Accept(A) / Reject(R) 판정을 내려 전송

SPEC 교차 검증

  • 프로그램 판정(OK→A, NG→R)과 센서 판정(A/R)을 정규화하여 비교
  • 불일치 시 SpecMismatch 플래그를 활성화하고 콘솔/로그에 경고 출력

타임아웃 처리

  • 30초 내 C28 결과 미수신 시 자동으로 NG 판정 처리
  • 타임아웃 시에도 UI 그리드와 CSV 로그에 NG(센서판정: T/O) 기록 남김
  • DIO NG 출력 신호도 정상적으로 전송
  • ADLINK PCI DIO 보드 연동 (PCIS-DASK API 사용)
  • INI 설정 기반 입출력 포인트 매핑 (Settings/DioConfig.ini)
  • 10ms 입력 폴링: 백그라운드 Task에서 입력 상태 주기적 감시
  • PC_ON 출력: 프로그램 시작 시 가동 신호 ON, 종료 시 OFF
  • 지원 보드 타입: PCI_7230, PCI_7432, PCI_7433, PCI_7434, PCI_7250

4. Sentinel C28 통신 제어

  • RS-232 시리얼 통신: 기본 9600 baud, 8N1
  • 표준 프로토콜 준수: 헤더(XXYYZZZ H) + CRC-8 체크섬 자동 생성
  • 다중 데이터 처리: 최종 결과(R), 실시간 스트리밍(S), 메시지(M) 구분 수신
  • 자동 재연결: 연결 끊김 시 1초(1000ms) 간격으로 모든 통신(C28, 센서)의 자동 복구를 시도하여 사용자 개입 최소화
  • 확장성: ICommunication 인터페이스 기반으로 TCP/IP 등 통신 방식 변경 가능

5. 입출력 모니터 (In/Out Monitor)

  • INPUT / OUTPUT 신호 상태 확인 (실제 DIO 보드 연동)
  • 500ms 주기 자동 갱신: 별도의 새로고침 버튼 없이 DIO 상태가 실시간 업데이트
  • 페이지당 30개씩 데이터 표시 및 페이징 기능 (FIRST/PREV/NEXT/LAST)
  • 화면 닫기(Close) 시 자동 갱신 타이머 정지

6. 데이터 이력 조회 (Data)

  • 기간별, 판정 결과별(OK/NG/전체), 시리얼 번호별 필터링 검색
  • 일일 CSV 로그 자동 저장 (검사 완료 시 Logs/yyyy-MM-dd.csv에 즉시 기록)
  • 조회된 데이터를 별도 CSV 파일로 내보내기 가능
  • 빈 화면에서도 엑셀 시트처럼 항상 표 격자(GridLines)가 유동적으로 유지되도록 최소 50행 표출
  • 테스트용 더미 데이터 수동 로드 기능 (버튼 클릭으로 10건 샘플 데이터 생성)

7. 설정 관리

  • 파라미터 설정: SPEC UL/LL (sccm) 값 설정 및 저장
  • 통신 설정: 4251 보드 포트(기본 COM3, 보드레이트 115200) 및 C28 센서 포트(기본 COM1, 보드레이트 9600)를 각각 독립 설정 (4251 보드는 좌/우 센서가 하나의 시리얼 포트를 공유하는 듀얼 채널 통합 방식)
  • XML 설정 파일: config.xml에 자동 저장/로드, 설정 변경 시 ConfigChanged 이벤트를 통해 모든 통신 서비스(Sentinel C28, 센서)와 자동 시험 프로세스가 재시작되어 즉시 반영
  • DIO 설정 파일: Settings/DioConfig.ini에서 보드 타입, 입출력 포인트 이름/설명 관리

8. 일일 CSV 로그 자동 저장

  • 검사 완료 시 Logs/yyyy-MM-dd.csv 파일에 자동 기록
  • CSV 헤더: Date, Time, Channel, ID, Value, Judgment, SpecUL, SpecLL, Retest
  • CSV 값 이스케이프 처리 (쉼표/따옴표/줄바꿈 안전 처리)
  • 시스템 텍스트 로그는 yyyy-MM-dd_system.log로 별도 관리

9. 프로그램 안정성

  • 프로그램 종료 전 확인 대화상자 표시
  • 시리얼 포트, DIO 보드, 타이머 등 리소스 종료 시 안전 해제 (IDisposable 패턴)
  • 모든 통신/파일 I/O 구간에 예외 처리 적용
  • 포트 연결 알림: 프로그램 초기화 또는 설정 변경 시 모든 포트(C28, 센서 Left/Right)의 연결 상태를 즉시 확인하고, 하나라도 실패 시 메인 화면 오류 영역에 즉시 표시 (상세 오류 원인 및 포트 번호 포함)
  • 1초 자동 복구: 모든 통신 포트에 대해 1초 주기로 상시 자동 재연결 시도 (재진입 방지 포함)
  • 통신 설정 변경 반영: 설정 저장 시 즉시 통신 포트와 자동 시험 프로세스를 재시작하여 프로그램 재시작 없이 설정 변경 내용 적용 가능

🔌 신규 4251 보드 통합

신규 4251 보드를 통한 제품 ID 읽기 기능이 구현되었습니다.

아키텍처

IIdSensorService 인터페이스를 도입하여 Board4251SensorService가 구현체로 탑재되었습니다.

IIdSensorService (인터페이스)
└── Board4251SensorService # 신규 4251 보드 (2단계 명령: 상태확인 + ID읽기)

관련 파일

파일 역할
Services/IIdSensorService.cs ID 센서 공통 인터페이스 (Connect, Disconnect, ReadSensor)
Services/Board4251.cs 4251 보드 통합 구현 (통신 코어, ID 센서 서비스, DIO 구현체 포함)

4251 보드 통신 프로토콜

  • 포트 공유: 좌/우 센서가 하나의 시리얼 포트를 공유하며, 채널 번호(001=좌, 002=우)로 구분
  • 응답 종료 조건: <end>, Success, Fail 키워드 또는 16자리 영숫자 ID 감지 시 수신 완료 처리
  • 타임아웃: 기본 5000ms (보드 응답 지연 고려), 센서 서비스에서는 15000ms로 확장 대기
  • 자동 재연결: 1초 주기로 연결 상태 감시 및 자동 복구
  • 송수신 재시도: 타임아웃 발생 시 최대 3회 리트라이 (300ms 간격)

4251 보드 ID 읽기 절차

단계 동작 명령어 예시
1단계 보드 상태 확인 x00c_001101:owt28006727ea97c7801 (CH1)
2단계 ID 읽기 x00c_001101:ow2800326003e (CH1)
  • 상태 확인: 응답에 Success가 포함되면 정상, Fail이면 중단
  • ID 파싱: 응답 데이터에서 에코 라인과 키워드를 제외한 16자리 영숫자 패턴([A-Za-z0-9]{16})을 추출

ID 끝자리 'F' 재시도 로직

4251 보드에서 읽은 ID의 끝자리가 F인 경우, 통신 오류로 인한 잘못된 값일 가능성이 있어 자동으로 재시도합니다.

[시작] ID 읽기 요청
  ↓
[1차 시도] ReadIdAsync(channel)
  ↓
끝자리 == 'F'? ──YES──→ 350ms 대기 후 재시도
  │                        ↓
  NO              [2차 시도] ReadIdAsync(channel)
  ↓                        ↓
[사용]             끝자리 == 'F'? ──YES──→ 350ms 대기 후 재시도
                   │                        ↓
                   NO              [3차 시도(최종)] ReadIdAsync(channel)
                   ↓                        ↓
                  [사용]            끝자리가 여전히 'F'이면
                                   경고 로그 출력 후 해당 ID 그대로 사용
  • 최대 재시도 횟수: 3회 (최초 1회 + 추가 2회)
  • 재시도 간격: 350ms
  • 진행 상태 표시: 재시도 시 ProgressMessage 이벤트로 UI에 알림
  • 3회 모두 'F'로 끝나는 경우: 마지막 값을 그대로 사용하고 경고 메시지 출력

📡 기기 통신 프로토콜 및 명령어 (Command Details)

프로그램에서 사용하는 주요 하드웨어 통신 명령어 및 절차입니다.


2. Sentinel C28 (Leak Test 장비)

Sentinel C28과의 통신은 9600 Baud, 8N1 시리얼 통신을 사용하며, 전용 바이너리/텍스트 혼합 프로토콜을 사용합니다.

  • 명령어 구조: [CRC-8][Sequence][Length] [Type][Command]\r\n

    • CRC-8: 헤더와 페이로드를 포함한 8비트 체크섬 (2자리 Hex)
    • Sequence: 명령어 순차 번호 (01~FF, 2자리 Hex)
    • Length: 명령어 페이로드 길이 (3자리 Hex)
    • Type: 데이터 종류 (예: R=Result, S=Streaming, M=Message)
    • Command: 실제 제어 명령어 또는 수신된 데이터 본문
  • 주요 데이터 수신:

    • R (Result): 최종 검사 완료 후 수신되는 결과 데이터 (채널#, 시리얼, 측정값, 판정 등 포함)
    • S (Streaming): 시험 진행 중 실시간으로 수신되는 압력/유량 데이터
  • LEAK 시험 대기 타임아웃: 기계의 실제 측정 시간이 약 30초이므로, 프로그램은 30초 동안 C28 최종 결과를 대기합니다. 30초 내에 결과가 수신되지 않으면 자동으로 NG 처리됩니다.

  • SPEC 교차 검증: C28 센서의 자체 판정(A=Accept, R=Reject)과 프로그램의 UL/LL 기반 판정을 비교하여 불일치 시 경고 메시지를 표시합니다.


ADLINK PCI DIO 보드와의 통신은 PCIS-DASK API(PCI-Dask.dll)를 사용합니다.

  • 설정 파일: Settings/DioConfig.ini (INI 형식)

    • [DIO]: CompanyName
    • [BOARD_1]: BoardType, BoardNumber
    • [BOARD_1_IN]: 입력 포인트 매핑 (LEFT_START, RIGHT_START 등)
    • [BOARD_1_OUT]: 출력 포인트 매핑 (LEFT_OK, RIGHT_OK, LEFT_NG, RIGHT_NG, PC_ON 등)
  • 기본 입출력 신호:

구분 포인트 이름 설명
INPUT LEFT_START 좌측 시험 시작 신호
INPUT RIGHT_START 우측 시험 시작 신호
OUTPUT LEFT_OK 좌측 합격 출력
OUTPUT RIGHT_OK 우측 합격 출력
OUTPUT LEFT_NG 좌측 불합격 출력
OUTPUT RIGHT_NG 우측 불합격 출력
OUTPUT PC_ON PC 가동 신호

📋 변경 이력

2026-04-13

LEAK 시험 타임아웃 개선 및 예외 처리 반영 (TestProcessService.cs)

  • 문제: 기계 측정 중 타임아웃 발생 시 UI와 로그에 결과가 남지 않는 문제 존재.
  • 수정 내용:
    • 타임아웃 발생 시에도 UI 그리드에 NG 결과 표시 (TestCompleted 이벤트에 Judgment="NG", SensorJudgment="T/O" 전달)
    • 타임아웃 발생 시에도 CSV 로그 파일에 NG 기록 (FileLogger.LogInspectData 호출)
    • DIO NG 출력 신호 정상 전송 유지

4251 보드 ID 끝자리 'F' 재시도 로직 추가 (Board4251.cs)

  • 문제: 4251 보드에서 ID를 읽을 때 간헐적으로 끝자리가 'F'인 잘못된 값이 읽히는 현상 발생
  • 수정 내용:
    • ID 읽기 후 끝자리가 F(대소문자 무관)인 경우 최대 2번 추가 재시도 (총 3회 시도)
    • 각 재시도 전 350ms 대기하여 보드 안정화
    • 재시도 시 ProgressMessage 이벤트로 UI에 진행 상황 알림
    • 3회 모두 실패 시 마지막으로 읽은 ID를 그대로 사용하되 경고 메시지 출력

2026-04-10

4251 보드 듀얼 채널 통합 (Board4251.cs)

  • 좌/우 센서가 하나의 시리얼 포트를 공유하도록 AppConfig 모델 통합
  • 채널별 명령어 분리 (001=좌, 002=우)
  • CommunicationWindow UI에서 포트 설정 통합 반영

4251 보드 상태 확인 게이트키퍼 복원

  • CheckStatusAsync() 호출 후 Fail 응답 시 ID 읽기 중단
  • 타임아웃 5000ms로 설정하여 하드웨어 응답 시간 수용

ID 센서 단독 테스트 기능 추가 (TestProcessService.ExecuteSensorTestAsync)

  • 하단 메뉴에 "ID Test (L)" / "ID Test (R)" 버튼 추가
  • 실제 검사와 동일한 시퀀스(UI 초기화 → 센서 읽기 → 데이터 표시)를 재현
  • 센서 통신 및 하드웨어 동작을 독립적으로 확인 가능

🛠 유지보수 가이드

  • 센서 보드 교체: IIdSensorService 인터페이스를 구현하는 새 서비스 클래스를 작성하고, HomeViewModel에서 주입 대상을 변경하면 됨
  • 통신 방식 변경: Infrastructure/ 폴더에 TcpProvider 등을 추가하고 ICommunication을 구현하면 UI 수정 없이 변경 가능
  • 프로토콜 수정: Sentinel C28의 명령어나 데이터 형식이 바뀌면 Services/SentinelC28Service.csUtils/SentinelParser.cs 수정
  • CRC 알고리즘: 제조사 사양서에 정확한 다항식이 명시되어 있다면 Utils/SentinelCrc8.cs 교체 필요
  • 화면 및 스타일: Views/.xaml 파일과 App.xaml에서 통합 관리
  • 설정 항목 추가: Models/AppConfig.cs에 프로퍼티 추가 후 해당 설정 화면 UI 수정
  • DIO 포인트 변경: Settings/DioConfig.ini에서 입출력 포인트 이름/설명을 수정하면 프로그램 재시작 시 반영
  • DIO 보드 타입 추가: Infrastructure/RealDioBoard.csGetCardTypeFromConfig() 메서드에 새 보드 타입 매핑 추가
  • 시험 프로세스 수정: Services/TestProcessService.csProcessProc() 메서드에서 시험 단계 추가/변경
  • 4251 보드 명령어 수정: Services/Board4251.csCheckStatusAsync(), ReadIdAsync() 메서드에서 전송 명령어 변경
  • 사용자 매뉴얼: Manual/ 폴더에서 각 화면별 사용 설명서 확인 및 수정 가능

🚀 실행 방법

  1. Visual Studio에서 leak_test_project.slnx 파일을 엽니다.
  2. F5 키를 눌러 실행하거나 빌드 후 bin/Debug/leak_test_project.exe를 실행합니다.
  3. 로그 파일은 실행 파일과 동일한 경로의 Logs/ 폴더에 자동 생성됩니다.
  4. DIO 설정 파일은 Settings/DioConfig.ini에 자동 생성됩니다 (없을 경우 기본값으로 생성).