Bei LinuxCNC geht es um die Interaktion mit Hardware. Aber nur wenige Benutzer haben die gleichen genauen Hardware-Spezifikationen - ähnlich, aber nicht gleich. Und selbst für die exakt gleiche Hardware, kann es verschiedene Möglichkeiten, diese zu benutzen, sagen wir für verschiedene Materialien oder mit verschiedenen Fräsen, die Anpassungen an der Steuerung eines bereits laufenden Systems erfordern würde. Es wurde eine Abstraktion benötigt, um die Konfiguration von LinuxCNC für eine Vielzahl von Hardware-Geräten zu erleichtern. Auf der höchsten Ebene könnte es einfach eine Möglichkeit sein, eine Reihe von "Bausteinen" zu laden und miteinander zu verbinden, um ein komplexes System zusammenzustellen.

Dieses Kapitel führt Sie in die Hardware-Abstraktionsschicht ein. Sie werden sehen, dass viele der Bausteine tatsächlich Treiber für Hardwaregeräte sind. HAL kann jedoch mehr als nur Hardwaretreiber zu konfigurieren.

1. HAL Übersicht

Der Hardware Abstraction Layer (oder mit einem Verweis auf den 2001 Space Odyssey Film einfach "HAL") ist eine Software zur

  • stellen die Infrastruktur für die Kommunikation mit und zwischen den zahlreichen Software- und Hardwarekomponenten des Systems bereit.

  • diese Informationen bei ihrem Fluss von Komponente zu Komponente optional verarbeiten und/oder überschreiben.

An sich ist diese Middleware bezüglich seiner Anwendung auf CNC nicht speziell ausgelegt. Eine Internetsuche fand beispielsweise eine astronomische Anwendung zur Steuerung von Teleskopen mit LinuxCNC. Motoren bewegen das Teleskop in die richtige Position, und man muss wissen, wie man die Motoraktivität mit den Auswirkungen dieser Positionierung auf die reale Welt abbildet. Eine solche Synchronisierung der Motorpositionen mit den Positionen in der realen Welt erinnert an das, was CNC-Maschinen tun müssen, oder gar ein Raumschiff.

Jede Maschinensteuerung muss kennen:

  • über ihren internen Zustand und dessen Abbildung auf die Umgebung (Maschinenkoordinaten, Zustand von Schaltern/Reglern),

  • wie die Aktoren diesen Zustand verändern sollen,

  • wie die Aktualisierung des internen Zustands durch Sensoren (Encoder, Sonden) ermöglichen.

Die HAL-Schicht besteht aus Teilen (als „Komponenten“ bezeichnet), die

  • miteinander verbunden sind, z. B. um die Positionsdaten zu aktualisieren oder um den Planungsalgorithmus den Motoren den nächsten Schritt mitteilen zu lassen.

  • wissen vielleicht, wie man mit Hardware kommuniziert,

  • kann einfach eingehende Daten verarbeiten und Datenausgaben für andere Komponenten bereitstellen,

  • werden immer periodisch ausgeführt

    • mit einer sehr hohen Frequenz von wenigen Mikrosekunden (μs) Ausführungszeit, genannt Basis-Thread, z.B. um

      1. einen Schrittmotor dazu zu bewegen, einen weiteren Schritt zu machen

      2. die von einem Encoder angezeigte Position auslesen.

    • mit einer niedrigeren Frequenz pro Millisekunde (ms), z.B. um

      1. die Planung für die nächsten Züge anzupassen, um eine G-Code-Anweisung auszuführen.

    • als Nicht-Echtzeit-"User-Space"-Komponenten, die wie jede andere Software eine "Hauptschleife" (engl. main loop) ausführen und unterbrochen oder verzögert werden können, wenn der Rest des Systems ausgelastet oder überlastet ist.

Zusammengenommen ermöglicht HAL

  1. für eine Maschine zu programmieren, die der Programmierer nicht direkt kennt, sich aber auf eine Programmierschnittstelle mit genau spezifizierter Wirkung auf die Maschine verlassen kann. Diese Schnittstelle kann verwendet werden, um

    • der Maschine sagen, was sie tun soll

    • zu hören, was die Maschine über den Zustand sagen will, in dem sie gerade ist.

  2. Vertikale Abstraktionen: Der menschliche Systemintegrator einer solchen Maschine verwendet HAL

    • um zu beschreiben, wie die Maschine aussieht und wie welches Kabel welchen Motor steuert, der welche Achse antreibt.

    • Die Beschreibung der Maschine, die Schnittstellen des Programmierers und die Benutzerschnittstelle "treffen" sich irgendwie in dieser abstrakten Schicht.

  3. Horizontale Abstraktionen:

    • Nicht alle Maschinen verfügen über alle möglichen Funktionen

    • Mühlen, Drehmaschinen und Roboter teilen viele

      • Merkmale (Motoren, Gelenke, …),

      • Planungsalgorithmen für ihre Bewegungen.

