TwinCAT 3 Runtime auf Apple Silicon

Dieses Kapitel beschreibt den Betrieb der TwinCAT 3 Usermode Runtime auf einem Apple-Silicon-Mac (M-Serie, arm64). Die Runtime wird dabei nicht nativ ausgeführt, sondern in einer vollständig emulierten x86-64-Maschine unter QEMU, in der Beckhoff RT Linux® und das Paket tc31-xar-um installiert sind. TwinCAT 3 Engineering (XAE) läuft in einer Windows-VM unter Parallels auf demselben Rechner und verbindet sich über ADS mit dem Zielsystem.

Hinweis Die beschriebene Konfiguration ist von Beckhoff nicht freigegeben und wird nicht supportet. Sie bietet keine Echtzeit und keinen Zugriff auf EtherCAT. Sie ist ausschließlich für Engineering, Simulation und Unit-Tests (TcUnit) ohne Hardware geeignet.

Ausgangslage

Vor dieser Untersuchung lagen drei Befunde vor, die den Betrieb der Runtime auf Apple Silicon auszuschließen schienen. Alle drei Befunde sind zutreffend. Keiner davon bezieht sich auf den Mac als solchen.

BefundBeobachtungTatsächlich gemessene Schicht
Docker Desktop (amd64-Image, Rosetta)Die Runtime startet, scheitert in ihrer Hardware-Abstraktionsschicht und registriert keinen ADS-Server.Den Kernel der LinuxKit-VM von Docker Desktop: STRICT_DEVMEM, keine SMBIOS-Tabellen, kein PCI-Adressraum. Das Mapping von /dev/mem schlägt mit “Operation not permitted” fehl.
Beckhoff-Dokumentation und SupportDie Seite Runtime-Konfiguration führt Windows on Arm® mit “Echtzeit-Runtime: Nicht möglich”. Der Support begründet dies damit, dass ARM das x86-Speichermodell (Total Store Ordering) nicht emulieren kann, auf das der ADS-Router angewiesen ist.Emulatoren ohne Erhalt der Speicherordnung: die User-Mode-Emulation von QEMU und die x64-Emulation von Windows on Arm®. Rosetta und eine Vollsystem-Emulation erhalten die Speicherordnung.
Meldung Unknown Intel CPU model: 0x2CDie Runtime gibt die Meldung unter Rosetta aus und scheitert anschließend.Eine Namensauflösung. Die Funktion ordnet Family und Model der CPU einem Klartextnamen zu (Sandy Bridge bis Meteor Lake, Zen 1 bis 5). Unbekannte Modelle erzeugen die Meldung; die Ausführung wird fortgesetzt.

Die Fehlinterpretation entstand jeweils durch Verallgemeinerung: Aus “läuft nicht in diesem Container” wurde “läuft nicht auf dieser Hardware”.

Funktionsweise

Die amd64-Variante der Runtime setzt keine Beckhoff-Hardware voraus, sondern einen vollständigen PC. Die Analyse der Binaries (libTcPalDrvUm.so, TcSystemServiceUm, TcSysConf) ergibt folgende Anforderungen an das Zielsystem:

  • Firmware-Tabellen (SMBIOS/DMI), die über /sys/class/dmi/id gelesen werden.
  • Ein PCI-Bus und ein Kernel, der das Mapping physischer Adressbereiche über /dev/mem zulässt.
  • Das Verzeichnis /sys/kernel/iommu_groups; TcSysConf bricht ab, wenn es fehlt.
  • Eine über cpuid gemeldete Intel- oder AMD-CPU. Der Modellname ist unerheblich.

Ein Container auf einem fremden Kernel erfüllt diese Anforderungen nicht. Eine Vollsystem-VM erfüllt sie. Auf Apple Silicon steht für x86-64-Gäste keine Hardware-Beschleunigung zur Verfügung; QEMU führt den Gast über den TCG-Binärübersetzer aus. Für einen stark geordneten Gast auf einem ARM-Host werden die Prozessoren des Gasts nacheinander in einem Thread ausgeführt, wodurch die x86-Speicherordnung konstruktionsbedingt erhalten bleibt.

Systemvoraussetzungen

  • Apple-Silicon-Mac (getestet: MacBook Pro M3 Max, macOS 26.6)
  • QEMU 11 (Installation über Homebrew)
  • Installer-Image Beckhoff RT Linux® für amd64 (Download über myBeckhoff)
  • myBeckhoff-Zugangsdaten für den Beckhoff-Paketserver
  • Windows-VM mit TwinCAT 3 Engineering (XAE) ab Build 4026, hier unter Parallels

Virtuelle Maschine installieren

Voraussetzungen:

  • Installer-Image Beckhoff-RT-Linux-<Build>-installer-amd64.img
  • Mindestens 16 GB freier Speicherplatz für das Zielabbild

