앤디 블로그
  • 모두
  • 아키텍처
  • 기술
  • 자바
  • 스프링
  • 인프라
  • 카프카
  • 데이터베이스
  • 컨퍼런스
  • 개발 문화
책
짧은 글
  • 모두
  • ISOBUS
이력서
  • 모두
  • 아키텍처
  • 기술
  • 자바
  • 스프링
  • 인프라
  • 카프카
  • 데이터베이스
  • 컨퍼런스
  • 개발 문화
책
짧은 글
  • 모두
  • ISOBUS
이력서
  • 통신과 CAN 기초

    • 소개
    • CH1. 통신의 기초
    • CH2. CAN 통신 입문
    • CH3. CAN 물리 계층
    • CH4. CAN 데이터 프레임
    • CH5. CAN 중재와 우선순위
    • CH6. CAN 에러 처리
    • CH7. CAN FD
  • SAE J1939

    • CH8. J1939 입문
    • CH9. J1939 메시지 구조
    • CH10. J1939 주소 체계
    • CH11. J1939 Transport Protocol
  • ISOBUS (ISO 11783)

    • CH12. ISOBUS 개요
    • CH13. 네트워크 아키텍처
    • CH14. 네트워크 관리
  • Virtual Terminal (VT)

    • CH15. VT 기초
    • CH16. VT 오브젝트 풀
      • 1. 오브젝트 풀이란
        • 설계부터 전송까지
      • 2. 오브젝트 타입 총정리
        • 컨테이너 및 화면 구조
        • 소프트키 및 버튼
        • 입력 오브젝트
        • 출력 오브젝트
        • 속성 오브젝트
        • 기타
      • 3. 오브젝트 간 계층 관계
      • 4. 오브젝트 풀 전송 과정
        • 버전 관리 (Store/Load Version)
      • 5. 간단한 화면 구성 실습
        • 필요한 오브젝트 구성
        • IOP XML 예시
        • 런타임 데이터 갱신
      • 다음 챕터
    • CH17. VT 명령어
  • Task Controller (TC)

    • CH18. TC 기초
    • CH19. TC 프로세스 데이터
    • CH20. TC DDOP
  • 심화 및 실습

    • CH21. 기타 기능
    • CH22. 종합 실습
  • 부록

    • 용어 사전
    • PGN/SPN 목록
    • DDI 목록
    • 트러블슈팅
    • 참고 자료

VT 오브젝트 풀 (Object Pool)

학습 목표

  • 오브젝트 풀의 개념과 바이너리 구조를 설명할 수 있다.
  • 주요 오브젝트 타입의 역할을 구분할 수 있다.
  • 오브젝트 간 계층 관계(Working Set → Data Mask → 자식 오브젝트)를 이해한다.
  • 오브젝트 풀 전송 과정의 각 단계를 순서대로 설명할 수 있다.
  • 간단한 화면을 XML(IOP) 형태로 구성할 수 있다.

1. 오브젝트 풀이란

오브젝트 풀(Object Pool)은 VT 화면 전체를 정의하는 바이너리 데이터 구조이다. 작업기 ECU의 플래시 메모리에 저장되어 있다가, VT 연결 시 VT로 전송된다.

각 오브젝트는 세 가지 요소로 구성된다.

[Object ID: 16bit] [Object Type: 8bit] [속성(Attribute) 목록...]
  • Object ID: 0x0000 ~ 0xFFFF 범위의 고유 식별자. ID 0은 Working Set Object 예약
  • Object Type: 오브젝트 종류를 나타내는 1바이트 코드
  • 속성: 오브젝트 타입에 따라 위치, 크기, 색상, 자식 오브젝트 목록 등

설계부터 전송까지

IOP XML 파일 설계
       ↓
바이너리 변환 (툴체인 사용)
       ↓
ECU 플래시에 저장
       ↓
VT 연결 시 전송
       ↓
VT가 화면 렌더링

XML(IOP 형식)로 화면을 설계하고 빌드 시 바이너리로 변환하는 방식이 일반적이다. 이를 통해 설계 시점에는 가독성을, 런타임에는 크기 효율성을 모두 확보한다.


2. 오브젝트 타입 총정리

ISO 11783-6에는 30여 가지 오브젝트 타입이 정의되어 있다. 역할별로 분류하면 다음과 같다.

컨테이너 및 화면 구조