HAL hat keine direkte Interaktion mit dem Benutzer. Es wurden jedoch mehrere Schnittstellen bereitgestellt, mit denen HAL manipuliert werden kann

  • über die Kommandozeile mit dem Befehl "halcmd".

  • aus Python-Skripten und

  • aus C/C++-Programmen heraus,

aber keine dieser Schnittstellen ist "HAL selbst".

HAL selbst ist kein Programm, es besteht aus einer oder mehreren Listen geladener Programme (die Komponenten), die periodisch ausgeführt werden (in strenger Reihenfolge), und einem Bereich des gemeinsamen Speichers für den Datenaustausch verwenden. Das Haupt-HAL-Skript läuft nur einmal beim Maschinenstart, die Einrichtung der Echtzeit-Gewinde und der gemeinsamen Speicherplätze, das Laden der Komponenten und die Einrichtung der Datenverbindungen zwischen ihnen (die "Signale" und "Pins").

Im Prinzip könnten sich mehrere Maschinen eine gemeinsame HAL teilen, um ihnen die Zusammenarbeit zu ermöglichen, jedoch ist die aktuelle Implementierung von LinuxCNC auf einen einzigen Interpreter und ein einzelnes Task-Modul beschränkt. Derzeit handelt es sich dabei fast immer um einen G-Code-Interpreter und den "milltask" (der sich auch für Drehmaschinen und für Roboter bewährt hat), aber diese Module sind zur Ladezeit auswählbar. Mit einem zunehmenden Interesse an der Steuerung mehrerer kooperierender Maschinen ist die Überwindung dieser Einschränkung wahrscheinlich einer der wichtigsten Schritte für die zukünftige Entwicklung von LinuxCNC. Es ist jedoch ein bisschen knifflig und die Community ist immer noch dabei, ihre Gedanken dazu zu organisieren.

HAL ist das Herzstück von LinuxCNC und wird von allen Teilen von LinuxCNC, einschließlich der GUIs, verwendet und/oder erweitert. Der G-Code-Interpreter (oder alternative Sprache) weiß, wie der G-Code zu interpretieren ist, und übersetzt ihn in Maschinenoperationen, indem er Signale in HAL auslöst. Der Benutzer kann HAL auf verschiedene Weise abfragen, um Informationen über seinen Zustand zu erhalten, der dann auch den Zustand des Computers darstellt. Während des Schreibens während der Entwicklung von Version 2.9 machen die GUIs immer noch eine kleine Ausnahme von dieser Regel und wissen möglicherweise etwas, das HAL nicht weiß (und auch nicht wissen muss).

2. Kommunikation

HAL ist besonders, da er richtig schnell kommunizieren kann

  • mit anderen Programmen, vor allem aber

  • mit seinen Komponenten, die in der Regel in einem der Echtzeit-Threads ausgeführt werden.

Und während der Kommunikation muss sich der Teil von LinuxCNC, mit dem gesprochen wird, nicht auf die Kommunikation vorbereiten: Alle diese Aktionen werden asynchron ausgeführt, d.h. keine Komponente unterbricht ihre reguläre Ausführung, um ein Signal zu empfangen, und Signale können sofort gesendet werden, d.h. eine Anwendung kann warten, bis eine bestimmte Nachricht angekommen ist - wie ein Enable-Signal, sie muss sich jedoch nicht auf den Empfang dieser Nachricht vorbereiten.

Das Kommunikationssystem

  • repräsentiert und steuert die gesamte Hardware, die an das System angeschlossen ist,

  • startet und stoppt andere kommunizierende Programme.

Die Kommunikation mit der Hardware der Maschine selbst erfolgt durch jeweilige individuell darauf ausgelegte HAL-Komponenten.

