Zum Inhalt springen
MotionAby Dübon Engineering

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")
Referenzfahrt und Pendeln in der MotionA-Simulation
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")
Rechteck abfahren in der MotionA-Simulation
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))
Pick & Place in der MotionA-Simulation

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.