타입 이름Type 코드역할
Working Set Object0오브젝트 풀의 루트. 작업기 전체를 대표
Data Mask1일반 화면(마스크). 실제 UI가 표시되는 단위
Alarm Mask2경고/알람 전용 화면. 우선순위로 Data Mask 위에 표시
Container3여러 오브젝트를 묶는 그룹. 가시성 토글 가능
Window Mask34Version 4+. 복수 윈도우 지원

소프트키 및 버튼

타입 이름Type 코드역할
Soft Key Mask4Data Mask에 연결되는 소프트키 버튼 집합
Key5소프트키 개별 버튼
Button6화면 내 일반 버튼 오브젝트
Key Group35Version 4+. 키 그룹

입력 오브젝트

타입 이름Type 코드역할
Input Number9숫자 입력 필드
Input String10문자열 입력 필드
Input List11목록 선택 입력
Input Boolean8체크박스 등 불리언 입력

출력 오브젝트

타입 이름Type 코드역할
Output Number12숫자 출력 (변수 참조 가능)
Output String13문자열 출력
Output List14목록 출력
Output Line15선 그리기
Output Rectangle16사각형 그리기
Output Ellipse17타원 그리기
Output Polygon18다각형 그리기
Output Meter19미터 게이지
Output Linear Bar Graph20선형 막대 그래프
Output Arched Bar Graph21호형 막대 그래프
Picture Graphic22비트맵 이미지

속성 오브젝트

타입 이름Type 코드역할
Font Attributes23폰트 크기, 색상, 스타일 정의
Line Attributes24선 색상, 두께, 스타일 정의
Fill Attributes25채우기 색상, 패턴 정의
Input Attributes26입력 유효성 검사 규칙

기타

타입 이름Type 코드역할
Object Pointer27다른 오브젝트를 참조하는 포인터
Variable Number28공유 숫자 변수
Variable String29공유 문자열 변수
External Object Pointer36외부 오브젝트 참조
Macro28이벤트 기반 자동화 명령 목록

3. 오브젝트 간 계층 관계

오브젝트들은 트리 구조로 조직된다. Working Set Object가 루트이며, 모든 화면과 요소가 그 아래에 위치한다.

graph TD
    WS["Working Set Object<br>(ID: 0)"]
    DM1["Data Mask 1<br>일반 작업 화면"]
    DM2["Data Mask 2<br>설정 화면"]
    AM["Alarm Mask<br>경고 화면"]
    SKM["Soft Key Mask<br>소프트키 집합"]
    SK1["Key 1<br>'시작'"]
    SK2["Key 2<br>'정지'"]
    BTN["Button<br>'확인'"]
    CON["Container<br>온도 정보 그룹"]
    ON["Output Number<br>85°C"]
    OS["Output String<br>'엔진 온도'"]
    FA["Font Attributes<br>글꼴 정의"]

    WS --> DM1
    WS --> DM2
    WS --> AM
    DM1 --> SKM
    DM1 --> CON
    DM1 --> BTN
    SKM --> SK1
    SKM --> SK2
    CON --> ON
    CON --> OS
    ON --> FA
    OS --> FA

계층의 핵심 규칙:

  • Data Mask는 Working Set에서 active mask로 지정되어야 화면에 표시된다.
  • Soft Key Mask는 Data Mask에 연결되어 함께 활성화된다.
  • 속성 오브젝트(Font, Line, Fill Attributes)는 여러 오브젝트에서 공유할 수 있다.
  • Container는 가시성(visible/hidden) 속성으로 동적으로 표시/숨김이 가능한다.

4. 오브젝트 풀 전송 과정

작업기 ECU가 VT에 처음 연결될 때 오브젝트 풀을 전송하는 절차는 다음과 같다.

sequenceDiagram
    participant ECU as 작업기 ECU (VT Client)
    participant VT as VT Server

    ECU->>VT: Working Set Maintenance (주기적 광고, 100ms)
    VT-->>ECU: VT Status Message (버전, 활성 마스크 등)

    ECU->>VT: Get Memory (오브젝트 풀 크기 전달)
    VT-->>ECU: Get Memory Response (저장 가능 여부 확인)

    alt 버전이 일치하는 오브젝트 풀이 VT에 이미 저장된 경우
        ECU->>VT: Load Version (저장된 버전 로드 요청)
        VT-->>ECU: Load Version Response (성공)
    else 새로 전송해야 하는 경우
        ECU->>VT: Object Pool Transfer (ETP로 대용량 전송)
        Note over ECU, VT: ETP: Extended Transport Protocol<br>최대 117,964,800 바이트 전송 가능
        VT-->>ECU: Object Pool Transfer Response
        ECU->>VT: End of Object Pool (전송 완료 알림)
        VT-->>ECU: End of Object Pool Response (파싱 결과 반환)
        ECU->>VT: Store Version (이후 Load Version을 위해 저장)
    end

    VT->>VT: 오브젝트 풀 파싱 및 화면 활성화
    Note over VT: Working Set의 Active Data Mask 표시

