Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Modbus langsam (https://www.delphipraxis.net/169011-modbus-langsam.html)

ConnorMcLeod 23. Jun 2012 12:31

Modbus langsam
 
Hallo Freunde,
ich möchte ein paarmal pro Sekunde einige Werte von einem modbusfähigen Messgerät seriell einlesen. Das funktioniert auch, aber: laut Modbus-Protokoll muss immer eine Pause zwischen den einzelnen Sendungen gemacht werden als Zeichen dafür, dass das Ende der Sendung erreicht ist. Auf diese Art komme ich auf ca. 2-3 Abfragen pro Sekunde und das ist mir zuwenig. Habe ich einen Fehler in meiner Überlegung oder geht das wirklich nicht schneller?
Wie immer: danke für alle Wortspenden!

hathor 23. Jun 2012 15:20

AW: Modbus langsam
 
Laut Protokoll muss die Wartezeit mindestens 3,5 Zeichen lang dauern.
Wie ist das bei Dir realisiert?

ConnorMcLeod 23. Jun 2012 15:43

AW: Modbus langsam
 
Hallo Hathor,
die 3,5 Sek gelten aber nur bei RTU, nicht bei seriell, oder?
Delphi-Quellcode:
        if (lMessage.FTransmissionMode = mbtmRTU) then                         // Pause machen
        begin
          lcSendTicks := GetTickCount + (44000 div ACPD.BaudRateValue) + 1;    // 4 Zeichen, aber mindestens 1/1000 sec
                                                                            // *1000  => Millisekunden
                                                                            // *11  => Länge eines Bytes in Bit (Start + 8 + Parity + Stop)
          while (GetTickCount < lcSendTicks) do
          begin
            Application.ProcessMessages;                                       // auf die Antwort im SeriellThread warten
          end;
        end;
RTU liefert manchmal schlechte Sendungen, das hängt vllt mit dem Messgerät zusammen.
Bei der seriellen Variante bekomme ich bessere Ergebnisse, aber eben nicht sehr flott.

himitsu 23. Jun 2012 15:55

AW: Modbus langsam
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1172139)
die 3,5 Sek gelten aber nur bei RTU, nicht bei seriell, oder?

Er sagte ja auch Zeichen und nicht Sekunden. :wink:

Ich würde es so übersetzen:
Wenn man 300 Zeichen die Sekunde übertragen kann (quasi 300 BAUD aka Zeichen pro Sekunde),
dann muß die Pause mindesten
Delphi-Quellcode:
1 Sekunde / 300 Zeichen|Sekunde * 3.5 Zeichen
lang sein, also 0,011666667 Sekunden oder 11.7 Millisekunden.

Ich sollte schneller antworten und mich nicht auf die faule RedBox verlassen.


Delphi-Quellcode:
while (GetTickCount < lcSendTicks) do
          begin
            Application.ProcessMessages; // auf die Antwort im SeriellThread warten
          end;
Tipp: DelayDelay

ConnorMcLeod 23. Jun 2012 16:01

AW: Modbus langsam
 
... und ich meinte Zeichen, nicht Sekunden. Passt schon. Ich rechne es ja auch so um, aber wir bewegen uns vom Thema weg.

Mein Fehler.

Ich glaube, heute lass ich es lieber ... wenn ich sagte seriell, meinte ich *ASCII*

Es gibt zwei Varianten: ASCII und RTU. Bei ASCII habe ich das Geschwindigkeitsproblem. Sorry nochmal, ich geh jetzt mal an die frische Luft und hole tief ebendiese.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz