
Anfangs wollte ich mich auf zwei Beiträge (
eins ,
zwei ) zu meinen CNC-Experimenten beschränken. Aber das Thema hat sich für viele als interessant erwiesen, deshalb enthülle ich es immer noch ein wenig. In diesem Beitrag werden wir über das Schreiben von hausgemachter Software zur Steuerung der Amateur-CNC sprechen.
Vorwort
Ich weiß nicht, ob ich es geschafft habe, jemanden mit den ersten Beiträgen zu motivieren, aber einige Kommentare, die ich selbst gemacht habe, haben gute Denkanstöße gegeben.
Besonderer Dank geht an
@evilruff für das Foto seines
Labors und für das Video mit einem
coolen Koreaner . Nachdem ich beide gesehen hatte, schien mein Handschuhfach im Keller nicht mehr so gemütlich zu sein.
Am Wochenende sammelte er seine Kräfte, brachte etwas mit, das vage an Ordnung erinnerte, und tat schließlich zwei Dinge, die er vor einem halben Jahr tun würde.
Zunächst ersetzte er ein Stück Sperrholz, das als Opfertisch diente. Ich habe dieses Sperrholz vom Moment des Kaufs der Maschine an verwendet, Rohlinge mit Schrauben daran festgeschraubt und alle möglichen verrückten Designs aus Stöcken und Keilen konstruiert. Alles, damit das Teil beim Fräsen keinen unvorhersehbaren Flug nimmt.
Vielleicht braucht jemand einen Life-Hack: Sie haben einen neuen Tisch aus einem Plastikdeckbrett gemacht (verkauft in Castorama):

Er schraubte die Bretter direkt an den Aluminiumtisch. Der Bonus waren praktische Rillen für die Klemmen des Werkstücks und die schnelle Installation des Füllertisches. Alles an allem dauerte ein paar Stunden und ~ 1100r.
Und zweitens schrieb er schließlich mehr oder weniger verwendbare Software für die Verwaltung nicht standardmäßiger CNC-Funktionen. Dies wird die Hauptgeschichte sein.
Erklärung des Problems
Der G-Code für die im
zweiten Teil beschriebenen Operationen
ist der einfachste. Der Setup-Vorgang selbst kann jedoch nicht schnell aufgerufen werden.
Wie ist das passiert?
Für das Additiv war es beispielsweise erforderlich, die Breite des Paneels zu kennen, die Anzahl der Löcher zu berechnen, den genauen Abstand zwischen ihnen zu berechnen, eine Datei zu erstellen, G-Code zu schreiben und in Mach3 zu laden. All dies dauert bestenfalls etwa 15 bis 20 Minuten. Vor diesem Hintergrund sind die Vorteile einer digitalen Maschine im Vergleich zu einem Handwerkzeug, das gleichzeitig eine ganze Reihe von Löchern bilden kann, erheblich geringer.
Was ich bekommen wollte
Im Fall des gleichen Additivs wollte ich ein Programm erhalten, bei dem ich in einer sehr einfachen Oberfläche die Breite und Dicke der Platte eingeben und die Taste drücken würde, um den Vorgang des Bohrens der gewünschten Anzahl von Fülllöchern im gleichen Abstand voneinander zu starten.
Suche nach einer Lösung
Das erste, was mir in den Sinn kam, war das Schreiben eines autonomen Programms, das direkt mit einem parallelen Port interagieren würde. Ein kurzes Googeln zeigte, dass die Aufgabe, an lpt zu schreiben, ziemlich lösbar ist, aber der Teufel versteckt sich, wie Sie wissen, im Detail. Als ich mich weiter mit dem Thema befasste, wurde mir klar, dass man hier ernsthaft und lange stecken bleiben kann. Darüber hinaus wäre eine solche Lösung nicht flexibel: Für eine andere Maschine, beispielsweise mit USB, würde sie nicht funktionieren.
Es gab eine Option für das Mach3 SDK. Beim Sammeln von Informationen über die Erstellung von Mach-Plugins bin ich auf eine interessante Lösung gestoßen. Es wurde beschrieben, wie Sie mit OLE-Mechanismen Mach3 aus einer Drittanbieteranwendung ziehen können. Ich bin kein Experte für Microsoft-Technologien, aber nachdem ich die Diagonale des Handbuchs im Mach3 SDK gelesen habe und die Hauptidee richtig verstanden habe, gibt es keine Silberkugel. Die Plugins verwenden dieselben öffentlichen Methoden für Mach3 COM-Objekte. Ich wollte die Mach3-Oberfläche nicht neu zeichnen, daher bestand der einzige Unterschied für den Benutzer zwischen dem Plugin und der eigenständigen Anwendung darin, dass auf das Plugin über das Mach3-Menü und die Anwendung über das Symbol auf dem XP-Desktop zugegriffen werden kann.
Eine gesonderte Bewerbung erschien mir vorzuziehen. In diesem Fall könnte ich theoretisch mein Programm sofort nach dem Laden des Computers starten, wodurch Mach3 mit einer Dampflokomotive geladen würde (anstatt zuerst Mach3 zu laden und dann in dessen Menü zu graben, um das Plug-In zu starten).
Nimm einen Säbel
Das letzte Mal, dass ich eine native Desktop-Anwendung für Windows schreiben musste, war in einem Jahr, 2006, und es war in Delphi. Seitdem haben mich Webtechnologien mit ihrem Linux völlig verzehrt. Daher hatte ich jetzt keine besonderen Vorlieben, in welcher Sprache ich ein Windows-Programm gestalten sollte. Das gefundene einfache Beispiel wurde in C # geschrieben, diese Sprache wurde als experimentelles Kaninchen gewählt.
Ich werde hier nicht den gesamten Code der resultierenden Anwendung veröffentlichen (wenn Sie möchten, können Sie ihn auf github über den Link unten im Beitrag finden). Ich werde die grundlegenden Dinge erklären. Alle Experimente habe ich auf einer virtuellen Maschine mit WinXP SP3, VS 2003 und Mach3 Version R3.043.062 durchgeführt. Für diejenigen, die glauben, dass es besser ist, den
Link zum Video auf Youtube einmal zu sehen, was ich verstanden habe. Unten finden Sie eine Abschrift der Highlights.
Vorbereitung
- Damit Visual Studio die Mach3-Komponente ordnungsgemäß abrufen kann, muss sie ordnungsgemäß in der Registrierung registriert sein. Laden Sie dazu die Datei Mach3Registry.reg herunter
- Starten Sie Mach3Registry.reg
- Wir starten VS, wir erstellen das Projekt einer Fensteranwendung in C #
- Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Referenzen, und wählen Sie im Menü die Option Referenz hinzufügen aus. Klicken Sie im folgenden Fenster auf Durchsuchen und suchen Sie nach Mach3.exe

