# String Variable in AWL beschreiben



## jaepen (9 Mai 2011)

Hallo 

ich hab eine wohl ziemlich oofe Frage.
Ich möchte einfach nur eine string variable die ich angelegt hab in awl beschreiben. Aber irgendwie bin ich wohl zu doof dafür.


```
variable = 'hallo welt'
```
 
wie funktioniert das ?

Gruß


----------



## dtsclipper (9 Mai 2011)

Ein String ist im Grunde ein ARRAY of BYTE, in einem DB angelegt.

Die einfachversion ist dann


```
L 'hall'
T dbxx.DBDy
 
L 'o we'
T DBxx.DBD(y+4)
 
usw.
```


----------



## jaepen (9 Mai 2011)

*danke*

und wenn ichs über den variablenname machen möchte?


----------



## Ralle (9 Mai 2011)

jaepen schrieb:


> und wenn ichs über den variablenname machen möchte?



Da ich das oft benötige, habe ich mir in SCL einen kleinen FC dafür gemacht.
Der tut nichts weiter, als den String am Input auf den String am Output umzukopieren. Wenn du kein SCL hast, kann ich den auch gerne hier einstellen


```
FUNCTION FC254 : INT

Title = 'String umkopieren'
//
// String umkopieren
//
Version : '1.0'
author  : ralle
name    : STR_KOP
family  : SYSTEM

VAR_INPUT
   // Eingangsparameter
   InString: STRING;
END_VAR

VAR_OUTPUT 
   // Ausgangsparameter
   OutString: STRING;
END_VAR

VAR_TEMP
    // temporäre Variablen
END_VAR

// Anweisungsteil
    OutString := InString;
   
    ;
    FC254 := 100;
END_FUNCTION
```

Eine Alternative wäre noch der SFC20, mit dem geht das auch!


----------



## jaepen (9 Mai 2011)

hmm, also an scl hab ich auch schon gedacht. einen extra fc dafür zu schreiben erscheint mir etwas aufwendig?

an den sfc 20 hab ich auch schon gedacht. Aber wie gebe ich dabei meinen Eingangsstring an?


----------



## Ralle (9 Mai 2011)

jaepen schrieb:


> hmm, also an scl hab ich auch schon gedacht. einen extra fc dafür zu schreiben erscheint mir etwas aufwendig?
> 
> an den sfc 20 hab ich auch schon gedacht. Aber wie gebe ich dabei meinen Eingangsstring an?



Den String gibst du Symbolisch an. Du legst einen DB an, in welchen die Strings definiert sind, z.Bsp. DB 20, dann schreibst du:

DB20.str_rcv

wobei str_rcv z.Bsp. als String[32] definiert sein kann.

DB20 würde sich auch noch eine Symbolik geben, z.Bsp. MyString, dann

"MyString".str_rcv an den SFC20 schreiben.

PS: Klar, der extra FC muß nicht sein, aber ursprünglich hat der noch mehr getan.


----------



## volker (9 Mai 2011)

die sfc20 erwartet einen parameter vom typ any.
siehe bild
instring sieht direkt addressiert so aus
P#db1.dbx0.0 byte 22


----------



## Thomas_v2.1 (9 Mai 2011)

dtsclipper schrieb:


> Ein String ist im Grunde ein ARRAY of BYTE, in einem DB angelegt.


Nur dass bei euren Versionen das Setzen der korrekten Stringlänge fehlt.
Macht man das nicht, arbeiten die diversen String-Funktionen aus der Standard-Lib auf diesem String nicht mehr wie gewünscht.


----------



## Ralle (9 Mai 2011)

volker schrieb:


> die sfc20 erwartet einen parameter vom typ any.
> siehe bild
> instring sieht direkt addressiert so aus
> P#db1.dbx0.0 byte 22



Bei einem String, kann man direkt die String-Variable symbolisch an den SFC20 schreiben!


----------



## Ralle (9 Mai 2011)

Thomas_v2.1 schrieb:


> Nur dass bei euren Versionen das Setzen der korrekten Stringlänge fehlt.
> Macht man das nicht, arbeiten die diversen String-Funktionen aus der Standard-Lib auf diesem String nicht mehr wie gewünscht.



Wenn man einen DB nimmt und dort einen String definiert und den schon vorbelegt, dann paßt der Stringkopf und muß nicht per Hand befummelt werden. Wichtig ist das hauptsächlich bei Temp-String, die zur Laufzeit gefüllt werden aber verkehrt ist es auch nicht, die Köpfe zumindest mal zu kontrollieren.