Die HAL-Schicht ist ein geteilter Raum, in dem alle vielen Teile, die LinuxCNC bilden, Informations austauschen. Dieser Raum verfügt über Pins, die mit einem Namen identifiziert werden, auch wenn ein LinuxCNC-Ingenieur vielleicht eher die Assoziation mit einem Pin einer elektronischen Schaltung bevorzugt. Diese Pins können numerische und logische Werte tragen, boolean, Gleitkommezahlen sowie ganze Zahlen, jeweils mit oder ohne Vorzeichen. Es gibt auch einen (relativ neuen) Pin-Typ namens hal_port für Byte-Streams, und ein Framework zum Austausch komplexer Daten genannt hal_stream (die einen privaten gemeinsamen Speicherbereich verwendet, anstatt eines HAL-Pin). Diese beiden letztgenannten Typen werden relativ selten eingesetzt.

Mit HAL können Sie ein Signal an diesen benannten Pin senden. Jeder Teil von HAL kann den Pin lesen, der dann diesen zuvor gesendeten Signalwert hält. Dies gilt so lange, bis ein neues Signal an diesen Pin gesendet wird, um den vorherigen Wert zu ersetzen. Das zentrale Nachrichtenaustauschsystem von HAL ist CNC-unabhängig, HAL wird jedoch mit einer großen Anzahl von Komponenten ausgeliefert, die viel über CNC wissen und diese Informationen über Pins präsentieren. Es gibt Pins, die darstellen

  • statische (unveränderliche) Informationen über die Maschine

  • den aktuellen Zustand der Maschine

    • Endschalter (engl. end switches)

    • Positionen, die von Schrittmotoren gezählt oder von Encodern gemessen werden

  • Empfänger von Anweisungen

    • manuelle Steuerung der Maschinenposition ("Jogging")

    • Positionen, die Schrittmotoren als nächstes einnehmen sollten

In Analogie zu elektronischen Kabeln können Pins verdrahtet werden, sodass die Wertänderung an einem Pin als Eingabe für einen anderen Pin dient. HAL-Komponenten bereiten solche Ein- und Ausgangspins vor und werden so automatisch zur Ausführung veranlasst.

HAL-Komponenten

Die vielen "Experten"-Softwareteile von LinuxCNC werden typischerweise als Komponenten von HAL implementiert, konzeptionell auch als Module bezeichnet. Diese computerimplementierten Experten lesen ständig von HAL über einen Zustand, den die Maschine anstreben sollte, und vergleichen diesen gewünschten Zustand mit dem Zustand, in dem sich die Maschine gerade befindet. Wenn es einen Unterschied zwischen dem, was sein sollte, und dem, was der aktuelle Zustand ist, gibt, werden Maßnahmen ergriffen, um diesen Unterschied zu verringern, während ständig Aktualisierungen der aktuellen Zustände zurück in den HAL-Datenraum geschrieben werden.

Es gibt Komponenten, die darauf spezialisiert sind, mit Schrittmotoren zu kommunizieren, und andere Komponenten, die wissen, wie man Servos steuert. Auf einer höheren Ebene wissen einige Komponenten, wie die Achsen der Maschine in 3D angeordnet sind, und wieder andere, wie sie eine gleichmäßige Bewegung von einem Punkt im Raum zum anderen ausführen können. Drehmaschinen, Fräsen und Roboter unterscheiden sich in den LinuxCNC-Komponenten, die gerade aktiv sind, d.h. die von einer HAL-Konfigurationsdatei für diese Maschine geladen wird. Dennoch mögen zwei Maschinen sehr unterschiedlich aussehen, da sie für sehr unterschiedliche Zwecke gebaut wurden, aber wenn beide Servomotoren verwenden, können sie immer noch beide die gleiche HAL-Servokomponente verwenden.

Ursprung des Strebens sich zu bewegen

Auf der niedrigsten (nahe an Hardware) Ebene, z.B. für Schrittmotoren, ist die Beschreibung eines Zustands dieses Motors sehr intuitiv: Es ist die Anzahl der Schritte in einer bestimmten Richtung. Ein Unterschied zwischen der Sollposition und der Istposition führt zu einer Bewegung. Geschwindigkeiten, Beschleunigungen und andere Parameter können im Bauteil selbst intern begrenzt sein oder gegebenenfalls durch vorgeschaltete Komponenten begrenzt sein. (In den meisten Fällen wurden z.B. die an die Schrittgeneratorkomponenten gesendeten Moment-zu-Moment-Achsen-Positionswerte bereits begrenzt und entsprechend den konfigurierten Maschinengrenzen bzw. der aktuellen Vorschubrate angepasst.)

