Neues aus der Bastelbude

Schlagwort: Chiron

Linuxcnc Retrofit von Igor Teil 8 Notaus und Komfort

Nach all der Arbeit, läuft Igor nun. Damit konnte man sich nun den “Kleinigkeiten” widmen. Wenn der Notaus ausgelöst wurde konnte die Spindel ab 2000 U/min nicht mehr gebremst werden, da zu früh die Stromversorgung zur Steuerung getrennt wurde. Deshalb habe ich das Ladder-Programm überarbeitet.
Zum einen habe ich es in drei unabhängige Stränge geteilt.
Der erst aktiviert die Steuerung.
Kommt von dieser das OK weird der Strohm zu den Motoren eingeschaltet. Außerdem gibt es hier jetzt einen Selbsterhalt, der beim deaktivieren der Steuerung durch den Notaus die Stromversorgung aufrecht erhält bis I3 den Stillstand der Spindel meldet.
Der dritte Strang dient zum Lösen der Z-Achs-Bremse, wenn die Steuerung betriebsbereit und die Motoren aktiv sind.

Bildschirmfoto 2020-08-22 um 10.45.38

kommen wir jetzt zum Komfort. Ich habe des öfteren vergessen den Kompressor aus zu schalten, deswegen habe ich ein Shelly Funkrelais in den Kompressor gebaut, das ich an Linuxcnc gekoppelt habe. So kann ich nicht mehr nacht vom Kompressor geweckt werden, weil ich vergessen habe ihn aus zu schalten. Außerdem kann ich den 2. Kanal des Shelly als Zeitrelais zum automatischen entwässern des Kessels verwenden. Möglich wurde das durch ein Pythonscript mit dem es möglich ist Hal pins zu erzeugen und so in Linuxcnc zu integrieren.

#!/usr/bin/python

import time
import hal
import urllib3
import atexit
import time


delta_t = 1 # seconds poll interval, hold inputs at least this long

#hal
h = hal.component("compressor")
h.newpin("active",hal.HAL_BIT,hal.HAL_IN)
h.ready()

def finaloff():
    r = http.request('GET', 'http://192.168.178.89/relay/1?turn=off')
    r = http.request('GET', 'http://192.168.178.89/relay/0?turn=on')
atexit.register(finaloff)
old_start_pin_value = False
started = False
http = urllib3.PoolManager()
while True:
    time.sleep(delta_t)
    #print h["active"]
    start_pin_value = h["active"]
    if start_pin_value != old_start_pin_value:
        #print("changed")
        if started:
            started = False
            print("compressor off")
            r = http.request('GET', 'http://192.168.178.89/relay/1?turn=off')
            r = http.request('GET', 'http://192.168.178.89/relay/0?turn=on')
        else:
            started = True
            print("compressor on")
            r = http.request('GET', 'http://192.168.178.89/relay/1?turn=on')
            r = http.request('GET', 'http://192.168.178.89/relay/0?turn=on')
    old_start_pin_value = start_pin_value

Dann habe ich ein weiteres Python script geschrieben mit dem ich die Maschinenstunden erfassen und Wartungsintervalle signalisieren kann.
Dazu läuft ein Timer wenn die Maschine in Eingeschaltet und betriebsbereit ist und wird gespeichert. Außerdem gehen gelbe Hinweislampen an, wenn das 50 Stunden oder 2000 Stunden Wartungsintervall erreicht ist.

Bildschirmfoto 2020-08-22 um 11.28.59
#!/usr/bin/python

import time
import hal
import atexit

fname = "timelog.txt"
sumlog = "time.txt"

delta_t = 1 # seconds poll interval, hold inputs at least this long
f = open(fname,mode="a+") # a: append or create if file doesnt exist
h = hal.component("timelog")
h.newpin("active",hal.HAL_BIT,hal.HAL_IN)
h.newpin("alarm",hal.HAL_BIT,hal.HAL_OUT)
h.newpin("alarm50",hal.HAL_BIT,hal.HAL_OUT)
h.newpin("alarm2000",hal.HAL_BIT,hal.HAL_OUT)
h.newpin("alarmon",hal.HAL_BIT,hal.HAL_OUT)
h.newpin("alarm50on",hal.HAL_BIT,hal.HAL_OUT)
h.newpin("alarm2000on",hal.HAL_BIT,hal.HAL_OUT)
h.newpin("seconds",hal.HAL_U32,hal.HAL_OUT)
h.newpin("minutes",hal.HAL_U32,hal.HAL_OUT)
h.newpin("hours",hal.HAL_U32,hal.HAL_OUT)
h.ready()



