Inhalt - Fräsen mit EMC
EMC 2 und HAL (Hardware-Abstraction-Layer) -Bausteine
 
Mit HAL können aber nicht nur Verbindungen zwischen Modulen hergestellt werden, sondern es ist außerdem auch möglich Bausteine in die Verbindungen einzufügen. Diese Bausteine können Diverse Funktionen erfüllen. Logische Bausteine wie UND und ODER Verknüpfungen, stehen ebenso zur Wahl wie Zeitverzögerungsbausteine, Multiplexer, Vergleicher usw.  Diese Bausteine können im Prinzip genauso angewendet werden wie Module, sie haben Ein- und Ausgange und zugehörige Typen.
Eine grobe Übersicht von Bausteinen gibt es in der Integrators Manual ab Seite 69. Details zur Funktion, zu den Verbindungstypen, Anzahl der Ein- und Ausgänge bekommt man in einerm sogenannten Terminal. Gibt man hier nach dem starten z.B. "man and2" ein wird die User Manual für den and2 Baustein angezeigt..
Im unterschied zu den Modulen die ja in EMC bereits vorhanden sind, müssen die Bausteine und deren Anzahl beim starten erst einmal festgelegt werden.
Als einfaches Beispiel nehme ich mir vor das ich über meinen bereits bekannten parallelport eine grüne Lampe steuern möchte, die mir sagen soll ob schon ein Referenzfahrt durchgeführt wurde.
Das erste was ich dafür brauche ist eine Idee wie ich das mit den HAL-Bausteinen umsetzen kann und ob es irgendwelche sinnvollen Anschlüsse an EMC's Modulen für mich gibt. Beim durchsuchen der Pins des Moduls Axis auf der Seite 46 in den Integrators Manual, finde ich die Pins axis.N.homed mit der Erklärung das es sich um ein bit Ausgang handelt. Ich bin mir allerdings nicht sicher ob diese Ausgänge am Modul auch das tun was ich denke was sie tun. Daher öffne ich EMC und wähle im Menü "Machine" den Eintrag "HAL-Meter".


HAL-Meter
Mit dem HAL-Meter kann ich alle Pins, Signale, Baustein Ein-und Ausgänge usw messen. Bin ich mir wie jetzt grade nicht ganz sicher was ich von einem Pin zu erwarten habe oder möchte gerne Details über einen Fehler erfahren kann mir das HAL-Meter gute dienste erweisen. Mit dem Knöpfchen "Select" wähle ich meinen Pin, axis.0.homed aus und bekomme "False" (aus oder 0) angezeigt. Führe ich eine Referenzfahrt durch, wechselt der Wert von "False" zu "True" (ein oder 1), ich stelle also fest ich hab wiedermal gefunden was ich suchte.

Das nächste was ich brauche ist eine Idee wie ich diese Pins nutzen kann um eine grüne Lampe damit einzuschalte. Ich könnte auf die Idee kommen einfach alle drei Pins axis.0. , .1. und .2. mit dem paralellport Ausgang zu verbinden. Wenn allerdings die erste Achse schon mit der Fahrt fertig wäre würde diese Verbindung zwar den Zustand True oder 1 haben, die anderen beiden wären aber noch False oder 0, der paralellport wüsste überhaupt nicht was ich von ihm will und würde vielleicht explodieren und einen riesigen Krater in die Ortschaft sprengen. Dieses Risiko möchte ich nicht eingehen und habe folgende alternative Idee:


Ich benutze einfach zwei UND-Verknüpfungen. Zuerst muss EMC dafür von mir wissen das ich zwei UND-Bausteine benutzen möchte was ich ihm wie folgt verklickere:

loadrt and2 count=2

Der Wert hinter count gibt an wieviele der Bausteine ich benötige, HAL veranlasst dann selbstständig die Nummerrierung der Bausteine beginnend mit Null wie sie im Bild oben zu sehen ist. Der loadrt Befehl fügt die Bausteine unserem HAL-Pogramm hinzu und sollte für jede Bausteingruppe nur einemal vorhanden sein. Würde ich beispielsweise auf der nächsten Seite des HAL-Pogrammes für eine weitere Idee wieder zwei UND-Bausteine benötigen, dann sollte der Befehl dort nicht erneut stehen. Stattdessen wandelt man den ersten loadrt-Befehl ab indem die 2 einfach durch eine 4 ersetzt wird.
Damit die Werte am Eingang immer wieder kontrolliert und der Wert am Ausgang dann evtl. verändert wird, muss der Baustein fortwährend aufgerufen werden. EMC hat für diesen Zweck zwei sogenannte threads. Allen Bausteinen die in so einem thread eingetragen sind, wiederfährt genau dies, sie werden immer wieder aufgerufen. Der erste thread nennt sich base-thread und dient der Abarbeitung von sehr zeitkritischen Prozessen, wie z.B. die Schritterzeugung für die Schrittmotoren. Um diese Prozesse nicht zu "stören" sollte dieser thread für eigene Ideen gemieden werden. Besser und mehr als ausreichend sind die eigenen Ideen im so genannten servo-thread untergebracht.
Gesagt, getan, ab in den servo-thread mit den UND-Bausteinen:

