Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: String Variable mit Inhalt füllen

  1. #1
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Beitrag


    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
    -----------------------------------------------------------------------------------------
    Programmierumgebung: Step 7 V5.5 + SP3
    WinCC flexible 2008 Advanced + SP3
    -----------------------------------------------------------------------------------------
    Zitieren Zitieren String Variable mit Inhalt füllen  

  2. #2
    Registriert seit
    03.04.2008
    Beiträge
    6.200
    Danke
    237
    Erhielt 815 Danke für 689 Beiträge

    Standard

    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
    "Any fool can write code that a computer can understand.
    Good programmers write code that humans can understand."
    --Martin Fowler

  3. #3
    Registriert seit
    13.10.2007
    Beiträge
    12.038
    Danke
    2.789
    Erhielt 3.273 Danke für 2.159 Beiträge

    Standard

    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'
    Geändert von rostiger Nagel (12.02.2013 um 22:31 Uhr)

  4. #4
    DerMatze ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Zitat Zitat von rostiger Nagel Beitrag anzeigen
    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

  5. #5
    Registriert seit
    13.10.2007
    Beiträge
    12.038
    Danke
    2.789
    Erhielt 3.273 Danke für 2.159 Beiträge

    Standard

    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.

  6. Folgende 2 Benutzer sagen Danke zu rostiger Nagel für den nützlichen Beitrag:

    DerMatze (13.02.2013),don_toni (13.02.2013)

  7. #6
    DerMatze ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Zitat Zitat von rostiger Nagel Beitrag anzeigen
    Wenn du die Byte einzeln in einer Variablen
    Tabelle reinziehst kannst du es dir anschauen.
    Ok, vielen Dank. Ich werds mal versuchen!
    MfG
    DerMatze

  8. #7
    DerMatze ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Standard

    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
    String.pdf
    gruß
    DerMatze
    Geändert von DerMatze (13.02.2013 um 20:37 Uhr)

  9. #8
    DerMatze ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Standard

    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).



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

    MfG
    DerMatze
    -----------------------------------------------------------------------------------------
    Programmierumgebung: Step 7 V5.5 + SP3
    WinCC flexible 2008 Advanced + SP3
    -----------------------------------------------------------------------------------------

  10. #9
    Registriert seit
    13.10.2007
    Beiträge
    12.038
    Danke
    2.789
    Erhielt 3.273 Danke für 2.159 Beiträge

    Standard

    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

  11. Folgender Benutzer sagt Danke zu rostiger Nagel für den nützlichen Beitrag:

    DerMatze (14.02.2013)

  12. #10
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von DerMatze Beitrag anzeigen
    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).



    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.
    Geändert von Ralle (14.02.2013 um 08:16 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

Ähnliche Themen

  1. String Variable
    Von Anger im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 01.03.2011, 18:09
  2. Konstante String in Variable String schreiben
    Von sailor im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 07.12.2009, 18:01
  3. Zugriff auf Variable über String mit Var-Namen
    Von grosser_marco im Forum CODESYS und IEC61131
    Antworten: 14
    Letzter Beitrag: 03.09.2009, 07:43
  4. T177A E/A Feld mit String-Variable
    Von magmaa im Forum HMI
    Antworten: 8
    Letzter Beitrag: 15.05.2009, 08:43
  5. Allen Bradley Inhalt Variable
    Von Pefida im Forum Sonstige Steuerungen
    Antworten: 4
    Letzter Beitrag: 03.10.2008, 09:31

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •