앤디 블로그
  • 모두
  • 아키텍처
  • 기술
  • 자바
  • 스프링
  • 인프라
  • 카프카
  • 데이터베이스
  • 컨퍼런스
  • 개발 문화
책
짧은 글
  • 모두
  • 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 오브젝트 풀
    • CH17. VT 명령어
  • Task Controller (TC)

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

    • CH21. 기타 기능
      • 1. Sequence Control — ISO 11783-14
        • 1.1 개요
        • 1.2 Headland Management 자동 시퀀스
        • 1.3 Sequence Control 메시지 구조
        • 1.4 Headland 구간 정의 방법
      • 2. File Server — ISO 11783-13
        • 2.1 개요
        • 2.2 파일 계층 구조
        • 2.3 File Server 접근 흐름
        • 2.4 Python으로 File Server 메시지 파싱
      • 다음 챕터
    • CH22. 종합 실습
  • 부록

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

ISOBUS 기타 기능

학습 목표

  • ISO 11783-14 Sequence Control의 역할과 Headland Management 적용 방법을 설명할 수 있다.
  • Sequence Control이 자동으로 수행하는 작업 단계(하강 → 살포 → 상승)를 순서도로 표현할 수 있다.
  • ISO 11783-13 File Server의 파일 계층 구조(Volume / Directory / File)를 이해한다.
  • File Server를 통해 처방 맵과 작업 로그를 USB 없이 전송하는 흐름을 설명할 수 있다.

1. Sequence Control — ISO 11783-14

1.1 개요

Sequence Control은 작업기가 일련의 동작을 자동 순서대로 실행하도록 지시하는 표준이다. 운전자가 일일이 스위치를 조작하지 않아도 사전 정의된 시퀀스가 트리거 조건에 따라 자동 실행된다.

가장 대표적인 활용 사례가 Headland Management(두둑 관리)이다. 포전 끝(두둑)에서 방향을 전환할 때 살포 중지 → 작업기 상승 → 선회 → 하강 → 살포 재개를 자동으로 수행한다.


1.2 Headland Management 자동 시퀀스

flowchart TD
    A([작업 시작]) --> B[작업기 하강<br>Lower Implement]
    B --> C[살포 시작<br>Section ON / Rate Control]
    C --> D{두둑 진입<br>감지?}
    D -- 아니오 --> E[직진 이동<br>살포 계속]
    E --> D
    D -- 예 --> F[살포 중지<br>Section OFF]
    F --> G[작업기 상승<br>Raise Implement]
    G --> H[선회 이동<br>Headland Turn]
    H --> I[작업기 하강<br>Lower Implement]
    I --> J[살포 재개<br>Section ON]
    J --> K{작업 종료?}
    K -- 아니오 --> D
    K -- 예 --> L([작업 종료])

두둑 진입 감지는 GPS 경계선 교차, 히치(Hitch) 센서, 또는 운전자 버튼 입력 중 하나로 트리거된다.


1.3 Sequence Control 메시지 구조

Sequence Control은 SC(Sequence Control) 노드와 작업기 ECU 사이에서 명령과 상태를 교환한다.

주요 PGN:

PGN명칭방향내용
0xFC00SC StatusSC → Implement현재 시퀀스 상태, 단계 번호
0xFC01SC CommandSC → Implement다음 동작 명령 (하강/상승/ON/OFF)
0xFC02SC AcknowledgeImplement → SC명령 수신 및 실행 확인

C 언어로 작성한 Sequence Control 명령 전송 예시:

#include <stdint.h>

/* Sequence Control command byte definitions */
#define SC_CMD_LOWER   0x01  /* Lower implement */
#define SC_CMD_RAISE   0x02  /* Raise implement */
#define SC_CMD_SECT_ON 0x03  /* Sections ON */
#define SC_CMD_SECT_OFF 0x04 /* Sections OFF */

