String Variable mit Inhalt füllen

DerMatze

Well-known member
Beiträge
525
Punkte Reaktionen
21
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Zusammen,

ich habe in einem FB eine STAT Variable von Typ String[8] angelegt. Diese möchte ich in diesem FB mit Buchstaben füllen.
Wenn eine Bedingung erfüllt ist: 'ABCD'
Wenn eine andere Bedingung erfüllt ist: 'WXYZ'

Wie kann ich das am besten machen?
Kann ich direkt auf die Adresse der STAT Variable zugreifen - wenn ja wie?
Das Ganze muss in AWL gemacht werden, da mir SCL nicht zur Verfügung steht.

z.B.
L 'ABCD'
T String

Gruß
DerMatze
 

bike

Well-known member
Beiträge
6.464
Punkte Reaktionen
794
Also das geht so wohl eher weniger.
Denn ein String beginnt mit einem Kopf in dem die zulässige und die tatsächliche Länge hinterlegt ist.
Daher musst du CHR in String wandeln und dann losslegen.
Wenn du nur mit Char arbeiten willst, dann geht es so.


bike
 

rostiger Nagel

Forums-Knochenbrecher
Teammitglied
Beiträge
15.045
Punkte Reaktionen
4.718
Zuviel Werbung?
->Hier kostenlos registrieren
Grundsätzlich wäre es erst einmal so möglich.
Vier Zeichen sind ein Doppelwort


Code:
LAR1  P#String_Variable


UN #erste_vier
SPB M001

