Dieses Dokument bietet einen Überblick über die Grundlagen von HAL.
1. HAL Commands
Ausführlichere Informationen finden Sie in der Manpage für halcmd: führen Sie man halcmd in einem Terminalfenster aus.
Um die HAL-Konfiguration zu sehen und den Status von Pins und Parametern zu überprüfen, verwenden Sie das Fenster HAL-Konfiguration im Menü Maschine in AXIS. Um den Status eines Pins zu überwachen, öffnen Sie die Registerkarte "Überwachen" und klicken Sie auf jeden Pin, den Sie überwachen möchten; er wird dann zum Überwachungsfenster hinzugefügt.
1.1. loadrt
Mit dem Befehl loadrt
wird eine Echtzeit-HAL-Komponente geladen. Echtzeit-Komponentenfunktionen müssen einem Thread hinzugefügt werden, um mit der Rate des Threads aktualisiert zu werden. Sie können keine Nicht-Echtzeit-Komponente in den Echtzeitbereich laden.
loadrt <component> <options> loadrt mux4 count=1
1.2. addf
Der Befehl addf
fügt eine Funktion zu einem Echtzeit-Thread hinzu. Wenn der StepConf-Assistent zur Erstellung der Konfiguration verwendet wurde, wurden zwei Threads erstellt (``base-thread`` und ``servo-thread``).
addf
fügt Funktion Funktionsname zu Thread Threadname hinzu. Standardmäßig wird die Funktion in der Reihenfolge hinzugefügt, in der sie in der Datei steht. Wenn Position angegeben ist, wird die Funktion an dieser Stelle des Threads hinzugefügt. Eine negative Position gibt die Position in Bezug auf das Ende des Threads an. Zum Beispiel 1 ist der Anfang des Threads, -1 ist das Ende des Threads, -3 ist das dritte Ende vom Ende.
Bei einigen Funktionen ist es wichtig, dass sie in einer bestimmten Reihenfolge geladen werden, wie z. B. die Parport-Lese- und Schreibfunktionen. Der Funktionsname ist normalerweise der Komponentenname plus eine Zahl. Im folgenden Beispiel wird die Komponente "or2" geladen und show function
zeigt den Namen der or2-Funktion an.
$ halrun
halcmd: loadrt or2
halcmd: show function
Exported Functions:
Owner CodeAddr Arg FP Users Name
00004 f8bc5000 f8f950c8 NO 0 or2.0
Sie müssen eine Funktion aus einer HAL-Echtzeitkomponente zu einem Thread hinzufügen, damit die Funktion mit der Rate des Threads aktualisiert wird. Normalerweise gibt es zwei Threads, wie in diesem Beispiel gezeigt. Einige Komponenten verwenden Fließkommamathematik und müssen zu einem Thread hinzugefügt werden, der Fließkommamathematik unterstützt. Das FP
zeigt an, ob die Fließkomma-Mathematik in diesem Thread unterstützt wird.
$ halrun
halcmd: loadrt motmod base_period_nsec=55555 servo_period_nsec=1000000 num_joints=3
halcmd: show thread
Realtime Threads:
Period FP Name ( Time, Max-Time )
995976 YES servo-thread ( 0, 0 )
55332 NO base-thread ( 0, 0 )
-
Basis-Thread (der Hochgeschwindigkeits-Thread): Dieser Thread bearbeitet Aufgaben, die eine schnelle Reaktion erfordern, wie z. B. die Erzeugung von Schrittimpulsen und das Lesen und Schreiben der parallelen Schnittstelle. Er unterstützt keine Fließkomma-Mathematik.
-
Servo-Thread (der Slow-Speed-Thread): Dieser Thread verarbeitet Elemente, die eine langsamere Reaktion tolerieren können, wie den Motion-Controller, ClassicLadder und den Motion-Command-Handler, und unterstützt Fließkomma-Mathematik.
addf <function> <thread> addf mux4.0 servo-thread
Anmerkung
|
Wenn die Komponente einen Fließkomma-Thread benötigt, ist dies normalerweise der langsamere Servo-Thread. |
1.3. loadusr
Der Befehl loadusr
lädt eine Nicht-Echtzeit-HAL-Komponente. Nicht-Echtzeit-Programme sind ihre eigenen, separaten Prozesse, die optional mit anderen HAL-Komponenten über Pins und Parameter kommunizieren. Sie können keine Echtzeitkomponenten in den Nicht-Echtzeitbereich laden.
Flags können eine oder mehrere der folgenden sein:
-W
|
um auf die Bereitschaft der Komponente zu warten. Es wird davon ausgegangen, dass die Komponente denselben Namen hat wie das erste Argument des Befehls. |
-Wn <Name>
|
um auf die Komponente zu warten, die den angegebenen <Name> haben wird. Dies gilt nur, wenn die Komponente eine Namensoption hat. |
-w
|
um zu warten, bis das Programm beendet wird |
-i
|
um den Rückgabewert des Programms zu ignorieren (mit -w) |
-n
|
Benennt eine Komponente, sofern dies eine zulässige Option für diese Komponente ist. |
loadusr
loadusr <component> <options> loadusr halui loadusr -Wn spindle gs2_vfd -n spindle
Auf Deutsch bedeutet es loadusr wartet auf Name Spindel Komponente gs2_vfd mit Namen Spindel.
1.4. net
Der Befehl net
erstellt eine Verbindung zwischen einem Signal und einem oder mehreren Pins. Wenn das Signal nicht existiert, erzeugt net das neue Signal. Dies ersetzt die Verwendung des Befehls newsig. Die optionalen Richtungspfeile <=
, =>
und <=>
erleichtern das Verfolgen der Logik beim Lesen einer net
-Befehlszeile und werden vom Befehl net
nicht verwendet. Die Richtungspfeile müssen durch ein Leerzeichen von den Pin-Namen getrennt werden.
net
net signal-name pin-name <optional arrow> <optional second pin-name> net home-x joint.0.home-sw-in <= parport.0.pin-11-in
Im obigen Beispiel ist home-x
der Signalname, joint.0.home-sw-in
ist ein Direction IN-Pin, <=
ist der optionale Richtungspfeil, und parport.0.pin-11-in
ist ein Direction OUT-Pin. Dies mag verwirrend erscheinen, aber die Bezeichnungen "in" und "out" für einen Parallelport-Pin geben die physikalische Funktionsweise des Pins an, nicht wie er in HAL gehandhabt wird.
Ein Pin kann mit einem Signal verbunden werden, wenn er die folgenden Regeln beachtet:
-
Ein IN-Pin kann immer mit einem Signal verbunden werden.
-
Ein IO-Pin kann angeschlossen werden, sofern kein ein OUT-Pin am Signal anliegt.
-
Ein OUT-Pin kann nur angeschlossen werden, wenn es keine anderen OUT- oder IO-Pins am Signal gibt.
Derselbe Signal-Name kann in mehreren Netzbefehlen verwendet werden, um zusätzliche Pins zu verbinden, solange die obigen Regeln beachtet werden.
Dieses Beispiel zeigt das Signal xStep mit der Quelle stepgen.0.out
und mit zwei Lesern, parport.0.pin-02-out
und parport.0.pin-08-out
. Im Grunde genommen wird der Wert von stepgen.0.out
an das Signal xStep gesendet und dieser Wert wird dann an parport.0.pin-02-out
und parport.0.pin-08-out gesendet
.
# Signal Ursprung Destination Destination net xStep stepgen.0.out => parport.0.pin-02-out parport.0.pin-08-out
Da das Signal xStep den Wert von stepgen.0.out
(die Quelle/Ursprung (engl. source) ) enthält, können Sie dasselbe Signal erneut verwenden, um den Wert an einen anderen Leser zu senden. Verwenden Sie dazu einfach das Signal mit den Lesern in einer anderen Zeile.
# Signal Destination2 net xStep => parport.0.pin-06-out
Ein E/A-Pin wie ein Encoder. N.index-enable kann gelesen oder so eingestellt werden, wie es die Komponente zulässt.
1.5. setp
Der Befehl setp
setzt den Wert eines Pins oder Parameters. Die gültigen Werte hängen vom Typ des Pins oder Parameters ab. Es ist ein Fehler, wenn die Datentypen nicht übereinstimmen.
Einige Komponenten haben Parameter, die vor der Verwendung eingestellt werden müssen. Die Parameter können je nach Bedarf vor der Verwendung oder während der Ausführung gesetzt werden. Sie können setp nicht auf einen Pin anwenden, der mit einem Signal verbunden ist.
setp
setp <pin/parameter-name> <value> setp parport.0.pin-08-out TRUE
1.6. sets
Der Befehl sets
setzt den Wert eines Signals.
sets
sets <signal-name> <value> net mysignal and2.0.in0 pyvcp.my-led sets mysignal 1
Es ist ein Fehler, wenn:
-
Der Signal-Name existiert nicht
-
Wenn das Signal bereits einen Schreiber (engl. writer) hat
-
Wenn Wert nicht der richtige Typ für das Signal ist
1.7. unlinkp
Der Befehl unlinkp
löst die Verknüpfung eines Pins vom angeschlossenen Signal. Wenn vor dem Ausführen des Befehls kein Signal mit dem Pin verbunden war, passiert nichts. Der Befehl unlinkp
ist nützlich für die Fehlerbehebung.
unlinkp
unlinkp <pin-name> unlinkp parport.0.pin-02-out
1.8. Veraltete Befehle
Die folgenden Befehle sind veraltet und werden möglicherweise aus zukünftigen Versionen entfernt. Jede neue Konfiguration sollte den Befehl net
verwenden. Diese Befehle sind enthalten, damit ältere Konfigurationen noch funktionieren.
1.8.1. linksp (veraltet)
Der Befehl linksp
stellt eine Verbindung (engl. connection) zwischen einem Signal und einem Pin her.
linksp
linksp <signal-name> <pin-name> linksp X-step parport.0.pin-02-out
The linksp
command has been superseded by the net
command.
1.8.2. linkps (veraltet)
Der Befehl linkps
stellt eine Verbindung zwischen einem Pin und einem Signal her. Er ist der gleiche wie linksp
, aber die Argumente sind umgekehrt.
linkps
linkps <pin-name> <signal-name> linkps parport.0.pin-02-out X-Step
The linkps
command has been superseded by the net
command.
1.8.3. newsig
der Befehl newsig
erzeugt ein neues HAL-Signal mit dem Namen <signame> und dem Datentyp <type>. Der Typ muss bit, s32, u32, s64, u64 oder float sein. Es ist ein Fehler, wenn <signame> bereits existiert.
newsig
newsig <signame> <type> newsig Xstep bit
Weitere Informationen finden Sie im HAL-Handbuch oder in den Man Pages für halrun
.
2. HAL Data
2.1. Bit
Ein Bitwert ist ein Ein oder Aus.
-
bit values = true oder 1 und false oder 0 (True, TRUE, oder true sind alles gültige Werte)
2.2. Gleitkommazahl (engl. float)
Ein float-Wert ist eine Gleitkommazahl. Das heißt, der Dezimalpunkt kann nach Bedarf verschoben werden.
-
Float-Werte = ein 64-Bit-Fließkommawert mit einer Auflösung von etwa 53 Bit und einem Dynamikbereich von über 210 (etwa 1000) Bit.
Weitere Informationen über Gleitkommazahlen finden Sie unter:
2.3. s32
Eine s32-Zahl ist eine ganze Zahl, die einen negativen oder positiven Wert haben kann.
-
s32-Werte = ganzzahlige Werte von -2147483648 bis 2147483647
2.4. u32
Eine "u32"-Zahl ist eine ganze Zahl, die nur positiv ist.
-
u32-Werte = Ganzzahlige Zahlen von 0 bis 4294967295
2.5. s64
Eine s64-Zahl ist eine ganze Zahl, die einen negativen oder positiven Wert haben kann.
-
s64-Werte = ganzzahlige Werte von -9.223.372.036.854.775.808 bis -9.223.372.036.854.775.807
2.6. u64
Eine u64-Zahl ist eine ganze Zahl, die nur positiv ist.
-
u64-Werte = Ganzzahlige Zahlen von 0 bis 18.446.744.073.709.551.615
3. HAL Files
Wenn Sie den Stepper Config Wizard verwendet haben, um Ihre Konfiguration zu erstellen, werden Sie bis zu drei HAL-Dateien in Ihrem Konfigurationsverzeichnis haben.
-
my-mill.hal (wenn Ihre Konfiguration my-mill heißt) Diese Datei wird zuerst geladen und sollte nicht geändert werden, wenn Sie den Stepper-Konfigurationsassistenten verwendet haben.
-
custom.hal Diese Datei wird als nächstes und vor dem Laden der grafischen Benutzeroberfläche geladen. Hier legen Sie Ihre benutzerdefinierten HAL-Befehle ab, die vor dem Laden der grafischen Benutzeroberfläche geladen werden sollen.
-
custom_postgui.hal Diese Datei wird geladen, nachdem die grafische Benutzeroberfläche geladen wurde. Hier werden die benutzerdefinierten HAL-Befehle abgelegt, die nach dem Laden der grafischen Benutzeroberfläche geladen werden sollen. Alle HAL-Befehle, die PyVCP-Widgets verwenden, müssen hier abgelegt werden.
4. HAL Parameter
Zwei Parameter werden automatisch zu jeder HAL-Komponente hinzugefügt, wenn sie erstellt wird. Mit diesen Parametern können Sie die Ausführungszeit einer Komponente festlegen.
.time
|
Zeit ist die Anzahl der CPU-Zyklen, die für die Ausführung der Funktion benötigt wurden. |
.tmax
|
Tmax ist die maximale Anzahl von CPU-Zyklen, die zur Ausführung der Funktion benötigt wurden. |
tmax" ist ein Lese-/Schreibparameter, so dass der Benutzer ihn auf 0 setzen kann, um die erste Initialisierung der Ausführungszeit der Funktion loszuwerden.
5. Basic Logic Components
HAL enthält mehrere Echtzeit-Logikkomponenten. Logikkomponenten folgen einer "Wahrheitstabelle", die angibt, was die Ausgabe für eine bestimmte Eingabe ist. In der Regel handelt es sich dabei um Bitmanipulatoren, die elektrischen Logikgatter-Wahrheitstabellen folgen.
Für weitere Komponenten siehe HAL Components List oder die man pages.
5.1. and2
Die Komponente and2
ist ein und-Gatter mit zwei Eingängen. Die folgende Wahrheitstabelle zeigt die Ausgabe für jede Kombination von Eingängen.
and2 [count=N] | [names=name1[,name2...]]
and2.n
and2.N.in0 (bit, in)
and2.N.in1 (bit, in)
and2.N.out (bit, out)
in0 | in1 | out |
---|---|---|
False |
False |
False |
True |
False |
False |
False |
True |
False |
True |
True |
True |
5.2. not
Die Komponente not
ist ein Bit-Inverter.
not [count=n] | [names=name1[,name2...]]
not.all
not.n
not.n.in (bit, in)
not.n.out (bit, out)
in | out |
---|---|
True |
False |
False |
True |
5.3. or2
Die or2
-Komponente ist ein oder-Gatter mit zwei Eingängen.
or2[count=n] | [names=name1[,name2...]]
or2.n
or2.n.in0 (bit, in)
or2.n.in1 (bit, in)
or2.n.out (bit, out)
in0 | in1 | out |
---|---|---|
True |
False |
True |
True |
True |
True |
False |
True |
True |
False |
False |
False |
5.4. xor2
Die xor2
-Komponente ist ein xor-Gatter (entweder oder) mit zwei Eingängen.
xor2[count=n] | [names=name1[,name2...]]
xor2.n
xor2.n.in0 (bit, in)
xor2.n.in1 (bit, in)
xor2.n.out (bit, out)
in0 | in1 | out |
---|---|---|
True |
False |
True |
True |
True |
False |
False |
True |
True |
False |
False |
False |
6. Logic Examples
and2
loadrt and2 count=1 addf and2.0 servo-thread net my-sigin1 and2.0.in0 <= parport.0.pin-11-in net my-sigin2 and2.0.in1 <= parport.0.pin-12-in net both-on parport.0.pin-14-out <= and2.0.out
In dem obigen Beispiel wird eine Kopie von and2
in den Echtzeitbereich geladen und dem Servo-Thread hinzugefügt. Als nächstes wird pin-11
des parallelen Anschlusses mit dem in0
-Bit des and-Gatters verbunden. Als nächstes wird pin-12
mit dem in1
-Bit des and-Gatters verbunden. Zuletzt verbinden wir das Ausgangsbit "and2" mit dem parallelen Anschluss pin-14
. Wenn also nach der Wahrheitstabelle für and2
Pin 11 und Pin 12 eingeschaltet sind, dann ist der Ausgangs-Pin 14 eingeschaltet.
7. Conversion Components
7.1. weighted_sum
Die weighted_sum (engl. für gewichtete Summe) wandelt eine Gruppe von Bits in eine ganze Zahl um. Die Umwandlung ist die Summe der "Gewichte" der vorhandenen Bits plus eines eventuellen Offsets. Sie ähnelt der binär kodierten Dezimalzahl, hat aber mehr Möglichkeiten. Das Hold-Bit unterbricht die Eingabeverarbeitung, so dass sich der Summen-Wert nicht mehr ändert.
weighted_sum
loadrt weighted_sum wsum_sizes=size[,size,...]
Erzeugt Gruppen von ``weighted_sum``s, jede mit der angegebenen Anzahl von Eingabebits (Größe).
Um die "weighted_sum" zu aktualisieren, muss der "process_wsums" an einen Thread angehängt werden.
process_wsums
zum Servo-Threadaddf process_wsums servo-thread
Which updates the weighted_sum
component.
Im folgenden Beispiel, einer Kopie des AXIS HAL Konfigurationsfensters, sind die Bits 0 und 2 TRUE, sie haben keinen Offset. Das Gewicht ("weight") von Bit 0 ist 1, das von Bit 2 ist 4, die Summe ist also 5.
Eigentümer (engl. owner) | Typ | Richt | Wert | Name |
---|---|---|---|---|
10 |
bit |
In |
TRUE |
|
10 |
s32 |
E/A (engl. I/O) |
1 |
|
10 |
bit |
In |
FALSE |
|
10 |
s32 |
E/A (engl. I/O) |
2 |
|
10 |
bit |
In |
TRUE |
|
10 |
s32 |
E/A (engl. I/O) |
4 |
|
10 |
bit |
In |
FALSE |
|
10 |
s32 |
E/A (engl. I/O) |
8 |
|
10 |
bit |
In |
FALSE |
|
10 |
s32 |
E/A (engl. I/O) |
0 |
|
10 |
s32 |
Out |
5 |
|