CNC in der Hobbywerkstatt (Teil 3)

Published on February 07, 2019

CNC in der Hobbywerkstatt (Teil 3)



    Ursprünglich wollte ich mich auf zwei Posts ( einen , zwei ) zu meinen CNC-Experimenten beschränken. Aber das Thema hat sich für viele als interessant erwiesen, deshalb werde ich etwas mehr darauf eingehen. In diesem Beitrag werden wir über das Schreiben von hausgemachter Software für die Verwaltung von Amateur-CNC sprechen.

    Vorwort


    Ich weiß nicht, ob ich jemanden mit den ersten Beiträgen motivieren konnte, aber einige Kommentare gaben mir Anlass zum Nachdenken. Besonderer Dank geht an @evilruff für ein Foto seines Labors und für ein Video mit einem coolen Koreaner . Nachdem ich mir den einen und den anderen angeschaut hatte, wirkte mein Bardachek im Keller nicht mehr so ​​gemütlich.

    Am Wochenende sammelte er seine Kräfte und brachte etwas, das in etwa der Ordnung ähnelte, mit. Schließlich tat er zwei Dinge, die er vor einem halben Jahr tun würde.

    Zuerst ersetzte er ein Stück Sperrholz, das als Opfertisch diente. Ich benutzte dieses Sperrholz vom Moment des Kaufs der Maschine an, schraubte Rohlinge mit Schrauben daran und konstruierte alle möglichen verrückten Strukturen aus Stöcken und Keilen. So gerät der Artikel beim Fräsen nicht in einen unvorhersehbaren Flug.

    Vielleicht kann jemand das Leben hacken: Ein neuer Tisch aus Kunststoff (in Castorum erhältlich):



    Verschraubt die Bretter direkt mit dem Aluminium-Heimtisch. Der Bonus stellte sich als praktische Rillen für die Befestigung von Rohlingen und die schnelle Installation des Füllertisches heraus. Alles dauerte ungefähr ein paar Stunden und ~ 1100r.

    Und zweitens schrieb er schließlich mehr oder weniger brauchbare Software für die Verwaltung von nicht standardmäßigen CNC-Funktionen. Darüber wird die Hauptgeschichte sein.

    Problemstellung


    G-Code für Operationen, die im zweiten Teil beschrieben werden, ist am einfachsten. Der Anpassungsprozess selbst kann jedoch nicht als schnell bezeichnet werden.

    Wie ist das passiert?


    Zum Beispiel war es für das Additiv notwendig: die Breite der Platte 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 sie in Mach3 zu laden. All dies dauert bestenfalls 15 bis 20 Minuten. In diesem Licht sind die Vorteile einer digitalen Maschine erheblich geringer als die eines Handwerkzeugs, das in dieser Zeit eine ganze Reihe von Löchern füllen kann.

    Was ich bekommen wollte


    Im Falle des gleichen Additivs wollte ich ein Programm haben, in dem ich über eine sehr einfache Benutzeroberfläche die Breite und Dicke des Paneels eingebe und durch Drücken der Taste die erforderliche Anzahl von Fülllöchern im gleichen Abstand voneinander bohren kann.

    Suche nach einer Lösung


    Das erste, was mir in den Sinn kam, war das Schreiben eines eigenständigen Programms, das direkt mit der parallelen Schnittstelle interagieren würde. Ein schnelles googeln hat gezeigt, dass die aufgabe des schreibens an lpt völlig lösbar ist, aber der teufel ist dafür bekannt, sich in details zu verstecken. Als ich mich weiter mit dem Thema beschäftigte, wurde mir klar, dass man hier lange und ernsthaft stecken bleiben kann. Darüber hinaus wäre eine solche Lösung nicht flexibel: Für eine andere Maschine, zum Beispiel mit USB, würde sie nicht funktionieren.

    Es gab eine Option, um mit dem SDK Mach3 umzugehen. Beim Sammeln von Informationen zur Erstellung von Mach-Plug-Ins bin ich auf eine interessante Lösung gestoßen. Es wurde beschrieben, wie mithilfe von OLE-Mechanismen Mach3 aus einer Drittanbieteranwendung abgerufen werden kann. Ich bin kein Experte für Microsoft-Technologien, aber nachdem ich das SDK Mach3-Handbuch diagonal durchgesehen habe und die Grundidee richtig verstanden habe, gibt es keine Silberkugel. Die Plugins verwenden dieselben öffentlichen Methoden für Mach3-COM-Objekte. Ich hatte nicht vor, die Mach3-Oberfläche neu zu zeichnen. Der Unterschied für den Benutzer zwischen dem Plug-In und der Standalon-Anwendung bestand nur darin, dass das Plug-In über das Mach3-Menü und die Anwendung über das XP-Desktopsymbol zugänglich war.

    Eine gesonderte Bewerbung erschien mir vorzuziehen. In diesem Fall könnte ich theoretisch sofort nach dem Starten des Computers mein Programm starten, das Mach3 mit einer Dampflokomotive laden würde (anstatt zuerst Mach3 zu laden und dann in dessen Menü zu graben, um das Plugin zu starten).

    Wir nehmen das Schwert auf


    Das letzte Mal, dass ich 2006 eine native Desktop-Windows-Anwendung schreiben musste, war Delphi. Seitdem haben mich Webtechnologien mit ihrem Linux völlig in Anspruch genommen. Daher hatte ich jetzt keine besonderen Vorlieben, in welcher Sprache Windows-Programme erstellt werden sollten. Fand man ein einfaches Beispiel in C # geschrieben, wurde diese Sprache als Versuchskaninchen gewählt.

    Ich werde hier nicht den gesamten Code der resultierenden Anwendung auslegen (wenn Sie möchten, können Sie ihn auf Github über den Link am Ende des Beitrags finden). Ich werde die wichtigsten Dinge erklären. Ich habe alle Experimente 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, einmal den Link zum Video in Youtube zu sehen , den ich verstanden habe. Unten finden Sie eine Abschrift der Highlights.

    Vorbereitung


    1. Damit Visual Studio die Mach3-Komponente ordnungsgemäß aufnimmt, muss sie korrekt in der Registrierung registriert sein. Laden Sie dazu die Datei Mach3Registry.reg herunter
    2. Führen Sie Mach3Registry.reg aus
    3. Wir starten VS, wir erstellen das Projekt der Fensteranwendung auf C #
    4. Klicken Sie im Block Projektmappen-Explorer mit der rechten Maustaste auf Verweise, und wählen Sie im Menü Verweis hinzufügen aus. Klicken Sie im geöffneten Fenster auf Durchsuchen und suchen Sie nach Mach3.exe.Wenn



      alles korrekt ist, sollte eine Zeile in der Referenzliste erscheinen, wer hätte gedacht, dass Mach4 ...
    5. 5. Weiter zeichnen wir UI, wir hängen Prozessoren auf, wir implementieren Algorithmen ...

    Interaktion mit Mach3


    Wir verbinden die notwendigen Bibliotheken, wir deklarieren Variablen (Form1.cs)

    ...
    using System.Runtime.InteropServices;
    using Mach4; // Подключаем компонент Mach
    namespace Cnc
    {
        public class Form1 : System.Windows.Forms.Form
        {
            private IMach4 _mach;   
            private IMyScriptObject _mInst;
            ...
            // получение ссылки на запущенный экземпляр Mach3
            private void GetMachInstance() 
            {
                try 
                {
                    _mach = (IMach4) Marshal.GetActiveObject("Mach4.Document");
                    _mInst = (IMyScriptObject) _mach.GetScriptDispatch();
                } 
                catch 
                {
                    _mach = null;
                    _mInst = null;
                }
            }
    ...
    

    Verwendung:

    GetMachInstance(); // 
    if(_mInst != null) 
    {
        _mInst.DoOEMButton(1003); // Нажатие на кнопку Stop в Mach3
        _mInst.Code("G00 X100"); // Выполнение G-code
        _mInst.GetOEMDRO(800); // Получить текущее значение координаты X
    }
    

    Die Codes für die Schaltflächen und Parameterwerte können im Wiki eingesehen werden: OEM_DROs und OEM_Buttons (ihr Wiki podglyuchivaet, die Werte der Parameter in der Tabelle werden nicht angezeigt, ich habe auf die Registerkarte "Quelltext anzeigen" geschaut).

    Die erste Version des Programms funktionierte folgendermaßen: Gemäß den eingestellten Parametern wurde G-Code generiert, der Frame für Frame (d. H. Zeile für Zeile) von der _mInst.Code- Methode ausgeführt wurde . Und das war mein Fehler. In der Debugging-Umgebung auf virtualke hat alles gut funktioniert. In Mach3 liefen die richtigen Zahlen in den Koordinaten. Bei der Übertragung auf einen Maschinencomputer traten jedoch Probleme auf. 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 die _mInst.Code-Methode eingaben, und die Spindelsteuerbefehle (M3, M5) unabhängig vom ersten Thread in einem anderen Thread ausgeführt wurden. Infolgedessen wurde die Spindel eingeschaltet (M3) und dann ausgeschaltet (M5), während die Wagenbewegung wie üblich fortgesetzt wurde.

    Ich habe verschiedene Optionen ausprobiert, Verzögerungen verbunden, versucht, den gesamten Manager-G-Code in eine Zeile zu schreiben und ihn in _mInst.Code in einem Stück zu senden. Infolgedessen blieb ich bei der direkten Lösung stehen: Ich habe den generierten Code einfach in eine Datei verschoben, diese Datei programmgesteuert in Mach3 geöffnet und an derselben Stelle programmgesteuert die Schaltfläche „Start“ gedrückt. Fragment des Arbeitscodes:

    _mInst.LoadFile("C:\\tmp\\gcode.txt");
    System.Threading.Thread.Sleep(2000);
    _mInst.DoOEMButton(1000);
    

    Eine Pause zwischen dem Herunterladen der Datei und dem Drücken der Taste ist erforderlich, damit Mach Zeit zum Öffnen der Datei hat. 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 ist das ergebnis


    Weiter in ein paar Worten über die daraus resultierende Anwendung. Ich werde für jede Operation separat über die Benutzeroberfläche berichten.

    Schneiden




    Es ist alles ziemlich transparent. Der Parameter S wird benötigt, um die Größe L zu kompensieren, wenn das Werkstück nicht auf dem Nullpunkt in X (oder Y beim Längsschneiden) fixiert ist.

    Additiv


    Für Additiv sind 2 Konfigurationen möglich. Die erste mit einer Schleifmaschine zum Bohren von Endlöchern. Und die zweite mit einer konventionellen Spindel zum Bohren in der Ebene des Schildes (aus irgendeinem Grund nannte ich es "Frontal Additive").

    Additives Gesicht




    Wenn das Endadditiv wichtig ist, um in der unteren rechten Ecke des Werkstücks genau Null zu setzen (ich habe dort den Winkel des Seitenanschlags und des Tisches). Es ist nicht schwierig, dies mit einem Holzbohrer zu tun - 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 ändern, mache ich gegenseitige Löcher, indem ich das Werkstück vertikal befestige:


    Der 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 sind als die Seitenpaneele).

    Frontales Additiv




    Das Werkzeug 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 an den Rändern, sondern auch irgendwo in der Mitte. Zum Beispiel, wenn sich im Schrank mehrere Fächer befinden und sich neben den Seitenwänden Innenwände befinden. Wenn die Länge der Platte größer als die Länge der Maschine ist, kann das Additiv in 2 Sätzen mit einer Drehung des Teils um 180 Grad hergestellt werden. In diesem Fall ist auch der X-Parameter nützlich.

    Wenden




    Für mich bestand die Hauptschwierigkeit bei der Erstellung des G-Codes mit dem Wendepfad darin, ihn nicht mit der maximalen Plattentiefe 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 für den Zylinderblock erstellen, und erst danach begann der Hauptdurchlauf mit der Erstellung des Formulars. Und es gab einige Einschränkungen für dieses Formular. Insbesondere musste sichergestellt werden, dass die Flugbahn nicht zu tief geht. Ich habe versucht, nicht mehr als 10 - 15 mm vom Niveau des Originalzylinders abzuheben.

    All 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 des Balkens des Werkstücks ein und geben Sie die maximale Bearbeitungstiefe für 1 Durchgang an (je härter das Holz, desto geringer die Tiefe). Basierend auf dem ursprünglichen G-Code und den Parametern berechnet das Programm die sichere Flugbahn und sendet sie an die CNC.

    Pläne für die Zukunft


    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 die Idee, eine Bibliothek mit sich drehenden Formen zu erstellen. Dh Verschiedene typische Formen (z. B. Zylinder, Kegel, Nudelholz usw.) mit der Möglichkeit, die Abmessungen anzupassen, ohne dass Flugbahnen in Programmen von Drittanbietern erstellt werden müssen.

    Links


    Mach3Registry.reg
    Mach3 SDK und andere Programme
    Das Projektarchiv auf Github (Ich entschuldige mich im Voraus bei Sharpikov für architektonische Pfosten - dies ist mein erstes C # -Programm).