# Pressure Leak Inspect System (기밀 시험 시스템 GUI) Windows 기반 Air Leak Test 장비를 위한 제어 및 모니터링 GUI 프로그램입니다. WPF(C#)를 사용하여 제작되었으며, MVVM 패턴을 적용하여 하드웨어 통신 계층과 UI 계층이 분리된 구조를 가지고 있습니다. ## 📂 프로젝트 파일 구조 ```text leak_test_project/ ├── Infrastructure/ # 하드웨어 통신 및 DIO 계층 (Low-Level Communication) │ ├── ICommunication.cs # 통신 방식(Serial, TCP) 추상화 인터페이스 │ ├── SerialProvider.cs # RS232 시리얼 통신 구현체 (8N1, IDisposable) │ ├── IDioBoard.cs # DIO 보드 추상화 인터페이스 (입출력 제어, 이벤트) │ ├── RealDioBoard.cs # ADLINK PCI DIO 보드 실제 구현체 (10ms 폴링) │ └── Dask.cs # ADLINK PCIS-DASK API P/Invoke 래퍼 ├── Models/ # 데이터 모델 │ ├── AppConfig.cs # 앱 설정 (Left/Right/SensorPort, Zmdi/SensorBaudRate, SpecUL/LL) │ ├── DioPoint.cs # DIO 포인트 모델 (Name, IsInput, Value) + DioEventArgs │ ├── InOutItem.cs # I/O 항목 모델 (Address, Name, Description, Value) │ ├── InspectData.cs # 검사 결과 데이터 모델 (12개 필드) │ ├── ParsedData.cs # Sentinel C28 파싱 결과 모델 (MeasuredValue, SensorJudgment 등) │ └── SensorIdData.cs # 센서 ID 데이터 모델 (LowID, Year/Month/Day, Serial 등) ├── Services/ # 비즈니스 로직 및 기기 제어 │ ├── Board4253Service.cs # [신규] 4253 보드 통신 서비스 ( 기반 프로토콜) │ ├── Board4253SensorService.cs # [신규] 4253 보드 ID 센서 서비스 (IIdSensorService 구현) │ ├── Board4253DioBoard.cs # [신규] 4253 보드 DIO 구현체 (IDioBoard 구현) │ ├── IIdSensorService.cs # [신규] ID 센서 추상화 인터페이스 (ZMDI/4253 공통) │ ├── DioBoardFactory.cs # DIO 보드 팩토리 (DioConfig.ini 기반 보드 생성) │ ├── IoBoardService.cs # I/O 보드 서비스 (IDioBoard 연동, 상태 갱신/출력 제어) │ ├── SentinelC28Service.cs # Sentinel C28 프로토콜 (자동 재연결 포함) │ ├── TestProcessService.cs # 자동 시험 프로세스 (DIO→센서→시험→판정→출력 사이클) │ └── ZmdiSensorService.cs # ZMDI 센서 시리얼 통신 (ID 읽기/파싱, 4단계 명령) ├── Utils/ # 유틸리티 │ ├── ConfigManager.cs # XML 기반 설정 관리 (Load/Save, ConfigChanged 이벤트) │ ├── CsvExporter.cs # 범용 CSV 내보내기 │ ├── DioConfigParser.cs # INI 형식 DIO 설정 파서 (보드 타입, 포인트 매핑) │ ├── FileLogger.cs # 일일 CSV 로그 자동 저장 + 시스템 로그 │ ├── LogParser.cs # CSV 로그 파싱 및 검색 필터링 │ ├── SentinelCrc8.cs # CRC-8 체크섬 계산 │ └── SentinelParser.cs # C28 데이터 파싱 (스트리밍/최종결과/판정) ├── ViewModels/ # MVVM ViewModel │ ├── Core/ │ │ ├── ObservableObject.cs # INotifyPropertyChanged 베이스 클래스 │ │ └── RelayCommand.cs # ICommand 구현 │ ├── DataViewModel.cs # 데이터 조회/CSV 내보내기/더미 데이터 로드 │ ├── HomeViewModel.cs # 2채널 자동 시험, ZMDI/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/ # 사용자 매뉴얼 │ ├── Communication_Manual.md # 통신 설정 매뉴얼 │ ├── DataView_Manual.md # 데이터 조회 매뉴얼 │ ├── HomeView_Manual.md # 메인 화면 매뉴얼 │ ├── IO_Monitor_Manual.md # I/O 모니터 매뉴얼 │ └── Parameter_Manual.md # 파라미터 설정 매뉴얼 ├── PCI-Dask.dll # ADLINK PCIS-DASK 네이티브 DLL ├── App.xaml # DataTemplate 매핑 + 공통 스타일 ├── MainWindow.xaml # 메인 Shell (상단바 + 하단 메뉴) └── MainWindow.xaml.cs # 시계, 창 관리, 종료 확인 leak_test_project.Tests/ # 단위 테스트 프로젝트 (xUnit/NUnit) ``` ## ✨ 주요 기능 ### 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 파싱 (ZMDI 또는 4253 보드) 3. **불량 제품 필터링**: 센서의 이전 검사 결과(PrevResult) 확인 4. **LEAK 시험 수행**: Sentinel C28 최종 결과 수신 대기 (60초 타임아웃) 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` 플래그를 활성화하고 콘솔/로그에 경고 출력 **타임아웃 처리** - 60초 내 C28 결과 미수신 시 자동으로 NG 판정 처리 - 타임아웃 시에도 UI 그리드와 CSV 로그에 NG(센서판정: T/O) 기록 남김 - DIO NG 출력 신호도 정상적으로 전송 ### 3. DIO 보드 제어 (ADLINK PCI) - **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) 값 설정 및 저장 - **통신 설정**: 좌/우 센서 장비 포트(기본 COM9/COM8, 보드레이트 공유 19200)와 C28 센서 포트(기본 COM1, 보드레이트 9600)를 각각 독립 설정 - **XML 설정 파일**: `config.xml`에 자동 저장/로드, 설정 변경 시 `ConfigChanged` 이벤트를 통해 모든 통신 서비스(Sentinel C28, 센서)와 자동 시험 프로세스가 재시작되어 즉시 반영 - **DIO 설정 파일**: `Settings/DioConfig.ini`에서 보드 타입, 입출력 포인트 이름/설명 관리 ### 8. 일일 CSV 로그 자동 저장 - 검사 완료 시 `Logs/yyyy-MM-dd.csv` 파일에 자동 기록 - CSV 헤더: Date, Time, Channel, ID, Value, Judgment, Mode, LineNo, ProductType, SpecUL, SpecLL, Retest - CSV 값 이스케이프 처리 (쉼표/따옴표/줄바꿈 안전 처리) - 시스템 텍스트 로그는 `yyyy-MM-dd_system.log`로 별도 관리 ### 9. 프로그램 안정성 - 프로그램 종료 전 확인 대화상자 표시 - 시리얼 포트, DIO 보드, 타이머 등 리소스 종료 시 안전 해제 (IDisposable 패턴) - 모든 통신/파일 I/O 구간에 예외 처리 적용 - ZMDI 통신 명령 실패 시 최대 3회 재시도 - **포트 연결 알림**: 프로그램 초기화 또는 설정 변경 시 모든 포트(C28, 센서 Left/Right)의 연결 상태를 즉시 확인하고, 하나라도 실패 시 메인 화면 오류 영역에 즉시 표시 (상세 오류 원인 및 포트 번호 포함) - **1초 자동 복구**: 모든 통신 포트에 대해 1초 주기로 상시 자동 재연결 시도 (재진입 방지 포함) - **통신 설정 변경 반영**: 설정 저장 시 즉시 통신 포트와 자동 시험 프로세스를 재시작하여 프로그램 재시작 없이 설정 변경 내용 적용 가능 --- ## 🔌 신규 4253 보드 통합 기존 ZMDI 센서 방식에 추가하여, 신규 4253 보드를 통한 제품 ID 읽기 기능이 구현되었습니다. ### 아키텍처 `IIdSensorService` 인터페이스를 도입하여 기존 `ZmdiSensorService`와 신규 `Board4253SensorService`를 동일한 추상화로 교체 가능하도록 설계되었습니다. ```text IIdSensorService (인터페이스) ├── ZmdiSensorService # 기존 ZMDI 센서 (4단계 시리얼 명령) └── Board4253SensorService # 신규 4253 보드 (2단계 명령: 상태확인 + ID읽기) ``` ### 관련 파일 | 파일 | 역할 | | :--- | :--- | | `Services/IIdSensorService.cs` | ID 센서 공통 인터페이스 (Connect, Disconnect, ReadSensor) | | `Services/Board4253Service.cs` | 4253 보드 시리얼 통신 코어 (명령 송수신, `` 기반 프로토콜, 자동 재연결) | | `Services/Board4253SensorService.cs` | 4253 보드 ID 센서 서비스 (상태 확인 → ID 읽기 → SensorIdData 구성) | | `Services/Board4253DioBoard.cs` | 4253 보드 DIO 구현체 (IDioBoard 인터페이스 구현) | ### 4253 보드 통신 프로토콜 - **포트 공유**: 좌/우 센서가 하나의 시리얼 포트를 공유하며, 채널 번호(`001`=좌, `002`=우)로 구분 - **응답 종료 조건**: ``, `Success`, `Fail` 키워드 또는 16자리 영숫자 ID 감지 시 수신 완료 처리 - **타임아웃**: 기본 5000ms (보드 응답 지연 고려), 센서 서비스에서는 15000ms로 확장 대기 - **자동 재연결**: 1초 주기로 연결 상태 감시 및 자동 복구 - **송수신 재시도**: 타임아웃 발생 시 최대 3회 리트라이 (300ms 간격) ### 4253 보드 ID 읽기 절차 | 단계 | 동작 | 명령어 예시 | | :--- | :--- | :--- | | **1단계** | 보드 상태 확인 | `x00c_001101:owt28006727ea97c7801` (CH1) | | **2단계** | ID 읽기 | `x00c_001101:ow2800326003e` (CH1) | - **상태 확인**: 응답에 `Success`가 포함되면 정상, `Fail`이면 중단 - **ID 파싱**: 응답 데이터에서 에코 라인과 키워드를 제외한 16자리 영숫자 패턴(`[A-Za-z0-9]{16}`)을 추출 ### ID 끝자리 'F' 재시도 로직 4253 보드에서 읽은 ID의 끝자리가 `F`인 경우, 통신 오류로 인한 잘못된 값일 가능성이 있어 자동으로 재시도합니다. ```text [시작] ID 읽기 요청 ↓ [1차 시도] ReadIdAsync(channel) ↓ 끝자리 == 'F'? ──YES──→ 500ms 대기 후 재시도 │ ↓ NO [2차 시도] ReadIdAsync(channel) ↓ ↓ [사용] 끝자리 == 'F'? ──YES──→ 500ms 대기 후 재시도 │ ↓ NO [3차 시도(최종)] ReadIdAsync(channel) ↓ ↓ [사용] 끝자리가 여전히 'F'이면 경고 로그 출력 후 해당 ID 그대로 사용 ``` - **최대 재시도 횟수**: 3회 (최초 1회 + 추가 2회) - **재시도 간격**: 500ms - **진행 상태 표시**: 재시도 시 `ProgressMessage` 이벤트로 UI에 알림 - **3회 모두 'F'로 끝나는 경우**: 마지막 값을 그대로 사용하고 경고 메시지 출력 --- ## 📡 기기 통신 프로토콜 및 명령어 (Command Details) 프로그램에서 사용하는 주요 하드웨어 통신 명령어 및 절차입니다. ### 1. ZMDI 센서 (ID 읽기 및 파싱) ZMDI 센서와의 통신은 `19200 Baud, 8N1` 시리얼 통신을 사용하며, 총 4단계의 명령어 시퀀스로 구성됩니다. 모든 명령어는 `\r\n`을 포함하여 전송되며, 최대 3회 재시도합니다. | 단계 | 역할 | 주요 명령어 리스트 | | :--- | :--- | :--- | | **1단계** | 초기화 및 통신 확인 | `V`, `Pr_D7`, `Pr_D6`, `Pr_D5`, `r` | | **2단계** | 메모리 접근 준비 | `tso31150` | | **3단계** | 데이터 수집 설정 | `os_10`, `t11005`, `OWT7800272D1`, `OR_78002`, `OW_780038AA55A`, `OW_780011A`, `OR_78002`, `OW_780038AFF00`, `OW_78001CF`, `OR_78004` | | **4단계** | ID 메모리 읽기 | `OW_7800140`, `OR_78002`, `OW_7800141`, `OR_78002`, `OW_7800142`, `OR_78002`, `x9c_990:x` | - **읽기 종료**: 모든 데이터를 읽은 후 `x9c_990:x` 명령으로 세션을 종료합니다. - **데이터 파싱**: `OR_78002`의 응답값들을 조합하여 12자리 이상의 `LowID`를 생성하고, 이를 디코딩 테이블에 따라 년/월/일/시리얼/라인/아이템 정보를 추출합니다. - **불량 필터링**: 파싱된 `PrevResult` 필드로 이전 검사 결과를 확인하여 불량 제품을 필터링합니다. --- ### 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초이므로, 프로그램은 **60초** 동안 C28 최종 결과를 대기합니다. 60초 내에 결과가 수신되지 않으면 자동으로 NG 처리됩니다. - **SPEC 교차 검증**: C28 센서의 자체 판정(A=Accept, R=Reject)과 프로그램의 UL/LL 기반 판정을 비교하여 불일치 시 경고 메시지를 표시합니다. --- ### 3. ADLINK DIO 보드 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`) - **문제**: 기계 측정 시간이 약 30초인데 프로그램 대기 타임아웃도 30초로 동일하게 설정되어 있어, 기계가 불량(NG)을 판정하여 결과 데이터를 전송하려는 시점에 프로그램이 이미 타임아웃으로 넘어가버리는 현상 발생. 또한 타임아웃 발생 시 UI와 로그에 결과가 남지 않는 문제 존재. - **수정 내용**: - C28 결과 대기 타임아웃을 **30초 → 60초**로 확장하여, 기계의 측정 시간(약 30초)을 충분히 수용 - 타임아웃 발생 시에도 **UI 그리드에 NG 결과 표시** (`TestCompleted` 이벤트에 `Judgment="NG"`, `SensorJudgment="T/O"` 전달) - 타임아웃 발생 시에도 **CSV 로그 파일에 NG 기록** (`FileLogger.LogInspectData` 호출) - DIO **NG 출력 신호** 정상 전송 유지 #### 4253 보드 ID 끝자리 'F' 재시도 로직 추가 (`Board4253SensorService.cs`) - **문제**: 4253 보드에서 ID를 읽을 때 간헐적으로 끝자리가 'F'인 잘못된 값이 읽히는 현상 발생 - **수정 내용**: - ID 읽기 후 끝자리가 `F`(대소문자 무관)인 경우 **최대 2번 추가 재시도** (총 3회 시도) - 각 재시도 전 **500ms 대기**하여 보드 안정화 - 재시도 시 **ProgressMessage 이벤트**로 UI에 진행 상황 알림 - 3회 모두 실패 시 마지막으로 읽은 ID를 그대로 사용하되 경고 메시지 출력 ### 2026-04-10 #### 4253 보드 듀얼 채널 통합 (`Board4253Service.cs`, `Board4253SensorService.cs`) - 좌/우 센서가 하나의 시리얼 포트를 공유하도록 `AppConfig` 모델 통합 - 채널별 명령어 분리 (`001`=좌, `002`=우) - `CommunicationWindow` UI에서 포트 설정 통합 반영 #### 4253 보드 상태 확인 게이트키퍼 복원 - `CheckStatusAsync()` 호출 후 `Fail` 응답 시 ID 읽기 중단 - 타임아웃 5000ms로 설정하여 하드웨어 응답 시간 수용 #### ID 센서 단독 테스트 기능 추가 (`TestProcessService.ExecuteSensorTestAsync`) - 하단 메뉴에 "ID Test (L)" / "ID Test (R)" 버튼 추가 - 실제 검사와 동일한 시퀀스(UI 초기화 → 센서 읽기 → 데이터 표시)를 재현 - 센서 통신 및 하드웨어 동작을 독립적으로 확인 가능 --- ## 🛠 유지보수 가이드 - **센서 보드 교체**: `IIdSensorService` 인터페이스를 구현하는 새 서비스 클래스를 작성하고, `HomeViewModel`에서 주입 대상을 변경하면 됨 - **통신 방식 변경**: `Infrastructure/` 폴더에 `TcpProvider` 등을 추가하고 `ICommunication`을 구현하면 UI 수정 없이 변경 가능 - **프로토콜 수정**: Sentinel C28의 명령어나 데이터 형식이 바뀌면 `Services/SentinelC28Service.cs`와 `Utils/SentinelParser.cs` 수정 - **CRC 알고리즘**: 제조사 사양서에 정확한 다항식이 명시되어 있다면 `Utils/SentinelCrc8.cs` 교체 필요 - **화면 및 스타일**: `Views/`의 `.xaml` 파일과 `App.xaml`에서 통합 관리 - **설정 항목 추가**: `Models/AppConfig.cs`에 프로퍼티 추가 후 해당 설정 화면 UI 수정 - **DIO 포인트 변경**: `Settings/DioConfig.ini`에서 입출력 포인트 이름/설명을 수정하면 프로그램 재시작 시 반영 - **DIO 보드 타입 추가**: `Infrastructure/RealDioBoard.cs`의 `GetCardTypeFromConfig()` 메서드에 새 보드 타입 매핑 추가 - **시험 프로세스 수정**: `Services/TestProcessService.cs`의 `ProcessProc()` 메서드에서 시험 단계 추가/변경 - **ZMDI 명령 시퀀스 수정**: `Services/ZmdiSensorService.cs`의 `_commandList1~4` 배열 수정 - **ID 디코딩 테이블 수정**: `Services/ZmdiSensorService.cs`의 `_yearHexList`, `_monthList`, `_dayHexList` 등 업데이트 - **4253 보드 명령어 수정**: `Services/Board4253Service.cs`의 `CheckStatusAsync()`, `ReadIdAsync()` 메서드에서 전송 명령어 변경 - **사용자 매뉴얼**: `Manual/` 폴더에서 각 화면별 사용 설명서 확인 및 수정 가능 ## 🧪 테스트 `leak_test_project.Tests` 프로젝트에서 핵심 서비스의 단위 테스트를 실행할 수 있습니다. ```bash dotnet test leak_test_project.Tests/leak_test_project.Tests.csproj ``` ## 🚀 실행 방법 1. Visual Studio에서 `leak_test_project.slnx` 파일을 엽니다. 2. `F5` 키를 눌러 실행하거나 빌드 후 `bin/Debug/leak_test_project.exe`를 실행합니다. 3. 로그 파일은 실행 파일과 동일한 경로의 `Logs/` 폴더에 자동 생성됩니다. 4. DIO 설정 파일은 `Settings/DioConfig.ini`에 자동 생성됩니다 (없을 경우 기본값으로 생성).