Step 7 SCL: Probleme mit Concat/Insert

Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich probiere nun schon seid einiger Zeit aus mir einen String zusammen zu basteln, aber es kommt nie das richtige raus. Im Prinzip "caste" ich mir aus einem integer einen String und möchte den dann anschließend immer auf eine Feste Länge (3 Stellen) bringen. Dafür will ich vorne einfach 0-er anfügen, jedoch funktioniert das bei mir nicht wirklich. SCL-Code:
Code:
nettoD := DELETE(IN:=nettoD, L:=1, P:=1); // das + vorne wegschneiden, Funktioniert einwandfrei
IF LEN(nettoD) = 1 THEN
    nettoD := INSERT(In1:=nettoD,IN2:='0',P:=0);
END_IF;
IF LEN(nettoD) = 2 THEN
    nettoD := INSERT(In1:=nettoD,IN2:='0',p:=0);
ELSIF LEN(nettoD) > 3 THEN
    nettoD :='-01';
END_IF;

Das gleiche habe ich schon mit
Code:
INSERT(IN1:=nettoD,IN2:='0',P:=0)
probiert, hat aber leider auch nciht den Gewünschnten Effekt gebracht. Die Ausgabe ist in beiden Fällen immer "000".
Weiß einer woran das liegen kann, und wie ich diesen Fehler beheben kann?
nettoD ist eine Statische Variable.

lg und Danke schonmal
 
Ich habe es jetzt mehr oder Weniger dadurch gelöst, dass ich eine temporäre variable "nettoDT" deklariert habe und dieser den Wert der CONCAT-Funktion zuweise. So funktioniert alles so wie gedacht.
Nur, warum muss ich extra eine Variable Anlagen? Ich weiß, dass ich das CONCAT-Ergebnis auch wieder in der selben Variable speichern kann, allerdings funktioniert das (durch ausprobieren herausgefunden) auch nur, wenn sie als erste Variable übergeben wird. Weiß einer warum das so ist? Übergibt man sie als zweite variable, "verkommt" die Stringlänge des Ergebnisses zu -2.

lg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.

Ich kenne natürlich Deine Integer-Werte nicht, aber wenn sie niemals größer als 999 sind, dann könntest Du doch einfach 1000 dazuzählen und dann mit DELETE einfach die 1. Stelle entfernen.

VG Carsten
 
Nur, warum muss ich extra eine Variable Anlagen? Ich weiß, dass ich das CONCAT-Ergebnis auch wieder in der selben Variable speichern kann, allerdings funktioniert das (durch ausprobieren herausgefunden) auch nur, wenn sie als erste Variable übergeben wird. Weiß einer warum das so ist? Übergibt man sie als zweite variable, "verkommt" die Stringlänge des Ergebnisses zu -2.

Wie stellst du die -2 denn fest? Für die Stringlänge ist nur ein Byte vorgesehen. Und dieses hat überhaupt kein Vorzeichen, kann also auch keine negativen Werte annehmen.

Edit:
-2 wäre für ein Wort Hexadezimal 16#FE00, das wäre für ein Byte in vorzeichenloser Darstellung die Länge 254. Das ist die maxmale Länge eine Strings in der S7, und auch die Länge wenn du bei der Deklaration keine Längenangabe machst (stringvar : STRING;). Das ist also prinzipiell erstmal in Ordnung.
 
Zuletzt bearbeitet:
@Kallemann: Das wäre natürlich auch eine Idee, Dankeschön!

@Thomas-v2.1: Die -2 bekomme ich, indem ich mir während der Laufzeit das erste Byte der Stringvariablen anzeigen lasse. In Dezimaler Darstellung steht dann da "-2". Sollte aber deiner Beschreibung entsprechen, da ich dem String keine Länge explizit mit angebe.

Weiß zufällig noch jemand, was es mit dem eher unverständlcihen Verhalten von Concat auf sich hat ? Ein Beispiel: (Annahme: var ist statisch)
Code:
var:='123;
var:=CONCAT(var,'456');
//ergebnis: var := '123456'
var:='123';
var:=CONCAT('0',var);
//ergebnis: var:='000';

Leider Findet man in der Dokumentation darauf keinerlei Hinweise: "Die Funktion CONCAT (FC2) faßt zwei STRING-Variable zu einer Zeichenkette zusammen"

lg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
mal so aus Neugier : Hast du mal versucht, dem CONCAT keine Konstante ('456') zu übergeben sondern einen 2. deklarierten String (kann hier auch TEMP sein) ?
Also so :
Code:
var := '123;
var2 := '456';
var:=CONCAT(var,var2);
Gruß
Larry
 
Zurück
Oben