try:
        f2= open(sumlog,mode="r+")
        runtime=float(f2.readline())
        f2.close()
except:
        f2= open(sumlog,mode="w+")
        runtime=0.0
        f2.write(str(runtime))
        #f3.flush()
        f2.truncate()
        f2.close()


m, s = divmod(runtime, 60)
hr, m = divmod(m, 60)
#print(hr,m,s)
h["seconds"]=s
h["minutes"]=m
h["hours"]=hr
old_start_pin_value = False
t_start = time.time()
t_begin = time.time()
msg = ("Begin %s\n" % time.ctime())
f.write(msg)
f.flush()

#2000 hr check
if hr%2000==0:
        h["alarm2000"]=True
        #h["alarm2000on"]=True
        h["alarmon"]=True
        msg = ("2000 hour check %s\n" % time.ctime())
        f.write(msg)
        f.flush()
         
##50h check
if hr%50==0:
        h["alarm50"]=True
        #h["alarm50on"]=True
        h["alarmon"]=True
        msg = ("50 hour check %s\n" % time.ctime())
        f.write(msg)
        f.flush()
        
started = False
def finaloff():
    if h["active"]:
            started = False
            print("timer off")
            t_now = time.time()
            msg = ("Stop:  %s Elapsed: %f\n" % (time.ctime(),t_now - t_start))
            f.write(msg)
            f.flush()
            runtime=seconds
            savetime=str(seconds)
            print savetime
            f2= open(sumlog,mode="w+")
            f2.write(savetime)
            f2.truncate()
            f2.close()
    msg = ("End %s\n" % time.ctime())
    f.write(msg)
    f.flush()
        
atexit.register(finaloff)

while True:
    time.sleep(delta_t)
    #print h["active"]
    start_pin_value = h["active"]
    if start_pin_value != old_start_pin_value:
        print("changed")
        if started:
            started = False
            print("timer off")
            t_now = time.time()
            msg = ("Stop:  %s Elapsed: %f\n" % (time.ctime(),t_now - t_start))
            f.write(msg)
            f.flush()
            runtime=seconds
            savetime=str(seconds)
            print savetime
            f2= open(sumlog,mode="w+")
            f2.write(savetime)
            #f3.flush()
            f2.truncate()
            f2.close()
        else:
            started = True
            print("timer on")
            msg = ("Start: %s\n" %time.ctime())
            f.write(msg)
            f.flush()
            t_start = time.time()
            f2= open(sumlog,"r")
            runtime=float(f2.readline())
            f2.close()
            print runtime

    if start_pin_value: 
        seconds= runtime+(time.time() - t_start)
        m, s = divmod(seconds, 60)
        hr, m = divmod(m, 60)
        h["seconds"]=s
        h["minutes"]=m
        h["hours"]=hr
    old_start_pin_value = start_pin_value

Da ich inzwischen die Standard-RT kerne verwende gingen meine Latenzen in letzter zeit hoch, doch ich wollte eigentlich nicht wieder einen custom Kernel installieren. Es gibt aber die Boot option Einzelne Kerne für die Echtzeitanwendungen zu reservieren, das hat die Latenzen massiv verbessert, ich reservier die Kerne 2 und 3. Dazu muss in der Datei  /etc/default/grub folgende Zeile angepasst werden:

GRUB_CMDLINE_LINUX_DEFAULT="quiet text isolcpus=2,3"

danach noch grub updaten:

sudo update-grub

Zum vergleich vorher:

last latency data is as follows:.
10 secs base min: -78.600 uS max: 71.900 uS sdev: 2.900 uS
10 secs servo min: -97.600 uS max: 101.800 uS sdev: 4.000 uS


Nachher:

last latency data is as follows:
724 secs base min: -34.800 uS max: 34.600 uS sdev: 0.900 uS
724 secs servo min: -22.400 uS max: 22.700 uS sdev: 1.600 uS


Linuxcnc Retrofit von Igor Teil 2 die Hardware

Nachdem das grundlegende Konzept fest steht geht es an die Umsetzung. Dazu werden zunächst die I/O’s und Encoder um zu legen. Dazu wurden zunächst Schnittstellen und neue Zuordnungen lokalisiert und in Tabellen eingetragen.