So gehst du vor:

  1. Erstelle ein leeres Zielabbild mit qemu-img create -f qcow2 target.qcow2 16G.

  2. Starte QEMU mit dem Installer-Image als erster und dem Zielabbild als zweiter Festplatte. Die maßgeblichen Parameter sind:

    qemu-system-x86_64 -machine q35 -accel tcg,thread=single -cpu Skylake-Client-v4 \
      -device intel-iommu -smbios type=1,manufacturer=Beckhoff,product=C6015 \
      -drive if=pflash,format=raw,readonly=on,file=edk2-x86_64-code.fd ...
    

    -device intel-iommu stellt /sys/kernel/iommu_groups bereit. -smbios befüllt die DMI-Tabellen; der Produktname ist frei wählbar.

  3. Das Installer-Image bootet über OVMF (UEFI). Wähle im Installer die Option Beckhoff RT Linux Install.

  4. Wähle das Zielabbild als Ziellaufwerk aus und bestätige die Warnung.

  5. Vergib ein Passwort für den Benutzer Administrator.

  6. Verneine die Verschlüsselung der Root-Partition (LUKS2).

  7. Beende QEMU nach Abschluss der Installation und starte die VM ohne das Installer-Image neu.

Die Installation dauert unter Emulation etwa fünf Minuten, der erste Systemstart etwa eine Minute. Beckhoff RT Linux® meldet sich mit dem Kernel 6.19.10-rt1-bhf2 (PREEMPT_RT). Im Gast sind eine Skylake-CPU, der DMI-Produktname C6015, IOMMU-Gruppen und /dev/mem vorhanden.

TwinCAT 3 Runtime installieren

Voraussetzungen:

  • Authentifizierung am Beckhoff-Paketserver über /etc/apt/auth.conf.d/bhf.conf (siehe Dokumentation Beckhoff RT Linux®, Kapitel “Am Beckhoff-Paketserver authentifizieren”). Die Paketquelle bhf.list ist vorkonfiguriert.

So gehst du vor:

  1. Aktualisiere die Paketlisten mit sudo apt update.
  2. Installiere die Runtime mit sudo apt install tc31-xar-um.
  3. Prüfe den Dienst mit sudo systemctl status TcSystemServiceUm.

Das Journal zeigt nach dem Start:

TcSystemServiceUm: RTE driver not found. Please ensure that the package libtcrte is installed.
TcSystemServiceUm: BBAPI device '/dev/bbapi' not present on Beckhoff hardware.
TcSystemServiceUm: license validation status is Valid(3)
TcSystemServiceUm: TwinCAT system start completed. AdsState: >15<

AdsState 15 entspricht dem Config Mode. Die Meldungen zu libtcrte (Realtime-Ethernet-Treiber) und /dev/bbapi (Beckhoff BIOS-API) sind auf Nicht-Beckhoff-Hardware zu erwarten und haben keine Auswirkung. Dieselbe Runtime erreicht in Docker Desktop auf demselben Rechner diesen Zustand nicht.

ADS-Verbindung einrichten

Firewall

Beckhoff RT Linux® wird mit nftables und der Standardrichtlinie “drop” ausgeliefert. Freigegeben sind SSH, HTTPS, Secure ADS (TCP 8016) und die ADS-Geräteerkennung (UDP 48899). Unverschlüsseltes ADS (TCP 48898) ist nicht freigegeben.

Hinweis Die Portweiterleitung des QEMU-User-Mode-Netzwerks schließt den TCP-Handshake bereits auf dem Host ab. Ein Port-Scan vom Mac meldet Port 48898 daher als offen, obwohl der Gast die Verbindung verwirft. Die Verbindungstabelle von QEMU (info usernet) zeigt das SYN in diesem Fall als unbeantwortet.

Lege für unverschlüsseltes ADS die Datei /etc/nftables.conf.d/10-ads.conf mit einer Regel tcp dport 48898 accept an und lade das Regelwerk mit sudo systemctl reload nftables neu. Alternativ verwendest du eine Secure-ADS-Route über Port 8016.

ADS-Routen

Die Routen werden auf beiden Seiten statisch hinterlegt:

SystemDateiEintrag
Zielsystem (Gast)/etc/TwinCAT/3.1/Target/StaticRoutes.xmlAmsNetId des Engineering-Systems, Adresse 10.0.2.2 (Gateway des QEMU-Netzwerks)
Engineering-System (Windows, TwinCAT 4026)C:\ProgramData\Beckhoff\TwinCAT\3.1\Target\StaticRoutes.xmlAmsNetId des Zielsystems, Adresse des Mac im Parallels-Netzwerk

