Seri Protokoller
TEKNİK REHBER SERİ PROTOKOLLER FLEXRAY 2026

FlexRay
deterministik araç bus'ı.

BMW X5 aktif süspansiyonundan Airbus A350'ye, Boxer IFV'den steer-by-wire sistemlerine — 10 Mbps deterministik TDMA. ISO 17458, AUTOSAR, ISO 26262 ASIL-D.

00 FlexRay nedir?

FlexRay, BMW, DaimlerChrysler, Philips Semiconductors ve Freescale Semiconductor tarafından 2000'li yılların başında geliştirilen yüksek hızlı, deterministik otomotiv ve savunma veri bus standardıdır. ISO 17458 olarak standardize edilmiştir.

CAN (Controller Area Network) protokolünün non-deterministik CSMA/CA arbitration mekanizması, sürücüsüz araç, steer-by-wire ve aktif süspansiyon gibi güvenlik kritik uygulamalarda yeterli determinizm sağlayamıyordu. FlexRay'in TDMA (Time-Division Multiple Access) tabanlı statik segmenti, bu sorunu çözmek üzere tasarlanmıştır.

PlatformKullanım alanıYıl
BMW X5 (E70)Aktif süspansiyon (VDC), dinamik damper kontrolü2007
BMW iDrive (5. nesil)Merkezi sürücü bilgi sistemi veri bus'ı2008
Audi A8 (D4)Chassis domain, aktif roll stabilizasyonu2010
Mercedes-Benz S-Klasse (W222)Magic Body Control aktif süspansiyon2013
Airbus A350 XWBBazı sayısal ikiz ve sistemleri (test/doğrulama)2014
Boxer IFV (Bundeswehr)Araç yönetim sistemi haberleşmesi2009
Toyota FCV / Lexus LSGüvenlik kritik chassis domain2015+

CAN, LIN, MOST ve FlexRay karşılaştırması

ÖzellikCANLINFlexRayMOST
Hız1 Mbps20 kbps10 Mbps150 Mbps
ArbitrationCSMA/CAMaster/SlaveTDMA+FTDMAMOST frame
DeterminizmKısmiYüksekTam (statik)Yüksek
RedundancyYokYok2 kanalRing
Tipik kullanımPowertrain, bodySensörler, aktüatörlerChassis, ADASInfotainment
ISO standartISO 11898ISO 17987ISO 17458MOST150
SAVUNMA BAĞLAMI

Boxer IFV (Infantry Fighting Vehicle), Almanya ve Hollanda kara kuvvetlerinin kullandığı modüler zırhlı araçtır. Araç yönetim sistemindeki FlexRay ağı, motor yönetimi, silah sistemi ve hareket platformu arasında deterministik iletişim sağlar. CAN'ın CSMA arbitration kaynaklı non-determinizmi, gerçek zamanlı silah nişangah kontrolü için uygun değildi.

01 Fiziksel katman

FlexRay, iki bağımsız kanal (Channel A ve Channel B) üzerinden diferansiyel sinyal iletimi kullanır. Her iki kanal da bağımsız çalışabilir ve bağımsız arızalar tolere edilebilir.

Sinyal seviyeleri ve kablo özellikleri

  FlexRay Diferansiyel Sinyal:

  BP (Bus Plus) :  ─────╮     ╭─────     ╭─────
                         ╰─────╯           ╰─────
  BM (Bus Minus):  ─────╯     ╰─────     ╰─────

  Idle (recessive):  BP ≈ BM ≈ 2.5V  (diferansiyel ≈ 0V)
  Data_1 (dominant): BP ≈ 3.5V, BM ≈ 1.5V (diferansiyel ≈ +2V)
  Data_0 (dominant): BP ≈ 1.5V, BM ≈ 3.5V (diferansiyel ≈ -2V)
    
ParametreDeğerAçıklama
Veri hızı2,5 / 5 / 10 MbpsCluster tasarımında sabit seçilir
Kanal sayısı2 (A ve B)Her ikisi de bağımsız çalışır
TopolojiPasif star / aktif star / busUygulama mimarisine bağlı
Kablo empedansı80–110 ΩShielded twisted pair önerilir
TerminasyonHer uçta 80–110 ΩSonlandırma direnci zorunlu
Maks. node sayısı22 (pasif) / 64+ (aktif star)Aktif star ile ölçeklenebilir
Maks. kablo uzunluğu24 m (aktif star ile daha fazla)Sinyal attenüasyonu sınırlar

