Datenmodell Datenflussdiagramm



  • Hallo da!
    Ich frickele nun schon seit geraumer Zeit an einem Programm zur Datenerfassung rum, welches ein vom Benutzer zusammengeclicktes Datenflussdiagramm "ausführt". Das ganze funktioniert während des Zusammenclickens nach dem MVC-Muster (Die Strukturen klar zu halten, die Klassen klein und das ganze synchron im Modell und im View zu halten ist schon nicht schön).
    Das Datenmodell ist ersteinmal ein Graph mit Knoten und Signalen. Jeder Knoten hat eine Menge von Ein- und Ausgängen, welche wiederum einen Mechanismus bieten, Datenaustauschprotokolle dynamisch anzubieten. Diese Protokolle werden zur Auführungsphase miteinander verbunden, um den Datenfluss entlang der Knoten durchzuführen.
    Die Datenmodell-Knoten sind aktiv, will meinen, während der Datenerfassungsphase übernehmen sie auch die Datenverarbeitung oder -erzeugung.

    Soviel zur Situation. Nun kann man im Graph auch Multiplexer- und Demultiplexer und andere Dinge wie Compound-Knoten (welche ihrerseits einen Graphen repräsentieren) "hinclicken", welche eigentlich nur "virtuelle" Signale, Eingänge und Ausgänge in Spiel bringen. Diese Knoten sollen während des Ausführung eigentlich nichts machen und der Signalfluss soll auch nicht den Umweg über sie machen. Es ist nun schon ein mittlerer Akt herauszufinden, welchem Eingang eines "realen" Knotens der Eingang eines virtuellen Knotens wie zum Beispiel eines Busmultiplexers entspricht. Es gibt nun allerdings auch Knoten, welche während der Ausführung Einfluss auf den Graphen nehmen können und Datenkanäle temporär kappen müssen. Für die wird es nun kompliziert, herauszufinden welche Knoten mit welchen verbunden sind etc.. Entweder meine Datenstrukturen sind einfach schlecht ausgelegt dafür, oder aber das Problem ist wirklich komplizierter, als ich es mir damals vorgestellt habe.

    Also habe ich mir überlegt, dass ich den Graphen, bevor ich ihn "ausführe", auf eine Normalform ohne virtuelle Knoten bringen könnte. Das klappt auch wunderbar, nur habe ich das Problem, dass der angeschlossene View der ganze Sache ja folgen muss, ansonsten wären da auf einmal zwei asynchrone Datenstrukturen und Probleme sind vorprogrammiert. Nur will der Benutzer natürlich lieber den übersichtlichen Graphen in seiner Ausgangsform sehen. Also habe ich mir überlegt, dass zur Ausführung eine "Schattenkopie" des Graphen ohne angeschlossenen View angelegt wird, der dann transformiert und ausgeführt wird. Da dort die Id's und Namen der Knoten und Signale dieselben sind wie im Ursprungsgraphen, könnte der View des letzteren während der Ausführung immer noch an die aktiven Elemente kommen (um sich Werte zu holen und darzustellen oder ähnliches). Als Bonus wäre die Software somit auch darauf vorbereitet, wenn ich mal davon abkomme dass die Knoten direkt aktiv sind, sondern wenn aus dem Konfigurationsgraphen etwas komplett anderes zur Ausführung generiert wird.

    Eine Alternative, ich halte im Graphen selber noch eine zweite Struktur von Signalen vor, welche aus den normalen Signalen generiert wird und sozusagen die virtuellen Teile "überspringt". Mit diesen "bereinigten" Signalen könnten dann wiederum die Knoten recht komfortabel arbeiten. Nur befürchte ich, dass dann die Datenstruktur immer fetter wird, wenn ich da noch irgendwelche Funktionalität einbauen muss und schon so damit anfange.

    Da jeder Fehlschritt im Moment mindestens mal einen wenn nicht mehr Tage an Arbeit bedeutet, wollte ich mir hier einmal Rat einholen, bevor ich jetzt mit mulmigem Gefühl mit der Schattenkopie-Sache loslege.

    Viele Grüße und danke schonmal an alle, die sich das wenigstens durchlesen ;P



  • Könntest Du mal einen Screenshot von einem solchen Graphen zeigen? Ein Beispiel mit weiteren Erklärungen, das aufzeigt wo die Komplexität entsteht.



  • Ist das sowas wie Simulink? Es hört sich danach an, aber das Wort Datenerfassung wundert mich dabei ein bisschen. Deine Signale sind wohl beliebige komplexe Datentypen statt nur numerisch?

    Decimad schrieb:

    Also habe ich mir überlegt, dass ich den Graphen, bevor ich ihn "ausführe", auf eine Normalform ohne virtuelle Knoten bringen könnte. Das klappt auch wunderbar, nur habe ich das Problem, dass der angeschlossene View der ganze Sache ja folgen muss, ansonsten wären da auf einmal zwei asynchrone Datenstrukturen und Probleme sind vorprogrammiert. Nur will der Benutzer natürlich lieber den übersichtlichen Graphen in seiner Ausgangsform sehen. Also habe ich mir überlegt, dass zur Ausführung eine "Schattenkopie" des Graphen ohne angeschlossenen View angelegt wird, der dann transformiert und ausgeführt wird. Da dort die Id's und Namen der Knoten und Signale dieselben sind wie im Ursprungsgraphen, könnte der View des letzteren während der Ausführung immer noch an die aktiven Elemente kommen (um sich Werte zu holen und darzustellen oder ähnliches). Als Bonus wäre die Software somit auch darauf vorbereitet, wenn ich mal davon abkomme dass die Knoten direkt aktiv sind, sondern wenn aus dem Konfigurationsgraphen etwas komplett anderes zur Ausführung generiert wird.

    Die Lösung gefällt mir am besten. Wenn ich das richtig verstehe, baust du diesen "Schattengraph" beim Start der Ausführung und wirfst ihn am Ende wieder weg. Kein Stress.

    Eine Alternative, ich halte im Graphen selber noch eine zweite Struktur von Signalen vor, welche aus den normalen Signalen generiert wird und sozusagen die virtuellen Teile "überspringt". Mit diesen "bereinigten" Signalen könnten dann wiederum die Knoten recht komfortabel arbeiten. Nur befürchte ich, dass dann die Datenstruktur immer fetter wird, wenn ich da noch irgendwelche Funktionalität einbauen muss und schon so damit anfange.

    Ist das nicht dasselbe wie oben, nur dass du den "Schattengraph" die ganze Zeit mitführst?



  • An Chesterfield:
    Ich tue mich schwer damit, im Moment oder überhaupt einen Screenshot der der Problematik entspricht anzufertigen. So viel tut sich auf dem Bildschirm auch noch nicht, weil ich halt noch am Basiscode rumwerkele. Ich hatte das ja so auch nicht vorausgesehen, obwohl ich schon ein klares Bild davon hatte, wie das hinterher für den Benutzer ausschauen sollte. Ich freue mich dann in den kommenden Wochen auf die Phase, die ich mir im Kopf liebevoll unter "Knoten knüppeln" zurechtlege.

    Bashar schrieb:

    Ist das sowas wie Simulink? Es hört sich danach an, aber das Wort Datenerfassung wundert mich dabei ein bisschen. Deine Signale sind wohl beliebige komplexe Datentypen statt nur numerisch?

    Also vom zusammenclicken her würde ich sagen, soweit ich das sehe, es ist der gleiche Grundgedanke. Ja, meine Signale sind "heterogen". Die einen sind "Push"-Signale von Werten mit Einheiten und Namen, die anderen "Pull"-Signale von Datenkurven usw.. Vom System wird nur darauf geachtet, dass die Signale kompatibel zu den Eingängen sind, mit denen sie vom Benutzer verbunden werden. Es gibt dann halt AD-Wandler-Quellknoten zB. und man verklickt die mit algebraischen Knoten, ordnet die Signale einander auf bestimmte Art und Weise zu und schickt sie in Abspeicherungsknoten oder auf den Bildschirm. Alles halt durch Zusammenclicken auf dem Bildschirm. Ich löse aber keine Differentialgleichungen und Kreise sind im Graphen für's Erste verboten, weil ich die Terminierung nicht garantieren kann. Vielleicht überlege ich mir da noch was, um das bei Auftreteten irgendwie zu behandeln.

    Bashar schrieb:

    Die Lösung gefällt mir am besten. Wenn ich das richtig verstehe, baust du diesen "Schattengraph" beim Start der Ausführung und wirfst ihn am Ende wieder weg. Kein Stress.

    Genau, so habe ich mir das zunächst einmal gedacht! Es freut mich, dass es zumindest nicht ganz falsch gewesen sein kann, was ich mir so überlegt habe. Vielleicht habe ich natürlich mein Problem einfach nur unzulänglich erläutert 😉

    Bashar schrieb:

    Decimad schrieb:

    Eine Alternative, ich halte im Graphen selber noch eine zweite Struktur von Signalen vor, welche aus den normalen Signalen generiert wird und sozusagen die virtuellen Teile "überspringt". Mit diesen "bereinigten" Signalen könnten dann wiederum die Knoten recht komfortabel arbeiten. Nur befürchte ich, dass dann die Datenstruktur immer fetter wird, wenn ich da noch irgendwelche Funktionalität einbauen muss und schon so damit anfange.

    Ist das nicht dasselbe wie oben, nur dass du den "Schattengraph" die ganze Zeit mitführst?

    Da hast du natürlich Recht, da fehlte mir der ruhige Blick mit Abstand, hehe, so doof das jetzt klingt.

    Viele Grüße!



  • http://img846.imageshack.us/img846/7329/screenshotmpg.png
    Aber nun gut, ihr helft mir, daher oute ich mich mit nem Screenshot von dem, was ich mir während meiner Überlegungen heute angeschaut habe 🙂
    Keep the flames coming 😉


Anmelden zum Antworten