Damit waren die Vorbereitungen der Hardware außerhalb der Maschine abgeschlossen. Die nächsten Schritte waren das ziehen von Netzwerkkabeln um die Seriellen Schnittstellen im Schaltschrank mit der Konsole zu verbinden und um ggf. einen Netzwerkanschluss für den Steuerrechner bereit stellen zu können. Außerdem bekam die Konsole eine eigne 220V Stromkreis für den Steuerrechner, Monitor, 5V Netzteil und Servicesteckdose.

Danach war es an der Zeit die vorläufige Frontplatte zu machen und den Steuerrechner ein zu bauen. Außerdem wurden ein Notaus-Knopf und ein Schalter für die 5V Stromversorgung der FPGA Karten eingebaut.

Damit waren die Vorbereitungen der Hardware abgeschlossen. Als nächstes kommt dann die Software.

Ok ganz so linear war es nicht zwischen beginn des Umbaus und dem Abschluss des Umbaus lag immerhin ein Umzug und auch zwischendurch wurde an der Software gearbeitet aber so lässt es sich besser aufteilen. Aber Überraschenderweise lieft der Umbau der Hardware deutlich glatter als gedacht, die akribische Vorarbeit und Dokumentation haben dazu geführt, dass bis auf Kleinigkeiten, die den undokumentierten umbauten der Maschine Geschuldet waren alles rech schnell lief. Auch die Videos der Relais während des Einschaltprozesses haben sich später bei der Umsetzung der Software bewährt. Doch dazu mehr in Teil 3

Linuxcnc Retrofit von Igor Teil 1

Es war ja sehr lange still hier im Blog. Der Grund dafür liegt in der Tatsache, das ich umgezogen bin und damit viel Zeit für die Renovierung der Neuen Heimat drauf geht. Der 2. während der Zeit habe ich auch meiner Chiron FZ12W eine neue Steuerung verpasst habe. Die alte Sinumerik 810M durfte gehen und als “neues Hirn” für Igor kamen Mesa Karten und ein kleiner PC mit Linuxcnc als Betriebssystem.

Das ganze vorhaben ist dem Wunsch nach mehr Speicher geschuldet. Anfangs war das Projekt so geplant es möglichst minimal zu machen um, falls es nicht klappt schnell wieder zurück bauen zu können. Das habe ich aber dann Teilweise über Bord geworfen. Doch kommen wir zunächst zur Planung.
Ich hatte zum Glück die Schaltpläne der Chiron, leider gab es ein paar undokumentierte Umbauten. Aber das ließ sich alles “durchklingeln”.
Die Ein- und Ausgänge lagen entweder aus Wannensteckern oder auf D-Sub Steckern. Was den Umbau erleichtert, wenn man auf Adapterplatinen setzt. Das ist zwar hinten im Schaltschrank redundant, da hier die Kabel über einen Adapter auf ein Flachbandkabel gelegt werden und dann von dem Flachbandkabel wieder auf einen Adapter, dann auf Kabel und dann in die Klemmleisten der Mesa Karten. Aber so ließe sich dann alles schnell wieder zurück bauen. Und man muss nicht alle Kabel mühsam umlegen.
Aber bevor es los ging heiß es erst mal alle Ein- und Ausgänge, Dokumentieren. Um eine passende Auswahl an Karten zu machen. Meine Wahl fiel dann auf folgendes Setup:
Zunächst die Karten, die in die alte Steuerkonsole eingebaut werden:
1. Mesa 7I92H Anything I/O Ethernet card. Dadurch wurde ich in der Wahl des Mainbords flexibler und es lässt sich leichter auf einen anderen Rechner wechseln. Diese FPGA Karte übernimmt nur die Kommunikation zwischen Rechner und den IO’s.
2. Mesa 7I77 Analog servo interface plus I/O daughtercard. Diese Karte verarbeitet die Encoder und übernimmt die Analoge Steuerung der Servotreiber und Spineln. Außerdem hat sie Digitale I/O’s mit der sich die I/O’s schalten lassen, die schon in der Konsole liegen.
3. Mesa 7I74 Eight Channel RS-422/485 interface/ RJ45 Breakout. Mit der Karte kann ich weitere Serielle Karten ansteuern, die hinten in den Schaltschrank kommen.
Damit kommen wir zu den Karten im Schaltschrank:
4. Mesa 7I71 Isolated remote power driver card. Mit der Karte werden alle digitalen Ausgänge geschaltet.
5. Mesa 7I70 Isolated remote digital input card. Mit der Karte werden die Eingänge überwacht.
so weit so gut. Zu dem Rechner habe ich noch einen touchfähigen Monitor spendiert, dadurch stört es auch nicht weiter, dass ich mit der Sinumerik auch alle Bedienelemente ausgebaut habe.
Damit sind die Eckdaten schon mal fest gelegt. Im Nächten Teil beginnt dann die Umsetzung.

