Hier noch mal mein kompletter Test - Code.
Das eigentliche Programm funktioniert soweit, nur eben meine Fehlerbehandlung nicht.
Deshalb hier meine Bastelstunde.
Ich rufe den Befehl Hex=42 auf. Es wird korrekt die Position ausgegeben.
Fehler wird keiner erkannt, er wird in meiner sick_error.py korrekt übersetzt.
response = b'@B\x00\x00M\x8e\xc1'
Position, data = 19854
Fehlermeldung = 00 - der Geber hat keinen Fehler erkannt
00 weil im Fehlerfall keine Daten, response[2:6], gesendet werden, sondern nur ein Datenpaket response[2:3]
Er liest hier also die "00" obwohl diese 00 zur Position gehören. Es ist also keine Fehlermeldung.
Bei anderen Positionen, generiert er mir dann Fehlermeldungen. ZB. bei "0c"
Datenpaket response[0:2] ist immer Adresse, Befehl.
import serial, time
from crccheck.checksum import ChecksumXor8
import sick_error
#import csv, os
#import binascii
# initialization and open the port
ser = serial.Serial()
ser.port = "/dev/ttyUSB0"
#ser.port = "COM7"
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 = 0.1 #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.open()
#SRM50
sinus_cosinus_perioden= 1024
absolut_erfassbaren_umdrehungen = 4096
gesamtschrittzahl = 134217728
sick_string = "FF 42"
def status(sick_string):
data = bytearray.fromhex(sick_string)
data.append(ChecksumXor8.calc(data))
ser.reset_input_buffer()
ser.reset_output_buffer()
time.sleep(0.01) #give the serial port sometime to receive the data
ser.write(data)
time.sleep(0.01)
response = ser.read(7)
print(response)
data = int.from_bytes(response[2:6],'big',signed=False)
print(data)
fehlermeldung=''.join(format(byte, '02x') for byte in response[2:3])
fehlerspeicher = sick_error.srm_errors(fehlermeldung)
print(fehlerspeicher)
print(response[7:])
status(sick_string)
Fehler provozieren:
Wir ändern den sick_string von sick_string = "FF 42" zu sick_string = "FF 42 55"
Der Befehl enthällt nun einen zusätzlichen Hex, der im Protokoll so nicht vorgesehen ist.
Wir erhalten folgende Ausgabe:
response = b'@P\x0c\x1c'
data = 3100.... ist nun nur wirres Zeug, da hier die Fehlermeldung und die Checksum verbastelt werden.
Fehlermeldung 0c - Anzahl der übertragenen Daten ist falsch...
Das ist schon mal korrekt.
x1c wird die Chechsum sein.
Soweit alles klar? Ihr könnt mir folgen?

Hab ich einen Denkfehler?
Bei allen was ich mache, bleibt print(response[7:]) immer b' '
Das sollte doch mein Fehlerbit sein. Richtig?
Was sagt Sick dazu?
Fehlerbehandlung
Fehlermeldung
• Befehle die nicht bearbeitet werden können (Protokollfehler, Befehlsargumente oder interne Fehler des MFB)
führen zum Abbruch der Befehlsbearbeitung und das MFB antwortet mit einem Fehlerprotokoll
(s. Command 50h)
Warnmeldung
• Während der Befehlsausführung wird der Betriebszustand des MFB überwacht (z. B. Temperatur, Sender-
strom). Werden hierbei kritische Parameter festgestellt die jedoch auf den aktuell bearbeiteten Befehl ohne
direkte Auswirkung sind, so generiert das MFB bei gesetztem Errorbit, das erwartete Antwortprotokoll.
• Das Fehlerbit wird mit dem Auslesen des Fehlercodes (Command 50h) oder durch einen MFB-Reset (Command
53h) gelöscht.
• Treten mehrere Fehler gleichzeitig auf, so werden vom MFB bis zu 4 Fehlercodes zwischengespeichert die mit
dem Command 50h nacheinander ausgelesen werden können.
Das Fehlerbit bleibt hierbei solange gesetzt, bis alle Fehlercodes ausgelesen sind.
• Werden hierbei kritische Parameter festgestellt die jedoch auf den aktuell bearbeiteten Befehl ohne direkte Aus-
wirkung sind, so generiert das MFB bei gesetztem Errorbit das erwartete Antwortprotokoll.
Gruß Ralf