Wenn alles korrekt ist, sollte eine Zeile in der Referenzliste erscheinen, wer hätte gedacht, Mach4 ... - 5. Zeichnen Sie als Nächstes die Benutzeroberfläche, legen Sie die Handler auf, implementieren Sie die Algorithmen ...
Interaktion mit Mach3
Wir verbinden die notwendigen Bibliotheken, deklarieren Variablen (Form1.cs)
... using System.Runtime.InteropServices; using Mach4;
Verwendung:
GetMachInstance();
Die Codes der Schaltflächen und Parameterwerte können im Wiki
angezeigt werden :
OEM_DROs und
OEM_Buttons (sie haben kein Wiki, Parameterwerte werden nicht in der Tabelle angezeigt, ich habe mir die Registerkarte "Quelltext anzeigen" angesehen).
Die erste Version des Programms funktionierte folgendermaßen: Gemäß den eingestellten Parametern wurde ein G-Code generiert, der Frame für Frame (d. H. Zeile für Zeile) von der Methode
_mInst.Code ausgeführt wurde. Und das war mein Fehler. In einer Debugging-Umgebung auf einer virtuellen Maschine funktionierte alles einwandfrei. In Mach3 liefen die richtigen Zahlen in den Koordinaten. Bei der Übertragung auf einen Computer gab es jedoch Probleme. Der Schlitten bewegte sich korrekt, aber die Spindel ließ sich nicht einschalten.
Es scheint, dass die Verwaltung des Routers und der Spindel in Mach in verschiedenen Threads funktioniert. Es stellte sich heraus, dass die Bewegungsbefehle (G ...) nacheinander ausgeführt wurden, als sie in einem Thread in die _mInst.Code-Methode eingingen, und die Spindelsteuerbefehle (M3, M5) unabhängig vom ersten in einem anderen Thread ausgeführt wurden. Infolgedessen wurde die Spindel eingeschaltet (M3) und sofort ausgeschaltet (M5), während die Bewegung des Wagens ihren normalen Verlauf nahm.
Ich habe verschiedene Optionen ausprobiert, Verzögerungen verbunden, versucht, das gesamte G-Code-Steuerelement in eine Zeile zu bringen und es in einem Stück an _mInst.Code zu senden. Infolgedessen habe ich mich für die Lösung „auf der Stirn“ entschieden: Ich treibe einfach den generierten Code in eine Datei, öffne diese Datei programmgesteuert in Mach3 und drücke dort programmgesteuert die Schaltfläche „Start“. Ausschnitt aus dem Arbeitscode:
_mInst.LoadFile("C:\\tmp\\gcode.txt"); System.Threading.Thread.Sleep(2000); _mInst.DoOEMButton(1000);
Damit Mach die Datei öffnen kann, ist eine Pause zwischen dem Herunterladen einer Datei und dem Drücken einer Taste erforderlich. Vielleicht gibt es einen eleganteren Weg. Wenn jemand weiß, schreibe in die Kommentare.
Ein zusätzlicher Vorteil dieser Lösung ist, dass Sie jetzt die Visualisierung des Verarbeitungsprozesses in der Mach-Oberfläche beobachten können.
Was letztendlich passiert ist
Kurz gesagt, über die resultierende Anwendung. Separat werde ich für jede Operation über die Benutzeroberfläche sprechen.
Schneiden

