Reedkontakt soll rennzeit stoppen

  • VB.NET

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von fraju.

    Reedkontakt soll rennzeit stoppen

    Hallo zusammen,



    ich möchte bei meiner carrera-bahn ein rundenzeitprogramm entwickeln. dies funktioniert auch eingeschränkt mit einer freesoftware.

    ich habe aber vor selbst ein Programm für meine bahn zu schreiben. das ist auch alles kein Problem, doch nun mein Problem:

    als schalter soll ein reedkontakt, welches unter der schiene liegt die Zwischenzeit anhalten lassen. ich benutze ein Adapter usb zum 9 pol rs232

    ich hab bereits versucht das gerät zu aktivieren (klappt - läuft unter com8) im vb Programm.

    nun weiss ich aber nicht wie ich (wahrscheinlich im timer Sub) das schalten des reedkontakts auslesen kann.

    ich habe ein reed kontakt auf port 1 , 4 und das andere auf port 6, 4 gelötet (das sollte man beim Freeware Programm so machen - klappt auch)

    vielleicht kann mir jemand helfen
    Kurzer Vergleich:

    Du bestellst eine Pizza.
    Rennst du alle 5 Minuten (Timer Sub) zur Tür und guckst, ob gerade der Pizzaliefertyp da ist? Nein.
    Du sitzt dort und wartest auf das Klingeln.

    Du kannst ebenso auf das PinChanged-Event von msdn.microsoft.com/de-de/libra….io.ports.serialport.aspx hören.

    Viele Grüße,
    Manawyrm

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


    ich habe mit deinem tipp folgende Sub eingebaut:


    Private
    Sub SerialPort1_PinChanged(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    If SerialPort1.DsrHolding = TrueThen
    Beep() 'Funktioniert
    MsgBox("Alarm") 'Funktioniert
     
     
    Me.Label1.Text = "DSR auf 1"'Das geht nicht
    EndIf
    EndSub


    es passiert aber nichts?!
    kann mir jemand helfen??
    Die Msgbox muss afaik geschlossen werden bis der nächste Code ausgeführt wird.
    Moderatorin: "Apropo ritzen.." Shin Chan: "hoho sie hat Po ritze gesagt"
    "saying to buy a mac because your anti-virus expired is like saying you're out of condoms so you're just going to go fuck dudes"
    "Wie auch in anderen Threads kann ich leider nichts bieten außer vielleicht spaß beim Skypen aber mehr leider auch nicht." - Sind kinder pornos nicht verboten?

    svensvenson schrieb:

    Me.Label1.Text = "DSR auf 1"'Das geht nicht
    Da solltest Du schreiben: Threadübergreifender Vorgang ...
    Machst Du

    VB.NET-Quellcode

    1. Me.Invoke(Sub() Me.Label1.Text = "DSR auf 1")
    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!

    et funkt nicht

    vielleicht kommen wir aber vom eigentlichen Problem weg?!

    ich möchte ja das so haben:

    mein reedkontakt auf RS232 port 4,6 bzw4,1 soll bei Aktivierung ein stoppen einer Uhr verursachen (so wie ein klick auf einen button)

    ich kenne mich eigentlich damit gar nicht aus... habe aber geschafft, dass vb 2010 meinen usb rs232 Adapter auf com8 erkennt und öffnet ( open())

    nun weiß ich aber nicht wie ich das schalten des reedkontaktes in mein Programm einbinde?!



    vielleicht kann man helfen??

    svensvenson schrieb:

    et funkt nicht
    Du hast mehrere Teilprobleme. Was genau?
    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!

    Teil probleme

    zu Teilproblemen:

    genau! ich wollte eigentlich nur meinen reedkontakt dazu nutzen auf meiner carrera bahn Rundenzeiten zu stoppen.



    also habe ich ein kleines Programm geschrieben, wo Rundenzeiten erfasst werden und auch Zwischenzeiten. dazu drücke einen Schaltflächen button.

    Nun habe ich vor dieses dem auslösen von meinem reedkontakt zu überlassen.

    dazu habe ich den kontakt auf ein rs232 auf pol 4 und 6 gelötet und den rs232 über ein adapterkabel in den usb annen Laptop.

    ich habe auch das öffnen der Schnittstelle mit serialpor1.open() bei COM8 hinbekommen.

    nun kommt es darauf an im Programm das durchschalten des reedkontaktes einzubauen.

    die hilfen sind (oben) sind bestimmt hilfreich doch mir fehlt bei vb2010 das "händling".

    schön wäre es wenn jemand mich "anschuppsen könnte" - mit Hilfe eines beispielscripts :)
    Hast du es denn schon geschafft, dass die Eventroutine ausgelöst wird?
    Wenn ja, brauchst du ja nur dort denselben Code ausführen wie momentan im Click-Event des manuellen Button steht.

    Wenn nein, dann solltest du dich erst mal darauf konzentrieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Eventroutine

    wie könnte denn so eine Event Routine aussehen?


    PrivateSub SerialPort1_PinChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SerialPort1.PinChanged
    ListBox1.Items.Add(minuten.Text &
    " : " & sekunden.Text & " : " & milli.Text)
    EndSub
    das klappt nicht!




    vielleicht muss ich etwas schreiben, also



    serialPort1.write ("123") und schauen ob eine Verbindung da ist??

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

    Zeig mal den kompletten Code zum Verbinden mit dem Port her. Aber bitte als VB-Quellcode formatiert, das geht im Forum-Internen Editor mit dem "VB"-Button

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

    Hier meine Schaltung





    hier das script:

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Public Class Form1
    3.  
    4. Dim Empfang As String
    5.  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Z.Click
    6. ListBox1.Items.Add(minuten.Text & " : " & sekunden.Text & " : " & milli.Text)
    7. End SubPrivate Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles minuten.Click
    8. End SubPrivate Sub Label4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label4.Click
    9. End SubPrivate Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. Timer1.Start()
    11. End SubPrivate Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    12. minuten.Text = "0"
    13. sekunden.Text = "0"
    14. milli.Text = "0"
    15.  
    16. End SubPrivate Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    17. Timer1.Stop()
    18. End SubPrivate Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    19. ListBox1.Items.Clear()
    20.  
    21. End SubPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    22.  
    23. milli.Text += 1
    24. If milli.Text = "10" Then
    25. milli.Text = "0"
    26. sekunden.Text += 1
    27. End If
    28. If sekunden.Text = "60" Then
    29. sekunden.Text = "0"
    30. minuten.Text += 1
    31. End If
    32.  
    33.  
    34.  
    35.  
    36.  
    37.  
    38.  
    39.  
    40. End SubPrivate Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    41. If SerialPort1.IsOpen = True Then
    42. SerialPort1.Close()
    43. End If
    44. End SubPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    45.  
    46.  
    47.  
    48.  
    49.  
    50.  
    51.  
    52.  
    53.  
    54. End SubPrivate Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    55. Try
    56. SerialPort1.PortName = TextBox1.Text
    57. SerialPort1.BaudRate = TextBox2.Text
    58. SerialPort1.DataBits = 8
    59. SerialPort1.ReadTimeout = -1SerialPort1.StopBits = IO.Ports.StopBits.OneSerialPort1.Parity = IO.Ports.Parity.None
    60. SerialPort1.ReceivedBytesThreshold = 1
    61.  
    62. SerialPort1.Open()
    63. verb.Text = "verbunden"
    64. Catch ex As Exception
    65. verb.Text = "nöp"
    66. End Try
    67. End SubPrivate Sub Label1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles verb.Click
    68. End SubPrivate Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
    69. End SubPrivate Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    70.  
    71.  ListBox1.Items.Add(minuten.Text & " : " & sekunden.Text & " : " & milli.Text)
    72. End Sub
    73.  
    74.  
    75.  
    76. End Class
    Okay... schalte mal "Option Strict On" ein (einfach ganz oben als allererste Zeile schreiben). Alles was Rot wird sind Fehler^^
    Statt zu verbessern würde ich den Code wegwerfen^^ Das was du da mit "minuten, sekunden und milli.Text" machst ist sehr unvorteilhaft - eine TimeSpan kann das um einiges besser. Hier musst du dich allerdings Fragen, was du überhaupt misst - Zeiträume (Timespan) oder Zeitpunkte (DateTime)? Ich würde ja behaupten du misst Zeitpunkte - das ist aber kein Problem: dein Auto fährt beim start über den Sensor (Punkt1) und beim beenden der Runde (Punkt2). Die Differenz zwischen Punkt2 und Punkt1 ergibt die vergangene Zeit (DateTime - DateTime = TimeSpan).

    Du hast in deinem Code eh ein paar üble Schnitzer, z.B. .ReadTimeout ist ein Integer, du weist dank strict off ietwas zu (vermutlich ein Boolean). Kein wunder, dass da nichts funktioniert^^

    Zerlege dein Problem in kleinere Probleme:

    - Verbinden mit dem COM-Port
    - Reagieren auf den Sensor (mach das zum testen mal nur mit einer MSG-Box wenn der Sensor auslöst)
    - Starten der Messung
    - Erfassen von Messpunkten
    - Messungen bzw List(of Messpunkt) ausgeben (=> Tabelle, in Labels, wasauchimmer)

    Carrera bahn zeitmessung mit reedkontakt

    ich bin schon weiter!!!!



    mein form:

    VB.NET-Quellcode

    1. Public Class Form1Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Try
    3. SerialPort1.Open()MsgBox("verbunden")
    4. Catch ex As ExceptionMessageBox.Show(ex.Message)
    5. End Try
    6. End SubPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    7. Label1.Text += 1
    8. End SubPrivate Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    9. Timer1.Stop()
    10. End SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    11. Timer1.Start()
    12. End SubPrivate Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
    13. End Sub
    14. Private Sub SerialPort1_PinChanged(ByVal sender As Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    15. Timer1.Stop()
    16. MsgBox(e.EventType.ToString())End Sub
    17. End Class




    was klappt:

    - Erkennung von RS232 über COM8

    - timer läuft

    - timer stoppt, wenn ich einen reedkontakt auslöse!!

    was klappt nicht:

    1. leider gibt es keinen unterschied ob reedkontakt 1 (über DCD und DTR) oder reedkontakt 2 (DSR und DTR) ausgelöst wird.

    gibt es da eine Möglichkeit der Unterscheidung?? oder ist _PinChanged der falsche ansatz

    2. leider wird beim schalten des Reedkontakts (in Abhängigkeit der dauer) eine große anzahl an stop befehlen gegeben (habe ich mit msbox () herausgefunden) da müsste eine bremse rein oder eine Warteschleife von ca. 3 Sekunden oder so?



    kann mir jemand helfen?
    Wenn du etwas anders deklarierst

    VB.NET-Quellcode

    1. Private Sub SerialPort1_PinChanged(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    bekommst du in den EventArgs in der EventType-Property die Pin-Bezeichnung übergeben.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    "Label1.Text += 1" du programmierst also immernoch Strict Off?
    vincentgri.tipido.net/option-strict-on.html
    Option Strict ON! Gewöhne es dir gleich an, alles andere ist nicht programmiert, sondern gebastelt!
    Option Strict On

    mit Sicherheit hast du so geprüft ob ein Pin gechanged hat:

    VB.NET-Quellcode

    1. If e.EventType = IO.Ports.SerialPinChange.DsrChanged Then
    2. 'mache etwas
    3. End If


    Das ist bei Enums problematisch, da auch mehrere Fälle verknüpft werden können:

    VB.NET-Quellcode

    1. Dim pins As System.IO.Ports.SerialPinChange = IO.Ports.SerialPinChange.CDChanged Or IO.Ports.SerialPinChange.Break

    Hier werden z.B. CDC und BREAK veknüpft. Wenn du auf BREAK alleien prüfst wird false rauskommen. Darum benutze am besten zwei kleine Hilfsmehtoden (hoffe die sind so richtig):

    VB.NET-Quellcode

    1. Private Function ChangeOnDSR(ByVal pins As System.IO.Ports.SerialPinChange) As Boolean
    2. Return (pins And IO.Ports.SerialPinChange.DsrChanged) <> 0
    3. End Function
    4. Private Function ChangeOnDCD(ByVal pins As System.IO.Ports.SerialPinChange) As Boolean
    5. Return (pins And IO.Ports.SerialPinChange.CDChanged) <> 0
    6. End Function


    Okay, jetzt lese ich, dass es immer nur CDChanged bringt, ist vllt auch mal eine Zahl dabei?


    Zur Erklärung (Selbst hergeleitet, funktioniert jedenfalls):

    0001 = 1 = Blau
    0010 = 2 = Rot
    0100 = 4 = Gelb
    1000 = 8 = Grün

    Wenn du nun Rot und Gelb verknüpfst (mit or) entsteht 0110 = 6 = Rot+Gelb. Enums sind Zahlen. Wenn du nun wissen willst ob etwas Rot ist, wird hier einfach 6 mit 2 verglichen, Ergebnis: false. Darum musst du es wieder aufsplitten, das macht man mit einer and-Verknüpfung: 0110 and 0010 = 0010. Hier würde IMMER 0000 rauskommen, wenn das dritte "rot"-Bit nicht gesetzt wäre. Da es aber gesetzt ist, kommt ein wert ungleich 0 raus.