Die Werkzeugdaten werden üblicherweise durch eine Werkzeugtabellendatei beschrieben, die durch eine INI-Datei-Einstellung angegeben wird: [EMCIO]TOOL_TABLE=tooltable_filename. Eine Werkzeugtabellendatei besteht aus einer Textzeile für jedes verfügbare Werkzeug, welche die Parameter des Werkzeugs beschreibt, siehe Werkezugtabellen-Format.

Die Werkzeugdatenbankschnittstelle bietet eine alternative Methode zur Beschaffung von Werkzeugdaten über ein separates Programm, das eine Datenbank mit Werkzeugen verwaltet.

1. Schnittstelle

1.1. INI-Datei Einstellungen

Die Einstellungen in der INI-Datei ermöglichen den (optionalen) Betrieb eines vom Benutzer bereitgestellten Werkzeugdatenbankprogramms:

[EMCIO]
DB_PROGRAM = db_program [args]

Wenn es enthalten ist, gibt db_program den Pfad zu einem vom Benutzer bereitgestellten ausführbaren Programm an, das tooldata bereitstellt. Es können bis zu 10 durch Leerzeichen getrennte Args angegeben werden, die beim Start an db_program übergeben werden.

Anmerkung
INI-Datei-Einstellungen für [EMCIO]TOOL_TABLE werden ignoriert, wenn ein db_program angegeben ist.
Anmerkung
Das db_program kann in jeder Sprache implementiert werden, die derzeit von LinuxCNC unterstützt wird (z. B. Bash-Skripte, Python oder Tcl-Skripte, C/C++-Programme), solange es mit den Schnittstellenmeldungen übereinstimmt, die auf stdin empfangen und auf stdout zurückgegeben werden. Ein db_program kann Daten aus einer flachen Datei, einer relationalen Datenbank (z.B. SQLite) oder anderen Datenquellen verwalten.

1.2. db_program-Operation (v2.1)

Wenn ein db_progam angegeben ist, wird wie folgt vorgegangen:

  1. Beim Starten startet LinuxCNC das db_program und verbindet sich mit dessen stdin und stdout.

  2. Das db_program muss mit einer einzeiligen Bestätigung antworten, die aus einem Versionsstring besteht (z.B. "v2.1"). Wenn die Version nicht mit der Version der LinuxCNC-Datenbankschnittstelle kompatibel ist, sind keine Werkzeuge verfügbar.

  3. Nach einer erfolgreichen Bestätigung, gibt LinuxCNC einen g (get) Befehl aus, um alle Werkzeuge anzufordern. Das db_program muss mit einer Folge von Antworten antworten, um jedes verfügbare Werkzeug zu identifizieren. Das Textformat der Antworten ist identisch mit dem Format der Textzeilen, die in konventionellen Werkzeugtabellen verwendet werden. Eine abschließende Antwort von "FINI" beendet die Antwort.

  4. Das db_program tritt dann in eine Ereignis-Warteschleife ein, um Befehle zu empfangen, die anzeigen, dass Werkzeugdaten von LinuxCNC geändert wurden. Werkzeugdaten Änderungen umfassen:

    • a) Laden der Spindel(Tn M6)/Entladen(T0 M6)

    • b) Änderung der Werkzeugparameter (z. B. G10L1Pn)

    • c) Werkzeugauswechslungen (M61Qn).

Wenn eine Werkzeugdatenänderung auftritt, sendet LinuxCNC einen Befehl an das db_program, bestehend aus einem identifizierenden Befehlsbuchstaben, gefolgt von einer vollständigen oder abgekürzten Werkzeugdatenzeile. Das db_program muss mit einer Antwort antworten, um den Empfang zu bestätigen. Enthält die Antwort den Text "NAK", wird eine Meldung auf stdout ausgegeben, aber die Ausführung wird fortgesetzt. Die "NAK"-Meldung bedeutet einen Mangel an Synchronisation zwischen dem db_program und LinuxCNC — der begleitende Text sollte einen Hinweis auf die Ursache des Fehlers geben.

Die Befehle für die Änderung von Werkzeugdaten lauten:

  • "p" setzt Datenänderungen, die durch G10L1, G10L10, G10L11 G-Codes verursacht werden. Die Werkzeugdatenzeile enthält alle Elemente einer Textzeile der Werkzeugtabelle.

  • "l'' spindle_load (TnM6). Die Werkzeugdatenzeile enthält nur die T und P Elemente, welche die jeweilige Werkzeug- und Platznummer angeben.

  • "u" spindle_unload (T0M6). Die Werkzeugdatenzeile enthält nur die "T" und "P" Elemente zur Identifizierung der entsprechenden Werkzeug- und Platznummer.

