Brauche Unterstützung bei Modbus

  • VB.NET

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    hal2000 schrieb:

    VB.NET-Quellcode

    1. Private Sub DoWork()
    2. While True
    3. If q.Count > 0 Then
    4. 't = Dequeue, Ausführen (z.B. If t.Command = Read, dann t.ReceiveBuffer = ReadRegister(t.RegisterNumber)), t.Callback()
    5. Else
    6. For Each t In pollingTransactions
    7. 't ausführen, Callback
    8. Next
    9. End If
    10. End While
    11. End Sub


    Du führst hier alle "pollingTransactions" am Stück aus, vielleicht sind es 50 Stück. Dann kann der Worker zwischendurch keine normale Transactions durchführen, weil er nicht aus der For Each rauskommt. Vielleicht kam aber währenddessen eine neue Transaction rein. Ich wollte einfach einen Index einführen, den ich durchlaufe (im Kreis), jeden While-Schleifendurchlauf eine Pollingtransaction.

    VB.NET-Quellcode

    1. While start
    2. SyncLock oLock
    3. If Queue.Count > 0 Then
    4. tr = Queue.Dequeue()
    5. Else
    6. tr = Pollingqueue(index)
    7. If index < Pollingqueue.Count - 1 Then
    8. index += 1
    9. Else
    10. index = 0
    11. End If
    12. End If
    13. End SyncLock
    Kannst du machen - der Kreativität sind da keine Grenzen gesetzt. Mit dem Index brauchst du keine Queue für die Polling-Transaktionen (den Overhead für En-/Dequeue kannst du dir sparen) - die Liste reicht. Teste einfach in jedem Durchlauf, ob was in der Queue ist. Wenn nicht, dann nächste Polling-Transaktion, Index += 1, Queue-Test, ...usw.

    Edit: Oh, das ist ja fast dasselbe wie dein Code. Nächstes Mal sollte ich erst alles lesen :whistling:

    Meine Idee dazu:

    VB.NET-Quellcode

    1. Private pollIndex As Int32
    2. 'q = Queue
    3. 'p = Polling-Liste
    4. Sub DoWork()
    5. Dim t As Transaction
    6. While True
    7. SyncLock oLock
    8. If q.Count > 0 Then
    9. t = q.Dequeue
    10. ElseIf p.Count > 0 Then
    11. t = p(pollIndex)
    12. pollIndex += 1
    13. pollIndex = pollIndex Mod p.Count
    14. Else
    15. 'wait, nichts zutun.
    16. End If
    17. End SyncLock
    18. 't verarbeiten (Achtung: t könnte veraltet sein, wenn nichts zutun ist)
    19. End While
    20. End Sub
    Gruß
    hal2000