Jede G-Code-Linie wird interpretiert und löst eine Reihe von Routinen aus, die wiederum wissen, wie mit Komponenten einer mittleren Schicht kommunizieren, z.B. um auf einem Kreis zu fahren.

Pins und Signale

HAL hat einen besonderen Platz im Herzen seiner Programmierer für die Darstellung des Datenflusses zwischen Modulen. Wenn traditionelle Programmierer an Variablen, Adressen oder I/O-Ports denken, bezieht sich HAL auf "Pins". Und diese Pins (deutsch auch "Stifte") sind über Signale mit oder mit Werten verbunden. Ähnlich wie ein Elektroingenieur Drähte zwischen Pins von Bauteilen einer Mühle verbinden würde, stellt ein HAL-Ingenieur den Datenfluss zwischen Pins von Modulinstanzen her.

Die LinuxCNC GUIS (AXIS, GMOCCAPY, Touchy, etc.) werden die Zustände einiger Pins (wie Limit Switches) darstellen, aber auch andere grafische Tools zur Fehlerbehebung und Konfiguration existieren: Halshow, Halmeter, Halscope und Halreport.

Der Rest dieser Einleitung präsentiert

  • die Syntax, wie Pins verschiedener Komponenten in den HAL-Konfigurationsdateien verbunden sind, und

  • Software zur Überprüfung der Werte von Pins

    • zu jedem Zeitpunkt,

    • sich im Laufe der Zeit entwickeln.

3. HAL-Systementwurf

HAL basiert auf traditionellen Systementwurfstechniken.

HAL basiert auf denselben Prinzipien, die auch bei der Entwicklung von Hardware-Schaltungen und -Systemen zum Einsatz kommen, weshalb es sinnvoll ist, zunächst diese Prinzipien zu untersuchen. Jedes System, einschließlich einer CNC-Maschine, besteht aus miteinander verbundenen Komponenten. Bei einer CNC-Maschine könnten diese Komponenten die Hauptsteuerung, Servoverstärker oder Schrittmotoren, Motoren, Encoder, Endschalter, Drucktastenschalter, vielleicht ein VFD für den Spindelantrieb, eine SPS zur Steuerung eines Werkzeugwechslers usw. sein. Der Maschinenbauer muss diese Teile auswählen, montieren und miteinander verdrahten, um ein komplettes System zu erhalten.

HAL-Schaltungskonzept
Abbildung 1. HAL-Konzept - Verbinden wie elektrische Schaltkreise.

Abbildung 1 würde wie folgt in HAL-Code geschrieben:

net signal-blue    component.0.pin1-in      component.1.pin1-out
net signal-red     component.0.pin3-out     component.1.pin3-in     component.1.pin4-in

3.1. Teileauswahl

Der Maschinenbauer muss sich nicht darum kümmern, wie jedes einzelne Teil funktioniert. Er behandelt sie als Blackboxen. In der Konstruktionsphase entscheidet er, welche Teile er verwenden will - Stepper oder Servos, welche Marke von Servoverstärker, welche Art von Endschaltern und wie viele, usw. Die Entscheidung des Integrators, welche Komponenten er verwendet, basiert auf der Funktion der jeweiligen Komponente und den vom Hersteller des Geräts angegebenen Spezifikationen. Die Größe eines Motors und die Last, die er antreiben muss, beeinflussen die Wahl des Verstärkers, der für den Betrieb benötigt wird. Die Wahl des Verstärkers kann sich auf die Art der Rückkopplung auswirken, die der Verstärker benötigt, sowie auf die Geschwindigkeits- oder Positionssignale, die von einer Steuerung an den Verstärker gesendet werden müssen.

In der HAL-Welt muss der Integrator entscheiden, welche HAL-Komponenten benötigt werden. In der Regel wird für jede Schnittstellenkarte ein Treiber benötigt. Zusätzliche Komponenten können für die Software-Generierung von Schrittimpulsen, SPS-Funktionen und eine Vielzahl anderer Aufgaben erforderlich sein.

3.2. Verbindungsentwurf

