# program

{% columns %}
{% column %}

<figure><img src="/files/Kv9IlC1iF8TlLukQd5u1" alt=""><figcaption></figcaption></figure>
{% endcolumn %}

{% column %}
Im XENAX® können eigene Programme und Programmabläufe direkt erstellt und gespeichert werden. Dadurch lassen sich vollständige Standalone-Anwendungen realisieren, ohne dass eine übergeordnete Steuerung erforderlich ist.

Die Programme können über Hardware-Eingänge, ASCII-Befehle oder per AutoStart ausgelöst werden.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

### PROGRAM

`New` – Erstellen eines neuen Programms

`Number` – Aktuell angezeigtes Programm/Wechsel

`Copy to` – kopiert dieses Programm

`Delete` – löscht das hier gewählte Programm
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

### LINES

Hier werden die einzelnen Programmschritte des aktuellen Programms angezeigt sowie zum Einfügen und Bearbeiten bereitgestellt. Die maximale Anzahl verfügbarer Zeilen hängt vom eingestellten Programm Mapping ab.

`PMAP0` (Standard)

* Programme 1-15: bis zu 50 Zeilen
* Programme 16-63: bis zu 10 Zeilen

`PMAP1`

* Programme 1-5: bis zu 130 Zeilen
* Programme 6-63: bis zu 10 Zeilen
  {% endcolumn %}
  {% endcolumns %}

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

### New Line

Fügt am Ende eine neue Programmzeile ein
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

### Insert Line

Fügt eine Programmzeile an der gewünschten Stelle ein; nachfolgende Zeilen werden nach unten verschoben. Dabei müssen vorhandene Sprungzeilen (z.B. Goto line x) entsprechend angepasst werden.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

### Commands

`Delete` – löscht diese Zeile

`Move up` – verschiebt die Zeile nach oben

`Move dn` – verschiebt die Zeile nach unten
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

### AUTOSTART

Soll ein bestimmtes Programm nach einer definierten Verzögerungszeit von 0–60 s automatisch und ohne externe Aktivierung starten, kann dies über die Autostart-Funktion festgelegt werden.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

### Program Funktionen