typedef struct {
    uint8_t sequence_step;  /* Current step number (0-based) */
    uint8_t command;        /* SC_CMD_* value */
    uint8_t trigger_source; /* 0x00=GPS, 0x01=Hitch, 0x02=Button */
    uint8_t reserved[5];
} SC_Command_t;

/* Build and send a Sequence Control command frame */
int sc_send_command(uint8_t step, uint8_t cmd, uint8_t trigger,
                    void (*can_send)(uint32_t id, uint8_t *data, uint8_t len))
{
    SC_Command_t frame = {
        .sequence_step  = step,
        .command        = cmd,
        .trigger_source = trigger,
        .reserved       = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
    };

    /* PGN 0xFC01, DA=0xFF (broadcast), SA=0x26 (Sequence Control) */
    uint32_t can_id = (0x18UL << 24) | (0xFC01UL << 8) | 0x26UL;
    can_send(can_id, (uint8_t *)&frame, sizeof(frame));
    return 0;
}

1.4 Headland 구간 정의 방법

두둑 구간은 TC(Task Controller)의 처방 맵 또는 별도의 Headland Zone 파라미터로 정의된다.

flowchart LR
    subgraph Field["포전 (Field)"]
        direction TB
        HL_TOP["두둑 상단<br>(Headland Zone)"]
        WORK["작업 구역<br>(Working Area)"]
        HL_BOT["두둑 하단<br>(Headland Zone)"]
        HL_TOP --- WORK --- HL_BOT
    end

    GPS["GPS 수신기"] -- 위치 전달 --> SC["Sequence<br>Control"]
    TC["Task Controller"] -- 구역 경계 좌표 --> SC
    SC -- 명령 --> IMPL["작업기 ECU"]

GPS 좌표가 Headland Zone 경계를 넘는 순간 SC가 자동으로 시퀀스를 실행한다.


Sequence Control 핵심 정리

  • ISO 11783-14는 작업 동작(하강/상승/ON/OFF)을 자동 순서로 실행하는 표준이다.
  • Headland Management에서 두둑 선회 시 운전자 개입 없이 전체 시퀀스가 자동 실행된다.
  • 트리거 조건은 GPS 경계 교차, 히치 센서, 운전자 입력 중 하나로 설정 가능하다.
  • SC Command(PGN 0xFC01)로 명령을 전달하고, SC Acknowledge(PGN 0xFC02)로 확인한다.

2. File Server — ISO 11783-13

2.1 개요

File Server(FS)는 ISOBUS 네트워크 위에서 파일을 저장하고 공유하는 서비스이다. USB 메모리나 별도 물리 매체 없이 ECU 간에 파일을 주고받을 수 있다.

주요 활용 사례:

  • 처방 맵(Prescription Map): FMIS에서 생성한 처방 맵을 TC로 전달
  • 작업 로그(Task Log / As-Applied Map): TC가 기록한 실제 살포 데이터를 FMIS로 회수
  • 소프트웨어 업데이트: ECU 펌웨어 파일 배포

2.2 파일 계층 구조

File Server는 Volume → Directory → File 3단계 계층으로 파일을 관리한다.

Volume (최상위 저장소)
├── Directory A
│   ├── prescription_map_2026.xml
│   └── field_boundary.shp
└── Directory B
    ├── task_log_20260413.xml
    └── as_applied_20260413.bin
graph TD
    FS["File Server<br>(ISO 11783-13)"]
    FS --> V1["Volume 0<br>(내부 저장소)"]
    FS --> V2["Volume 1<br>(외부 SD / CF)"]
    V1 --> D1["Directory: /prescriptions"]
    V1 --> D2["Directory: /logs"]
    D1 --> F1["prescription_map_2026.xml"]
    D1 --> F2["field_boundary.shp"]
    D2 --> F3["task_log_20260413.xml"]
    D2 --> F4["as_applied_20260413.bin"]

2.3 File Server 접근 흐름

클라이언트(TC, VT 등)가 File Server에 접근하는 순서는 다음과 같다.

