Sinnvolle Datenstruktur anlegen und der richtige Zugriff

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Sinnvolle Datenstruktur anlegen und der richtige Zugriff

    Hi zusammen!

    Hab da mal eine Frag...

    Es geht um einen Aufbau mit mehereren Gruppen wobei jede Gruppe wiederum mehrere Messwerte enthalten.

    Dafür gibts eine List(of PLCTag). Jeder einzelne liest Werte aus einer Steuerung. Dies passiert in einer ForEach-Schleife in einem eigenen Thread. Verändert sich ein Messwert löst dies das ValueChanged-Event aus. Momentan hab ich für jeden Tag eine Textbox angelegt welche den neuen Wert ausgibt.
    Gefällt mir aber nicht... :huh:
    Deshalb hab ich im Designer ein Dataset angelegt. Welche die einzelnen Messstellen als Spalte enthält. Jede Gruppe soll eine Zeile sein und das ganze dann in einem DGV darstellen.

    Wie kann ich nun auf die einzelnen Zellen in der Tabelle richtig zugreifen... Column(i).Value kanns ja wohl nicht sein. Das mach ich bisher, weil ich aus dem Senderobjekt des ValueChanged den Namen auslese und somit weiß welche Zeile/Spalte gemeint is.

    Achja... WinForms,VB, VS2013 Express

    Gruß wolfgang
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!

    wolfi_bayern schrieb:

    Welche die einzelnen Messstellen als Spalte enthält.
    Schonmal Modellfehler.
    Gibt es variabel viele Messstellen, so brauchst du eine Tabelle namens Messstelle (singular benamen!)
    Messung wäre eine annere Tabelle, und wäre den Messstellen untergeordnet, sodass jede Messung per ForeignKey einer MessStelle zugeordnet ist.
    erfinderdesrades.unitweb.de/Pr…ationale%20Grundidee.html
    Bitte rückmelde, ob der Link funktioniert - da scheint der Server Probleme zu machen :(

    wolfi_bayern schrieb:

    Ich brauch also eine Tabelle messung wo alle messpunkt aus der Liste abgelegt werden und zusätzlich mit der ID der Messstelle versehen werden.
    Hä? was für eine Liste? Die Tabelle Messung ist deine Liste!

    wolfi_bayern schrieb:

    In den pcltag hinterleg ich die ID der Messstelle um die werte upzudaten.
    Vergiss pcltag! Was soll ein pcltag sein? Du hast die Tabellen MessStelle und Messung und da weiß man was das ist.
    Und jede MessungRow hat einen ForeignKey auf eine MessStelleRow.
    Es gibt nichts, was noch pcltag heisst, und es gibt auch keine weiteren Listen von irgendwas.

    ErfinderDesRades schrieb:

    Hä? was für eine Liste? Die Tabelle Messung ist deine Liste!
    Ja klar... hab mich falsch ausgedrückt... Das was in die Tabelle soll kommt aus der List(of PLCTag).

    Diese PLCTag brauch ich doch, weil damit die Daten geholt werden.... Die Messwerte müssen gepollt werden und das übernimmt dieses Objekt. Initialisiert wird folgendermaßen (Die Adressen kommen aus einer Datei; hier beispielhaft als array dargestellt):

    VB.NET-Quellcode

    1. Public TagList as new List(of PLCTag)
    2. for each adress as String in adresslist
    3. TagList.Add(new PLCTag(adress))
    4. next


    Im Thread wird dann gepollt:

    VB.NET-Quellcode

    1. do
    2. for each tag as PLCTag in TagList
    3. tag.GetValue()
    4. next
    5. loop until PLCConnected=false


    Hier gibts ein Event

    VB.NET-Quellcode

    1. PLCTag.ValueChanged
    . Wird dieses ausgelöst muss der geänderte Wert in die entsprechende Zelle eingetragen werden. Irgendwie muss ich aber die ID aus der Tabelle der Messstelle noch mit diesem PLCTag welcher den Messwert liefert verbinden. Der PLCTag hat die Property

    VB.NET-Quellcode

    1. Name
    . Ich könnt mir Vorstellen hier die ID als String zu hinterlegen... Obwohl das nicht schön ist wegen dem hin- und herwandeln... :-/
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!
    Nö... Hab ich nicht gecoded... Funktioniert ja im Moment auch per workaround mit Textboxen...

    das is das tool. Braucht man zum verbinden mit Siemen Steuerungen
    github.com/jogibear9988/DotNetSiemensPLCToolBoxLibrary

    wir machen das anders... Ich stell das Projekt mal online Anfang der Woche... Dann wirds wahrscheinlich klarer... Bin ja aus Bayern... Da is es schwierig auf deutsch was zu erklären... Da is es per Programm besser...
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!
    ich bevorzuge, über Sprache zu kommunizieren. Irgendwas hingeklatscht bekommen mit "reims dir iwie zusammen" macht mir keine Freude, und was ich mir zusammenreime weicht vmtl. von dem ab, was du dir zusammenreimst, und Kommunikation scheitert.

    Auch gehst du nicht auf meine Bitte ein:

    ErfinderDesRades schrieb:

    kannst du mal ein Screenshot machen ihrer (PlcTag-Klasse) Ansicht im ObjectBrowser?
    Warum nicht?
    So... ich greif jetz nochmal das Thema auf... auch wenns bisschen gedauert hat.

    Was ich nicht will: Fertigen Code

    War ich wissen will: Wie werden die Daten sinnvoll strukturiert?

    Hier das Projekt mit Screenshots.
    amseegraben20.noip.me/download/Testaufbau.zip

    Mein Workaround:
    Ich polle Daten. Im Moment sinds 96 einzelne entweder Int16 oder Bool. Jedem Wert wird eine Textbox zugeordnet welche den Wert ausgibt. Ändert sich ein Wert wird der Textboxhintergrund für zwei Sekunden rot. Bewege ich die Maus über eines der Textfelder wird ein Tooltip mit den letzten maximal 25 Werten mit Zeitstempel angezeigt.

    So...

    Wie müsste ich nun ein entsprechendes Dataset aussehen um das gleiche zu erreichen? Soll heißen:
    - Anzahl der Zeilen = Anzahl der Testaufbauten
    - Anzahl der Spalen = Anzahl der Messpunkte mit beschreibung
    - Bool-Werte als ButtonColumn um senden won Steuerwerten an die zugeordnete Adresse
    - Zum initialisieren: weitere Tabelle verwenden aus welcher die hinterlegten Adressen und Spaltenbeschriftungen verwendet werden.

    Danke schon mal für Vorschläge

    Gruß
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!
    jo, anners hats glaub nicht soo viel Sinn.

    Aber warum weigerst du dich so fortgesetzt, meiner Bitte aus post#9 + post#11 nachzukommen?

    Gut - nun habe ich die Dll auf meim Compi, und kann selbst reingucken.
    Aber es kommt ja darauf an, dass du lernst, da hineinzugucken.

    Naja - inzwischen fast egal.
    Wie funzt das nu mitte PLCTags? Formulierst du da anfragen, schickst sie ab, und iwelche Geräte schreiben Antworten rein?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Also nochmal neue Version. Einfach Programm starten und kurz warten... werte kommen von allein... sind nur Beispielwerte.

    amseegraben20.noip.me/download/PaneltestwandSteuerung.rar

    Bezgl. Post#9+#11. Ich weiß wie OB funktioniert und dass die Klasse funktioniert und wie die Events und Eigenschaften verwendet werden. Um das gehts ja auch nicht... Schau Dir an wie die Werte in die Textboxen eingetragen werden... Und genauso wie die Werte in die Textboxen eingetragen werden würd ich das gern in ein DATAGRIDVIEW machen... nur fehlts mir eben wie ich das zugehörige Dataset dafür aufbau um das per Databinding richtige hinzubekommen.

    ErfinderDesRades schrieb:

    Wie funzt das nu mitte PLCTags? Formulierst du da anfragen, schickst sie ab, und iwelche Geräte schreiben Antworten rein?

    Beim initialisieren wird eine Adresse als String übergeben und in einem eigenen Thread gepollt. Wertänderungen lösen ein Event aus. Dies soll jetzt durch die zufälligen Nummern symbolisiert werden, da Du ja keine passende Steuerung hast.

    Gruß
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!
    ich studiere grad das werk und frage mich:

    Bei deinem PCLTag-Mock generiert das ValueChanged ja immer String-Values.
    Die Value-Property eines Original-Pcl-Tags ist aber Object.

    Was kommen da für Daten an? Es sieht ja aus, als seien das immer nur Zahlen - kann man sich darauf verlassen?
    Und wenn ja, was für Zahlen: Bytes, Integer, Long?

    Ist wichtig fürs Datenmodell

    Ah - hab jetzt die TagDataType-Enumeration gefunden - das machtes allerdings ziemlich kompliziert, dass PclTags je nachdem unterschiedliche Typen vermelden.

    naja, mit CodeBehind im typisierten Dataset ist auch das glaub noch zu handeln.

    Was ich auch nicht verstehe ist, dass zu von "Pollen" redest, aber in deim Projekt finde ich nix, was pollt.
    Da wird eiglich ganz ordentlich versucht, auf die ValueChanged-Events zu reagieren.

    Bist du dir sicher, dass du pollst, und warum hälst du das für nötig?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Nabend

    Ja... Das pollen is notwendig und wird in der Sub GetCPUData erledigt. Wir bei Dir aber grad nicht ausgeführt weil die Werte simuliert sind. Das Prinzip is aber das gleiche.
    Gepollt muss werden weil die CPU als Server funktioniert und nicht einfach was sendet.

    Die Adressen der Werte die abgeholt werden liegen ja in der Tabelle der Taboage2. Jeweils der Eintrag hinter dem Punkt ist interessant. DBX Heisst es handelt sich um ein Bit an der Adresse Byte.Bit.
    DBW bedeutet es is ein INT16 wert und DBD ist ein INT32 wert ans der jeweils dahinter angegebenen Adresse.

    Diese Adressen werden als String gelesen und in der Methode InitTags an jeweils einen PLCTag übergeben. Der Datentyp wird jetz bissl simple über die Soaltennummer gesetzt in der Funktion SelectType.

    Naja.. Auf jeden Fall beinhaltet ein PLCTag den Wert in der Property Value als einen der oben besagten Typen. Die Property ValueAsString macht den Wert zu einem String bzw. Bietet die Möglichkeit wenn der Datentyp TIME lautet den gelesenen Wert gleich in Millisekunden, Sekunden, Minuten usw... Formatiert.

    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „wolfi_bayern“ ()

    ok, gefunden. Ist gruselig, denn das pollt mit voller Power. Ist das wirklich so, dass ununterbrochen die Werte gepollt werden müssen?
    Sonst könnte man auch mit einem Timer pollen, mw. alle 30 Millisekunden, oder für menschliche Auffassung reichen sogar alle 300 Millisekunden.

    Hier mal mein vorläufiges Datenmodell:

    Param ist deine Original-Parameter-Tabelle - sind alles Strings ich keine Ahnung, was das Zeug zu bedeuten hat.
    CurrentValues enthält auch nur Strings, aber sind nicht deine Parameter drin, sondern wird von den PclTags laufend aktualisiert werden.
    ParamColumn ist eine Tabelle, in der die Columns der Param-Tabelle beschrieben werden: Reihenfolge und Datentyp.
    Value enthält dann jeden einzelnen Messwert.
    Es verknüpft einen Kanal mit einer ParamColumn - mit diesen beiden Angaben könnte man den Value korrekt einsortieren in die CurrentValues-Tabelle.
    Das ungewöhnliche, und schwierige an diesem Modell ist, dass CurrentValues eiglich keine Tabelle im Sinne relationaler Datenmodellierung ist, sondern im Grunde eine Kreuztabelle, die Parameter und Kanäle zusammenmanscht, und die auch garnet zur wirklichen Datenhaltung gedacht ist, sondern nur zur hübschen Visualisierung temporärer Zustände.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()