Bus Guardian IC

FlexRay'in güvenlik mimarisinin kritik unsuru Bus Guardian IC'dir. Her ECU'nun FlexRay transksiyveri önünde bir Bus Guardian bulunur ve ECU'nun yalnızca kendisine ayrılan TDMA zaman diliminde (slot) bus'a erişmesini donanım seviyesinde zorlar.

MFR4310 (NXP)NXP'nin (Freescale) Bus Guardian IC'i. Slot zamanlamasını harici olarak denetler. Yazılım hatası kaynaklı slot ihlallerini otomatik olarak engeller. BMW X5 E70 aktif süspansiyon ECU'larında kullanılır.
TJA1080 (NXP)FlexRay transceiver + temel Bus Guardian işlevleri. 5V ve 3.3V besleme, EN ISO 7637-2 transient koruması, CAN ve FlexRay karma cluster desteği için yaygın seçim.

02 Communication cycle yapısı

FlexRay iletişimi tekrarlanan "communication cycle" birimlerine bölünmüştür. Her döngü dört segment içerir: static, dynamic, symbol window ve network idle time (NIT).

  FlexRay Communication Cycle (tipik 5 ms veya 10 ms):
  ┌────────────────────────────┬────────────┬────────┬─────┐
  │     STATIC SEGMENT         │  DYNAMIC   │ SYMBOL │ NIT │
  │  (TDMA slotları)           │  SEGMENT   │ WINDOW │     │
  │  Slot 1│ Slot 2│ ... │Slot N│ (FTDMA)   │        │     │
  └────────┴────────┴─────┴─────┴────────────┴────────┴─────┘
  ←── deterministik ──→←── event-triggered ──→

  Her segment kendi zamanlama garantileriyle çalışır.
    

Static Segment (TDMA)

Static segment, önceden belirlenmiş sabit boyutlu zaman dilimlerinden (slot) oluşur. Her slot belirli bir ECU'ya atanmıştır. Aktif süspansiyon gibi kritik sistemler için bu segment kullanılır: örneğin BMW X5'te süspansiyon sensör verileri her döngünün aynı statik slotunda iletilir.

gdStaticSlotTek bir statik slot'un süresi (mikrosaniye cinsinden). Tüm statik slotlar eşit boyuttadır. Örn. 250 µs → 40 slot × 250 µs = 10 ms statik segment.
gNumberOfStaticSlotsStatic segment'teki toplam slot sayısı. Her slot bir ECU'ya atanır. Kullanılmayan slotlar null frame içerir.
gdCycleTüm communication cycle'ın süresi. Tipik değerler: 1 ms, 2 ms, 5 ms, 10 ms. BMW X5 aktif süspansiyonu 5 ms cycle kullanır.

Dynamic Segment (FTDMA)

Dynamic segment, olay-tetiklemeli (event-triggered) mesajlar içindir. Minislot adı verilen küçük zaman birimlerine bölünmüştür. Bir ECU mesaj göndermek istediğinde bir sonraki minislot'ta başlar — bu CAN arbitration'a benzer ancak bant genişliği daha belirli sınırlar içindedir.

gdMinislotDynamic segment'teki minimum zaman birimi. Tipik: 25–100 µs. Bir ECU dinamik slot olarak birden fazla minislot kullanabilir.
Slot ID önceliğiDynamic segment'te düşük Slot ID değerine sahip ECU daha önce erişim hakkı kazanır (düşük numaralı slot = yüksek öncelik). Bu, CAN'ın identifier bazlı arbitration mantığına benzer.

Symbol Window ve NIT

Symbol WindowMedya erişim testi ve cluster başlatma/uyanma sembolleri için ayrılmış kısa pencere. Media Access Test (MTS) sembolleri Bus Guardian kalibrasyonu için kullanılır.
NIT (Network Idle Time)Her döngünün sonundaki boş süre. Osilatör toleranslarını telafi etmek ve döngü senkronizasyonunu sağlamak için kullanılır. Clock drift düzeltmesi bu sürede hesaplanır.

03 Frame yapısı