sequenceDiagram
    participant C as Client (TC)
    participant FS as File Server

    C->>FS: Get File Server Properties Request
    FS-->>C: File Server Properties Response<br>(버전, 볼륨 수, 최대 파일 크기)

    C->>FS: Open File Request<br>(경로, 읽기/쓰기 모드)
    FS-->>C: Open File Response<br>(파일 핸들 or 오류 코드)

    loop 데이터 전송
        C->>FS: Read/Write File Request<br>(파일 핸들, 오프셋, 길이)
        FS-->>C: Read/Write File Response<br>(데이터 or 확인)
    end

    C->>FS: Close File Request<br>(파일 핸들)
    FS-->>C: Close File Response

2.4 Python으로 File Server 메시지 파싱

ISOBUS File Server 메시지는 ISO 11783-13이 정의한 바이트 구조를 따른다. 아래는 Open File Response를 파싱하는 Python 예시이다.

import struct

# File Server Function Code definitions (ISO 11783-13 Table 1)
FS_FUNC_OPEN_FILE_REQ  = 0x20
FS_FUNC_OPEN_FILE_RESP = 0x21
FS_FUNC_READ_FILE_REQ  = 0x22
FS_FUNC_READ_FILE_RESP = 0x23
FS_FUNC_CLOSE_FILE_REQ = 0x2C
FS_FUNC_CLOSE_FILE_RESP = 0x2D

ERROR_CODES = {
    0x00: "Success",
    0x01: "Access Denied",
    0x02: "Invalid Access",
    0x03: "Too Many Files Open",
    0x04: "File or Path Not Found",
    0x05: "Invalid Handle",
    0x08: "Volume Out of Free Space",
    0xFF: "Other Error",
}


def parse_open_file_response(data: bytes) -> dict:
    """
    Parse an Open File Response message (Function Code 0x21).
    Byte layout: [0]=FuncCode, [1]=ErrorCode, [2]=FileHandle, [3..7]=reserved
    """
    if len(data) < 3:
        raise ValueError(f"Frame too short: {len(data)} bytes")

    func_code  = data[0]
    error_code = data[1]
    file_handle = data[2]

    if func_code != FS_FUNC_OPEN_FILE_RESP:
        raise ValueError(f"Unexpected function code: 0x{func_code:02X}")

    return {
        "function":    "Open File Response",
        "error":       ERROR_CODES.get(error_code, f"Unknown(0x{error_code:02X})"),
        "file_handle": file_handle if error_code == 0x00 else None,
        "success":     error_code == 0x00,
    }


def build_open_file_request(path: str, write: bool = False) -> bytes:
    """
    Build an Open File Request message (Function Code 0x20).
    Byte layout: [0]=FuncCode, [1]=Flags, [2..N]=null-terminated path
    """
    flags = 0x02 if write else 0x01  # 0x01=Read, 0x02=Write
    path_bytes = path.encode("ascii") + b"\x00"
    return bytes([FS_FUNC_OPEN_FILE_REQ, flags]) + path_bytes


# Example usage
if __name__ == "__main__":
    # Simulate received Open File Response frame
    raw = bytes([0x21, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
    result = parse_open_file_response(raw)
    print(f"Result  : {result['error']}")
    print(f"Handle  : {result['file_handle']}")

    # Build a read request
    req = build_open_file_request("/prescriptions/prescription_map_2026.xml")
    print(f"Request : {req.hex()}")

File Server 핵심 정리

  • ISO 11783-13 File Server는 ISOBUS 네트워크에서 USB 없이 파일을 공유하는 서비스다.
  • 계층 구조는 Volume → Directory → File이며, 내부 저장소와 외부 미디어를 모두 지원한다.
  • 처방 맵 전달(FMIS → TC)과 작업 로그 회수(TC → FMIS)가 주요 활용 사례다.
  • 클라이언트는 Open → Read/Write → Close 순서로 파일에 접근한다.

다음 챕터

  • 다음 : 종합 실습
Prev
TC 디바이스 디스크립션 (DDOP)
Next
종합 실습