LinuxCNC is about interacting with hardware. But few users have the same exact hardware specifications - similar, but not the same. And even for the exact same hardware, there may be different ways to use it, say for different materials or with different mills, which would require adaptations to the control of an already running system. An abstraction was needed to make it easier to configure LinuxCNC for a wide variety of hardware devices. At the highest level, it could simply be a way to allow a number of building blocks to be loaded and interconnected to assemble a complex system.
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
The Hardware Abstraction Layer (or with a reference to the 2001 Space Odyssey movie just "HAL") is a software to
-
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
-
einen Schrittmotor dazu zu bewegen, einen weiteren Schritt zu machen
-
die von einem Encoder angezeigte Position auslesen.
-
-
mit einer niedrigeren Frequenz pro Millisekunde (ms), z.B. um
-
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
-
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.
-
-
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.
-
-
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.
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.
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.
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 System Design
.HAL is based on traditional system design techniques.
HAL is based on the same principles that are used to design hardware circuits and systems, so it is useful to examine those principles first. Any system, including a CNC machine, consists of interconnected components. For the CNC machine, those components might be the main controller, servo amps or stepper drives, motors, encoders, limit switches, pushbutton pendants, perhaps a VFD for the spindle drive, a PLC to run a toolchanger, etc. The machine builder must aselect, mount and wire these pieces together to make a complete system.
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. Werkstück Auswahl
The machine builder does not need to worry about how each individual part works. He treats them as black boxes. During the design stage, he decides which parts he is going to use - steppers or servos, which brand of servo amp, what kind of limit switches and how many, etc. The integrator’s decisions about which specific components to use is based on what that component does and the specifications supplied by the manufacturer of the device. The size of a motor and the load it must drive will affect the choice of amplifier needed to run it. The choice of amplifier may affect the kinds of feedback needed by the amp and the velocity or position signals that must be sent to the amp from a control.
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. Design der Verbindungen (engl. interconnections)
The designer of a hardware system not only selects the parts, he also decides how those parts will be interconnected. Each black box has terminals, perhaps only two for a simple switch, or dozens for a servo drive or PLC. They need to be wired together. The motors connect to the servo amps, the limit switches connect to the controller, and so on. As the machine builder works on the design, he creates a large wiring diagram that shows how all the parts should be interconnected.
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
Once the wiring diagram is complete it is time to build the machine. The pieces need to be acquired and mounted, and then they are interconnected according to the wiring diagram. In a physical system, each interconnection is a piece of wire that needs to be cut and connected to the appropriate terminals.
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
Very few machines work right the first time. While testing, the builder may use a meter to see whether a limit switch is working or to measure the DC voltage going to a servo motor. He may hook up an oscilloscope to check the tuning of a drive, or to look for electrical noise. He may find a problem that requires the wiring diagram to be changed; perhaps a part needs to be connected differently or replaced with something completely different.
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
This document is aimed at people who already know how to do this kind of hardware system integration, but who do not know how to connect the hardware to LinuxCNC. See the Remote Start Example section in the HAL UI Examples documentation.
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
This section is a glossary that defines key HAL terms but it is a bit different than a traditional glossary because these terms are not arranged in alphabetical order. They are arranged by their relationship or flow in the HAL way of things.
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.
Physischer Pin (Steckkontakt):: Viele E/A-Geräte haben echte physische Pins oder Anschlüsse, die mit externer Hardware verbunden sind, z. B. die einzelnen Steckkontakte eines Parallelport-Anschlusses. Um Verwirrung zu vermeiden, werden diese als "physische Pins" (engl. physical pins) bezeichnet. Dies sind die Dinge, die in die reale Welt hineinragen.
|
Note
|
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
Each HAL component is a piece of software with well-defined inputs, outputs, and behavior, that can be installed and interconnected as needed. The section HAL Components List lists all available components and a brief description of what each does.
6. Timing-Probleme in HAL
Unlike the physical wiring models between black boxes that we have said that HAL is based upon, simply connecting two pins with a HAL-signal falls far short of the action of the physical case.
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.