Übung Projekt Lift

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

Es gibt 72 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Wohl mit dem tDS-Designer. Also eine Zweckentfremdung. Aber wenn's für nen Screenshot klappt …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Strg+Shift+A (oder Menü Projekt -> Neues Element hinzufügen…) -> DataSet hinzufügen, Rechtsklick Hinzufügen -> DataTable
    und los geht's
    Bilder
    • Bild1.png

      25,32 kB, 946×417, 30 mal angesehen
    • Bild2.png

      11,02 kB, 532×232, 30 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @oobdoo
    Wie @VaporiZed schrieb, habe ich einfach den DSDesigner dafür genommen. War am einfachsten als erst wieder noch eine Software zu suchen. ;)
    ----------------

    Also das mit dem Rais Event habe ich erstmal in groben zügen verstanden.
    Spoiler anzeigen

    In meiner Klasse Kabine:

    VB.NET-Quellcode

    1. Friend Event Überladen(sender As Boolean)
    2. Private Sub ....
    3. If IstÜberladen() Then
    4. RaiseEvent Überladen(True)
    5. Exit Sub
    6. End If
    7. ...
    8. .....
    9. End Sub
    10. Friend Event Türenöffnen(sender As Boolean)
    11. Private Sub PruefeAktlStandort()
    12. If PBKabine.Top = Standort.Versand Then
    13. EK0 = True : EK1 = False : EK2 = False
    14. RaiseEvent Türenöffnen(EK0 = True)
    15. ElseIf PBKabine.Top = Standort.Lager Then
    16. EK0 = False : EK1 = True : EK2 = False
    17. RaiseEvent Türenöffnen(EK1 = True)
    18. ElseIf PBKabine.Top = Standort.Produktion Then
    19. EK0 = False : EK1 = False : EK2 = True
    20. RaiseEvent Türenöffnen(EK2 = True)
    21. End If
    22. End Sub

    Auf dem Form:

    VB.NET-Quellcode

    1. Private Sub Türnachfahrtöffnen(sender As Boolean) Handles Kabine.Türenöffnen
    2. If Kabine.EK0 Then
    3. Timer_Tuerverzögerung.Start()
    4. ETurButton = DirectCast(Btn_etage0, Button)
    5. ElseIf Kabine.EK1 Then
    6. Timer_Tuerverzögerung.Start()
    7. ETurButton = DirectCast(Btn_etage1, Button)
    8. ElseIf Kabine.EK2 Then
    9. Timer_Tuerverzögerung.Start()
    10. ETurButton = DirectCast(Btn_etage2, Button)
    11. End If
    12. End Sub



    Was sich jetzt als sehr schwierig herausstellt, ist die Ablauffolge, wann was passieren muss. Hatte ich mir einfacher vorgestellt als mein Ampelprojekt.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Also das mit dem Rais Event habe ich erstmal in groben zügen verstanden.

    Ne, hast du offensichtlich nicht.
    Ein Event sollte der Signatur (Sender as Object, e as EventArgs) folgen, wobei 'e' auch eine Ableitung (Spezialisierung) von EventArgs sein kann.

    Amelie schrieb:

    Was sich jetzt als sehr schwierig herausstellt, ist die Ablauffolge, wann was passieren muss. Hatte ich mir einfacher vorgestellt als mein Ampelprojekt.

    Das liegt an dem Aufbau deines Codes.
    Was du beim Designe am Anfang liegen lässt musst du dann eben später im Ablauf nachholen.
    Geht aber, nur eben schwieriger.
    Tüftle noch ein bisschen, du bekommst das schon hin. :)
    Sorry - ich kann mir diese konzeptlose Gebrabbel nicht mehr mit angucken.

    Ich erzähl euch mal, wie ein Aufzug funktioniert:

    Vorraussetzung ist, dass es viele Etagen gibt (das Haus selbst wird ja garnet betrachtet).
    Alle Etagen sind gleich - es gibt keinen Grund, hier ein Enum einzuführen.
    Angenommen wird eine Etagenhöhe, die für alle Etagen gilt
    Die Höhen der Etagen aneinandergereiht ergeben den Fahrweg des Fahstuhls.
    Jede Etage hat einen Fahr-Auftrag erteilen.
    Ein FahrAuftrag beinhaltet eine EtagenNummer und einen Fahrstatus.

    VB.NET-Quellcode

    1. Enum FahrStatus : None : Rauf : Runter : End Enum

    die Aufzugsteuerung hat viele Fahr-Aufträge. Die Liste der Fahraufträge nenne ich Fahrplan
    Die Aufzugsteuerung ordnet jeden eingehenden FahrAuftrag so in den Fahrplan ein, dass sich eine sinnvolle Reihenfolge ergibt, und arbeitet sie kontinuirlich ab.
    Eine zweite Möglichkeit, einen Fahrauftrag zu erteilen besteht von innerhalb des Fahrstuhls.
    Auch der Fahrstuhl hat einen FahrstatusDem Fahrstatus ist je eine Geschwindigkeit zugeordnet: Steht: 0 m/s, Rauf: 1 m/s, Runter: -1 m/s
    Der Fahrstuhl hat auch eine Position auf dem Fahrweg.

    Je nach Position und Fahrstatus ordnet er wie gesagt neu eingehende Fahraufträge in seinen Fahrplan ein.

    Ein Timer gibt einen Takt an, in dem der Fahrstuhl seine Position verändert - je nach seiner Geschwindigkeit.
    Liegt seine Position genau auf Höhe einer Etage so wird geprüft, ob deren Fahrstatus dem aktuellen Auftrag im Fahrplan entspricht.
    Wenn ja, hält der Fahrstuhl - ein Türen-Intermezzo - und v.a. wird der Fahrstatus der Etage geändert.
    Ausserdem ein Auftrag aus dem Fahrplan gelöscht werden.
    Weiter gehts.

    In diesem Konzept kommt keinerlei Vererbung vor, und auch kein selbstgebasteltes Rais Event.

    Wesentlich ist ein TimerTick-Event (Der Hinweis kam schon vor 100 Jahren).
    Da ist die Fahrstuhl-Position zu berechnen, und da kann man dann auch eine Picturebox positionieren.
    Und wenn die Position auf einer EtagenHöhe liegt, sind weitere Prüfungen fällig, ob ein Türen-Intermezzo auszuführen ist.



    Jo, ich denk, damit ist erstmalig hier im Thread formuliert, was programmiert werden soll.
    Wenn man nun diszipliniert über dieses Konzept redete - und über nichts anderes - dann gäbe es zumindest eine theoretische Chance, dass das Projekt iwann zu einem Abschluss kommt.
    Ich bin da aber sehr pessimistisch. :thumbdown:

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

    Eine komplett andere Herangehensweise @ErfinderDesRades aber ich werde das mal aufgreifen und versuchen umzusetzen.

    Ich habe mir so ein Lastenaufzug in Real angesehen und versucht nachzubilden was da passieren "könnte".
    Des weiteren ist es ja nicht so, das mein ganzer Versuch nicht funktioniert nur eben bestimmt viel zu "kompliziert" gemacht.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ich hau mal eben das Klassen-System hin, also in Form1:

    VB.NET-Quellcode

    1. Public Class FahrAuftrag
    2. Public EtagenNr As Integer
    3. Public Wunsch As FahrStatus
    4. End Class
    5. Enum FahrStatus : Steht : Rauf : Runter : End Enum
    6. Private Etagen As New List(Of Integer) From {-500, 0, 500, 1000} 'erstmal 4 Etagen(höhen in cm)
    7. Private _Aufzug As Aufzug
    8. Public Class Aufzug
    9. Public Const Geschwindigkeit As Integer = 100 ' cm/s
    10. Public Fahrplan As New List(Of FahrAuftrag)
    11. Public Fahrstatus As FahrStatus
    12. Public Position As Integer ' cm
    13. End Class

    Dazu brauchst du noch Eingabemöglichkeiten, um Fahraufträge zu erteilen.
    Und den Timer.
    Versuch nicht, dass in dein Chaos reinzuintegrieren, das würde es nur verschlimmern.
    Sondern bau hierdrauf auf oder lasses.
    Insbesondere den Überlastungsschutz und andere Sicherheitstechnikj - spar dir das auf für wenn das ding ma endlich fährt.

    Amelie schrieb:

    Des weiteren ist es ja nicht so, das mein ganzer Versuch nicht funktioniert
    Ah - hast du schon ein lauffähiges Sample hochgeladen?
    Wo issn das?


    Hier mal eine Lösung. Als Aufzug-Simulation nehme ich eine Trackbar.
    Zum Debuggen kann ich den Timer anhalten und stattdessen per Button time-steppen.

    Der bahnbrechende Code:

    VB.NET-Quellcode

    1. Public Class frmAufzug
    2. Private _Aufzug As New Aufzug
    3. Public Sub New()
    4. InitializeComponent()
    5. dgvFahrplan.DataSource = _Aufzug.Fahrplan
    6. cmbWunsch.DataSource = {FahrStatus.Steht, FahrStatus.Rauf, FahrStatus.Runter}
    7. ' Trackbar zur Darstellung der Aufzug-Positionen einrichten
    8. Dim etagen = _Aufzug.Etagen
    9. trkAufzug.Minimum = etagen(0) - 10
    10. trkAufzug.Maximum = etagen.Last + 10
    11. trkAufzug.TickFrequency = 500 ' erzeugt alle 500 "cm" eine Trackbar-Markierung
    12. numEtage.Maximum = etagen.Count - 1
    13. 'for debug Timer can be disabled, and simulated by Button-Click
    14. ckAutoRun.DataBindings.Add("Checked", Timer1, "Enabled", False, Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)
    15. Timer1.Enabled = True
    16. End Sub
    17. Private Sub btFahrauftragAbschicken_Click(sender As Object, e As EventArgs) Handles btFahrauftragAbschicken.Click
    18. Dim auftrag = New FahrAuftrag With {.EtagenNr = CInt(numEtage.Value), .Wunsch = DirectCast(cmbWunsch.SelectedItem, FahrStatus)}
    19. _Aufzug.AddFahrauftrag(auftrag)
    20. End Sub
    21. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick, btTimeStep.Click
    22. _Aufzug.CheckPosition()
    23. trkAufzug.Value = _Aufzug.Position
    24. End Sub
    25. End Class 'frmAufzug

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class Aufzug
    3. Public Fahrplan As New BindingList(Of FahrAuftrag)
    4. Public Etagen As New List(Of Integer) From {0, 500, 1000, 1500, 2000, 2500} '(höhen in cm)
    5. Public Position As Integer = 0 ' cm
    6. Private Const Geschwindigkeit As Integer = 15 ' Decimeter/s
    7. Private TuerCountDown As Integer = 0
    8. Private Fahrstatus As FahrStatus
    9. Public Sub AddFahrauftrag(auftrag As FahrAuftrag)
    10. 'Diese Methode sollte die Aufträge in eine optimierte Reihenfolge bringen
    11. 'zB damit er bei einer Fahrt auch an Zwischenstationen hält
    12. Fahrplan.Add(auftrag)
    13. End Sub
    14. Friend Sub CheckPosition()
    15. If TuerCountDown > 0 Then TuerCountDown -= 1 : Return
    16. If Fahrplan.Count = 0 Then Return
    17. Dim iEtage = Etagen.FindIndex(Function(x) Position.IsInRange(x - 5, x + 5)) ' etagenHöhe +- 5cm
    18. If Fahrplan(0).EtagenNr = iEtage Then
    19. ' prüfen, ob hier der aktuelle Auftrag erledigt ist. Wenn ja, diesen entfernen und warten
    20. Fahrplan.RemoveAt(0) : TuerCountDown = 20 : Return
    21. End If
    22. 'entscheiden, ob rauf oder runter
    23. iEtage = Etagen.BinarySearch(Position) ' Index der nächsthöheren Etage
    24. If iEtage < 0 Then iEtage = Not iEtage
    25. Fahrstatus = If(iEtage <= Fahrplan(0).EtagenNr, FahrStatus.Rauf, FahrStatus.Runter)
    26. Position += Fahrstatus * Geschwindigkeit ' fahren
    27. End Sub
    28. End Class ' Aufzug
    29. Public Class FahrAuftrag
    30. Public Property EtagenNr As Integer
    31. Public Property Wunsch As FahrStatus
    32. End Class
    33. Public Enum FahrStatus : Runter = -1 : Steht : Rauf : End Enum

    Zwei Tricks machen die Lösung besonders einfach:
    1. Der Fahrplan wird in einer BindingList(Of T) gehalten, die ans DGV gebunden ist. Dadurch aktualisiert sich diese Anzeige ohne weiteren Code zu erfordern.
    2. Die nächst-höhere Etage wird mittels BinarySearch() ermittelt.
      Damit weiss der Aufzug, zwischen welchen Etagen er ist.
      Binäre Suche kennen nur wenige, und noch weniger wissen, dass diese in List(Of T) implementiert ist, und wie diese Implementation tickt.
      Ich hoffe, du bist imstande, die Doku dazu zu finden (zB im Objectbrowser) und zu verstehen.
    Dateien
    • Aufzug00.zip

      (16,12 kB, 27 mal heruntergeladen, zuletzt: )

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

    So nachdem ich mir die Nacht um die Ohren geschlagen habe gebe ich auf.

    Es klappt nicht mal dieses ​ Public Fahrplan As New List(Of FahrAuftrag) irgendwie mit Daten zu füllen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: