MYSQL Daten, Takt berechnen

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

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    MYSQL Daten, Takt berechnen

    Hi Leute,
    hab mal wieder etwas für mich kniffeliges Thema.
    Ich versuche es so einfach wie möglich zu beschreiben...
    In unserer Produktion werden Daten einer Maschine kontinuirlich in eine MYSQL Datenbank geschrieben (sehr viele Daten in sehr vielen Tabellen).
    Nun gibt es eine Tabelle, die Daten enthält wann ein Paket geklebt wurde (es handelt sich um Membranfilter die zu Taschen geklebt werden = Paket).
    Es wird ein Timestamp geschrieben und noch andere Daten, die hierfür aber unwichtig sind und nicht benötigt werden.
    Nun ist es so, das unser Technical Engineering gerne grafisch sehen möchte, wie die Taktfrequenz der Pakete ist, also in welchen Abständen werden diese geklept?
    Die Daten auslesen und grafisch darstellen, später auch als PDF speichern ist njicht das Problem. Die Anwednung steht soweit schon.
    Problem ist, die Taktfrequenz auszurechnen, denn als Vorgabe hab ich lediglich DatumUhrzeit.
    In Excel würde ich hergehen und (Beispielhaft) A2 von A1 abziehen und erhielte zum Beispiel 00:01:30 als Takt.
    Wie mache ich dies aber in VB??
    Die Daten werden aus MYSQL in ein typ Dataset gelesen. Gespeichert werden muss hier nichts. Und zurück geschrieben auch nicht.
    Die Tabelle im Dataset sieht so aus: wobei lediglich die Spalte DatumUhrzeit aus dem Server kommt.
    Die Spalte Takt sollte berechnet werden.
    Beispielhafte Daten sehen so aus:
    Wie kann ich es jetzt erreichen, das der Takt der aktuellen Zeile durch DatumUhrzeit aktuelle Zeile abzüglich DatumUhrzeit vorherige Zeile errechnet wird?
    Ich komm da echt nicht auf ne Idee...
    Danke Euch
    Gruß
    Micha

    EDIT:
    Ich bin einen kleinen Schritt weiter, ich konnte schon einmal den Takt von der Startzeit zur aktuellen Zeile errechnen.
    Die Startzeit ist immer gleich = der Tag, der ausgelesen wird, 06:00:00 Uhr.
    Dazu gibt es auch eine Endzeit = der Tag, der ausgelesen wird 22:30:00 Uhr.
    Diese beiden benötige ich für die erste und letzte Zeile
    Mein Ansatz sieht jetzt erstmal so aus:

    VB.NET-Quellcode

    1. Public Sub SetCycle()
    2. Dim allRows = From row In Me Select row
    3. For Each row In allRows
    4. Dim cycle As TimeSpan = row.DatumUhrzeit - startDate
    5. row.Takt = cycle
    6. Next
    7. End Sub

    Jetzt fehlt mir irgendwie noch, das immer eine Zeile weiter gesprungen wird

    "Hier könnte Ihre Werbung stehen..."

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

    Habs hinbekommen *freu*

    VB.NET-Quellcode

    1. Public Sub SetCycle()
    2. Dim allRows = From row In Me Select row
    3. For Each row In allRows
    4. Dim cycle As TimeSpan = row.DatumUhrzeit - startDate
    5. row.Takt = cycle
    6. startDate = row.DatumUhrzeit
    7. Next
    8. End Sub


    um die letzte Zeile hin zu bekommen, lege ich einfach nach dem Einlesen die letzte Zeile an und berechne danach....

    VB.NET-Quellcode

    1. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. FillBundle() 'Daten aus MYSQL holen
    3. Dts.Paket.AddPaketRow(New Date(Date.Now.Year, Date.Now.Month, Date.Now.Day - 1, 22, 30, 0), New TimeSpan(0, 0, 0)) 'letzte Zeile anlegen
    4. Dts.Paket.SetCycle() 'Takt berechnen
    5. End Sub
    "Hier könnte Ihre Werbung stehen..."
    Hi,
    doch noch nicht ganz.
    Problem ist ja, das man einen Timespan nicht im Chart darstellen kann.
    Wie müsste ich denn den Timespan konvertieren damit ich es am geeignesten im Chart anzeigen kann?
    "Hier könnte Ihre Werbung stehen..."
    wenn ich dein Problem richtig verstanden habe möchtest du die Taktrate mit der ihr herstellt ermitteln. Bei n Zeitstempeln erhältst du also n-1 Zeitabstände, was du hier Takt bzw. cycle nennst. Ich würde vorschlagen mir mal den ersten Zeitabstand anzusehen, wenn ich das richtig sehe müsste da Murks drin stehen. Im ersten Durchlauf würde ich row.Takt=0 setzen

    zu deinem Konvertierungsproblem: ich würde es in Sekunden oder Minuten mit 1-2 Nachkommastellen konvertieren als Double, je nachdem wie schnell ihr produziert und wie genau der Takt angegeben werden muss... Im Optimum sollt der Verlauf über die Zeit ja eh ne schnurgerade Linie sein, Sägezähne oder eine Mischung daraus
    @KBT: genau exakt verstanden :)
    ich habe ja als erste Zeile noch einen Startwert eingetragen mit Takt = 0
    Hier ein Ausschnitt:

    Die Maschine wird um 06:00 Uhr angefahren, der erste eintrag der Maschine selbst in die Datenbank ist 22.02.2017 07:15
    somit errechnet sich ein Takt von 1:15 was vollkommen korrekt ist.

    Die Berechnung stimmt auch soweit, hab mir nen Export aus der Datenbank in Excel gemacht und verglichen, stimmt überein.
    Das Problem was ich jetzt njoch habe ist, das das Chart keinen TimeSpan akzeptiert. Die Spalte habe ich als TimeSpan deklariert.

    Hab schon versucht die Spalte als DateTime, Double, Decima und String zu deklarieren, aber dann kommt nur murks raus

    EDIT:
    Grade erst gesehen das du noch was drunter geschrieben hast.
    Ähm, ja, der Normale Takt ist 1:29. Manchmal bleibt aber zum Beispiel der Roboter Arm stehen oder benötigt länger um sich zu drehen, dann weicht der Takt ab. Oder es ensteht ein Problem und die Maschine wird gestoppt, dann weicht der Takt auch ab.
    Diese Abweichungen will das TE sehen.
    "Hier könnte Ihre Werbung stehen..."
    würde ich so speichern wie du es getan hast oder in Minuten als Double und im Zweifelsfall umrechnen für die Anzeige. in der DB steht ja trotzdem immer der gleiche wert. In meinen Auswertungen hab ich das bisher so gemacht, dass das Zeitmaß wählbar ist in Minute, Stunde, Kalenderwoche, Quartal und Jahr. In meinem Fall musste ich die Minuten als Summe anzeigen, in deinem würd ich einfach nen Mittelwert für den gewählten Zeitraum anzeigen... Zeitraum sollte natürlich auch wählbar sein

    Chart nimmt auf jeden Fall Double- und Integerwerte

    Soweit ich DateTime verstehe kannst du auch DateTime-DateTime = DateTime rechnen, das is eh alles nur ein Anzeigeformat... unten drunter isses ne Double. Für Timespan gilt vermutlich das selbe
    Hi,

    habs jetzt fast hinbekommen, nur mit dem Intervall für die Datum Spalte bin ich noch nicht zufrieden.

    VB.NET-Quellcode

    1. Public Sub SetCycle()
    2. Dim allRows = From row In Me Select row
    3. For Each row In allRows
    4. row.Takt = New DateTime(row.DatumUhrzeit.Subtract(startDate).Ticks)
    5. startDate = row.DatumUhrzeit
    6. Next
    7. End Sub


    hier ein Bild vom Chart:
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    habs jetzt fast hinbekommen
    Ich würde die ganze Rechnerei in das Dataset verlagern. Da wird's übersichtlicher und, denke auch, einfacher. Da kannst du dir dann mit Umrechnungen und selbstgebastelter Funktionen etc. bzw. auch zeilenabhängiger Veränderungen leichter helfen.

    VB.NET-Quellcode

    1. Partial Class dtsData
    2. Partial Class PaketDataTable
    3. Private oldTime As DateTime
    4. Private Sub PaketDataTable_PaketRowChanged(sender As Object, e As PaketRowChangeEvent) Handles Me.PaketRowChanged
    5. If e.Action = DataRowAction.Add OrElse e.Action = DataRowAction.Change Then
    6. RemoveHandler Me.PaketRowChanged, AddressOf PaketDataTable_PaketRowChanged
    7. RemoveHandler Me.PaketRowChanging, AddressOf PaketDataTable_PaketRowChanging
    8. e.Row.DateTime = DateTime.Now
    9. e.Row.Cycle = (e.Row.DateTime - oldTime).TotalMilliseconds
    10. AddHandler Me.PaketRowChanging, AddressOf PaketDataTable_PaketRowChanging
    11. AddHandler Me.PaketRowChanged, AddressOf PaketDataTable_PaketRowChanged
    12. End If
    13. End Sub
    14. Private Sub PaketDataTable_PaketRowChanging(sender As Object, e As PaketRowChangeEvent) Handles Me.PaketRowChanging
    15. oldTime = CType(Me.DataSet, dtsData).getOldTime()
    16. End Sub
    17. End Class
    18. Private Function getOldTime() As DateTime
    19. Return If(Me.Paket.Count = 0, DateTime.Now, Me.Paket.Max(Function(p) p.DateTime))
    20. End Function
    21. End Class
    siehe auch angehängtes Beispiel...
    Dateien
    • CycleTime00.zip

      (21,46 kB, 90 mal heruntergeladen, zuletzt: )
    Hallo @VB1963
    die Sub SetCycle liegt ja im Dataset :)

    Ich schaue mir deins mal an und melde mich, wenn ich fragen habe.
    Jetzt fahr ich aber erstmal heim und leg mich ins Bett :( Erkältung wie Bolle...
    Danke Euch Beiden
    "Hier könnte Ihre Werbung stehen..."
    Mich irritiert die Bezeichnung "Takt".
    Was du darstellen willst ist doch tatsächlich eine Zeitspanne, würde ich "Duration" nennen.
    Und klar: Erste Wahl als Datentyp wäre natürlich Timespan - wenn das nicht geht, muss man Sekunden nehmen (Double oder Integer) oder Millisekunden (Integer).
    Ticks würde ich nicht nehmen, weil das kann glaub auch Betriebssystem-Abhängig sein, wie lang ein Tick eiglich dauert. Vielleicht aber ist die Tick-Dauer auch fix - trotzdem wird kaum ein User wissen, wie lang ein Tick nu wirklich dauert.

    ErfinderDesRades schrieb:

    Ticks würde ich nicht nehmen, weil das kann glaub auch Betriebssystem-Abhängig sein, wie lang ein Tick eiglich dauert. Vielleicht aber ist die Tick-Dauer auch fix - trotzdem wird kaum ein User wissen, wie lang ein Tick nu wirklich dauert.

    MSDN hat die Antwort:
    Für DateTime ist ein Tick auf 100 Nanosekunden festgelegt.
    Für die Stopwatch Klasse ist es abhängig von Hardware und OS
    Hi,
    Ja, Takt stammt von den Leuts im Technical Engineering. Für die ist es ein Takt.
    Aber tatsächlich ist es eine Zeitspanne, nämlich die Spanne vom letzten Paket zum neuen Paket.
    Ein Paket benötigt in der Regel 1:29 Minuten bis es geklebt ist und die Lichtschranke passiert wo dann der Timestamp in die DB geschrieben wird.
    Manchmal kommt es zu verzögerungen... Mitarbeiter Eingriff, Stau am Roboter (der Roboter nimmt das fertige Paket und legt es auf eine weiter Strasse zur weiteren Bearbeitung), Fehlklebungen, usw. usw.
    Diese Verzögerungen sieht man dann daran, das der Takt (Die Zeitspanne) über 1:29 liegt und genau DAS möchte das Technical Engineering in einem Chart sehen.
    Im Grunde würde also reichen das im Chart nur die Zeitspannen angezeigt werden, die über der Vorgabe liegen (Vorgabe ist 2:00 Min).
    Ich hab im Moment lediglich das Problem mit der Anzeige des Chart, das sieht einfach Mist aus.
    Die Zeitspanne werde auf auf TotalMilliseconds legen und ins DataSet schreiben, im Chart kann ich dann ja die YAxe auf "HH:mm" formatieren, sollte dann ja klappen.
    Die BS müsste ich dann auf Takt > 2:00 Min setzen, dann sollten die "richtigen" Pakete schon mal raus fliegen.

    @VB1963; dein Projekt hab ich mir angeschaut, hat mir insofern geholfen das ich jetzt weis, das man DGV Ereignisse (RowChange usw.) auch auslagern kann... Super Tip :)
    Mein Code (DataSet Klasse), der so super funktioniert sieht im Moment so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Partial Class dsTEBioCel
    2. Public Shared Dts As dsTEBioCel
    3. Private Sub dsTEBioCel_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
    4. If Dts Is Nothing Then Dts = Me
    5. End Sub
    6. Partial Class PaketDataTable
    7. Private startDate As Date = New Date(Date.Now.Year, Date.Now.Month, Date.Now.Day - 1, 6, 0, 0)
    8. Public Function RowExists(ByVal theDate As Date) As Boolean
    9. Return Any(Function(rw) rw.RowState <> DataRowState.Deleted AndAlso rw.DatumUhrzeit = theDate)
    10. End Function
    11. Public Function GetAll() As EnumerableRowCollection(Of PaketRow)
    12. Return From rw In Me Select rw
    13. End Function
    14. Public Sub SetCycle()
    15. Dim allRows = From row In Me Select row
    16. For Each row In allRows
    17. row.Takt = New DateTime(row.DatumUhrzeit.Subtract(startDate).TotalMilliseconds)
    18. startDate = row.DatumUhrzeit
    19. Next
    20. End Sub
    21. End Class
    22. End Class


    Das Chart soll dann als PDF ins Netzwerk gelegt werden, das bekomm ich dann hin.

    Ich hab auch schon überlegt, das DataSet Ergebnis in eine Exceltabelle zu schreiben, dort das Chart erstellen und dann als PDF speichern, aber das muss doch auch alles innerhalb VB.Net klappen oder nicht?

    Hab da etwas Zeitdruck, deswegen werd ich mich wohl morgen nochmal dran setzen müssen das Chart anständig hin zu bekommen.... (Heute muss ich erstmal meine Kuckuckswels Babys ausm Aquarium einsammeln, sonst futtern mir die Malawis die weg :) )
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    (Heute muss ich erstmal meine Kuckuckswels Babys ausm Aquarium einsammeln, sonst futtern mir die Malawis die weg )
    Tipp: Abwarten - das Problem löst sich von selbst ;)
    /OffTopic



    Vorschlag zum Chart: Mach als X-Achse die Zeit, und trag (halb?-)stündlich die Anzahl der geklebten Pakete auf.
    Ist aber bisserl aufwändig, weil das sind ganz annere Daten, die du dann erst ausrechnen musst aus deim Datenbestand.
    Und die Darstellung hat halt immer einen Zeit-Verzug.
    Aber zum Angugge, zu welchen Zeiten die Produktion in die Knie gegangen ist, scheint mir das recht useable.



    Hmm - eiglich finde ich dein Chart-Bildle nicht soo schlecht: Man sieht exakt, wo die Verzögerungen sind - nämlich auf die Lücken muss man gucken. Dass danach ein Riesen-hoher Peek kommt, bringt eiglich nichts.
    Du könntest also ebensogut immer Einsen eintragen, wenn ein Paket fertig.
    Nur die Zeit-Achse ist hässlich - aber da kannste bei Chart - Sample gugge, da hab ich auch eine spezielle Formatierung der X-Achse eingestellt - so ähnlich könnte sich das auch bei dir lösen, vielleicht.

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

    ErfinderDesRades schrieb:

    Tipp: Abwarten - das Problem löst sich von selbst
    /OffTopic

    Neeee, die armen Welsbabys :)
    Bin aber fertig...

    ErfinderDesRades schrieb:

    Dass danach ein Riesen-hoher Peek kommt, bringt eiglich nichts.


    Genau DAS ist es aber, was die Ingenieure sehen wollen. die ganzen Peaks um die 1:30 interessieren die nicht, sondern nur die, die deutlich über 1:30 sind. Denn 1:29 ist die Standardzeit, die ein Paket benötigt bis es geklebt ist.
    Das es winzige Abweichungen geben kann ist normal, aber höhere Abweichungen müssen untersucht werden, daher wollen sie alles genauer anschauen, was deutlich über 1:30 liegt (bzw. als Vorgabe sind es 2:00 Min).
    Also, Anforderung ist (grob):
    Abbildung einer 2-Schicht Fahrt des Teilabschnittes der Anlage (hier Paketkleben).
    Beginn 06:00 Uhr, Ende 22:30 Uhr.
    Zeige alle Takte (für uns Zeitspannen) des Zeitraums in einem Chart
    Speichere das Chart als PDF auf ein Netzlaufwerk

    Die Zeitspannen bekomme ich aus dem MYSQL Server, denn die Anlage selbst erstellt jedesmal, wenn ein Paket geklebt wurde einen Timestamp.
    Die Differenz zwischen 2 Timestamps bezeichnen die Ingenieure als Takt (der Takt der Anlage beim Kleben der Pakete).
    Die Anlage ist so eingestellt, das sie alle 1:29 Minuten 1 Paket klebt.
    Weicht der Wert erheblich ab, muss untersucht werden woran dies liegt.
    Der erste Peak morgens ist immer sehr hoch, denn die Anlage wird um 06:00 Uhr angefahren und benötigt zwischen 20 bis 45 Minuten bis sie das erste Paket klebt.
    Der letzte Peak ist auch hoch, denn die Anlage wird ja auch herunter gefahren.

    Ich weis jetzt nicht genau ob die Ingenieure auch damit zufrieden wären, wenn lediglich alle Zeitspannen größer 2 Minuten angezeigt werden (denke aber mal ja).
    Das würde bei ca. 420 bis 440 Paketen in dem Zeitraum das Chart deutlich übersichtlicher machen.

    Das Chart-Sample kenne ich und habs sogar auf Platte :) ich gucks mir aber noch einmal genauer unter dem Aspekt der Infos oben an.
    Wenn Du Lust hast Dich auszutoben kann ich Dir auch ein Beispiel Dataset hier anhängen...
    Ich komm leider erst morgen wieder dazu irgendwas zu testen...
    Danke Trotzdem an alle, die hier gute Hinweise liefern.
    "Hier könnte Ihre Werbung stehen..."
    also dann finde ich dein Chart garnet schlecht. Die Peeks stechen schön ins Auge, und ausserdem kann man exakt ablesen, bei welcher Tüte ein Problem auftrat. Ist halt bischen eigenwillig, dass die Peeks am Ende der Lücke sind - intuitiv würde man vlt. die Klebe-Dauer als Lücke hinter dem Peek sich wünschen.
    Aber die erfolgreichen Klebungen würde ich nicht rausschmeissen, die braucht man ja, dass die Lücken überhaupt sichtbar werden.

    Also ich als deine Ingeneure - ich könnte mich mit dem Chart, so wie's ist, gut arrangieren. Man musses zu lesen verstehen, aber dazu ist man ja Ingeneur, odr?

    Nur die X-Achsen-Beschriftung - aber das müsste sich deichseln lassen.

    Und Ich glaub Chart hat auch Chart-Cursor, und Maus-Positions-Umrechnung. Also wenn ich nicht irre, kannst du mit der Maus auf einen Peek klicken, und kannst Uhrzeit und Takt des Bösewichtes exakt angezeigt bekommen.

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

    Hi,
    Sorry das ich mich heute erst melde, war leider offline <X
    Ich bin bit dem blöden Chart auf Kriegsfuss. Vielleicht liegt es auch daran, das die Produktion von gestern sehr spät gestartet ist und somit der erste Eintrag der DB nach 7:41 Stunden erfolgte, dadurch ist der erste Peak natürlich sehr hoch.
    Ich häng hier mal das Projekt an. (hab testweise mal die Daten von gestern in eine xml gepackt und mit im ZIP Container.)
    Hab auch mal testweise das Chart auf Balken umgestellt, Y = DatumUhrzeit, X = Takt (Duration), sieht aber auch nicht besser aus...
    Vielleicht hat jemand Lust/Zeit da mal drauf zu gucken...
    Danke Euch
    Dateien
    "Hier könnte Ihre Werbung stehen..."