Debugging von dynamisch erzeugten Klassen/Intefaces mittels Watch

aapostolidis

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich verwende dynamische Speicherallokierung mittels NEW()-Operator um Instanzen einer Klassen zu erzeugen.
Der Zugriff auf die Instanzen geschieht mittels Interface.

Leider lässt sich im Watch das Interface nicht anzeigen. Es wird lediglich "Hidden Instance" angezeigt.
Attribute, die die Instanz sichtbar machen könnten, habe ich leider nicht gefunden.
Das Programm arbeitet korrekt, aber für den Programmierer ist das Interface nicht anzeigbar.

So heben sich die Vorteile der dynmischen Speicherallokierung leider durch das verschlechterte Debugging wieder auf.

Im Anhang ein Screenshot des Watch.

Hat jemand eine Lösungsidee ?

Vielen Dank,
Alexander
 

Anhänge

  • c78f402e-4de8-45b5-9167-13b9c7b5f35d.png
    c78f402e-4de8-45b5-9167-13b9c7b5f35d.png
    15 KB · Aufrufe: 38
So heben sich die Vorteile der dynmischen Speicherallokierung leider durch das verschlechterte Debugging wieder auf.
...
Hat jemand eine Lösungsidee ?
Gibt es wirklich einen technisch notwendigen Grund hier Speicher dynamisch zu belegen?
So wie es aussieht handelt es sich um Fördertechnikelemente. Da wurden Kilometer ohne dynamische Speicherallokierung gebaut :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich verwende dynamische Speicherallokierung mittels NEW()-Operator um Instanzen einer Klassen zu erzeugen.
Der Zugriff auf die Instanzen geschieht mittels Interface.

Leider lässt sich im Watch das Interface nicht anzeigen. Es wird lediglich "Hidden Instance" angezeigt.
Attribute, die die Instanz sichtbar machen könnten, habe ich leider nicht gefunden.
Das Programm arbeitet korrekt, aber für den Programmierer ist das Interface nicht anzeigbar.

So heben sich die Vorteile der dynmischen Speicherallokierung leider durch das verschlechterte Debugging wieder auf.

Im Anhang ein Screenshot des Watch.

Hat jemand eine Lösungsidee ?

Vielen Dank,
Alexander
Ich habe das schon oft gemacht, für Simulationen, unter SP18/19 aber so etwas habe ich noch nicht erlebt. Handelt es sich um ein selbstgemachten FB? Ist irgendwo {attribute 'hide'} ?
 
Hallo,

vielen Dank für eure Antworten.

Gibt es wirklich einen technisch notwendigen Grund hier Speicher dynamisch zu belegen?
So wie es aussieht handelt es sich um Fördertechnikelemente. Da wurden Kilometer ohne dynamische Speicherallokierung gebaut :)
Einen technischen Grund gibt es wahrscheinlich nicht, aber wir möchten moderne Mittel verstehen und beherrschen können.
Natürlich gibt es Vor- und Nachteile, wie bei jeder anderen Technik auch. Diese sind uns bewusst.

Mittels dynamischer Speicherallokierung wollen wir die Variantenvielfalt in den Griff bekommen und Software schreiben, die viele Anwendungsmöglichkeiten hat. Mittels Factory dynamisch eine Instanz vom richtigen Baustein anlegen, je nach Anforderung der aktuellen Konfiguration.

Ich habe das schon oft gemacht, für Simulationen, unter SP18/19 aber so etwas habe ich noch nicht erlebt. Handelt es sich um ein selbstgemachten FB? Ist irgendwo {attribute 'hide'} ?
Wir verwenden nicht direkt Codesys sondern Schneider Machine Expert 2.3, welches auf Codesys basiert. Hier wird folgende Version verwendet:
EcoStruxure Machine Expert V2.3EcoStruxure Machine Expert V2.33.5.20.30
Es ist ein eigener Baustein, einen fertigen Baustein mit Interface hatte ich noch nicht probiert. Das kann ich aber machen.
Das Attribut ist nicht gesetzt. Danach hatte ich schon geschaut, aber keine Möglichkeit gefunden etwas zu "ent"-hiden :).

Normalerweise wird ein Interface im Watch unter Angabe der Instanznamens angezeigt. Da es keinen Instanznamen für die dynamische Instanz gibt, kann ich mir vorstellen, dass es damit zusammenhängt.