FlexRay frame üç bölümden oluşur: header, payload ve trailer. Toplam frame boyutu 5–254 bayt payload içerebilir.

  FlexRay Frame:
  ┌──────────────────────────────┬────────────────────────┬─────────────┐
  │           HEADER (5 byte)    │  PAYLOAD (0–254 byte)  │ TRAILER (3b)│
  └──────────────────────────────┴────────────────────────┴─────────────┘

  Header yapısı (40 bit = 5 byte):
  ┌──┬──┬──┬──┬──┬──────────────┬────────────────┬──────────────────────┐
  │Re│PP│NF│Sy│St│   Frame ID   │ Payload Length │   Header CRC (11b)  │
  │sv│  │  │nc│up│   (11 bit)   │    (7 bit)     │                      │
  └──┴──┴──┴──┴──┴──────────────┴────────────────┴──────────────────────┘
   1b  1b  1b  1b  1b    11b          7b                  11b
  + Cycle Count (6b) — tekrarlama kontrolü için
    

Header flag'leri

BitİsimAçıklama
Reserved (R)RezervHer zaman 0 — ileride kullanım için ayrılmış
Payload Preamble (PP)Payload Preamble Indicator1 = Payload'ın başında Network Management Vector veya Message ID var
Null Frame (NF)Null Frame Indicator0 = Geçerli veri yok (slot boş ama koruyucu amaçlı gönderildi)
Sync Frame (Sy)Sync Frame Indicator1 = Bu frame cluster senkronizasyon referansı olarak kullanılır
Startup Frame (St)Startup Frame Indicator1 = Bu frame cluster başlatma sürecinde kullanılır
Frame IDSlot tanımlayıcısı1–2047 arası — hangi slota ait olduğunu belirtir
Payload LengthPayload uzunluğu2-byte word sayısı cinsinden (0–127 → 0–254 byte)
Header CRCHeader bütünlük kodu11-bit CRC (Sync, Startup, Frame ID, Payload Length üzerinden)
Cycle CountDöngü sayacı0–63 arası — cycle counter. Tekrarlama filtresi için kullanılır.

Trailer (Frame CRC)

3 byte (24 bit) Frame CRC, header ve payload'ın bütünlüğünü doğrular. Üretecisi CRC24Q polinomu (0xB2B117) kullanır. Herhangi bir bit hatası bu kontrol toplamıyla tespit edilir.

python — FlexRay frame parse örneği
import struct

def parse_flexray_header(header_5bytes: bytes) -> dict:
    """5-byte FlexRay header'ı parse et"""
    assert len(header_5bytes) == 5

    # Tüm 40 biti integer'a dönüştür
    val = int.from_bytes(header_5bytes, byteorder='big')

    reserved   = (val >> 39) & 1
    pp         = (val >> 38) & 1
    nf         = (val >> 37) & 1
    sync       = (val >> 36) & 1
    startup    = (val >> 35) & 1
    frame_id   = (val >> 24) & 0x7FF    # 11 bit
    payload_len= (val >> 17) & 0x7F     # 7 bit (word sayisi)
    header_crc = (val >> 6)  & 0x7FF    # 11 bit
    cycle_cnt  =  val         & 0x3F     # 6 bit

    return {
        "frame_id"     : frame_id,
        "payload_words": payload_len,
        "payload_bytes": payload_len * 2,
        "cycle_count"  : cycle_cnt,
        "sync"         : bool(sync),
        "startup"      : bool(startup),
        "null_frame"   : not bool(nf),
        "payload_preamble": bool(pp),
        "header_crc"   : header_crc,
    }

# Ornek header: Frame ID=5, 4 word payload, cycle=12, sync frame
example_hdr = bytes([0x10, 0x05, 0x04, 0x00, 0x0C])
info = parse_flexray_header(example_hdr)
for k, v in info.items():
    print(f"  {k}: {v}")

04 Cluster konfigürasyonu

FlexRay cluster'ı (ağı) çalışabilir hale getirmek için tüm ECU'ların üzerinde mutabık kaldığı bir dizi global parametre tanımlanmalıdır. Bu konfigürasyon FIBEX XML formatında dağıtılır.

Temel cluster parametreleri

ParametreÖrnek değerAçıklama
gdCycle5000 µsCommunication cycle süresi
gNumberOfStaticSlots40Statik segment slot sayısı
gdStaticSlot100 µsTek statik slot süresi
gdMinislot25 µsDinamik segment minislot süresi
gNumberOfMinislots20Dinamik segment minislot sayısı
gdSymbolWindow50 µsSymbol window süresi
gdNIT500 µsNetwork idle time süresi
gdBit100 nsBit süresi (10 Mbps için)
gClusterDriftDamping2Saat senkronizasyon damping faktörü

