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

201 lines
9.9 KiB
Markdown

---
name: analyze-ptop-architecture
description: ILSOS_PrismaticRD_PTOP의 3계층 아키텍처(UI → Machine Logic → Device)를 분석하고 검증. EquipDef.cs, EquipmentSetup.cs, Sequences/, Device/ 폴더의 관계를 맵핑하고 Rx.NET 이벤트 흐름을 추적. 디바이스 스택(PLC, Laser, OCT, CellTracker) 통합 여부 검증. "PTOP 아키텍처 분석", "PTOP 계층 구조 검토", "디바이스 스택 파악" 처럼 **구조·의존성 한 영역만** 볼 때 쓴다. 구분 — 아키텍처·구현·빌드를 함께 보려는 요청("PTOP 전체 점검", "종합 분석", "구조 파악")은 `orchestrate-ptop-harness`를 쓴다. 맨손 "업데이트"·"다시 실행"만으로는 이 스킬을 고르지 않는다 — 대상을 먼저 확인한다.
---
# Analyze PTOP Architecture Skill
## 목표
ILSOS_PrismaticRD_PTOP의 **3계층 아키텍처 전체 그림**을 명확히 파악하고 문서화한다.
## 분석 단계
> **소스 루트 = `Machines/ILSOS_PrismaticRD_PTOP/`.** 이 문서의 상대 경로(`Sequences/…`,
> `Device/PLC/…`)는 모두 그 아래다. 저장소 루트의 동명 폴더 `ILSOS_PrismaticRD_PTOP/`은
> 빌드 산출물(.pdb)이므로 거기서 소스를 찾지 말 것.
### 1단계: EquipDef.cs & EquipmentSetup.cs 분석
**EquipDef.cs에서 수집할 항목:**
- `DeviceIds : CommonDeviceIds`에 **직접 선언된** 상수 (`MassFlowMeter` 등) + base에서 상속된 것
- `SequenceIds : CommonSequenceIds`에 **직접 선언된** 상수 —
`SeqStreamTest`, `SeqEventQTest`, `SeqTestRun`, `SeqAutoRunComponentWeld`, `SeqAlarmMonitor`,
`SeqStatusMonitor`, `SeqAutoRunTDC`, `SeqAutoRunPTOP` (8개)
- 커스텀 `DeviceIds` / `SequenceIds` / `SettingIds` / `StreamMessageNames`
(`MotorIds`·`RecipeIds` 클래스는 **없다** — base `Common*`·레시피 매니저가 관리)
**EquipmentSetup.cs에서 수집할 항목:**
- `GetEquipmentName()` → 장비명 확인 ("ILSOS PrismaticRD_PTOP")
- `BuildMainStatusView()` → 표시되는 디바이스 (CellTracker, OCT)
- `OnSetAlarm()` 로직 → 알람 처리
- `OnStartUp()` 로직 → 초기화 순서
- SequenceBuilder 선언과 **실제 `register(...)` 여부는 다르다.** `EquipmentSetup.cs:206-218` 기준:
- `_SeqAutoRunPrismatic_Builder` → **등록됨**(`:211`, `SequenceIds.SeqAutoRun`)
- `_SeqAutoRunComponentWeld_Builder` → 대입은 되나 **등록 주석 처리**(`:212`)
- `_SeqTestRun_Builder` → **선언만·대입 없음**, 등록도 주석(`:213`)
- `_SeqAlarmMonitor_Builder` → **등록됨**(`:214`)
- `SeqStatusMonitor.Builder()` → **필드 없이 직접 등록됨**(`:215`) — 빌더 필드만 보면 놓친다
- `_SeqAutoRunPTOP_Builder` → **등록됨**(`:218`), 메인 시퀀스 (260605)
> 목록을 그대로 옮기지 말고 **작업 전 `register(` 호출부를 실제로 나열해 대조하라** —
> 주석 처리 여부까지 확인해야 "빌드되는 시퀀스"를 정확히 말할 수 있다.
**출력:** `_workspace/01a_equipdef_analysis.md`
### 2단계: Sequences/ 폴더 구조 분석
**주요 파일들:**
```
Sequences/
├── SeqAutoRunPTOP.cs ← 메인 (분석 우선순위 1, 260605)
├── SeqAutoRunPrismatic.cs ← 기존 (2026-06-18에 SeqAutoRunPrismaticScanner에서 개명)
├── SeqAutoRunComponentWeld.cs
├── SeqTestRun.cs
├── SeqStreamTest.cs
├── SeqEventQTest.cs
├── SeqWaitWeldOrChangePage.cs
├── LaserAngleOffsetSelector.cs
├── SequenceContextEx.cs ← 컨텍스트 정의
├── SequenceManager.cs ← 시퀀스 관리
├── Monitoring/
└── Manual/
```
> 트리는 참고용이다. **작업 전 `Sequences/`를 실제로 나열해 대조하라** — 이 목록이 낡았을 수 있다.
**각 시퀀스 분석 항목:**
- 용도 (주 시퀀스? 테스트? 모니터링?)
- 상태 머신 정의 (시작, 대기, 실행, 완료, 에러)
- 타이밍 (예상 소요시간)
- 호출하는 디바이스 목록
- 의존성 (다른 시퀀스에 의존하는가?)
**특히 SeqAutoRunPTOP.cs:**
- 상태 다이어그램 작성
- 각 상태에서 호출되는 디바이스/API 추적
- 타임아웃/재시도 로직
**출력:** `_workspace/01b_sequences_analysis.md`
### 3단계: Device/ 폴더 분석
**파일 구조:**
```
Device/
├── PLC/
│ ├── PLCContoller.Config.cs ← 생성자·접속 설정만. 18줄, 주소 0건 (Controller 아님 — 저장소 오탈자)
│ ├── PLCController.Logic.cs ← 읽기/쓰기 로직
│ └── PLCController.Address.cs ← PLC 주소 맵의 진실원. 신호 상수 enum
└── IO/
└── PAIX_PTOP.cs ← IO 제어 (2026-06-18 개명)
```
> **동명 심볼 함정.** `WeldingCommon.Devices.Laser.PAIX_PrismaticScanner`(공유)와
> `WeldingComponents/WeldingCommon/Devices/PLC/PLCController.Config.cs`(공유, 오탈자 없음)는
> 개명되지 않고 그대로 존재한다. 머신 쪽 파일과 혼동하지 말 것.
**PLC 분석:** (모든 값은 `PLCController.Address.cs`의 enum에서 읽어 `파일:라인`과 함께 적는다)
- 실제 사용되는 주소 범위 — 추정하지 말고 enum 정의에서 확인
- 주요 신호 목록 (eBitInput/eBitOutput/eWordInput/eWordOutput)
- 읽기·쓰기 주기, 타임아웃 — 코드 상수 기준. 못 찾으면 `불명확 — 확인 필요`
**IO 분석:**
- 입력 신호 (센서, 스위치)
- 출력 신호 (제어 신호)
- 각 신호의 의미
**출력:** `_workspace/01c_device_analysis.md`
### 4단계: Rx.NET 이벤트 흐름 분석
**수집할 정보:**
- System.Reactive 사용 패턴 (Observable, Subject, etc.)
- 메시지 타입 (String/Double/Int/JSON/LBAD)
- 구독자 목록 (누가 어떤 메시지를 구독?)
- 백프레셔/에러 처리
**파이프라인 예시:**
```
[PLC Status] Observable
├─→ Filter(Ready == true)
├─→ Select(x => new LaserCommand())
└─→ Subscribe(Laser.Execute())
```
**출력:** `_workspace/01d_rxnet_analysis.md`
### 5단계: 외부 디바이스 통합 검증
**검증 대상:**
- PLC (Mitsubishi)
- Laser (AuroraLaser)
- OCT Scanner (AuroraOCT)
- CellTracker (AuroraCellTracker)
- IO (PAIX)
**각 디바이스마다:**
- 초기화 시점
- 활성화 조건
- 사용 방식 (동기/비동기)
- 에러 처리
- 정상 종료 절차
**출력:** `_workspace/01e_device_integration.md`
## 통합 산출물
### 최종 보고서: `_workspace/01_ptop_architecture.md`
보고서 골격은 [references/report-template.md](references/report-template.md) 참조.
모든 항목에 `파일:라인` 근거를 붙이고, 확인 못 한 내용은 `불명확 — 확인 필요`로 남긴다.
**단독 기동으로 `01`을 갱신했으면 stale 표기 의무는 여전히 네게 있다.** "아키텍처만 다시" 같은 요청은
이 스킬로도, `orchestrate-ptop-harness`로도 들어올 수 있는데 오케스트레이터 경유가 아니면 표기해 줄 주체가 없다.
`01`의 첫 줄에 `이번 실행에서 갱신됨(YYYY-MM-DD)` 을 적고, **이 파일에 의존하는 `02`·`03`이 이미 있으면**
그 두 파일 첫 줄에 `이전 실행 결과 재사용 — 01 갱신으로 정합성 미확인(YYYY-MM-DD)` 을 남긴다
(문구 3종 → `orchestrate-ptop-harness/references/data-protocol.md`).
**코드로 확인하지 않은 인과·해석은 문장 앞에 `[추론]`을 붙인다** (`rules.md` #15·#16).
`불명확 — 확인 필요`(값을 못 찾음)와 축이 다르니 대체하지 말고 필요하면 병기한다.
확인한 뒤에는 `[추론]`을 떼고 `파일:라인`으로 바꾼다.
## 입력 조건
> **단독 호출 시**: 생성할 `_workspace/` 파일 목록을 사용자에게 제시하고 승인받은 뒤 시작한다
> (`rules.md` #2). 오케스트레이터(`orchestrate-ptop-harness`)를 통해 호출된 경우는 이미 승인을 받았으므로 생략한다.
사용자가 다음과 같이 요청할 때:
- "PTOP 아키텍처 분석해줘"
- "PTOP 계층 구조 검토"
- "PTOP에서 PLC, Laser, OCT가 어떻게 연결되어있는지"
- "PTOP 3계층 아키텍처 검증"
> "PTOP 전체 점검"·"종합 분석"처럼 **구현·빌드까지 함께** 보려는 요청은 이 스킬이 아니라
> `orchestrate-ptop-harness`다. 시퀀스 내부 동작만이면 `analyze-ptop-implementation`,
> 빌드/CI면 `optimize-ptop-build`.
## 출력 결과
- 5개 상세 분석 문서 (`_workspace/01a~01e_*.md`)
- 통합 보고서 (`_workspace/01_ptop_architecture.md`)
- 다이어그램 (3계층, 상태 머신, 이벤트 흐름)
## 주의사항
1. **코드 읽기 능력이 중요** — C#, WPF, Rx.NET 이해 필수
2. **불명확한 부분은 기록** — "이 부분은 왜 이렇게?"라는 질문을 명시
3. **Namespace** — 대부분 `ILSOS_PrismaticRD_PTOP.*`이고 옛 `ILSOS_PrismaticScanner`는 0건이다.
단 **프로젝트 내 예외 3개**: `Sequences/SeqTestRun.cs:35`=`ILSOS_PrismaticRD_TDC.Sequences`,
`Sequences/Monitoring/SeqAlarmMonitor.cs:22`·`SeqStatusMonitor.cs:11`=`WeldingCommon.Sequences`.
네임스페이스로 grep하면 이 3개가 누락된다 — 파일 경로로 찾을 것.
또한 **공유 프로젝트에는 `PAIX_PrismaticScanner` 같은 옛 이름 심볼이 그대로 남아 있으니** 머신 심볼과 혼동 금지
4. **260605 변경 이후 상태 파악** — SeqAutoRunPTOP이 최신 메인 시퀀스
5. **한글 주석 인코딩** — `docs/CODING_RULES.md` 확인
6. **주석·변수명·함수명을 맹신하지 않는다** (`rules.md` #1) — 위 3의 `PAIX_PrismaticScanner` 잔존이
그 사례다. 이름이 계층·소속을 말해 주지 않으므로 등록부·구현 본문으로 확인한다.
> 이 스킬은 10분을 넘긴다 — **단계 전환마다 지금 어느 단계인지 한 줄로 보고한다**(`rules.md` #10).
>
> 단독 호출로 마무리할 때: 보고는 `rules.md` #11~13 출력 형식(수정 줄=초록 화살표, 단어=주황, 미변경=기본색)을
> 따르고, 끝에 관련 `.md`를 갱신할 부분이 있는지 묻는다(`rules.md` #6).