Danke
 
Hallo,

vielen Dank für eure Antworten.


Einen technischen Grund gibt es wahrscheinlich nicht, aber wir möchten moderne Mittel verstehen und beherrschen können.
Natürlich gibt es Vor- und Nachteile, wie bei jeder anderen Technik auch. Diese sind uns bewusst.

Mittels dynamischer Speicherallokierung wollen wir die Variantenvielfalt in den Griff bekommen und Software schreiben, die viele Anwendungsmöglichkeiten hat. Mittels Factory dynamisch eine Instanz vom richtigen Baustein anlegen, je nach Anforderung der aktuellen Konfiguration.


Wir verwenden nicht direkt Codesys sondern Schneider Machine Expert 2.3, welches auf Codesys basiert. Hier wird folgende Version verwendet:

EcoStruxure Machine Expert V2.3EcoStruxure Machine Expert V2.33.5.20.30
Es ist ein eigener Baustein, einen fertigen Baustein mit Interface hatte ich noch nicht probiert. Das kann ich aber machen.
Das Attribut ist nicht gesetzt. Danach hatte ich schon geschaut, aber keine Möglichkeit gefunden etwas zu "ent"-hiden :).

Normalerweise wird ein Interface im Watch unter Angabe der Instanznamens angezeigt. Da es keinen Instanznamen für die dynamische Instanz gibt, kann ich mir vorstellen, dass es damit zusammenhängt.

Danke
Nur mal so zum probieren. Nutze new und gib mal den Pointer der neuen Instanz in ein Array oder eine einzelne variable und guck dir dann mal das Ergebnis an.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke, du wirst abwägen müssen, in wie weit moderne Methoden der Programmierung in deinem Programm mit Wartbarkeit und Fehlersuche korrelieren.
(Erinnert mich an den eierlegenden Wollmilch-Baustein, nur in der Version 2.0)

Für ein Meldesystem kann ich mir so eine Factory durchaus vorstellen, aber für Aktoren sehe ich das eher kritisch.
Hier würde ich eher auf Vererbung setzen.

Der Vorschlag vom Onkel wäre jetzt auch mein erster Gedanke gewesen.
 
Zuletzt bearbeitet:
Nur mal so zum probieren. Nutze new und gib mal den Pointer der neuen Instanz in ein Array oder eine einzelne variable und guck dir dann mal das Ergebnis an.
Hallo,

danke für deine Antwort.
Der Pointer ist gültig und ich kann damit auch auf die Instanz der Klasse zugreifen. Das geht auf jeden Fall. Hätte mir beim Pointer etwas auffallen sollen ?

Ich denke, du wirst abwägen müssen, in wie weit moderne Methoden der Programmierung in deinem Programm mit Wartbarkeit und Fehlersuche korrelieren.
(Erinnert mich an den eierlegenden Wollmilch-Baustein, nur in der Version 2.0)

Für ein Meldesystem kann ich mir so eine Factory durchaus vorstellen, aber für Aktoren sehe ich das eher kritisch.
Hier würde ich eher auf Vererbung setzen.

Der Vorschlag vom Onkel wäre jetzt auch mein erster Gedanke gewesen.
Ja, das stimmt. Natürlich wird ein sinnvoller Weg gewählt.
Ich will nur nicht, z.Bsp. wegen eines fehlenden Attributes, die komplette Funktionalität des dynamischen Speichers ausklammern müssen.

Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also funktioniert es wie gewünscht? Ich konnte deinen Fehler nicht richtig verstehen/nachvollziehen.
Hallo,

nein, bisher unverändert.
Wenn ich mir das Interface der dynamisch erzeugten Klasse wegspeichere, dann wird immer noch Hidden Instance angezeigt (Siehe Screenshot im initialen Beitrag).
Der Zugriff per Pointer war nie ein Problem, jedoch wollen wir per Interface zugreifen.
 
Erstelle eine Pointer zum Interface und derreferenziere diesen mit manueller Anfoderung, dann kannst du Manuel den Speicher wählen und hast deinen definiertes Watch-Entry.

Das Problem ist das die Runtime und dadurch am Ende auf deine IDE nur debuggen können was am Ende auch tatsächlich im Context des Compiles zur Verfügung stehen (Post-Compiler-context).
 
Zurück
Oben