String im Programm eingeben

Paule

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

kann ich eigentlich einen String direkt im Programm eingeben und ihn dann per SFC20 oder sonst irgendwie kopieren?
Jeden Buchstaben einzeln habe ich schon mal gemacht, gefällt mir aber nicht.
Hintergrund:
Der String muss in einem Instanz-DB landen, ich möchte ihn aber nicht in diesem DB als Anfangswert angeben (gefällt mir auch nicht).
Irgendwie so:
Code:
   CALL SFC20
     SRCBLK  : Hausnummer
     RET_VAL:
     DSTBLK  : Adresse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi dalbi,

in SCL habe ich es noch gar nicht probiert, du meinst da geht es?
Es ist halt nur so dass ich mich schon von der ganz Parametrierung in dem entsprechende FB befinde.
Was natürlich nicht stören würde wenn ich den String einem kleinen SCL Baustein übergeben könnte und der führt dass kopieren durch.
 
Moin,

ich glaub der sfc20 kann nur any als eingangstyp. Das wird dir ja aber F1 verraten. Immer wenn ich strings kopieren musste lagen die irgendwo in einem DB und habe sie dann per sfc20 mit startadresse und länge rumgeschubst.

Wie meinstn du das eigentlich: direkt eingeben?
 
Wie meinstn du das eigentlich: direkt eingeben?
Mein Wunschgedanke wäre:
Code:
   U #Neue_Adresse
   = #Initialisierung

   [COLOR=#ff0000]L Hausnummer // String
   T Adresse  // String
[/COLOR]
// oder wenn es wie dalbi sagt in SCL geht
   CALL FCx // SCL-Baustein
     IN  : Hausnummer
     OUT : Adresse

Das rote stelle ich mir unter direkter Eingabe vor ;)
SFC20 wäre auch ok
 
Zuletzt bearbeitet:
Ich lege mit i.d.R. einen DB an, der u.a. auch Stringkonstanten enhält.

Z.Bsp. einen String[30], Variablenname Anlage, Inhalt "Stanzmaschine 1".
Dann kann ich am SFC 20 direkt DB20."Anlage" verwenden.
Oder ich fülle den Db zur Laufzeit mit den Strings, die ich benötige, z.Bsp. einer
Artikelnummer und habe am SFC 20 immer DB20."Artikelnummer" stehen.

Ansonsten ist SCL im Falle von Stringverarbeitung 1. Wahl in der S7, aber nicht
unbedingt mit vielen langen Temp-Strings arbeiten, das führt rasch zu einem Überlauf
beim Stack für die lokalen Variablen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Irgendwie klappt das nicht

1. Variante in SCL:
Endet schon bei der Eingabe mit Fehler von einer Parameterübergabe bin ich da noch weit weg.

String.jpg

2. Variante in AWL:
Text 'HausNr' als fester String
Hausnummer als Variable
Hausnummer mit dem I_STRING (FC16) in einen Sting gewandelt.
Anschließend wollte ich die beiden mit dem INSERT (FC17) zusammensetzen.
Allerdings setzt der Baustein selbständig ein '+' dazu :evil: :
'HausNr + 10' und das ist unbrauchbar.
 
Hallo,

Mit Strings hantiere ich selten, aber in der Hilfe zum Blockmove steht:

Wenn Sie für die Parameter SRCBLK und DSTBLK Variablen vom Datentyp STRING verwenden, interpretiert STEP 7 diese Variablen als ARRAY of BYTE (einschließlich den beiden Verwaltungsbytes mit maximaler und aktueller Länge). Das führt dazu, dass die SFC 20 byteweise kopiert: Kopiert werden also das Byte mit maximaler Länge, das Byte mit aktueller Länge und der eigentliche String.

Wenn bei einem der Parameter SRCBLK oder DSTBLK oder bei beiden der Datentyp STRING zur Anwendung kommen soll, müssen Sie die zugehörigen ANY-Pointer selbst aufbauen. Ist die Quelle ein String, werden maximal nur die aktuell im String enthaltenen Zeichen kopiert. Sind Quelle und Ziel jeweils ein String, wird die aktuelle Länge des Ziels auf die Anzahl der kopierten Zeichen gesetzt.
 
