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.
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:
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
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.
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.
Die folgende Abbildung zeigt diese Leinwand (engl. canvas) mit mehreren Pins.
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.
Context Menu
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.
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
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.
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.