fischertechnik 30402 Interface Eingänge

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.

30402 mit einem Taster

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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.