Hier ist alles ziemlich transparent. Der Parameter S wird benötigt, um die Größe L zu kompensieren, wenn das Werkstück nicht am Nullpunkt entlang X (oder entlang Y beim Schneiden) fixiert ist.
Additiv
Für Additive sind 2 Snap-Konfigurationen möglich. Die erste mit einem Schleifer zum Bohren von Endlöchern. Und die zweite mit der üblichen Spindel zum Bohren in der Ebene des Schildes (aus irgendeinem Grund nannte ich sie „Frontaladditiv“).
Additive Gesicht

Beim Endadditiv ist es wichtig, in der unteren rechten Ecke des Werkstücks genau Null zu setzen (ich habe dort den Winkel des Seitenanschlags und des Tisches). Mit einem Bohrer auf Holz ist dies nicht schwierig - es gibt eine scharfe Spitze, die Sie benötigen, um in diese Ecke zu gelangen. Ich befestige das Werkstück auf dem Tisch und lege es einfach in den Bohrer.
Ohne die Ausrüstung auf die gleiche Weise zu verändern, mache ich wechselseitige Löcher, indem ich das Werkstück vertikal befestige:
Parameter X wird benötigt, um Paneele unterschiedlicher Breite zu verbinden (z. B. wenn die unteren und oberen Paneele des Schranks um die Dicke der Türen breiter als die Seitenpaneele sind).
Frontalzusatz

Die Ausrüstung für die Front ist eine normale Spindel. Diese Art von Additiv wird verwendet, wenn Sie Löcher in eine horizontale Oberfläche bohren müssen, nicht nur entlang der Kanten, sondern auch irgendwo in der Mitte. Wenn sich beispielsweise mehrere Fächer im Schrank befinden und neben den Seitenwänden auch interne. Wenn die Platte länger als die Länge der Maschine ist, kann das Additiv in 2 Sätzen mit einer 180-Grad-Drehung des Teils hergestellt werden. In diesem Fall ist auch Parameter X nützlich.
Drehen

Für mich bestand die Hauptschwierigkeit bei der Erstellung eines G-Codes mit einem Wendepfad darin, ihn nicht mit der maximalen Eintauchtiefe der Platte zu übertreiben. Tatsache ist, dass am Ausgang von Inkscape eine Linie erhalten wird und das Wenden in einem Durchgang erfolgt. Aus diesem Grund musste ich einen separaten Code zum Zylindern des Werkstücks erstellen und erst danach wurde die Hauptpassage zum Erstellen des Formulars gestartet. Und es gab einige Einschränkungen für dieses Formular. Insbesondere musste sichergestellt werden, dass die Flugbahn nicht zu tief ging. Ich habe versucht, 10 - 15 mm vom Niveau des Originalzylinders nicht zu überschreiten.
Alle diese Probleme wurden im neuen Programm gelöst. Das funktioniert so: Laden Sie den von Inkscape erhaltenen „rohen“ G-Code, stellen Sie die Größe der Seite der Stange des Werkstücks ein und geben Sie die maximale Verarbeitungstiefe in 1 Durchgang an (je härter das Holz, desto geringer diese Tiefe). Basierend auf dem Quell-G-Code und den Parametern berechnet das Programm einen sicheren Pfad und sendet ihn an die CNC.
Zukunftspläne
Das Programm hat die Routine stark vereinfacht, ist aber noch lange nicht perfekt. Zunächst muss der Algorithmus zum Bohren tiefer Löcher optimiert werden (der Bohrer ist mit Spänen und Überhitzung verstopft, Sie müssen hin und her schwingen). Zweitens kam die Idee auf, eine Bibliothek mit Drehformen zu erstellen. Das heißt, Verschiedene Standardformen (z. B. Zylinder, Kegel, Nudelholz usw.) mit der Möglichkeit, die Abmessungen anzupassen, ohne dass in Programmen von Drittanbietern Flugbahnen erstellt werden müssen.
Referenzen
→
Mach3Registry.reg→
Mach3 SDK und andere Programme→
Projekt-Repository auf Github (Ich entschuldige mich im Voraus bei Sharpoviks für Architekturpfosten - dies ist mein erstes Programm in C #).