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.
| Befund | Beobachtung | Tatsä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 Support | Die 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: 0x2C | Die 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/idgelesen werden. - Ein PCI-Bus und ein Kernel, der das Mapping physischer Adressbereiche über
/dev/memzulässt. - Das Verzeichnis
/sys/kernel/iommu_groups;TcSysConfbricht ab, wenn es fehlt. - Eine über
cpuidgemeldete 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:
Erstelle ein leeres Zielabbild mit
qemu-img create -f qcow2 target.qcow2 16G.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-iommustellt/sys/kernel/iommu_groupsbereit.-smbiosbefüllt die DMI-Tabellen; der Produktname ist frei wählbar.Das Installer-Image bootet über OVMF (UEFI). Wähle im Installer die Option Beckhoff RT Linux Install.
Wähle das Zielabbild als Ziellaufwerk aus und bestätige die Warnung.
Vergib ein Passwort für den Benutzer Administrator.
Verneine die Verschlüsselung der Root-Partition (LUKS2).
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 Paketquellebhf.listist vorkonfiguriert.
So gehst du vor:
- Aktualisiere die Paketlisten mit
sudo apt update. - Installiere die Runtime mit
sudo apt install tc31-xar-um. - 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:
| System | Datei | Eintrag |
|---|---|---|
| Zielsystem (Gast) | /etc/TwinCAT/3.1/Target/StaticRoutes.xml | AmsNetId 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.xml | AmsNetId 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:
| AmsPort | Komponente | Zustand |
|---|---|---|
| 10000 | System Service | Config |
| 200 | Echtzeitkern (TcRTime) | Config |
| 300 | I/O-Server (TcIo) | Config |
Hinweis Das quelloffene Kommandozeilenwerkzeug
adstoolmeldet 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 oderTwinCAT.Ads.
Konfiguration aktivieren
So gehst du vor:
- Wähle in TwinCAT 3 Engineering das Zielsystem über die eingerichtete Route aus.
- Lege ein SPS-Projekt an (Standard PLC Template) und implementiere ein Programm, beispielsweise einen Zähler in MAIN.
- 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):
| Min | Mittelwert | Max |
|---|---|---|
| 46 µs | 900 µs | 5246 µ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.