Der Konstrukteur eines Hardwaresystems wählt nicht nur die Teile aus, er entscheidet auch, wie diese Teile miteinander verbunden werden. Jeder schwarze Kasten hat Anschlüsse, vielleicht nur zwei für einen einfachen Schalter oder Dutzende für einen Servoantrieb oder eine SPS. Sie müssen miteinander verdrahtet werden. Die Motoren werden mit den Servoverstärkern verbunden, die Endschalter mit der Steuerung und so weiter. Während der Maschinenbauer an der Konstruktion arbeitet, erstellt er einen großen Verdrahtungsplan, der zeigt, wie alle Teile miteinander verbunden werden sollen.

Bei der Verwendung von HAL werden die Komponenten durch Signale miteinander verbunden. Der Designer muss entscheiden, welche Signale benötigt werden und was sie verbinden sollen.

3.3. Implementierung

Sobald der Schaltplan fertig ist, kann die Maschine gebaut werden. Die Teile müssen beschafft und montiert werden, und dann werden sie entsprechend dem Schaltplan miteinander verbunden. In einem physischen System besteht jede Verbindung aus einem Stück Draht, das abgeschnitten und an die entsprechenden Klemmen angeschlossen werden muss.

HAL bietet eine Reihe von Werkzeugen, die beim "Aufbau" eines HAL-Systems helfen. Mit einigen dieser Werkzeuge können Sie einen einzelnen "Draht" anschließen (oder abziehen). Andere Werkzeuge ermöglichen es Ihnen, eine vollständige Liste aller Teile, Drähte und anderer Informationen über das System zu speichern, so dass es mit einem einzigen Befehl "neu aufgebaut" werden kann.

3.4. Testen

Nur sehr wenige Maschinen funktionieren beim ersten Mal richtig. Bei der Prüfung kann der Konstrukteur ein Messgerät verwenden, um zu sehen, ob ein Endschalter funktioniert, oder um die Gleichspannung an einem Servomotor zu messen. Er kann ein Oszilloskop anschließen, um die Einstellung eines Antriebs zu überprüfen oder um nach elektrischen Störungen zu suchen. Vielleicht findet er ein Problem, das eine Änderung des Schaltplans erfordert; vielleicht muss ein Teil anders angeschlossen oder durch etwas völlig anderes ersetzt werden.

HAL bietet die Software-Äquivalente eines Voltmeters, Oszilloskops, Signalgenerators und anderer Werkzeuge, die zum Testen und Abstimmen eines Systems benötigt werden. Mit denselben Befehlen, die zum Aufbau des Systems verwendet werden, können auch Änderungen vorgenommen werden.

3.5. Zusammenfassung

Dieses Dokument richtet sich an Personen, die bereits wissen, wie man diese Art von Hardware-Systemintegration durchführt, die aber nicht wissen, wie man die Hardware mit LinuxCNC verbindet. Siehe den Abschnitt Remote Start Example in der HAL UI Examples Dokumentation.

Remote-Start-Beispiel (Schema)
Abbildung 2. Remote-Start-Beispiel (Schema)

Das oben beschriebene traditionelle Hardware-Design endet am Rande der Hauptsteuerung. Außerhalb der Steuerung befinden sich eine Reihe relativ einfacher Kästen, die miteinander verbunden sind, um das zu tun, was erforderlich ist. Im Inneren ist die Steuerung ein großes Rätsel - eine riesige schwarze Box, von der wir hoffen, dass sie funktioniert.

HAL erweitert diese traditionelle Hardware-Design-Methode auf das Innere der großen Blackbox. Es macht Gerätetreiber und sogar einige interne Teile des Controllers zu kleineren Black Boxes, die miteinander verbunden und sogar ersetzt werden können, genau wie die externe Hardware. So kann der "Systemschaltplan" einen Teil des internen Steuergeräts zeigen und nicht nur eine große Blackbox. Und, was am wichtigsten ist, es ermöglicht dem Integrator, den Controller mit denselben Methoden zu testen und zu modifizieren, die er auch für den Rest der Hardware verwenden würde.

Begriffe wie Motoren, Ampere und Encoder sind den meisten Maschinenintegratoren vertraut. Wenn wir über die Verwendung eines besonders flexiblen, achtadrigen, abgeschirmten Kabels sprechen, um einen Drehgeber mit der Servo-Eingangsplatine im Computer zu verbinden, versteht der Leser sofort, worum es sich handelt, und wird zu der Frage geführt, "welche Arten von Steckern ich für die beiden Enden benötige". Die gleiche Art von Denken ist für das HAL wesentlich, aber der spezifische Gedankengang braucht vielleicht ein bisschen, um auf den richtigen Weg zu kommen. Die Verwendung von HAL-Wörtern mag anfangs etwas seltsam erscheinen, aber das Konzept, von einer Verbindung zur nächsten zu arbeiten, ist dasselbe.

