docs: IOInterfaceView DI 경로 PTOP 전환 분석일지

IO DI 경로는 IO_Board.json의 IOInterfaceMapDI 절대경로로 결정되며
IODevice.MappingDIO가 path-agnostic하게 그대로 읽음(소스 수정 불필요).
PTOP 전환 = config(IO_Board.json 경로) + DI/DO.csv 존재 + DataPath 확인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
노도연 2026-06-18 14:38:14 +09:00
parent 1fbe7fa98f
commit de06a4c897

View File

@ -0,0 +1,106 @@
# Monitoring IOInterfaceView DI 파일 경로 — PTOP 바라보게 하기 분석
- **작성일:** 2026-06-18
- **목표:** 작업환경에서 IOInterfaceView가 `D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\_device\_io` 의 DI 파일을 보게 하기
- **대상:** `AuroraDevices/AuroraIO/IODevice.cs`, `AuroraDevices/AuroraIO/View/UCIOInterfaceViewModel.cs`, 설정 `IO_Board.json`
---
## 0. 요청
> 마이그레이션 전(현장 소스)에는 PTOP 프로젝트 시작이어도 Monitoring의 IOInterfaceView가 `D:\ILSOSConfig\ILSOS_PrismaticScanner\_device\_io` 의 DI 파일을 참조해 보여줬다. 내 작업환경에서 **PTOP(`D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP`)** 데이터를 보게 하려면 어디를 고쳐야 하나? 수정 위치 + diff. 문제 없으면 그 이유도.
---
## 1. 결론 (요약)
- **소스 코드는 고칠 필요가 없다(IO DI 한정).** DI 파일 경로는 **소스에 없고**, **설정 파일 `IO_Board.json` 의 `IOInterfaceMapDI`(절대경로)** 값으로 결정된다.
- `IODevice.MappingDIO()`는 그 절대경로를 **그대로 읽는다**(DataPath 등 가공 없음). 즉 **경로 무관(path-agnostic)** 코드 → 버그 없음.
- 따라서 PTOP를 바라보게 하는 건 **설정/환경 변경**:
1. 앱이 로드하는 config 폴더(DataPath)가 `D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP` 여야 함.
2. 그 폴더의 `_config_device\IO_Board.json` 의 `IOInterfaceMapDI`/`IOInterfaceMapDO` 가 **PTOP 경로**를 가리켜야 함.
3. 실제 `D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\_device\_io\DI.csv`(DO.csv) 파일이 존재해야 함.
---
## 2. 경로 결정 메커니즘 (코드 근거)
### 2-1. DI/DO 매핑 로드 — `AuroraDevices/AuroraIO/IODevice.cs` `MappingDIO()`
```csharp
var m_connConfig = _connConfig as IOUnitConnConfig;
switch (type) {
case InfoIO.IoType.DI: fileName = m_connConfig.IOInterfaceMapDI; break; // ← 설정값(절대경로)
case InfoIO.IoType.DO: fileName = m_connConfig.IOInterfaceMapDO; break;
}
FileInfo fi = new FileInfo(fileName);
if (!fi.Directory.Exists) fi.Directory.Create();
if (File.Exists(fileName) == false) {
Log.I($"파일({fileName})이 존재하지 않습니다. Device Config의 File 경로를 확인하세요.");
return 0; // ← 없으면 로그만, 크래시 없음(빈 리스트)
}
StreamReader sr = new StreamReader(fileName, ...); // ← 절대경로 그대로 읽음
... ListDI/ListDO 채움
```
→ **`fileName`은 `IOInterfaceMapDI` 값 그 자체.** 코드가 폴더명을 만들거나 바꾸지 않음.
### 2-2. 설정 출처 — `IO_Board.json` (`_config_device`)
`Doc/ILSOSConfig/ILSOS_PrismaticScanner/_config_device/IO_Board.json`:
```json
"IOInterfaceMapDI": "D:\\ILSOSConfig\\ILSOS_PrismaticScanner\\_device\\_io\\DI.csv",
"IOInterfaceMapDO": "D:\\ILSOSConfig\\ILSOS_PrismaticScanner\\_device\\_io\\DO.csv",
```
→ **여기 절대경로가 `ILSOS_PrismaticScanner`로 박혀 있어서**, 어떤 config 폴더를 로드하든 이 값이면 Scanner DI를 읽었던 것.
### 2-3. 화면 — `UCIOInterfaceViewModel`
ViewModel은 위에서 로드된 `_iOUnit.ListDI`를 표시할 뿐, 경로를 직접 다루지 않음. → 화면 쪽도 수정 불필요.
### 2-4. 앱이 어느 config 폴더를 로드하는가 (DataPath)
- `D:\ILSOSConfig\<폴더>` 의 `<폴더>` 는 Aurora 프레임워크(`ApplicationExt.DataPath`, External\Aurora 바이너리)가 결정. **repo 소스에 없음.**
- 관례상 머신 플러그인 **AssemblyName** 과 일치(과거 `ILSOS_PrismaticScanner`). 이번 마이그레이션으로 **AssemblyName = `ILSOS_PrismaticRD_PTOP`** 이 되었으므로, DataPath도 `D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP` 로 해석될 가능성이 큼 → **그 폴더가 준비돼 있어야 함**(없으면 §2-1처럼 "파일 없음" 로그 후 빈 표시).
---
## 3. 수정 위치 (= 설정/환경, 소스 아님)
### (필수) IO_Board.json 경로 값 — `D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\_config_device\IO_Board.json`
```diff
- "IOInterfaceMapDI": "D:\\ILSOSConfig\\ILSOS_PrismaticScanner\\_device\\_io\\DI.csv",
- "IOInterfaceMapDO": "D:\\ILSOSConfig\\ILSOS_PrismaticScanner\\_device\\_io\\DO.csv",
+ "IOInterfaceMapDI": "D:\\ILSOSConfig\\ILSOS_PrismaticRD_PTOP\\_device\\_io\\DI.csv",
+ "IOInterfaceMapDO": "D:\\ILSOSConfig\\ILSOS_PrismaticRD_PTOP\\_device\\_io\\DO.csv",
```
### (필수) 데이터 파일 존재
`D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\_device\_io\DI.csv`, `DO.csv` 가 실제로 있어야 함(Scanner 폴더에서 복사 또는 260618 zip 사용).
### (확인) DataPath
앱 실행 시 로드되는 config 루트가 `D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP` 인지 확인(로그의 파일 경로/“파일 없음” 메시지로 검증).
> **즉 IO DI에 대한 C# 소스 diff 는 없음.** §2-1 코드가 path-agnostic 이라 고칠 게 없다(= "문제 없는 이유").
---
## 4. "문제 없는 이유" 정리
- `MappingDIO`는 `IOInterfaceMapDI` 절대경로를 **그대로** `StreamReader`로 연다. 경로 조립/머신명 치환 로직이 없음 → **코드가 머신에 종속되지 않음.**
- 파일이 없으면 예외 없이 로그 후 빈 리스트(`return 0`) → IOInterfaceView가 비어 보일 뿐 크래시 없음.
- 그래서 "PTOP를 바라보게" 하는 건 코드 수정이 아니라 **(1) PTOP config 폴더 준비 + (2) 그 안 IO_Board.json 경로를 PTOP로 + (3) DI/DO.csv 존재**로 끝난다.
---
## 5. (참고) 별개 이슈 — 소스에 하드코딩된 `ILSOS_PrismaticScanner` 절대경로
IO DI와 무관하지만, **PTOP config로 완전 전환** 시 같이 손봐야 할 하드코딩 경로(공유 소스, WeldingCommon/LASA — 수정 시 승인 필요):
| 파일 | 용도 |
|---|---|
| `WeldingCommon/Settings/SystemParameter.cs:17,18` | FieldScanImage, WORK_RECIPE_FILE |
| `WeldingCommon/RMS/EDC.cs:171,177` | cellTracker CSV |
| `LASA/GUI/DB/RecipeFieldScan.cs:24` | 기본 Scout 이미지 |
| `LASA/GUI/Page/MainPage.cs:259,533` | 기본 FieldScan 이미지 |
| `WeldingCommon/Views/Manual/Scanner/WDSelectScoutFieldViewModel.cs:47` | 기본 FieldScan 이미지 |
> 이들은 모두 `D:\ILSOSConfig\ILSOS_PrismaticScanner\...` 로 박혀 있음. **IOInterfaceView DI 표시에는 영향 없음**(vision/recipe/cellTracker 기본값). 필요 시 `ILSOS_PrismaticRD_PTOP`로 일괄 치환하는 별도 작업으로 진행.
---
## 6. 권장 조치 (작업환경)
1. `D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\` 준비(없으면 Scanner 복사 또는 260618 zip 해제).
2. `…\_config_device\IO_Board.json` 의 DI/DO 경로를 §3 diff 대로 PTOP로 변경.
3. `…\_device\_io\DI.csv`, `DO.csv` 존재 확인.
4. 앱 실행 → IOInterfaceView에 PTOP DI 표시 확인. (안 보이면 로그의 파일 경로로 DataPath/파일유무 점검)