Übung Projekt Lift
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 72 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.
-
-
Amelie schrieb:
Bild habe ich aus meiner Zettelwirtschaft heraus erstellt.
Womit hast Du diese Diagramme erstellt?Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC
-
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'sDieser 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. -
Dazu kann man ein Klassendiagramm in VS verwenden...
docs.microsoft.com/en-us/visua…-to-projects?view=vs-2022 -
@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
- Friend Event Überladen(sender As Boolean)
- Private Sub ....
- If IstÜberladen() Then
- RaiseEvent Überladen(True)
- Exit Sub
- End If
- ...
- .....
- End Sub
- Friend Event Türenöffnen(sender As Boolean)
- Private Sub PruefeAktlStandort()
- If PBKabine.Top = Standort.Versand Then
- EK0 = True : EK1 = False : EK2 = False
- RaiseEvent Türenöffnen(EK0 = True)
- ElseIf PBKabine.Top = Standort.Lager Then
- EK0 = False : EK1 = True : EK2 = False
- RaiseEvent Türenöffnen(EK1 = True)
- ElseIf PBKabine.Top = Standort.Produktion Then
- EK0 = False : EK1 = False : EK2 = True
- RaiseEvent Türenöffnen(EK2 = True)
- End If
- End Sub
Auf dem Form:
VB.NET-Quellcode
- Private Sub Türnachfahrtöffnen(sender As Boolean) Handles Kabine.Türenöffnen
- If Kabine.EK0 Then
- Timer_Tuerverzögerung.Start()
- ETurButton = DirectCast(Btn_etage0, Button)
- ElseIf Kabine.EK1 Then
- Timer_Tuerverzögerung.Start()
- ETurButton = DirectCast(Btn_etage1, Button)
- ElseIf Kabine.EK2 Then
- Timer_Tuerverzögerung.Start()
- ETurButton = DirectCast(Btn_etage2, Button)
- End If
- 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. -
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.
die Aufzugsteuerung hat viele Fahr-Aufträge. Die Liste der Fahraufträge nenne ichFahrplan
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 einenFahrstatus
Dem 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.
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. -
Ich hau mal eben das Klassen-System hin, also in Form1:
VB.NET-Quellcode
- Public Class FahrAuftrag
- Public EtagenNr As Integer
- Public Wunsch As FahrStatus
- End Class
- Enum FahrStatus : Steht : Rauf : Runter : End Enum
- Private Etagen As New List(Of Integer) From {-500, 0, 500, 1000} 'erstmal 4 Etagen(höhen in cm)
- Private _Aufzug As Aufzug
- Public Class Aufzug
- Public Const Geschwindigkeit As Integer = 100 ' cm/s
- Public Fahrplan As New List(Of FahrAuftrag)
- Public Fahrstatus As FahrStatus
- Public Position As Integer ' cm
- 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
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
- Public Class frmAufzug
- Private _Aufzug As New Aufzug
- Public Sub New()
- InitializeComponent()
- dgvFahrplan.DataSource = _Aufzug.Fahrplan
- cmbWunsch.DataSource = {FahrStatus.Steht, FahrStatus.Rauf, FahrStatus.Runter}
- ' Trackbar zur Darstellung der Aufzug-Positionen einrichten
- Dim etagen = _Aufzug.Etagen
- trkAufzug.Minimum = etagen(0) - 10
- trkAufzug.Maximum = etagen.Last + 10
- trkAufzug.TickFrequency = 500 ' erzeugt alle 500 "cm" eine Trackbar-Markierung
- numEtage.Maximum = etagen.Count - 1
- 'for debug Timer can be disabled, and simulated by Button-Click
- ckAutoRun.DataBindings.Add("Checked", Timer1, "Enabled", False, Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)
- Timer1.Enabled = True
- End Sub
- Private Sub btFahrauftragAbschicken_Click(sender As Object, e As EventArgs) Handles btFahrauftragAbschicken.Click
- Dim auftrag = New FahrAuftrag With {.EtagenNr = CInt(numEtage.Value), .Wunsch = DirectCast(cmbWunsch.SelectedItem, FahrStatus)}
- _Aufzug.AddFahrauftrag(auftrag)
- End Sub
- Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick, btTimeStep.Click
- _Aufzug.CheckPosition()
- trkAufzug.Value = _Aufzug.Position
- End Sub
- End Class 'frmAufzug
VB.NET-Quellcode
- Imports System.ComponentModel
- Public Class Aufzug
- Public Fahrplan As New BindingList(Of FahrAuftrag)
- Public Etagen As New List(Of Integer) From {0, 500, 1000, 1500, 2000, 2500} '(höhen in cm)
- Public Position As Integer = 0 ' cm
- Private Const Geschwindigkeit As Integer = 15 ' Decimeter/s
- Private TuerCountDown As Integer = 0
- Private Fahrstatus As FahrStatus
- Public Sub AddFahrauftrag(auftrag As FahrAuftrag)
- 'Diese Methode sollte die Aufträge in eine optimierte Reihenfolge bringen
- 'zB damit er bei einer Fahrt auch an Zwischenstationen hält
- Fahrplan.Add(auftrag)
- End Sub
- Friend Sub CheckPosition()
- If TuerCountDown > 0 Then TuerCountDown -= 1 : Return
- If Fahrplan.Count = 0 Then Return
- Dim iEtage = Etagen.FindIndex(Function(x) Position.IsInRange(x - 5, x + 5)) ' etagenHöhe +- 5cm
- If Fahrplan(0).EtagenNr = iEtage Then
- ' prüfen, ob hier der aktuelle Auftrag erledigt ist. Wenn ja, diesen entfernen und warten
- Fahrplan.RemoveAt(0) : TuerCountDown = 20 : Return
- End If
- 'entscheiden, ob rauf oder runter
- iEtage = Etagen.BinarySearch(Position) ' Index der nächsthöheren Etage
- If iEtage < 0 Then iEtage = Not iEtage
- Fahrstatus = If(iEtage <= Fahrplan(0).EtagenNr, FahrStatus.Rauf, FahrStatus.Runter)
- Position += Fahrstatus * Geschwindigkeit ' fahren
- End Sub
- End Class ' Aufzug
- Public Class FahrAuftrag
- Public Property EtagenNr As Integer
- Public Property Wunsch As FahrStatus
- End Class
- Public Enum FahrStatus : Runter = -1 : Steht : Rauf : End Enum
Zwei Tricks machen die Lösung besonders einfach:- Der Fahrplan wird in einer
BindingList(Of T)
gehalten, die ans DGV gebunden ist. Dadurch aktualisiert sich diese Anzeige ohne weiteren Code zu erfordern. - 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 inList(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.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()
-
-
Ähnliche Themen
-
FatmaA - - Sonstige Problemstellungen
-
Janni412 - - Sonstige Problemstellungen
-
10 Benutzer haben hier geschrieben
- Amelie (29)
- VaporiZed (12)
- Naifu (8)
- ErfinderDesRades (7)
- Haudruferzappeltnoch (6)
- RodFromGermany (5)
- oobdoo (2)
- Bartosz (2)
- VB1963 (1)
- Kasi (1)