addf and2.0 servo-thread
addf and2.1 servo-thread

Die UND-Verknüpfung gehört nicht dazu, aber es gibt Bausteine die außerdem die Möglichkeit bieten einige Einstellungen zu verändern. Möchte man z.B. mit einem Zeit-Verzögerungs-Baustein arbeiten, so nennt sich dieser timedelay. Um zu sehen welche Optionen der Baustein zu bieten hat geben wir, genau wie beim and2-Baustein den Befehl "man timedelay" in einem Terminal ein und sehen dort das der Parameter für die Verzögerungszeit mit on-delay bezeichnet ist.
Zum ändern dieses Parameters auf den Wert 5,5 Sekunden, wäre folgende Zeile erforderlich:

setp timedelay.0.on-delay 5.5
Der Befehl "setp" gibt an das wir eine Parameter ändern wollen, der Wert 5,5 wird einfach hinten dran gehängt. Wichtig bei den Zahlenwerten ist allerdings das hier ein Punkt statt Komma stehen muss.
Der letzte Schritt um unsere Idee umzusetzen besteht nun nur noch darin es als Ganzes aufzuschreiben, die Bezeichnung der Ein- und Ausgänge die ich zum verbinden der Bausteine brauche bekomme ich wie schon beschrieben aus meinem Terminal. Die Namen der Signale habe ich im Bild oben bereits willkürlich festgelegt.
Und so sieht das fertige Programm aus:

loadrt and2 count=2

addf and2.0 servo-thread
addf and2.1 servo-thread

net lampe1 axis.0.homed and2.0.in0
net lampe2 axis.1.homed and2.0.in1
net lampe2 axis.2.homed and2.1.in1
net lampe4 and2.0.out and2.1.in0
net lampe5 and2.1.out parport.0.pin-17-out



Um das Programm bei jedem start von EMC auszuführen fügt man die geschriebene Zeilen in die markierte Datei ein und freut sich von da an über ein grünes Lämpchen das nach der Referenzfahrt eingeschaltet wird.

Allein mit dieser Hand voll mit Informationen ist es mögich sehr viele Ideen umzusetzen, für "Spezialfälle und Extrawürstchen" kann die Doku ab Seite 69 zu Rate gezogen werden.
Ein Nachteil von HAL soll hier allerdings auch nicht unerwähnt bleiben. Es gibt leider keine passende grafische Darstellung der erstellten HAL-Pogramme, die Übersicht kann dadurch schon bei wenigen Progammteilen leiden. Um das eigene Köpfchen nicht zu sehr zu strapazieren empfehle ich dringend sich die erstellten Programmchen kurz mit Bleistift und Razzefummel aufzukritzeln. Das erstellen eines Pogrammes anhand einer Skizze mit Signal- und Bausteinbezeichnungen ist grob geschätzt 463.869.264.583.456 mal einfacher als sich alles im Köpfchen zu merken. Es kommt außerdem auch immer mal wieder vor das man nach zwei Wochen des Ruhens den Einfall bekommt noch schnell eine Kleinigkeit zu ändern, was durch soche skizzen ebenfalls weit einfacher möglich ist.
MDI-Commands

Eine Spezialität des Hauses möchte ich noch mit auf den Weg geben, die da heißt: MDI-Commands. Mit diesen putzigen Gefährten können G-Code Befehle direkt durch HAL Befehle ausgeführt werden.
Und so gehts:

Zuerst benötigt man einen Zusatz in der ini-Datei, der in die Rubrik [HAL] eingetragen wird:

HALUI=halui

Danach kommen die G-Code Befehle die man ausführen möchte in die Rubrik [HALUI] die man wahrscheinlich noch hinzufügen muss:

[HALUI]
MDI_COMMAND = G0 X0 Y0
MDI_COMMAND = G0 X100 Y100
...

Zu den Komandos wird beim starten von EMC2 ein HAL-Pin erstellt. Die Komandos werden dabei einfach durchnummerriert beginnend mit der Ziffer Null. Die HAL-Pin Bezeichnung lautet dann wie folgt:

halui.mdi-command-00          (bit, in) für G0 X0 Y0
halui.mdi-command-01          (bit, in) für G0 X100 Y100

Auf diese Weise können bis zu 64 Komandos erstellt werden.
 
>EMC2 Was brauche ich?<
>EMC2 testen<
>EMC2 installieren<
>EMC2 Stepcon Wizard<
>EMC2 Optionen<
>EMC2 HAL-Verbindungen<
>EMC2 HAL-Bausteine<
>EMC2 Python<
>EMC2 o-Words<