버전 관리 (Store/Load Version)

오브젝트 풀이 크면 전송에 수 초가 걸릴 수 있다. 이를 개선하기 위해 VT는 오브젝트 풀을 버전 이름(8바이트 문자열)과 함께 내부에 저장할 수 있다. 다음 연결 시 Load Version 명령만으로 저장된 풀을 즉시 복원하여 전송 시간을 절약한다.


5. 간단한 화면 구성 실습

"엔진 온도: 85°C"를 표시하는 화면을 구성해 보겠다.

필요한 오브젝트 구성

Working Set (ID: 0)
└── Data Mask (ID: 1) ← Active Data Mask로 지정
    ├── Output String (ID: 10) ← "엔진 온도:" 레이블
    │   └── Font Attributes (ID: 30) ← 흰색, 18pt
    └── Output Number (ID: 11) ← 85 (°C 단위)
        └── Font Attributes (ID: 30) ← 공유 사용

IOP XML 예시

<objectpool>

  <!-- Working Set: 오브젝트 풀의 루트 -->
  <workingset id="0"
              background_colour="1"
              selectable="true"
              active_mask="1">
    <!-- active_mask="1" → Data Mask ID 1이 초기 화면 -->
  </workingset>

  <!-- Font Attributes: 흰색, 18pt 폰트 -->
  <fontattributes id="30"
                  font_colour="0"
                  font_size="6"
                  font_style="0" />
  <!-- font_colour 0 = 흰색(VT 팔레트 기준) -->
  <!-- font_size 6 = 18pt -->

  <!-- Data Mask: 실제 화면 영역 -->
  <datamask id="1"
            background_colour="1"
            soft_key_mask="65535">
    <!-- soft_key_mask 65535 = 소프트키 없음 -->
    <include_object id="10" pos_x="10" pos_y="20" />
    <include_object id="11" pos_x="130" pos_y="20" />
  </datamask>

  <!-- Output String: "엔진 온도:" 레이블 -->
  <outputstring id="10"
                width="120"
                height="30"
                font_attributes="30"
                justification="0"
                value="엔진 온도:" />

  <!-- Output Number: 실시간 온도 값 -->
  <outputnumber id="11"
                width="80"
                height="30"
                font_attributes="30"
                variable_reference="65535"
                value="85"
                offset="0"
                scale="1.0"
                number_of_decimals="0"
                format="true"
                justification="0" />
  <!-- value="85": 초기값 85°C -->
  <!-- ECU가 Change Numeric Value 명령으로 실시간 갱신 -->

</objectpool>

런타임 데이터 갱신

화면이 표시된 후, ECU는 실측 온도가 바뀔 때마다 Change Numeric Value 명령(PGN: EF00)으로 Output Number의 값을 갱신한다. VT는 별도의 오브젝트 풀 재전송 없이 해당 오브젝트만 업데이트하여 화면에 반영한다.

ECU → VT: Change Numeric Value
  Object ID: 0x000B (Output Number ID 11)
  New Value : 92    (92°C로 갱신)

핵심 정리

  • 오브젝트 풀은 VT 화면 전체를 정의하는 바이너리 구조이며, 각 오브젝트는 ID + 타입 + 속성으로 구성된다.
  • Working Set → Data Mask → Container/Output/Input → 속성 오브젝트 순의 계층 구조를 가진다.
  • 오브젝트 풀 전송 시 ETP(Extended Transport Protocol)를 사용하며, Store/Load Version으로 재전송 시간을 절약한다.
  • 화면 초기화 후 ECU는 Change Numeric Value 등의 명령어로 특정 오브젝트만 실시간 갱신한다.

다음 챕터

  • 다음 : VT 명령어와 상호작용
Prev
Virtual Terminal (VT) 기초
Next
VT 명령어와 상호작용