Stop Button

  • VB.NET

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

    Stop Button

    Hi,

    vorab muss ich sagen, dass Programmierung für mich Neuland ist.

    Ich bin dabei ein kleines Programm zu schreiben, womit ich
    nacheinander einzelne Relais steuern kann und gleichzeitig die
    Messwerte ablese und in eine XML Datei speichere.

    Soweit habe ich das geschafft mithilfe mehrere Anleitungen die ich
    gefunden habe.

    Bis jetzt habe ich das Programm folgendermaßen aufgebaut:

    Com-Anschlüsse deklarieren


    Programm starten wenn ich auf den „Start-Button“ klicke


    Schalten der ersten Relais → Messen U1 → schalten der
    nächsten Relais → Messen U2


    → Schreiben in xml.


    Dies lasse ich nur mehrere male hintereinander laufen für
    verschiedene Geräte

    Wenn alle Geräte durch sind schreibe ich alle Werte noch einmal
    in eine Gemeinsame xml. Datei um alle Messungen auf einem Blick zu
    haben.

    Wenn ich beim letzten Gerät angekommen bist soll es wieder von
    vorne beginnen.

    Soweit habe ich es bis jetzt geschafft.

    Jetzt möchte ich mit einem Button wieder aus der Schleife
    rauskommen. Also wenn ich irgendwann den Button drücke soll die
    do-loop Schleife durchlaufen, die Werte in die Dateien schreiben und
    die Messung bzw. das schalten der Relais beenden.

    Habe schon paar Sachen zu dem Backgroundworker gelesen aber da
    dies für mich Neuland ist komme ich damit gar nicht klar. Wie mache
    ich das am besten.

    Danke im Voraus

    Gruß Hippi
    Willkommen im Forum. :thumbup:

    Hippi schrieb:

    Wie mache ich das am besten.
    Wenn Du pausenlos misst, blockierst Du Deine GUI und Du bekommst Messwerte noch und nöcher.
    Wahrscheinlich hast Du da einen schönen Spagetti-Code verzapft.
    Lass Dir mal das Event-Konzept von Windows durch den Kopf gehen.
    Iwie musst Du ja dem Gerät sagen, dass es einen Messwert schicken soll. Ist das eine RS232, so generiert das entsprechende SerialPort-Objekt ein DataReceived-Event, in dem Du genau diese Daten ausliest und verarbeitest.
    Wenn Du nun in vernünftigen Intervallen messen willst, nimm einen Timer, in dessen Takt Du die Geräte antriggerst.
    Und wenn Du das ganze anhalten willst, stoppst Du einfach den Timer.
    Feddich. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mhm,
    erstmal danke für die Antwort aber ich verstehe das net ganz, warum ich einen Timer nehmen soll.

    Also ich werde mal bei der Anwendung genauer.

    Ich habe 8 gleiche Geräte von denen ich jeweil nacheinander bestimmte Sachen messe. Dies passiert alles über das gleiche Messgerät. Die Relais schalte ich auch über einen SerialPort.
    Also ich schalte die Relais für Gerät 1 zu und messe, dann schalte ich die Relais ab und kurz darauf für Gerät 1 die anderen Ralais um die 2 Messung durchzuführen. Und dies geht dann immer so weiter für die anderen 7 Geräte. Pro durchlaufe(alle Geräte) brauche ich ca 1 Minute(Ralaisschalten abwarten, Messgerät muss sich eingepegelt haben usw... ) Nach dem durchlauf fängt es wieder von oben an. Dies ist auch gewollt. Die Messung muss ich halt irgendwann nach ca 1 - 2h manuell beenden. Deshalb benötige ich den Stop-Button aber die Schleife soll nach drücken bis zum letzten Gerät laufen und dann erst beenden.

    Also bin dahin ist das Programm funktionsfähig :) ICh such jetzt nur noch einen "Ausgang" :)
    Ist dies mit Button nicht einfacher als mit Timer ?

    Gruß Hippi

    Hippi schrieb:

    und kurz darauf
    Definiere dies und beschreibe, wie Du dies programmiert hast.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    SerialPort9.WriteLine(vbCr) 'Rücksetzen der Relais -falls ich den Ausgangszustand nicht kenne-
    System.Threading.Thread.Sleep(1000) 'Schaltpause
    SerialPort9.WriteLine("C1K1C5K1\r") Messung1 1. Gerät
    System.Threading.Thread.Sleep(2000) 'Schaltpause

    SerialPort1.WriteLine("READ?")
    Dim data As String = SerialPort1.ReadLine
    x = Format(Val(data), "00.0000")

    SerialPort9.WriteLine(vbCr) 'Rücksetzen
    System.Threading.Thread.Sleep(1000) 'Schaltpause
    SerialPort9.WriteLine("C3K1C5K1\r") 'Messung2 1. Gerät
    System.Threading.Thread.Sleep(2000) 'Schaltpause

    file1.WriteLine........

    Und das immer so weiter ! und dann ich beim letzten Gerät war springe ich wieder hoch mit Do-Loop

    Und nun soll er wenn ich das mächste nach dem letzten Gerät nicht mehr nach oben spring sondern einfach unten "ausläuft"

    Hippi schrieb:

    VB.NET-Quellcode

    1. System.Threading.Thread.Sleep(1000) 'Schaltpause
    ist ein NoGo in diesem Kontext, Du blockierst Dir Deine GUI damit.
    Nutze einen Timer.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Hippi schrieb:

    Verzögerungen
    nicht, aber für ein Timer-Tick-Event jede Sekunde, und Deine GUI hat alle Zeit der Welt, per Button-Click den Timer zu stoppen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Hippi schrieb:

    umzuschreiben
    Sieh Dir mal dieses Skelett an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Timer1.Enabled = Not Timer1.Enabled
    4. End Sub
    5. Private index As Integer = 0
    6. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    7. Select Case index
    8. Case 0
    9. ' tue Schritt 1
    10. Case 1
    11. ' tue Schritt 2
    12. Case 3
    13. ' tue Schritt 3
    14. ' ...
    15. Case Else
    16. index = -1 ' wieder alles von vorn
    17. End Select
    18. index += 1 ' nächster Index
    19. End Sub
    20. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    21. Select Case index
    22. Case 0
    23. ' tue Schritt 1
    24. Case 1
    25. ' tue Schritt 2
    26. Case 3
    27. ' tue Schritt 3
    28. End Select
    29. End Sub
    30. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ich habe gerade echt keine Ahnung, wie ich das äqivalent umschreiben kann. So habe ich es bis jetzt. Aber wie gesagt mit viel Probieren.
    Wie würde ich das in diesem Fall am besten machen ?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public a, b, c, d, e, f, g, file1
    3. Private readOK As Boolean= False
    4. PrivateSub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    5. SerialPort1.PortName= "COM1"
    6. SerialPort1.BaudRate = Integer.Parse("9600")
    7. SerialPort1.DataBits = Integer.Parse("8")
    8. SerialPort1.Parity = CType([Enum].Parse(GetType(Parity), "None"), Parity)
    9. SerialPort1.StopBits = CType([Enum].Parse(GetType(StopBits), "1"), StopBits)
    10. 'SerialPort1.DtrEnable = CheckBox1.Checked
    11. ' Data Terminal Ready - Signal
    12. SerialPort1.Encoding = System.Text.Encoding.UTF8
    13. ' Codierung für UTF8-Format
    14. SerialPort1.Open()
    15. SerialPort1.WriteLine("*RST;*SRE 0;:INIT:CONT OFF;:SENS:FUNC ""VOLT:DC"";:VOLT:DC:RANG:AUTO ON")
    16. ' Eingabemaske anpassen:
    17. 'enableControls()
    18. End Sub
    19. Private Sub SerialPort9_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort9.DataReceived
    20. EndSub
    21. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    22. readOK = True
    23. Do
    24. SerialPort9.Open()
    25. Dim file1 As New IO.StreamWriter("C:\Dokumente und Einstellungen\Messung\Gerät1.xml", True)
    26. Dim file2 As New IO.StreamWriter("C:\Dokumente und Einstellungen\Messung\Gerät2.xml", True)
    27. Dim file3 As New IO.StreamWriter("C:\Dokumente und Einstellungen\Messung\Gerät3.xml", True)
    28. Dim file4 As New IO.StreamWriter("C:\Dokumente und Einstellungen\Messung\Alle_Geräte.xml", True)
    29. For i = 1 To 1
    30. Application.DoEvents()
    31. SerialPort9.WriteLine(vbCr) 'Rücksetzen
    32. System.Threading.Thread.Sleep(1000) 'Schaltpause
    33. SerialPort9.WriteLine("C1K1C5K1\r") 'Messung1 1. Gerät
    34. System.Threading.Thread.Sleep(2000) 'Schaltpause
    35. Call Messung1()
    36. SerialPort9.WriteLine(vbCr) 'Rücksetzen
    37. System.Threading.Thread.Sleep(1000) 'Schaltpause
    38. SerialPort9.WriteLine("C3K1C5K1\r") 'Messung2 1. Gerät
    39. System.Threading.Thread.Sleep(2000) 'Schaltpause
    40. Call Messung2()
    41. TextBox1.Text = ";Gerät1;"";" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y
    42. a = x
    43. b = y
    44. Next (i)
    45. For i = 1 To 1
    46. Application.DoEvents()
    47. SerialPort9.WriteLine(vbCr) 'Rücksetzen
    48. System.Threading.Thread.Sleep(1000) 'Schaltpause
    49. SerialPort9.WriteLine("C1K2C5K2\r") 'Messung1 2. Gerät
    50. System.Threading.Thread.Sleep(2000) 'Schaltpause
    51. Call Messung1()
    52. SerialPort9.WriteLine(vbCr) 'Rücksetzen
    53. System.Threading.Thread.Sleep(1000) 'Schaltpause
    54. SerialPort9.WriteLine("C3K2C5K2\r") 'Messung2 2. Gerät
    55. System.Threading.Thread.Sleep(2000) 'Schaltpause
    56. Call Messung2()
    57. TextBox1.Text = ";Gerät2;"";" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y
    58. file2.WriteLine(i & ";1;" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y)
    59. c = x
    60. d = y
    61. Next (i)
    62. For i = 1 To 1
    63. Application.DoEvents()
    64. SerialPort9.WriteLine(vbCr) 'Rücksetzen
    65. System.Threading.Thread.Sleep(1000) 'Schaltpause
    66. SerialPort9.WriteLine("C1K3C5K3\r") 'Messung1 3. Gerät
    67. System.Threading.Thread.Sleep(2000) 'Schaltpause
    68. Call Messung1()
    69. SerialPort9.WriteLine(vbCr) 'Rücksetzen
    70. System.Threading.Thread.Sleep(1000) 'Schaltpause
    71. SerialPort9.WriteLine("C3K3C5K3\r") 'Messung2 3. Gerät
    72. System.Threading.Thread.Sleep(2000) 'Schaltpause
    73. Call Messung2()
    74. TextBox1.Text = ";Gerät3;"";" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y
    75. file3.WriteLine(i & ";1;" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y)
    76. f = x
    77. g = y
    78. Next (i)
    79. file4.WriteLine(Now.ToString("dd-MM-yy HH:mm") & ";" & ";" & a & ";" & b & ";" & ";" & c & ";" & d & ";" & ";" & f & ";" & g)
    80. Next (i)
    81. SerialPort9.Close()
    82. file1.Close()
    83. file2.Close()
    84. file3.Close()
    85. file4.Close()
    86. Loop
    87. SerialPort1.Close()
    88. End
    89. End Sub
    90. Sub Messung1()
    91. SerialPort1.WriteLine("READ?")
    92. Dim data As String = SerialPort1.ReadLine
    93. x = Format(Val(data), "00.0000")
    94. End Sub
    95. Sub Messung2()
    96. SerialPort1.WriteLine("READ?")
    97. Dim data As String = SerialPort1.ReadLine
    98. y = Format(Val(data), "00.0000")
    99. End Sub
    100. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Hippi“ ()

    bitte mal anständig Formatieren. Das kann ja keiner Lesen

    Hippi schrieb:

    Dim
    data As
    String
    = SerialPort1.ReadLine

    => Dim data As String= SerialPort1.ReadLine
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Hippi schrieb:

    Dim data As String = SerialPort1.ReadLine

    RodFromGermany schrieb:

    Ist das eine RS232, so generiert das entsprechende SerialPort-Objekt ein DataReceived-Event
    Du solltest nichts umschreiben, sondern alles vergessen und dann das Projekt unter neuen Gesichtspunkten völlig neu aufsetzen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Sieh Dir mal dieses Skelett an:


    Habe ich soweit getan aber wenn ich den Button klicke stoppt der Timer und wenn ich wieder klicke läuft er weiter... Aber wie komme ich aus der Schleife wieder raus

    Also das ich das Programm abschließen kann.

    Habe es genauso wie in dem "Skelett" aufgebaut und nach jedem "Case" meine befehle reingeschrieben.
    Kann ich da noch irgendwie ein Button einfügen das ich in den nächsten Privat Sub gehe.

    Hippi schrieb:

    Aber wie komme ich aus der Schleife wieder raus
    Aus welcher Schleife?
    Poste mal Deinen ganzen (neuen) Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mir geht es darum, dass die files wieder geschlossen werden damit ich sie richtig öffnen kann.

    Und das passiert hier nicht.
    Wenn ich ehrlich bin, weis ich auch net wie das mit index+= 1 funktionieren soll:)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public a, b, c, d, e, f, g
    3. Dim file1 As New IO.StreamWriter("C:\Dokumente und Einstellungen\Messung2\Gerät1.xml", True)
    4. Dim file2 As New IO.StreamWriter("C:\Dokumente und Einstellungen\Messung2\Gerät2.xml", True)
    5. Dim file3 As New IO.StreamWriter("C:\Dokumente und Einstellungen\Messung2\Gerät3.xml", True)
    6. Dim file4 As New IO.StreamWriter("C:\Dokumente und Einstellungen\Messung2\AlleGeräte.xml", True)
    7. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    8. SerialPort1.PortName = "COM1"
    9. SerialPort1.BaudRate = Integer.Parse("9600")
    10. SerialPort1.DataBits = Integer.Parse("8")
    11. SerialPort1.Parity = CType([Enum].Parse(GetType(Parity), "None"), Parity)
    12. SerialPort1.StopBits = CType([Enum].Parse(GetType(StopBits), "1"), StopBits)
    13. 'SerialPort1.DtrEnable = CheckBox1.Checked
    14. 'Data Terminal Ready - Signal
    15. SerialPort1.Encoding = System.Text.Encoding.UTF8
    16. SerialPort1.Open()
    17. SerialPort1.WriteLine("*RST;*SRE 0;:INIT:CONT OFF;:SENS:FUNC ""VOLT:DC"";:VOLT:DC:RANG:AUTO ON")
    18. End Sub
    19. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    20. Timer1.Enabled = Not Timer1.Enabled
    21. End Sub
    22. Private index As Integer = 0
    23. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    24. SerialPort9.Open()
    25. Select Case index
    26. Case 0
    27. SerialPort9.WriteLine(vbCr)
    28. Case 1
    29. SerialPort9.WriteLine("C1K1C5K1\r")
    30. Case 2
    31. Call
    32. Messung1()
    33. SerialPort9.WriteLine(vbCr)
    34. Case 3
    35. SerialPort9.WriteLine("C3K1C5K1\r")
    36. Case 4
    37. Call
    38. Messung2()
    39. file1.WriteLine(";1;" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y)
    40. TextBox1.Text = ";Gerät1;"";" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y
    41. a= x
    42. b= y
    43. SerialPort9.WriteLine(vbCr)
    44. Case 5
    45. SerialPort9.WriteLine("C1K2C5K2\r")
    46. Case 6
    47. Call Messung1()
    48. SerialPort9.WriteLine(vbCr)
    49. Case 7
    50. SerialPort9.WriteLine("C3K2C5K2\r")
    51. Case 8
    52. Call Messung2()
    53. TextBox1.Text= ";Gerät2;"";" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y
    54. file2.WriteLine(";1;" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y)
    55. c = x
    56. d = y
    57. SerialPort9.WriteLine(vbCr)
    58. Case 9
    59. SerialPort9.WriteLine("C1K3C5K3\r")
    60. Case 10
    61. Call Messung1()
    62. SerialPort9.WriteLine(vbCr)
    63. Case 11
    64. SerialPort9.WriteLine("C3K3C5K3\r")
    65. Case 12
    66. Call Messung2()
    67. TextBox1.Text = ";Gerät3;"";" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y
    68. file3.WriteLine(";1;" & Now.ToString("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y)
    69. f = x
    70. g = y
    71. file4.WriteLine(Now.ToString("dd-MM-yy HH:mm") & ";" & ";" & a & ";" & b & ";" & ";" & c & ";" & d & ";" & ";" & f & ";" & g)
    72. SerialPort9.WriteLine(vbCr)
    73. Case Else
    74. index = -1 '
    75. End Select
    76. index += 1
    77. SerialPort9.Close()
    78. End Sub
    79. Sub Messung1()
    80. SerialPort1.WriteLine("READ?")
    81. Dim data As String = SerialPort1.ReadLine
    82. x = Format(Val(data), "00.0000")
    83. End Sub
    84. Sub MEssung2()
    85. SerialPort1.WriteLine("READ?")
    86. Dim data As String = SerialPort1.ReadLine
    87. y = Format(Val(data), "00.0000")
    88. End Sub
    89. Sub
    90. Private Sub Test()
    91. file1.Close()
    92. file2.Close()
    93. file3.Close()
    94. file4.Close()
    95. End
    96. Sub
    97. End
    98. Class

    Hippi schrieb:

    dass die files wieder geschlossen werden
    Der Code ist noch sehr chaotisch.
    Sieh Dir mal diese Konstruktion an, da brauchst Du keinen IO.StreamWriter:

    VB.NET-Quellcode

    1. IO.File.AppendAllText("DEIN_PFAD", "DEIN_INHALT" & Environment.NewLine)

    Und gib Deinem Programm ganz schnell Option Strict On :!:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, danke

    VB.NET-Quellcode

    1. IO.File.AppendAllText("C:\Dokumente und Einstellungen\Messung2\Gerät1.xml", ("dd-MM-yy HH:mm:ss") & ";" & x & ";" & y & Environment.NewLine)


    Aber das Datum wird nicht eingefügt in meiner xml. Datei.

    Hippi schrieb:

    VB.NET-Quellcode

    1. Now.ToString
    vergessen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!