Bereich aus Zeichenkette filtern

D-Four-E

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, habe ein kleines Poblem.

Ich habe als Eingabewert eine 25-Stellige Zeichenkette [STRINGVariable]

Diese muss ich in drei Abschnitte aufteilen

Einmal die Ersten 14 Zeichen, dann Zeichen 15-25 und nochmal 20-25.

Klappt auch soweit mit dem unten stehenden Code.

Code:
      LAR1  P##RETURN
      LAR2  P##S4Label
      L     #max_Length                 //STRING Länge (INT) laden
      T     B [AR1,P#0.0]               // in 1. String Byte transferieren
      L     #Length                     //Tatsächliche Länge (INT) laden; Gleichzeitig Wert für LOOP
      T     B [AR1,P#1.0]
loo1: L     B [AR2,P#2.0]
      T     B [AR1,P#2.0]
      +AR1  P#1.0                       // Adressregister um 1 erhöhen
      +AR2  P#1.0
      TAK                               //Tausche Akku 1 und 2 (Schlaufenzähler in AKKU 1 holen)
      LOOP  loo1                        //Springe zur Marke loo1, Akku1 um 1 verringern

Für die anderen 2 Filter mache ich es ähnlich, nur das ich den Offset und die Länge entsprechend anpasse.


Nun zu meinem Problem. Ich möchte das ganze in einem FB erstellen. Dieser soll allgemein gehalten werden und für alle Filter anwendbar sein.

Momentan lade ich mir das erste Zeichen meines Labels

loo1: L B [AR2,P#2.0]

und transferiere es zum Zielzeichen

T B [AR1,P#2.0]

Wenn ich jetzt aber das ganze Variable machen möchte. z.B mal ab dem 14ten Zeichen des Label anfangen möchte, muss

der Pointer " loo1: L B [AR2,P#2.0]" veränderbar sein. Hierzu wollte ich eine Eingangsvariable "OFFSET" verwenden. Und genau da komm ich
nicht weiter.

Wie schaffe ich es bei Eingabe vom 14 den Befehl so zu verändern, dass er automatisch so auschaut

L B [AR2,P#16.0]
 
Angenommen, du willst Byte 2 also P#2.0 in das AR 1 laden.

L 2
SLD 3
T #MyPointer //eine Variable vom Typ DWORD (eine statische ist nie verkehrt)

bevor du nun Daten über AR1 indirekt adressierst, lädst du diesen Pointer in das AR1

L #MyPointer
LAR1

dann wie gewohnt auf die Daten zugreifen

L B [AR1,P#0.0] --> in Byte 2 Byte schreiben

Den Offset kannst du nutzen, mußt du aber nicht, du kannst auch einfach deinen Pointer neu mit Daten füllen:

L 16
SLD 3
T #MyPointer

Achtung, was ich hier schreibe, gilt nicht für Multintanz-FB, da gelten noch ein paar andere Regeln beim Zugriff über AR.
Lies am Besten auch mal in unserer FAQ zum Thema Pointer und Any, sowie in der Forensuche zum Thema Multiinstanz!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wenn du doch schon einen String hast - warum nicht du dann nicht sie Siemens-String-FC's LEFT, MID und RIGHT dafür her ...
Dann bräuchtest du dich auch nicht um das Beachten von Spielregeln beim Arbeiten mit AR1 und AR2 kümmern ...

Gruß
Larry
 
Zurück
Oben