Projektbeurteilung Ampelsteuerung

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

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

    Moin moin

    So habe das mit dem Button und der Ampelphase durchschalten mal gemacht. ;)
    Button Klick und Anzeige passen.
    Spoiler anzeigen

    Im Form

    VB.NET-Quellcode

    1. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. btn_stoerung_ein_aus.Enabled = False : cbx_wechsel_24_nacht.Enabled = False
    3. TextAnzeigeBetriebsmodus()
    4. StartAmpelphasen()
    5. End Sub
    6. Private Sub StartAmpelphasen()
    7. Steuerung.getAmpelphase(Steuerung.Zähler)
    8. lbl_aktlAmpelphase.Text = Steuerung.AktuelleAmpelPhase.ToString
    9. Button1.Text = CStr(Steuerung.Zähler)
    10. End Sub
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. StartAmpelphasen()
    13. Steuerung.Zähler = Steuerung.Zähler + 1
    14. Steuerung.getAmpelphase(Steuerung.Zähler)
    15. End Sub

    In Klasse

    VB.NET-Quellcode

    1. Public Class Kreuzung
    2. Friend Zähler As Integer
    3. Friend AktuelleAmpelPhase As Ampelphase_Auto = Ampelphase_Auto.HsRotGelb_NsRot
    4. Dim AmpelphaseCount As Integer = [Enum].GetNames(GetType(Ampelphase_Auto)).Length
    5. .....
    6. ...
    7. Friend Sub getAmpelphase(ByVal num As Integer)
    8. If num = AmpelphaseCount Then Zähler = -1
    9. Select Case num
    10. Case 0
    11. AktuelleAmpelPhase = Ampelphase_Auto.HsRotGelb_NsRot
    12. Case 1
    13. AktuelleAmpelPhase = Ampelphase_Auto.HsGrün_NsRot
    14. Case 2
    15. AktuelleAmpelPhase = Ampelphase_Auto.HsGelb_NsRot
    16. Case 3
    17. AktuelleAmpelPhase = Ampelphase_Auto.NsRot_HsRot
    18. Case 4
    19. AktuelleAmpelPhase = Ampelphase_Auto.NsRotGelb_HsRot
    20. Case 5
    21. AktuelleAmpelPhase = Ampelphase_Auto.NsGrün_HsRot
    22. Case 6
    23. AktuelleAmpelPhase = Ampelphase_Auto.NsGelb_HsRot
    24. Case 7
    25. AktuelleAmpelPhase = Ampelphase_Auto.HsRot_NsRot
    26. End Select
    27. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    VB.NET-Quellcode

    1. Steuerung.Zähler = Steuerung.Zähler + 1
    Da grapscht die Formklasse aber wieder in die Daten der Kreuzungsklasse rein. Das soll schön die Kreuzungsklasse machen. Mach mal aus Friend Zaehler ein Private Zaehler, dann wird dem ein Riegel vorgeschoben.
    Wenn Du schon advanced mit [Enum].GetNames(GetType(Ampelphase_Auto)).Length hantierst, dann findest Du auch einen Weg, den Zaehler in den Enumwert umzuwandeln, ganz ohne Select Case
    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.
    Habe das nun so geändert. Ist der Weg denn falsch?
    Eins kann ich mir grade nicht erklären.
    Starte das Programm, das Label zeigt die StartAmpelphase richtig an. Jetzt klick auf den Button, passiert nichts, ERST nach dem 2ten klick springt es weiter aber dann auch richtig.

    Spoiler anzeigen

    Das Form

    VB.NET-Quellcode

    1. Private Sub StartAmpelphasen()
    2. lbl_aktlAmpelphase.Text = Steuerung.AktuelleAmpelPhase.ToString
    3. End Sub
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. StartAmpelphasen()
    6. Steuerung.getAmpelphase()
    7. End Sub

    Die Klasse

    VB.NET-Quellcode

    1. Public Class Kreuzung
    2. Private Zähler As Integer
    3. Friend AktuelleAmpelPhase As Ampelphase_Auto = Ampelphase_Auto.HsRotGelb_NsRot
    4. Dim AmpelphaseCount As Integer = [Enum].GetNames(GetType(Ampelphase_Auto)).Length
    5. 'Dim Ampelphase() As String = [Enum].GetNames(GetType(Ampelphase_Auto))
    6. Dim AmpelIndex() As Integer = CType([Enum].GetValues(GetType(Ampelphase_Auto)), Integer())
    7. ......
    8. ...
    9. Friend Sub getAmpelphase()
    10. Zähler = Zähler + 1
    11. If Zähler = AmpelphaseCount Then Zähler = 0
    12. AktuelleAmpelPhase = CType(AmpelIndex(Zähler), Ampelphase_Auto)
    13. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Uiuiui. Da musst Du Dich aber wirklich um die Namensgebung kümmern.
    StartAmpelphasen - da wird doch gar nix gestartet. Da wird was angezeigt.
    getAmpelphase - get solltest Du für Functions verwenden, da diese was zurückgeben. Aber Du nutzt es hier für eine Umschalt-Sub. Sub-Namensregel: beginnend mit einem Verb im Imperativ: ErstelleKreuzung, SchalteKreuzungEin, ErzeugeStörung, …
    Das Problem ist vermutlich (der Code ist ja unvollständig), dass Du eine Anzeige aktualisierst und dann erst die Phase umschaltest. Tausch die beiden Befehle, nachdem Du alles richtig benannt hast. Dann ist es viel besser erkennbar, was in der Button1_Click-Sub passiert. Und Button1_Click - den Button benennst Du am besten auch so um, das man erkennt, was der Button macht. Auch wenn er nicht lange im Projekt existiert.
    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.
    Hier nochmal alles was bis jetzt an Code da ist. Das Problem ist auch gelöst. :)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_main
    2. ReadOnly Steuerung As New Kreuzung
    3. Private Sub btn_anlage_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein_aus.Click
    4. btn_anlage_ein_aus.Text = Steuerung.getBtnBeschriftung()
    5. Steuerung.SchalteKreuzungEin()
    6. TextAnzeigeBetriebsmodus()
    7. btn_Störung_ein_aus()
    8. cbx_wechsel_ein_aus()
    9. End Sub
    10. Private Sub btn_stoerung_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_stoerung_ein_aus.Click
    11. Steuerung.SimuliereStörung()
    12. TextAnzeigeBetriebsmodus()
    13. btn_stoerung_ein_aus.Enabled = False
    14. End Sub
    15. Private Sub btn_Störung_ein_aus()
    16. If Not Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then btn_stoerung_ein_aus.Enabled = True Else btn_stoerung_ein_aus.Enabled = False
    17. End Sub
    18. Private Sub cbx_wechsel_ein_aus()
    19. If Not Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then cbx_wechsel_24_nacht.Enabled = True Else cbx_wechsel_24_nacht.Enabled = False
    20. End Sub
    21. Private Sub cbx_wechsel_24_nacht_CheckedChanged(sender As Object, e As EventArgs) Handles cbx_wechsel_24_nacht.CheckedChanged
    22. Steuerung.Wechsel24_NachtModus()
    23. TextAnzeigeBetriebsmodus()
    24. End Sub
    25. Private Sub TextAnzeigeBetriebsmodus()
    26. lbl_bertiebsmodus.Text = Steuerung.getAnlagenmodus()
    27. cbx_wechsel_24_nacht.Text = Steuerung.getCbxBeschriftung
    28. End Sub
    29. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    30. btn_stoerung_ein_aus.Enabled = False : cbx_wechsel_24_nacht.Enabled = False
    31. TextAnzeigeBetriebsmodus()
    32. TextAmpelphasen()
    33. Steuerung.SchalteAmpelphase()
    34. End Sub
    35. Private Sub TextAmpelphasen()
    36. lbl_aktlAmpelphase.Text = Steuerung.AktuelleAmpelPhase.ToString
    37. End Sub
    38. Private Sub btn_testampelphasen_Click(sender As Object, e As EventArgs) Handles btn_testampelphasen.Click
    39. TextAmpelphasen()
    40. Steuerung.SchalteAmpelphase()
    41. End Sub
    42. End Class

    VB.NET-Quellcode

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

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ok, ich hab das jetzt mal nachgebaut. Folgende Punkte:
    Wenn man die Störung aktiviert, kommt man da nicht mehr raus.
    Die folgenden Codes kommen momentan vereinfacht werden:

    VB.NET-Quellcode

    1. Private Sub btn_Störung_ein_aus()
    2. If Not Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then btn_stoerung_ein_aus.Enabled = True Else btn_stoerung_ein_aus.Enabled = False
    3. End Sub
    4. Private Sub cbx_wechsel_ein_aus()
    5. If Not Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then cbx_wechsel_24_nacht.Enabled = True Else cbx_wechsel_24_nacht.Enabled = False
    6. End Sub

    zu

    VB.NET-Quellcode

    1. Private Sub btn_Störung_ein_aus()
    2. btn_stoerung_ein_aus.Enabled = (Steuerung.AktuellerBetriebsmodus <> Betriebsmodus.Aus) 'Klammern nicht nötig, nur zur besseren Übersicht
    3. End Sub
    4. Private Sub cbx_wechsel_ein_aus()
    5. cbx_wechsel_24_nacht.Enabled = (Steuerung.AktuellerBetriebsmodus <> Betriebsmodus.Aus) 'Klammern nicht nötig, nur zur besseren Übersicht
    6. End Sub


    Dim solltest Du nur innerhalb einer Methode verwenden. Werde außerhalb konkret, indem Du Private, Friend, Public nutzt, damit Du immer weißt, wer darauf Zugriff hat. Je restriktiver das Wort, desto besser.
    Beschriftung brauchst Du gar nicht. Überall, wo Du innerhalb der Methode Beschriftung = stehen hast, kannst Du Return schreiben. Und somit kommt Return Beschriftung auch weg. Bei getAnlagenmodus wird am Ende zwar gemeckert, aber da schreib am Ende der Methode einfach Return String.Empty.

    Bei dem Enum Ampelphase_Auto wechselst Du bei den Namen. Zuerst hast Du Hauptstraße vorn und Nebenstraße hinten, später umgedreht. Das solltest Du einheitlich machen, aber das bleibt Dir überlassen.

    getCbxBeschriftung und getBtnBeschriftung: Die Namen geben einen klaren Hinweis, wo der entsprechende Text im Form später auftaucht. Wenn Du aber später die Anzeigen woanders im Form anzeigen lässt, müsstest Du die Namen dieser Methoden ändern, damit es weiter Sinn ergibt. Die Kreuzungsklasse soll aber effektiv nix vom Form wissen. Benenn die Methoden daher so um, dass klar ist, was sie zurückgeben, nicht wohin die Reise geht.
    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

    Benenn die Methoden daher so um, dass klar ist, was sie zurückgeben, nicht wohin die Reise geht.
    Verstehe ich grad nicht ....

    Beim Enum muss ich den letzten Eintrag so belassen, weil er sonst 2Mal auftritt. Deswegen war ich her gegangen und hatte das Enum so aufgebaut das der Wechsel zuwischen HS und NS ersichtlich war. Im Moment brauche ich den Eintag aber bzgl der "Räumungsphase".

    VB.NET-Quellcode

    1. Friend Enum Ampelphase_Auto
    2. HsRotGelb_NsRot
    3. HsGrün_NsRot
    4. HsGelb_NsRot
    5. HsRot_NsRot '<======Hier...
    6. HsRot_NsRotGelb
    7. HsRot_NsGrün
    8. HsRot_NsGelb
    9. NsRot_HsRot '<==== Hier wäre es doppelt
    10. End Enum


    Den Rest habe ich entsprechend geändert.
    EDIT: Störung
    Ja das habe ich so gemacht das man Erst Ausschalten muss um die Störung zu beseitigen, Quasi ein Reset. :-)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    Benenn die Methoden daher so um, dass klar ist, was sie zurückgeben, nicht wohin die Reise geht - Verstehe ich grad nicht ....
    Nun, Du benennst das getCbxBeschriftung, also "hole die CheckBoxbeschriftung". Eine Kreuzung kennt aber keine CheckBox, daher ist klar, dass eine CheckBox des Forms gemeint ist. Aber das soll die Kreuzung gar nicht interessieren, in der Kreuzung soll also gar nicht relevant sein, für wen die Beschriftung ist. Jegliche Function soll nur so benannt werden, das klar ist, was sie zurückgibt und nicht "für wen". In diesem Fall wäre mein erster Vorschlag:
    getCbxBeschriftung -> getTagesmodusBeschreibung
    getBtnBeschriftung -> getEinAusZustandsbeschreibung
    Naja, zumindest für Dein Projekt. Dieser deutsch-englisch-Mix ist eh nix für mich. Ich nutze nur-englisch-Begriffe im Code.

    Amelie schrieb:

    das habe ich so gemacht das man Erst Ausschalten muss um die Störung zu beseitigen
    Ok, guter Grund. Akzeptiert.

    Das mit dem Enum: Tja da kommt jetzt eben der erste Engpass, weil die Phase zweier Straßen kombiniert werden. Kommt noch eine Straße dazu, wird's richtig übel. Eigentlich reicht nämlich:

    VB.NET-Quellcode

    1. Friend Enum Ampelphase_Auto
    2. Rot
    3. RotGelb
    4. Grün
    5. 'ggf. noch grüngelb, wenn es das noch gibt; in einigen Orten sicherlich noch
    6. Gelb
    7. End Enum

    Um die "Koordinierung" kümmert sich eigentlich nämlich - tja, 1x darfst Du raten: die Kreuzung!
    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.

    VB.NET-Quellcode

    1. Friend Enum Ampelphase_Auto
    2. Rot
    3. RotGelb
    4. Grün
    5. Gelb
    6. End Enum

    OK wenn das soweit runter reduziert wird muss ich mal nachdenken wie das dann zu steuern ist.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Rot
    RotGelb
    Grün
    Gelb

    Mir fehlt noch
    - Alles Aus
    - gelb blinkend (Störung)

    Falls du auch noch Spezialitäten anderer Länder darstellen willst:
    - grün blinkend (Phase vor gelb in z.B. Austria und Estland)
    - GrünGelb (in manchen Ländern anstatt Gelb verwendet)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @ amelie: Falls Du Dir die Zähne an der Kreuzungs-Umschaltungssub ausbeißt, hier zwei
    Tipps
    • 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.
    • Schau Dir mal Dein ursprüngliches Enum aus Post#87 an, da könnte Dir auffallen, dass immer nur eine Ampel ihre Phase wechselt, während die andere bei ihrer Phase bleibt. Es muss also immer nur eine Ampel pro Schritt angewiesen werden, ihre Phase zu wechseln. Die andere bleibt in der, in der sie sich gerade befindet. Das dürfte die "Steuerung" vom Ablauf her sehr einfach machen.
    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.

    VaporiZed schrieb:

    Die Kreuzung sollte den Ampeln nur die Anweisung geben, dass sie in ihre nächste Phase schalten sollen
    Guter Ansatz.
    Ich wollte nicht zuviel Verwirrung in das Geschehen bringen.
    Mein Vorschlag wäre noch weiter gegangen:
    Die Ampeln kennen die Zustandsänderungsbefehle Stop - Go - Off - Blink
    Wie sie 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.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    @petaod
    Ich belasse es mal auf eine einfache Ampel ;)

    -----
    So das durchschalten der Phasen mittels Button klappt nun so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Kreuzung
    2. Private Wechsel_HSNS As Integer
    3. Friend AktuelleStrasse As Straßentyp = Straßentyp.Hauptstraße
    4. Private Zähler As Integer
    5. ....
    6. ...
    7. ..
    8. Friend Sub SchalteAmpelphase()
    9. Zähler = Zähler + 1
    10. If Wechsel_HSNS = 0 Then
    11. AktuelleStrasse = Straßentyp.Hauptstraße
    12. If Zähler = AmpelphaseCount Then Zähler = 0 : Wechsel_HSNS = 1
    13. Else
    14. AktuelleStrasse = Straßentyp.Nebenstraße
    15. If Zähler = AmpelphaseCount Then Zähler = 0 : Wechsel_HSNS = 0
    16. End If
    17. AktuelleAmpelPhase = CType(AmpelIndex(Zähler), Ampelphase_Auto)
    18. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Nur um das mal in den Raum zu werfen, falls es noch nicht gemacht wurde: Bei solchen Automationen bzw. Abläufen implementiert man üblicherweise eine StateMachine. Es ist zwar immer eine StateMachine unabhängig davon wie du es programmierst, aber dazu gibt es ein paar einfache Pattern. Das Ganze hat zum Vorteil, dass du dein Datenmodell unabhängig von der Programmlogik machen kannst und es ist einfach parallelisierbar. Ich könnte ein einfaches Beispiel fertig machen und hochladen, falls Interesse besteht. Allerdings nur in C#.
    @ErfinderDesRades: Die Kreuzung kann einen Reset/Störungsbefehl an die Ampeln schicken und die Ampeln können aufgrund ihrer Art selber entscheiden, welche Phase sie in dieser Situation anzeigen. Das wird dann später bei Vererbung einfacher umsetzbar. Da seh ich nicht die Schwierigkeit.
    @Gonger96: Nur zu. Ich hoffe, das amelie damit klarkommt.
    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.

    ErfinderDesRades schrieb:

    Das verkompliziert aber die Ampeln.
    Aber es vereinfacht die Kreuzung.

    ErfinderDesRades schrieb:

    bei Störung und bei Aus gilt jeweils eine andere Phasen-Abfolge
    Das sind mehrere Status zeitversetzt nacheinander.
    Störung: Erst Stop, dann Störung
    Aus: Erst Stop, dann Störung, dann Aus
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @Gonger96
    Gerne kann mir das ja dann mal ansehen und Fragen was ich nicht verstehe.
    @petaod & @ErfinderDesRades
    Das soll ja nur mal eine sehr einfache Ampel werden. Eine Nicht OOP Version habe ich ja schon. Das hier soll mir etwas das ganze OOP näherbringen.
    @VaporiZed
    Ist denn das mit dem Umschalten der Haupt / Nebenstr so OK?
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Hier mal ein Minimalbeispiel. Ich hab leider keine Ahnung von Ampeln, bei grün fahr ich, bei gelb fahr ich ganz schnell und bei rot halte ich. Das reicht mir ;)
    Die ganze Steuerung ist etwas ausbaufähig, aber das Prinzip sollte klar werden.
    Dateien
    @Amelie: Du schaltest zwar Ampelphasen um. Aber die Ampeln bekommen davon nix mit.
    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.