DI_STRNG ohne Vorzeichen!

hoT

Level-1
Beiträge
109
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
hi

Suche eine solche Funktion die aber nicht das Vorzeichen mit ausgibt.

Die normale Funktion führt immer das Vorzeichen mit...

z.B. 46789(Dint) --->>> +46789(String)

Kann mir einer weiterhelfen?

mfg hoT
 
Hallo,
doch ... da gibt es noch die Funktion RIGHT - die schneidet dir vom rechten Rand deines Strings die Anzahl von zeichen ab, die du angibst ...

Gruß
LL
 
Code:
*
FUNCTION_BLOCK FB 5
TITLE =
VERSION : 0.1


VAR_INPUT
  dInput : DINT ;	
END_VAR
VAR_OUTPUT
  sOutput : STRING  [11 ];	
END_VAR
VAR_TEMP
  xMin : BOOL ;	
  xFirstNumber : BOOL ;	
  xMinus : BOOL ;	
  aChar : ARRAY  [0 .. 10 ] OF BYTE ;	
  iLoop : INT ;	
  iMinusPos : INT ;	
  iLength : INT ;	
  dTemp : DINT ;	
  dMOD : DINT ;	
  dCompare : DINT ;	
  dAR1Temp : DWORD ;	
END_VAR
BEGIN
NETWORK
TITLE =
//initialisieren
      CLR   ; 
      =     #xMinus; 
      =     #xMin; 
      =     #xFirstNumber; 
      L     1; 
      T     #iMinusPos; 
      +     -1; 
      T     #iLength; 
      TAR1  #dAR1Temp; 

      LAR1  P##sOutput; 
      +AR1  P#2.0; 
      L     11; 
init: T     #iLoop; 
      L     W#16#0; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLoop; 
      LOOP  init; 

//sonderfall
      L     #dInput; 
      L     L#-2147483648; 
      ==D   ; 
      SPBN  nmin; 
      =     #xMin; 
      L     #dInput; 
      +     1; 
      SPA   min; 

//input ist minus??
nmin: L     #dInput; 
      L     L#0; 
      <D    ; 
      L     #dInput; 
      SPBN  nonu; 
min:  SET   ; 
      =     #xMinus; 
      L     L#-1; 
      *D    ; 
nonu: T     #dTemp; 

//ja, ist minus - position für - berechnen
      U     #xMinus; 
      SPBN  ohmi; 
      L     10; 
      T     #dCompare; 
      L     10; 
nex1: T     #iLoop; 
      L     #dTemp; 
      L     #dCompare; 
      <D    ; 
      SPBN  noch; 
      L     #iLoop; 
      T     #iMinusPos; 
      SPA   ohmi; 
noch: L     #dCompare; 
      L     L#10; 
      *D    ; 
      T     #dCompare; 
      L     #iLoop; 
      LOOP  nex1; 

//ausgabe der einzelnen stellen
ohmi: LAR1  P##aChar; 
      L     11; 