{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

#### Motion

{% endcolumn %}
{% endcolumns %}

<table><thead><tr><th>Bemerkung</th><th width="300">Befehl</th><th width="300.0001220703125">Parameter</th><th width="120">Main/Sub</th></tr></thead><tbody><tr><td>Referenzierung</td><td><strong>Reference</strong></td><td>–</td><td>✔</td></tr><tr><td><p>Vorkonfigurierter Fahrsatz ausführen oder verändern. <code>Execute</code>: Index ausführen und nach <code>Continue at</code> nächste Programzeile ausführen (verrundete Fahrten). <code>Set to</code>: Distanz des Index temporär setzen</p><p><code>Add</code>: Distanz des Index temporär vergössern</p><p><code>Subtract</code>: Distanz des Index temporär verkleinern</p><p><code>Take Pos</code>: Distanz des Index temporär auf die aktuelle Position setzen.</p></td><td><strong>Index</strong></td><td><p><code>No</code> – Index Nummer</p><p><code>Continue at</code> – Nächste Zeile nach xx% </p><p><code>Distance</code> – Position verändern</p></td><td>✔</td></tr><tr><td>Profil starten</td><td><strong>Profile</strong></td><td><code>No</code> – Profile Nummer</td><td>✔</td></tr><tr><td>Positionszähler auf 0 setzen. LINAX®/ELAX® nicht möglich, ROTAX® nur wenn nicht referenziert</td><td><strong>Clear position</strong></td><td>–</td><td>–</td></tr><tr><td><p>Forceteq® basic Stromlimitierte fahrt</p><p>Die nächste Programmzeile wird unmittelbar anschließend ausgeführt. Ein <code>Drive i_force</code>-Befehl muss mit <code>Drive i_force end</code> abgeschlossen werden.</p></td><td><strong>Drive i_Force</strong></td><td><code>No</code> – Drive i_force Nummer</td><td>–</td></tr><tr><td><p>Forceteq® pro Kraftlimitierte fahrt</p><p>Die nächste Programmzeile wird unmittelbar anschließend ausgeführt. Ein <code>Drive force</code>-Befehl muss mit <code>Drive force end</code> abgeschlossen werden.</p></td><td><strong>Drive force</strong></td><td><code>No</code> – Drive force Nummer</td><td>–</td></tr><tr><td><p>Forceteq® pro Drehmomentlimitierte fahrt</p><p>Die nächste Programmzeile wird unmittelbar anschließend ausgeführt. Ein <code>Drive torque</code>-Befehl muss mit <code>Drive torque end</code> abgeschlossen werden.</p></td><td><strong>Drive torque</strong></td><td><code>No</code> – Drive torque Nummer</td><td></td></tr><tr><td><p>Drive I_Force beenden</p><p>aktuelle Position = Sollposition,</p><p>Stromlimitierung I_Force inaktiv</p></td><td><strong>Drive i_Force end</strong></td><td>–</td><td>–</td></tr><tr><td><p>Drive Force beenden</p><p>aktuelle Position = Sollposition,</p><p>Kraftlimitierung Force inaktiv</p></td><td><strong>Drive force end</strong></td><td>–</td><td>–</td></tr><tr><td><p>Drive Torque beenden</p><p>aktuelle Position = Sollposition,</p><p>Kraftlimitierung Torque inaktiv</p></td><td><strong>Drive torque end</strong></td><td>–</td><td>–</td></tr><tr><td>Die Achse fährt auf eine mechanisch begrenzte Position. Bitte verwenden Sie stattdessen die Forceteq®-Funktionen.</td><td><strong>Reference limit stop</strong></td><td>–</td><td>✔</td></tr></tbody></table>

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

#### Program Flow

{% endcolumn %}
{% endcolumns %}

<table><thead><tr><th>Bemerkung</th><th width="299.666748046875">Befehl</th><th width="300.0001220703125">Parameter</th><th width="120.000244140625">Main/Sub</th></tr></thead><tbody><tr><td>Sprung auf Program Linie</td><td><strong>Goto line</strong></td><td><code>Line</code> – Program Line Nummer </td><td>–</td></tr><tr><td>Sprung auf Program Linie falls Input aktiv</td><td><strong>Goto line if input</strong></td><td><p><code>Line</code> – Program Line Nummer </p><p><code>Input</code> – HW-Eingang Nummer</p></td><td>–</td></tr><tr><td><p>Wartet, bis Eingang High wird.<br>Erfolgt innerhalb der Zeit <code>Timeout</code> kein High-Signal, wird auf <code>Line</code> gesprungen. </p><p>Timeout = 0 → Timeout-Funktion deaktiviert.<br>Die Timeout-Funktion ist nur lokal verfügbar (nicht remotefähig).</p></td><td><strong>Wait input no high</strong></td><td><p><code>Input</code> – Input Nummer</p><p><code>Timeout</code> – Fehlerbehandlung </p><p><code>Line</code> – Sprungzeile bei Timeout</p></td><td>(✔)</td></tr><tr><td><p>Wartet, bis Eingang Low wird.<br>Erfolgt innerhalb der Zeit <code>Timeout</code> kein Low-Signal, wird auf <code>Line</code> gesprungen. </p><p>Timeout = 0 → Timeout-Funktion deaktiviert.<br>Die Timeout-Funktion ist nur lokal verfügbar (nicht remotefähig).</p></td><td><strong>Wait input no low</strong></td><td><p><code>Input</code>: – Input Nummer</p><p><code>Timeout</code> – Fehlerbehandlung </p><p><code>Line</code> – Sprungzeile bei Timeout</p></td><td>(✔)</td></tr><tr><td><p>Warten auf Prozess Status Register Bit High </p><p>Erfolgt innerhalb der Zeit <code>Timeout</code> kein High-Signal, wird auf <code>Line</code> gesprungen. </p><p>Timeout = 0 → Timeout-Funktion deaktiviert.</p></td><td><strong>Wait process status bit high</strong></td><td><p><code>Bit-No</code> – PSR-Bit Nummer</p><p><code>Timeout</code> – Fehlerbehandlung </p><p><code>Line</code> – Sprungzeile bei Timeout</p></td><td>–</td></tr><tr><td><p>Warten auf Prozess Status Register Bit Low </p><p>Erfolgt innerhalb der Zeit <code>Timeout</code> kein Low-Signal, wird auf <code>Line</code> gesprungen. </p><p>Timeout = 0 → Timeout-Funktion deaktiviert.</p></td><td><strong>Wait process status bit low</strong></td><td><p><code>Bit-No</code> – PSR-Bit Nummer</p><p><code>Timeout</code> – Fehlerbehandlung </p><p><code>Line</code> – Sprungzeile bei Timeout</p></td><td>–</td></tr><tr><td>Initialisiert einen Schleifenzähler</td><td><strong>Set loop counter</strong></td><td><p><code>Counter</code> – Zähler A...E</p><p><code>Loops</code> – Anzahl Loops 0…2 Mrd.</p></td><td>–</td></tr><tr><td><p>Dekrementiert den Schleifenzähler um 1.</p><p>Wenn Wert > 0 → Sprung zu <code>Line</code>, sonst nächste Zeile.</p><p>Mehrere Schleifenzähler sind verschachtelbar.</p></td><td><strong>Dec. loop counter, jump if not zero</strong></td><td><p><code>Counter</code> – Zähler A...E</p><p><code>Line</code> – Program Linien Nummer</p></td><td>–</td></tr><tr><td>Warten auf Linie (10ms Auflösung möglich)</td><td><strong>Wait time</strong></td><td><code>Time [ms]</code> – Wartezeit</td><td>–</td></tr><tr><td>Beendet das Programm sofort. Keine weitere Abarbeitung der folgenden Zeilen.<br>Typischer Einsatz in Fehlerbehandlungsroutinen.</td><td><strong>Program end</strong></td><td>–</td><td>–</td></tr></tbody></table>

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

#### I/O

{% endcolumn %}
{% endcolumns %}

<table><thead><tr><th>Bemerkung</th><th width="298.666748046875">Befehl</th><th width="300">Parameter</th><th width="120">Main/Sub</th></tr></thead><tbody><tr><td>HW-Ausgang setzen</td><td><strong>Set output</strong></td><td><code>No</code> – Output Nummer</td><td>✔</td></tr><tr><td>HW-Ausgang löschen</td><td><strong>Clear output</strong></td><td><code>No</code> – Output Nummer</td><td>✔</td></tr></tbody></table>

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

#### Forceteq®

{% endcolumn %}
{% endcolumns %}

<table><thead><tr><th>Bemerkung</th><th width="298.6666259765625">Befehl</th><th width="299.666748046875">Parameter</th><th width="120">Main/Sub</th></tr></thead><tbody><tr><td>I_Force Calibration ausführen</td><td><strong>I_Force calibration</strong></td><td><p><code>Start pos</code> – Startposition </p><p><code>End pos</code> – Endposition</p></td><td>–</td></tr><tr><td>Tara-Funktion Signateq® Messverstärker. Die angezeigte Kraft am Sensor wird abgenullt.</td><td><strong>Clear force offset</strong></td><td>–</td><td>–</td></tr><tr><td>Tara-Funktion Signateq® Messverstärker. Das angezeigte Moment am Sensor wird abgenullt.</td><td><strong>Clear torque offset</strong></td><td>–</td><td>–</td></tr><tr><td>Automatische I_Force Drift Kompensationsfahrt</td><td><strong>I_Force drift compensation</strong></td><td><code>Direction</code> – Reichtung der fahrt</td><td>–</td></tr><tr><td><p>Wartet auf Erreichen des Limit i_force.</p><p>Wird das Limit nicht innerhalb der Zeit <code>Timeout</code> erreicht, erfolgt ein Sprung auf die angegebene Fehlerzeile <code>Line</code>.<br>Timeout = 0 → Timeout-Funktion deaktiviert.</p></td><td><strong>Wait limit i_force</strong></td><td><p><code>Timeout</code> – Fehlerbehandlung </p><p><code>Line</code> – Sprungzeile bei Timeout</p></td><td>–</td></tr><tr><td>Ändern vom Stomlimit <code>I_Force</code> im ausgeführten <code>drive i_force</code> bis zum <code>Drive i_force end</code>.</td><td><strong>Change limit i_force</strong></td><td><code>Current [A]</code> – Limit i_force</td><td>–</td></tr><tr><td><p>Wartet auf Erreichen des Limit force.</p><p>Wird das Limit nicht innerhalb der Zeit <code>Timeout</code> erreicht, erfolgt ein Sprung auf die angegebene Fehlerzeile <code>Line</code>.<br>Timeout = 0 → Timeout-Funktion deaktiviert.</p></td><td><strong>Wait limit force</strong></td><td><p><code>Timeout</code> – Fehlerbehandlung </p><p><code>Line</code> – Sprungzeile bei Timeout</p></td><td>–</td></tr><tr><td>Ändern vom Kraftlimit <code>Force</code> im ausgeführten <code>drive force</code> bis zum <code>Drive force end</code>.</td><td><strong>Change limit force</strong></td><td><code>Force [N]</code> – Limit force</td><td>–</td></tr><tr><td><p>Wartet auf Erreichen des Limit torque.</p><p>Wird das Limit nicht innerhalb der Zeit <code>Timeout</code> erreicht, erfolgt ein Sprung auf die angegebene Fehlerzeile <code>Line</code>.<br>Timeout = 0 → Timeout-Funktion deaktiviert.</p></td><td><strong>Wait limit torque</strong></td><td><p><code>Timeout</code> – Fehlerbehandlung </p><p><code>Line</code> – Sprungzeile bei Timeout</p></td><td></td></tr><tr><td>Ändern vom Drehmomentlimit <code>Torque</code> im ausgeführten <code>drive torque</code> bis zum <code>Drive torque end</code>.</td><td><strong>Change limit torque</strong></td><td><code>Torque [Nm]</code> – Limit torque</td><td></td></tr><tr><td><p>Aktivieren und deaktivieren der Sektoren mit Bit Maske. 1 = Aktiv / 0 = Inaktiv</p><p>z.B. xx = 1010-> aktiv sind Sektoren 2,4 </p></td><td><strong>Select sectors</strong></td><td><code>Bitmask</code> – 1Bit pro Sektor LSB rechts</td><td>–</td></tr><tr><td><p>Nimmt die aktuelle IST-Position als Offset für alle Sektoren mit Neustart der Überwachung.</p><p>Weiter werden auch die Positionen <code>Wait for distance greater/less</code> und <code>Jump if distance greater/less</code> um diesen Offset geschoben.</p></td><td><strong>Take position as sector offset</strong></td><td>–</td><td>–</td></tr><tr><td><p>Vorgeben des Offsets für alle Sektoren mit Neustart der Überwachung. </p><p>Weiter werden auch die Positionen <code>Wait for distance greater/less</code> und <code>Jump if distance greater/less</code> um diesen Offset xx geschoben.</p><p>z.B. <code>Position</code> = 0, setzt den Offset</p><p>inkl. <code>Take position as sector offset</code> auf 0   </p></td><td><strong>Set sector offset</strong></td><td><code>Position</code> – Offset für Sektoren</td><td>–</td></tr><tr><td>Wartet, bis die Achsposition – bezogen auf den aktuellen Sector Offset – die angegebene Distanz überschreitet.<br>Wird der Wert nicht innerhalb der Zeit <code>Timeout</code> erreicht, erfolgt ein Sprung auf die angegebene Fehlerzeile <code>Line</code>.</td><td><strong>Wait for distance greater</strong></td><td><p><code>Distance</code> – Weg</p><p><code>Timeout</code> – Fehlerbehandlung </p><p><code>Line</code> – Sprungzeile bei Timeout</p></td><td>–</td></tr><tr><td>Wartet, bis die Achsposition – bezogen auf den aktuellen Sector Offset – die angegebene Distanz unterschreitet.<br>Wird der Wert nicht innerhalb der Zeit <code>Timeout</code> erreicht, erfolgt ein Sprung auf die angegebene Fehlerzeile <code>Line</code>.</td><td><strong>Wait for distance less</strong></td><td><p><code>Distance</code> – Weg</p><p><code>Timeout</code> – Fehlerbehandlung </p><p><code>Line</code> – Sprungzeile bei Timeout</p></td><td>–</td></tr><tr><td><p>Sprung auf <code>Line</code> falls <code>Distanz</code></p><p>(Absolutposition – Sector Offset) grösser.</p><p>z.B. zu weit gefahren nach Kraft erreicht </p></td><td><strong>Jump if distance greater</strong></td><td><p><code>Distance</code> – Weg</p><p><code>Line</code> – Sprungzeile bei überschreiten</p></td><td>–</td></tr><tr><td><p>Sprung auf <code>Line</code> falls <code>Distanz</code></p><p>(Absolutposition – Sector Offset) kleiner.</p><p>z.B. zu wenig weit gefahren, nach Kraft erreicht</p></td><td><strong>Jump if distance less</strong></td><td><p><code>Distance</code> – Weg</p><p><code>Line</code> – Sprungzeile bei unterschreiten</p></td><td>–</td></tr><tr><td>Prüft alle aktiven Sektoren auf korrekten Durchlauf.<br>Wird mindestens ein Sektor als fehlerhaft erkannt, erfolgt ein Sprung auf die angegebene Fehlerzeile.<br>Voraussetzung: <code>Drive i_force end</code> muss zuvor ausgeführt worden sein.</td><td><strong>Jump if i_force sector fault</strong></td><td><code>Line</code> – Sprungzeile wenn ein oder mehrere Sektoren nicht korrekt durchlaufen wurden.</td><td>–</td></tr><tr><td>Prüft alle aktiven Sektoren auf korrekten Durchlauf.<br>Wird mindestens ein Sektor als fehlerhaft erkannt, erfolgt ein Sprung auf die angegebene Fehlerzeile.<br>Voraussetzung: <code>Drive force end</code> muss zuvor ausgeführt worden sein.</td><td><strong>Jump if force sector fault</strong></td><td><code>Line</code> – Sprungzeile wenn ein oder mehrere Sektoren nicht korrekt durchlaufen wurden.</td><td>–</td></tr></tbody></table>

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

#### System / Timer

{% endcolumn %}
{% endcolumns %}

<table><thead><tr><th>Bemerkung</th><th width="300.666748046875">Befehl</th><th width="300">Parameter</th><th width="120">Main/Sub</th></tr></thead><tbody><tr><td>Endstufe stromlos</td><td><strong>Power quit</strong></td><td>–</td><td>✔</td></tr><tr><td>Power ON (Endstufe Ein) / Fehler quittieren</td><td><strong>Power continue</strong></td><td>–</td><td>✔</td></tr><tr><td>Start Prozesszeitmessung</td><td><strong>Timer start</strong></td><td>–</td><td>–</td></tr><tr><td><p>Stop Prozesszeitmessung</p><p>ASCII-Befehl <code>TPT</code> (Tell Process Timer) liefert die gemessene Zeit in Millisekunden</p></td><td><strong>Timer stop</strong></td><td>–</td><td>–</td></tr></tbody></table>

{% columns %}
{% column %}

{% endcolumn %}

{% column %}

### Main/Sub

{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}

{% endcolumn %}

{% column %}
In einer Main/Sub-Konfiguration können bis zu vier Achsen zentral durch ein einziges Programm gesteuert werden. Alle Programmfunktionen, die als Main/Sub-fähig gekennzeichnet sind (✔ bei Main/Sub), lassen sich dabei gezielt entweder dem Main-Controller (Local) oder einem der angeschlossenen Subcontroller (`ID1`–`ID3`) zuordnen.

Das eigentliche Programm sowie die zugehörigen Indixes werden ausschließlich auf dem Main-Controller erstellt. Beim Start der Servo-Controller werden diese anschließend über den I²C-Bus an die Sub-Controller übertragen.

Zusätzlich lassen sich verrundete Fahrten mittels der Funktion `Continue at` realisieren. Dabei wird die nächste Programmlinie bereits gestartet, sobald der aktuelle Index zu einem definierten Prozentsatz (z. B. 50 %) abgearbeitet ist. Weitere Details zum Main/Sub-Betrieb sind in unter [Main/Sub - Betrieb](/control_system/de/xenax/xenax-xvi-75v8s/main-sub-betrieb.md) beschrieben.
{% endcolumn %}
{% endcolumns %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://tech.jennyscience.com/control_system/de/industrial-ethernet/copy-of-xenax-r-xvi-75v8s/webmotion-r/operation/program.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
