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

Ergebnis 1 bis 7 von 7

Thema: Problem mit indirekter Adressierung

  1. #1
    Registriert seit
    15.12.2007
    Beiträge
    712
    Danke
    84
    Erhielt 105 Danke für 94 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe den Auftrag erhalten um einen vorhandenen S7-FB der 1999 programmiert wurde einen "Adapterbaustein" zu schreiben mit dem man den Standard-FB aus CFC heraus beschalten kann. (System = PCS7 V7.1 SP1)

    Der Original-FB hat 4 Eingänge als POINTER und ist folgendermaßen in einem Beispielprojekt beschaltet:

    Code:
          
    CALL  FB   105 , DB105
           A_A    :=P#M 40.0                // Default Ausgangsbereich (MB40-71, AB 0-31)
           E_A    :=P#M 0.0                 // Default Eingangsbereich (MB 0-31, EB 0-31)
           DB_Send:=DB37.DBX0.0             // DB für Sendedaten
           DB_Empf:=DB38.DBX0.0             // DB für Empfangsdaten
           Fkt_Nr :=MW102                   // Funktions-Nr. (0-2)
           ANZW   :=MW100                   // Anzeigenwort
    IN POINTER = A_A ... E_A ... DB_Send ... DB_Empf

    Ich habe diesen FB nun als Multiinstanz in meinem selbstgeschriebenen FB integriert.
    Das Problem ist nun aber das es egal ist was ich dem Baustein an den Eingängen übergebe! Es kommt immer zu Bereichsfehlern beim lesen/schreiben:

    Code:
    Baugruppenträger:                 ---
    Steckplatz:                       ---
    Ereignis 1 von 3000:  Ereignis-ID 16# 2525
    Bereichsfehler beim Schreiben 
    Falsche Bereichskennung:    0
    FB-Nummer:   105
    Bausteinadresse:   2160
    Angeforderter OB: Programmierfehler-OB (OB 121)
    Prioritätsklasse:  9
    interner Fehler, kommendes Ereignis
    15:45:05.593  28.09.2010
    Irgendwie muss das an meiner Multiinstanz liegen. Aber ich weiß nicht wo der Fehler begraben ist.

    Ich rufe den Baustein folgendermaßen auf:

    Code:
    AUF DB [DB_Nr];
    
    CALL #WAAGE (
               A_A                        := P#DBX52.0,
               E_A                        := P#DBX84.0,
               DB_Send                    := DBX232.0,
               DB_Empf                    := DBX792.0,
               Fkt_Nr                    := #FB891_FKT_NR,
               ANZW                        := #FB891_ANZW);
    Auch festes eintragen der Pointer hilft nicht.

    Vielleicht sieht ja jemand von euch was schief läuft.

    Danke im vorraus
    Zitieren Zitieren Problem mit indirekter Adressierung  

  2. #2
    Registriert seit
    23.10.2008
    Ort
    Rhein-Main-Gebiet
    Beiträge
    25
    Danke
    9
    Erhielt 4 Danke für 3 Beiträge

    Standard

    Hallo,
    es liegt wahrscheinlich an deinem FB105 der nicht Multiinstanzfähig ist. Kannst Du den editieren?

    Gruß: Geza
    Geändert von geza (28.09.2010 um 17:03 Uhr)

  3. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    Zitat Zitat von Astralavista Beitrag anzeigen
    Code:
     
    CALL FB 105 , DB105
    A_A :=P#M 40.0 // Default Ausgangsbereich (MB40-71, AB 0-31)
    E_A :=P#M 0.0 // Default Eingangsbereich (MB 0-31, EB 0-31)
    DB_Send:=DB37.DBX0.0 // DB für Sendedaten
    DB_Empf:=DB38.DBX0.0 // DB für Empfangsdaten
    Fkt_Nr :=MW102 // Funktions-Nr. (0-2)
    ANZW :=MW100 // Anzeigenwort
    :

    Code:
    AUF DB [DB_Nr];
     
    CALL #WAAGE (
               A_A                        := P#DBX52.0,
               E_A                        := P#DBX84.0,
               DB_Send                    := DBX232.0,
               DB_Empf                    := DBX792.0,
               Fkt_Nr                    := #FB891_FKT_NR,
               ANZW                        := #FB891_ANZW);
    Hallo,
    ohne den Baustein zu kennen würde ich sagen, dass es so nicht geht ...
    1.) bei E_E wird im Beispiel alternativ Merker bzw. Eingänge und bei A_A Merker bzw. Ausgänge dargestellt. Ich könnte mir vorstellen, dass der FB etwas anderes nicht auflößt. Du übergibst aber einen Datenbereich und den noch nicht mal qualifiziert (also nur die Adresse, nicht aber den DB - das vorherige Aufrufen des DB's manipuliert NICHT den Pointer).
    Letzteres gilt dann auch für die Zieladressen. Auch hier würde ich mir vorstellen, dass der FB ja gar nicht weiß, in welchen DB er schreiben soll.

    Vielleicht checkst du das mal ...

    Gruß
    Larry

  4. #4
    Astralavista ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    15.12.2007
    Beiträge
    712
    Danke
    84
    Erhielt 105 Danke für 94 Beiträge

    Standard

    Erstmal Danke für die Antworten!
    Bin kurz vor Feierabend auch noch ein bißchen schlauer geworden.

    @Larry
    In dem Kommentar vom AWL-Code steht zwar nur E/A- bzw. Merkerbereich, aber der FB kann definitiv auch DB's handhaben. Das habe ich vorher schon gecheckt.

    Ich habe aber mittlerweile rausgefunden das der FB im inneren direkt auf Adressen seiner eigenen Instanz zugreift, die ja als Multiinstanz nicht mehr passen da Sie im übergeordneten Instanz-DB ja verschoben sind. Von daher denke ich das geza richtig liegt und der Baustein einfach nicht Multiinstanzfähig ist.

    Aber eine Frage hätte ich dann noch:
    Ich lese die Nummer des Instanz-DB's über "L DINO" aus, da sich bei PCS7 ja ständig die Nummer des Instanz-DB nach einem Überssetzungslauf ändern kann.
    Wie kann ich denn in dem Fall die Pointer richtig an den FB105 übergeben? Über DIX?

    BTW ... dieser FB echt grausig geschrieben ... da schwirren noch viele Variablen mit den Namen "Test" oder "Dummy" drin rum und viel ist nur mit "??" kommentiert. Der Baustein ist bei einem namhaften Hersteller von Waagensystem mitgeliefert worden.

  5. #5
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 182 Danke für 167 Beiträge

    Standard

    Hallo!

    Ich würde ein Struct im Statischen Bereich des FB Anlegen und dann den Pointer auf die Variable übergeben.

    Mit direkter Adressierung sollte es irgendwie so funktionieren:
    P#DB[db_nr].DBX0.0
    db_nr ist eine Variable.

    godi

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    Zitat Zitat von godi Beitrag anzeigen
    Mit direkter Adressierung sollte es irgendwie so funktionieren:
    P#DB[db_nr].DBX0.0
    db_nr ist eine Variable.
    Dem Pointer kannst du die DB-Nummer dann auch nur absolut übergeben und nicht als Platzhalter.

    Zitat Zitat von Astralavista Beitrag anzeigen
    Wie kann ich denn in dem Fall die Pointer richtig an den FB105 übergeben? Über DIX?
    Du mußt dir einen Pointer (oder sogar ANY-Pointer ?) zu Fuß erzeugen, der dann auch die Information des DB's beinhaltet.

    Gruß
    Larry

  7. #7
    Registriert seit
    23.10.2008
    Ort
    Rhein-Main-Gebiet
    Beiträge
    25
    Danke
    9
    Erhielt 4 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    wenn ich das richtig verstehe, Du kannst dein FB105 editieren. Es wird sicherlich mit Adressregister gearbeitet. Wenn es multiinstanzfähig sein soll, mußt Du die Adressregister (vor allem AR2) am Anfang retten und am Ende wiederherstellen. Zusätzlich sollst Du bei registerindirekten Zugriffen auf die eigene IDB den Inhalt des ursprünglichen AR2 mit ausmaskierten Speiherbereichskenung dazuaddieren. So wird der FB multiinstanzfähig.

    Die Parameterübergabe beim Aufruf muß auch den vollen Pfad enthalten:
    DBx.DBXy.z

    "P#" kannst Du weglassen. Der Formalparameter ist als Pointer deklariert und wird somit als Pointer weitergegeben, egal ob "P#" davorsteht oder nicht.

    Gruß: Geza

Ähnliche Themen

  1. IN_OUT mit Indirekter Adressierung
    Von SCM im Forum Simatic
    Antworten: 24
    Letzter Beitrag: 14.10.2011, 12:07
  2. Antworten: 12
    Letzter Beitrag: 02.06.2009, 10:19
  3. Antworten: 12
    Letzter Beitrag: 10.05.2007, 21:14
  4. Kleines Problem mit indirekter Adressierung
    Von TobiS81 im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 02.05.2007, 12:31
  5. Antworten: 1
    Letzter Beitrag: 19.06.2003, 19:34

Lesezeichen

Berechtigungen

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