# Echtzeitsystem

URL: https://irs.systems/docs/resolver-simulation/real-time-system

Die Software des Echtzeitsystems steuert das Gerät entsprechend den Werten, die sie über die Netzwerkschnittstelle (Shared Network Variables) erhält.

Hinweis: Das FPGA kann auch ohne das Echtzeitsystem angesteuert werden. Der Anwender kann eine eigene Anwendung entwickeln.

## Netzwerkschnittstelle (Shared Network Variables)

Zur Steuerung der Simulation kommuniziert das Echtzeitsystem mit der Host-Anwendung über eine Technik namens „Shared Network Variables“. Dabei handelt es sich um Variablencontainer, auf die über eine spezielle Netzwerkadresse zugegriffen werden kann. Die Container befinden sich in den RT-Ordnern („RT_ResSi“ oder „RT_RVDT“):

- **ResSi_Variables.lvlib / RVDT_Variables.lvlib:** Enthält nicht kanalbezogene Variablen wie die FPGA-Version
- **ResSi_Variables_x.lvlib / RVDT_Variables_x.lvlib:** Enthält kanalbezogene Variablen, wobei x die Kanalnummer darstellt (jeder Kanal hat eine eigene Datei).

### Zugriff auf eine Variable vom Host-Computer

Um von einem entfernten System auf eine Variable zuzugreifen, kann der Entwickler das VI „RT_PC_ResSi_NetVarPathGen.vi“ (bzw. „RT_PC_RVDT_NetVarPathGen.vi“) in „RT_ResSi/Share“ (bzw. „RT_RVDT/Share“) zusammen mit einem „Read Variable“- oder „Write Variable“-Element verwenden.

PC-Beispiel zum Lesen des aktuellen Winkels und zum Schreiben eines neuen Winkels im RVDT-Simulatormodus:

<figure>
  <img src="/docs/assets/resolver-simulation/images/ressi-netvar-read.png" alt="LabVIEW-Beispiel zum Lesen der Netzwerkvariable Angle_Actual">
  <figcaption>Abbildung 19: Beispiel zum Lesen einer Netzwerkvariable (PC)</figcaption>
</figure>

<figure>
  <img src="/docs/assets/resolver-simulation/images/ressi-netvar-write.png" alt="LabVIEW-Beispiel zum Schreiben der Netzwerkvariable Angle">
  <figcaption>Abbildung 20: Beispiel zum Schreiben einer Netzwerkvariable (PC)</figcaption>
</figure>

- TargetIP: IP-Adresse oder Hostname des RIO
- Angle_Actual / Angle: Name der gewünschten Variable in „RVDT_Variables_x.lvlib“
- ChannelNb: Kanalnummer -> x (bei x = 255 erfolgt der Zugriff auf „RVDT_Variables.lvlib“)

### Neuen Kanal hinzufügen

Beispiel für RVDT-Kanal 1:

