Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Eindeutige Objektkennung

phieng
2009-12-03
2009-12-15
  • phieng - 2009-12-03

    Gegeben sei die folgende Klassenhierachie:

    ClassB extends ClassA;

    Die Instanzen werden in Listen verwaltet, dabei wird jeweils der THIS-Pointer eingetragen.

    Ich habe nun bemerkt, dass ich beim Suchen von Instanzen zum Teil keine Treffer bekomme. Grund ist dass der THIS-Pointer für die gleiche Instanz unterschiedliche Werte haben kann.

    Vermutlich macht es einen Unterschied ob der THIS-Pointer einer B-Instanz aus einer Methode der ClassA oder ClassB genommen wird.

    Gibt es eine eindeutige Instanz-ID, welche komplett unabhängig der Klassenhierachie ist?

     
  • Ralph Holz - 2009-12-04

    Hallo,

    das mit den unterschiedlichen Adressen kann eigentlich nur durch einen OnlineChange verursacht werden. Um deine Registrierungen wieder grade zu biegen mußt du die Methoden FB_INIT oder FB_REINIT verwenden beide werden aufgerufen wenn der FB seine Adressen ändert(siehe Hilfe). Also darin einfach den nutzlosen alten pointer deregistrieren und den neuen registrieren und alles ist schön.

    Gruß

    Ralph

     
  • phieng - 2009-12-04

    Ralph Holz hat geschrieben:
    Hallo,
    das mit den unterschiedlichen Adressen kann eigentlich nur durch einen OnlineChange verursacht werden. Um deine Registrierungen wieder grade zu biegen mußt du die Methoden FB_INIT oder FB_REINIT verwenden beide werden aufgerufen wenn der FB seine Adressen ändert(siehe Hilfe). Also darin einfach den nutzlosen alten pointer deregistrieren und den neuen registrieren und alles ist schön.
    Gruß
    Ralph

    Es passiert tatsächlich beim OnlineChange. Ich habe viel mit den Init-Methoden experimentiert. Gerade mit grösseren Klassenhierarchien ist deren Handhabung nicht sehr transparent. Ich habe mich nun zu folgendem Vorgehen entschlossen:

    Beim Entladen (FB-Exit) werden die Instanzen deregistriert und ein Flag gesetzt, dass das Objekt online geändert wurde.

    Als zweiter Schritt wird per Programm wieder neu registriert.

    Mein Problem entsteht beim Entladen, die FB-Exit-Methode der SUPER-Klasse findet das von der Unterklasse registrierte Objekt nicht.

    Die FB-Exit-Methode sieht folgendermassen aus:

    IF bInCopyCode THEN
       IF NOT (gcsEnvironment=NUL) THEN
          tmpCollectionHandler:=gcsEnvironment.getCollectionHandler();   
          tmpCollectionHandler.RemoveObject(THIS^);
       END_IF
       hasBeenOnlineChanged:=bInCopyCode;
    END_IF
    

    Hast Du eine Idee wo hier der Fehler ist?

     
  • Ralph Holz - 2009-12-07

    Hast du vielleicht in beiden Klassen FB_INIT und/oder FB_EXIT dann wirdin deiner abgeleiteten Klasse sowohl der Exit der Basis als auch der Exit deiner Klasse ausgeführt. Ich muß mich mal schlau machen in welcher Reihenfolge. Dann würdest du versuchen die gleiche instanz 2 mal zu deregistrieren, was natürlich nicht geht wenn sie schon weg ist.

    Gruß

    Ralph

     
  • phieng - 2009-12-15

    Die FB_Exit-Methode wird sicher nur einmal aufgerufen.

    Vielleicht ist dir aufgefallen, dass ich den THIS-Pointer vor der Uebergabe dereferenziere. Dies muss ich machen damit die RemoveObject-Methode unversell eingesetzt werden kann. Das Object wurde natürlich auch so in der Collection registriert.

    Der Uebergabe-Parameter ist als IObject-Interface definiert. Dieses Interface wird grundsätzlich von allen meinen Klassen implementiert.

    Ich vermute nun, dass der dereferenzierte THIS-Pointer je nach Ableitungsstufe nicht gleich ist.

    Gruss Philipp

     

Log in to post a comment.