Automatisches verknüpfen

mailmir

Level-1
Beiträge
75
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin gerade dabei die Programmierung mit Vererbung zu lernen. Ist teilweise schon interessant.

Eine Frage kommt mir dabei immer wieder in den Sinn.

Ich gebe einige Daten über eine Struktur weiter (Struktur: DatenAllgemein). Hierzu besitzt jeder Funktionsblock einen entsprechenden Eingang.
Ich muss also bei jedem Block immer wieder die Variable mit dem bekannten Namen verknüpfen

Code:
....

MeineInstanz(DatenAllgemein := DatenAllgemein);

Da diese Verknüpfung immer mit der selben bekannten Struktur erzeugt würde ich dies gerne automatisieren. Hat hier jemand eine Idee?

DANKE schon mal.

Gruß Norbert
 
Wenn ich richtig mutmaße, besitzt deine Basisklasse einen Eingang, der immer weiter vererbt wird. Die Hardwareadresse des Eingangs wird über die Struktur im Konstruktor zugeordnet. Und das machst du auch in jedem Konstruktor einer vererbten Klasse bisher händisch. Das möchtest du aber umgehen und automatisieren?

In der Therorie sollte es möglich sein, innerhalb deiner vererbten Klasse den Konstruktor der Basisklasse anzurufen.
Wenn es sich jedoch nur um einen einzelne Zuweisung handelt die du automatisieren willst, hast du damit eigentlich nichts gewonnen ^^

Die Frage ist nur, was deine Programmierumgebung zulässt.
 
Meinst Du, dass Du die einzelnen Instanzen des FBs z.B. in einer Schleife aufrufst?
Das könntest Du so lösen, dass Du ein Array erstellst vom Typ des FBs und dann die Instanzen in einer For-Schleife aufrufst und den Schleifenwert als Index des Arrays nimmst.
Falls das nicht Deine Idee ist, erklär doch bitte mal genauer was Du meinst, denn dann geht es mir wie Marcel, ich weiß nicht was Du meinst.

Von irgendwas mit Internetzugang gesendet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich richtig mutmaße, besitzt deine Basisklasse einen Eingang, der immer weiter vererbt wird. Die Hardwareadresse des Eingangs wird über die Struktur im Konstruktor zugeordnet. Und das machst du auch in jedem Konstruktor einer vererbten Klasse bisher händisch. Das möchtest du aber umgehen und automatisieren?

In der Therorie sollte es möglich sein, innerhalb deiner vererbten Klasse den Konstruktor der Basisklasse anzurufen.
Wenn es sich jedoch nur um einen einzelne Zuweisung handelt die du automatisieren willst, hast du damit eigentlich nichts gewonnen ^^

Die Frage ist nur, was deine Programmierumgebung zulässt.
Äh, Dir ist schon bewusst, dass es hier um SPS Programmierung geht und im speziellen um TC3? Ich wüsste auf anhieb jetzt nicht, dass es in irgendeiner Entwicklungsumgebung für SPSen so etwas wie Konstruktoren gibt, die Funktionalität NEW ja, aber sonst.
Habe gerade mal Konstruktor nachgeschlagen, da meine C++ Zeit schon etwas her ist, es gebe was ansatzweise vergleichbares. Im Deklarationsteil des FBs könnte der TE statt einem Eingang eine lokale Variable nehmen und diese, falls es wirklich immer die selbe Struktur ist, mit einer globalen Variable vom Typ dieser Struktur initialisieren, aber dann geht die Flexibilität flöten.

Von irgendwas mit Internetzugang gesendet.
 
Zuletzt bearbeitet:
Also, versuche ich es mal etwas genauer zu erklären:

Es geht zum Beispiel um eine Lüftungsanlage. Im FB der Regulierung rufe ich meine Temperaturfühler auf, der Regulierungsblock selbst wird eine Instanz höher aufgerufen.


Lüftung
=> Regulierung
=> ZUL_Temperatur
=> FOL_Temperatur

=> Ventilatoren
=> ZUL_Ventilator
=> FOL_Ventilator

Alles sind Instanzen des zugehörigen FB, alle erben die Struktur "DatenAllgemein"
Das würde in der Software also vereinfacht so eine Aufruf-Hierarchie ergeben

Code:
// Lüftung

   Regulierung(DatenAllgemein := DatenAllgemein);
   Ventilatoren(DatenAllgemein := DatenAllgemein);

    // Regulierung
   
        ZUL_Temperatur(DatenAllgemein := DatenAllgemein);
        FOL_Temperatur(DatenAllgemein := DatenAllgemein);


    // Ventilatoren
   
        ZUL_Ventilator(DatenAllgemein := DatenAllgemein);
        FOL_Ventilator(DatenAllgemein := DatenAllgemein);
 