1. Fügen Sie, falls noch nicht geschehen, den neuen Kanal zum FPGA-Code hinzu (siehe [FPGA – Neuen Kanal hinzufügen](/docs/resolver-simulation/labview-project-and-fpga#neuen-kanal-hinzufuegen))
2. Erstellen Sie eine Kopie von „ResSi_Variables_0.lvlib“ und benennen Sie sie in „ResSi_Variables_1.lvlib“ um (dieser Schritt ist im Project Explorer nicht möglich; verwenden Sie stattdessen den Windows Explorer)
3. Aktualisieren Sie die FPGA-Referenz
   - Öffnen Sie „RT_RVDT/RT_RVDT_Thread.vi“
   - Klicken Sie mit der rechten Maustaste auf „RefnumIn“ und wählen Sie „Open Type Def.“
   - Klicken Sie mit der rechten Maustaste auf „Reference“ und wählen Sie „Configure FPGA VI Reference…“
   - Klicken Sie auf „Import from bitfile…“, navigieren Sie zur benötigten Bitdatei in „FPGA Bitfiles“ und öffnen Sie sie
   - Speichern Sie alles
4. Aktualisieren Sie die Build-Spezifikation und führen Sie den Build erneut aus
   - Rechtsklick auf „RIO-System/Build_Specification/RT_RVDT“ -> Properties
   - Wählen Sie auf der rechten Seite „Source Files“ aus
   - Navigieren Sie zu „RT_RVDT/RVDT_Variables_1.lvlib“ und fügen Sie die Datei dem Abschnitt „Always Included“ hinzu
   - Führen Sie den Build erneut aus und flashen Sie das Ergebnis („Run as startup“)

## Resolver-Simulation (RT_ResSi)

Im Handbuch V3.0 nicht beschrieben. Siehe [Software für den Resolver-Modus](/docs/resolver-simulation/resolver-mode-software) (aus Handbuch V2.2).

## RVDT-Simulation (RT_RVDT)

Dieser Abschnitt beschreibt das Echtzeitsystem für den RVDT-Simulationsmodus.

### Steuerschnittstelle (RVDT_Variables)

Wie im Abschnitt [Netzwerkschnittstelle](/docs/resolver-simulation/real-time-system#netzwerkschnittstelle-shared-network-variables) beschrieben, wird die RVDT-Simulation über Network Shared Variables gesteuert. Die folgende Tabelle beschreibt sie:

| Variable | Typ | Zugriff | Beschreibung | Einheit |
| --- | --- | --- | --- | --- |
| FPGA_Version (allgemein) | UInt32 | r | HEX-codiertes Kompilierungsdatum des FPGA: Format: 0xYYYYMMDD | |
| Angle | Double | r/w | Simulationswinkel in Grad | ° |
| Angle_Actual | Double | r | Aktueller Simulationswinkel in Grad | ° |
| Angle_DegreePerSec | Double | r/w | Bewegungsgeschwindigkeit zur neuen Winkelposition | °/s |
| Angle_Max | Double | r/w | Maximaler Winkelausschlag (Absolutwert): Winkel, bei dem das Differenzausgangssignal seine maximale Amplitude erreicht, die durch „LUT_Amplitude“ und PGA festgelegt ist. | ° |
| LUT_Amplitude | Double | r/w | Maximale Amplitude des Differenzausgangssignals relativ zur Amplitude des Erregersignals, multipliziert mit PGA (siehe „LUT_Write“). | % |
| LUT_Calibration | CTL[1] | r/w | Kalibriereinstellungen (siehe „LUT_Write“) | |
| LUT_Write | Boolean | r/w | Setzen, um die Lookup-Tabellen mit neuen Daten zu aktualisieren, die aus den Werten in „LUT_Amplitude“ und „LUT_Calibration“ berechnet werden. True: Aktualisierung starten (vom Anwender gesetzt). False: Aktualisierung abgeschlossen (vom RT gesetzt) | |
| PGA | UInt8 | r/w | PGA-Einstellung (Bereich: 0…7): `Û_OUT = 0.078125 * 2^PGA * Û_LUT` | |
| SaveConfig | Boolean | r/w | Setzen, um die aktuelle Konfiguration und Winkeleinstellung dauerhaft im Flash-Speicher des Echtzeitsystems zu speichern (sie wird bei jedem Start geladen). True: Speichervorgang starten (vom Anwender gesetzt). False: Speichervorgang abgeschlossen (vom RT gesetzt) | |

**CTL[1] -> RT_PC_RVDT_LUT_Calibration.ctl**

| Variable | Typ | Beschreibung | Einheit |
| --- | --- | --- | --- |
| SineAmplitude_%, CosineAmplitude_% | Double | Amplituden-Korrekturfaktoren für die Lookup-Tabelle (siehe „LUT_Amplitude“): `Amplitude_LUT = "LUT_Amplitude" * x` | % |
| SineDCOffset_%, CosineDCOffset_% | Double | Amplitude der DC-Offset-Korrektur der LUT relativ zur Amplitude des Erregersignals, multipliziert mit PGA: `Amplitude_LUT = "LUT_Amplitude" + x` | % |

### RT_RVDT_Top.vi

Top-VI des Echtzeitsystems im RVDT-Simulationsmodus.

<figure>
  <img src="/docs/assets/resolver-simulation/images/ressi-rt-rvdt-top-flow.png" alt="Ablaufdiagramm von RT_RVDT_Top.vi: FPGA öffnen, ein RT_RVDT_Thread.vi pro Kanal, Status-LED und Firmwareversion">
  <figcaption>Abbildung 21: RT&#95;RVDT&#95;Top.vi – Ablaufdiagramm</figcaption>
</figure>

### RT_RVDT_Thread.vi

Dieses VI ist für die Ansteuerung des FPGA zuständig. Es wird vom Top-VI zyklisch (100 ms) für jeden verfügbaren Kanal des FPGA aufgerufen (parallel als Multithread).

![Anschlussfeld von RT_RVDT_Thread.vi](/docs/assets/resolver-simulation/images/ressi-rt-rvdt-thread.png)

- LUT_Size-1: Letzter Index der Lookup-Tabellen (aus dem FPGA lesen)
- ChannelNb: Kanalnummer
- ResSi_Values: Mit dem Element des FPGA-Arrays „ResSi_Values“ an dem durch „ChannelNb“ festgelegten Index verbinden
- ResSi_Settings: Mit dem Element des FPGA-Arrays „ResSi_Settings“ an dem durch „ChannelNb“ festgelegten Index verbinden

### RT_RVDT_SaveCfg.vi & RT_RVDT_LoadCfg.vi

Diese VIs dienen zum Speichern der aktuellen Konfiguration im Flash-Speicher und zum erneuten Laden.

### RT_PC_RVDT_LUT_ValueWrite.vi

Mit diesem VI werden die Aktualisierungsdaten für die Lookup-Tabellen erzeugt. Es übernimmt die Amplitude (LUT_Amplitude) und die Kalibriereinstellungen (LUT_Calibration) als Eingangsparameter und erzeugt die Lookup-Tabellen-Daten für beide Tabellen. Das folgende Diagramm zeigt Beispieldaten (LUT-Größe = 1024; max. Winkel = ±30°; LUT_Amplitude = 100 %):

<figure>
  <img src="/docs/assets/resolver-simulation/images/ressi-rvdt-lut-diagram.png" alt="Beispieldaten der Sinus- und Kosinus-LUT über Position 0 bis 1023 und Winkel -30 bis +30 Grad">
  <figcaption>Abbildung 22: Diagramm der RVDT-LUT-Beispieldaten</figcaption>
</figure>