Die AmsNetId des Zielsystems wird aus der MAC-Adresse der virtuellen Netzwerkkarte abgeleitet (hier 0.18.52.86.1.1). TwinCAT 4026 unter Windows speichert die Router-Konfiguration nicht mehr in der Registry; die AmsNetId des Engineering-Systems wird aus dessen IP-Adresse gebildet. Die Datei StaticRoutes.xml unter ProgramData muss gegebenenfalls angelegt werden. Starte anschließend den Dienst TcSysSrv neu.

Verbindung prüfen

Nach dem Neustart des Routers liefert ein Lesezugriff auf den Zustand des Zielsystems über die .NET-Bibliothek TwinCAT.Ads:

AmsPortKomponenteZustand
10000System ServiceConfig
200Echtzeitkern (TcRTime)Config
300I/O-Server (TcIo)Config

Hinweis Das quelloffene Kommandozeilenwerkzeug adstool meldet gegenüber diesem Zielsystem auf allen AmsPorts den ADS-Fehler 6 (Target port not found), unabhängig von den eingerichteten Routen. Der Fehler ist nicht als Ausfall der Runtime zu werten. Verwende zur Prüfung den TwinCAT-Router unter Windows oder TwinCAT.Ads.

Konfiguration aktivieren

So gehst du vor:

  1. Wähle in TwinCAT 3 Engineering das Zielsystem über die eingerichtete Route aus.
  2. Lege ein SPS-Projekt an (Standard PLC Template) und implementiere ein Programm, beispielsweise einen Zähler in MAIN.
  3. Aktiviere die Konfiguration und starte das Zielsystem im Run Mode neu.

Das Journal des Zielsystems zeigt anschließend:

Activate configuration performed from 'XAE-WIN11' (10.211.55.3.1.1) by 'patdhlk'
TwinCAT System Start: AdsState: 5 NumProc: 2
License Violation: License 'TC3 PLC' not found, Requested by 'QemuPlc Instance'
TwinCAT system start completed. AdsState: >5<
Error: >> license not found << checking TwinCAT Licenses!
TwinCAT System Start: AdsState: 15

AdsState 5 entspricht dem Run Mode. TwinCAT 3 Engineering wählt die Toolchain für die Plattform “TwinCAT OS (x64-E)” selbstständig aus und überträgt das Boot-Projekt (Port_851.app) auf das Zielsystem. Die Runtime lädt und startet das SPS-Programm.

Lizenzierung

Eine neu installierte Runtime verfügt über keine SPS-Lizenz (TC1200). Das Zielsystem wechselt deshalb nach dem Start des SPS-Programms zurück in den Config Mode. Fordere in TwinCAT 3 Engineering unter SYSTEM > License eine 7-Tage-Testlizenz an und aktiviere die Konfiguration erneut. Die Testlizenz wird über ein Captcha ausgestellt und kann nicht automatisiert werden.

Einschränkungen

Es gelten die Limitierungen der TwinCAT 3 Usermode Runtime: keine garantierten deterministischen Ausführungseigenschaften, minimale Basiszeit 1 ms, kein Zugriff auf EtherCAT, keine CCAT-basierten Netzwerkkarten. Die Emulation verschlechtert das Zeitverhalten zusätzlich. Messung mit cyclictest im Gast (Intervall 1 ms, Echtzeitpriorität, Host im Leerlauf):

MinMittelwertMax
46 µs900 µs5246 µs
  • Tasks mit 1 ms Zykluszeit überschreiten ihre Zykluszeit dauerhaft.
  • Tasks ab 10 ms Zykluszeit sind für Logik-Simulation und TcUnit geeignet.
  • QEMU führt Multithreaded-TCG für einen stark geordneten Gast auf einem schwach geordneten Host nur bei expliziter Anforderung aus. Diese Einstellung hebt den Erhalt der x86-Speicherordnung auf und ist nicht zulässig.
  • Eine Hardware-Beschleunigung (HVF) steht auf Apple Silicon nur für arm64-Gäste zur Verfügung.
  • Die arm64-Variante der Runtime ist ausschließlich für die Geräte CX82xx und CX9240 vorgesehen und auf anderer arm64-Hardware nicht lauffähig.

Weitere Informationen

  • Untersuchung, Runbook und Skripte: patdhlk/beckhoff-rt-linux, Verzeichnis docs/research/
  • Beckhoff Information System: Runtime-Konfiguration, TwinCAT 3 Usermode Runtime
  • Der überwiegende Teil der praktischen Arbeit (Analyse der Binaries, Bedienung des Installers über den QEMU-Monitor, Konfiguration der Windows-VM, Runbook) wurde von einem KI-Agenten auf Grundlage meiner Vorgaben ausgeführt. Der Zeitaufwand von der Installation von QEMU bis zum SPS-Programm im Run Mode lag unter einer Stunde.