SOME/IP-Typdefinition schreiben

Wenn Sie in VSIDL SOME/IP-Zuweisungen (Scalable Service-Oriented Middleware over IP) definieren, beschreiben Sie die Serialisierung des Wire-Formats und die Nutzlastcodierung jeder SOME/IP-Nachricht. Mithilfe der Definitionen SomeIpType und SomeIpStruct können Sie Primitiven, Strings, Arrays und verschachtelte Strukturen modellieren, die den ARXML-Regeln von AUTOSAR (SOMEIP-TRANSFORMATION-PROPS) und den Regeln für die Nutzlastcodierung des SOME/IP-Stacks (einschließlich COVESA vsomeip) entsprechen.

Auf dieser Seite wird beschrieben, wie Sie eine Typdefinition vom Typ SomeIpStruct schreiben, die in type_definition-Blöcken für Ereignis- und Methodenzuordnungen verwendet wird.

SomeIpStruct-Nachricht

Eine SomeIpStruct-Nachricht stellt eine strukturierte SOME/IP-Nutzlast dar, die aus mehreren Feldern besteht. Die hier definierte Struktur wird vom SOME/IP-Broker verwendet, um zwischen unformatierten SOME/IP-Bytes und den Feldern einer SDV-Protobuf-Nachricht zu übersetzen.

Beim Definieren einer Struktur konfigurieren Sie zwei Haupteigenschaften:

  • length_field_size (optional): Gibt die Größe (in Byte) des Längenfelds an, das dem Struct in der serialisierten Nutzlast vorangestellt ist. Verwendete Werte aus der LengthFieldSize-Aufzählung sind ZERO (kein Längenfeld), ONE, TWO und FOUR.
  • field (wiederholt): Eine Liste der Felder, aus denen das Struct besteht.

STRUCT-Felder definieren

Für jedes Feld in SomeIpStruct ist Folgendes erforderlich:

  • field_name: Der Name des Felds. Dieser Name muss genau mit dem entsprechenden Feldnamen übereinstimmen, der in der SDV-Protobuf-Nachricht definiert ist, damit die Nachricht richtig übersetzt wird.
  • field_type: Der SOME/IP-Datentyp des Felds (SomeIpType). Dies kann ein primitiver Datentyp, ein String, ein Array oder eine andere verschachtelte Struktur sein.

SomeIpType-Feldtypen schreiben

Mit dem Block field_type wird der jeweilige Datentyp mit einer der folgenden Varianten konfiguriert:

  • Einfache Typen:Verwenden Sie someip_primitive mit Werten wie UINT8, UINT32, INT32, FLOAT32 und BOOL.
  • Strings:Verwenden Sie someip_string und geben Sie die Codierung (z. B. UTF_8 oder UTF_16_LE) und Längeninformationen (entweder fixed_length oder length_field_size) an.
  • Arrays:Verwenden Sie someip_array und definieren Sie array_type (eine weitere rekursive SomeIpType) sowie Längeninformationen (fixed_length oder length_field_size).
  • Geschachtelte Strukturen:Verwenden Sie someip_struct, um rekursiv eine weitere Strukturdefinition einzubetten.

Beispiel: Struct-Typdefinition schreiben

Hier ist ein praktisches Beispiel dafür, wie Sie eine SomeIpStruct in einem type_definition-Block schreiben. Diese Nutzlast enthält eine vorzeichenlose 8-Bit-Ganzzahl namens interval und eine vorzeichenlose 32-Bit-Ganzzahl namens counter:

type_definition {
  # No length field precedes this struct
  length_field_size: ZERO

  # First field: interval
  field {
    field_name: "interval"
    field_type {
      someip_primitive: UINT8
    }
  }

  # Second field: counter
  field {
    field_name: "counter"
    field_type {
      someip_primitive: UINT32
    }
  }
}

Komplexe Typen hinzufügen

Wenn Sie ein Stringfeld mit dynamischer Länge und ein Array in das Struct einfügen möchten, fügen Sie Felder wie dieses hinzu:

field {
  field_name: "status_message"
  field_type {
    someip_string {
      string_encoding: UTF_8
      length_field_size: FOUR
    }
  }
}
field {
  field_name: "measurements"
  field_type {
    someip_array {
      length_field_size: FOUR
      array_type { someip_primitive: FLOAT32 }
    }
  }
}

AUTOSAR ARXML und vsomeip-Nutzlastcodierung zuordnen

Wenn Sie AAOS SDV in externe AUTOSAR-Steuergeräte (ECUs) oder SOME/IP-Stacks wie COVESA vsomeip einbinden, muss Ihr VSIDL type_definition mit den in der ARXML (SOMEIP-TRANSFORMATION-PROPS und SOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS) oder der vsomeip-Konfiguration Ihres Systems definierten Wire-Serialisierungsparametern übereinstimmen:

AUTOSAR ARXML und vsomeip-Parameter VSIDL-Entsprechung SomeIpType Regel für die Serialisierung und Nutzlastcodierung
sizeOfStructLengthField (0, 1, 2, 4 Bytes) SomeIpStruct.length_field_size (ZERO, ONE, TWO, FOUR) Stellt der serialisierten Nutzlast der Struktur ein explizites Präfix für die Bytelänge voran. Legen Sie diese Option auf ZERO fest, wenn Sie Strukturen mit festem Layout ohne Längenpräfix verwenden.
sizeOfArrayLengthField (0, 1, 2, 4 Bytes) SomeIpArray.length_field_size (ZERO, ONE, TWO, FOUR) oder fixed_length Für dynamische Arrays ist ein Längenfeldpräfix (ONE, TWO oder FOUR Bytes) erforderlich, das die Bytelänge der serialisierten Arrayelemente angibt.
sizeOfStringLengthField und Codierung (UTF-8, UTF-16LE, UTF-16BE) SomeIpString.string_encoding und length_field_size oder fixed_length Entspricht den AUTOSAR-Regeln für die String-Serialisierung (einschließlich der Verarbeitung von Byte Order Mark und Null-Terminierung) für Strings mit variabler und fester Länge.
Einfache Basistypen (uint8, uint16, uint32, float32, boolean) SomeIpPrimitive (UINT8, UINT16, UINT32, INT32, FLOAT32, BOOL) Codiert einfache Werte in Netzwerkbyte-Reihenfolge (standardmäßig Big-Endian gemäß SOME/IP-Spezifikation), die dem Ziel-Protobuf-Feld entsprechen.