Diese Idee, den Schaltplan auf das Innere des Controllers auszudehnen, ist das eigentliche Anliegen von HAL. Wenn Sie mit der Idee, Hardware-Blackboxen miteinander zu verbinden, vertraut sind, werden Sie wahrscheinlich wenig Probleme haben, HAL für die Verbindung von Software-Blackboxen zu verwenden.

4. HAL-Konzepte

Dieser Abschnitt ist ein Glossar, in dem die wichtigsten HAL-Begriffe definiert werden. Er unterscheidet sich jedoch etwas von einem herkömmlichen Glossar, da die Begriffe nicht in alphabetischer Reihenfolge angeordnet sind. Sie sind nach ihrer Beziehung oder ihrem Fluss in der HAL-Welt geordnet.

Komponente

Wenn wir über Hardware-Design sprechen, bezeichnen wir die einzelnen Teile als Teile, Bausteine, Black Boxes usw. Das HAL-Äquivalent ist eine Komponente oder HAL-Komponente. In diesem Dokument wird der Begriff "HAL-Komponente" verwendet, wenn eine Verwechslung mit anderen Arten von Komponenten wahrscheinlich ist, aber normalerweise wird nur "Komponente" verwendet. Eine HAL-Komponente ist ein Stück Software mit genau definierten Eingängen, Ausgängen und Verhalten, das installiert und nach Bedarf miteinander verbunden werden kann. ++ Viele HAL-Komponenten modellieren das Verhalten eines greifbaren Teils einer Maschine, und ein Pin kann tatsächlich mit einem physischen Pin des Geräts verbunden werden, um mit ihm zu kommunizieren, daher die Namen. In den meisten Fällen ist dies jedoch nicht der Fall. Stellen Sie sich eine Nachrüstung einer manuellen Drehmaschine/Fräse vor. Was LinuxCNC implementiert, ist die Art und Weise, wie sich die Maschine der Außenwelt präsentiert, und es ist sekundär, ob die Implementierung, wie man einen Kreis zeichnet, bereits auf der Maschine implementiert ist oder von LinuxCNC bereitgestellt wird. Und es ist üblich, Knöpfe zur imaginären Nachrüstung hinzuzufügen, die eine Aktion signalisieren, wie ein Notaus. LinuxCNC und die Maschine werden eins. Und das ist durch den HAL.

Parameter

Viele Hardwarekomponenten verfügen über Einstellmöglichkeiten, die nicht mit anderen Komponenten verbunden sind, auf die aber dennoch zugegriffen werden muss. Zum Beispiel haben Servoverstärker oft Trimmpotis, mit denen sie eingestellt werden können, und Testpunkte, an denen ein Messgerät oder Oszilloskop angeschlossen werden kann, um die Ergebnisse der Einstellung zu überprüfen. Auch HAL-Komponenten können solche Elemente haben, die als "Parameter" bezeichnet werden. Es gibt zwei Arten von Parametern: Eingangsparameter entsprechen Trimmpotentiometern - es handelt sich um Werte, die vom Benutzer eingestellt werden können und nach der Einstellung fest bleiben. Ausgangsparameter können nicht vom Benutzer eingestellt werden - sie entsprechen Testpunkten, mit denen interne Signale überwacht werden können.

Pin

Hardware-Komponenten haben Anschlüsse, über die sie miteinander verbunden werden. Das HAL-Äquivalent ist ein "Pin" oder "HAL-Pin". Der Begriff "HAL-Pin" wird verwendet, wenn es nötig ist, um Verwechslungen zu vermeiden. Alle HAL-Pins sind benannt, und die Pin-Namen werden verwendet, wenn sie miteinander verbunden werden. HAL-Pins sind Software-Entitäten, die nur innerhalb des Computers existieren.

Physikalischer Pin (engl. physical pin)

Viele E/A-Geräte haben echte physische Pins oder Anschlüsse, die mit externer Hardware verbunden sind, z. B. die Pins eines Parallelport-Anschlusses. Um Verwirrung zu vermeiden, werden diese als "physische Pins" bezeichnet. Dies sind die Dinge, die in die reale Welt hineinragen.

Anmerkung

