Entwerfen und Entwickeln
Wenn Sie im Klassendiagramm grafisch programmieren, führen Ihre Änderungen bei den Objekten in der Ansicht POUs und Geräte automatisch zu Anpassungen. Neue Objekte werden in ihrer Grundstruktur eingefügt, bestehende Objekte werden geändert. Beispielsweise können Sie über das Klassendiagramm in Programmierbausteinen Deklarationen einfügen.
So können Sie in einem Klassendiagramm die Architektur ihrer Applikation entwerfen und erhalten synchron die dazu passenden Programmierbausteine. Danach ergänzen Sie die Implementierungen in den Programmierbausteinen.
Im Folgenden sehen Sie die einzelnen Schritte zum Erstellen eines Klassendiagramms für eine Applikation.
1. Projekt erstellen
Öffnen Sie CODESYS.
Wählen Sie den Befehl
.Bestimmen Sie einen Namen und einen Ort und wählen Sie als Vorlage Standardprojekt.
Der Dialog Standardprojekt öffnet sich.
Wählen Sie in PLC_PRG in als Implementierungssprache ST.
Das Projekt wird erstellt.
Selektieren sie den Knoten Applikation und wählen Sie den Befehl .
Der Dialog UML Klassendiagramm hinzufügen erscheint.
Geben Sie als Objektname
CD_Simple
ein.Aktivieren Sie die Option Projektstruktur in aktives Klassendiagramm importieren.
Wählen sie Hinzufügen.
Speichern Sie das Projekt unter dem Namen
SimpleMachine.project
.
2. Schnittstellen identifizieren
Schnittstellen bestimmen öffentlich sichtbare Methoden und Eigenschaften, um damit Klassen zu realisieren.
Öffnen Sie den Editor des Klassendiagramms
CD_Simple
.Selektieren Sie in der Ansicht Werkzeuge eine Schnittstelle.
Ziehen Sie die Schnittstelle in den Editor.
Der Dialog Schnittstelle hinzufügen öffnet sich.
Geben Sie als Namen
IBaseMachine
ein. Schließen Sie den Dialog mit Hinzufügen.Selektieren Sie in der Ansicht Werkzeuge eine Methode.
Ziehen Sie die Methode auf die Schnittstelle
Der Dialog Schnittstellenmethode hinzufügen öffnet sich.
Geben Sie als Namen
DoIt
ein.Geben Sie als Rückgabetyp
BOOL
ein. Schließen Sie den Dialog mit Hinzufügen.Selektieren Sie in der Ansicht Werkzeuge eine Eigenschaft.
Ziehen Sie die Eigenschaft auf die Schnittstelle
Der Dialog Schnittstelleneigenschaft hinzufügen öffnet sich.
Geben Sie als Namen
StateNumber
ein.Geben Sie als Rückgabetyp
INT
ein. Schließen Sie den Dialog mit Hinzufügen.
Tipp
Weitere Informationen zu Schnittstellen finden Sie unter Objekt Schnittstelle und Objekt Schnittstelleneigenschaft
3. Klassen identifizieren und Schnittstelle realisieren
Verschiedene Klassen, die dieselbe Schnittstelle realisieren, enthalten die gleichen Methoden und Eigenschaften. Wenn später die Schnittstelle geändert oder ergänzt wird, wirkt sich das auf alle realisierenden Klassen aus.
Öffnen Sie den Editor des Klassendiagramms
CD_Simple
.Selektieren Sie in der Ansicht Werkzeuge eine Klasse.
Ziehen Sie die Klasse in den Editor.
Der Dialog POU hinzufügen öffnet sich.
Geben Sie als Namen
FB_Machine
ein.Aktivieren Sie die Option Funktionsbaustein.
Wählen Sie als Implementierungssprache UML - Zustandsdiagramm (Statechart SC) ein. Schließen Sie den Dialog mit Hinzufügen.
Im Klassendiagramm wird die Klasse
FB_Machine
hinzugefügt.Selektieren Sie die Klasse.
Über der Klasse erscheinen Befehlssymbole.
Wählen Sie das Befehlssymbol
Realisierung (
IMPLEMENTS
) und klicken Sie auf die SchnittstelleIMachine
.Der Dialog Implementierungssprache auswählen erscheint.
Wählen Sie Strukturierter Text (ST).
Die Klasse
FB_Machine
erbt die Eigenschaften und Methoden der Schnittstelle und realisiert damit die SchnittstelleIMachine
.
4. Generalisieren
Bei der Generalisierung erbt eine Klasse die Eigenschaften und Methoden von einer anderen Klasse.
Öffnen Sie den Editor des Klassendiagramms
CD_Simple
.Selektieren Sie in der Ansicht Werkzeuge eine Klasse.
Ziehen Sie eine Klasse in den Editor.
Der Dialog POU hinzufügen öffnet sich.
Geben Sie als Namen
FB_Machine_A
ein.Aktivieren Sie die Option Erweitert und geben Sie im Eingabefeld daneben
FB_Machine
an.Der Funktionsbaustein
FB_Machine
wird erweitert und ist deshalb eine Generalisierung vonFB_Machine_A
.Wählen Sie als Implementierungssprache UML - Zustandsdiagramm (Statechart SC). Schließen Sie den Dialog mit Hinzufügen.
Im Klassendiagramm ist die Klasse
FBMachine_A
angelegt. Zwischen den KlassenFB_Machine
undFB_Machine_A
ist eine Generalisierung.FB_Machine_A
erbt vonFB_Machine
deren Eigenschaften und Methoden.Wählen Sie in der Ansicht Werkzeuge das Element Variablendeklaration und ziehen Sie es auf die Klasse
FB_Machine_A
.Der Dialog Variable deklarieren öffnet sich.
Geben Sie bei Name
iCounter
und bei DatentypINT
ein. Schließen Sie den Dialog mit OK.Die Klasse
FB_Machine_A
hat nun außer den geerbten Eigenschaften und Methoden eigene Variablen.Selektieren Sie in der Klasse
FBMachine_A
die MethodeDoIt()
und drücken Sie Entf.Die Methode wird im Diagramm entfernt, ebenso wie das Objekt in der Ansicht Geräte. Der erbende Funktionsbaustein
FBMachine_A
benötigt für die Methode keine spezielle eigene Implementierung, sondern ruft bei Bedarf die MethodeDoIt
des BasisfunktionsbausteinsFBMachine
auf.Anmerkung
Verwenden Sie bei Aufrufen von Methoden, die einem Basisfunktionsbaustein zugeordnet und geerbt sind, den Pointer
SUPER
.
Tipp
Weitere Informationen finden Sie unter Erweitern eines Funktionsbausteins und Pointer SUPER.
5. Instanziieren
Öffnen Sie den Editor des Klassendiagramms
CD_Simple
.Selektieren Sie das Programm
PLC_PRG
.Über dem Programm erscheinen Befehlssymbole.
Wählen Sie das Befehlssymbol
Komposition (
VAR
) und klicken Sie auf die KlasseFB_Machine_A
.Der Dialog Variablendeklaration erscheint.
Geben Sie als Namen
fb_A
ein.Das Objekt
fb_A
der KlasseFBMachine_A
ist instanziiert. Nun wird während der Laufzeit die Instanz der Klasse in seiner konkreten Ausprägung erzeugt.
Das Klassendiagramm stellt alle Objekte dar, die für die Generierung des Applikationscode relevant sind. Vor allem aber visualisiert das Klassendiagramm die Beziehungen unter den Objekten: Wer realisiert wen? Wer erbt von wem? Wer instanziiert was? Diese Information ist sonst in der Deklaration verborgen und beispielsweise in der Ansicht Geräte nicht ersichtlich.
6. Implementieren
Öffnen Sie den Funktionsbaustein
FBMachine
.Deklarieren Sie die Funktionsbausteinvariablen.
FUNCTION_BLOCK FBMachine IMPLEMENTS IBaseMachine VAR iState: INT; iMachine : INT; END_VAR
Implementieren Sie den Funktionsbaustein.
iState := iState + 1; // Dummy for control ID
Implementieren Sie dessen Methode
DoIt
.METHOD PUBLIC DoIt : BOOL iMachine := iMachine + 1; // Dummy
Implementieren Sie die Get-Methode der Eigenschaft
StateNumber
vonFBMachine
.StateNumber := iState;
Implementieren Sie die Set-Methode der Eigenschaft
StateNumber
vonFBMachine
.iState := StateNumber;
Öffnen Sie den Funktionsbaustein
FBMachine_A
.Deklarieren Sie die Funktionsbausteinvariablen.
FUNCTION_BLOCK FBMachine IMPLEMENTS IBaseMachine VAR iCounter: INT; END_VAR
Implementieren Sie den Funktionsbaustein.
iCounter := iCounter + 1;
Implementieren Sie die Get-Methode der Eigenschaft
StateNumber
vonFBMachine_A
.StateNumber := iCounter;
Implementieren Sie die Set-Methode der Eigenschaft
StateNumber
vonFBMachine_A
.iCounter := StateNumber;
Wählen Sie den Befehl
.Die Applikation wird fehlerfrei kompiliert.
Laden und starten Sie die Applikation.
Sie können die Funktionsbaustein-Instanz
fb_A
monitoren.