Step 7 Schleifen mit indirekter Adressierung

Wintz

Level-1
Beiträge
22
Reaktionspunkte
0
Zuviel Werbung?
-> 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
 
Zuletzt bearbeitet:
Vielleicht sollten wir doch lieber warten, bis wir Deinen echten Code sehen?
Dein "Gedächtnisprotokoll" ist kaum nachzuvollziehen und enthält Syntaxfehler, z.B. beim SFC20 die Angabe "DSTBLK := DBB[DBB_Ausg]" kann so überhaupt nicht richtig sein.

Vorab:

Das Problem ist, dass mir die SPS immer in Stop geht :wink:
Das ist doch kein Problem - schau in den Diagnosepuffer, da verrät Dir die CPU warum sie in Stop geht.
Ich tippe mal auf etwas in der Richtung "Ausrichtungsfehler"

Schaue nochmal in die Step7-AWL-Hilfe zur speicherindirekten Adressierung.

Wenn man auf ein Byte indirekt zugreifen will (L DBB[#Byte_eing]), dann muß man die Byteadresse vorher mit 8 multiplizieren (üblicherweise per "SLD 3"), weil die indirekte Adressierung eine Bitadresse benötigt.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.
Ohne deinen Code geprüft zu haben:
Lade dir die Fehler-OB´s und schau´dann
zur Laufzeit im Diagnosepuffer nach, was
dort angemeckert wird.

P.S. Für Programm-Code gibt es die Raute in der 2. Button-Zeile ganz rechts ;)
 
.
Habe deinen Code mal in PLC-Sim geschmissen,
da tritt tatsächlich der Ausrichtungsfehler auf
wie es PN/DP bereits vermutet hat.
 
Um gottes Willen, ja dass ich die Werte nach links schieben muss, um einen Pointer daraus zu machen, hab ich ja komplett vergessen. Danke dafür. Aber wie hast du es gesehen, bei mir hat der Diagnose Puffer nur den Durchlauf von OB121 angezeigt, also Programmfehler?
 
Zurück
Oben