next: T     #iLoop; 
      L     #dTemp; 
      L     10; 
      MOD   ; 
      L     W#16#30; 
      +I    ; 
      T     B [AR1,P#0.0]; 
      L     #dTemp; 
      L     10; 
      /D    ; 
      T     #dTemp; 
      +AR1  P#1.0; 
      L     #iLoop; 
      LOOP  next; 

//ausgabe -
      U     #xMinus; 
      SPBN  end; 
      LAR1  P##aChar; 
      L     11; 
nex2: T     #iLoop; 
      L     #iMinusPos; 
      ==I   ; 
      SPBN  naec; 
      L     W#16#2D; 
      T     B [AR1,P#0.0]; 
      SPA   end; 
naec: +AR1  P#1.0; 
      L     #iLoop; 
      LOOP  nex2; 

//rauskopieren
end:  LAR1  P##sOutput; 
      +AR1  P#2.0; 
      L     #aChar[10]; 
      L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non9; 
      SET   ; 
      =     #xFirstNumber; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 

non9: L     #aChar[9]; 
      L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non8; 
      SET   ; 
      =     #xFirstNumber; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 

non8: L     #aChar[8]; 
      L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non7; 
      SET   ; 
      =     #xFirstNumber; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 

non7: L     #aChar[7]; 
      L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non6; 
      SET   ; 
      =     #xFirstNumber; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 

non6: L     #aChar[6]; 
      L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non5; 
      SET   ; 
      =     #xFirstNumber; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 

non5: L     #aChar[5]; 
      L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non4; 
      SET   ; 
      =     #xFirstNumber; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 

non4: L     #aChar[4]; 
      L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non3; 
      SET   ; 
      =     #xFirstNumber; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 

non3: L     #aChar[3]; 
      L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non2; 
      SET   ; 
      =     #xFirstNumber; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 

non2: L     #aChar[2]; 
      L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non1; 
      SET   ; 
      =     #xFirstNumber; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 

non1: L     #aChar[1]; 
      L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non0; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      SET   ; 
      =     #xFirstNumber; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 

non0: U     #xMin; 
      SPBN  nee; 
      L     #aChar[0]; 
      +     1; 
      SPA   doch; 
nee:  L     #aChar[0]; 
doch: L     W#16#30; 
      ==I   ; 
      UN    #xFirstNumber; 
      SPB   non; 
      SET   ; 
      =     #xFirstNumber; 
      TAK   ; 
      T     B [AR1,P#0.0]; 
      +AR1  P#1.0; 
      L     #iLength; 
      +     1; 
      T     #iLength; 


non:  LAR1  P##sOutput; 
      L     #iLength; 
      T     B [AR1,P#1.0]; 

      LAR1  #dAR1Temp; 

      SET   ; 
      SAVE  ; 

END_FUNCTION_BLOCK

...in SCL wäre das ganze kopieren einfacher zu lösen... aber AWL hat halt auch seinen reiz ^^
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Suche eine solche Funktion die aber nicht das Vorzeichen mit ausgibt.

Die normale Funktion führt immer das Vorzeichen mit...

z.B. 46789(Dint) --->>> +46789(String)

Hier ist ein Programmbeispiel für die Umwandlung einer DINT-Zahl in einen STRING (ohne Vorzeichen):

Code:
FUNCTION_BLOCK FB 100
TITLE =Umwandlung DINT nach STRING (ohne Vorzeichen)
 
//DINT L#-2147483648 bis L#+2147483647 
//
//Maximale Länge STRING (mit Vorzeichen)  = 11 CHAR
//
//Maximale Länge STRING (ohne Vorzeichen) = 10 CHAR
//   
 
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : 'STRING'
VERSION : 1.0
 
VAR_INPUT
  IN_DINT : DINT ; 
END_VAR
VAR_OUTPUT
  OUT_STRING : STRING  [10 ]; 
END_VAR
VAR
  TEMP_STRING : STRING  [11 ]; 
END_VAR
VAR_TEMP
  TEMP_LAENGE : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =Umwandlung DINT nach STRING (mit Vorzeichen)
 
      CALL FC     5 (
           I                        := #IN_DINT,
           RET_VAL                  := #TEMP_STRING);
      NOP   0; 
 
NETWORK
TITLE =Aktuelle Länge STRING (mit Vorzeichen)
 
      CALL FC    21 (
           S                        := #TEMP_STRING,
           RET_VAL                  := #TEMP_LAENGE);
      NOP   0; 
 
NETWORK
TITLE =Aktuelle Länge STRING (ohne Vorzeichen)
 
      L     #TEMP_LAENGE; 
      L     1; 
      -I    ; 
      T     #TEMP_LAENGE; 
      NOP   0; 
 
NETWORK
TITLE =Umwandlung STRING (mit Vorzeichen) nach STRING (ohne Vorzeichen)
 
      CALL FC    32 (
           IN                       := #TEMP_STRING,
           L                        := #TEMP_LAENGE,
           RET_VAL                  := #OUT_STRING);
      NOP   0; 
 
END_FUNCTION_BLOCK

Gruß Kai
 

Anhänge

  • OB1.pdf
    5,8 KB · Aufrufe: 27
  • FB100.pdf
    7,7 KB · Aufrufe: 37
  • DB200.pdf
    4,5 KB · Aufrufe: 23
  • String.zip
    35,8 KB · Aufrufe: 30
Und noch ein paar Bilder aus der Simulation mit PLCSIM.

Gruß Kai
 

Anhänge

  • PLCSIM_1.jpg
    PLCSIM_1.jpg
    248 KB · Aufrufe: 41
  • PLCSIM_2.jpg
    PLCSIM_2.jpg
    239,9 KB · Aufrufe: 31
  • PLCSIM_3.jpg
    PLCSIM_3.jpg
    247,9 KB · Aufrufe: 30
@kai: bißchen viel aufwand, find ich ... if input < 0 then input := input * -1 und dann DI_STRNG ...

[edit] ... das + vergessen ... mist [/edit]
[edit] an dieser stelle nochmal: DANKE ANDRÉ!:sw13:[/edit]
 
Zuletzt bearbeitet:
Zurück
Oben