Das Skript halshow kann Ihnen helfen, sich in einer laufenden HAL zurechtzufinden. Es zeigt ausgewählte HAL-Werte an und aktualisiert sie laufend.

Es handelt sich um ein sehr spezialisiertes System, das mit einem funktionierenden HAL verbunden sein muss. Es kann nicht eigenständig laufen, weil es sich auf die Fähigkeit von HAL verlässt, in sich hineinzuhören (engl. introspect) und berichten, was es von sich selbst durch die halcmd Interface-Bibliothek weiß. Wenn sich die Konfiguration von LinuxCNC ändert, wird auch die Ausgabe von halshow anders sein.

Wie wir gleich sehen werden, ist diese Fähigkeit von HAL, sich selbst zu dokumentieren, ein Schlüssel für den Aufbau eines effektiven CNC-Systems.

1. Halshow starten

Halshow Ist verfügbar

  • im AXIS-Menü unter Maschine/Zeige HAL-Konfiguration,

  • im TkLinuxCNC-Menü unter Scripts/HAL Show,

  • in GMOCCAPY auf der Seite mit Einstellungen.

halshow kann auch von einer Terminal-Befehlszeile aus gestartet werden und Formate für Integer- und Float-Elemente (Pins oder Signale) angeben sowie eine zu verwendende gespeicherte Watchlist-Datei identifizieren:

$ halshow --help
Usage:
  halshow [Options] [watchfile]
  Options:
           --help    (this help)
           --fformat format_string_for_float
           --iformat format_string_for_int
           --noprefs don't use preference file to save settings

Hinweise:
       Erstellen Sie einen watchfile in halshow mit: 'File/Save Watch List'.
       LinuxCNC muss für die Standalone-Nutzung ausgeführt werden.

Beispiel für die Begrenzung der Anzahl der Dezimalpunkte für Fließkommazahlen und die Verwendung einer Datei namens my.halshow im aktuellen Verzeichnis:

$ halshow --fformat "%.5f" ./my.halshow

Weitere Informationen über das Format finden Sie unter der Tcl-Format-Manpage.

Halshow-Layout
Abbildung 1. Halshow-Layout

Auf der linken Seite des Bildschirms, wie in der obigen Abbildung gezeigt, befindet sich eine Baumansicht, die dem Dateibrowser ähnelt, den Sie vielleicht kennen. Auf der rechten Seite befindet sich ein Notizbuch mit Registerkarten für Anzeigen, Beobachten und Einstellungen.

2. HAL Baum-Darstellung (engl. Tree Area)

2.1. Filter-Baum

Standardmäßig filtert dieser Eintrag den Baum nach Pin-Namen oder Baum-Knoten durch einen regulären Ausdruck. Zum Beispiel würde die Eingabe von "lim-sw" den Baum nach dem folgenden filtern:

Filterbaum für Pin-Namen mit der Teilzeichenkette "lim-sw".
joint.0.neg-lim-sw-in
joint.0.pos-lim-sw-in
joint.1.neg-lim-sw-in
joint.1.pos-lim-sw-in
joint.2.neg-lim-sw-in
joint.3.pos-lim-sw-in

Wenn Sie alle "joint.0"-Beziehungen anzeigen möchten, müssen Sie auf das Einstellungssymbol klicken und "Full path" (engl. für vollständiger Pfad) auswählen. Achten Sie darauf, die Sonderzeichen für reguläre Ausdrücke zu escapen, d.h. Sie müssen "joint\.1\." eingeben, um explizit den Punkt abzufragen und nicht auch joint 10 zu finden.

2.2. Baum

Der Baum zeigt alle wichtigen Teile eines HAL. Vor jedem Teil befindet sich ein kleines Plus- (+) oder Minuszeichen (-) in einem Kästchen, mit dem Sie den entsprechenden Teil des Baums auf- oder zuklappen können.

Sie können die Baumansicht auch über das Menü Baumansicht (engl. tree view) am oberen linken Rand der Anzeige erweitern oder reduzieren.

Unter der Baumansicht finden Sie: Alle aufklappen (engl. expand all), Alle zuklappen (engl. collapse all); Pins aufklappen (engl. expand pins), Parameter aufklappen (engl. expand parameters), Signale aufklappen (engl. expand signals); und Baumansicht neu laden (engl. reload tree view). Baumansicht neu laden ist nützlich, wenn zur Laufzeit neue Komponenten geladen werden und angezeigt werden sollen.