FIBEX (Field Bus Exchange Format) XML

FIBEX, FlexRay cluster tanımını XML formatında ifade eden ASAM standardıdır. Tüm slot atamaları, ECU node özellikleri ve zamanlama parametreleri bu dosyada tanımlanır.

xml — FIBEX örneği (basitleştirilmiş)
<!-- FlexRay Cluster FIBEX tanımı (kısaltılmış) -->
<fx:CLUSTER id="C_FlexRay_1">
  <fx:PROTOCOL>FLEXRAY</fx:PROTOCOL>
  <fx:BAUDRATE>10000000</fx:BAUDRATE>   <!-- 10 Mbps -->

  <fx:TIMING>
    <fx:CYCLE-LENGTH>5000</fx:CYCLE-LENGTH>      <!-- 5 ms -->
    <fx:STATIC-SLOTS>40</fx:STATIC-SLOTS>
    <fx:STATIC-SLOT-LENGTH>100</fx:STATIC-SLOT-LENGTH>  <!-- 100 µs -->
    <fx:MINISLOT-LENGTH>25</fx:MINISLOT-LENGTH>
    <fx:NUMBER-OF-MINISLOTS>20</fx:NUMBER-OF-MINISLOTS>
  </fx:TIMING>

  <fx:CHANNEL-A>active-star</fx:CHANNEL-A>
  <fx:CHANNEL-B>active-star</fx:CHANNEL-B>
</fx:CLUSTER>

<!-- ECU Tanımı: Süspansiyon Kontrol Modülü -->
<fx:ECU id="ECU_SuspensionCtrl">
  <fx:NODE>
    <fx:STATIC-SLOT-ASSIGNMENT>
      <fx:SLOT-ID>5</fx:SLOT-ID>           <!-- Slot 5: CH A+B -->
      <fx:CHANNEL>A_AND_B</fx:CHANNEL>
    </fx:STATIC-SLOT-ASSIGNMENT>
    <fx:STATIC-SLOT-ASSIGNMENT>
      <fx:SLOT-ID>6</fx:SLOT-ID>           <!-- Slot 6: sadece CH A -->
      <fx:CHANNEL>A</fx:CHANNEL>
    </fx:STATIC-SLOT-ASSIGNMENT>
  </fx:NODE>
</fx:ECU>

<!-- Frame tanımı -->
<fx:FRAME id="FRM_SuspensionData">
  <fx:SLOT-ID>5</fx:SLOT-ID>
  <fx:PAYLOAD-LENGTH>8</fx:PAYLOAD-LENGTH>   <!-- 16 byte -->
  <fx:PDU-INSTANCES>
    <fx:PDU ref="PDU_WheelSpeed_FL"/>
    <fx:PDU ref="PDU_WheelSpeed_FR"/>
    <fx:PDU ref="PDU_SuspensionPos"/>
  </fx:PDU-INSTANCES>
</fx:FRAME>

Startup ve senkronizasyon

FlexRay cluster başlatma sürecinde en az iki "coldstart node" (startup + sync frame gönderen ECU) gerekmektedir. Başlatma süreci birkaç adımdan oluşur:

  1. Listen: ECU bus'ı dinler, mevcut cluster aktivitesini tespit etmeye çalışır.
  2. Collision Resolution: Birden fazla coldstart node varsa aralarında çakışma çözüm mekanizması devreye girer.
  3. Consistency Check: Cluster parametrelerinin tutarlılığı doğrulanır.
  4. Normal Operation: Tüm ECU'lar senkronize çalışmaya başlar.

05 Linux FlexRay desteği

Linux çekirdeğinde FlexRay desteği CAN protokolüne kıyasla oldukça sınırlıdır. Ancak ticari yazılım yığınları ve AUTOSAR entegrasyonu mevcuttur.

SocketCAN ve FlexRay

Linux'un SocketCAN altyapısı (AF_CAN + CAN_RAW) CAN için kapsamlı destek sunmaktadır. FlexRay için benzer bir AF_FLEXRAY soket arayüzü önerilmiş ancak mainline kernel'a dahil edilmemiştir. Bazı BSP (Board Support Package) tedarikçileri özel FlexRay socket implementasyonları sunar.

