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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: Wert in AR2 nach FB Call

  1. #11
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Im Zusammenhang mit Multiinstanzen (MI) und AR2 versteckt der Step7 Editor einige Dinge die man zum Verständnis des Ganzen braucht.

    Ich versuche mal eine Erläuterung anhand eines Beispieles:

    Zwei Bausteine FB1 und FB2. FB1 ist MI-fähig, FB2 nicht MI-fähig:
    Code:
    FUNCTION_BLOCK "FB1_Multiinstanzfaehig"
    VAR
      wSTAT : WORD ;    
    END_VAR
    BEGIN
          L     #wSTAT; 
    END_FUNCTION_BLOCK
    
    FUNCTION_BLOCK "FB2_NichtMultiinstanz"
    CODE_VERSION1
    VAR
      wSTAT : WORD ;    
    END_VAR
    BEGIN
          L     #wSTAT; 
    END_FUNCTION_BLOCK
    Bei der symbolischen Programmierung zeigt der Step7 Editor im ersten Netzwerk
    L #wSTAT
    an.

    Da die CPU im Gegensatz zum Step7-Editor keine Symbolik kennt, wird in Wirklichkeit folgendes gemacht:

    Im "FB1_Multiinstanzfaehig":
    Code:
     L     DIW [AR2,P#0.0]
    und im "FB2_NichtMultiinstanz":
    Code:
     L     DIW    0
    Hier kann man auch sehen, dass ein nicht MI-fähiger FB geringfügig schneller ist als ein MI-fähiger, aber das nur nebenbei.


    Nun, wer schreibt in das AR2 den passenden Offset? Das macht auch der Step7 Editor "unter der Haube" beim Aufrufen der entsprechenden Bausteine.

    Um dem Beispiel oben zu folgen: Es wird ein FB3 (MI-fähig) angelegt, in dem die Bausteine oben folgendermaßen aufgerufen werden:
    1. FB1 als MI im FB3
    2. FB1 mit eigenem Instanzdatenbaustein
    3. FB2 mit eigenem Instanzdatenbaustein (geht ja auch nicht anders)

    Zur Verdeutlichung der Adressen habe ich im Stat-Bereich noch eine Dummy-Variable (wFoo) angelegt.

    Code:
    FUNCTION_BLOCK "FB3_Aufrufe"
    VAR
      wFoo : WORD;
      FB1_Instanz : "FB1_Multiinstanzfaehig";    
    END_VAR
    BEGIN
    NETWORK
    TITLE =FB1 als Multiinstanz
          CALL #FB1_Instanz ;
          
    NETWORK
    TITLE =FB1 mit eigenem Instanz-DB1
          CALL "FB1_Multiinstanzfaehig" , DB     1 ;
    
    NETWORK
    TITLE =FB2 (nicht MI-fähig) mit eigenem DB 2
          CALL "FB2_NichtMultiinstanz" , DB     2 ;
    
    END_FUNCTION_BLOCK
    Jetzt die verschiedenen Aufrufe mit dem was der Step7 Editor drumherum schreibt:

    1. FB1 als Multiinstanz im FB3

    Code:
          L     DINO
          T     LW     4
          TDB   
          AUF   DI [LW 4]
          TAR2  LD     0
          +AR2  P#2.0
          UC    "FB1_Multiinstanzfaehig"
          LAR2  LD     0
          TDB
    Hier wird einmal das AR2 in LD 0 gerettet (LD 0 ist in diesem Fall frei da keine Temp-Variablen im FB3 angelegt sind).
    Dann wird der Offset der Instanzdaten wie in der Deklaration zu AR2 hinzuaddiert.
    Somit kann nachhher im Baustein mit L DIW [AR2,P#0.0] auf die Instanzvariablen +Offset zugegriffen werden.

    Wie man sieht wird hier das AR2 vor dem Aufruf gesichert und nach dem Aufruf wieder zurückgeschrieben.
    So kann ein "wildgewordener" FB wenigstens nur sich, und nicht auch den Aufrufer durcheinanderbringen.

    2. FB1 mit eigenem Instanz-DB 1
    Code:
          TDB   
          AUF   DI     1
          TAR2  LD     0
          LAR2  P#DBX 0.0
          UC    "FB1_Multiinstanzfaehig"
          LAR2  LD     0
          TDB
    Hier wird das AR2 mit einem Zeiger auf DBX0.0 geladen, damit im Baustein am Offset 0 auch der Anfang des eigenen Instanz-DBs steht.

    3. FB2 (nicht MI-fähig) mit eigenem DB 2
    Code:
          TDB   
          AUF   DI     2
          TAR2  LD     0
          LAR2  P#DBX 0.0
          UC    "FB2_NichtMultiinstanz"
          LAR2  LD     0
          TDB
    Hier wird zwar auch das AR2 entsprechend geladen, obwohl es eigentlich unnötig wäre da im FB2 das AR2 für den Zugriff
    auf die Stat-Variablen garnicht benötigt wird.
    Aber der Step7 Editor "baut" dieses einfach um jeden Aufruf herum.

    Gruß
    Thomas

  2. Folgende 3 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Paule (27.06.2009),rostiger Nagel (27.06.2009),Steff_F (27.06.2009)

  3. #12
    Registriert seit
    23.05.2008
    Beiträge
    27
    Danke
    0
    Erhielt 14 Danke für 12 Beiträge

    Standard

    Um eventuellen Missverständnissen vorzubeugen, sollte hier vielleicht noch erwähnt werden das die temp-Daten immer separat behandelt werden.
    Also beim Bausteinaufruf (zur Laufzeit) auf dem Lokaldatenstack des aufrufenden OB erzeugt werden.

    Stephan

  4. #13
    Registriert seit
    15.10.2007
    Ort
    St.Pölten
    Beiträge
    875
    Danke
    98
    Erhielt 200 Danke für 188 Beiträge

    Standard

    auf dem Lokaldatenstack des aufrufenden OB erzeugt werden
    und auch FC und FB. Die temp.Variablen sind nur in dem FC/FB gültig in dem sie verwendet werden und auch nur solange der geöffnet ist um es genau zu nehmen.
    Beginne jeden Tag mit einem lächeln,es kann dir nämlich während des Tages sehr schnell vergehen.

  5. #14
    Registriert seit
    23.05.2008
    Beiträge
    27
    Danke
    0
    Erhielt 14 Danke für 12 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Gerhard K

    Zitat Zitat von Isch Beitrag anzeigen
    Also beim Bausteinaufruf (zur Laufzeit) auf dem Lokaldatenstack des aufrufenden OB erzeugt werden.
    Hab mich da vielleicht etwas missverständlich Ausgedrückt.
    Ich wollte damit eigentlich zum Ausdruck bringen das die temp-Daten auf dem Lokaldatenstack des zugrunde liegenden OB abgelegt werden. Der eigentliche Baustein kann natürlich auch in einem anderen FC/FB aufgerufen werden.

    Stephan

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 23.09.2010, 12:13
  2. Klartextmeldung je nach Wert im Byte
    Von roman79 im Forum HMI
    Antworten: 2
    Letzter Beitrag: 14.04.2010, 14:45
  3. DB nach einem bestimmten Wert durchsuchen
    Von Herrminator im Forum Simatic
    Antworten: 20
    Letzter Beitrag: 30.07.2009, 16:53
  4. Wert nach Zeit X auf Veränderung prüfen
    Von DarkLykan im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.07.2008, 14:24
  5. call-by-call im ausland
    Von Markus im Forum Stammtisch
    Antworten: 11
    Letzter Beitrag: 16.10.2004, 14:30

Stichworte

Lesezeichen

Berechtigungen

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