# Fullmo MovingCap CODE - micropython example. # original file name: mcdrive.pyi """mcdrive Modul-Stub/Schnittstelle für fullmo MovingCap Servoantriebe / CODE / Micropython Das mcdrive Python-Modul/-Bibliothek ermöglicht den Zugriff auf die MovingCap Servoantriebsfunktionen und das CiA402 Objektverzeichnis. * WriteObject und ReadObject bieten allgemeinen Zugriff auf alle verfügbaren Objekte des MovingCap Antriebsverzeichnisses. Wenn Sie mit CiA 402 / CANopen / CoE EtherCAT Standardobjekten und den herstellerspezifischen Objekten aus dem MovingCap Benutzerhandbuch vertraut sind, ist dies alles, was Sie zum Schreiben einer vollständigen Antriebsmaster-Anwendung benötigen. * Zusätzliche Funktionen werden als Abkürzung und schnellerer Weg zum Schreiben Ihrer Anwendungen bereitgestellt. Diese führen im Wesentlichen mehrere Schreib-/Leseoperationen auf den CiA 402 Objekten aus, um das gleiche Ergebnis zu erzielen. Bitte beachten Sie unsere Beispiele, um zu sehen, wie Sie Ihren Motor mit nur wenigen Zeilen Code in Bewegung setzen. """ __author__ = "Oliver Heggelbacher" __email__ = "oliver.heggelbacher@fullmo.de" __version__ = "50.00.10.xx" __date__ = "2025-11-04" def WriteObject(index : int, subindex : int, value : int) -> int: """CANopen Objektwert schreiben (nur numerisch) :param index: CANopen Index [unsigned16], z.B. 0x607A für "Sollposition" :type index: int :param subindex: CANopen Subindex [unsigned8], z.B. 0 :type subindex: int :param value: Neuer Wert für dieses Objekt [integer32] :type value: int :return: 0 bei Erfolg, oder der interne Fehlercode vom CANopen-Stack. Sie können diesen Wert normalerweise ignorieren. Prüfen Sie ihn nur, wenn Sie nicht sicher sind, ob der Index/Subindex ein gültiges Objekt für Schreibzugriff ist. :rtype: int """ ret = 0 return ret def ReadObject(index : int, subindex : int) -> int: """CANopen Objektwert lesen (nur numerisch) :param index: CANopen Index [unsigned16], z.B. 0x6064 für "Istposition" :type index: int :param subindex: CANopen Subindex [unsigned8], z.B. 0 :type subindex: int :return: Aktueller Objektwert [integer32]. Wenn das Objekt kein gültiges Objekt für Lesezugriff ist, wird ein interner CANopen-Stack-Fehlercode zurückgegeben. Der Rückgabewert ist immer integer32, auch wenn der Objektverzeichniseintrag einen anderen CANopen-Datentyp hat. :rtype: int """ value = 0 return value def WriteControl(control : int): """CiA 402 Steuerwort schreiben (CANopen Objekt 6040h.0h) :param control: Neuer Wert [unsigned16] :type control: int """ pass def EnableDrive(): """Vorbereitung für den Betrieb. Diese Funktion durchläuft die erforderlichen Zustände der CiA 402 Zustandsmaschine, bis "Betrieb freigeschaltet" erreicht wird. Dies entspricht der Prüfung des Antriebsstatusworts über `ReadStatusword` und der Kommandierung der erforderlichen Zustandsänderungen über `WriteControl`. Die Sequenz ist: * Falls Antrieb im Fehlerzustand: WriteControl(0x80) Fehler zurücksetzen -> neuer Zustand "Ausschaltbereit" * WriteControl(0x6) Herunterfahren -> neuer Zustand "Einschaltbereit" * WriteControl(0x7) Einschalten -> neuer Zustand "Eingeschaltet" * WriteControl(0xf) Betrieb freischalten -> neuer Zustand "Betrieb freigeschaltet" Es werden nur die erforderlichen Übergänge durchgeführt. Wenn der Antrieb bereits im Zustand "Betrieb freigeschaltet" ist (ReadStatusword ist 0x27), kehrt die Funktion sofort zurück. Siehe auch `PowerQuit` :return: 1 wenn Wechsel zu "Betrieb freigeschaltet" erfolgreich. 0 bei Fehlschlag. :rtype: int """ value = 0 return value def StopMotion(): """Wechselt in den 'Quick Stop'-Zustand, nachdem Parameter 605Ah.0h Quick Stop-Optionscode = 6 gesetzt wurde: "Verzögern auf Quick Stop-Rampe und im Quick Stop aktiv bleiben". Verwendet Objekt 6085h.0h Quick Stop-Verzögerungswert. Siehe auch `ContinueMotion` um den Betrieb nach einem Quick Stop fortzusetzen. """ pass def ContinueMotion(): """Bewegung fortsetzen. Diese Funktion setzt die Bewegung nach dem Eintreten eines Quick Stop-Zustands fort (z.B. durch `StopMotion`). """ pass def PowerQuit(): """Setzt Betriebsart auf Null zurück (siehe `SetOpMode`), wechselt dann die CiA 402 Zustandsmaschine zu "Ausschaltbereit". Dies schaltet den Antrieb sicher herunter und behält die Verbindung bei. Siehe auch `EnableDrive` """ pass def StorePermanent(): """Aktuelle Parametereinstellungen im nichtflüchtigen Speicher speichern. Speichert die aktuelle Antriebskonfiguration (Parameter) im EEPROM/Flash, damit sie nach einem Neustart erhalten bleiben. Dies umfasst Bewegungsparameter, E/A-Einstellungen und andere Konfigurationswerte, die von den Standardwerten geändert wurden. Hinweis: Übermäßige Verwendung dieser Funktion kann den nichtflüchtigen Speicher abnutzen. Nur bei Bedarf aufrufen, um Konfigurationsänderungen zu speichern. Hinweis: Obwohl es möglich ist, StorePermanent() während einer Bewegung aufzurufen, können Sie leichte Ruckler/Stottern bei Hochgeschwindigkeits-Bahnbewegungen erleben, da der EEPROM-Zugriff andere Aufgaben für kurze Zeit einfrieren muss. """ pass def GoPosAbs(targetPos : int): """Neue Bewegung zu einer absoluten Position starten. * Falls erforderlich, auf Betriebsart 1 wechseln - Profilpositioniermodus (SetOpMode(1)) * Neues Ziel setzen (siehe `SetTargetPos`) * Positionierung im CiA 402 "Einzelsollwert"-Modus starten: Die neue Sollposition wird sofort verarbeitet. Die Positionierungsregelung verwendet "6083h.0h Profilbeschleunigung" (`SetAcc`) und "6084h.0h Profilverzögerung" (`SetDec`) für die Bewegung. Verwenden Sie `ChkReady` und `ChkError`, um auf das Ende der Positionierung zu warten und Fehler während der Ausführung zu erkennen. Siehe auch 'GoPosRel' :param targetPos: Neue absolute Sollposition [integer32] :type targetPos: int """ pass def GoPosRel(relativePos : int): """Neue Bewegung zu relativer Position starten. Wie `GoPosAbs`, jedoch mit Angabe einer relativen Position. Standardmäßig bedeutet "relativ" "relativ zur vorhergehenden verwendeten Sollposition", aber Objekt "60F2h.0h Positionierungsoptionscode" kann eine andere Bedeutung festlegen, z.B. "relativ zur aktuellen Istposition". :param relativePos: Neue relative Sollposition [integer32] :type relativePos: int """ pass def GoVel(targetVelocity : int): """Konstantgeschwindigkeitsbetrieb starten. * Falls erforderlich, auf Betriebsart 3 wechseln - Profilgeschwindigkeitsmodus (SetOpMode(3)) * Neue Sollgeschwindigkeit setzen Geschwindigkeitsänderungen werden mit Objekt "6083h.0h Profilbeschleunigung" (siehe `SetAcc`) angewendet. Bei Richtungsänderung (z.B. von positiver zu negativer Geschwindigkeit) wird Objekt "6085h.0h Quick Stop-Verzögerung" verwendet, bis die Geschwindigkeit Null ist, dann wird 6083h.0h angewendet, um in entgegengesetzter Richtung zu beschleunigen. Der Verzögerungsparameter hat keinen Einfluss. :param targetVelocity: Neue Sollgeschwindigkeit [integer32] :type targetVelocity: int """ pass def SetTargetPos(targetPos : int): """Abkürzung zum Schreiben von Objekt "607Ah.0h Sollposition" :param targetPos: Neue Sollposition [integer32] :type targetPos: int """ pass def SetPosVel(profileVelocity : int): """Abkürzung zum Schreiben von Objekt "6081h.0h Profilgeschwindigkeit" :param profileVelocity: Neue Profilgeschwindigkeit [unsigned32] :type profileVelocity: int """ pass def SetAcc(profileAcceleration : int): """Abkürzung zum Schreiben von Objekt "6083h.0h Profilbeschleunigung" :param profileAcceleration: Neue Profilbeschleunigung [unsigned32] :type profileAcceleration: int """ pass def SetDec(profileDeceleration : int): """Abkürzung zum Schreiben von Objekt "6084h.0h Profilverzögerung" :param profileDeceleration: Neue Profilverzögerung [unsigned32] :type profileDeceleration: int """ pass def GoHome(method : int, velocity : int, acceleration : int, offset : int): """CiA 402 Referenzier-/Homing-Lauf starten * Auf Betriebsart 6 wechseln - Profilgeschwindigkeitsmodus (SetOpMode(3)) * Objekte 6098h.0h Referenziermethode, 6099h.1h Referenziergeschwindigkeit, 609Ah.0h Referenzierbeschleunigung und 607Ch.0h Referenzieroffset setzen * Bewegung starten Gängige `method`-Werte für MovingCap sind: * 37 oder 35 = Nicht bewegen. Aktuelle Istposition als neue Nullposition setzen. * -18 = Block-Referenzlauf in positive Richtung * -19 = Block-Referenzlauf in negative Richtung Verwenden Sie `ChkReady` und `ChkError`, um auf das Ende des Homing-Laufs zu warten und Fehler während der Ausführung zu erkennen. :param method: CiA 402 Referenziermethode [unsigned8] :type method: int :param velocity: Referenziergeschwindigkeit [unsigned32] :type velocity: int :param acceleration: Referenzierbeschleunigung [unsigned32] :type acceleration: int :param offset: Referenzier-Offsetposition [integer32]. Nach erfolgreichem Referenziervorgang wird dieser Positionswert zur neuen Istposition. :type offset: int """ pass def SetOpMode(opMode: int): """Abkürzung zum Schreiben von Objekt "6060h.0h Betriebsarten" :param opMode: Neue Betriebsart [unsigned8]: 0 - keine Betriebsart. 1 - Profilpositioniermodus. 3 - Profilgeschwindigkeitsmodus. 6 - Referenziermodus. :type opMode: int """ pass def GetOpMode() -> int: """Abkürzung zum Lesen von Objekt "6060h.0h Betriebsarten" :return: Betriebsart [unsigned8], siehe `SetOpMode` :rtype: int """ opMode = 0 return opMode def SetTorque(torque : int): """Abkürzung zum Schreiben von Objekt "6073h.0h Maximalstrom" :param torque: Neuer Maximalstromwert [unsigned16], der in direktem Verhältnis zum maximalen Drehmoment während des Betriebs steht. Werteinheit ist 0,1%, d.h. torque = 100 bedeutet "10% Drehmoment" und torque = 1000 bedeutet "100% Drehmoment" (Standard). :type torque: int """ pass def ChkIn(inNo : int) -> int: """Digitaleingang prüfen :param inNo: Eingangsnr. von 1..10 (abhängig vom MovingCap-Modell) :type inNo: int :return: 0 wenn niedrig. 1 wenn hoch (aktiv) :rtype: int """ pass def SetOut(outNo : int): """Digitalausgang setzen/aktivieren :param outNo: Ausgangsnr. von 1..4 (abhängig vom MovingCap-Modell) :type outNo: int """ pass def ClearOut(outNo : int): """Digitalausgang zurücksetzen/deaktivieren :param outNo: Ausgangsnr. von 1..4 (abhängig vom MovingCap-Modell) :type outNo: int """ pass def GetActualPos() -> int: """Abkürzung zum Lesen von Objekt "6064h.0h Istposition" :return: Istposition [integer32] :rtype: int """ actualPos = 0 return actualPos def ReadStatusword() -> int: """Abkürzung zum Lesen von Objekt "6041h.0h Statuswort" :return: CiA 402 Statuswortwert [unsigned16] :rtype: int """ statusWord = 0 return statusWord def ChkReady() -> int: """Prüfen, ob der Antrieb die aktuelle Bewegung abgeschlossen hat (Statuswort "Ziel erreicht"-Bit ist gesetzt), oder ein Fehler aufgetreten ist ("Fehler"-Bit ist gesetzt). Verwenden Sie dies nach einem neuen `GoPosAbs`, `GoPosRel` oder `GoHome` Aufruf. :return: 1 wenn bereit. 0 wenn (noch) nicht bereit. :rtype: int """ isReady = 0 return isReady def ChkEnabled() -> int: """Prüfen, ob der Antrieb im Zustand "Betrieb freigeschaltet" ist. Dies prüft das CiA 402 Statuswort, um festzustellen, ob der Antrieb für Bewegungsbefehle bereit ist. Gibt den gleichen Wert zurück wie `ChkReady` - prüft sowohl Ziel erreicht als auch freigeschalteten Zustand. :return: 1 wenn freigeschaltet und bereit. 0 wenn nicht freigeschaltet oder nicht bereit. :rtype: int """ isEnabled = 0 return isEnabled def ChkMoving() -> int: """Prüfen, ob der Antrieb gerade eine Bewegung ausführt. Dies überwacht den Antriebsstatus, um festzustellen, ob eine Bewegung läuft. Nützlich zum Erkennen, ob sich der Antrieb aktiv bewegt oder stillsteht. :return: 1 wenn in Bewegung. 0 wenn stillstehend. :rtype: int """ isMoving = 0 return isMoving def ChkError() -> int: """Prüfen, ob das Statuswort "Fehler"-Bit gesetzt ist. :return: 1 bei Fehler. 0 bei keinem Fehler. :rtype: int """ isError = 0 return isError def ChkMfrStatus(bitIndex : int) -> int: """Spezifisches Bit aus Objekt 1002h.0h Herstellerstatusregister prüfen. MovingCap Ethernet Fehlerbits verfügbar: 0 Fehler Überspannung (Uzk) 1 Fehler Unterspannung (Uzk) 2 Fehler Ack 3 Fehler Übertemperatur 4 Fehler I2T / Derating 5 Verbindung abgebrochen 6 Fehler Hub 7 Fehler Kommunikation 8 Fehler Sensor 9 Fehler Hardware-Freigabe 11 Fehler Überstrom 12 Fehler externe Kraft / Drehmoment :param bitIndex: Bitnummer von 0..15 :type bitIndex: int :return: 1 bei Fehler. 0 bei keinem Fehler. :rtype: int """ isError = 0 return isError def SendEmcyMsg(errorNumber: int, errorRegister: int = 0, errorCode: int = 0x509b) -> None: """Emergency (EMCY) Nachricht senden. Diese Funktion sendet eine CANopen Emergency (EMCY) Nachricht mit benutzerdefinierten Fehlerinformationen. EMCY-Nachrichten werden verwendet, um Fehlerbedingungen an den Netzwerk-Master oder Überwachungssysteme zu signalisieren. Die Funktion unterstützt zwei Aufrufkonventionen für Rückwärtskompatibilität: - Vollform: SendEmcyMsg(errorNumber, errorRegister, errorCode) - Kurzform: SendEmcyMsg(errorNumber) - verwendet Standard errorRegister=0x00 und errorCode=0x509b :param errorNumber: Herstellerspezifische Fehlernummer [unsigned32]. Dies ist typischerweise ein benutzerdefinierter Fehlercode der Anwendung. :type errorNumber: int :param errorRegister: CANopen Fehlerregisterwert [unsigned8], Standard 0x00. Bitcodiertes Register gemäß CANopen-Spez. (allgemeiner Fehler, Strom, Spannung, Temperatur, etc.) :type errorRegister: int :param errorCode: CANopen Emergency-Fehlercode [unsigned16], Standard 0x509b. Standard- oder herstellerspezifischer Fehlercode gemäß CANopen-Spezifikation. :type errorCode: int Beispiel: SendEmcyMsg(0x12345678) # Einfache Form SendEmcyMsg(0x12345678, 0x01, 0x5000) # Vollform mit allen Parametern """ pass