bash — SocketCAN FlexRay (özel kernel yaması ile)
# FlexRay kernel modülü (üretici özel):
sudo modprobe flexray
sudo modprobe flexray_mpc5121  # Freescale MPC5121 FlexRay IP için

# Cihaz listesi:
ip link show | grep fr
# 5: fr0: <NOARP,UP,LOWER_UP> mtu 254 ... state UNKNOWN

# FlexRay arayüzünü yapılandır (araç özel BSP):
ip link set fr0 type flexray speed 10000000
ip link set fr0 up

Elektrobit Linux FlexRay Stack

Elektrobit (eb), AUTOSAR uyumlu FlexRay yazılım yığınlarının önde gelen tedarikçilerinden biridir. eb tresos Studio ile Linux üzerinde FlexRay stack konfigürasyonu ve simülasyonu yapılabilir.

bash — eb tresos FlexRay simülasyon ortamı
# eb tresos Studio Linux kurulumu:
tar -xzf eb_tresos_studio_linux_v28.0.tar.gz
cd eb_tresos_studio/
./install.sh

# FlexRay simülasyon projesi oluştur:
./tresos_studio --project fr_cluster_sim --protocol flexray

# FIBEX dosyasını yükle:
./tresos_studio --import-fibex bmw_x5_suspension.xml

# Simülasyonu başlat:
./tresos_studio --run-sim --duration 1000ms --log fr_trace.bin

Vector CANdb++ ve .dbc → .arxml dönüşümü

bash — Vector araç zinciri
# FIBEX'ten AUTOSAR .arxml'e dönüştür (Vector Fibex2arxml):
fibex2arxml --input bmw_x5.fibex --output bmw_x5.arxml

# FlexRay log dosyasını analiz et (Python ile):
python3 - <<'EOF'
import can   # python-can FlexRay eklentisi (Vector sürücüsü ile)
import cantools

db = cantools.db.load_file('bmw_x5_flexray.arxml')
bus = can.interface.Bus(bustype='vector',
                         channel=0, bitrate=10000000,
                         protocol='flexray')
for msg in bus:
    try:
        decoded = db.decode_message(msg.arbitration_id, msg.data)
        print(f"Slot {msg.arbitration_id}: {decoded}")
    except Exception:
        pass
EOF

06 AUTOSAR bağlamı

AUTOSAR (AUTomotive Open System ARchitecture), FlexRay'i destekleyen yazılım mimarisi standartları tanımlar. Classic Platform (CP) FlexRay'i tam olarak destekler.

AUTOSAR Classic Platform FlexRay katmanları

  AUTOSAR Classic Platform — FlexRay Yazılım Yığını:

  ┌─────────────────────────────────────────────────────────────────┐
  │                 APPLICATION LAYER                               │
  │              (SWC: Software Components)                         │
  ├─────────────────────────────────────────────────────────────────┤
  │                 RTE (Runtime Environment)                       │
  ├───────────┬─────────────┬────────────────┬───────────────────── ┤
  │ FrIf      │ FrTp        │ FrNm           │ FrSM                │
  │ FlexRay   │ Transport   │ Network Mgmt   │ State Manager       │
  │ Interface │ Protocol    │                │                      │
  ├───────────┴─────────────┴────────────────┴─────────────────────┤
  │                 Fr (FlexRay Driver)                             │
  ├─────────────────────────────────────────────────────────────────┤
  │                 FlexRay Hardware (Transceiver + Controller)     │
  └─────────────────────────────────────────────────────────────────┘
    

AUTOSAR FlexRay modülleri

ModülAUTOSAR IDGörev
Fr (FlexRay Driver)AUTOSAR_SWS_FlexRayDriverFlexRay controller donanım soyutlaması. Buffer yönetimi, slot konfigürasyonu, POC (Protocol Operation Control) durum makinesi.
FrIf (FlexRay Interface)AUTOSAR_SWS_FlexRayInterfaceFr sürücüsünü üst katmanlara sunar. PDU yönlendirme, frame tetikleme, trigger transmit / receive indication.
FrTp (FlexRay Transport Protocol)AUTOSAR_SWS_FlexRayTransportProtocol254 byte'tan büyük mesajları segmentlere böler (ISO 15765 benzeri). UDS teşhis servisleri için kullanılır.
FrNm (FlexRay Network Management)AUTOSAR_SWS_FlexRayNMAğ uyanma/uyku yönetimi. ECU'ların koordineli uyku moduna geçmesini sağlar — araç park edildiğinde güç tasarrufu.
FrSM (FlexRay State Manager)AUTOSAR_SWS_FlexRayStateManagerFlexRay cluster başlatma/durdurma durum makinesi. CommunicationManager ile entegrasyon.

