Double_Integer in String wandeln

olddragon

Level-1
Beiträge
36
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, miteinander,
ich möchte eine DINT wandeln in einen String.

Allerdings akzeptiert der Baustein am RET_VAL nur einen StringTypen

Ich habe schon etwas probiert, (DB mit fester Stringlänge), funzt aber nicht

CALL "DI_STRNG"
I :=L#56734
RET_VAL:=p#db7.dbx0.0 byte 10

CALL "DI_STRNG"
I :=L#56734
RET_VAL:=p#db7.dbx0.0 byte 18

CALL "DI_STRNG"
I :=L#56734
RET_VAL:=p#db7.String

Wo stelle ich mich dumm an?
icon9.png
 
Jetzt gehts doch nicht.

Temporäre Deklaration:
Zeichenkette String[12] 0.0
FailNr INT 14.0
TE_DINT DINT 16.0
Stringlaenge INT 20.0
// Positive Flanke
U M 168.1
SPBNB _001
// Double Integer in String wandeln
CALL "DI_STRNG"
I :=#IN_DINT
RET_VAL:=#Zeichenkette
// Länge der Zeichenkette feststellen
CALL "LEN"
S :=#Zeichenkette
RET_VAL:=#Stringlaenge
// Zeichenkette in DB7 übergeben
CALL "BLKMOV"
SRCBLK :=#Zeichenkette
RET_VAL:=#FailNr
DSTBLK :=P#DB7.DBX0.0 BYTE 14
// Vorkopf beschreiben
L 12
T "DB_ZAEHLinCHAR".StringVK1
NOP 0
L #Stringlaenge
T "DB_ZAEHLinCHAR".StringVK2
_001: NOP 0


Dieser Programmteil erzeugt wilde Zeichen statt einem vernünftigen String. Als Stringlänge wird 0 ausgegeben.

Kann mir jemand sagen, warum?
 
Wie Larry schon schrieb, "#Zeichenkette" mußt initialisiert werden.
Da das bei dir eine Temp ist, geht das nur über direkten Zugriff auf die Lokaldaten oder besser (weil sauberer) über indirekte Adressierung.

L 255
T LB0 //max. Länge des Strings
L 2
T LB1 //tatsächliche Länge des Strings

oder

L P##Zeichenkette
LAR1

L 255
T B [AR1,P#0.0]
L 2
T B [AR1,P#1.0]

Da die einfache Deklaration über String einen 255 Byte langen String erzeugt, der den lokalen Stack belegt, könntest du auch z.Bsp. einen String[20] deklarieren. noch einfacher geht es, wenn du einen String ein einem DB deklarierst, dann ist er auch initialisiert.

Statt Lade 2 kannst du bitte mal lade 0 testen, sollte am Anfang ja ein String mit Länge 0 sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... und der String muss initialisiert sein - also in den beiden Headerbytes müssen die deklarierte Länge (und die tatsächliche Länge) des Strings korrekt drin stehen ...

Es reicht, die maximale Länge des Strings zu initialisieren.

Die aktuelle Länge des Strings wird dann durch den FC5 DI_STRNG beschrieben.

Gruß Kai
 
L 255
T LB0 //max. Länge des Strings
L 2
T LB1 //tatsächliche Länge des Strings

oder

L P##Zeichenkette
LAR1

L 255
T B [AR1,P#0.0]
L 2
T B [AR1,P#1.0]

Es reicht, die maximale Länge des Strings zu initialisieren.

Die aktuelle Länge des Strings wird dann durch den FC5 DI_STRNG beschrieben.

L 255
T LB0 //max. Länge des Strings

oder

L P##Zeichenkette
LAR1

L 255
T B [AR1,P#0.0]

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, miteinander,
ich möchte eine DINT wandeln in einen String.

Allerdings akzeptiert der Baustein am RET_VAL nur einen StringTypen

Ich habe schon etwas probiert, (DB mit fester Stringlänge), funzt aber nicht

CALL "DI_STRNG"
I :=L#56734
RET_VAL:=p#db7.dbx0.0 byte 10

CALL "DI_STRNG"
I :=L#56734
RET_VAL:=p#db7.dbx0.0 byte 18

CALL "DI_STRNG"
I :=L#56734
RET_VAL:=p#db7.String

Das nachfolgende Programmbeispiel wandelt mit der Funktion FC5 DI_STRNG einen DINT in einen STRING und speichert den STRING in einem DB.

Der STRING wird mit einem führenden Vorzeichen dargestellt.

Gruß Kai
 

Anhänge

  • OB1.pdf
    6,5 KB · Aufrufe: 10
  • DB100.pdf
    4,9 KB · Aufrufe: 12
  • 51919.zip
    32,5 KB · Aufrufe: 5
Und noch ein paar Bilder aus der Simulation mit PLCSIM.

Gruß Kai
 

Anhänge

  • PLCSIM_1.jpg
    PLCSIM_1.jpg
    303,8 KB · Aufrufe: 13
  • PLCSIM_2.jpg
    PLCSIM_2.jpg
    306,8 KB · Aufrufe: 9
  • PLCSIM_3.jpg
    PLCSIM_3.jpg
    306,7 KB · Aufrufe: 8
Zurück
Oben