ich bin wieder am Basteln von meinem Code.
Ich kann ja am Sick-Geber verschiedene Register auslesen. Das funktioniert beim Register 42h wunderbar und ich kann sogar den Wert kontinuierlich lesen und im Tkinter permanent aktualisieren lassen. Stolz wie Oskar
Der eigentliche Programmierer, nimmt dazu die "length 4 bytes" und hängt 3 an. Warum? Weil die Länge immer 7 sein muss? Was ja nicht stimmen kann, siehe weiter unten.
Hier passt es aber.
Hier hätte ich 3 Bytes und müsste 4 dazurechnen? Das funktioniert nicht. Ich muss mit 3 erhöhen und erhalte als Ausgabe 1283, was mir nichts sagt.
Falls jemand Zeit hat, hier mal schauen. Das ist die Doku zum Hiperface...
Code von mir, also wie immer , es darf kritisiert werden.
Code: Alles auswählen
from tkinter import *
import random
from random import *
import math
from crccheck.checksum import ChecksumXor8
import serial, time, binascii
#initialization and open the port
ser = serial.Serial()
# Choose based on your system/ linux will have sth. like /dev/ttty...
ser.port = "/dev/ttyUSB0"
ser.baudrate = 9600
ser.bytesize = serial.EIGHTBITS #number of bits per bytes
ser.parity = serial.PARITY_EVEN #set parity check: no parity
ser.stopbits = serial.STOPBITS_ONE #number of stop bits
ser.timeout = None # block read
ser.xonxoff = False # disable software flow control
ser.rtscts = False # disable hardware (RTS/CTS) flow control
ser.dsrdtr = False # disable hardware (DSR/DTR) flow control
ser.writeTimeout = 0.2 #timeout for write
class Updater():
def __init__(self, lines_label, grad_label, meldung_label):
self.lines_label = lines_label
self.grad_label = grad_label
self.meldung_label = meldung_label
def position_lesen(self):
try:
ser.open()
data = bytearray.fromhex("FF" + "42")
data.append(ChecksumXor8.calc(data))
client_read_bytes = 4
client_read_bytes += 7 - client_read_bytes
ser.flushInput() # flush input buffer, discarding all its contents
ser.flushOutput()#flush output buffer, aborting current output
ser.write(data)
response = ser.read(client_read_bytes)
# print(binascii.hexlify(response))
# Note that some slave answers include INT values of varying bit length within response. Configure the required bits, big/little endian and signed to your liking
position=int.from_bytes(response[2:8:],'big',signed=False) # response[2:8]
ser.close()
"""
Absolute Position mit einer Auflösung
von 32768 Schritten pro umdrehung
sowie 4096 umdrehungen beim
multiturn-System
"""
inkrement = 2048
lines = 4096 # Absolute position resolution
counter_live = position
counter = counter_live / inkrement
voll_rest = divmod(counter, lines)
winkel = round(360 / lines * voll_rest[1],2)
self.lines_label["text"] = counter_live
self.grad_label["text"] = winkel
self.meldung_label.config(bg="#1a233d", fg="#ffffff")
self.meldung_label["text"] = ""
except Exception as e1:
self.meldung_label.config(
bg="#990000", fg="#ffffff", padx=10, pady=10)
self.meldung_label["text"] = f"Error...: " + str(e1)
self.meldung_label.after(100, self.position_lesen)
def position_reset():
ser.open()
data = bytearray.fromhex("FF" + "46")
data.append(ChecksumXor8.calc(data))
client_read_bytes = 3
client_read_bytes +=1
ser.flushInput() # flush input buffer, discarding all its contents
ser.flushOutput()#flush output buffer, aborting current output
ser.write(data)
response = ser.read(client_read_bytes)
status =int.from_bytes(response[2:8:],'big',signed=False)
ser.close()
print(status)
def main():
fenster = Tk()
fenster.title("Montagehilfe für Servo-Geber")
# Fenstergröße ermitteln
w, h = fenster.winfo_screenwidth(), fenster.winfo_screenheight()
# fenster.geometry("%dx%d+0+0" % (w, h))
fenster.geometry("1024x750")
fenster. minsize(width=800, height=700)
fenster.config(bg="#1a233d")
canvas = Canvas(fenster, width=256, height=47)
canvas.place(x=750, y=20)
mein_Bild = PhotoImage(file='./emb-schultheiss.png')
canvas.create_image(0, 0, anchor=NW, image=mein_Bild)
ueberschrift_label = Label(fenster, font=(
'arial', 24, 'bold', 'italic'), text="Servoprüfplatz", bg="#1a233d", fg="#ffffff").place(x=20, y=20)
option_label = Label(fenster, font=(
'arial', 10, 'bold', 'italic'), text="Sick Hiperface", bg="#1a233d", fg="#ffffff").place(x=50, y=70)
feld_lines_label = Label(fenster, font=(
'arial', 24, 'bold', 'italic'), text="Position")
feld_lines_label.config(bg="#1a233d", fg="#AAAAAA",
padx=10, pady=20)
feld_lines_label.place(x=50, y=150)
feld_grad_label = Label(fenster, font=(
'arial', 24, 'bold', 'italic'), text="Winkel")
feld_grad_label.config(bg="#1a233d", fg="#AAAAAA",
padx=10, pady=20)
feld_grad_label.place(x=50, y=300)
lines_label = Label(fenster, font=(
'arial', 24, 'bold', 'italic'))
lines_label.config(bg="#444444", fg="#ffffff",
borderwidth=5, relief="sunken", width=20, padx=10, pady=20)
lines_label.place(x=250, y=150)
grad_label = Label(fenster, font=(
'arial', 24, 'bold', 'italic'))
grad_label.config(bg="#444444", fg="#ffffff",
borderwidth=5, relief="sunken", width=20, padx=10, pady=20)
grad_label.place(x=250, y=300)
meldung_label = Label(fenster)
meldung_label.place(x=50, y=450)
exit_button = Button(fenster, font=(
'arial', 16, 'bold', 'italic'), text="Beenden", command=fenster.quit)
exit_button.place(x=50, y=600)
exit_button.config(bg="#550000", activebackground="#AA0000",
cursor='hand2', fg="#cccccc", activeforeground="#FFFFFF", padx=5, pady=10)
# start stop
reset_button = Button(fenster, font=(
'arial', 16, 'bold', 'italic'), text="Position Reset", command=lambda: position_reset())
reset_button.place(x=200, y=600)
reset_button.config(bg="#1a344d", activebackground="#2c355d",
cursor='hand2', fg="#cccccc", activeforeground="#FFFFFF", padx=5, pady=10)
updater = Updater(lines_label, grad_label, meldung_label)
updater.position_lesen()
fenster.mainloop()
if __name__ == "__main__":
main()