PDU routing — ComStack örneği

xml — AUTOSAR FlexRay PDU konfigürasyonu (kısaltılmış arxml)
<!-- AUTOSAR .arxml FlexRay Frame tanımı -->
<FR-CLUSTER>
  <SHORT-NAME>FlexRayCluster_SuspensionDomain</SHORT-NAME>
  <BAUD-RATE>10000000</BAUD-RATE>

  <COMMUNICATION-CYCLE>
    <CYCLE-LENGTH>5000</CYCLE-LENGTH>
    <STATIC-SLOT-LENGTH>100</STATIC-SLOT-LENGTH>
    <NUMBER-OF-STATIC-SLOTS>40</NUMBER-OF-STATIC-SLOTS>
  </COMMUNICATION-CYCLE>
</FR-CLUSTER>

<!-- Frame to PDU mapping -->
<FR-FRAME>
  <SHORT-NAME>SuspensionDataFrame</SHORT-NAME>
  <FRAME-LENGTH>16</FRAME-LENGTH>    <!-- 16 byte payload -->
  <PDU-TO-FRAME-MAPPINGS>
    <PDU-TO-FRAME-MAPPING>
      <PDU-REF>WheelSpeed_FL_PDU</PDU-REF>
      <START-POSITION>0</START-POSITION>
      <PACKED-BYTE-LENGTH>4</PACKED-BYTE-LENGTH>
    </PDU-TO-FRAME-MAPPING>
    <PDU-TO-FRAME-MAPPING>
      <PDU-REF>SuspensionPosition_PDU</PDU-REF>
      <START-POSITION>4</START-POSITION>
      <PACKED-BYTE-LENGTH>8</PACKED-BYTE-LENGTH>
    </PDU-TO-FRAME-MAPPING>
  </PDU-TO-FRAME-MAPPINGS>
</FR-FRAME>

07 FlexRay analiz araçları

FlexRay cluster analizi için Vector, Lauterbach ve açık kaynak araçları kullanılır.

Vector CANoe FlexRay

bash — CANoe FlexRay analiz
# CANoe komut satırı simülasyonu (CANoeScript):
CANoe /CFG bmw_x5_flexray.cfg /Start /StopAfter 5000 /Log output.blf

# BLF (Binary Logging File) dosyasını Python ile analiz et:
python3 - <<'EOF'
import can
from can.util import load_environment_config

log = can.BLFReader("output.blf")
flexray_msgs = []
for msg in log:
    if msg.channel == "FlexRay":
        flexray_msgs.append({
            "timestamp" : msg.timestamp,
            "slot_id"   : msg.arbitration_id,
            "cycle"     : msg.channel_specific.get("cycle", 0),
            "data"      : msg.data.hex()
        })

print(f"Toplam FlexRay mesaj: {len(flexray_msgs)}")
for m in flexray_msgs[:5]:
    print(f"  Slot {m['slot_id']} Cycle {m['cycle']}: {m['data']}")
EOF

Lauterbach TRACE32 FlexRay

bash — TRACE32 FlexRay trace
# TRACE32 FlexRay trace komutu (PowerView scripting):
# FlexRay.TRACE.Init <cluster_file> <channel>
FlexRay.TRACE.Init bmw_x5.fibex A+B
FlexRay.TRACE.Start
# ... 5 saniye bekle ...
FlexRay.TRACE.Stop
FlexRay.TRACE.Export CSV fr_trace.csv

python-flexray (açık kaynak)

python — python-flexray ile log analizi
pip install python-flexray
python — FlexRay frame decode
from flexray import FlexRayFrame, FlexRayCluster

# Cluster tanımını yükle (FIBEX veya arxml):
cluster = FlexRayCluster.from_fibex("bmw_x5_suspension.fibex")

# Ham frame verisi (header + payload):
raw_frame = bytes([
    0x10, 0x05, 0x08, 0x00, 0x0C,  # 5-byte header
    0x13, 0x88, 0x27, 0x10,          # 4 byte: FL hız = 5000, FR hız = 10000
    0x01, 0xF4, 0x02, 0x58,          # süspansiyon pozisyonları
    0x00, 0x00, 0x00, 0x00,
    0xA3, 0xB2, 0xC1,               # 3-byte Frame CRC
])

