Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi async Fragen (https://www.delphipraxis.net/53228-async-fragen.html)

xeus 14. Sep 2005 08:28

Re: async Fragen
 
Ich ´bins mal wieder, steh schon wieder vor einem problem:

ist es irgendwie möglich anstatt 1 ner antwort drei zu bekommen?
aber jede dieser antworten muss abgearbeitet werden.

z.b

antwort a:8 byte
antwort b:8 byte
antwort c:8 byte

antwort a wird das 2. byte in die var x hinterlegt
antwort b wird das 8. byte in die var y hinterlegt
antwort c wird das 2,3. byte in die var w,z hinterlegt

ist so was möglich???

gruß

xeus

marabu 14. Sep 2005 09:11

Re: async Fragen
 
Hi,

seltsame Frage...

Nach meinem Verständnis solltest du mehrere Befehle für das Messgerät zur Verfügung haben, deren Sendeformat immer eine feste Anzahl Bytes umfassen. Jeder Befehl erhält Antwort innerhalb einer bestimmten Zeitspanne (time-out). Auch eine Antwort vom Messgerät hat ein festes Format (8 Byte, Struktur kennst du). Eventuell gibt es Befehle, die keine Antwort erhalten oder auch solche, auf die mehrere Antworten eingehen. Auf den letzten Fall scheinst du anzuspielen.

Habe ich bis hierher alles richtig verstanden?

Deine drei Antworten kommen hintereinander weg ohne hand shaking? Weisst du vorher wieviele Antwort-Pakete eingehen werden oder ist die Anzahl eine Überraschung?

marabu

xeus 14. Sep 2005 09:22

Re: async Fragen
 
Also, ich sende eine anfrage:

z.b gib mir die spannung

adr. 2
commando. 50
par.32
par.32
par.32
par.32
par.32
par.32
clcl.3
clch.177

daraufhin bekomme ich z.b

transstat. 0
stat. 6
e3. 0
e2.12
e1. 5
e0. 1
clcl.4
clc.98

aus den bytes e3-e0 berechne ich dan den integer z.b

spannung 200


diese 200 lass ich mir z.b im label1 anzeigen.

nun will ich z.b die alle werte zyklisch nacheinander abfragen, aber sie müssen wegen der weiterverarbeitung natürlich seperat hinterlegt werden, damit ich sie z.b jeden wert in einem anderen label ausgeben kann


ich stell mir das so vor

frage1
frage2
frage3
usw

antwort1 => in x1 hinterlegt
antwort2 => in x2 hinterlegt
antwort3


usw


kannst du mir helfen????

marabu 14. Sep 2005 09:29

Re: async Fragen
 
Sieht doch so aus, als ob du für jede Antwort zuerst eine Frage schicken musst. Was meinst du mit zyklisch? Willst du in festen Zeitabständen die Spannung abfragen? Oder willst du möglichst schnell hintereinander Spannung, Stromstärke und CosPhi (beipielsweise) abfragen?

marabu

xeus 14. Sep 2005 09:36

Re: async Fragen
 
sehr richtig, ich will mehrere fragen nacheinander stellen


die problematik, ich hoffe verständlich, gestellt

es funktioniert schon, wenn ich auf button1click (frage U stell), dass er mir dann die passende antwort sendet und mir den wert in label1 (für U)ausgibt.
doch wenn ich auf button2 click (Frage A stell), soll er mir doch den wert nicht im label1 für u ausgeben sondern z.b im label2 für A

ich hoff du verstehst was ich mein

Sharky 14. Sep 2005 09:43

Re: async Fragen
 
Wir dir denn in der Antwort vom Gerät gesagt was die Antwort beinhaltet? (Ich frage jetzt aber nicht noch einmal nach dem Befehlsprotokoll des Gerätes).

marabu 14. Sep 2005 09:45

Re: async Fragen
 
Jetzt, ja.

Zu deinem ReceiveBuffer1 führe noch eine weitere Variable ein:

Delphi-Quellcode:
type
  TDemoForm = class(TForm)
  ...
  private
    CommandCode: Char;
    ReceiveBuffer1: array of byte;
  end;
Wenn du dein Command mit PutString() sendest, dann speichere es auch gleich noch in CommandCode ab. So kannst du beim Eintreffen der Antwort erkennen, wo du die Werte sichtbar machen willst:

Delphi-Quellcode:
begin
  ...
  case CommandCode of
    'U': LabelU.Caption := IntToStr(Messwert(ReceiveBuffer1));
    'A': LabelA.Caption := ...
  end;
end;
Die Funktion Messwert() habe ich mir eben ausgedacht - nur damit du die nicht irgendwo suchst...

marabu

xeus 14. Sep 2005 10:02

Re: async Fragen
 
das problem ist, in der antwort ist weder die adresse des geräts empfangenen geräts noch die info um welchen wert es sich handelt. kann mann es nicht so machen, dass mann sagt receivebuffer[0] ist begrenzt bis auf [7] alles was nun empfangen wird,wird im receivebuffer2 gespeichert usw.

marabu 14. Sep 2005 10:26

Re: async Fragen
 
Aufgrund deiner Beispielwerte war schon klar, dass da kein overhead zurückgeschickt wird, aber im Gegenzug bedeutet das: Keine Antwort ohne Frage, rein sequentielles Protokoll. Du kannst natürlich für jedes Gerät einen eigenen ReceiveBuffer definieren, aber du kannst auch einfach zusätzlich zu CommandCode noch eine Variable DeviceNumber vom Typ Byte pflegen. Wenn du dann die Daten empfangen hast, dann kannst du CommandCode und DeviceNumber auswerten:

Delphi-Quellcode:
type
  TDemoForm = class(TForm)
  ...
  private
    CommandCode: Char;
    DeviceNumber: Byte;
    RequestPending: boolean;
    ReceiveBuffer: array of byte;
  end;
Wenn du jetzt beim senden noch zusätzlich die Variable RequestPending auf TRUE setzt und im TriggerAvail-Ereignis diese Variable wieder auf FALSE setzt, dann kannst du die Abfragen serialisieren und es gibt keine überschriebenen Daten im Empfangspuffer.

marabu

xeus 14. Sep 2005 11:15

Re: async Fragen
 
also wär es theoauch möglich, das ich für jeden wert eine eigene frage hät und für jeden wert einen entsprechenden buffer, so das ich nacheinander fragen stelle und pro frage einen eigenen antwortbuffer bekomme?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr.
Seite 3 von 5     123 45      

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