String Variable in AWL beschreiben

jaepen

Level-1
Beiträge
22
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

Code:
variable = 'hallo welt'

wie funktioniert das ?

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

Die einfachversion ist dann

Code:
L 'hall'
T dbxx.DBDy
 
L 'o we'
T DBxx.DBD(y+4)
 
usw.
 
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

Code:
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!
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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. :)
 
die sfc20 erwartet einen parameter vom typ any.
siehe bild
instring sieht direkt addressiert so aus
P#db1.dbx0.0 byte 22
 

Anhänge

  • Zwischenablage02.gif
    Zwischenablage02.gif
    15 KB · Aufrufe: 163
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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. :)


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?

Code:
SCRBLK := 'hallo welt'

funktioniert bei mir nicht (in AWL). Das kann ich dem SFC20 so nicht übergeben....
 
Zuletzt bearbeitet:
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?

Code:
SCRBLK := 'hallo welt'

funktioniert bei mir nicht (in AWL). Das kann ich dem SFC20 so nicht übergeben....

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.
 
... 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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein String ist im Grunde ein ARRAY of BYTE, in einem DB angelegt.

Die einfachversion ist dann

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

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?
 
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
 
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
 
Zuletzt bearbeitet:
Zurück
Oben