3. HAL Show Area

Halshow: Show Tab (engl. für Registerkarte anzeigen)
Abbildung 2. Halshow: Show Tab (engl. für Registerkarte anzeigen)

Wenn Sie auf den Namen des Knotens klicken, z.B. "Komponenten" (engl. components) im Baum, wird Ihnen (unter der Registerkarte "Show") alles angezeigt, was HAL über den Inhalt dieses Knotens weiß. Abbildung Halshow Show Tab zeigt eine Liste, die genau so aussieht, wie wenn Sie auf den Namen "Components" klicken. Die Informationsanzeige ist genau wie bei den traditionellen textbasierten HAL-Analysetools. Der Vorteil hier ist, dass wir per Mausklick Zugriff haben, und zwar so umfassend oder so gezielt, wie Sie es brauchen.

Wenn wir uns die Baumdarstellung genauer ansehen, sehen wir, dass die sechs Hauptteile eines HAL alle um mindestens eine Ebene erweitert werden können. Wenn diese Ebenen erweitert werden, können Sie die Antwort genauer betrachten, wenn Sie auf den ganz rechten Baumknoten klicken. Sie werden feststellen, dass es einige HAL-Pins und Parameter gibt, die mehr als eine Antwort anzeigen. Dies liegt an der Art der Suchroutinen in halcmd selbst. Wenn Sie einen Pin suchen, erhalten Sie möglicherweise zwei Antworten, wie hier:

Komponenten Pins:
Owner  Type  Dir  Value  Name
06     bit    -W   TRUE  parport.0.pin-10-in
06     bit    -W  FALSE  parport.0.pin-10-in-not

Der Name des zweiten Pins enthält den vollständigen Namen des ersten.

Neu in 2.9

Ausgewählter Text auf der Registerkarte Anzeigen kann mit der rechten Maustaste oder STRG-C kopiert werden.
Im Bereich Anzeigen können Sie Stecknadeln aus ausgewähltem Text hinzufügen, indem Sie das Kontextmenü verwenden. Alle gültigen Pins, die in der Auswahl enthalten sind, werden der Registerkarte "Beobachten" (engl. watch) hinzugefügt.

4. Watch Area

Wenn Sie auf die Registerkarte "Beobachten" (engl. watch) klicken, wird eine leere Leinwand (engl. canvas) angezeigt. Sie können Signale und Pins zu diesem Canvas hinzufügen und ihre Werte beobachten. Sie können Signale oder Pins hinzufügen, wenn die Registerkarte "Überwachen" angezeigt wird, indem Sie in der Strukturansicht auf den Namen des Signals klicken.

Neu in 2.9

Sie können auch alle Unterpunkte dieses Knotens hinzufügen, indem Sie diese im Rechtsklickmenü auswählen (siehe Abbildung Halshow Watch Tab).

Die folgende Abbildung zeigt diese Leinwand (engl. canvas) mit mehreren Pins.

Halshow Watch Tab
Abbildung 3. Halshow: Watch Tab

Watch zeigt bitartige (binäre) Werte mit farbigen Kreisen an, die LEDs darstellen. Sie werden dunkelrot angezeigt, wenn ein Bitsignal oder ein Pin falsch ist, und hellgelb, wenn das Signal wahr ist. Wenn Sie einen Pin oder ein Signal auswählen, das nicht vom Bittyp (binär) ist, zeigt watch es als numerischen Wert an. Pins werden schwarz, Signale blau und Parameter braun dargestellt.

Watch ermöglicht es Ihnen, schnell Schalter zu testen oder die Auswirkungen von Änderungen zu sehen, die Sie an LinuxCNC vornehmen, während Sie die grafische Benutzeroberfläche verwenden. Die Bildwiederholfrequenz von watch ist etwas zu langsam, um Stepperimpulse zu sehen, aber Sie können sie für diese verwenden, wenn Sie eine Achse sehr langsam oder in sehr kleinen Entfernungsschritten bewegen.

Neu in 2.9

Die Pins und Signale, die beschreibbar sind, haben auf der rechten Seite Schaltflächen zur Manipulation. Pins, die mit einem Signal verknüpft sind, haben deaktivierte Schaltflächen. Um diese Werte zu setzen, muss der entsprechende Pin vom Signal entkoppelt werden. Dies kann durch Rechtsklick auf den Signalnamen und Auswahl von "Unlink pin" geschehen, siehe Watch Tach Context Menu.