Linuxcnc Retrofit von Igor Teil 2 die Hardware

Kleinteile sind auch Mist

und müssen irgendwo hin…

Doch zunächst brauchte ich noch Aufnahmen für meinen Messerkopf und die Scheibenfräser…
Die SK Aufnahmen, die ich dafür angeschafft hatte waren leider zu lang und mussten ein wenig gekürt werden. Also ab in die Drehbank damit und nen bisschen Hartdrehen, eingesaut war die Drehe so wie so schon…

Untitled

Weiterlesen

Kühlmittel-Kreislauf für Igor

Moderne Wendeplatten oder VHM-Werkzeuge transportieren Vertragen mehr Wärme als klassische HSS Werkzeuge, hinzu kommt, dass diese mehr mit dem Span wegtransportiert wird. Daher war ich lange der Meinung keinen Klassischen Kühlmittelkreislauf auf zu bauen, sondern eher trocken oder mit einer Minimalmengen-Schmierung zu arbeiten. Dann warf ich die Maschine mal mit der erforderlichen Drehzahl an:

Untitled

Weiterlesen

CAM Postprozessor für die Sinumerik 810M

Jetzt bin ich ja kein ausgebildeter Zerspaner und komplexere Teile auf dem alten System zu programmieren, ohne wirklich zu wissen was man macht, ist nicht unbedingt die beste Idee. Nen bisschen CAD konnte ich ja schon, dann lief mir Fusion360 über den weg. Für private Nutzung kostenlos und hat auch gleich nen CAM System mit an Bord. Nach einer weile Suchen habe ich auch einen Postprozessor (PP) für die Sinumerik 810M bekommen, dieser wurde von Andreas P für seine Maschine geschrieben und habe mit das ganze an meinem Maschine angepasst. Die Postprozessoren sind in Javascript geschrieben und lassen sich daher relativ leicht anpassen.
Ich habe mir den PP dahingehend angepasst, dass meine Maschine einen Indextisch hat und ich beim starten des PP einstellen kann ob Seite 1 oder 2 unter der Spindel sein sollen.  Daher müssen ein paar Zeilen ergänzt werden, zunächst im Bereich der “user-defined properties”, der Einfachheit habe ich gleich die beiden Zeilen für den Werkzeugwechsler mit rein geworfen, dazu aber später.

1
2
3
useToolChanger: true, // specifies that a tool changer is available
sizeToolChanger: 12, //number of tools in your tool changer
indexTable: 1, //Side of index table under Spindle };

Weiterlesen

Igor wird wiederbelebt

Nun steht die Chiron, die ab jetzt auf den Namen Igor hört, in der Werkstatt… was folgt ist ein gewisse Ratlosigkeit, denn ich habe eigentlich keine Ahnung, meine E-Technik-Vorlesung ist gefühlte Jahrhunderte her und die Schaltpläne doch etwas umfangreicher als die man in den Grundlagenvorlesungen durchgeht. OK eigentlich sind es nur Stromlaufpläne trotzdem erschlagen sie einen erst mal.
Die Maschine wurde an seinem früheren Standort recht radikal abgebaut. kurz es wurden alle Kabel zur Stromversorgung un den Nebenaggregaten durchgeschnitten, danach stand Igor eine Ganze weile in einer Scheune, bevor er zu mir kam. Das erschwerte die Inbetriebnahme ein Wenig, denn alle Signale der Nebenaggregate (Späneförderer, Papierbandfilter, Kühlmittelkreislauf, Hochdruckpumpe) fehlten der Maschine ja und teile davon waren teil des Notaus-Systems.  dazu entsprach der Notaus-Schaltkreis nicht mehr den Stromlaufplänen, daher verbrachte ich zunächst sehr viel Zeit damit gekappte Leitungen zu überbrücken und Stromlaufpläne zu korrigieren. Dennoch wollte Igor nicht so richtig daher griff ich zu recht radikalen mitteln ich überbrückte den Notauskreis komplett, vielleicht war das Relais ja im Eimer, doch dann geschah etwas erstaunliches…

IMG_1365

Weiterlesen

© 2024 Ederen Barnworks

Theme von Anders NorénHoch ↑