frame = FlexRayFrame.from_bytes(raw_frame)
print(f"Slot ID: {frame.slot_id}")
print(f"Cycle:   {frame.cycle_count}")
print(f"Sync:    {frame.sync_frame}")

# PDU decode (cluster tanımından):
decoded = cluster.decode_frame(frame)
for signal_name, value in decoded.items():
    print(f"  {signal_name}: {value}")

# Beklenen çıktı:
# WheelSpeed_FL: 5000 rpm
# WheelSpeed_FR: 10000 rpm
# SuspensionPos_FL: 500 mm
# SuspensionPos_FR: 600 mm

08 Pratik: BMW X5 süspansiyon ve steer-by-wire

BMW X5 E70'in Adaptive Drive aktif süspansiyon sistemi, FlexRay'in gerçek dünya uygulamasının en iyi örneklerinden biridir. Bu bölümde sistemin FlexRay mimarisi ve ISO 26262 ASIL gereksinimleri incelenmektedir.

BMW X5 E70 FlexRay ağ mimarisi

  BMW X5 E70 Chassis Domain FlexRay Network:

  ┌─────────────────────────────────────────────────────────────────┐
  │                  FlexRay Cluster (10 Mbps)                      │
  │    gdCycle = 5 ms    Channel A + B (dual redundant)             │
  ├──────────┬──────────┬──────────┬──────────┬────────────────────┤
  │  VDM     │  EHC     │  DSC     │  ICM     │  EPS               │
  │(Vehicle  │(Electro- │(Dynamic  │(Integrated│(Electric Power    │
  │Dynamics  │hydraulic │Stability │Chassis   │Steering)           │
  │ Mgmt)    │ Control) │Control)  │ Mgmt)    │                    │
  ├──────────┼──────────┼──────────┼──────────┼────────────────────┤
  │ Slot 1   │ Slot 5   │ Slot 9   │ Slot 13  │ Slot 17            │
  │(10 ms)   │(10 ms)   │(5 ms)    │(5 ms)    │(5 ms)              │
  └──────────┴──────────┴──────────┴──────────┴────────────────────┘

  EHC = Elektronik amortisör (Adaptive Drive damper control)
  VDM = Her 5 ms'de yaw rate, lateral g, longitudinal g verileri iletir
  DSC = Her 5 ms'de yaw moment talebi ve ABS müdahale bilgisi
    

Aktif süspansiyon deterministik zamanlama gereksinimi

BMW Adaptive Drive sistemi, araç dinamiği hesaplamalarını 5 ms periyodik döngüde çalıştırır. Yaw rate sensör verisi EHC'ye maksimum 5 ms gecikmeyle ulaşmalıdır. CAN ile bu garanti verilemezdi; FlexRay statik segmenti bu garantiyi donanım düzeyinde sağlar.

c — FlexRay süspansiyon veri işleme (AUTOSAR SWC)
/*
 * AUTOSAR SWC: EHC (Electro-Hydraulic Control) — aktif damper
 * Platform: TriCore TC1797, AUTOSAR CP 4.3
 * Periyot: 5 ms (FlexRay static segment Slot 5 ile tetiklenir)
 */

#include "Rte_EHC_SuspensionCtrl.h"   /* AUTOSAR RTE başlığı */

/* Sinyal tanımları (FIBEX'ten ARXML'e, arxml'den RTE'ye üretildi) */
#define YAW_RATE_MAX_DEG_S   150.0f
#define LATERAL_G_MAX        1.5f

