Klasse
Eine Klasse ist eine logische Einheit, in der Daten und Operationen gekapselt werden. Sie stellt außerdem einen Variablentyp dar, der instanziiert werden kann. Eine Klasse kann eine Methode FB_Init haben, die bei der Initialisierung einer Instanz aufgerufen wird.
Eine Klasse kann über folgende Beziehungstypen verfügen:
- Komposition: Eine Klasse kann andere Programmelemente enthalten.
- Assoziation: Eine Klasse kann andere Programmelemente kennen.
- Realisierung: Eine Klasse kann eine Schnittstelle einbinden.
- Generalisierung: Eine Klasse kann von einer anderen Klasse erben.
Eine Klasse wird durch ein dreigeteiltes Rechteck dargestellt:
- Orange mit Überschrift <<program>>: POU (PROGRAM)
- Blau ohne Überschrift: POU (FUNCTION_BLOCK oder FUNCTION)
- Blau mit Überschrift <<library>>: POU (FUNCTION_BLOCK oder FUNCTION) aus einer Bibliothek (Bibliotheksfunktionsbaustein)
- Gegraut mit Überschrift <<fehlt>>: POU (FUNCTION_BLOCK oder FUNCTION) aus einer Bibliothek, die aber aktuell nicht im Projekt eingebunden ist
Es folgt fettgedruckt der Klassenname.
Nach der ersten Trennlinie werden alle Attribute angezeigt. Jedes sichtbare Attribut hat eine Kennung. Wenn in geschweiften Klammern {input} angefügt ist, handelt es sich um eine Variable vom Typ VAR_INPUT, bei {output} handelt es sich um eine Variable vom Typ VAR_OUTPUT. Eine Eigenschaft hat die Kennung {property}. Eine interne (nicht sichtbare) Variable vom Typ VAR hat keine Kennung:
<Attributname> : <Datentyp> {'{input}' | '{output}' | '{property}'}
Nach der zweiten Trennlinie folgen alle Operationen der Klasse, d.h. ihre Methoden oder Aktionen. Zuerst kommt jeweils der Name der Operation mit abschließender runder Klammer. Anschließend kennzeichnet {action} eine Aktion:
<Aktionsname>() {action}
Handelt es sich um eine Methode, wird in den runden Klammern ggf. auf eine Variablenübergabe hingewiesen. Falls für eine Methode ein Rückgabetyp deklariert ist, folgt dieser in der rechten Spalte. Methoden besitzen im Gegensatz zu Aktionen ({action}) keine abschließende Kennung:
<Methodenname>(…) : <Rückgabetyp>
Eigenschaften
„Eigenschaft“ | Beschreibung |
---|---|
„Bezeichner“ | Name der Klasse Beispiel: FB_EventLogger |
Benutzereingaben bei einer Klasse
Die folgenden Benutzereingaben sind unter der Bedingung verfügbar, dass „Zeiger“ in der Toolbox aktiviert ist (Default).
Benutzereingabe im Klassendiagramm | Reaktion im Klassendiagramm | Beschreibung |
---|---|---|
Wählen Sie das Werkzeug „Klasse (POU)“: Klicken Sie in einen freien Bereich des Diagramms. Der Dialog „POU hinzufügen“ öffnet. Geben Sie für das neue Objekt einen Namen ein, passen Sie die Einstellungen an und beenden Sie den Dialog mit „Hinzufügen“. | Eine Klasse wird erstellt. | Das Objekt existiert im Diagramm und im Projekt. Die Ansicht im Projektbaum wird automatisch aktualisiert. |
Selektieren Sie eine Klasse. | Die Klasse hat expandierte Attribut- und Operationslisten, die mit Links oberhalb der Klasse sind nun Befehlssymbole sichtbar, um Beziehungselemente einzufügen. Tipp: Wenn die Klasse über Beziehungen verfügt, die zur Zeit nicht im Klassendiagramm dargestellt werden (fehlende Rechteckelemente), dann erscheint in der Ansicht „Werkzeuge“ eine Liste „Eingehende Querverweise“ und/oder „Ausgehende Querverweise“. Darunter sind die fehlenden Rechteckelemente aufgelistet, welche Sie per Drag’n’Drop ins Klassendiagramm ziehen können, um sie dort darzustellen. | |
Klicken Sie auf | Die Klasse wird im Diagramm entfernt, sodass sie nicht mehr dargestellt wird. | Verwenden Sie das flache Entfernen einer Klasse, wenn sie nur in der Klassendiagrammsicht entfernt werden soll. Das Objekt existiert nach wie vor und ist im Projektbaum sichtbar. Tipp: Die Klasse wird in der Ansicht „Werkzeuge“ unter „Eingehende Querverweise“ und/oder „Ausgehende Querverweise“ angezeigt, wenn ein Rechteckelement im Klassendiagramm selektiert ist, das eine Beziehung zu dem entfernten Element hat. |
Klicken Sie auf | Die Klasse wird im Diagramm und im Projekt entfernt. | Das Objekt erscheint nicht mehr als Objekt im Klassendiagramm oder im Projektbaum. Es existiert nicht mehr. |
Klicken Sie auf | Ein Kompositionspfeil weist ausgehend von der bestehenden Klasse auf die neue Klasse. | Die bestehende Klasse enthält eine Instanz auf die neue Klasse. Zum Beispiel: fbNew : FB_New; |
Klicken Sie auf | Ein Kompositionspfeil weist ausgehend von der ersten Klasse auf die zweite Klasse. | Die erste Klasse enthält eine Instanz auf die zweite Klasse. Zum Beispiel: fbExistent : FB_Existent; |
Klicken Sie auf | Ein Assoziationspfeil weist ausgehend von der ersten Klasse auf die neue Klasse. | Eine neue Klasse FB_New wird erzeugt. Die bestehende Klasse kennt nun die neue Klasse und enthält eine Assoziation auf die neue Klasse. Zum Beispiel: pNew : POINTER TO FB_New . |
Klicken Sie auf | Ein Assoziationspfeil weist ausgehend von der ersten Klasse auf die zweite Klasse. | Die erste Klasse kennt die zweite Klasse. Sie enthält nun eine neue Variable vom Typ. Zum Beispiel: pExistent : POINTER TO FB_Existent; |
Klicken Sie auf | Eine Generalisierung weist von der bestehenden Klasse zur neuen Klasse. Die bestehende Klasse erbt von der neuen. | Die bestehende Klasse enthält die Deklaration. Zum Beispiel: FUNCTION_BLOCK FB_Sub EXTENDS FB_New |
Klicken Sie auf | Eine Generalisierung weist von der ersten Klasse zur zweiten Klasse. | Die erste Klasse enthält die Deklaration. Zum Beispiel: FUNCTION_BLOCK FB_Sub EXTENDS FB_Existent |
Klicken Sie auf | Ein Realisierungspfeil weist von der Klasse zur neuen Schnittstelle. | Die Klasse implementiert die neue Schnittstelle. Im Deklarationsteil der Klasse steht. Zum Beispiel: FUNCTION_BLOCK FB_Sample IMPLEMENTS I_SampleNew |
Klicken Sie auf | Ein Realisierungspfeil weist von der Klasse zur Schnittstelle. | Die Klasse implementiert nun die Schnittstelle. Im Deklarationsteil der Klasse steht. Zum Beispiel: FUNCTION_BLOCK FB_Sample IMPLEMENTS I_SampleExistent |
Klicken Sie auf | Die Attribut- bzw. Operationsliste minimiert sich. | |
Klicken Sie auf |
| Die Attribut- bzw. Operationsliste expandiert. |
Klicken Sie auf den Klassennamen. Ist er selektiert, dann ein weiteres Mal auf ihn klicken. | Nach dem ersten Klick ist der Name blau umrandet. Nach dem zweiten Klick öffnet der Zeileneditor. | Die Änderung wird im Projekt synchron und automatisch übernommen. D.h., der Objektname im Projektbaum und im Deklarationsteil der POU wird sofort angepasst. |
Klicken Sie zwei Mal auf einen Attribut- oder Operationsnamen. Ändern Sie dann den Namen im Zeileneditor. | Nach dem ersten Klick ist der Name blau umrandet. Nach dem zweiten Klick öffnet der Zeileneditor. | Die Änderung wird im Projekt synchron und automatisch übernommen. |
Doppelklicken Sie das Klassenelement. | Der zugehörige Objekteditor öffnet sich und Deklaration und Implementation werden angezeigt. | Sie können die Deklaration bzw. die Implementierung ändern. Nach Schließen des Objekts kehren Sie zum Klassendiagramm zurück. Die Änderungen werden automatisch ins Klassendiagramm übernommen. |
![]() | Beachten Sie, dass die Voreinstellungen im Dialog „POU hinzufügen“ oder „Schnittstelle hinzufügen“ von der letzten Anwendung dieses Dialogs stammen. |
Beispiele
- Komposition
PROGRAM Test
VAR
fbSample : FB_Sample;
aSample : ARRAY[1..10] OF FB_Sample;
END_VAR
- Assoziation
PROGRAM Test
VAR
pSample : POINTER TO FB_Sample;
aSample : ARRAY[1..10] OF POINTER TO FB_Sample;
END_VAR
- Generalisierung
FUNCTION_BLOCK FB_Sub EXTENDS FB_Base
- Realisierung
INTERFACE I_Cylinder EXTENDS I_Base
FUNCTION_BLOCK FB_Cylinder IMPLEMENTS I_Cylinder