# 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).