Sie werden sich vielleicht fragen, welche Beziehung zwischen den HAL_pins, physical_pins und externen Elementen wie Encodern oder einer STG-Karte besteht: Wir haben es hier mit Schnittstellen vom Typ Datenübersetzung/-umwandlung zu tun.

Signal

In einer physischen Maschine sind die Anschlüsse der realen Hardwarekomponenten durch Drähte miteinander verbunden. Das HAL-Äquivalent eines Drahtes ist ein "Signal" oder "HAL-Signal". HAL-Signale verbinden HAL-Pins miteinander, wie vom Maschinenbauer gewünscht. HAL-Signale können nach Belieben abgetrennt und wieder angeschlossen werden (sogar während die Maschine läuft).

Typ

Bei der Verwendung echter Hardware würden Sie einen 24 Volt Relaisausgang nicht an den +/-10 V Analogeingang eines Servoverstärkers anschließen. Für HAL-Pins gelten die gleichen Einschränkungen, die auf ihrem Typ basieren. Sowohl Pins als auch Signale haben Typen, und Signale können nur an Pins desselben Typs angeschlossen werden. Derzeit gibt es 4 Typen, wie folgt:

  • bit - ein einzelner TRUE/FALSE- oder ON/OFF-Wert

  • float - eine 64-Bit-Fließkommazahl mit einer Auflösung von etwa 53 Bit und einem Dynamikbereich von über 1000 Bit.

  • u32 - eine 32-Bit-Ganzzahl ohne Vorzeichen, zulässige Werte sind 0 bis 4.294.967.295

  • s32 - eine 32-Bit-Ganzzahl mit Vorzeichen, zulässige Werte sind -2.147.483.648 bis +2.147.483.647

  • u64 - eine 64-Bit-Ganzzahl ohne Vorzeichen, zulässige Werte sind 0 bis 18.446.744.073.709.551.615

  • s64 - eine 64-Bit-Ganzzahl mit Vorzeichen, zulässige Werte sind -9.223.372.036.854.775.808 bis +9.223.372.036.854.775.808

Funktion

Echte Hardwarekomponenten reagieren in der Regel sofort auf ihre Eingänge. Wenn sich beispielsweise die Eingangsspannung eines Servoverstärkers ändert, dann ändert sich automatisch auch der Ausgang. Softwarekomponenten können jedoch nicht "automatisch" handeln. Jede Komponente verfügt über einen spezifischen Code, der ausgeführt werden muss, um das zu tun, was die Komponente tun soll. In einigen Fällen wird dieser Code einfach als Teil der Komponente ausgeführt. In den meisten Fällen jedoch, insbesondere bei Echtzeitkomponenten, muss der Code in einer bestimmten Reihenfolge und in bestimmten Abständen ausgeführt werden. So sollten beispielsweise Eingaben gelesen werden, bevor Berechnungen mit den Eingabedaten durchgeführt werden, und Ausgaben sollten erst dann geschrieben werden, wenn die Berechnungen abgeschlossen sind. In diesen Fällen wird der Code dem System in Form von einer oder mehreren "Funktionen" zur Verfügung gestellt. Jede Funktion ist ein Codeblock, der eine bestimmte Aktion ausführt. Der Systemintegrator kann "Threads" verwenden, um eine Reihe von Funktionen zu planen, die in einer bestimmten Reihenfolge und in bestimmten Zeitabständen ausgeführt werden sollen.

Thread

Ein "Thread" ist eine Liste von Funktionen, die in bestimmten Zeitabständen als Teil einer Echtzeitaufgabe ausgeführt werden. Wenn ein Thread zum ersten Mal erstellt wird, hat er ein bestimmtes Zeitintervall (Periode), aber keine Funktionen. Funktionen können dem Thread hinzugefügt werden, um diese bei jeder Ausführung des Threads der Reihe nach auch auszuführen.

Angenommen, wir haben eine Parport-Komponente mit dem Namen hal_parport. Diese Komponente definiert einen oder mehrere HAL-Pins für jeden physischen Pin. Die Pins werden im Dokumentabschnitt dieser Komponente beschrieben: Ihre Namen, wie sich jeder Pin auf den physischen Pin bezieht, ob sie invertiert sind, ob Sie die Polarität ändern können usw. Aber das allein bringt die Daten nicht von den HAL-Pins zu den physischen Pins. Es braucht Code, um das zu tun, und hier kommen Funktionen ins Spiel. Die Parport-Komponente benötigt mindestens zwei Funktionen: Eine, um die physischen Eingangspins zu lesen und die HAL-Pins zu aktualisieren, die andere, um Daten von den HAL-Pins zu nehmen und sie auf die physischen Ausgangspins zu schreiben. Beide Funktionen sind Teil des parport-Treibers.