/* SWC RunEntity: her 5 ms'de FlexRay frame alımında tetiklenir */
FUNC(void, EHC_CODE) EHC_SuspensionCtrl_5ms(void) {
    float32 yaw_rate_deg_s   = 0.0f;
    float32 lateral_accel_g  = 0.0f;
    float32 roll_angle_deg   = 0.0f;

    /* Slot 1'den (VDM): araç dinamik verileri al */
    Rte_Read_SRVehicleDynamics_YawRate(&yaw_rate_deg_s);
    Rte_Read_SRVehicleDynamics_LateralAccel(&lateral_accel_g);
    Rte_Read_SRVehicleDynamics_RollAngle(&roll_angle_deg);

    /* Süspansiyon kuvvet talebi hesapla */
    float32 anti_roll_force_Nm = lateral_accel_g * 9.81f * 450.0f;
    /* 450 = araç sprung mass * roll moment kolu */

    /* Damper kuvvetini sınırla */
    if (anti_roll_force_Nm > EHCA_MAX_FORCE_NM)
        anti_roll_force_Nm = EHCA_MAX_FORCE_NM;
    if (anti_roll_force_Nm < -EHCA_MAX_FORCE_NM)
        anti_roll_force_Nm = -EHCA_MAX_FORCE_NM;

    /* Slot 5'e (EHC çıkış): amortisör valf komutu yaz */
    Rte_Write_SRDamperControl_AntiRollForce(anti_roll_force_Nm);
    Rte_Write_SRDamperControl_DamperMode(DAMPER_MODE_COMFORT);
}

Steer-by-Wire güvenilirlik gereksinimleri

Steer-by-Wire (SbW) sisteminde fiziksel direksiyon-tekerlek mekanik bağlantısı yoktur. Bu durum, iletişim güvenilirliğini hayati hale getirir. FlexRay'in çift kanal (A + B) yapısı, SbW için gereken güvenilirlik seviyesini sağlar.

GereksinimFlexRay çözümüISO 26262 ASIL
Direksiyon komutunun maksimum gecikme garantisiStatik slot: 5 ms deterministikASIL-D (D seviyesi)
Tek nokta arıza toleransıChannel A arızası → Channel B devreye girerASIL-D
Veri bütünlüğüFrame CRC + Header CRC çift kontrolASIL-C/D
Güncellik kontrolüCycle Counter ile bayat veri tespitiASIL-B
Timeout tespitiBoş slot (null frame) izlemeASIL-C

FlexRay → CAN Gateway senaryosu

Modern araçlarda tüm ağlar FlexRay kullanmaz. Chassis domain FlexRay kullanırken body domain (kapı, aydınlatma, klima) CAN kullanır. Gateway ECU ikisi arasında köprü görevi görür.

c — FlexRay/CAN Gateway (AUTOSAR PduR routing)
/*
 * AUTOSAR PduR (PDU Router) — FlexRay to CAN routing tablosu
 * Bu konfigürasyon AUTOSAR Configurator'da üretilir.
 */

/* Araç hızı: FlexRay Slot 1 → CAN ID 0x1A0 (body network) */
const PduR_RoutingPathType PduR_RoutingTable[] = {
    {
        .src_pdu_id   = FR_PDU_VEHICLE_SPEED,   /* FlexRay kaynak */
        .dst_pdu_id   = CAN_PDU_VEHICLE_SPEED,  /* CAN hedef */
        .scaling      = 1.0f,                   /* birim dönüşümü yok */
        .gateway_type = PDUGATEWAY_FLEXRAY_TO_CAN
    },
    {
        .src_pdu_id   = FR_PDU_YAW_RATE,
        .dst_pdu_id   = CAN_PDU_YAW_RATE,
        .scaling      = 1.0f,
        .gateway_type = PDUGATEWAY_FLEXRAY_TO_CAN
    },
};

void PduR_FrIfRxIndication(PduIdType pduId,
                             const PduInfoType* pduInfo) {
    /* FlexRay'den gelen PDU'yu CAN'a yönlendir */
    for (int i = 0; i < PDUR_ROUTING_TABLE_SIZE; i++) {
        if (PduR_RoutingTable[i].src_pdu_id == pduId) {
            CanIf_Transmit(PduR_RoutingTable[i].dst_pdu_id, pduInfo);
        }
    }
}
ISO 26262 ASIL-D ve FlexRay

ISO 26262, otomotiv fonksiyonel güvenlik standardıdır. ASIL-D (Automotive Safety Integrity Level D) en yüksek güvenlik bütünlüğü seviyesidir — direksiyon ve fren sistemleri için gereklidir. FlexRay'in çift kanal yapısı ve deterministik zamanlaması ASIL-D gereksinimlerinin karşılanmasına doğrudan katkı sağlar. Bununla birlikte, sadece FlexRay kullanmak ASIL-D sertifikasyonu için yeterli değildir; yazılım uygulaması, ECU donanımı ve sistem mimari tasarımının tamamı ISO 26262 analizinden geçmelidir. Tipik bir SbW sistemi için güvenlik analizi (HARA, FMEA, FTA) 12–24 ay sürebilir.