6.0 KiB
6.0 KiB
Factory 모듈 가이드
Factory는 스마트 팩토리 3D 시각화 애플리케이션입니다. MQTT를 통해 실시간 설비 데이터를 수신하고, 3D 공간에서 설비 상태를 시각화합니다.
모듈 구조
Factory/
├── Alarm/ # 알람 관리 (UI 생성/업데이트)
├── AGV/ # AGV(자율주행차량) 시뮬레이션
├── Camera/ # 카메라 제어
├── Component/ # FactoryObject 계층 (설비 3D 객체)
├── Config/ # 앱 설정 (API, MQTT, 창)
├── LNB/ # Left Navigation Bar
├── Modal/ # 정보창 (InfoWindow)
├── Path/ # AGV 경로 시각화
├── Playback/ # 데이터 재생 시스템
├── POI/ # Point of Interest
├── Port/ # 포트 설비
└── UI/ # 하단 바, 옵션 등 UI
핵심 클래스
1. FactoryAppMain - 앱 진입점
// 싱글톤 앱 메인
public class FactoryAppMain : SingletonApp<FactoryAppMain>
{
public Action Initialized; // 초기화 완료 이벤트
}
초기화 흐름:
Init()→ 설정 로드, 로깅 설정SettupConfigAsync()→ 설정 파일, 다국어, 창 설정SetNetworkConfig()→ MQTT 토픽 구독 (AGV, ALARM, PORT)
2. FactoryObject - 3D 설비 객체
// 상호작용 가능한 팩토리 객체 기본 클래스
public abstract class FactoryObject : MonoBehaviour,
IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler
{
public FactoryObjectInfo? Info { get; set; } // 객체 식별 정보
public UserSetting? DataOrderedMask { get; set; } // 표시할 데이터 필터
// 데이터 변경 시 재정의하여 상태 업데이트
protected virtual void ProcessData(DataObject newData) { }
}
사용 예시:
public class MachineObject : FactoryObject
{
protected override void ProcessData(DataObject newData)
{
string status = newData.GetString("status", "off");
switch (status)
{
case "running": SetColor(Color.green); break;
case "warning": SetColor(Color.yellow); break;
case "error": SetColor(Color.red); break;
}
}
}
3. AlarmManager - 알람 관리
public class AlarmManager : SingletonScene<AlarmManager>
{
// MQTT "ALARM" 토픽 데이터 처리
public void OnUpdateData(IDataObject data);
// 알람 UI 생성/수정/제거
public void HandleNewAlarm(DataObject data);
public void HandleModifyAlarm(DataObject data);
public void HandleClearedAlarm(DataObject data);
}
알람 처리 흐름:
- MQTT로 알람 데이터 수신
TRANSPORT_EQP_ID로 대상 설비 검색- 설비에 알람 UI (
AlarmIconManager) 부착 CLEAR_TIME설정 시 알람 해제
4. PlaybackService - 데이터 재생
// 과거 데이터 재생 서비스 (싱글톤)
public class PlaybackService
{
public float TimeScale { get; set; } // 재생 배속
// 재생 목록 요청
public async UniTask<Dictionary<...>?> RequestDataAsync();
// 재생 시작
public async UniTask StartAsync(UIPlaybackListItemData data);
// 데이터 파일 다운로드 및 준비
public HTTPRequest? ReadyData(string date, string time, string fileName, ...);
// 특정 시간대 데이터 디스패치
public async UniTask DispatchRealTimeData(int second, int speed);
}
데이터 흐름
┌─────────────┐ ┌────────────────┐ ┌─────────────────┐
│ MQTT │────▶│ DataRepository │────▶│ FactoryObject │
│ (실시간) │ │ │ │ - ProcessData() │
└─────────────┘ │ MqttReceiver │ └─────────────────┘
│ - AGV 토픽 │ │
┌─────────────┐ │ - ALARM 토픽 │ ▼
│ SQLite │────▶│ - PORT 토픽 │ ┌─────────────────┐
│ (Playback) │ │ │ │ UI 업데이트 │
└─────────────┘ └────────────────┘ │ - InfoWindow │
│ - AlarmIcon │
└─────────────────┘
설정 파일
FactoryAppConfig
{
"TargetFrameRate": 60,
"Language": "ko",
"Api": "https://api.example.com",
"Mqtt": {
"Domain": "mqtt.example.com",
"Port": 1883,
"DataKey": "data",
"MessagePack": false
},
"Window": { ... }
}
FactoryConstants
public static class FactoryConstants
{
public static string API_DOMAIN;
public static string MQTT_DOMAIN;
public static int MQTT_PORT;
public static string MQTT_DATA_KEY;
public static bool MQTT_MESSAGEPACK_ENABLED;
}
MQTT 데이터 매핑
알람 데이터 구조
var alarmDataMask = new DataMask();
alarmDataMask.ObjectName = "ALARM";
alarmDataMask.ObjectIdKey = "ID";
// 주요 필드:
// - ID, ALARM_TYPE, LEVEL, STATE, MESSAGE, CODE
// - TRANSPORT_EQP_ID, TRANSPORT_EQP_NAME
// - SET_TIME, CLEAR_TIME, UPDATE_TIME
확장 방법
새 설비 타입 추가
FactoryObject상속 클래스 생성ProcessData()재정의하여 상태 처리FactoryObjectManager에 등록됨 (Info 설정 시 자동)
새 MQTT 토픽 구독
// AppMain에서
DataRepository.Instance.MqttReceiver.AddTopic("NEW_TOPIC");
// 데이터 핸들러 등록
DataRepository.Instance.AddDataUpdateHandler("NEW_TOPIC", OnNewTopicData);
의존성
- UVC 라이브러리: Core, Data, Pool, UI, Locale, Util
- 외부: Best.HTTP (HTTP/WebSocket), DOTween