OK, aber ich verstehe jetzt immer noch Dein Problem, Deinen Wunsch nicht.
Ist es Dir zuviel Aufwand für jeden Aufruf der FBs eine Zeile zu tippen und da dann (DatenAllgemein := DatenAllgemein) zu schreiben? Falls ja, würde da mein Tipp mit der For-Schleife etwas bringen, aber nur bei vielen Aufrufen.
Übrigens erben Instanzen nichts, das wäre der Fall, wenn Du einen neuen FB erstellst, der auf einen vorhandenen basiert. Wenn Du in C++ eine Instanz einer Klasse erzeugst erbt die auch nichts, wohl aber wenn Du eine neue Klasse von einer vorhandenen ableitest.

Von irgendwas mit Internetzugang gesendet.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hoi Oliver,

als Programmierer sollte man ja eigentlich "Faul" sein, nach dem Motto, alles was man 2 Mal macht macht man ein Mal zuviel.
Es geht mir dabei aber eher um den Gedanken Fehler zu vermeiden. Wenn man die Struktur nicht verknüpfen muss weil diese automatisch verknüpft werden würde, dann kann man es auch nicht vergessen.

Übrigens erben Instanzen nichts, das wäre der Fall, wenn Du einen neuen FB erstellst, der auf einen vorhandenen basiert. Wenn Du in C++ eine Instanz einer Klasse erzeugst erbt die auch nichts, wohl aber wenn Du eine neue Klasse von einer vorhandenen ableitest.

Das ist mir bekannt, es sind in diesem Falle ineinander verschachtelte FB's
 
Äh, Dir ist schon bewusst, dass es hier um SPS Programmierung geht und im speziellen um TC3? Ich wüsste auf anhieb jetzt nicht, dass es in irgendeiner Entwicklungsumgebung für SPSen so etwas wie Konstruktoren gibt, die Funktionalität NEW ja, aber sonst.
Habe gerade mal Konstruktor nachgeschlagen, da meine C++ Zeit schon etwas her ist, es gebe was ansatzweise vergleichbares. Im Deklarationsteil des FBs könnte der TE statt einem Eingang eine lokale Variable nehmen und diese, falls es wirklich immer die selbe Struktur ist, mit einer globalen Variable vom Typ dieser Struktur initialisieren, aber dann geht die Flexibilität flöten.

Von irgendwas mit Internetzugang gesendet.

Doch gibt es. Bei SPSen von Jetter gibt es für klassen Konstruktoren.

@mailmir:
Deinen Pseudocode versteh ich momentan nicht.
 
Ich habe das Ganze mal (provisorisch) programmiert und ein UML erstellt, vielleicht wird es dann verständlicher.


Vererbung.jpg
 

Anhänge

  • Vererbung.png
    Vererbung.png
    50,9 KB · Aufrufe: 23
  • Vererbung.zip
    184,5 KB · Aufrufe: 6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

mal eine (vielleicht, vielleicht auch nicht) dumme Frage:
Sind mit "DatenAllgemein" immer die gleichen Daten (Struktur/Datentypen UND Werte) oder nur die gleiche Datenstruktur gemein?

Wenn ersteres:
Warum deklarierst du DatenAllgemein nicht einfach public und greifst innerhalb des jeweiligen instanzierten Bausteins quasi über "Parent.DatenAllgemein" darauf zu?


Gruß, Fred
 
Hoi Fred,

DANKE für deine Rückmeldung.

JA, Die Datenstruktur ist immer die Selbe,
NEIN, die Daten sind nicht immer gleich.

Mit dieser Datenstruktur übergebe ich zum Beispiel
- das Alarmreset
- die Bezeichnung von Anlagenteilen
- Freigaben/Sperren von Feldgeräten und Regelkreisen
.
.
.
.
.
 
...
JA, Die Datenstruktur ist immer die Selbe,
NEIN, die Daten sind nicht immer gleich.

Mit dieser Datenstruktur übergebe ich zum Beispiel
- das Alarmreset
- die Bezeichnung von Anlagenteilen
- Freigaben/Sperren von Feldgeräten und Regelkreisen
...

Aber so, wie du dein Beispiel formuliert hast, sieht es nicht so aus, als ob du die DatenAllgemein speziell für den jeweiligen FB manipulierst.
Also sind die enthaltenen Daten strenggenommen IMMER für ALLE FBs gültig, oder?


Gruß, Fred
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich Dich richtig verstehe, möchstest Du, dass die Variable "DatenAllgemein" aus Deinem PRG automatisch auch in allen FBs sichtbar ist, die im PRG instanziiert werden. So etwas (wie z. B. "Parent^.") gibt es in TwinCat aber nicht. Du müsstest es nachbilden und dabei zumindest einmalig im ersten SPS-Zyklus eine Referenz auf die Struktur an alle FBs übergeben, z. B. als Interface auf einen FB, der diese Struktur bereitstellt. Ob sich das lohnt, musst Du selbst entscheiden. Ansonsten bleibt nur die klassische Art und Weise, die Struktur global zu deklarieren.
 
Zurück
Oben