5. HAL-Komponenten

Jede HAL-Komponente ist ein Stück Software mit genau definierten Eingängen, Ausgängen und Verhaltensweisen, das installiert und nach Bedarf miteinander verbunden werden kann. Der Abschnitt HAL Components List listet alle verfügbaren Komponenten und eine kurze Beschreibung ihrer Funktionen auf.

6. Timing-Probleme in HAL

Im Gegensatz zu den physikalischen Verdrahtungsmodellen zwischen Black Boxes, auf denen HAL, wie wir gesagt haben, basiert, reicht das einfache Verbinden zweier Pins mit einem HAL-Signal bei weitem nicht aus, um die Wirkung des physikalischen Falles zu erreichen.

Echte Relaislogik besteht aus miteinander verbundenen Relais, und wenn sich ein Kontakt öffnet oder schließt, fließt (oder stoppt) sofort Strom. Andere Spulen können ihren Zustand ändern usw., und das alles "passiert". In der SPS-Kontaktplanlogik funktioniert das jedoch nicht so. In der Regel wird in einem einzigen Durchlauf durch den Kontaktplan jede Sprosse in der Reihenfolge ausgewertet, in der sie erscheint, und zwar nur einmal pro Durchlauf. Ein perfektes Beispiel ist ein Kontaktplan mit einem Öffnerkontakt in Reihe mit einer Spule. Der Kontakt und die Spule gehören zum selben Relais.

Wäre dies ein herkömmliches Relais, würden sich die Kontakte öffnen, sobald die Spule erregt ist, und die Spule wieder abschalten. Das heißt, die Kontakte schließen sich wieder, usw. Das Relais wird zu einem Summton.

Wenn bei einer SPS die Spule ausgeschaltet und der Kontakt geschlossen ist, wenn die SPS mit der Auswertung des Strompfads beginnt, dann ist die Spule eingeschaltet, wenn sie diesen Durchgang beendet hat. Die Tatsache, dass das Einschalten der Spule den Kontakt öffnet, der sie speist, wird bis zum nächsten Durchgang ignoriert. Beim nächsten Durchgang sieht die SPS, dass der Kontakt geöffnet ist, und schaltet die Spule ab. Das Relais schaltet also immer noch schnell zwischen Ein und Aus um, allerdings in einem Rhythmus, der davon abhängt, wie oft die SPS den Stromkreis auswertet.

In HAL ist die Funktion der Code, der die Sprosse(n) auswertet. In der Tat exportiert die HAL-fähige Echtzeitversion von ClassicLadder eine Funktion, die genau das tut. In der Zwischenzeit ist ein Thread derjenige, der die Funktion in bestimmten Zeitintervallen ausführt. Genauso wie Sie wählen können, ob eine SPS alle 10&8239;ms oder jede Sekunde alle Sprossen auswerten soll, können Sie HAL-Threads mit unterschiedlichen Zeitabständen definieren.

Was einen Thread von einem anderen unterscheidet, ist "nicht" das, was der Thread tut - das wird dadurch bestimmt, welche Funktionen mit ihm verbunden sind. Der eigentliche Unterschied ist einfach, wie oft ein Thread läuft.

In LinuxCNC könnten Sie einen 50 µs Thread und einen 1 ms Thread haben. Diese würden basierend auf BASE_PERIOD und SERVO_PERIOD erstellt werden, die tatsächlichen Zeiten hängen von den Werten in Ihrer INI-Datei.

Der nächste Schritt ist zu entscheiden, was jeder Thread zu tun hat. Einige dieser Entscheidungen sind die gleichen in (fast) jeder LinuxCNC-System. Zum Beispiel wird motion-command-handler immer Servo-thread hinzugefügt.

Andere Verbindungen werden vom Integrator hergestellt. Dazu könnte gehören, dass die Encoder-Lese- und DAC-Schreibfunktionen des STG-Treibers mit dem Servo-Thread verbunden werden, oder dass die Stepgen-Funktion mit dem Base-Thread verbunden wird, zusammen mit der/den Parport-Funktion(en), um die Steps in den Port zu schreiben.