Verständnisfragen zu property

Jörn

Level-1
Beiträge
58
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

kann mir jemand mal einen kurzen Abriss zu properties geben? Da sind mir ein paar Kleinigkeiten noch nicht ganz klar.

Laut https://infosys.beckhoff.com/index....31/tc3_plc_intro/27021600294558347-1.html&id= ruft TwinCAT ... diese Methoden automatisch auf, sobald ein Lese- oder Schreibzugriff auf den Funktionsbaustein erfolgt, der die Eigenschaft implementiert. Kann mir das jemand etwas genauer erkären?

Auf der verlinkten Seite ist beschrieben:

TwinCAT ruft den Set-Accessor auf, wenn auf die Eigenschaft schreibend zugegriffen wird, das bedeutet, Sie verwenden den Namen der Eigenschaft als Eingabeparameter.

TwinCAT ruft den Get-Accessor auf, wenn auf die Eigenschaft lesend zugegriffen wird, das bedeutet, Sie verwenden den Namen der Eigenschaft als Ausgabeparameter.


Gemäß des Beispiels hab ich das so verstanden. Aber was fange ich mit der property jetzt an? Mit ist der Sinn hinter dem ganzen ehrlich gesagt nicht ganz klar.

Code:
FB_Lampe
VAR
   xLichtIstAn: BOOL;
END_VAR

Code:
PROPERTY P_LichtIstAn: BOOL

GET
   P_LichtIstAn := xLichtIstAn;

SET
   xLichtIstAn := P_LichtIstAn;

Gruß
Jörn
 
Eine Property setzt man vor allem dann ein, wenn man eigentlich Methoden schreiben will, deren Hauptzweck das Lesen und/oder Beschreiben einer FB-internen Variable ist. Mit Methoden würde es etwa so aussehen:
Code:
METHOD M_IstLichtAn : BOOL
   // Code
   IstLichtAn:=xLichtistAn;

METHOD M_SchalteLicht(
VAR_INPUT
   LichtAn:BOOL;
END_VAR
   // Code
   xLichtAn:=LichtAn;
Da erfordert die Property etwas weniger Schreibaufwand, und das gilt auch für den Aufruf.
Statt mit Methodenaufrufen
Code:
LichtIstAn:=FB.M_LichtIstAn;
FB_M_SchalteLicht(
   LichtAn:=TRUE);
mit der Property wie ein einfacher Variablenzugriff
Code:
LichtIstAn:=FB.P_LichtIstAn;
FB.P_LichtIstAn:=TRUE;
Ausserdem kannst Du im GET/SET-Accessor noch weiteren Code unterbringen. Wenn Du z. B. mitzählen willst, wie oft das Licht eingeschaltet wird, kannst Du das mit in den SET-Accessor schreiben.
Code:
IF P_LichtIstAn AND NOT xLichtIstAn THEN
   EinschaltZaehler:=Einschaltzähler+1;
END_IF
xLichtIstAn:=P_LichtIstAn;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Property setzt man vor allem dann ein, wenn man eigentlich Methoden schreiben will, deren Hauptzweck das Lesen und/oder Beschreiben einer FB-internen Variable ist.

Ahhh ... das war der Punkt, den ich bisher übersah. Vielen Dank. :)

Gruß
Jörn



Anbei noch ein Beispiel:

Code:
PROGRAM MAIN
VAR
   fbMeinLicht:   FB_Lamp;
   xSchalter:     BOOL;
   xZustandLampe: BOOL;
END_VAR

// Code
IF xSchalter THEN
    fbMeinLicht.P_BulbState := TRUE;
ELSE
    fbMeinLicht.P_BulbState := FALSE;
END_IF

xZustandLampe := fbMeinLicht.P_BulbState;


Der FB hat als interne Variablen eine Birne und einen Zähler:
Code:
FUNCTION_BLOCK FB_Lamp
VAR
   xBulb:            BOOL;
   nTurnedOnCounter: INT;
END_VAR


SET wird aufgerufen, wenn man mit fbMeinLicht.P_BulbState := ... etwas in die property P_BulbState schreibt:
Code:
P_BulbState.SET
// Code
IF P_BulbState AND NOT xBulb THEN
   nTurnedOnCounter := nTurnedOnCounter + 1;
END_IF

xBulb := P_BulbState;


GET wird aufgerufen, wenn man mit ... := fbMeinLicht.P_BulbState die property P_BulbState ausliest:
Code:
P_BulbState.GET
// Code
P_BulbState := xBulb;
 
Ich nutze für ausführende Aktionen immer Methoden, keine Property.
Dann würde der Aufwand so aussehen:

Du machst einen FB (fbMeinLicht) mit zwei Methoden.

1. Methode: mLichtEin --> Hier setzt du die interne Variable auf "TRUE"
2. Methode: mLichtAus --> Hier setzt du die interne Variable auf "FALSE"

Dann kannst du noch eine Property mit GET einfügen:

3. Property: pLichtEin --> Hier machst du eine Zuweisung von der internen Variablen auf die GET Property machen.
Mit der kannst du dann Programm intern abfragen ob die Lampe eingeschaltet ist oder nicht.


Im Code könnte es dann so aussehen:

if xSchalterEin then
fbMeinLicht.mLichtEin();
end_if

if xSchalterAus then
fbMeinLicht.mLichtAus();
end_if

if fbMeinLicht.pLichtEin then

.....

end_if


Aber das ist nur ein weiterer Ansatz ;) Der Weg zum Ziel ist vielseitig, wichtig ist das man ankommt :D
 
Der Vorteil eines Propertys ist, z.B. das dieser automatisch Umrechnungen durchführen könnte. Angenommen ein FU liefert die aktuelle Position lediglich als Anzahl der Inkremente, dann kann man in der Property diesen Wert in mm umrechnen, umgekehrt gilt das Selbe.
 
Zurück
Oben