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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Pointer FB (STAT, TEMP)

  1. #1
    Registriert seit
    05.11.2011
    Beiträge
    75
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi Leute,

    ich tu mich leider noch immer schwer mit gewissen Pointer-Geschichten, insbesondere mit dem konkreten Umsetzen von dem was ich im Forum hier so finde...


    Ich habe einen FB (wird als Multiinstanz aufgerufen) mit einer UDT-Struktur jeweils in IN, STAT und OUT.

    Hintergrund: Ich gebe die Struktur an verschiedene Aufrufe innerhalb des FBs weiter, muss aber davor noch die Daten verändern. Dazu kopiere ich die UDT-Struktur von IN nach STAT, ändere die Daten dort und gebe diese dann an die weiteren Aufrufe weiter. Am Ende kopiere ich dann von STAT nach OUT, da die Aufrufe diese Daten ebenfalls verändern.


    Das Problem: Ich muss einen TEIL eines Array of Char ändern - das würde bei einem DB als Ziel mit BLKMOV gehen (P#DB1.DBX0.0 BYTE 10 oder auch P#DB1.DBX10.0 BYTE 22). BLKMOV krigt das aber nicht bei STAT bzw TEMP hin.

    Die TEMP-Pointer sind für mich eigentlich kaum mehr ein Hexenwerk, aber die STAT-GEschichte (AR retten und widerherstellen, AR2 addieren usw) schon...



    Ich möchte also über einen Pointer einen gewissen Bereich in STAT (ein Teil eines Array of Char, innerhalb eines UDT) ansprechen und zur Sicherheit auch wie hier öfters nachzulesen war das Adressregister retten und zurück spielen (?!).



    Bei TEMP würde das z.B. so bei mir aussehen:

    Code:
          LAR1  P##ANY_Pointer
    
          L     B#16#10                     //Syntax-ID
          T     LB [AR1,P#0.0]
    
          L     B#16#2                      //Typ: Byte
          T     LB [AR1,P#1.0]
    
          L     25                          //Länge zu lesender Bereich
          T     LW [AR1,P#2.0]
    
          L     0                           //DB-Nummer, hier 0 da vorherige Lokaldaten
          T     LW [AR1,P#4.0]
    
          L     50                          //Startadresse des zu lesenden Bereiches
          SLD   3
          T     LD [AR1,P#6.0]
    
          L     B#16#87                     //vorherige Lokaldaten
          T     LB [AR1,P#6.0]
    Hier würde der TEMP-Bereich ab 50.0 bis 75.0 angesprochen werden. Damit könnte ich dann entweder via BLKMOV von dort Lesen oder eben hin schreiben.


    Wie würde dies für den gleichen Bereich in STAT aussehen? Hier mal meine Schlussfolgerung, allerdings ohne die Sicherung und Widerherstellung vom Adressregister...

    Code:
          LAR1  P##ANY_Pointer
    
    >> TAR 2 //wg. Multiinstanz
    >> +AR1 //wg. Multiinstanz
    
          L     B#16#10                     //Syntax-ID
          T     LB [AR1,P#0.0]
    
          L     B#16#2                      //Typ: Byte
          T     LB [AR1,P#1.0]
    
          L     25                          //Länge zu lesender Bereich
          T     LW [AR1,P#2.0]
    
          L     0                           //DB-Nummer, hier 0 da vorherige Lokaldaten
          T     LW [AR1,P#4.0]
    
          L     50                          //Startadresse des zu lesenden Bereiches
          SLD   3
          T     LD [AR1,P#6.0]
    
          L     B#16#87                     //vorherige Lokaldaten
          T     LB [AR1,P#6.0]
    Stimmt das so, um den STAT-Bereich 50.0-75.0 anzusprechen?
    Wie würde in diesem Fall die Rettung usw vom Adressregister aussehen?


    Vielen Dank


    EDIT: Ich kann den UDT statt in STAT evt. auch in TEMP legen, aber es geht ja hier in erster Linie ums Verständnis...
    Geändert von saarlaender (20.08.2012 um 11:26 Uhr)
    Zitieren Zitieren Pointer FB (STAT, TEMP)  

  2. #2
    Registriert seit
    28.02.2006
    Ort
    Ostsee 5 min zum Strand
    Beiträge
    780
    Danke
    92
    Erhielt 110 Danke für 98 Beiträge

    Standard

    Moin,

    guckst du HIER,

    HIER

    um den Stat- Bereich anzusprechen, schreibst du DIX oder DIB oder DIW oder DID für Bit, Byte, Word, Doppelword bereich
    Gruß von der Ostsee

    Nordischerjung
    _____________________

    Wenn man seinem Paßbild ähnlich zu sehen beginnt, sollte man schleunigst Urlaub machen. (Vico Torriani, schw. Entertainer)

    Ich habe eine Diät gemacht und fettem Essen und Alkohol abgeschworen - in zwei Wochen verlor ich 14 Tage. (Joe E. Lewis)

  3. #3
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Code:
    L     0                           //DB-Nummer, hier 0 da vorherige Lokaldaten 
         T     LW [AR1,P#4.0]
    ist auf jeden fall nicht richtig...

    Code:
    L DINO
    T LW[AR1,P#4.0
    Auch die Bereichskennung solltest du auf DB oder DI ändern... ob du DB oder DI nimmst sollte aber egal sein!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  4. #4
    Registriert seit
    28.02.2006
    Ort
    Ostsee 5 min zum Strand
    Beiträge
    780
    Danke
    92
    Erhielt 110 Danke für 98 Beiträge

    Standard

    @ Ralle,
    ja ich weiß, habe ihm auch nur Zeigen wollen, wie er den Statbereich beschreibt.
    Gruß von der Ostsee

    Nordischerjung
    _____________________

    Wenn man seinem Paßbild ähnlich zu sehen beginnt, sollte man schleunigst Urlaub machen. (Vico Torriani, schw. Entertainer)

    Ich habe eine Diät gemacht und fettem Essen und Alkohol abgeschworen - in zwei Wochen verlor ich 14 Tage. (Joe E. Lewis)

  5. #5
    Registriert seit
    13.10.2007
    Beiträge
    12.059
    Danke
    2.793
    Erhielt 3.287 Danke für 2.167 Beiträge

    Standard

    Code:
         
           TAR1  dTempAR1                   //Adressregister 1 retten
           TAR2  dTempAR2                   //Adressregister 2 retten
           ..
           ..
           TAR2                             //Adressregister 2 Laden
           UD DW#16#FFFFFF                  //Bereichskennung ausmaskieren
           LAR1 P##ANY_Pointer              //Zeiger ins Adressregister 1 Laden
           +AR1                             //beide Register addieren
    
          ..
          ..
          LAR1  dTempAR1                   //Adressregister 1 wieder herstellen
          LAR2  dTempAR2                   //Adressregister 2 wieder herstellen

  6. #6
    Registriert seit
    19.12.2008
    Beiträge
    336
    Danke
    19
    Erhielt 28 Danke für 28 Beiträge

    Standard

    @RN:
    da die Verwendung des Befehls +AR1 nicht ganz unproblematisch ist (man weiß ja nie, wie groß die vorherige Instanz so ist) würde ich es lieber so vorschlagen wollen :
    Code:
       TAR2                             //Adressregister 2 Laden
           UD DW#16#FFFFFF                  //Bereichskennung ausmaskieren
           LAR1 P##ANY_Pointer              //Zeiger ins Adressregister 1 Laden
           +D                             //beide Register addieren

  7. #7
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Dann musst du aber den Pointer in den Akku laden das ganze wieder in das AR1 schreiben. Und dann besteht kein unterschied mehr in der Funktion...
    Code:
     TAR2                             //Adressregister 2 Laden
           UD DW#16#FFFFFF                  //Bereichskennung ausmaskieren
           L     P##ANY_Pointer              //Zeiger ins Adressregister 1 Laden
        +D             //beide Register addieren
        LAR1
    

    mfG Aventinus

  8. #8
    Registriert seit
    19.12.2008
    Beiträge
    336
    Danke
    19
    Erhielt 28 Danke für 28 Beiträge

    Standard

    stimmt ... hatte ich so gar nicht gesehen ...

  9. #9
    Registriert seit
    13.10.2007
    Beiträge
    12.059
    Danke
    2.793
    Erhielt 3.287 Danke für 2.167 Beiträge

    Standard

    Dann vielleicht sogar besser so

    Zitat Zitat von rostiger Nagel Beitrag anzeigen
    Code:
         
           TAR1  dTempAR1                   //Adressregister 1 retten
           TAR2  dTempAR2                   //Adressregister 2 retten
           ..
           ..
           TAR2                             //Adressregister 2 Laden
           UD DW#16#FFFFFF                  //Bereichskennung ausmaskieren
           L P#ANY_Pointer                  //Zeiger Pointer Laden
           +D                               //beide Zeiger addieren
           LAR1                             //Zeiger in das Adressregister 1 Laden 
           ..
           ..
           LAR1  dTempAR1                   //Adressregister 1 wieder herstellen
           LAR2  dTempAR2                   //Adressregister 2 wieder herstellen

  10. #10
    Registriert seit
    13.10.2007
    Beiträge
    12.059
    Danke
    2.793
    Erhielt 3.287 Danke für 2.167 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Lupo Beitrag anzeigen
    @RN:
    da die Verwendung des Befehls +AR1 nicht ganz unproblematisch ist (man weiß ja nie, wie groß die vorherige Instanz so ist) würde ich es lieber so vorschlagen wollen
    Grundsätzlich hat Lupo recht, das Addieren mit Adressregistern, ist nicht ganz umproblematisch.
    Dadurch das bei der Addition der Adressregisters durch den Befehl '+AR1' oder 'AR2' der Operandenbereich erhalten wird
    ist es keine wirkliche Doppelwort Addition, sondern eine Wort Addition, die Vorzeichen richtig auf 24Bit erweitert wird.

    Addieren zum Adressregister
    Zu den Adressregister können Sie einen Wert addieren, um z.B. Programmschleifen die Adresse eines Operanden
    bei jedem Schleifendurchlauf zu erhöhen. Den Wert geben Sie entweder als Konstante (als bereichsinternen Zeiger)
    bei der Anweisung an oder er steht im rechten Wort des Akkumulators 1. Die Art der des im Adressregister stehenden
    Zeigers (bereichsinternen oder bereichsübergreifend) und der Operandenbereich bleiben erhalten.

    Addieren mit Zeiger
    Die Anweisungen +AR1 P#y.x und +AR2 P#y.x addieren einen Zeiger zum angegebenen Adressregister. Beachten Sie,
    das bei diesem Anweisungen der Bereichszeiger eine maximale Größe von P#4095.7 hat. Steht ein Wert größer als
    P#4095.7 im Akkumulator, wird die Zahl als Festpunktzahl im Zweierkomplement interpretiert und subtrahiert.

    Addieren mit Wert im Akkumulator
    Die Anweisungen +AR1 und +AR2 interpretieren das im Akkumulator 1 stehenden Wert als Zahl im INT-Format, erweitern
    ihn vorzeichenrichtig auf 24 Bit und addieren ihn zum Inhalt des Adressregisters. Auf diese Weise kann auch ein Zeiger
    verkleinert werden. Ein Über- oder Unterschreiten des maximalen Bereiches der Byteadresse (0 bis 65535) hat keinen
    weiteren Auswirkungen: Die obersten Bits werden "abgeschnitten":

    Code:
    .
    .
       Byte n             Byte n+1         Byte n+2          Byte n+3
       - - - - - - - - | - - - - - - - - | V y y y y y y y | y y y y y x x x
    
    
    x = Bitadresse      V V V V V V V | V y y y y y y y | y y y y y x x x
    y = Byteadresse     <----------------|
    z = Bereich           Vorzeichen wird aufgefüllt
    V = Vorzeichen
    Beachten Sie, dass die Bitadresse in den Bits 0 bis 2 steht. Möchten Sie die Byteadresse bereits im Akkumulator 1 erhöhen,
    müssen Sie ab Bit 3 Addieren (den Wert um 3 stellen nach links schieben).
    Geändert von rostiger Nagel (20.08.2012 um 15:29 Uhr)

Ähnliche Themen

  1. Antworten: 12
    Letzter Beitrag: 18.05.2011, 23:57
  2. FB IN/OUT/STAT Liste
    Von hank12 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 09.05.2009, 10:41
  3. Antworten: 1
    Letzter Beitrag: 28.10.2008, 21:57
  4. pointer über temp struct...
    Von Jochen Kühner im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.09.2006, 10:23
  5. Stat und Temp Variablen
    Von Anonymous im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 13.07.2004, 11:20

Lesezeichen

Berechtigungen

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