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

Ergebnis 1 bis 3 von 3

Thema: Pointer auf String ...

  1. #1
    Registriert seit
    12.04.2005
    Ort
    Black Forest
    Beiträge
    1.336
    Danke
    27
    Erhielt 130 Danke für 117 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    stehe ich heute auf dem Schlauch, oder sehe ich vor lauter Bäume den Wald nicht mehr.
    Manches wäre mit SCL einfacher, es muss aber AWL sein

    Ich habe ein kleines Problem bzgl Strings und deren Initialisierung.
    Bei einem String wird ja in den ersten beiden Bytes einmal die Max. Länge und dann die tatsächliche Zeichenzahl geschrieben.
    Soweit so gut, funktioniert ja auch immer!
    Bisher habe ich dies immer über die feste Adresse in z.B. dem InstanzDB eines FBs gemacht.


    Code:
    VAR
          PI_SERVPrgm            :PI_SERV;
          NC_Progname            :STRING  [32] := '_N_NAME_00001_SPF';   
          NC_Progpfad            :STRING  [12] := '/_N_CMA_DIR/';
          NC_Progname_max        :BYTE := 32;   
          NC_Progname_ist        :BYTE := 17;   
          
    END_VAR
    
    NETWORK
    TITLE = Max. Stringlänge und Anzahl Zeichen vorbelegen
    
        l    NC_Progname_max;
        t    DB100.dbb96;            // max. Stringlänge in 1'tes Byte
        l    NC_Progname_ist;          // tatsächliche Länge _N_NAME_00001_SPF (17 Zeichen)
        t    DB100.dbb97;            // tatsächliche Länge in 2'tes Byte
    Jetzt möchte ich aber auf die Symbolische bzw. eine etwas flexiblere Programmierung das umstellen.
    Problem ist ja, sobald etwas ggf. in dem DB verschoben oder eingefügt wird, stimmen die Adressen ja nicht mehr!
    Ebenfalls kann der Programmname sich ändern (kürzer oder länger) und daher muss dann der String ebenfalls modifiziert werden.

    Also möchte ich eigentlich mittels Pointer auf die Adresse von NC_Progname oder NC_Progpfad zugreifen.
    Kann mir da mal einer kurz helfen ob das so stimmen würde? Habe weder PLC Sim noch ne Steuerung gerade zur Hand ...


    Code:
    NETWORK
    TITLE = Max. Stringlänge und Anzahl Zeichen vorbelegen
    
          L     P##NC_Progname;
          T     AR1;
          
          L     #NC_Progname_max;
          T     DIB [AR1]
    
          L     P##NC_Progname;
          L     P#1.0;
          +D;
          T     AR1;
    
          L     #NC_Progname_ist;
          T     DIB [AR1];

    thx

    „Eine Frage raubt mir den Verstand bin ich verrückt oder sind es die Anderen ?“

    Albert Einstein
    Zitieren Zitieren Pointer auf String ...  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.192
    Danke
    925
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von Boxy Beitrag anzeigen
    Bisher habe ich dies immer über die feste Adresse in z.B. dem InstanzDB eines FBs gemacht.

    Code:
    NETWORK
    TITLE = Max. Stringlänge und Anzahl Zeichen vorbelegen
    
        l    NC_Progname_max;
        t    DB100.dbb96;            // max. Stringlänge in 1'tes Byte
        l    NC_Progname_ist;          // tatsächliche Länge _N_NAME_00001_SPF (17 Zeichen)
        t    DB100.dbb97;            // tatsächliche Länge in 2'tes Byte
    [/CODE]
    Das funktioniert so nur in einem FB mit nur einer einzigen Instanz ...

    Besser:
    Code:
    NETWORK
    TITLE = Max. Stringlänge und Anzahl Zeichen vorbelegen
    
          TAR2;                     // Multiinstanz-Offset dieser Instanz in AKKU1 holen
          UD    DW#16#FFFFFF;       // Ausblenden der Bereichskennung (DB)
          L     P##NC_Progname;     // Variablenadresse in dieser Instanz (DI)
          +D;                       // Variablenadresse in dieser Instanz + Offset dieser Instanz
          LAR1;                     // in AR1
          
          L     #NC_Progname_max;
          T     DIB [AR1, P#0.0];   // "T D [AR1, P#0.0];" funktioniert auch, "DIB" ist aber "sicherer"
    
          L     #NC_Progname_ist;
          T     DIB [AR1, P#1.0];
    Zugriff auf eine Multiinstanz

    Achtung! Wenn der FB als "multiinstanzfähig" markiert ist dann darf AR2 nicht verändert werden bzw. muß vor jedem Zugriff auf Instanz-Variablen wiederhergestellt werden.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Boxy (10.06.2015)

  4. #3
    Boxy ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.04.2005
    Ort
    Black Forest
    Beiträge
    1.336
    Danke
    27
    Erhielt 130 Danke für 117 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke Dir für den promten Support !

    „Eine Frage raubt mir den Verstand bin ich verrückt oder sind es die Anderen ?“

    Albert Einstein

Ähnliche Themen

  1. Step 7 Any-Pointer Datentyp 0x13 STRING
    Von Löwensenft im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 04.01.2017, 22:49
  2. Step 7 BLKMOV mit Pointer für STRING in SCL
    Von patteb im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 04.03.2015, 20:07
  3. S7 LAR P##... --- pointer auf pointer
    Von milmu im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 22.11.2010, 17:39
  4. Pointer + String
    Von ottokar24 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 26.01.2009, 08:28
  5. Zugriff auf DB(String) über Pointer
    Von Thomas R im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.03.2007, 21:04

Stichworte

Lesezeichen

Berechtigungen

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