Problem mit BLKMOV

dasgrundprinzip

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo miteinander,
ich habe ein kleines Problem. Udn zwar möchte ich eine Real-Zahl in einen String umwandeln. Hierfür hab' ich mir von OSCAT dei Funktion REAL_TO_STRF besorgt.

Die beiden Variablen liegen im DB301
+0.0 realzahl REAL 1.230000e+000
...
+6.0 realstring STRING[14] '666'

#str ist eine Lokale Temp-Variable vom Typ STRING

Hier ist der Code den ich dafür benutzen wollte. Nur irgendwie scheint das nicht zu funktionieren. Der String wird immer mit nullen überschrieben.

Code:
      CALL  "REAL_TO_STRF"
       IN     :=DB301.DBD0
       N      :=2
       RET_VAL:=#str



      CALL  "BLKMOV"
       SRCBLK :=#str
       RET_VAL:=MW0
       DSTBLK :=P#DB301.DBX6.0 BYTE 14
Wo liegt mein Denkfehler? Danke schon mal.
 
Zuletzt bearbeitet:
Hallo,
ich meiner Step7-Hilfe steht zwar, das String-Array's nicht kopiert werden - einzelne Strings aber schon. Daran wird es also wohl nicht liegen.

Da du eine TEMP-Variable für die String-Zuweisung nimmst ... versuch doch mal diese vor Verwendung zu initialisieren (deklarierte Länge und 0 für die tatsächlich genutze Länge in die Bytes 0 + 1 des Strings-Headers einzutragen ...

Gruß
LL
 
Code:
P#L 0.0 BYTE 14

0.0 muss Du dann durch die Anfangsadresse von #str ersetzen.

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
geht auch ohne Blockmove..

Deine temporär-Variable #str vom Typ "String" belegt ja einen Adressbereich im Temp-Bereich. Den kannst Du auch 'normal' mit einem Move-Befehl umkopieren:

Code:
L LW0             //Erstes Wort der Lokalen Stringvariable
T DB301.DW6   //Erstes Wort im DB
L LW2             //Zweites Wort der Lokalen Stringvariable
T DB301.DW8   //Zweites Wort im DB
usw

Siehe auch Beitrag #4 und #5

Gruß
 
Wenn ich mit dem Pointer auf den lokalen String zeige - wie von Gebs beschrieben - bekomme ich ebenfalls nur Nullen.

Die Variante von Approx liefert das selbe ergebnis

es scheint das im String #str schon nichts drinsteht.
 
aus der OSCAT-Hilfe zu dem verwendeten Baustein:
REAL_TO_STRF konvertiert einen REAL-Wert in einen STRING mit einer festen
Anzahl von Nachkommastellen N. Bei der Konvertierung wird ausschließlich
in Normales Zahlenformat XXX.NNN umgewandelt. Bei der Umwandlung
wird IN auf N Stellen nach dem Komma gerundet und dann in
einen String mit dem Format XXX.NNN gewandelt. Wenn N = 0 wird die
REAL Zahl auf 0 Stellen hinter dem Komma gerundet und das Ergebnis als
Integer ohne Punkt und Nachkommastellen ausgegeben. Wenn die Zahl IN
kleiner ist als mit N Nachkommastellen erfasst werden können wird eine
Null ausgegeben. Die Nachkommastellen werden immer auf N Stellen mit
Nullen aufgefüllt. Die maximale Länge der Zeichenkette beträgt 20 Stellen.
Beispiel: REAL_TO_STRF(3.14159,4) = '3.1416'
REAL_TO_STRF(3.14159,0) = '3'
REAL_TO_STRF(0.04159,3) = '0.042'
REAL_TO_STRF(0.001,2) = '0.00'
 
Sicher. Ich hab bloß vermutet, dass deine angegebenen 1,23 nur als Beispiel zur Problemverdeutlichung dienten und in Wirklichkeit eine dynamische Variable am IN parametriert war. Wenn diese dann kleiner 0,01 ist, wäre das eine mögliche Erklärung gewesen...

Tja.. dann ist es ja nen komischen kram. Kannst Du statt einer Temp-Variable nicht mal nen DB oder Merkerbereich dranklatschen?

Gruß
 
Hallo

Warscheinlich ist deine Lägenangabe nur falsch
STRING[14] ist 16 Byte lang

also beim Block Move auch 16 Byts
DSTBLK :=P#DB301.DBX6.0 BYTE 16

mfg Jochen
 
Zurück
Oben