# 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 | 미산출 | 미산출 — 실행 시 계산 | 〃 | > 이 값은 스킬 실행 시점 기준. 재실행 시 소스·폴더 현황 재확인 후 갱신.