Step 7 Umwandlung von DINT zu STRING

Am einfachsten legst du in enem DB eine Variable vom Typ String an.
Die kannst du auch in der Länge begrenzen. (Mußt du mal ausprobieren.) Das spart u.U. Speicher.
Ist das nicht nötig, einfach String schreiben statt z.B. String[15], dann hat man die max. Länge.

Datentyp Länge (Bit) Format Beispiele für das Format
Min. Max.
DINT 32 Ganzzahl mit Vorzeichen L# -2147483648 L#+2147483647

Im DB1, Symolik "Wertespeicher"

Code:
diWert    DINT           L#0        
strWert   STRING[10]     ''

Code:
      CALL  "DI_STRNG"
       I      :="Wertespeicher".diWert
       RET_VAL:="Wertespeicher".strWert
 
Zuletzt bearbeitet:
also ich bekomme zumindest damit keine Fehler mehr. aber aus dem DINT-Wert 1234 macht die Funktion "$I"
 
Wo wird "$I" ausgegeben??? Wo siehst Du das?

Beobachte die ersten 8...12 Bytes des Strings einzeln in einer Variablentabelle.
Schau Dir in der S7-Hilfe den Aufbau eines Strings an, die String-Zeichen liegen erst ab dem dritten Byte.

Harald
 
Hallo zusammen,

ich habe ein ähnliches Problem und finde den Fehler gerade nicht.

Ich habe einen Temp-String[9] Adresse 126.0 angelegt.
Aus dem DB6102.DBD12 möchte ich die Zahl 984625701 (9 Stellen) in den DB1241 ab BYTE 190 schreiben.
Das Ergebnis ist:

DB1241.DB190 = 9
DB1241.DB191 = 9
DB1241.DB192 = 0
DB1241.DB193 = 0
..usw.

Hat jemand eine Idee?

Vielen Dank!
 

Anhänge

  • DINT_String.PNG
    DINT_String.PNG
    16,9 KB · Aufrufe: 35
Ich habe einen Temp-String[9] Adresse 126.0 angelegt.
(...)
Das Ergebnis ist:

DB1241.DB190 = 9
DB1241.DB191 = 9
DB1241.DB192 = 0
DB1241.DB193 = 0
..usw.
Ist nach dem CALL FC5 das BIE Bit gesetzt?
Vermutlich ist Dein Zielstring Sachn_String : STRING[9] zu kurz. Ich glaube, DI_STRNG erwartet einen String mit mindestens 11 Zeichen Länge. Probiere mal mit Sachn_String : STRING[12]

Code:
L 9
[COLOR="#FF0000"]T LB 126
T LB 127[/COLOR]

[COLOR="#008000"]// ist gaaanz schlechter Programmierstil. Besser:[/COLOR]

LAR1 P##Sachn_String  //Adresse des STRING[12]
L W#16#0C0C           //maxLen + aktLen jeweils 12
T LW [AR1, P#0.0]     //Stringheader initialisieren

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe die Änderungen so übernommen. Danke dafür.
Es sieht auch schon fast perfekt aus, allerdings ist das 1. Zeichen jetzt ein "+" und das letzte Zeichen dadurch verloren gegangen...
 

Anhänge

  • DINT_String_2.PNG
    DINT_String_2.PNG
    12 KB · Aufrufe: 16
Code:
      LAR1  P##Sachn_String             //Adresse des STRING[12]
      L     W#16#C0C                    //maxLen + aktLen jeweils 12
      T     LW [AR1,P#0.0]              //Stringheader initialisieren


      CALL  "DI_STRNG"
       I      :="DB_PSS_AM1_SS_LP_E".PZUM.A_SACHNR_TYP_RUESTEN
       RET_VAL:=#Sachn_String
      NOP   0


      CALL  "sfc_BLKMOV"
       SRCBLK :=P#L 126.0 BYTE [B]12[/B]
       RET_VAL:=#RET_VAL_T
       DSTBLK :=P#DB1241.DBX190.0 BYTE [B]12[/B]
      NOP   0

Hab noch eine Kleinigkeit geändert. Die letzte Zahl ist jetzt auch da, aber halt an 10. Stelle durch das "+" an 1. Stelle....
 
Zuletzt bearbeitet:
Frage: Hat "DB_PSS_AM1_SS_LP_E".PZUM.A_SACHNR_TYP_RUESTEN immer 9 Ziffern ? Kann es z.B. passieren dass der erste Stelle ein "0" sein kann ?
Dass wurde mit DI_STRNG bedeuten dass den ganzen STRING nach links geschoben wurde.

Wenn man davon ausgehen kann dass es immer 9 Stellen bzw. 10 Zeichen nach Umwandlung mit DI_STRNG gibts, dann kann man mittels FC32 RIGHT aus den Standardbibliotek den Vorzeichen ausfiltern.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      CALL  "DI_STRNG"
       I      :="DB_PSS_AM1_SS_LP_E".PZUM.A_SACHNR_TYP_RUESTEN
       RET_VAL:=#Sachn_String
      NOP   0


      CALL  "sfc_BLKMOV"
       SRCBLK :=P#L 126.0 BYTE [B][COLOR="#FF0000"]12[/COLOR][/B]
       RET_VAL:=#RET_VAL_T
       DSTBLK :=P#DB1241.DBX190.0 BYTE [B][COLOR="#FF0000"]12[/COLOR][/B]
      NOP   0
Tipp: mehr symbolisch adressieren, dann macht man weniger Fehler:
Code:
// falsch:
      CALL  "sfc_BLKMOV"
       SRCBLK :=P#L 126.0 BYTE [COLOR="#FF0000"][B]12[/B][/COLOR]
       RET_VAL:=#RET_VAL_T
       DSTBLK :=P#DB1241.DBX190.0 BYTE [COLOR="#FF0000"][B]12[/B][/COLOR]
      NOP   0

// richtig:
      CALL  "sfc_BLKMOV"
       SRCBLK :=P#L 126.0 BYTE [COLOR="#008000"][B]14[/B][/COLOR]
       RET_VAL:=#RET_VAL_T
       DSTBLK :=P#DB1241.DBX190.0 BYTE [COLOR="#008000"][B]14[/B][/COLOR]
      NOP   0

// ganz richtig:
      CALL  "sfc_BLKMOV"
       SRCBLK :=[COLOR="#008000"][B]#Sachn_String[/B][/COLOR]
       RET_VAL:=#RET_VAL_T
       DSTBLK :=[COLOR="#008000"][B]"MyDB1241".Zielstring[/B][/COLOR]
      NOP   0

Warum wandelst Du erst in den TEMP-String und kopierst dann in den Zielstring in DB1241? Du kannst auch gleich in den Zielstring in DB1241 wandeln.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich es so teste sind lediglich die ersten BYTEs vom STRING "0"?
Also aktuelle Länge und max. Länge.
Das sollte nicht sein.
In mein Beispiel wird den erste STRING[10] mit 10 Zeichen befüllt, und aktuelle Länge wird dann automatisch auf 10 eingestellt.
Und den zweiten STRING[9] wird mit 9 Zeichen befüll, und aktuelle Länge wird automatisch auf 9 eingestellt.
Sonnst manipuliere ich die STRINGs nicht. Auch nich max und aktuelle Längen.
 
Ich sehe gerade, dass in der Schnittstelle ein STRING mit 24 Zeichen erwartet wird (vermutlich wird er in Zukunft länger).
 
Zuletzt bearbeitet:
Zurück
Oben