Anmerkung
Wenn ein NON_RANDOM-Werkzeugwechsler mit [EMCIO]RANDOM_TOOL_CHANGER=0 (Standardeinstellung) angegeben wird, lautet der Befehl spindle_load für TnM6 (oder M61Qn): l Tn P0 (Platz 0 ist die Spindel). Der Befehl spindle_unload für T0M6 lautet: u T0 P0.
Anmerkung
Wenn ein RANDOM-Werkzeugwechsler mit [EMCIO]RANDOM_TOOL_CHANGER=1 angegeben wird, so wird bei jedem Werkzeugwechsel ein Paar von „spindle_unload/spindle_load“-Befehlen ausgegeben. Das für TnM6 (oder M61Qn) ausgegebene Befehlspaar lautet u Tu Pm gefolgt von l Tn P0, wobei u das aktuelle Werkzeug ist, das an die Tasche m gesendet werden soll, und n das neue Werkzeug ist, das in die Spindel geladen werden soll (Tasche ' 0'). Konventionell wird eine Werkzeugnummer von 0 verwendet, um ein leeres Werkzeug anzugeben,

1.3. Anwendung

Die Verwendung eines db_program ändert nicht die Art und Weise, wie LinuxCNC arbeitet, sondern bietet Unterstützung für neue Datenbankfunktionen für die Werkzeugverwaltung.

Beispielsweise kann eine db_program-Datenbankanwendung die Betriebsstunden für alle Werkzeuge verwalten, indem sie jedes Laden/Entladen eines Werkzeugs verfolgt. Eine Maschine könnte dann drei 6 mm Schaftfräser in den Plätzen 111, 112 und 113 haben, wobei die Datenbankanwendung so programmiert ist, dass sie die Werkzeugnummer 110 dem 6 mm Schaftfräser mit den wenigsten Betriebsstunden zuweist. Dann, wenn ein LinuxCNC-Programm fordert Werkzeug 110, die Datenbank würde die entsprechende Tasche auf der Grundlage der Werkzeugnutzung Geschichte.

Werkzeugdatenänderungen, die in LinuxCNC vorgenommen werden (p, u, l Befehle), werden sofort an die db_program übertragen, von der erwartet wird, dass sie ihre Quelldaten synchronisiert. Standardmäßig werden LinuxCNC-Anforderungen für Werkzeugdaten (g-Befehle) nur beim Start gestellt. Ein Datenbankprogramm kann Werkzeugverwendungsdaten kontinuierlich aktualisieren, so dass langlebige LinuxCNC-Anwendungen von der Aktualisierung der Werkzeugdaten profitieren können, die von der db_program bereitgestellt werden. Der G-Code-Befehl G10L0 kann verwendet werden, um ein Neuladen von Werkzeugdaten (g-Befehl) aus G-Code-Programmen oder per MDI anzufordern. Ein Neuladevorgang wird in der Regel auch von einer grafischen Benutzeroberfläche (GUI) bereitgestellt, sodass bedarfsgesteuerte Neuladevorgänge angefordert werden können. Eine Python-GUI-Anwendung kann beispielsweise Folgendes verwenden:

#!/usr/bin/env python3
from  linuxcnc import command
command().load_tool_table()

Alternativ kann ein db_program seine lokalen Datenänderungen an LinuxCNC weitergeben, indem es den Schnittstellenbefehl load_tool_table() verwendet. Befehle, die Änderungen an LinuxCNC übertragen, können zurückgewiesen werden, wenn der Interpreter läuft. Der Zustand des Interpreters kann vor der Ausgabe eines load_tool_table()-Befehls überprüft werden. Beispiel:

#! /usr/bin/env python3
import linuxcnc
s = linuxcnc.stat()
s.poll()
if s.interp_state == linuxcnc.INTERP_IDLE:
    linuxcnc.command().load_tool_table()
else: # defer loading until interp is idle
   ...

Wenn die Datenbankanwendung Tools nach der Initialisierung hinzufügt oder entfernt, muss ein Aufruf an tooldb_tools() mit einer aktualisierten user_tools-Liste ausgegeben werden. Die aktualisierte Werkzeugliste wird bei nachfolgenden get-Befehlen oder load_tool_table()-Anforderungen verwendet.

Anmerkung
Das Entfernen einer Werkzeugnummer sollte nur dann erfolgen, wenn die Werkzeugnummer derzeit nicht in der Spindel geladen ist.

1.3.1. Debug-Umgebungsvariablen

Das Exportieren der Umgebungsvariablen DB_SHOW ermöglicht Ausgaben von LinuxCNC (nach stdout), welche Werkzeugdaten zeigen, die vom db_program beim Start und beim nachfolgenden Nachladen von Werkzeugdaten abgerufen werden.

Der Export der Umgebungsvariable DB_DEBUG ermöglicht LinuxCNC Ausgaben (nach stdout) für zusätzliche Debugging-Informationen über die Schnittstellenaktivität.

1.4. Beispielprogramm

