fischertechnik 30402 Interface Eingänge
![fischertechnik 30402 Interface Eingänge](https://nc-x.com/wp-content/uploads/2021/01/ft-30402_interface_python.jpg)
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 E8
if(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 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)
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 Funktionen
from binascii import unhexlify
import serial
import time
# serielle Schnittstelle definieren
ser = serial.Serial('/dev/ttyS0', 9600)
# Empfang der seriellen Zustands-Info in diese Variable
data = ' '
#Programmstart mit Info
print('fischertechnik intelligent interface 30402')
print('seriell-Protokoll untersuchen')
print('Peter Fürle, www.nc-x.com, Jan2021')
#nur die Ein/Ausgänge abfragen
interface = b'11000001' # nur E/A Zustand lesen
ea_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 formatieren
motoren=('%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)
#Hauptprogramm
while 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
#informativ
print('Ende: Kommunikation mit Inferface beendet')
Schreibe einen Kommentar