OOP und Zugriff auf Methoden und Eigenschaften einer Instanz des Klassenobjekts innerhalb anderer POUs

mgl

Level-2
Beiträge
72
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich bin recht neu in der OOP und wollte Fragen wie Ihr das Umsetzt.

Ich habe einen Funktionsbaustein nennen wir ihn "FB_Global" geschrieben, der Global auf der CPU eingesetzt werden soll. Normalerweise würde ich eine Instanz des FB aufrufen und das Ergebnis in eine Globale Variable schreiben und die Werte dann als Parameter an andere FBs übergeben. Das passt jedoch meinen Verständnis nach nicht zur OOP, da die Globalen Variablen keinen Zugriffsschutz / Schreibschutz haben.

Kann ich die Instanz des "FB_Global" als Parameter der Bausteinschnittstelle übergeben, und dann in den jeweiligen Bausteinen, die Eigenschaften und Methoden des FB_Global aufrufen? Oder macht man das irgendwie mit Vererbung oder so?

Vielen Dank schon mal im voraus
 
Hier findest du ein Beispiel von CODESYS
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich bin recht neu in der OOP und wollte Fragen wie Ihr das Umsetzt.

Ich habe einen Funktionsbaustein nennen wir ihn "FB_Global" geschrieben, der Global auf der CPU eingesetzt werden soll. Normalerweise würde ich eine Instanz des FB aufrufen und das Ergebnis in eine Globale Variable schreiben und die Werte dann als Parameter an andere FBs übergeben. Das passt jedoch meinen Verständnis nach nicht zur OOP, da die Globalen Variablen keinen Zugriffsschutz / Schreibschutz haben.

Kann ich die Instanz des "FB_Global" als Parameter der Bausteinschnittstelle übergeben, und dann in den jeweiligen Bausteinen, die Eigenschaften und Methoden des FB_Global aufrufen? Oder macht man das irgendwie mit Vererbung oder so?

Vielen Dank schon mal im voraus
Du kannst per Interface direkt deine Daten zum anderen FB senden.
Generell solltest du dich zum Thema OOP einlesen, wenn du C# oder eine andere ähnliche Sprache die Tutorials ansiehst, wirst du es verstehen, zu Codesys OOP gibt es nicht viele Quellen und Foren, aber am Ende ist es sehr ähnlich, außer die Überladungen sind momentan noch nicht möglich.
 
Du kannst per Interface direkt deine Daten zum anderen FB senden.

Ich habe dazu eine Frage.

Soweit wie ich das Beispielprojekten entnehme werden keine Strukturen mehr verwendet. Ohne OOP würde ich 2 Strukturen wie folgt anlegen.

C-ähnlich:
TYPE ST_CMD :
STRUCT
    bZuGS            : BOOL;        // Grundstellung
    bZuAS            : BOOL;        // Arbeitsstellung
END_STRUCT
END_TYPE

TYPE ST_HAND :
STRUCT
    stCMD            : ST_CMD;        // Zylinder Anforderung
    stSettings        : ST_Settings;    // Aktor Einstellungen
    stStatus           : ST_Status;    // Status des Aktors (Bereit, ...)
    stMessages      : ST_Messages;    // Zylinder Fehler, Warnung und Info-Meldungen
END_STRUCT
END_TYPE

FUNCTION_BLOCK FB_Zylinder
VAR_IN_OUT
    io_nOperationMode    : SINT;            // Betriebsart bzw. Umschalten der Anforderungsquelle 0: Aus, 1: Hand (io_stHand.stCmd) 2: Auto (io_stCmd)
    io_stCmd            : ST_CMD;        // Zylinder Anforderung von Automatik
    io_stHand            : ST_Hand;        // Hand-Schnittstelle mit Zylinderanforderung
    ...
END_VAR

Bei OOP wäre das dann etwa so. Aber dann wären die Schnittstellen nicht strukturiert sondern würden nur vom Interface übernommen. Das heißt die I_Hand mit I_CMD extension und I_Cmd. Schnittstelle sind dann gleich und nur einmal vorhanden. Beispiel:

C-ähnlich:
INTERFACE I_Cmd   // mit Property ZuGs (Grundstellung) und ZuAs (Arbeitsstellung)

INTERFACE I_Hand EXTENDS I_Cmd, I_Settings, I_Status  

FUNCTION_BLOCK FB_Cylinder IMPLEMENTS I_Cmd, I_Hand

Wie umgehe ich das am günstigsten? Dann doch wieder auf Strukturen zurückgreifen?
 
Also eins vorneweg, ich habe am Anfang versucht alte Objekte mit OOP aufzupeppen, was in meinem Fall keine gute Lösung war.

Du kannst auch Structs mit dem Interface nutzen.

Ich würde auf einige Dinge verzichten, z.B kann man aus ST_CMD ein Proporty mit Enum machen, da hat man gleich ein Klartext beim programmieren.

Viele Wege führen zum Ziel, willst du nur teile vom alten Quellcode modifizieren oder alles neu machen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Antwort.

Ich versuche einen Softwarestandard von Siemens TIA auf Beckhoff zu portieren. Nur bin ich ganz frisch da im TwinCat und möchte es aber trotzdem richtig machen. Das heißt dann zwar, dass ich wahrscheinlich alles doppelt und dreifach mache aber dadurch lerne ich es.

Ich orientiere mich da aber „nur“ am Siemens Projekt. 1:1 übernehme ich es also nicht.

Genau genommen habe ich keine Cmd - Bits sondern mehrere SINT für cmd, cmdHandshake den ich dann als Transition nutze und ein paar weitere Signale die fürs Ansteuern interessant sind. Das Beispiel sollte nur als Beispiel dienen
 
Danke für deine Antwort.

Ich versuche einen Softwarestandard von Siemens TIA auf Beckhoff zu portieren. Nur bin ich ganz frisch da im TwinCat und möchte es aber trotzdem richtig machen. Das heißt dann zwar, dass ich wahrscheinlich alles doppelt und dreifach mache aber dadurch lerne ich es.

Ich orientiere mich da aber „nur“ am Siemens Projekt. 1:1 übernehme ich es also nicht.

Genau genommen habe ich keine Cmd - Bits sondern mehrere SINT für cmd, cmdHandshake den ich dann als Transition nutze und ein paar weitere Signale die fürs Ansteuern interessant sind. Das Beispiel sollte nur als Beispiel dienen
Ok, das wichtigste ist für mich das Interface, ich mache mir zu allererst einen Plan auf dem Papier, welche Daten sollen in den FB und welche sollen abgehen, wenn man alles hat, kann man man die Interfaces durch Vererbung erweitern, damit man doppelten Code vermeidet, darin sind auch die Methoden und/oder Eigenschaften enthalten.

Die Königsdisziplin ist meiner Meinung nach, alles OnlineChangeSafe zu bekommen, denn nichts ist nerviger als eine Steuerung Neustarten zu müssen. Wir haben Anlagen die nur einmal im Jahr offline gehen dürfen, aber immer wieder erweitert oder verändert werden.
 
Zurück
Oben