Unter SCL und Blockmove über ne Variable arbeiten.

DeinString:='Hausnr'

"Deinstring" dann an den Blockmove.
Wobei es unter SCl sogar direkt gehen kann/muss:
DB2.adresse:=Deinstring;
oder
DB2.adresse:='Hausnr';

am besten die Strings noch vorher Initialisieren.

Gruss Andi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK, dann muss ich es noch mal mit dem direkten "Durchreichen" probieren.

Danke fürs erste. :D
Werde mich für dieses Wochenende mal abmelden.
(Höchstens mal zwischendurch kurz reinschauen) ;)
 
Unter SCL und Blockmove über ne Variable arbeiten.

DeinString:='Hausnr'

"Deinstring" dann an den Blockmove.
Wobei es unter SCl sogar direkt gehen kann/muss:
DB2.adresse:=Deinstring;
oder
DB2.adresse:='Hausnr';

am besten die Strings noch vorher Initialisieren.
Eins noch!
Jetzt soll als INPUT Variable die tatsächlich Hausnummer (Integer) noch dazu kommen.
Wie verbinde ich die zwei das es ein Sting ergibt?
Code:
   DB2.adresse:='Hausnr' + Hausnummer;   // das wird so nicht gehen, oder?
 
Es gibt da einen Schwung IEC-Funktionen in der STEP7 Bibliothek, unter anderem finden sich da auch:
FC2: CONCAT: Zusammenfassen zweier STRING-Variablen
FC16: I_STRING: Formatwandlung INT nach STRING
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eigentlich sieht es dann so aus:

DB2.adresse := CONCAT(in1:='Strasse',In2:=(INT_TO_STRING(Hausnummer));

aber die Funktion INT_TO_STRING macht immer ein Vorzeichen dazu, das keiner will also
kann man es so machen oder so ähnlich...

DB2.adresse := CONCAT(in1:='Strasse',In2:=DELETE(IN:=INT_TO_STRING(Hausnummer),l:=1,P:=1));

dann kommt raus
DB2.adresse := 'Strasse13



schoenes WoE
ASAB
 
DB2.adresse := CONCAT(in1:='Strasse',In2:=DELETE(IN:=INT_TO_STRING(Hausnummer),l:=1,P:=1));

dann kommt raus
DB2.adresse := 'Strasse13
Hallo ASAB,
genau so funktioniert es, vielen Dank. :s1:
Und die Erklärung warum der FC16 selbständig ein Pluszeichen dazu setzt (Vorzeichen) hast du auch noch gleich dazu gegeben. Danke :D

Ich könnte jetzt schon zufrieden sein, aber man bekommt ja nie genug: ;)
Und zwar wenn ich jetzt die direkte Adressierung "DB2.adresse" als Output übergeben möchte und als es folgend deklariere:
Code:
   VAR_OUTPUT
      Adresse : STRING; // STRING[254] habe ich auch probiert
   END_VAR

   Adresse := CONCAT(in1:='Strasse',In2:=DELETE(IN:=INT_TO_STRING(Hausnummer),l:=1,P:=1));
kommt die Fehlermeldung:
Parameterzuweisung nicht korrekt. :confused:
 
Und zwar wenn ich jetzt die direkte Adressierung "DB2.adresse" als Output übergeben möchte und es folgend deklariere:
Code:
   VAR_OUTPUT
      Adresse : STRING; // STRING[254] habe ich auch probiert
   END_VAR

   Adresse := CONCAT(in1:='Strasse',In2:=DELETE(IN:=INT_TO_STRING(Hausnummer),l:=1,P:=1));
kommt die Fehlermeldung:
"Parameterzuweisung nicht korrekt". :confused:
Hat keiner eine Idee?
 
Zurück
Oben