fischertechnik 30402 Interface Eingänge
Ein kleines Beispielprogramm zeigt wie in Python unter Linux Mint die Eingänge des fischertechnik intelligent Interface abgefragt werden können.
Das folgende Beispielprogramm steuert keinen Motoren an. Es fragt lediglich die 8 digitalen Eingänge ab. Auf dem Bild seht ihr wie ein Taster angeschlossen werden kann.

Eine Funktion mit wenigen Zeilen Code erledigt den Job.
# prüfe auf Eingang E8if(checkEingang(data,8)): print('Reset gedrückt') break
Das war’s schon.
Die Funktion dazu ist hier erklärt:
# Funktion prüft ob Eingangs-Signal anliegtdef checkEingang(vonSeriell,nr): # es wird das seriell eingelesene byte übergeben # es wird der abzufragende Eingang 1-8 übergeben vonSeriell=('{:08b}'.format(int.from_bytes(data, 'big', signed=False))) # sooft links shiften bis Eingang nr ereicht ist e=(1 << nr-1) # 8stellige Binärmaske erzeugen bitmaske_8=(bin(e & (1<<8) - 1)[2:].zfill(8)) # binären Operator UND auf serielles byte und Bitmaske anwenden if (int(vonSeriell,2) & int(bitmaske_8,2)): #print('Signal erkannt!') return(True)
Bin ich froh, dass ich schon Ende der ’80er Jahre mit NC-Maschinen seriell kommuniziert habe. Das waren die absoluten Basics. Da schreckt mich so ein Interface von 1998 nicht ab.
Hier der ganze Code in Python 3.9:
# Auslesen der Eingänge am intelligent Interface 30402# import von Funktionenfrom binascii import unhexlifyimport serialimport time# serielle Schnittstelle definierenser = serial.Serial('/dev/ttyS0', 9600)# Empfang der seriellen Zustands-Info in diese Variabledata = ' '#Programmstart mit Infoprint('fischertechnik intelligent interface 30402')print('seriell-Protokoll untersuchen')print('Peter Fürle, www.nc-x.com, Jan2021')#nur die Ein/Ausgänge abfrageninterface = b'11000001' # nur E/A Zustand lesenea_zustand=('%02X' % int(interface,2))# byte für Ausgabe erzeugen. Fragt nur den E/A-Zustand ab.ea_zustand=unhexlify(ea_zustand)#Motoren bleiben unberücksichtigt, alle aus.motorzustand='00000000'#Motorzustand von binär nach hex formatierenmotoren=('%02X' % int(motorzustand,2))#Motorzustand als Byte motoren=unhexlify(motoren)# Funktion prüft ob Eingangs-Signal anliegt def checkEingang(vonSeriell,nr): # es wird das seriell eingelesene byte übergeben # es wird der abzufragende Eingang 1-8 übergeben vonSeriell=('{:08b}'.format(int.from_bytes(data, 'big', signed=False))) # sooft links shiften bis Eingang nr ereicht ist e=(1 << nr-1) # 8stellige binärmaske erzeugen bitmaske_8=(bin(e & (1<<8) - 1)[2:].zfill(8)) # binären Operator UND auf serielles byte und Bitmaske anwenden if (int(vonSeriell,2) & int(bitmaske_8,2)): #print('Signal erkannt!') return(True)#Hauptprogrammwhile True: #beide bytes zusammensetzen für serielle Ausgabe command = ea_zustand + motoren ser.write(command) # Zustand der Ein-Ausgänge einlesen data = ser.read() # prüfe auf Eingang E2 if(checkEingang(data,2)): print('Eingang 2 ist gesetzt')
# prüfe auf Eingang E8 if(checkEingang(data,8)): print('Reset gedrückt') break#informativprint('Ende: Kommunikation mit Inferface beendet')

Schreibe einen Kommentar