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

Variable in der aufrufenden Instanz ansprechen

Uncle Leo
2009-08-06
2009-08-11
  • Uncle Leo - 2009-08-06

    Hallo Gemeinde

    Ich möchte aus einem Funktionsblock (FB_2), der in einem Funktionsblock (FB_1) aufgerufen wird, auf eine lokale Variable des aufrufenen Bausteins (FB_1 zugreifen.

    Geht das? Und wenn ja, wie sieht die Syntax aus?

    Danke im voraus...

    Jörg

     
  • guerillero - 2009-08-06

    Hi,

    du müsstest die Variable beim Aufruf übergeben

    InstFB2(InputVariableFB2:=VariableFB1);

    oder so ähnlich. Habs nicht getestet, würde ich aber so versuchen.

    bis denn

    Michael

     
  • Uncle Leo - 2009-08-07

    Dass ich die Variable übegeben kann, weiß ich. Aber gibt es noch eine Möglichkeit direkt auf sie zu zugreifen?

    Anders. Kann ich eine Datenherkunft (Variable) indirekt adressieren?

    Jörg

     
  • guerillero - 2009-08-07

    Hi,

    es gibt glaube ich die Möglichkeit der Variablen einen bestimmten Speicherbereich zuzuordnen mit der AT deklaration. Auf den müsste man dann zugreifen können. Wie das aber genau aussieht weiß ich nicht.

    gruß

    Michael

     
  • bonatus - 2009-08-07

    Hallo, das müsste eingelich gehen.

    Wenn du den Bausteinamen nimmst und dann einen Punkt setzt werden dir alle Variablen des Bausteins angezeigt.

    z.B.: FB1.Var1

    gruß bonatus

     
  • Matze001 - 2009-08-07

    fast richtig...

    es ist genau genommen:

    Instanzname.Variablenbezeichnung

    Wenn du z.B. auf Variable test aus FB1 den du mit dem Instanznamen Foerderband versehen hast aufrufen willst musst du eintippen:

    Foerderband.test

    MfG

    Marcel

     
  • bonatus - 2009-08-07

    mein ich doch - angeber

     
  • guerillero - 2009-08-07

    Hi,

    wenn er in FB2 auf eine Variable von FB1 zugreift und FB2 von FB1 aufrufen lässt, kann er diesen Aufruf nur einmal machen, wenn er die Variable in Verbindung mit dem Instanznamen von FB1 nach FB2 übergibt und dann kann man es sich sparen den Code in einen FB zu packen, da dieser nur funktiniert, wenn die Instanz von FB1 einen bsetimmten Namen hat.

    gruß

    Michael

     
  • Uncle Leo - 2009-08-07

    guerillero hat geschrieben:
    ...wenn er in FB2 auf eine Variable von FB1 zugreift und FB2 von FB1 aufrufen lässt, kann er diesen Aufruf nur einmal machen,.....
    .... da dieser nur funktioniert, wenn die Instanz von FB1 einen bestimmten Namen hat.

    Hallo Michael

    Du scheinst mein kleines Problem richtig erkannt zu haben.

    Der hier benannte FB2 soll natürlich in verschiedenen Instanzen des FB1 auf die jeweilig 'offene' Instanz zugreifen.

    Die absolute Adressierung auf die Instanz-Variable ist ja trivial.

    Noch jemand Ideen?

    Jörg

     
  • bonatus - 2009-08-07

    OK, aber warum?

     
  • Uncle Leo - 2009-08-07

    .

    Ok nochmal zum Verständnis

    Nehmen wir an, ich hab einen Funktionsbaustein 'FB_Pumpe'. In diesem Baustein rufe ich einen weiteren FB auf z.B. 'FB_PID_Druck'. Jetzt deklariere ich für jeden Aufruf eine Instanz von 'FB_Pumpe'.

    Pumpe1 : FB_Pumpe;

    Pumpe2 : FB_Pumpe;

    Pumpe3 : FB_Pumpe;

    Der Funktionsbaustein 'FB_PID_Druck', der ja im 'FB_Pumpe' aufgerufen wird, soll nur mit den Werten der aktuellen Instanz versorgt werden.

    Innerhalb von 'FB'_PID_Druck' kann ich ja nicht sagen:

    diVARxyz := Pumpe1.diSollwert; ( das Funktioniert ja nur in der 1. Instanz)

    Jörg

    .

     
  • guerillero - 2009-08-07

    Hi Jörg,

    dann musst du es über die Input Variable machen.

    FB_PID_Druck instanzierst du im FB_Pumpe und übergibst die Variable beim aufruf im FB_Pumpe. Was spricht dagegen?

    gruß

    Michael

     
  • Matze001 - 2009-08-07

    Du rufst den Baustein FB2 einfach in FB1 auf, vergibst ihm einen Namen.

    Die Ein und Ausgangsvariablen dieses FB verknüpfst du mit Variablen in dem FB1 und dein Problem ist gelöst.

    MfG

    Marcel

     
  • Erik Böhm - 2009-08-10

    Mahlzeit

    Schon mal über VAR_IN_OUT nachgedacht ?

    Oder Pointer (was prinzipiell das selbe ist).

    Oder du nennst deinen Pumpe1 eben Pumpe[1] (Deklaration als ARRAY[1..3]) und übergibst der Instanz die entsprechende Nummer 1 - 3.

    Gruß

    Erik

     
  • Uncle Leo - 2009-08-11

    Hallo Leute

    Danke für eure Hilfe. Was ich aus euren Vorschlägen erkennen kann ist, dass ich wohl nicht daran vorbei komme alle Variablen, die ich im 'FB2' benötige, als VAR_IN, VAR_OUT oder VAR_IN_Out zu deklarieren. Das ist schade, werde ich aber jetzt so machen.

    Ich sehe diesen Thread dann mal als erledigt an, danke nochmal an alle.

    Jörg

     

Log in to post a comment.