Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: Attribut- und Methodenzugrif in ST (objektorientierte Programmierung)

  1. #1
    Registriert seit
    28.07.2014
    Beiträge
    17
    Danke
    8
    Erhielt 2 Danke für 2 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    Derzeit sitze ich an einem Projekt mit einer WAGO 767-2301, die Messwerte sammeln soll. Da ich bereits einiges objektorientiert programmiert habe (Java,C++, Matlab), möchte ich dies auch hier umsetzen. Die Übersichtlichkeit, Stabilität und Wartbarkeit wird durch OOP meiner Meinung nach stark gefördert. Leider stieß ich bereits am Anfang auf Probleme.

    Was ich bisher habe: Steuerung, Bus etc. funktionieren einwandfrei mit klassischer Programmierung. Da das Projekt einige Slaves umfasst, soll über Klasseninstanzen die Buskommunikation gesteuert werden. Eine weitere Klasse soll Hilfsfunktionen zur Verfügung stellen. Bei CoDeSys 3.4.4 ist OOP im Menü aktiviert worden und ich habe die Funktionsbausteine mit Methoden und Attributen versehen.

    Nun das Problem: Zugriffe und Zuweisungen mit THIS.meineFunktion/Attribut/Variable oder _meineFunktion/Attribut innerhalb der Klasse produzieren Fehlermeldungen:
    unbekannter Typ - bzgl. Rückgabewert einer Methode
    'THIS' ist keine Strukturvariable // Bei Attributen sowie VAR (ohne Namenskonflikte)
    Wie verweise ich korrekt auf die Attribute und Methoden der zugehörigen Instanz? Muss ich ansonsten die Instanz der Methode separat als VAR_INPUT übergeben?
    Wie sollte eine simple Getter oder Setter Methode in ST aussehen? (Keine Prüfung oder ä., nur simples Lesen/Schreiben)

    Die Autovervollständigung bietet bei THIS.* bereits die Methoden etc. an. Einige Beispiele aus verschiedenen Dokumenten habe ich bereits gefunden, komme aber an dieser wichtigen Stelle nicht weiter.

    Eine weitere Frage:
    Der Buszugriff (Modbus) erfolgt über die CoDeSys Treiber. Jeweils ein Eingags/Ausgangs-Wort wurde damit einer lokalen Variable zugeordnet. Dies funktioniert soweit. Nun möchte ich gerne den Buszugriff komplett innerhalb der Klasse abarbeiten. Ist dies möglich indem ein POINTER TO WORD auf meine Busvariable gesetzt wird, welche ich anschließend meiner Klasse übergebe?

    Ich hoffe das Problem ist verständlich geschildert und ich bin für jede Hilfe dankbar.
    Zitieren Zitieren Attribut- und Methodenzugrif in ST (objektorientierte Programmierung)  

  2. #2
    Registriert seit
    30.08.2005
    Beiträge
    280
    Danke
    41
    Erhielt 96 Danke für 66 Beiträge

    Standard

    Hallo,

    ganz einfach: THIS ist ein Pointer und muss dereferenziert werden mit ^.
    Also THIS^.variable sollte dir den Zugriff auf die Methoden und Member liefern.

    THIS^ kann im Übrigen auch weggelassen werden.


    Zitat Zitat von buzzer Beitrag anzeigen
    Eine weitere Frage:
    Der Buszugriff (Modbus) erfolgt über die CoDeSys Treiber. Jeweils ein Eingags/Ausgangs-Wort wurde damit einer lokalen Variable zugeordnet. Dies funktioniert soweit. Nun möchte ich gerne den Buszugriff komplett innerhalb der Klasse abarbeiten. Ist dies möglich indem ein POINTER TO WORD auf meine Busvariable gesetzt wird, welche ich anschließend meiner Klasse übergebe?
    Wenn du auf die Ein/Ausgänge über POINTER zugreifst, dann weiss der Treiber nicht, in welcher Task der Zugriff erfolgt, es kann sein, dass dann das IO-Update nicht erfolgt.
    Daher ist es geschickter die Ausgänge direkt auf eine Variablen in deiner Klasse zu legen mit map on existing in der Konfiguration.
    Oder die Einstellung wählen: alle Ausgänge updaten.
    Bernhard Werner
    3S-Smart Software Solutions (CODESYS)

  3. Folgender Benutzer sagt Danke zu Werner29 für den nützlichen Beitrag:

    buzzer (29.07.2014)

  4. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.715
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    @Werner:
    Ich vermute, dass es dem TE vielmehr darum geht, wie er überhaupt seine Klasse (den FB) instanziert. Ich glaube nicht, das THIS die Instanz des Bausteins sein soll. Leider bin ich absolut kein Codesys'er um das beantworten zu können ...

    Gruß
    Larry

  5. #4
    buzzer ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.07.2014
    Beiträge
    17
    Danke
    8
    Erhielt 2 Danke für 2 Beiträge

    Standard

    die Hinweise von Werner haben mich schon ein ordentliches Stück weitergebracht. THIS habe ich dementsprechend weggelassen. War es zuletzt von Matlab gewöhnt dieses zu verwenden. Auch verwende ich ich statt Eigenschaften/Properties vorerst wieder die Deklaration als VAR. Der Grund ist, dass der Zugriff auf Arrays und Structs dafür umständlich scheint und ich weitere Syntaxfehler vermeiden will. Werde mir morgen mal die Samples aus dem CoDeSys Shop ansehen um daraus zu lernen. Insbes. zu den Getter/Setter Methoden hatte ich nocht nicht viel gesehen.
    Die Instanzierung und inzwischen der Methodenaufruf erfolgt problemlos wie bei normale FBs. Es war tatsächlich der aufgezeigte Syntaxfehler.

    Das ich mit map on existing die Buszugriffe direkt auf Objektvariablen legen kann hatte ich nicht erwartet. Finde ich aber sehr praktisch und werde es testen.

    Schon mal vielen Dank für die Informationen.

  6. #5
    Registriert seit
    30.08.2005
    Beiträge
    280
    Danke
    41
    Erhielt 96 Danke für 66 Beiträge

    Standard

    Bei Properties die Arrays oder Strukturen zurückliefern, muss man aufpassen: die Struktur wird dann wirklich als Wert zurückgeliefert und dementsprechend mehrmals umkopiert.
    Ein Schreiben in die zurückgelieferte Struktur ändert dementsprechend nicht das Original in der Klasse, sondern die kopierte Struktur.

    Wenn man direkten Zugriff auf ein Array oder eine Struktur in der Klasse bieten will, dann sollte man eine Referenz auf die Variable zurückliefern

    PROPERTY Arr_prop : REFERENCE TO ARRAY[0..5] OF STRUCT_1

    Und im Getter:
    Arr_prop REF= loc_var;


    Ein Setter ist dann nicht notwendig, bzw. eher schädlich, denn ein schreibender Zugriff ist auch über die Referenz möglich

    fb.Arr_prop[2].compo := 10;

    mit so einem Zugriff wird dann direkt die Variable loc_var manipuliert.
    Bernhard Werner
    3S-Smart Software Solutions (CODESYS)

  7. #6
    Registriert seit
    15.11.2012
    Beiträge
    41
    Danke
    3
    Erhielt 8 Danke für 8 Beiträge

    Standard

    Zitat Zitat von Werner29 Beitrag anzeigen
    Ein Setter ist dann nicht notwendig, bzw. eher schädlich, denn ein schreibender Zugriff ist auch über die Referenz möglich

    fb.Arr_prop[2].compo := 10;

    mit so einem Zugriff wird dann direkt die Variable loc_var manipuliert.
    Gibt es eine Möglichkeit, diesen Schreibzugriff auf die lokale Variable zu verhindern?
    Ich möchte über Interface-Properties auf Strukturelemente direkt zugreifen - aber nur lesend.

  8. #7
    buzzer ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.07.2014
    Beiträge
    17
    Danke
    8
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Bei mir habe ich vorerst auf vollständige Datenkapselung verzichtet. Indem ich die Klassen und Methoden nur per CFC verbinde hilft das Funktionsblockprinzip ebenfalls ungünstige Zugriffe zu vermeiden.
    Den ^.THIS Ausdruck verwende ich inzwischen wieder um zwischen gleichnamigen Variablen in Objekt und Methode zu unterscheiden.

  9. #8
    Registriert seit
    30.08.2005
    Beiträge
    280
    Danke
    41
    Erhielt 96 Danke für 66 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Interface Beitrag anzeigen
    Gibt es eine Möglichkeit, diesen Schreibzugriff auf die lokale Variable zu verhindern?
    Ich möchte über Interface-Properties auf Strukturelemente direkt zugreifen - aber nur lesend.
    Nein das geht im Moment nicht. Wenn man eine Referenz rausreicht, dann besteht voller Zugriff.
    Bernhard Werner
    3S-Smart Software Solutions (CODESYS)

Ähnliche Themen

  1. Kein Attribut IN_ADDRESS zum Objekt vorhanden.
    Von Werner v. Siemens im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 02.11.2016, 13:20
  2. Antworten: 11
    Letzter Beitrag: 22.04.2014, 17:16
  3. Objektorientierte Programmierung
    Von steven im Forum HMI
    Antworten: 23
    Letzter Beitrag: 25.04.2013, 10:25
  4. Antworten: 2
    Letzter Beitrag: 02.05.2012, 14:39
  5. Antworten: 1
    Letzter Beitrag: 12.10.2008, 16:27

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •