-> Hier kostenlos registrieren
Hallo Liebe Programmierer vom SPS-Forum, ich schaue hier schon länger nach, doch heute muss ich mal eine direkte Frage stellen :wink:.
Erstmal zum Hintergrund. Es geht darum, das der QR-Code eines Produktes ein bzw mehrere Leerzeichen enthält, was unser Hauptsystem, an das der Code gesendet wird, nicht richtig verarbeitet. Ich habe es ersteinmal direkt in die entsprechenden Projekte geschrieben, allerdings möchte ich einen FB dafür schreiben, der den BC prüft und eventuelle Leerzeichen automatisch herauslöscht. Um den FB in all unseren Projekten verwenden zu können, muss er natürlich mit indirekter Adressierung programmiert werden. Ich übergebe dem FB den DB sowie die Anfangsadresse des DB, in dem der Barcode steht, die definierte BC länge sowie DB und Anfangsbyte des überprüften und bearbeiteten Barcodes und natürlich ein Enable für den Baustein.
Das Problem ist, dass mir die SPS immer in Stop geht :wink:
Hier mal ein Auszug wie ich es geschrieben habe:
UN #Enable // Wird Baustein verwendet?
BEB // Bedingtes Bausteinende
L 0
T Loop
T Loop2
L #Eingangs_DB // Umtransferieren der Eingangsparameter in den TEMP-Bereich
T #DB_Eing
L #Eingangs_DBB
T #DBB_Eing
L #Ausgangs_DB
T #DB_Ausg
L #Ausgangs_DBB
T #DBB_Ausg
L #Loop // Prüfen ob alle Zeichen bearbeitet wurden
L 1
+ I
L #Barcodelänge
<= I
SPBN Ausg // Wurden alle Zeichen in den Puffer geschrieben, wird der Puffer ausgegeben
Up: Auf DB[#DB_Eing] // öffnen des DB, indem der Barcode liegt
L #DBB_Eing // Aufbereiten des nächsten BC-Bytes
L #Loop2 // Wird hochgezählt, sodass automatisch alle Bytes eingelesen werden
+I
T #Byte_eing
L 10 // Ab Lokaldatenbyte 10 ist ein Array mit chars, welcher BC puffert
L Loop
+ I
T #Pufferbereich // Aktuelles Byte für Pufferung
L DBB[DBB_Eing] // Prüfen ob ein Leerzeichen im aktuellen Byte vorhanden ist
L ' '
==I
SPB Spc // Ist ein Leerzeichen vorhanden, wird weitergesprungen, wenn nicht wird der Wert in das aktuelle Pufferbyte geschrieben
L DBB[#Byte_eing] //
T LB[#Pufferbereich]
L Loop // Schleife für das Schreiben in den Puffer wird hochgezählt ( nur wenn kein Leerzeichen vorhanden ist)
L 1
+ I
T Loop
Spc: L Loop2 // Ist ein Leerzeichen vorhanden, wird nur die Leseschleife hochgezählt, damit im Puffer das Leerzeichen nicht eingetragen wird
L 1
+I
T Loop2
L #Loop // Prüfen ob alle Zeichen bearbeitet wurden
L 1
+ I
L #Barcodelänge
<= I
SPB Up // Ist noch nicht vollständig geprüft worden, wird hoch gesprungen
Ausg: Auf DB[DB_Ausg]
CALL SFC 20 // Schieben des Puffers in den neuen Datenbaustein
SRCBLK := #Puffer
RET_VAL:=
DSTBLK := DBB[DBB_Ausg]
Ich hoffe ihr könnt etwas damit anfangen und dass meine Kommentare etwas verständlich sind. Habe den Code von Arbeit nicht hier und von daher hier jetzt fix von Hand eingeschrieben. Es sollte zwar keinen Unterschied geben, aber zur Information, wir benutzen auf Arbeit nur noch Soft-SPSen.
Beste Grüße
Wintz
Erstmal zum Hintergrund. Es geht darum, das der QR-Code eines Produktes ein bzw mehrere Leerzeichen enthält, was unser Hauptsystem, an das der Code gesendet wird, nicht richtig verarbeitet. Ich habe es ersteinmal direkt in die entsprechenden Projekte geschrieben, allerdings möchte ich einen FB dafür schreiben, der den BC prüft und eventuelle Leerzeichen automatisch herauslöscht. Um den FB in all unseren Projekten verwenden zu können, muss er natürlich mit indirekter Adressierung programmiert werden. Ich übergebe dem FB den DB sowie die Anfangsadresse des DB, in dem der Barcode steht, die definierte BC länge sowie DB und Anfangsbyte des überprüften und bearbeiteten Barcodes und natürlich ein Enable für den Baustein.
Das Problem ist, dass mir die SPS immer in Stop geht :wink:
Hier mal ein Auszug wie ich es geschrieben habe:
UN #Enable // Wird Baustein verwendet?
BEB // Bedingtes Bausteinende
L 0
T Loop
T Loop2
L #Eingangs_DB // Umtransferieren der Eingangsparameter in den TEMP-Bereich
T #DB_Eing
L #Eingangs_DBB
T #DBB_Eing
L #Ausgangs_DB
T #DB_Ausg
L #Ausgangs_DBB
T #DBB_Ausg
L #Loop // Prüfen ob alle Zeichen bearbeitet wurden
L 1
+ I
L #Barcodelänge
<= I
SPBN Ausg // Wurden alle Zeichen in den Puffer geschrieben, wird der Puffer ausgegeben
Up: Auf DB[#DB_Eing] // öffnen des DB, indem der Barcode liegt
L #DBB_Eing // Aufbereiten des nächsten BC-Bytes
L #Loop2 // Wird hochgezählt, sodass automatisch alle Bytes eingelesen werden
+I
T #Byte_eing
L 10 // Ab Lokaldatenbyte 10 ist ein Array mit chars, welcher BC puffert
L Loop
+ I
T #Pufferbereich // Aktuelles Byte für Pufferung
L DBB[DBB_Eing] // Prüfen ob ein Leerzeichen im aktuellen Byte vorhanden ist
L ' '
==I
SPB Spc // Ist ein Leerzeichen vorhanden, wird weitergesprungen, wenn nicht wird der Wert in das aktuelle Pufferbyte geschrieben
L DBB[#Byte_eing] //
T LB[#Pufferbereich]
L Loop // Schleife für das Schreiben in den Puffer wird hochgezählt ( nur wenn kein Leerzeichen vorhanden ist)
L 1
+ I
T Loop
Spc: L Loop2 // Ist ein Leerzeichen vorhanden, wird nur die Leseschleife hochgezählt, damit im Puffer das Leerzeichen nicht eingetragen wird
L 1
+I
T Loop2
L #Loop // Prüfen ob alle Zeichen bearbeitet wurden
L 1
+ I
L #Barcodelänge
<= I
SPB Up // Ist noch nicht vollständig geprüft worden, wird hoch gesprungen
Ausg: Auf DB[DB_Ausg]
CALL SFC 20 // Schieben des Puffers in den neuen Datenbaustein
SRCBLK := #Puffer
RET_VAL:=
DSTBLK := DBB[DBB_Ausg]
Ich hoffe ihr könnt etwas damit anfangen und dass meine Kommentare etwas verständlich sind. Habe den Code von Arbeit nicht hier und von daher hier jetzt fix von Hand eingeschrieben. Es sollte zwar keinen Unterschied geben, aber zur Information, wir benutzen auf Arbeit nur noch Soft-SPSen.
Beste Grüße
Wintz
Zuletzt bearbeitet: