Zeichenketten addieren

snowkopp

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

erst mal ein DICKES Lob an diesen Forum....sehr
informativ für Anfänger und Profis.
(ich zähle mich zur ersten Kategorie :))

habe folgendes Problem:

Eingangswert ASCII z.B. '126385298473'

Nun will ich den String in 3 "Stücke" teilen und diese dann addieren also so:

1263
+8529
+8473
--------
18265

Wie löse ich das Problem am besten...?
 
In der Standardbibliothek gibt es die IEC-Standardfunktionen zum bearbeiten von Strings.
FC20 LEFT: Linker Teil eines STRING.
FC26 MID: Mittlerer Teil eines STRING.
FC32 RIGHT: Rechter Teil eines Strings.
FC38 STRNG_I: Umwandlung einer String-Variablen in eine Variable vom Typ INT.
und
FC39 STRNG_R: Umwandlung einer String-Variablen in eine Variable vom Typ REAL.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
zu Marlobs Vorschlag:
Achtung, zusätzlich darauf achten, daß Step7-Strings 2 Byte "Kopfdaten" haben, die die maximale und die tatsächliche Länge des Strings enthalten. Am besten in einem DB diese Strings definieren und dann damit arbeiten, sonst streiken die IEC-Funktionen.

Alternative:
Es gäbe auch die Möglichkeit der direkten Umwandlung aus Ascii-Zeichen in Zahlen. Die Scii-ZEichencodierung enspricht in HEX dem Zahlenwert + 30hex

0 = 30hex
1 = 31hex
.
.
.
9 = 39hex

Du könntest also das ganze "zu Fuß" machen.

Bsp.:
'126385298473'

Im DB steht je eine Zahl als Ascii in einem Byte.
DB10.DBB0 Kopf Byte 0 Step7-String, falls als solcher schon abgespeichert.
DB10.DBB1 Kopf Byte 1 Step7-String, falls als solcher schon abgespeichert.

Der eigentliche String geht dann hier los, die Position kannst du dir ja aus deinem DB heraussuchen:

DB10.DBB2 --> 31hex
DB10.DBB3 --> 32hex
DB10.DBB4 --> 36hex
DB10.DBB5 --> 33hex
DB10.DBB6 --> 38hex
DB10.DBB7 --> 35hex
DB10.DBB8 --> 32hex
DB10.DBB9 --> 39hex
DB10.DBB10 --> 38hex
usw.

Wenn du die erste Zahl hernimmst:

31hex --> Tausender
32hex --> Hunderter
36hex --> Zehner
33hex --> Einer

Kannst du rechnen:

Ergebnis = (31hex-30hex) *1000 + (32hex-30hex) *100 + (36hex - 30hex) *10 + (33hex-30hex)

In AWL:

Code:
L 0
T #Ergebins1  //Int

L DB10.DBB2  //Tausender
L W#16#30    //30hex
-I
L 1000
*I
T #Ergebnis1

L DB10.DBB3  //Hunderter
L W#16#30    //30hex
-I
L 100
*I
L #Ergebnis1
+I
T #Ergebnis1

L DB10.DBB4  //Zehner
L W#16#30    //30hex
-I
L 10
*I
L #Ergebnis1
+I
T #Ergebnis1

L DB10.DBB5  //Einer
L W#16#30    //30hex
-I
L #Ergebnis1
+I
T #Ergebnis1  --> Endergebnis ist die erste Zahl

Diese Berechnung in einen FC gepackt, der die 4 Byte der Zahl als Input und das Ergebnis als Output hat.

Dann hast du aus 3 FC-Aufrufen die Zahlen und kannst das Ergebnis berechnen.
 
Zuletzt bearbeitet:
Ralle, marlob ihr seit Spitze :p

auf den iec Standardfunktionen wäre ich garnicht
gekommen....manchmal hat man halt ein Brett vorm
Kopf

ich werde wohl trotzdem die Lösung von Ralle nehmen,
da weiss ich wenigstens was gemacht wird und
ein Lerneffekt hat die ganze Sache auch noch :)

Also, Danke nochmal!!!!
 
Schulrechnen (schriftlich)

Wenn es mal mehr als 4 Dezimalstellen werden, würde ich die Berechnung so machen,
wie mal gaaaaanz früher in der Schule gelernt:

Von hinten (Einer) nach vorn Stelle für Stelle addieren und den Übertrag zur nächsten
Stelle davor mitnehmen und da addieren.

Mit diesem Verfahren ist die Anzahl der Dezimalstellen der zu addierenden Zahlen nur
durch die maximal mögliche Stringlänge begrenzt (S7-STRING: 254 Zeichen)

Gruß
PN/DP
 
Zurück
Oben