Die Beobachtungsliste wird beim Beenden automatisch gespeichert. Wenn du nicht möchtest, dass Halshow deine Beobachtungsliste speichert, kannst du dies in den Einstellungen (engl. settings) deaktivieren.

Kontextmenü

Neu in 2.9

Das Kontextmenü ermöglicht zudem:

  • Kopieren des Pinnamens in die Zwischenablage

  • Einen Wert einstellen

  • Einen Pin trennen (sofern mit einem Signal verbunden)

  • Apin in der Strukturansicht anzeigen (hebt den Pin hervor, scrollt nicht zur Position)

  • Entfernen eines Pins aus der Liste

Halshow: Kontextmenü der Registerkarte 'Watch'
Abbildung 4. Halshow: Kontextmenü der Registerkarte Watch

5. Befehls-Eingabe

Im unteren Teil befindet sich ein Eingabefeld zum Testen von HAL-Befehlen. Die Befehle, die Sie hier eingeben und die Auswirkungen, die sie auf die laufende HAL haben, werden nicht gespeichert. Sie bleiben erhalten, solange LinuxCNC läuft, werden aber gelöscht, sobald LinuxCNC nicht mehr läuft.

Neu in 2.9

Die Befehlseingabe hat einee BASH-ähnliche Historie (während der Sitzung), so dass Sie eingefügte Befehle mit der Pfeiltaste nach oben wiederherstellen können.

Das Eingabefeld "HAL Command:" akzeptiert jeden der für halcmd aufgeführten Befehle. Dazu gehören:

  • loadrt, unloadrt (Laden/Entladen von Echtzeitmodulen)

  • loadusr", "unloadusr" (Laden/Entladen von Nicht-Echtzeit-Komponenten)

  • addf, delf (Hinzufügen/Löschen einer Funktion zu/aus einem Echtzeit-Thread)

  • net (eine Verbindung zwischen zwei oder mehr Elementen herstellen)

  • setp (Parameter (oder Pin) auf einen Wert setzen)

Dieser kleine Editor gibt jedes Mal einen Befehl ein, wenn Sie Enter drücken oder die Schaltfläche Ausführen betätigen. Eine Fehlermeldung von halcmd wird angezeigt, wenn diese Befehle nicht richtig gebildet sind. Wenn Sie nicht sicher sind, wie Sie einen korrekten Befehl eingeben, müssen Sie die Dokumentation zu halcmd und den spezifischen Modulen, mit denen Sie arbeiten, erneut lesen.

6. Einstellungen

Neu in 2.9

Die Geometrie (Breite, Höhe und X/Y-Position) des Fensters und die Einstellungen werden beim Beenden in einer Datei im Konfigurationsverzeichnis gespeichert. Wenn dieser Pfad nicht ermittelt werden kann, werden sie im Home-Verzeichnis gespeichert. Der Pfad wird auf der Einstellungsseite angezeigt. Sie können auf die Verwendung der Einstellungsdatei verzichten, indem Sie halshow mit dem Kommandozeilenargument --no-prefs aufrufen.
Die weiteren Einstellungen sollten selbsterklärend sein.

Halshow Einstellungen
Abbildung 5. Halshow Einstellungen

7. Beispiel/Tutorial

Lassen Sie uns diesen Editor verwenden, um ein Differenzierungs-Modul (engl. differential module) zu einem HAL hinzuzufügen und es mit der Achsenposition zu verbinden, damit wir die Änderungsrate der Position, d.h. die Beschleunigung, sehen können. Zunächst müssen wir eine HAL-Komponente mit dem Namen ddt laden, sie zum Servo-Thread hinzufügen und sie dann mit dem Positionsstift eines Gelenks verbinden. Danach können wir den Ausgang des Differenzierers in Halscope finden. Also los geht’s.

loadrt ddt

Schauen Sie sich den Komponenten-Knoten an, und Sie sollten dort irgendwo ddt finden.

Geladene HAL Komponenten:
ID Type        Name
10 User halcmd29800
09 User halcmd29374
08   RT         ddt
06   RT hal_parport
05   RT    scope_rt
04   RT     stepgen
03   RT      motmod
02 User   iocontrol

Und tatsächlich, da ist sie. Beachten Sie, dass seine ID 08 ist. Als Nächstes müssen wir herausfinden, welche Funktionen damit verfügbar sind, also schauen wir uns die Funktionen an:

Exportierte Funktionen:
Owner  CodeAddr      Arg  FP Users Name
  08   E0B97630 E0DC7674 YES     0 ddt.0
  03   E0DEF83C 00000000 YES     1 motion-command-handler
  03   E0DF0BF3 00000000 YES     1 motion-controller
  06   E0B541FE E0DC75B8  NO     1 parport.0.read
  06   E0B54270 E0DC75B8  NO     1 parport.0.write
  06   E0B54309 E0DC75B8  NO     0 parport.read-all
  06   E0B5433A E0DC75B8  NO     0 parport.write-all
  05   E0AD712D 00000000  NO     0 scope.sample
  04   E0B618C1 E0DC7448 YES     1 stepgen.capture-position
  04   E0B612F5 E0DC7448  NO     1 stepgen.make-pulses
  04   E0B614AD E0DC7448 YES     1 stepgen.update-freq

Hier suchen wir nach Eigentümer #08 und sehen eine Funktion namens ddt.0. Wir sollten in der Lage sein, ddt.0 zum Servo-Thread hinzuzufügen, und es wird seine Berechnungen jedes Mal durchführen, wenn der Servo-Thread aktualisiert wird. Noch einmal sehen wir uns den addf-Befehl an und stellen fest, dass er drei Argumente wie folgt verwendet:

addf <Funktionsname> <Threadname> [<Position>]

Wir wissen bereits, dass Funktionsname=ddt.0 ist, also müssen wir den Thread-Namen richtig eingeben, indem wir den Thread-Knoten im Baum erweitern. Hier sehen wir zwei Threads, den Servo-Thread und den Basis-Thread. Die Position von ddt.0 im Thread ist nicht entscheidend. Wir fügen also die Funktion ddt.0 zum Servo-Thread hinzu:

addf ddt.0 servo-thread

Dies ist nur zur Ansicht, also lassen wir Position leer und erhalten die letzte Position im Thread. Die folgende Abbildung zeigt den Zustand von halshow, nachdem dieser Befehl erteilt wurde.

Addf-Befehl
Abbildung 6. Addf-Befehl

Als nächstes müssen wir ddt mit etwas verbinden. Aber woher wissen wir, welche Pins verfügbar sind? Die Antwort ist, dass wir unter Pins nachsehen. Dort finden wir ddt und sehen dies:

Komponenten Pins:
Owner Type  Dir Value       Name
08    float R-  0.00000e+00 ddt.0.in
08    float -W  0.00000e+00 ddt.0.out

Das sieht einfach genug aus, um es zu verstehen, aber welches Signal oder welchen Pin wollen wir damit verbinden? Es könnte ein Achsen-Pin, ein Stepgen-Pin oder ein Signal sein. Wir sehen dies, wenn wir uns joint.0 ansehen:

Komponenten Pins:
Owner Type  Dir Value       Name
03    float -W  0.00000e+00 joint.0.motor-pos-cmd ==> Xpos-cmd

Es sieht also so aus, als ob Xpos-cmd ein gutes Signal sein sollte. Zurück zum Editor, wo wir den folgenden Befehl eingeben:

linksp Xpos-cmd ddt.0.in

Wenn wir uns nun das Xpos-cmd-Signal mithilfe des Baumknotens ansehen, sehen wir, was wir getan haben:

Signale:
Type Value Name
float 0.00000e+00 Xpos-cmd
<== joint.0.motor-pos-cmd
==> ddt.0.in
==> stepgen.0.position-cmd

Wir sehen, dass dieses Signal von joint.o.motor-pos-cmd kommt und sowohl an ddt.0.in als auch an stepgen.0.position-cmd geht. Durch die Verbindung unseres Blocks mit dem Signal haben wir jegliche Komplikationen mit dem normalen Ablauf dieses Bewegungsbefehls vermieden.

Der HAL-Anzeigebereich (engl. show area) verwendet halcmd, um herauszufinden, was in einermlaufenden HAL passiert. Er gibt Ihnen vollständige Informationen darüber, was er entdeckt hat. Er wird auch aktualisiert, wenn Sie über das kleine Editor-Panel Befehle zur Änderung des HAL eingeben. Es kann vorkommen, dass Sie andere Dinge angezeigt haben möchten, ohne dass alle Informationen in diesem Bereich verfügbar sind. In diesem Fall ist der HAL-Überwachungsbereich von Nutzen.