Realtime Position, buttonlockm buffer

This commit is contained in:
Thomas Herrmann 2021-09-11 19:58:59 +02:00
parent 387384d992
commit e2e9646c80
1 changed files with 186 additions and 70 deletions

256
cnc.py
View File

@ -9,6 +9,10 @@ import threading
grbl = 0 grbl = 0
i = 10 i = 10
GCODE = 0 GCODE = 0
countbuf = 0
writebuffer_byPass = []
writebuffer = []
readbuffer = []
AXIS = 'X' AXIS = 'X'
states = {'M3':'0', 'M8':'0', 'M6':'0', 'G10': '0'} #Spindle, Coolant, Toolchange states = {'M3':'0', 'M8':'0', 'M6':'0', 'G10': '0'} #Spindle, Coolant, Toolchange
@ -38,7 +42,7 @@ def grblConnect2():
try: try:
#print([comport.device for comport in serial.tools.list_ports.comports()]) #print([comport.device for comport in serial.tools.list_ports.comports()])
print ("Trying...",device) print ("Trying...",device)
grbl = serial.Serial(port= device, baudrate= 115200, timeout =3) grbl = serial.Serial(port= device, baudrate= 115200, timeout =3, dsrdtr= True)
#grbl.open() #grbl.open()
#print(grbl.readline()) #print(grbl.readline())
grbl.write(str.encode("\r\n\r\n")) grbl.write(str.encode("\r\n\r\n"))
@ -53,25 +57,39 @@ def grblConnect2():
grbl = 0 grbl = 0
# Stream g-code to grbl # Stream g-code to grbl
#Stream GCODE from -https://onehossshay.wordpress.com/2011/08/26/grbl-a-simple-python-interface/- #Stream GCODE from -https://onehossshay.wordpress.com/2011/08/26/grbl-a-simple-python-interface/-
def jogWrite(AXIS, CMD, scale): #Schreiben von manuellen Positionierungsbefehlen
global freetosend
def jogWrite(AXIS, CMD, scale):
DECIMAL = [0.1,1,10,100] DECIMAL = [0.1,1,10,100]
scale = increments.get() scale = increments.get()
MOVE = int(CMD) * DECIMAL[scale -1] MOVE = int(CMD) * DECIMAL[scale -1]
grbl_command = ('$J=G91' +' ' + AXIS + str(MOVE) + ' '+ 'F1000') grbl_command = ('$J=G91' +' ' + AXIS + str(MOVE) + ' '+ 'F1000')
#print(grbl_command) #print(grbl_command)
if freetosend == 1: if freetosend == 1:
sendGRBL(grbl_command) byPass(grbl_command+'\n')
else:
for button in blkbuttons:
switchButtonState(button)
def directWrite(CMD): def switchButtonState(button): #Umschalter für Knopfstatus
grbl_command = CMD if button["state"] == DISABLED:
sendGRBL(grbl_command) button["state"] = NORMAL
else:
button["state"] = DISABLED
def directWrite(CMD): #Direktes schreiben eines Befehls
global freetosend
grbl_command = CMD
if freetosend == 0:
now_bufferGRBL(grbl_command + '\n')
else:
byPass(grbl_command+'\n')
def latchWrite(CMD): def latchWrite(CMD):
global states global states
global freetosend
if states[CMD] == '0': if states[CMD] == '0':
states[CMD] = '1' states[CMD] = '1'
if CMD == 'M3': if CMD == 'M3':
@ -89,7 +107,6 @@ def latchWrite(CMD):
tool.config(bg='grey') tool.config(bg='grey')
#if CMD == 'G10': #if CMD == 'G10':
# zero_all.config(bg= attention) # zero_all.config(bg= attention)
if CMD == 'M3': if CMD == 'M3':
if states['M3'] == '1': if states['M3'] == '1':
@ -112,20 +129,33 @@ def latchWrite(CMD):
grbl_command = (CMD) grbl_command = (CMD)
#grbl_command = (CMD * int(states[CMD]) ) #grbl_command = (CMD * int(states[CMD]) )
print(grbl_command) #print(grbl_command)
#print(states) #print(states)
sendGRBL(grbl_command)
def zeroWrite(CMD, AXIS): if freetosend == 0:
now_bufferGRBL(grbl_command + '\n')
else:
byPass(grbl_command + '\n')
print(grbl_command)
def zeroWrite(CMD, AXIS): #Umwandlung für Achsennullung
global freetosend
grbl_command = (CMD + ' ' + AXIS + '0') grbl_command = (CMD + ' ' + AXIS + '0')
sendGRBL(grbl_command) if freetosend == 0:
now_bufferGRBL(grbl_command + '\n')
else:
byPass(grbl_command+ '\n')
def terminalWrite(): def terminalWrite(): #Holt Zeichenstring von Editfeld und sendet es
grbl_command = terminal.get() grbl_command = terminal.get()
#print(grbl_command) #print(grbl_command)
sendGRBL(grbl_command) if freetosend == 0:
now_bufferGRBL(grbl_command + '\n')
else:
byPass(grbl_command+'\n')
def infoScreen(data): def infoScreen(data): #Anzeigecanvas für GRBL Rückmeldungen
global i global i
terminalFrame = Frame(terminal_recv, bg = 'white') terminalFrame = Frame(terminal_recv, bg = 'white')
terminal_recv.create_window(10,i, window = terminalFrame, anchor = 'nw') terminal_recv.create_window(10,i, window = terminalFrame, anchor = 'nw')
@ -135,7 +165,7 @@ def infoScreen(data):
i=10 i=10
terminal_recv.delete("all") terminal_recv.delete("all")
def openGCODE(): def openGCODE(): #Dialog zur Gcode AUswahl und öffnen der Datei als GCODE Objekt
global GCODE global GCODE
filetypes = (('GCODE', '*.nc'),('All files', '*.*')) filetypes = (('GCODE', '*.nc'),('All files', '*.*'))
@ -146,8 +176,8 @@ def openGCODE():
else: else:
fopen.config(bg = 'grey') fopen.config(bg = 'grey')
build_xy = findEnvelope() build_xy = findEnvelope() #Aufruf PLatz im Bauraum
mill_table.create_rectangle(build_xy[0],build_xy[1], fill = 'blue', stipple = 'gray75') mill_table.create_rectangle(build_xy[0],build_xy[1], fill = 'blue', stipple = 'gray75') # Zeichnen des Objekts im Bauraum
def findEnvelope(): #get the max used Buildspace and position of the job def findEnvelope(): #get the max used Buildspace and position of the job
x_coords = [] x_coords = []
@ -182,20 +212,141 @@ def findEnvelope(): #get the max used Buildspace and position of the job
def grblWrite(): def grblWrite():
#print("write1") #print("write1")
global writebuffer
GCODE.seek(0) GCODE.seek(0)
for line in GCODE: for line in GCODE:
#print("write") #print("write")
l = line.strip() # Strip all EOL characters for streaming l = line.strip() # Strip all EOL characters for streaming
#l = line.split(";",1)
grbl_command = l grbl_command = l
print("GCODE",grbl_command) #print("GCODE",grbl_command)
if freetosend == 1: bufferGRBL(grbl_command + '\n')
sendGRBL(grbl_command) sendGRBL()
GCODE.close() GCODE.close()
for button in blkbuttons:
switchButtonState(button)
fopen.config(bg = 'grey') fopen.config(bg = 'grey')
def timedPositionRequest():
if grbl != 0 and freetosend == 1:
grbl_command = '?'
byPass(grbl_command)
root.after(1000, timedPositionRequest)
def bufferGRBL(grbl_command):
global writebuffer
writebuffer.append(grbl_command)
#print (len(writebuffer))
def now_bufferGRBL(grbl_command):
global writebuffer
writebuffer.insert(1,grbl_command)
#print (len(writebuffer))
def byPass(grbl_command):
global writebuffer_byPass
if grbl_command == '?':
grbl.write(str.encode(grbl_command)) # Send g-code block to grbl
grbl_out = grbl.readline().strip()
else:
print(grbl_command)
writebuffer_byPass.append(grbl_command)
grbl.write(str.encode(writebuffer_byPass[0])) # Send g-code block to grbl
grbl_out = grbl.readline().strip()
del writebuffer_byPass[0]
displayPosition_request(grbl_out)
infoScreen(grbl_out)
print(grbl_out)
def sendGRBL():
global writebuffer
global freetosend
while len(writebuffer) >0:
freetosend = 0
#print ("current",writebuffer[0])
#print (writebuffer)
grbl.write(str.encode(writebuffer[0])) # Send g-code block to grbl
#grbl.timeout = None
readbuffer.append(grbl.readline().strip()) # Wait for grbl response with carriage return
del writebuffer[0]
if len(readbuffer) == 5:
writebuffer.insert(2,'?')
displayPosition()
infoScreen(readbuffer[0])
readbuffer.clear()
freetosend = 1
def displayPosition_request(grbl_pos):
if grbl != 0 :
try:
position = str(grbl_pos)
#print (readbuffer)
position = position.replace('Idle|', ',')
position = position.replace('Run|', ',')
position = position.replace('WPos:', '')
position = position.replace('MPos:', '')
position = position.replace('>', ',')
position = position.replace('|', ',')
position.strip()
coordinates_list = position.split(',')
#print(coordinates_list)
show_ctrl_x.config(text = coordinates_list[1])
show_ctrl_y.config(text = coordinates_list[2])
show_ctrl_z.config(text = coordinates_list[3])
#show_ctrl_x_w.config(text = coordinates_list[4])
#show_ctrl_y_w.config(text = coordinates_list[5])
#show_ctrl_z_w.config(text = coordinates_list[6])
except:
pass
#print("Listerror")
else:
print("Serial Busy")
#root.after(1000,displayPosition)
def displayPosition():
global readbuffer
if grbl != 0 :
try:
position = str(readbuffer[2])
#print (readbuffer)
position = position.replace('Idle|', ',')
position = position.replace('Run|', ',')
position = position.replace('WPos:', '')
position = position.replace('MPos:', '')
position = position.replace('>', ',')
position = position.replace('|', ',')
position.strip()
coordinates_list = position.split(',')
#print(coordinates_list)
show_ctrl_x.config(text = coordinates_list[1])
show_ctrl_y.config(text = coordinates_list[2])
show_ctrl_z.config(text = coordinates_list[3])
#show_ctrl_x_w.config(text = coordinates_list[4])
#show_ctrl_y_w.config(text = coordinates_list[5])
#show_ctrl_z_w.config(text = coordinates_list[6])
except:
pass
#print("Listerror")
else:
print("Serial Busy")
#root.after(1000,displayPosition)
def grblClose(): def grblClose():
# Close file and serial port # Close file and serial port
#f.close() #f.close()
@ -206,48 +357,6 @@ def grblClose():
except: except:
print("Connection still open") print("Connection still open")
def sendGRBL(grbl_command):
global freetosend
freetosend = 0
#print(grbl_command)
grbl.write(str.encode(grbl_command+ '\n')) # Send g-code block to grbl
time.sleep(0.01)
grbl_out = grbl.readline() # Wait for grbl response with carriage return
infoScreen(grbl_out)
freetosend = 1
return grbl_out
#infoScreen("finished")
def displayPosition():
if grbl != 0 and freetosend == 1:
grbl_command = '?'
position = str(sendGRBL(grbl_command))
#print(position)
position = position.replace('Idle|', ',')
position = position.replace('Run|', ',')
position = position.replace('WPos:', '')
position = position.replace('MPos:', '')
position = position.replace('>', ',')
position = position.replace('|', ',')
position.strip()
coordinates_list = position.split(',')
#print(coordinates_list)
try:
show_ctrl_x.config(text = coordinates_list[1])
show_ctrl_y.config(text = coordinates_list[2])
show_ctrl_z.config(text = coordinates_list[3])
#show_ctrl_x_w.config(text = coordinates_list[4])
#show_ctrl_y_w.config(text = coordinates_list[5])
#show_ctrl_z_w.config(text = coordinates_list[6])
except:
print("Listerror")
else:
print("Serial Busy")
root.after(500,displayPosition)
root = Tk() root = Tk()
root.title('touchCNC') root.title('touchCNC')
root.geometry('1024x600+0+0') root.geometry('1024x600+0+0')
@ -285,7 +394,7 @@ fopen = Button(root, text="GCODE",width = buttonsize_x , height = buttonsize_y,
spindle = Button(root, text="Spindle",width = buttonsize_x, height = buttonsize_y,command = lambda:latchWrite('M3')) spindle = Button(root, text="Spindle",width = buttonsize_x, height = buttonsize_y,command = lambda:latchWrite('M3'))
coolant = Button(root, text="Coolant",width = buttonsize_x, height = buttonsize_y,command = lambda:latchWrite('M8') ) coolant = Button(root, text="Coolant",width = buttonsize_x, height = buttonsize_y,command = lambda:latchWrite('M8') )
tool = Button(root, text="Tool",width = buttonsize_x, height = buttonsize_y,command = lambda:latchWrite('M6') ) tool = Button(root, text="Tool",width = buttonsize_x, height = buttonsize_y,command = lambda:latchWrite('M6') )
macro = Button(root, text="Macro1",width = buttonsize_x, height = buttonsize_y,command = lambda:directWrite(' G90 G0 X10 Y10 Z50 F1000') ) macro = Button(root, text="Macro1",width = buttonsize_x, height = buttonsize_y,command = lambda:directWrite(' G91 G0 X10 Y10 Z50 F1000') )
inc1 = Button(root, text="Inc 1%",width = buttonsize_x, height = buttonsize_y,command = lambda:directWrite(''),bg= feed) inc1 = Button(root, text="Inc 1%",width = buttonsize_x, height = buttonsize_y,command = lambda:directWrite(''),bg= feed)
inc10 = Button(root,text="Inc 10%",width = buttonsize_x, height = buttonsize_y,command = lambda:directWrite(''),bg= feed ) inc10 = Button(root,text="Inc 10%",width = buttonsize_x, height = buttonsize_y,command = lambda:directWrite(''),bg= feed )
@ -316,7 +425,7 @@ show_ctrl_x_w =Label(root, text = "X_POS_W", width = 8, height = 2, bg ='white',
show_ctrl_y_w =Label(root, text = "Y_POS_W", width = 8, height = 2, bg ='white', relief = SUNKEN, fg= 'black') show_ctrl_y_w =Label(root, text = "Y_POS_W", width = 8, height = 2, bg ='white', relief = SUNKEN, fg= 'black')
show_ctrl_z_w =Label(root, text = "Z_POS_W", width = 8, height = 2, bg ='white', relief = SUNKEN, fg= 'black') show_ctrl_z_w =Label(root, text = "Z_POS_W", width = 8, height = 2, bg ='white', relief = SUNKEN, fg= 'black')
threading.Thread(target= displayPosition()).start()
#feed_control = Scale(root, orient = HORIZONTAL, length = 400, label = "Feedrate",tickinterval = 20) #feed_control = Scale(root, orient = HORIZONTAL, length = 400, label = "Feedrate",tickinterval = 20)
@ -400,6 +509,13 @@ terminal_recv.grid(row = 0, column = 8, padx =10, pady =10,rowspan = 7, columnsp
#feed_control.grid(row = 8, column = 4, columnspan =4) #feed_control.grid(row = 8, column = 4, columnspan =4)
mill_table.grid(row=0, column=4,padx=10, pady=10,columnspan = 4, rowspan = 7) mill_table.grid(row=0, column=4,padx=10, pady=10,columnspan = 4, rowspan = 7)
sendGRBL()
#BlockedButtons
blkbuttons = (up,down,left,right,z_up,z_down, zero_x, zero_y, zero_z, zero_all, setzero, gozero, spindle)
timedPositionRequest()
root.mainloop() root.mainloop()