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

110 lines
7.7 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.

# 05 · 설계 양식 시트·컬럼 스키마
> **재생산 방식 (2026-06-29 확정): 완전 독립 (ref 파일 불필요)**
> xlsx는 `xlsxfill.py` 의 하드코딩 스타일 상수와 `build_02설계_xlsx.py` 의 PtoP 데이터만으로 처음부터(`from scratch`) 생성한다. ref 원본 xlsx 없이도 동일한 외형을 재현한다.
>
> **재생산 도구 (영구 보존)**
> - `xlsxfill.py` — 같은 폴더. xlsxfill.py 내장 스타일 상수 + `make_workbook / write_banner / write_header_row / write_data_rows / group_merge` scratch-build API.
> - `build_02설계_xlsx.py` — 같은 폴더. PtoP 데이터 내장, 단독 실행으로 4개 xlsx 재생산.
> ```
> PYTHONUTF8=1 py .claude/skills/ubisam-deliverables/references/build_02설계_xlsx.py
> ```
> 저장소 루트에서 한 줄로 실행한다. `PYTHONUTF8`을 별도 줄에 두면 적용되지 않는다.
>
> **⚠ 이 스크립트는 PTOP 소스 유래 재생산(`ptop-deliverables`) 전용이다.**
> 타사 문서를 재생산하는 `ubisam-deliverable-rebuild` 경로에서는 쓰지 않는다 —
> 데이터가 코드에 하드코딩돼 있어 매핑표를 반영할 수 없다(`ubisam-producer.md` §2).
> - 전제조건: Python 3.9+, openpyxl >= 3.1 (`pip install openpyxl`)
>
> **공통 관례**: ① 배너 B2=제목, B3=근거/부제 ② 미확정 값은 `(제안)` 표기 ③ 플랫폼 문구는 `_meta/project.yaml`에서 읽는다 (특정 문구를 여기에 하드코딩하지 않는다)
---
## 스타일 상수 (xlsxfill.py 하드코딩값)
| 구분 | 폰트 | 색상(fgColor) | 테두리 |
|---|---|---|---|
| 배너 행(B2) | 맑은 고딕 13pt Bold White(FFFFFF) | FF1F4E78 (진네이비) | medium all |
| 부제 행(B3) | 맑은 고딕 9pt | 없음 | medium L/R/T |
| 헤더 행 | 맑은 고딕 11pt Bold White(FFFFFF) | FF2E75B6 (파랑) | medium 좌우, thin 상하 |
| 데이터 행(홀수) | 맑은 고딕 10pt | FFDDEBF7 (연파랑) | medium 좌우, thin 상하 |
| 데이터 행(짝수) | 맑은 고딕 10pt | FFFFFFFF (흰색) | medium 좌우, thin 상하 |
| 기능명세서 배너 | 맑은 고딕 14pt Bold | 없음 | medium all |
| 기능명세서 헤더 | 맑은 고딕 11pt Bold | **없음** | thin all |
| 기능명세서 데이터 | 맑은 고딕 11pt | 없음 | thin all |
| TactTime 헤더 | 맑은 고딕 11pt | **없음** | thin all |
| TactTime 데이터 | 맑은 고딕 11pt | 없음 | thin all |
> `write_header_row(fill=None)` — 배경 없음(기능명세서·TactTime 계열). 인자 생략 시 파랑(HEADER_FILL) 기본값. `fill=_UNSET` sentinel으로 구분.
> `TODAY = datetime.date.today()` — 실행일 자동 반영. 이력 셀(Update 컬럼)에 삽입.
> **`xlsxfill.py` 가 아니라 `build_02설계_xlsx.py:41` 의 모듈 상수다** — 새 빌드 스크립트를 쓸 때는
> `xlsxfill` 에서 임포트되지 않으므로 직접 정의해야 한다.
---
## A. 모션축·IO 맵 정의서 (슬롯 `02.설계/IO_DB설계/모션축_IO맵_정의서.xlsx`)
**3탭 고정**
| 탭명 | 헤더(B4~) | 데이터 시작행 | PtoP 특이사항 |
|---|---|---|---|
| 통신·제어 구성 | 구분\|대상\|컨트롤러/디바이스\|통신/버스\|수량·범위\|비고 | B5 | PLC=MXComponent, IO=**보드타입 런타임 설정(미확정)**, Laser=IOGate, Scanner=RTC |
| 모션축 정의(ACS) | Axis\|축명(논리)\|용도\|컨트롤러/통신\|구동\|행정/범위\|최대속도\|Home방식\|Soft Limit\|동기/단축\|비고 | B5 | X/Y=ACS EtherCAT, Z=AuroraMotionBoard(보드타입 미확정), Scanner θ/XY=RTC. 행정·속도·Home=(제안) |
| I-O 맵(DI-DO) | No\|신호명\|Type\|권장모듈\|슬롯/CH\|Active\|설명/인터락\|비고 | B5 | DI 9~23 / DO 9~17 (`PAIX_PTOP.cs` — 채널 번호만. **벤더명은 이 파일에 없다**) |
## B. PLC-PC 인터페이스 신호 정의서 (슬롯 `02.설계/IO_DB설계/PLC_PC_인터페이스_신호정의서.xlsx`)
**4탭 고정**
| 탭명 | 헤더(B4~) | 데이터 시작행 |
|---|---|---|
| 통신 사양 | 항목\|내용 | B5 |
| PC→PLC (Write) | No\|Seq/구분\|신호명\|방향\|디바이스(제안)\|Type\|의미 / 트리거\|응답·완료\|비고 | B5 |
| PLC→PC (Read) | 동일 | B5 |
| 핸드셰이크 시퀀스 | No\|Seq\|Step\|주체\|동작 / 신호\|디바이스(제안)\|비고 | B5 |
- Seq 구분 enum: Status · Alarm · Process · Request · Info · Control · Model · Interlock
- 디바이스: 비트 `M70000~`(PC Write), `M70500~`(PLC Read). 워드 `D70000~`/`D70500~`.
**⚠ 전부 `(제안)` 값이다** — 이 주소들은 `.cs` 소스에 0건이고 근거는 분석 문서뿐이다
(`ptop-deliverables/references/source-map.md` §A 참조). 산출물에 확정값처럼 적지 말 것.
- PtoP 핸드셰이크: `PLC_PAGE_CHANGE_REQ` 단일 게이트 → Recipe 확정 → **Page 3회 검증**(200ms×3) → 리스트 업로드 → 발진 → 완료.
출처: `SeqAutoRunPTOP.cs` `CheckPageNoComp` — `checknum > 2`에서 break하므로 정확히 3회이고
각 회차에 `Thread.Sleep(200)`이 있다. `plcPageNoList[0]/[1]/[2]` 로그가 3회를 확증한다.
⚠ 같은 함수의 `260618` 주석은 "상한 하드코딩(>2) 제거 → Recipe 페이지 수로 가변 검증"이라고
적혀 있으나 **코드는 아직 `>2` 고정**이다(`recipePageCount`는 값 범위 검증에만 쓰인다).
주석을 근거로 "가변"이라 적지 말 것 (`rules.md` #1).
## C. 기능명세서 / UI 설계 (슬롯 `02.설계/UIUX_기능설계/기능명세서.xlsx`)
**8탭 고정** (우리 설비에 없는 탭도 양식 유지)
| 탭명 | 헤더(행5~) | G3 배너 | PtoP 내용 |
|---|---|---|---|
| OverView | no.\|Content | — | SW 개요(Aurora·Win11·.NET·설비·모션·레이저·PLC·비전) |
| MainView | Update\|Funtion Area\|Funtion Name\|NO\|Sub\|Content | "다음은 Main 화면…" | AutoRun 시작/정지·페이지·Resume(bit15)·스캐너캔버스 |
| RecipeView | 동일 | "다음은 Recipe 화면…" | ActivateRecipe·변경이력·모델 편집 |
| ManualView | 동일 | "다음은 Manual 화면…" | ScannerOperation·ModelFinder·Calibration |
| DeviceView | 동일 | "다음은 Device 화면…" | DeviceSetting·PLCBit/Word·IOInterface |
| SettingView | 동일 | "다음은 Setting 화면…" | Equipment·Log·AutoBackup·Alarm·Stream |
| VisionView | 동일 | "다음은 Vision 화면…" | `(해당없음)` — AuroraVision 미사용 |
| Sequence 흐름 | Update\|Funtion Area\|Processing Name\|NO\|Content | — | `PLC_PAGE_CHANGE_REQ` 게이트→Recipe→Page→ListUpload→발진→완료→루프백 |
## D. TactTime 산정서 (슬롯 `02.설계/시퀀스_인터록/TactTime_산정서.xlsx`)
**2탭 고정**
| 탭명 | 좌측 컬럼 | 우측 컬럼 | PtoP 내용 |
|---|---|---|---|
| PC TactTime | 공정\|Unit\|단위동작\|T/T | Working Process\|상세합계\|기준/참조합계 | SeqAutoRunPTOP.cs 타이밍 (Page gate·Recipe·발진·완료) |
| PLC TactTime | 동일 구조 | — | 미입수 → `(제안)` |
## E. Flow Chart (슬롯 `02.설계/시퀀스_인터록/`)
- 형식: PPTX 흐름도. 메인 시퀀스: `PLC_PAGE_CHANGE_REQ` 단일게이트 → 리스트 업로드 → 발진 → 완료비트. 분기·인터락 표현.
## enum 요약(양식 고정값)
- I/O Type: DI · DO · AI · AO
- 신호 Type: BIT · INT · INT32
- PLC Seq 구분: Status · Alarm · Process · Request · Info · Control · Model · Interlock
- 운영 모드: 수동 · 반자동 · 자동
> **재생산 도구 선택은 이 문서 상단의 ⚠ 박스를 따른다.**
> `ptop-deliverables`(소스 유래) 경로에서만 `build_02설계_xlsx.py`를 저장소 루트에서 실행한다.
> `ubisam-deliverable-rebuild`(타사 문서 재생산) 경로에서는 이 스크립트를 쓰지 않고
> `xlsxfill.py` 기반 신규 스크립트를 작성한다(`ubisam-producer.md` §2).