Problem mit indirekter Adressierung

Astralavista

Level-1
Beiträge
799
Reaktionspunkte
112
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
 
Hallo,
es liegt wahrscheinlich an deinem FB105 der nicht Multiinstanzfähig ist. Kannst Du den editieren?

Gruß: Geza
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

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
 
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
 
Zurück
Oben