Projektbeurteilung Ampelsteuerung

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

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

    petaod schrieb:


    ErfinderDesRades schrieb:

    Das verkompliziert aber die Ampeln.
    Aber es vereinfacht die Kreuzung.
    Ja, muss man sich überlegen, ob dieser Gewinn es wert ist.
    Gewinn: Es vereinfacht die SteuerungsLogik der Kreuzung ein bischen. Kompliziert bleibt die Kreuzung dennoch.
    Kosten: Ampel (die zuvor ganz "dumm" war) benötigt nun auch SteuerungsLogik. Kreuzung muss die neue Ampelsteuerung antriggern.

    quasi eine grosse State-Machine die eine kleine ansteuert.
    Aber für OOP ganz dolle: Vielleicht kann man das zum Anlass nehmen, eine State-Machine-Base zu schaffen, die die Gemeinsamkeiten der beiden implementiert (ja, warn Witz ;) )


    Gonger96 schrieb:

    ...StateMachine...
    Joah - vom inhaltlichen her sagte ich das bereits in Post#33

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

    @VaporiZed
    Du schaltest zwar Ampelphasen um. Aber die Ampeln bekommen davon nix mit.

    ???

    @Gonger96
    Hätte mir das ja angesehen aber das macht mein VS 2013. Siehe Bild
    Bilder
    • ampelc#-1.jpg

      854,04 kB, 1.197×851, 70 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Aufgrund Deines zuletzt geposteten Codes bekommt die Variable AktuelleAmpelphase einen neuen Wert. Aber es ist nirgends ersichtlich, dass die Ampel-Instanzen angewiesen werden, diese Phase zu übernehmen oder selbständig ihre eigene Phase zu ändern. Oder hast Du Code (verschwiegen), der die Ampeln zum Phasenwechsel bringt?
    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.
    Dann wieder in kleineren Schritten. Was hast Du bisher an Code und was ist Dein nächstes Vorhaben?
    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.
    Moin moin
    Der komplette Code.
    Vorhaben. evtl die PictureBoxen ( Lichterboxen ) ansteuern?
    List of .... erstellen?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_main
    2. ReadOnly Steuerung As New Kreuzung
    3. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    4. lbl_uhrzeit.Text = DateTime.Now.ToLongTimeString
    5. End Sub
    6. Private Sub btn_anlage_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein_aus.Click
    7. btn_anlage_ein_aus.Text = Steuerung.getTraffiglightOnOfText()
    8. Steuerung.SchalteKreuzungEin()
    9. TextAnzeigeBetriebsmodus()
    10. btn_Störung_ein_aus()
    11. cbx_wechsel_ein_aus()
    12. End Sub
    13. Private Sub btn_stoerung_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_stoerung_ein_aus.Click
    14. Steuerung.SimuliereStörung()
    15. TextAnzeigeBetriebsmodus()
    16. btn_stoerung_ein_aus.Enabled = False
    17. End Sub
    18. Private Sub btn_Störung_ein_aus()
    19. btn_stoerung_ein_aus.Enabled = (Steuerung.AktuellerBetriebsmodus <> Betriebsmodus.Aus)
    20. End Sub
    21. Private Sub cbx_wechsel_ein_aus()
    22. cbx_wechsel_24_nacht.Enabled = (Steuerung.AktuellerBetriebsmodus <> Betriebsmodus.Aus)
    23. End Sub
    24. Private Sub cbx_wechsel_24_nacht_CheckedChanged(sender As Object, e As EventArgs) Handles cbx_wechsel_24_nacht.CheckedChanged
    25. Steuerung.Wechsel24_NachtModus()
    26. cbx_wechsel_24_nacht.Text = Steuerung.getDayNightText
    27. TextAnzeigeBetriebsmodus()
    28. End Sub
    29. Private Sub TextAnzeigeBetriebsmodus()
    30. lbl_bertiebsmodus.Text = Steuerung.getAnlagenmodus()
    31. End Sub
    32. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    33. btn_stoerung_ein_aus.Enabled = False : cbx_wechsel_24_nacht.Enabled = False
    34. TextAnzeigeBetriebsmodus()
    35. TextAmpelphasen()
    36. Steuerung.SchalteAmpelphase()
    37. End Sub
    38. Private Sub TextAmpelphasen()
    39. lbl_aktlAmpelphase.Text = Steuerung.AktuelleAmpelPhase.ToString
    40. lbl_aktl_straßentyp.Text = Steuerung.AktuelleStrasse.ToString
    41. End Sub
    42. Private Sub btn_testampelphasen_Click(sender As Object, e As EventArgs) Handles btn_testampelphasen.Click
    43. TextAmpelphasen()
    44. Steuerung.SchalteAmpelphase()
    45. End Sub
    46. End Class


    VB.NET-Quellcode

    1. #Region "Hauptklasse"
    2. Public Class Kreuzung
    3. Private Wechsel_HSNS As Integer
    4. Friend AktuelleStrasse As Straßentyp = Straßentyp.Hauptstraße
    5. Private Zähler As Integer
    6. Friend AktuelleAmpelPhase As Ampelphase_Auto = Ampelphase_Auto.Rot
    7. Private AmpelphaseCount As Integer = [Enum].GetNames(GetType(Ampelphase_Auto)).Length
    8. 'Dim Ampelphase() As String = [Enum].GetNames(GetType(Ampelphase_Auto))
    9. Private AmpelIndex() As Integer = CType([Enum].GetValues(GetType(Ampelphase_Auto)), Integer())
    10. Private Beschriftung As String
    11. Friend AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
    12. Private ReadOnly Straßen As New List(Of Straße)
    13. Friend Sub ErstelleKreuzung()
    14. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
    15. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
    16. End Sub
    17. Friend Sub SchalteKreuzungEin()
    18. If AktuellerBetriebsmodus = Betriebsmodus.Aus Then
    19. AnlageUmschalten(Betriebsmodus.Normalbetrieb)
    20. Else
    21. AnlageUmschalten(Betriebsmodus.Aus)
    22. End If
    23. End Sub
    24. Friend Sub SimuliereStörung()
    25. If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb OrElse AktuellerBetriebsmodus = Betriebsmodus.Nachtbetrieb Then
    26. AnlageUmschalten(Betriebsmodus.Störung)
    27. End If
    28. End Sub
    29. Friend Sub AnlageUmschalten(ByVal Betrieb As Betriebsmodus)
    30. AktuellerBetriebsmodus = Betrieb
    31. End Sub
    32. Friend Function getAnlagenmodus() As String
    33. Select Case AktuellerBetriebsmodus
    34. Case Betriebsmodus.Aus
    35. Return "Anlage ausgeschaltet"
    36. Case Betriebsmodus.Normalbetrieb
    37. Return "Normalbetrieb"
    38. Case Betriebsmodus.Nachtbetrieb
    39. Return "Nachtbetrieb"
    40. Case Betriebsmodus.Störung
    41. Return "Störung"
    42. End Select
    43. Return String.Empty
    44. End Function
    45. Friend Sub Wechsel24_NachtModus()
    46. If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb Then AnlageUmschalten(Betriebsmodus.Nachtbetrieb) Else AnlageUmschalten(Betriebsmodus.Normalbetrieb)
    47. End Sub
    48. Friend Function getDayNightText() As String
    49. If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb Then Beschriftung = "24-Std Modus" Else Beschriftung = "Nacht Modus"
    50. Return Beschriftung
    51. End Function
    52. Friend Function getTraffiglightOnOfText() As String
    53. If AktuellerBetriebsmodus = Betriebsmodus.Aus Then Beschriftung = "Anlage ausschalten" Else Beschriftung = "Anlage einschalten"
    54. Return Beschriftung
    55. End Function
    56. Friend Sub SchalteAmpelphase()
    57. Zähler = Zähler + 1
    58. If Wechsel_HSNS = 0 Then
    59. AktuelleStrasse = Straßentyp.Hauptstraße
    60. If Zähler = AmpelphaseCount Then Zähler = 0 : Wechsel_HSNS = 1
    61. Else
    62. AktuelleStrasse = Straßentyp.Nebenstraße
    63. If Zähler = AmpelphaseCount Then Zähler = 0 : Wechsel_HSNS = 0
    64. End If
    65. AktuelleAmpelPhase = CType(AmpelIndex(Zähler), Ampelphase_Auto)
    66. End Sub
    67. End Class
    68. #End Region
    69. #Region "Klasse Straße"
    70. Friend Class Straße
    71. Public TatsächlicherStraßentyp As Straßentyp
    72. Private ReadOnly Ampeln As New List(Of Ampel)
    73. Friend Sub New() 'Standardkonstruktor ohne Parameter
    74. Ampeln.Add(New Ampel)
    75. Ampeln.Add(New Ampel)
    76. End Sub
    77. Friend Sub New(SollStraßentyp As Straßentyp) 'zusätzlicher Konstruktor mit einem Parameter
    78. Me.TatsächlicherStraßentyp = SollStraßentyp
    79. Ampeln.Add(New Ampel)
    80. Ampeln.Add(New Ampel)
    81. End Sub
    82. End Class
    83. #End Region
    84. #Region "Klasse Ampel"
    85. Friend Class Ampel
    86. Private AnzahlLampen As Integer
    87. Private Farbe As List(Of Color) = Nothing
    88. Private Sub Signalfarben()
    89. Farbe = New List(Of Color) From {Color.Red, Color.Yellow, Color.Lime}
    90. End Sub
    91. End Class
    92. #End Region
    93. #Region "Enums"
    94. 'Außerhalb aller Classes
    95. Friend Enum Straßentyp
    96. Hauptstraße
    97. Nebenstraße
    98. End Enum
    99. Friend Enum Betriebsmodus
    100. Aus
    101. Normalbetrieb
    102. Nachtbetrieb
    103. Störung
    104. End Enum
    105. Friend Enum Ampelphase_Auto
    106. Rot
    107. RotGelb
    108. Grün
    109. Gelb
    110. End Enum

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Stop. Du bist bereits seit einiger Zeit woanders abgebogen. Da werd ich Dich jetzt abholen.

    VaporiZed schrieb:

    Die Kreuzung sollte den Ampeln nur die Anweisung geben, dass sie in ihre nächste Phase schalten sollen. Die Kreuzung sollte diese Phasen nicht selber festlegen. Wozu auch? Die Reihenfolge ist ja durch das Enum quasi festgelegt.

    petaod schrieb:

    Wie [die Ampeln] vom einen Zustand in den anderen kommen, müssen sie selbst wissen. Wenn sie grün sind und den Stop-Befehl bekommen, müssen sie 3s gelb anzeigen und danach auf rot.
    Dementsprechend ist Deine SchalteAmpelphase genau so, wie es nicht sein sollte, denn sie zählt selber und legt Phasen fest. Aber die Ampel-Instanzen werden nicht geändert. Die aktuellen Phasen der Ampel bleiben wie sie sind. Jede Ampel hat eine aktuelle Phase. Aber die wird durch Deine Sub nicht geändert. Die Ampeln merken von der Umstellung also gar nix.

    In der Sub sollte eigentlich nur stehen:

    VB.NET-Quellcode

    1. Friend Sub SchalteAmpelphase()
    2. AktuellUmzuschaltendeAmpel.SchalteInNächstePhase()
    3. If AktuellUmzuschaltendeAmpel.IstFertig() Then AktuellUmzuschaltendeAmpel = GetNächsteAmpel()
    4. End Sub

    Die Logik dahinter sollte aufgrund des hier gezeigten Codes klar sein: Die Kreuzung weist die Ampel, die gerade dran ist, an, sich selbständig in die nächste Phase zu schalten. Also z.B.: eine rote Ampel soll rotgelb werden, oder eine gelbe Ampel auf rot umschalten. In welcher Phase die aktuell zu schaltende Ampel ist, kann der Kreuzung erstmal egal sein. Danach fragt die Kreuzung in Ampel, ob sie "fertig" ist und wenn sie es ist, kümmert sich die Kreuzung darum, dass beim nächsten Aufruf von SchalteAmpelphase die nächste Ampel ihre Phase ändern, während die bisherige in der Phase bleibt, wo sie ist.

    Damit der Code läuft, musst Du Dich natürlich um die Details kümmern. Dazu musst Du innerhalb der Kreuzung eine Private Variable AktuellUmzuschaltendeAmpel anlegen. Welchen Datentyp hat diese Variable?
    Dann brauchst Du eine Methode namens GetNächsteAmpel. Ist das eine Sub oder eine Function? Wenn es eine Function ist, welchen Datentyp liefert sie zurück?
    Die Ampelklasse braucht 2 Methoden: SchalteInNächstePhase und IstFertig. Sind das beides Subs oder Functions oder eines das und eines das und wenn es Functions gibt, welchen Rückgabedatentyp haben diese?
    Du musst noch keinen Code innerhalb der Methoden schreiben, bitte erstmal nur die Methodenrümpfe, also z.B. Friend Sub … und End Sub, keinen Code dazwischen. Denn wenn der Anfang nicht passt, ergibt der Code in der Methode keinen Sinn.
    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.
    Hey
    Muss mal ein bissel Abstand zu der Ampel bekommen. Werde dann nächste Woche weitermachen, sofern ich eine Idee habe wie ich das umsetze.

    Habe mich nun mal mit etwas anderem Beschäftigt. Poste ich gleich in einem anderen Thema.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: