공장 데이터 모델링
Demo UNS 구조
섹션 제목: “Demo UNS 구조”물리 데이터
섹션 제목: “물리 데이터”물리적 위치가 있는 기계와 설비의 산업 데이터는 일반적으로 ISA-95 표준을 기반으로 모델링합니다.
Demo Model
섹션 제목: “Demo Model”Enterprise (Level 4)└── Site (Level 3/4) └── Area (Level 3) └── Work Center / Process Cell (Level 2/3) └── Equipment / Unit (Level 1/2) └── Control Module / Device (Level 0/1)DemoFactory└── Site_01 └── Production └── Line_01 └── WorkOrderExecution ├── Metric │ ├── Target_Qty │ ├── Produced_Qty │ ├── Defect_Qty │ └── Completion_Rate └── State ├── CurrentWorkOrder └── WorkOrderStatus{ "namespace": [ { "name": "DemoFactory", "alias": "DemoFactory_9e50bbcd833d", "type": "PATH", "children": [ { "name": "Site_01", "alias": "DemoFactory__6d1fcad14e86", "type": "PATH", "children": [ { "name": "Production", "alias": "__Site_01_Pro_91523d2ad304", "type": "PATH", "children": [ { "name": "Line_01", "alias": "__Production__acd5841c1ada", "type": "PATH", "children": [ { "name": "WorkOrderExecution", "alias": "__Line_01_Wor_54904ff56e91", "type": "PATH", "children": [ { "name": "Metric", "alias": "metric_233fd84305c4", "type": "PATH", "children": [ { "name": "Target_Qty", "alias": "Target_Qty_8646b092e543", "type": "TOPIC", "topicType": "METRIC", "description": "Target quantity for the current Work Order.", "fields": [ { "name": "production_order_id", "type": "STRING" }, { "name": "plan_id", "type": "STRING" }, { "name": "plan_number", "type": "STRING" }, { "name": "work_order_id", "type": "STRING" }, { "name": "value", "type": "DOUBLE" }, { "name": "unit", "type": "STRING" }, { "name": "timestamp", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" }, { "name": "Produced_Qty", "alias": "Produced_Qty_1f8cd3e11f77", "type": "TOPIC", "topicType": "METRIC", "description": "Produced quantity for the current Work Order.", "fields": [ { "name": "production_order_id", "type": "STRING" }, { "name": "plan_id", "type": "STRING" }, { "name": "plan_number", "type": "STRING" }, { "name": "work_order_id", "type": "STRING" }, { "name": "value", "type": "DOUBLE" }, { "name": "unit", "type": "STRING" }, { "name": "timestamp", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" }, { "name": "Defect_Qty", "alias": "Defect_Qty_b48fb3563ec1", "type": "TOPIC", "topicType": "METRIC", "description": "Defect quantity for the current Work Order.", "fields": [ { "name": "production_order_id", "type": "STRING" }, { "name": "plan_id", "type": "STRING" }, { "name": "plan_number", "type": "STRING" }, { "name": "work_order_id", "type": "STRING" }, { "name": "value", "type": "DOUBLE" }, { "name": "unit", "type": "STRING" }, { "name": "timestamp", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" }, { "name": "Completion_Rate", "alias": "Completion_R_7294e38e1530", "type": "TOPIC", "topicType": "METRIC", "description": "Completion percentage for the current Work Order.", "fields": [ { "name": "production_order_id", "type": "STRING" }, { "name": "plan_id", "type": "STRING" }, { "name": "plan_number", "type": "STRING" }, { "name": "work_order_id", "type": "STRING" }, { "name": "value", "type": "DOUBLE" }, { "name": "unit", "type": "STRING" }, { "name": "timestamp", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" } ] }, { "name": "State", "alias": "state_539a0f331fe0", "type": "PATH", "children": [ { "name": "CurrentWorkOrder", "alias": "CurrentWorkO_a638320784dd", "type": "TOPIC", "topicType": "STATE", "description": "Current active Work Order on Line_01.", "fields": [ { "name": "production_order_id", "type": "STRING" }, { "name": "plan_id", "type": "STRING" }, { "name": "plan_number", "type": "STRING" }, { "name": "work_order_id", "type": "STRING" }, { "name": "target_line", "type": "STRING" }, { "name": "workstation", "type": "STRING" }, { "name": "product_code", "type": "STRING" }, { "name": "target_qty", "type": "DOUBLE" }, { "name": "unit", "type": "STRING" }, { "name": "started_at", "type": "DATETIME" }, { "name": "updated_at", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" }, { "name": "WorkOrderStatus", "alias": "WorkOrderSta_e24e3bf113d1", "type": "TOPIC", "topicType": "STATE", "description": "Execution status of the current Work Order.", "fields": [ { "name": "production_order_id", "type": "STRING" }, { "name": "plan_id", "type": "STRING" }, { "name": "plan_number", "type": "STRING" }, { "name": "work_order_id", "type": "STRING" }, { "name": "status", "type": "STRING" }, { "name": "reason", "type": "STRING" }, { "name": "updated_at", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" } ] } ] } ] } ] } ] } ] } ]}비즈니스 데이터
섹션 제목: “비즈니스 데이터”ERP의 생산 주문, 작업 지시 계획 같은 비즈니스 계획 및 프로세스 객체는 비즈니스 context에 맞게 모델링합니다.
비즈니스 데이터 모델링 Guide
섹션 제목: “비즈니스 데이터 모델링 Guide”Factory / Business Domain / Business Object / Topic Type / Topic-
Business Domain: data가 속한 business process 또는 system을 확인합니다.
Terminal window ERPMESWMSQMSEAMLIMSPlanningInventoryMaintenanceQualityLogistics... -
Business Object: business domain에서 관리되는 핵심 object입니다.
Terminal window ProductionOrdersWorkOrderPlanMaterialInventoryQualityInspectionMaintenanceOrdersPurchaseOrdersShipments... -
Topic Type: Metric, Action, State 중 data type을 선택합니다.
Topic Type Used for Examples
| STATE | 현재 상태 또는 현재 사실 | work order status, order status, equipment status | | METRIC | 지속적으로 변하는 숫자 값 | Temperature, speed, output, OEE, energy consumption | | ACTION | 외부 실행자를 위한 command | 설비 시작, 설비 정지, alarm reset, work order dispatch 요청 |
Demo Model
섹션 제목: “Demo Model”DemoFactory└── ERP ├── ProductionOrders │ └── State │ ├── UpsertProductionOrder │ └── OrderList └── WorkOrderPlan ├── Metric │ └── SplitCount └── State ├── PlanStatus └── WorkOrderList{ "namespace": [ { "name": "DemoFactory", "alias": "DemoFactory_f925c1ec5041", "type": "PATH", "children": [ { "name": "ERP", "alias": "DemoFactory__e504805b1973", "type": "PATH", "children": [ { "name": "ProductionOrders", "alias": "__ERP_Product_1e7984ac3a1d", "type": "PATH", "children": [ { "name": "State", "alias": "state_c2616c8698fa", "type": "PATH", "children": [ { "name": "UpsertProductionOrder", "alias": "UpsertProduc_d5f166da35c6", "type": "TOPIC", "topicType": "STATE", "description": "Event for creating or updating a Production Order from WOM or ERP simulation.", "fields": [ { "name": "event_id", "type": "STRING" }, { "name": "event_type", "type": "STRING" }, { "name": "source", "type": "STRING" }, { "name": "production_order_id", "type": "STRING" }, { "name": "order_number", "type": "STRING" }, { "name": "product_code", "type": "STRING" }, { "name": "planned_qty", "type": "DOUBLE" }, { "name": "unit", "type": "STRING" }, { "name": "status", "type": "STRING" }, { "name": "due_date", "type": "DATETIME" }, { "name": "updated_at", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" }, { "name": "OrderList", "alias": "OrderList_11fbca51a2bd", "type": "TOPIC", "topicType": "STATE", "description": "Retained compatibility snapshot of current Production Orders.", "fields": [ { "name": "orders", "type": "STRING" }, { "name": "updated_at", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" } ] } ] }, { "name": "WorkOrderPlan", "alias": "__ERP_WorkOrd_19f04960daf5", "type": "PATH", "children": [ { "name": "Metric", "alias": "metric_17258b809a4f", "type": "PATH", "children": [ { "name": "SplitCount", "alias": "SplitCount_032e86f5fbfc", "type": "TOPIC", "topicType": "METRIC", "description": "Number of executable Work Orders generated from a Work Order Plan.", "fields": [ { "name": "production_order_id", "type": "STRING" }, { "name": "plan_id", "type": "STRING" }, { "name": "plan_number", "type": "STRING" }, { "name": "split_count", "type": "INTEGER" }, { "name": "updated_at", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" } ] }, { "name": "State", "alias": "state_884cee548bf7", "type": "PATH", "children": [ { "name": "PlanStatus", "alias": "PlanStatus_2e21c1327c49", "type": "TOPIC", "topicType": "STATE", "description": "Current lifecycle status of a Work Order Plan.", "fields": [ { "name": "production_order_id", "type": "STRING" }, { "name": "plan_id", "type": "STRING" }, { "name": "plan_number", "type": "STRING" }, { "name": "status", "type": "STRING" }, { "name": "updated_at", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" }, { "name": "WorkOrderList", "alias": "WorkOrderLis_887b92f26fc2", "type": "TOPIC", "topicType": "STATE", "description": "Split result list generated from a sent Work Order Plan.", "fields": [ { "name": "production_order_id", "type": "STRING" }, { "name": "plan_id", "type": "STRING" }, { "name": "plan_number", "type": "STRING" }, { "name": "split_count", "type": "INTEGER" }, { "name": "lines", "type": "STRING" }, { "name": "updated_at", "type": "DATETIME" } ], "enableHistory": "TRUE", "mockData": "FALSE" } ] } ] } ] } ] } ]}Topic 폭증을 피하는 방법
섹션 제목: “Topic 폭증을 피하는 방법”Tier0는 topic 폭증을 피하기 위해 Metric, Action, State 세 가지 고정 topic type을 사용합니다.
-
Use
Metricfor high-frequency real-time data각 signal 세부 항목마다 namespace를 확장하지 말고, 고빈도 측정값과 telemetry는
Metric아래에 둡니다.Terminal window Factory_A└── SMT_Line_1└── Machine_001├── Temperature_Value├── Temperature_Unit├── Temperature_Status└── Speed_ValueTerminal window Factory_A└── SMT_Line_1└── Metric└── Machine_001Model fields:
Terminal window {"temperature": 80,"temperature_unit": "Celsius","temperature_status": "Normal","speed": 300} -
Use
Statefor low-frequency status data저빈도 상태, snapshot, 현재 비즈니스 상태는
State아래에 둡니다. 작업, batch, 주문처럼 변하는 entity마다 새 topic을 만들지 않습니다. -
Use
Actionfor low-frequency action data명령, 요청, operator action은
Action아래에 둡니다. action 입력은 parameter별 topic이 아니라 topic의 field로 유지합니다.
Payload 구조
섹션 제목: “Payload 구조”topic payload를 설계할 때는 소비할 데이터와 다시 쓸 데이터를 모두 고려해야 합니다.
-
Action
Action payload에는 데이터가 Tier0 데이터베이스에 저장된 시간을 기록하는
_timestamp가 자동 포함됩니다.Terminal window {"light_turn_on": true,"height_adjust": 12.5,"_timestamp": "2026-07-10T10:00:00Z"}Terminal window {"water_pump_off": true,"window_close": true,"_timestamp": "2026-07-10T10:00:00Z"} -
Metric
Metric payload에는 데이터가 Tier0 데이터베이스에 저장된 시간을 기록하는
_timestamp와 데이터 품질을 나타내는_quality가 자동 포함됩니다.Terminal window {"production_order_id": "PO-20260710-001","plan_id": "PLAN-001","plan_number": "WOP-20260710-001","split_count": 3,"updated_at": "2026-07-10T10:00:00Z","_timestamp": "2026-07-10T10:00:00Z","_quality": "Good"}Terminal window {"production_order_id": "PO-20260710-001","plan_id": "PLAN-001","plan_number": "WOP-20260710-001","work_order_id": "WO-001","value": 1200,"unit": "pcs","timestamp": "2026-07-10T10:00:00Z","_timestamp": "2026-07-10T10:00:00Z","_quality": "Good"} -
State
State payload에는 데이터가 Tier0 데이터베이스에 저장된 시간을 기록하는
_timestamp가 자동 포함됩니다.Terminal window {"event_id": "EVT-001","event_type": "UPSERT","source": "ERP","production_order_id": "PO-20260710-001","order_number": "PO-001","product_code": "SKU-1001","planned_qty": 1200,"unit": "pcs","status": "Released","due_date": "2026-07-12T00:00:00Z","updated_at": "2026-07-10T10:00:00Z","_timestamp": "2026-07-10T10:00:00Z"}Terminal window {"production_order_id": "PO-20260710-001","plan_id": "PLAN-001","plan_number": "WOP-20260710-001","work_order_id": "WO-001","status": "Running","reason": "In production","updated_at": "2026-07-10T10:00:00Z","_timestamp": "2026-07-10T10:00:00Z"}