Ein Beispiel db_program (implementiert als Python-Skript) wird mit den Simulationsbeispielen geliefert. Das Programm führt die erforderlichen Operationen aus:

  1. Startversion quittieren

  2. Empfangen von Anfragen (engl. requests) nach Werkzeugdaten (engl. tool data): g (get-Befehl)

  3. Aktualisierungen der Werkzeugdaten empfangen: p (Put-Befehl)

  4. Aktualisierungen der Werkzeugladung empfangen: l (Befehl load_spindle)

  5. Aktualisierungen zum Entladen von Werkzeugen empfangen: u (Befehl unload_spindle)

1.5. Python-Modul tooldb

Das Beispielprogramm verwendet ein von LinuxCNC bereitgestelltes Python-Modul (tooldb), das die Low-Level-Details für die Kommunikation und die Versionsprüfung verwaltet. Dieses Modul verwendet Callback-Funktionen, die vom db_program angegeben werden, um auf den Befehl g (get) und die Befehle zu reagieren, die Werkzeugdatenänderungen anzeigen (p, l, u).

Das db_program verwendet das Modul tooldb, indem es den folgenden Python-Code implementiert:

user_tools = list(...) # Liste der verfügbaren Werkzeugnummern

def user_get_tool(toolno):
    # Funktion, die auf 'g' (get) Befehle reagiert
    # wird einmal für jede Werkzeugnummer in user_tools aufgerufen
    ...
def user_put_tool(werkzeugnr,params):
    # Funktion als Antwort auf 'p' (put) Befehle
    ...
def user_load_spindle(toolno,params):
    # Funktion, die auf 'l' (put) Befehle reagiert
    ...
def user_unload_spindle(toolno,params):
    # Funktion, die auf 'u' (put) Befehle reagiert
    ...

#------------------------------------------------------------
# Anfang:
from tooldb import tooldb_tools # bekannte Werkzeuge identifizieren
from tooldb import tooldb_callbacks # Funktionen identifizieren
from tooldb import tooldb_loop # Hauptschleife

tooldb_tools(user_tools)
tooldb_callbacks(user_get_tool,
                 user_put_tool,
                 user_load_spindle,
                 user_unload_spindle,
                )
tooldb_loop()
Anmerkung
Die Verwendung von tooldb ist nicht erforderlich - sie wird als Demonstration der erforderlichen Schnittstelle und als Bequemlichkeit für die Implementierung von Python-basierten Anwendungen bereitgestellt, die eine Schnittstelle zu einer externen Datenbank haben.

2. Simulationskonfigurationen

Simulationskonfigurationen über die AXIS GUI:

  1. configs/sim/axis/db_demo/db_ran.ini (random_toolchanger)

  2. configs/sim/axis/db_demo/db_nonran.ini (nonrandom_toolchanger)

Jede Sim-Konfiguration simuliert ein db_programm, das eine Datenbank mit 10 Werkzeugen mit den Nummern 10—19 implementiert.

Das db_program wird durch ein einzelnes Skript (db.py) und symbolische Links darauf für alternative Verwendungen bereitgestellt: db_ran.py und db_nonran.py. Standardmäßig implementiert das Skript die Funktion random_toolchanger. Nicht-zufällige Toolchanger-Funktionen werden ersetzt, wenn der Link-Name den Text "nonran" enthält.

Die Sim-Konfigurationen demonstrieren die Verwendung des Python-Schnittstellenmoduls tooldb und implementieren eine einfache Flat-File-Datenbank, welche die Werkzeugzeitnutzung für mehrere Werkzeuge mit gleichen Durchmessern verfolgt. Die Datenbankregeln unterstützen die Auswahl des Werkzeugs mit der geringsten Betriebszeit.

Die Sim-Konfigurationen verwenden eine primäre Aufgabe zu überwachen und zu reagieren, um Werkzeug-Updates von innerhalb LinuxCNC initiiert. Eine periodische Aufgabe aktualisiert die Werkzeugzeitnutzung in regelmäßigen Abständen. Getrennte, gleichzeitige Tasks sind als Threads implementiert, um den Code zu demonstrieren, der erforderlich ist, wenn Änderungen durch das db_program initiiert werden, und um Methoden zur Synchronisierung von LinuxCNC-internen Werkzeugdaten zu demonstrieren. Beispiele umfassen:

  1. Aktualisierung der Werkzeugparameter

  2. Hinzufügen und Entfernen von Werkzeugnummern

Eine wechselseitige Ausschluss (engl. mutual exclusion) -Sperre wird verwendet, um Daten vor Inkonsistenzen zu schützen, die durch Wettlaufbedingungen (engl. und umgangssprachig race condition) zwischen den Aktualisierungen von LinuxCNC-Tooldaten und den Aktualisierungen der Datenbankanwendung entstehen.

2.1. Anmerkungen

Wenn ein db_program in Verbindung mit einem zufälligen Werkzeugwechsler ([EMCIO]RANDOM_TOOLCHANGER) verwendet wird, unterhält LinuxCNC eine Datei (db_spindle.tbl im Konfigurationsverzeichnis), die aus einer einzigen Werkzeug-Tabellenzeile besteht, die das aktuelle Werkzeug in der Spindel identifiziert.