Beispiele
Programme für ein Raumportal mit x, y und z. Jedes läuft so in der MotionA-Simulation; die Bilder zeigen den jeweiligen Lauf.
Aufbau eines Programms und Ausführen: Erste Schritte. Alle Funktionen: Python-API. Mit eigenen Werten ausprobieren: Testmodus.
Referenzfahrt und Pendeln
Das Grundprogramm: alle Achsen referenzieren und gemeinsam zwischen Hubanfang und Hubmitte pendeln. Eine Liste von MVParams fährt die Achsen gleichzeitig.
from multiaxes_control_motiona import MVParams
async def program(api, axes):
# Alle Achsen referenzieren (Endschalter am Hubanfang)
for a in axes.values():
await api.do_homing(a.no, sensor_position_sign=-1)
# Gemeinsam zur Hubmitte und zurück
for runde in range(3):
await api.move([MVParams(a.no, a.stroke / 2) for a in axes.values()])
await api.move([MVParams(a.no, 0.0) for a in axes.values()])
print("Runde", runde + 1, "fertig")

Rechteck abfahren
x und y fahren gemeinsam eine Rechteckkontur ab, mit begrenzter Geschwindigkeit. Positionen in Metern, hier relativ zum Hub jeder Achse.
from multiaxes_control_motiona import MVParams
async def program(api, axes):
x, y = axes["x"], axes["y"]
# Alle Achsen referenzieren (Endschalter am Hubanfang)
for a in axes.values():
await api.do_homing(a.no, sensor_position_sign=-1)
# Ecken als Anteil des Hubs: 10 % Abstand zu den Enden
ecken = [(0.1, 0.1), (0.9, 0.1), (0.9, 0.9), (0.1, 0.9), (0.1, 0.1)]
for fx, fy in ecken:
await api.move([
MVParams(x.no, fx * x.stroke, speed_limit=0.3),
MVParams(y.no, fy * y.stroke, speed_limit=0.3),
])
print(f"Ecke {fx:.1f} / {fy:.1f} erreicht")

Pick & Place
Drei Teile umsetzen: anheben, über x und y zur Ablage fahren, langsam absenken. Die z-Achse fährt nach oben, Position 0 ist unten.
from multiaxes_control_motiona import MVParams
async def program(api, axes):
x, y, z = axes["x"], axes["y"], axes["z"]
# Alle Achsen referenzieren (Endschalter am Hubanfang)
for a in axes.values():
await api.do_homing(a.no, sensor_position_sign=-1)
oben, unten = z.stroke, 0.1 * z.stroke
aufnahme = (0.2 * x.stroke, 0.3 * y.stroke)
ablage = (0.8 * x.stroke, 0.7 * y.stroke)
async def fahre(ziel):
await api.move(MVParams(z.no, oben)) # erst anheben
await api.move([MVParams(x.no, ziel[0]), MVParams(y.no, ziel[1])])
await api.move(MVParams(z.no, unten, speed_limit=0.15)) # langsam absenken
for teil in range(3):
await fahre(aufnahme)
print("Teil", teil + 1, "aufgenommen")
await fahre(ablage)
print("Teil", teil + 1, "abgelegt")
await api.move(MVParams(z.no, oben))

Unter der Haube: ActionGraph
Im Echtzeitkern laufen Abläufe als ActionGraph – eine deklarative Sprache für Prozesse. Ein Pick-and-Place-Ablauf, ohne Zustandsautomaten und ohne Speicherverwaltung:
Sequential:
- MOVEMENT: {movable: arm, target: pick_position}
- DIGITAL_SIGNAL_VALUE_SETTER: {signal: gripper, value: 1}
- DELAY: {delay: 100}
- MOVEMENT: {movable: arm, target: place_position}
- DIGITAL_SIGNAL_VALUE_SETTER: {signal: gripper, value: 0}Mehr dazu in den White Papers.