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

Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: FB in einem FB aufrufen

  1. #21
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Welche Aufgabe soll eigentlich gelöst werden ?
    Ich stimme mit Gerhard K dass es ist vielleicht sehr einfach mit Multi-Instanzen.

    Anstatt zu sagen das der untergeordnete FB soll die Daten von der übergeordnete FB zugreifen, dann probier es umgekehrt. also, die untergeordnete Daten sind integriert in der übergeordnete FB wo sie auch zur verfügung steht.
    Ich habe eine kleine Beispiel angehängt.
    Angehängte Dateien Angehängte Dateien
    Jesper M. Pedersen

  2. #22
    Registriert seit
    18.07.2007
    Beiträge
    82
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Larry Laffer,

    wenn ich die Versorgung der AnyPointer im FB1 umdrehe, funktioniert es.

    Ich verstehe bald garnichts mehr.

    Gruß,
    Woto

  3. #23
    Registriert seit
    24.05.2006
    Beiträge
    234
    Danke
    14
    Erhielt 77 Danke für 57 Beiträge

    Standard

    Sorry, ich konnte nicht früher antworten:

    Ursache für die Nicht-versorgung deines zweiten Anypointers ist, dass du mit dem Umkopieren der Anys aus IN nach Temp dein ursprüngliches AR2 zerstörst.
    Sichere mal das AR2 vor der ersten Verwendung im FB1 in eine Tempvariable der Länge DWord weg und restauriere es nach deiner Umkopieraktion:
    Code:
          TAR2  #Save_AR2
    
          L     P##FB1_Any
          LAR1  
          L     P##myPointer
          LAR2  
    
          L     DIW [AR1,P#0.0]
          T     W [AR2,P#0.0]
          L     DIW [AR1,P#2.0]
          T     W [AR2,P#2.0]
          L     DIW [AR1,P#4.0]
          T     W [AR2,P#4.0]
          L     DIW [AR1,P#6.0]
          T     W [AR2,P#6.0]
          L     DIW [AR1,P#8.0]
          T     W [AR2,P#8.0]
    
    
          L     P##FB1_Any2
          LAR1  
          L     P##yourPointer
          LAR2  
    
          L     DIW [AR1,P#0.0]
          T     W [AR2,P#0.0]
          L     DIW [AR1,P#2.0]
          T     W [AR2,P#2.0]
          L     DIW [AR1,P#4.0]
          T     W [AR2,P#4.0]
          L     DIW [AR1,P#6.0]
          T     W [AR2,P#6.0]
          L     DIW [AR1,P#8.0]
          T     W [AR2,P#8.0]
    
          LAR2  #Save_AR2
    Und schon wird's klappen.

    Ursache ist der nachfolgende CALL #myFB:
    Code:
         CALL  #myFB
           Hallo      :="m_null"
           myPointer  :=#myPointer
           yourPointer:=#yourPointer
    Der hier durch den Compiler zusammengebaute Code sieht folgendermaßen aus:
    Code:
          Call
          BLD   14
          =     L     26.0
          L     DINO
          T     LW    24
          TDB   
          AUF   DI [LW 24]
          TAR2  LD    20
          U     M      0.0
          =     DIX [AR2,P#20.0]
          L     LD     0
          T     DID [AR2,P#22.0]
          L     LD     4
          T     DID [AR2,P#26.0]
          L     LW     8
          T     DIW [AR2,P#30.0]
          L     LD    10
          T     DID [AR2,P#32.0]
          L     LD    14
          T     DID [AR2,P#36.0]
          L     LW    18
          T     DIW [AR2,P#40.0]
          +AR2  P#20.0
          UC    FB     2
          LAR2  LD    20
          TDB   
          BLD   15
          End Call
    Es wird also direkt das vorhandene AR2 verwendet um die vorbereiteten Daten in die passenden Instanzbereiche umzukopieren. Genau dieses AR2 hast du aber vorher mit deinem Pointer auf yourPointer überladen.

    Dass es umgekehrt funktioniert (erst yourPointer, dann myPointer) liegt daran, dass dann AR2 wieder auf den richtigen Wert gesetzt wird, da myPointer der erste IN-Parameter des FB1 ist. Wäre vorher noch ein anderer Parameter, dann würde es auch nicht funktionieren.
    "Richtig" ist hier natürlich auch nur teilweise zutreffend, ursprünglich war AR2 ein Pointer auf DBX 0.0 nun aber auf L 0.0 - das wird aber durch die explizite Typzuweisung in der Parameterübergabe ignoriert; Die relative Position ist identisch.

    Wie bereits in meinem ersten Post gesagt: Bei Multiinstanzen immer AR2 sichern und restaurieren wenn man's selber verwenden will!

  4. Folgende 2 Benutzer sagen Danke zu hovonlo für den nützlichen Beitrag:

    Larry Laffer (15.07.2009),TagebauCoder (25.09.2009)

  5. #24
    Registriert seit
    18.07.2007
    Beiträge
    82
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Lächeln

    Guten Morgen zusammen,

    heute ist ein guter Tag, denn hovonlo hat die Lösung für die letzte Hürde geliefert.

    Vielen Dank hovonlo, Larry Laffer und allen anderen.

    Ich habe das Testprojekt angehängt, falls jemand Interesse hat.

    Gruß,
    Woto
    Angehängte Dateien Angehängte Dateien

  6. #25
    Registriert seit
    05.06.2006
    Ort
    PLZ 97xxx
    Beiträge
    276
    Danke
    31
    Erhielt 44 Danke für 36 Beiträge

    Standard

    In deinem Code kann es aber trotzdem noch zu Problemen kommen.

    Der Befehl +AR1 oder auch +AR2 macht nur eine 16-Bit Addition.
    Wenn Du nun diesen Baustein als Multiinstanz irgendwo einfügst und
    die Instanzdaten auf einer Adresse >= 8192.0 liegen kriegst Du ein
    großes Problem.

    Dein Code:
    Code:
    FB2
     
          LAR1  P##myPointer
          TAR2  
          +AR1  
          L     DIW [AR1,P#0.0]
          L     DIW [AR1,P#2.0]
          L     DIW [AR1,P#4.0]
          L     DIW [AR1,P#6.0]
          L     DIW [AR1,P#8.0]
     
          LAR1  P##yourPointer
          TAR2  
          +AR1  
          L     DIW [AR1,P#0.0]
          L     DIW [AR1,P#2.0]
          L     DIW [AR1,P#4.0]
          L     DIW [AR1,P#6.0]
          L     DIW [AR1,P#8.0]

    universeller Code auch über Adressen 8192.0 gültig

    Code:
          L     P##myPointer            // Startadresse #myPointer laden
          UD    DW#16#FFFFFF        // Bereichscodierung ausmaskieren
          TAR2                              // Start der Multiinstanz im DI laden
          +D    
          LAR1                              // Adresse im DI (Multiinstanz)
          L     DIW [AR1,P#0.0]
          L     DIW [AR1,P#2.0]
          L     DIW [AR1,P#4.0]
          L     DIW [AR1,P#6.0]
          L     DIW [AR1,P#8.0]
       ...

  7. #26
    Registriert seit
    05.06.2006
    Ort
    PLZ 97xxx
    Beiträge
    276
    Danke
    31
    Erhielt 44 Danke für 36 Beiträge

    Standard

    zur Verdeutlichung das Projekt mit einem zusätzlichem FB3 in der
    verbesserten Version.

    siehe Bilder und Projekt
    Angehängte Grafiken Angehängte Grafiken
    • Dateityp: jpg FB2.JPG (81,3 KB, 17x aufgerufen)
    • Dateityp: jpg FB3.JPG (111,8 KB, 16x aufgerufen)
    Angehängte Dateien Angehängte Dateien

  8. #27
    Registriert seit
    24.05.2006
    Beiträge
    234
    Danke
    14
    Erhielt 77 Danke für 57 Beiträge

    Standard

    Da hat Sarek wohl Recht - fast!

    Es ist sogar noch schlimmer, da +AR1 bzw. +AR2 die in Akku-1-L vorliegenden 16 Bit vorzeichenrichtig erweitert und dann draufschlägt. Ist der Wert in Akku-1-L als Pointer zwischen 4096.0 (==> 32768dez; 0x8000) und 8191.7 (==> 65535dez; 0xFFFF) wird dieser als negativer Offset betrachtet und somit subtrahiert!

    An diese +-15/16-Bit Beschränkung von +AR1 hab' ich auch nicht mehr gedacht, sorry.

    In dem Zusammenhang ist mir noch eingefallen, dass an sich der FB1 aus dem Beispiel von Woto auch nicht Multiinstanzfähig ist, da hier auch die Verrechnung des AR2 aufs AR1 fehlt ...

  9. #28
    Registriert seit
    18.07.2007
    Beiträge
    82
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    irgendwo wird einem immer ein Bein gestellt.

    Vielen Dank nochmal für eure Anmerkungen, werde dies in Zukunft berücksichtigen.

    Viele Grüße,
    Woto

Ähnliche Themen

  1. FB im FB Aufrufen mit SCL
    Von paula23 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 08.02.2011, 12:33
  2. Mehrere FB's in einem Netwerk aufrufen
    Von fai004 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 13.01.2010, 17:25
  3. Ausgang von einem BK9100 aus einem BC9050 steuern
    Von merlin im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 28.09.2008, 10:51
  4. FC mit einem STRING Parameter aufrufen
    Von xaverlg im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 04.04.2008, 12:20
  5. SCL Funktion aus einem AWL FC aufrufen
    Von plant1 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.08.2006, 17:22

Lesezeichen

Berechtigungen

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