----------



## Thomas_v2.1 (9 Mai 2011)

Ralle schrieb:


> Wenn man einen DB nimmt und dort einen String definiert und den schon vorbelegt, dann paßt der Stringkopf und muß nicht per Hand befummelt werden. Wichtig ist das hauptsächlich bei Temp-String, die zur Laufzeit gefüllt werden aber verkehrt ist es auch nicht, die Köpfe zumindest mal zu kontrollieren.



Ja, stimmt. Beim Blockmove oder deinem SCL Stringcopy wird der Kopf mitkopiert.
Bei der Variante von dtsclipper muss man aber den Kopf (zumindest die Aktuallänge) selber passend setzen. Ist mir nur eingefallen, weil es hier letztens öfters mal Probleme gab die auf den falschen String-Kopf zurückzuführen waren.


----------



## jaepen (10 Mai 2011)

Ralle schrieb:


> Den String gibst du Symbolisch an. Du legst einen DB an, in welchen die Strings definiert sind, z.Bsp. DB 20, dann schreibst du:
> 
> DB20.str_rcv
> 
> ...


 

Hallo 
vielen Dank erst mal für die Antworten.
Eure Lösungen sind mir soweit alle klar. Was mit jedoch fehlt wie bekomme ich "hallo Welt" in den String und nicht wie kopiere ich einen string der schon vorhanden ist?


```
SCRBLK := 'hallo welt'
```
 
funktioniert bei mir nicht (in AWL). Das kann ich dem SFC20 so nicht übergeben....


----------



## Ralle (10 Mai 2011)

jaepen schrieb:


> Hallo
> vielen Dank erst mal für die Antworten.
> Eure Lösungen sind mir soweit alle klar. Was mit jedoch fehlt wie bekomme ich "hallo Welt" in den String und nicht wie kopiere ich einen string der schon vorhanden ist?
> 
> ...



Ah, da hatte ich dich dann doch falsch verstanden. In AWL geht das nur mit der Methode von dtsclipper. Da ich i.d.R. fest Strings irgendwohin senden muß, lege ich die im Datenbaustein ab und das schon, wenn ich den DB offline erstelle. Wenn ich einen String dynamisch erzeugen muß, dann entweder wie dtsclipper oder ich verwende SCL, das ist genau dafür optimal.


----------



## Larry Laffer (10 Mai 2011)

... noch so ein Nachsatz zu dem Beitrag von Ralle und dem Beitrag von dtsclipper (#2).

Der Haken hierbei ist, dass Zuweisungen, die über die Doppelwortbreite hinaus gehen, (in KOP, FUP, AWL) direkt nicht möglich sind. SCL bildet da die Ausnahme und läßt es so zu, wie du es brauchst. Willst du es nicht so haben, so kannst du es nur so machen, wie schon von dtsclipper dargestellt (er hatte halt nur das "warum" unterschlagen )

Allerdings ... bei manuellen Zuweisungen (auer bei SCL) die Anmerkung von Thomas (Beitrag #11) bezüglich der Headerdaten vom String, die nicht automatisch generiert werden, beachten ...

Gruß
Larry


----------



## Burkhard (11 September 2018)

dtsclipper schrieb:


> Ein String ist im Grunde ein ARRAY of BYTE, in einem DB angelegt.
> 
> Die einfachversion ist dann
> 
> ...



Warum können nur 4 Zeichen in einem Rutsch transferiert werden. Sobald ich im ersten Schritt statt 'hall' 'hallo' schreibe, wird es im Editor auf rot gesetzt?


----------



## Wincctia (11 September 2018)

Hallo Burkhard, 

weil das Grundlegende S7 Konzept auf 32bit also ein Dwort konzipiert bzw beschränkt ist. 
Ein Char hat 8 Bit also gehen mehr als 4 nicht auf einmal ohne Scl oder Sonderfunktionen im S7 Classic. 

Gruß Tia


----------



## PN/DP (11 September 2018)

Weil die "L"-Anweisung einen max 32 Bit großen Wert in den AKKU1 lädt der nur 32 Bit = 4 Byte groß ist.
Detailhilfe: setze den Cursor in die Zeile mit dem "L" und drücke F1

PS: Man kann mehr Zeichen "auf einmal" transferieren mit BLKMOV direkt vom Quell-Speicher zum Ziel-Speicher.

Harald


----------

