2026-08-06 11:29:00 +09:00

142 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PTOP 소스 → 산출물 필드 매핑
> 이 파일은 소스 파일과 산출물 필드 간 1:1 매핑 인덱스.
> 다른 PC에서 스킬 실행 시 이 파일을 보고 어떤 소스를 읽어야 할지 판단한다.
---
## A. PLC-PC 인터페이스 신호정의서
출력: `02.설계/IO_DB설계/PLC_PC_인터페이스_신호정의서.md`
| 시트 | 소스 파일 | 읽어야 할 심볼 |
|---|---|---|
| 통신 사양 | `Device/PLC/PLCContoller.Config.cs` | `PLCControllerPTOP` 생성자 인자(`ePLCNetType`, `PLCMMapFileType`, `isSimul`) — 이 파일은 18줄이며 주소 정의는 없다 |
| PC→PLC (Write) | `Device/PLC/PLCController.Address.cs` | `eBitOutput`, `eWordOutput` enum 전수 |
| PLC→PC (Read) | `Device/PLC/PLCController.Address.cs` | `eBitInput`, `eWordInput` enum 전수 |
| 핸드셰이크 시퀀스 | `Sequences/SeqAutoRunPTOP.cs` | `CheckPageNo`, `CheckRecipeNoComp`, `CheckPageNoComp`, `WaitWeldingStart`, `WriteWeldComplete` |
**PLC 주소 규칙** — ⚠ **소스에 없는 값이다.** `M70000`·`D70000`·`D70500`은 `.cs` 전체에서 0건이고,
근거는 분석 문서(`docs/분석/2026/06/17/171312_plc_map_io_direction_and_enum_alignment.md`)뿐이며
그 문서와 `docs/분석/2026/06/20/141528_산출물문서_분석_및_PTOP_채움안.md`(**06/20 폴더다 — 06/17에는 없다**)가
서로 다르게 기술한다. **산출물에 옮기기 전 소스로 재확인하고 `파일:라인`을
병기하라. 확인되지 않으면 `미확인`으로 남긴다** (`rules.md` §검증·표기 판정표의 토큰만 쓴다).
- `eBitOutput` offset → `M70000 + offset`
- `eBitInput` offset → `M70500 + offset`
- `eWordOutput` offset → `D70000 + offset`
- `eWordInput` offset → `D70500 + offset`
- 두 번째 블록(0x65~, 양극 P) → `M70600~` (현재 미사용)
---
## B. 모션축·IO 맵 정의서
출력: `02.설계/IO_DB설계/모션축_IO맵_정의서.md`
| 시트 | 소스 파일 | 읽어야 할 심볼 |
|---|---|---|
| 통신·제어 구성 | `EquipmentSetup.cs:138` | `RegisterDevices(IDeviceRegistry registry)` 내 `registry.Register(...)` 호출. **주석 처리된 것이 다수다**(OCT·LBAD·CellTracker 등) — 활성 등록만 센다(현재 3건) |
| 모션축 정의 | `docs/architecture.md §4` | AuroraACS(X/Y), AuroraMotionBoard(Z). **`RTC`(Scanner)는 이 문서에 0건** — 출처는 `ubisam-format-map/SKILL.md` §6 `PTOP 채움 시 참고값` 의 주요 디바이스 문장이다 |
| I/O 맵 DI | `Device/IO/PAIX_PTOP.cs` | `ePrismaticDIAddress` enum — 채널 번호·신호명 |
| I/O 맵 DO | `Device/IO/PAIX_PTOP.cs` | `ePrismaticDOAddress` enum — 채널 번호·신호명 |
**모션축 주의사항**:
- X/Y 행정·속도·Home 방식 = 소스에 없음 → 전부 `(제안)` 표기.
- `AuroraACS` = EtherCAT SPiiPlus. `AuroraMotionBoard` = **Ajin 모션 보드**
(`AuroraDevices/AuroraMotionBoard/Ajin/AJINDevice.cs`·`AJINMotor.cs` — 벤더 구현이 이것 하나뿐이다).
- ⚠ **런타임 벤더 선택은 모션이 아니라 IO 보드 쪽이다.** `eIOBoardType`(`Ajin`·`PAIX`·`ACS`)은
`AuroraDevices/AuroraIO/IODevice.cs:18` 정의이고 `:154-158`에서 `IOUnitConfig.BoardType` 으로 분기한다.
**IO 보드 벤더를 `Ajin`으로 단정하지 말 것** — PTOP 실제 IO는 `PAIX_PTOP` 이다.
모션 보드 벤더 주의문과 혼동하지 않는다(둘은 다른 디바이스다).
---
## C. 기능명세서 / UI 설계
출력: `02.설계/UIUX_기능설계/기능명세서.md`
| 탭 | 소스 파일 | 읽어야 할 심볼 |
|---|---|---|
| 메뉴 구조 | `EquipmentSetup.cs:256` | `RegisterViews(IViewManager manager)` 내 `AddSubMenu(CommonViewIds.*, UserControl)`. **총 26건 중 8건이 주석 처리** → **활성 18건만 센다**(위 `RegisterDevices` 행과 같은 규칙). ⚠ `MenuId`·`ViewType`·`AuthLevel` 은 **소스에 없는 심볼이다** — 지어내지 마라 |
| 메뉴 권한 | `EquipmentSetup.cs:261,266,289,302,310,318,323,330` | **`AddSubMenu` 는 2인자라 권한이 없지만 `MainMenu` 생성자 3번째 인자가 `PermissionLevel` 이다.** 메인메뉴 8건이 값을 가진다 — NONE ×6 / `:318` Device=LEVEL3 / `:323` Setting=LEVEL1. (`:288` 주석의 LEVEL4는 비활성, `:337` StreamDevice는 2인자 오버로드이며 `UseStream` 조건부라 권한 인자가 없다) |
| MainView | `Views/Main/UCMainAutoRun*.cs` | 버튼·이벤트·바인딩 목록 |
| RecipeView | `EquipmentSetup.cs` 등록부 | `UCRecipe`, `UCRecipeChangeHistory` — **공유 컴포넌트**이며 PTOP `Views/` 아래에 없다 |
| ManualView | `EquipmentSetup.cs` 등록부 | `UCManualScannerOperation`, `UCManualModelFinder` — 공유 컴포넌트 |
| MonitoringView | `EquipmentSetup.cs` 등록부 | `UCIOInterfaceView` 등 — 공유 컴포넌트 |
| DeviceView | `EquipmentSetup.cs:318-319`·`:310-314` | `CommonViewIds.Device`(`DeviceSettingView`) + **Monitoring 메뉴의** `PLCBitMonitoring`·`PLCWordMonitoring`·`IOInterfaceView`. 탭 내용 기준은 `05-form-schemas.md` 8탭 표의 `DeviceView` 행 (`StreamDevice`는 `:337` 별도 메인메뉴이며 SettingView 탭 소속) |
| SettingView | `EquipmentSetup.cs` 등록부 | `CommonViewIds.Setting`·`LogSetting`·`AutoBackupView` 등록 항목 |
| VisionView | `EquipmentSetup.cs:342-343` | **`(해당없음)` — AuroraVision 미사용.** `// Vision (미사용)` + `//VisionFactory.RegisterViews(manager);` 주석 처리. `CommonViewIds.Scanner`·`PixelResolution`(`:303`·`:306`)은 비전 탭이 아니라 **Calibration 메뉴**(`:302`) 소속이다 |
| OverView | `docs/architecture.md` | `CommonViewIds` 에 대응 메뉴는 없다 — 이 탭은 등록부가 아니라 **SW 개요**(플랫폼·OS·.NET·모션·레이저·PLC·비전)로 채운다 |
| Sequence 흐름 | `Sequences/SeqAutoRunPTOP.cs` | Builder() 노드 목록 순서대로 |
> PTOP의 `Views/` 하위는 **`Main/`과 `Model/` 둘뿐이다.** Recipe·Manual·Monitoring 화면은
> 공유 컴포넌트라 `EquipmentSetup.cs`의 `AddSubMenu(...)` 등록부에서 타입을 확인해야 한다.
**8탭 고정** (xlsx ref 호환): OverView / MainView / RecipeView / ManualView / DeviceView / SettingView / VisionView / Sequence 흐름
> ⚠ **탭 목록·탭별 내용의 상위 진실원은 `ubisam-deliverables/references/05-form-schemas.md`
> §`C. 기능명세서 / UI 설계` 의 8탭 표다.**
> 위 표는 "그 탭을 채우려면 어느 소스를 읽는가"만 말한다. 두 문서가 어긋나면
> `05-form-schemas.md` 를 기준으로 삼고 **같은 편집에서 이 표를 맞춘다** (`docs/harness-ptop.md` §소비처 확인 의무).
> 위 표는 이 8탭을 **전부** 담고 있다. 추가로 있는 `메뉴 구조`·`MonitoringView` 행은 탭이 아니라
> **탭을 채우기 위해 읽을 진실원**이다. 탭 수를 셀 때 포함하지 않는다.
---
## D. 제어 시퀀스·인터락 정의서
출력: `02.설계/시퀀스_인터록/제어시퀀스_인터락_정의서.md`
| 섹션 | 소스 파일 | 읽어야 할 심볼 |
|---|---|---|
| 메인 시퀀스 노드 흐름 | `SeqAutoRunPTOP.cs` | `AddAction`(17)·`AddDecision`(4)·`AddSubsequence`(3)와 `Flows(...)`(6). ⚠ `AddNode`·`AddTransition` 은 **소스에 없는 심볼이다**(Aurora API가 아니다) |
| 단계별 동작 요약 | `SeqAutoRunPTOP.cs` | 각 노드 메서드 구현 첫 줄 주석·로그 |
| 인터락 정의 | `Settings/LaserInterlockSetting.cs` | `HeadThetaInterlockEnabled`, `HeadThetaTolerance` |
| 인터락 정의 (추가) | `SeqAutoRunPTOP.cs` | `LaserInterlock` 처리 |
| 중알람 감시 | `Sequences/Monitoring/SeqAlarmMonitor.cs` | `PLC_HEAVY_ALARM_STATUS` 처리 (정의는 `PLCController.Address.cs`) — `SeqAutoRunPTOP.cs`에는 없다 |
| 정지/에러 처리 | `SeqAutoRunPTOP.cs` | `OnStopped`, `OnForceError`, `ResumeMode` |
**Resume(bit15) 흐름**: `PLC_WELD_READY_REQ(0x0F)` 수신 → 팝업 + Auto→Manual 전환 → `PC_WELD_READY_ACK(0x0F)` ON → 1사이클 후 OFF.
> 출처 주의 — 네 곳으로 나뉜다. 시퀀스 파일만 뒤지면 못 찾는다.
> `UCMainAutoRunViewModel.cs:209`=수신 · `:270`=ACK ON · `:271-277`=**1초 펄스 OFF(`DispatcherTimer`)** ·
> `SeqAutoRunPTOP.cs:875`=사이클 종료 OFF. **OFF 경로가 둘이다** — 1초 타이머와 사이클 종료.
---
## E. TactTime 산정서
출력: `02.설계/시퀀스_인터록/TactTime_산정서.md`
> **아래 상수는 반드시 소스에서 재확인하고 `파일:라인`을 병기한다.** 표에 적힌 값은 마지막 확인 시점의
> 것이고, 심볼이 사라지거나 값이 바뀌었을 수 있다. 찾지 못하면 지어내지 말고 `미확인`으로 남긴다.
| 단위동작 | 소스 파일 | 상수/값 | 최종 확인 |
|---|---|---|---|
| Gate ON delay | `SeqAutoRunPTOP.cs` | `laserEmissionGateDelayMs` | 실재 확인 (2026-08-03) |
| Jump 복귀 | `SeqAutoRunPTOP.cs` | `Thread.Sleep(500)` | 실재 확인 (2026-08-03) |
| Pre/Post Scout | `SeqAutoRunPTOP.cs` | `SCOUT_PROCEED_DELAY_MS` | 실재 확인 (2026-08-03) |
| 실제 발진 | `SeqAutoRunPTOP.cs` | 로그 `"TactTime: [Nms]"` — **런타임 값. 실측 없이 기재 금지** | — |
| Page 검증 지연 | `SeqAutoRunPTOP.cs` | 해당 상수를 소스에서 찾아 기입 | 미확인 |
| 준비 응답 지연 | `SeqAutoRunPTOP.cs` | 해당 상수를 소스에서 찾아 기입 | 미확인 |
| 완료비트 지연 | `SeqAutoRunPTOP.cs` | 해당 상수를 소스에서 찾아 기입 | 미확인 |
---
## F. _task.md 진행률 기준 (현황 기준)
> **이 표는 실행 시점에 재산출한다.** 아래 값은 작성 당시 스냅샷이며, 그대로 복사하면 안 된다.
> 각 단계 폴더의 실제 산출물 존재 여부를 세어 진행률을 다시 계산하라.
| 단계 | 상태 | 진행률(스냅샷) | 근거 |
|---|---|---|---|
| 1.분석/협의 | 미산출 | 미산출 — 실행 시 계산 | 슬롯 폴더의 실제 산출물 수로 산정 |
| 2.설계 | 미산출 | 미산출 — 실행 시 계산 | 〃 |
| 3.제작 | 미산출 | 미산출 — 실행 시 계산 | 〃 |
| 4.셋업 | 미산출 | 미산출 — 실행 시 계산 | 〃 |
| 5.양산 | 미산출 | 미산출 — 실행 시 계산 | 〃 |
| 6.CS | 미산출 | 미산출 — 실행 시 계산 | 〃 |
> 이 값은 스킬 실행 시점 기준. 재실행 시 소스·폴더 현황 재확인 후 갱신.