# 05 · 설계 양식 시트·컬럼 스키마 > **재생산 방식 (2026-06-29 확정): 완전 독립 (ref 파일 불필요)** > xlsx는 `xlsxfill.py` 의 하드코딩 스타일 상수와 `build_02설계_xlsx.py` 의 PtoP 데이터만으로 처음부터(`from scratch`) 생성한다. ref 원본 xlsx 없이도 동일한 외형을 재현한다. > > **재생산 도구 (영구 보존)** > - `xlsxfill.py` — 같은 폴더. LG PRI 스타일 상수 + `make_workbook / write_banner / write_header_row / write_data_rows / group_merge` scratch-build API. > - `build_02설계_xlsx.py` — 같은 폴더. PtoP 데이터 내장, 단독 실행으로 4개 xlsx 재생산. > ``` > cd E:\Work\GIT\LGES-OC5-PtoP-Welder > set PYTHONUTF8=1 > py .claude/skills/ubisam-deliverables/references/build_02설계_xlsx.py > ``` > - 전제조건: Python 3.9+, openpyxl >= 3.1 (`pip install openpyxl`) > > **공통 관례**: ① 배너 B2=제목, B3=근거/부제 ② 미확정 값은 `(제안)` 표기 ③ Aurora 고정 문구 "운영 SW는 LG PRI의 Aurora 플랫폼으로 개발" --- ## 스타일 상수 (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 컬럼)에 삽입. --- ## A. 모션축·IO 맵 정의서 (슬롯 `02.설계/IO_DB설계/모션축_IO맵_정의서.xlsx`) **3탭 고정** | 탭명 | 헤더(B4~) | 데이터 시작행 | PtoP 특이사항 | |---|---|---|---| | 통신·제어 구성 | 구분\|대상\|컨트롤러/디바이스\|통신/버스\|수량·범위\|비고 | B5 | PLC=MXComponent, IO=Ajin, Laser=IOGate, Scanner=RTC | | 모션축 정의(ACS) | Axis\|축명(논리)\|용도\|컨트롤러/통신\|구동\|행정/범위\|최대속도\|Home방식\|Soft Limit\|동기/단축\|비고 | B5 | X/Y=ACS EtherCAT, Z=Ajin, Scanner θ/XY=RTC. 행정·속도·Home=(제안) | | I-O 맵(Ajin) | No\|신호명\|Type\|권장모듈\|슬롯/CH\|Active\|설명/인터락\|비고 | B5 | Ajin 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~`. - PtoP 핸드셰이크: PAGE_REQ 단일 게이트 → Recipe 확정 → Page 3회 검증 → 리스트 업로드 → 발진 → 완료. ## 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 | — | PAGE_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 흐름도. 메인 시퀀스: PAGE_REQ 단일게이트 → 리스트 업로드 → 발진 → 완료비트. 분기·인터락 표현. ## enum 요약(양식 고정값) - I/O Type: DI · DO · AI · AO - 신호 Type: BIT · INT · INT32 - PLC Seq 구분: Status · Alarm · Process · Request · Info · Control · Model · Interlock - 운영 모드: 수동 · 반자동 · 자동 > 재생산 시 항상 `build_02설계_xlsx.py` 를 실행할 것. 스크립트는 cwd=repo root 기준으로 실행.