L 'ABCD'
T D [AR1,P#2.0]

SPA M002

M001: NOP 0

L 'WXYZ'
T D [AR1,P#6.0]

M002: NOP 0

Dann steht in der Variabel 'ABCDWXYZ'
 
Zuletzt bearbeitet:
OP
D

DerMatze

Well-known member
Beiträge
525
Punkte Reaktionen
21
Grundsätzlich wäre es erst einmal so möglich.
Vier Zeichen sind ein Doppelwort


Code:
LAR1  P#String_Variable


UN #erste_vier
SPB M001

L 'ABCD'
T D [AR1,P#2.0]

SPA M002

M001: NOP 0

L 'WXYZ'
T D [AR1,P#6.0]

M002: NOP 0

Dann steht in der Variabel 'ABCDWXYZ'

Hallo und danke für die Antwort.
In dem Code ist das die jeweilige Adresse der STAT Variablen "P#2.0" / "P#6.0"?
Kann ich das auch auf eine OUT Variable anwenden?

Gruß
DerMatze
 

rostiger Nagel

Forums-Knochenbrecher
Teammitglied
Beiträge
15.045
Punkte Reaktionen
4.718
Ja, ein String beginnt mit 2 Byte Offset, in den ersten zwei Byte steht
die Gesammt Länge und die benutzte Länge des String. Also beginnen
die Buchstaben ab Byte 2. Wenn du die Byte einzeln in einer Variablen
Tabelle reinziehst kannst du es dir anschauen.
 
OP
D

DerMatze

Well-known member
Beiträge
525
Punkte Reaktionen
21
Also wenn ich es mit dem AR1 versuche, wird in den OUT Variablen nur "Müll" reingeschrieben.
Geht evtl auch folgendes

Code:
L 8           // Stringlänge
T LB 8       // Byte 1 von String Variable (automatisch vergebene Adresse 8.0 bis 18.0)
L 8           // ist Stringlänge
T LB 9      // Byte 2 von String Variable

L 'ABCD'    // Text 1
T LD 10    // String füllen

L 'WXYZ'   // Text 2
T LD 14    // string füllen
Anhang anzeigen String.pdf
gruß
DerMatze
 
Zuletzt bearbeitet:
OP
D

DerMatze

Well-known member
Beiträge
525
Punkte Reaktionen
21
Ich habs nun so gemacht wie bei Siemens beschrieben:

FRAGE:
Wie kann ich auf einfache Weise Strings kopieren?
ANTWORT:
Da die Systemfunktion SFC 20 ("BLKMOV") keine Zeichenketten zulässt, können Sie wie folgt vorgehen:
Mit Hilfe der Funktion FC 2 ("CONCAT") aus den IEC-Funktionen der Standard Bibliothek fügen Sie eigentlich zwei Strings zusammen. Lässt man den zweiten String leer, dann wird nur der erste String an die gewünschte Stelle kopiert (siehe Bild1).

STEP_7-Programmmieren_d.gif


Dennnoch würde mich interessieren obs wie unter #7 beschrieben auch funktionieren würde.

MfG
DerMatze
 

rostiger Nagel

Forums-Knochenbrecher
Teammitglied
Beiträge
15.045
Punkte Reaktionen
4.718
Zuviel Werbung?
->Hier kostenlos registrieren
zu 7 habe ich dir mal dein Beispiel ein wenig Modifiziert und Multiinstanzfähig gemacht.
String bearbeitung funktioniert auch mit Lokaldaten. Das Beispiel ist getestet!

Code:
FUNCTION_BLOCK FB 1
TITLE =Beispiel String
VERSION : 0.1

VAR_INPUT
  schreiben : BOOL ; //String schreiben
  reset : BOOL ; //String leeren
END_VAR
VAR_OUTPUT
  Text : STRING  [8 ]; 
END_VAR
VAR_TEMP
  dTempAR1 : DWORD ; //Zwischenspeicher Adressregister 1
  dTempAR2 : DWORD ; //Zwischenspeicher Adressregister 2
  bTempLaenge_max : BYTE ; //Maximale Länge des Strings
  bTempSchleife : BYTE ; //Schleifenzaehler
END_VAR
BEGIN
NETWORK
TITLE =Adressregister stellen

//Adressregister retten
      TAR1  #dTempAR1; 
      TAR2  #dTempAR2; 
//Adressregister auf den String stellen
      TAR2  ; //Offset der Instanz laden
      UD    DW#16#FFFFFF; //Bereichskennung vom AR2 ausblenden
      LAR1  P##Text; 
      +AR1  ; 
NETWORK
TITLE =String Formatieren

//msximale Länge des Strings lesen
      L     B [AR1,P#0.0]; 
      T     #bTempLaenge_max; 
//aktuelle Länge Schreiben
      L     8; 
      T     B [AR1,P#1.0]; 
NETWORK
TITLE =String schreiben

//prüfung schreiben ???
      UN    #schreiben; 
      SPB   A001; 
//"HANS" zusmmenhängend in den  
//vorderen Teil schreiben
      L     'HANS'; 
      T     D [AR1,P#2.0]; 

//"PAUL" einzelen in den hinteren
//Teil schreiben
      L     'P'; 
      T     B [AR1,P#6.0]; 
      L     'A'; 
      T     B [AR1,P#7.0]; 
      L     'U'; 
      T     B [AR1,P#8.0]; 
      L     'L'; 
      T     B [AR1,P#9.0]; 
A001: NOP   0; 
NETWORK
TITLE =String löschen

//prüfung löschen ???
      UN    #reset; 
      SPB   B002; 
//Adressregister auf den ersten
//Buschstaben stellen
      +AR1  P#2.0; 

//Schleife initalisieren
      L     #bTempLaenge_max; 
//Lösch-Schleife
B001: T     #bTempSchleife; 

//Buchstaben löschen
      L     ''; 
      T     B [AR1,P#0.0]; 
//Adressregister auf den nächsten
//Buchstaben stellen
      +AR1  P#1.0; 
      L     #bTempSchleife; 
      LOOP  B001; 
B002: NOP   0; 
NETWORK
TITLE =Adressregister wieder herstellen

      LAR1  #dTempAR1; 
      LAR2  #dTempAR2; 
END_FUNCTION_BLOCK
DATA_BLOCK DB 1
TITLE =
VERSION : 0.0
 FB 1
BEGIN
   schreiben := FALSE; 
   reset := FALSE; 
   Text := ''; 
END_DATA_BLOCK
ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1

VAR_TEMP
  OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ; //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ; //Reserved for system
  OB1_RESERVED_2 : BYTE ; //Reserved for system
  OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =
 
NETWORK
TITLE =
      CALL FB     1 , DB     1 (
           schreiben                := E      0.1,
           reset                    := E      0.0);
 
END_ORGANIZATION_BLOCK
 

Ralle

Supermoderator
Teammitglied
Beiträge
15.103
Punkte Reaktionen
3.820
Ich habs nun so gemacht wie bei Siemens beschrieben:

FRAGE:
Wie kann ich auf einfache Weise Strings kopieren?
ANTWORT:
Da die Systemfunktion SFC 20 ("BLKMOV") keine Zeichenketten zulässt, können Sie wie folgt vorgehen:
Mit Hilfe der Funktion FC 2 ("CONCAT") aus den IEC-Funktionen der Standard Bibliothek fügen Sie eigentlich zwei Strings zusammen. Lässt man den zweiten String leer, dann wird nur der erste String an die gewünschte Stelle kopiert (siehe Bild1).

STEP_7-Programmmieren_d.gif


Dennnoch würde mich interessieren obs wie unter #7 beschrieben auch funktionieren würde.

MfG
DerMatze

Eigenartig, mit dem SFC20 kann man doch Strings umkopieren, das mache ich immer, geht sogar symbolisch und auf jeden Fall per Any.

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.

 
Zuletzt bearbeitet:
OP
D

DerMatze

Well-known member
Beiträge
525
Punkte Reaktionen
21
zu 7 habe ich dir mal dein Beispiel ein wenig Modifiziert und Multiinstanzfähig gemacht.
String bearbeitung funktioniert auch mit Lokaldaten. Das Beispiel ist getestet!

Hallo.

Mein Problem war bei dem ersten Versuch sicherlich, dass ich das Adressregister nicht "gerettet" habe und demnach auch nicht wiederhergestellt EDIT Müll wird ausgegeben?!

Gruß
DerMatze
 
Oben