Delphi-PRAXiS
Seite 1 von 2  1 2      

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 12. Sep 2005 17:16


async Fragen
 
Hallo zusammen,
mit hilfe von profis aus diesem board, habe ich es schon geschaft
binäre daten über den comport zusenden.

apdcomport1.putstring(#10);

nun ist nur noch das problem, dass ich auch daten empfangen muss

nun hab ich allerdings keinen plan wie ich das anstellen kann.
am schönsten wärs, wenn ich eine funktion oder prozedur hätte, der immer 1 byte von den insgesammt acht in eine variable speichert, also dass ich am schluss insgesammt acht variablen hab z.b. byte1 - byte8.

wär super wenn mir bei meinem problem jemand helfen könnte

xeus

Borti 12. Sep 2005 17:35

Re: async Fragen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich will ja nicht die profis unterlaufen, aber ich hätt da auch eine funktionierende Methode für Senden und Empfangen vom Com-Port anzubieten:
Man lade sich diese DLL runter http://www.geekhideout.com/iodll.shtml und verfahre nach dem angehängten PDF-Dokument.
ich hab mir so schon selbst ein kleines terminal für die RS232 geschrieben. Das einzige problem ist, dass ich bisher auf keine Interrupts der Schnittstelle hören kann.
Gruß,
Borti

alzaimar 12. Sep 2005 17:48

Re: async Fragen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Oder, ganz ohne DLL, dafür uralt, mit Komponente und echt simpel:
Die war noch Freeware: Ich hatte nie Probleme damit, obwohl die Implementierung eines Protokolls nicht so einfach ist, da die Komponente komplett eventgesteuert ist. Aber einen Versuch ists wert...

marabu 12. Sep 2005 17:54

Re: async Fragen
 
Hi,

nur für den Fall, dass AsyncPro immer noch eine Chance hat - eine Antwort hatte ich im original thread gepostet: klick

Grüße vom marabu

xeus 13. Sep 2005 06:20

Re: async Fragen
 
Will eigentlich schon mit async weitermachen.
hab den code soweit übernommen, schmeist er mir einige fehler aus:

comport: undef bezeichnung
receivebuffer1: "

hilfe, danke

xeus 13. Sep 2005 06:26

Re: async Fragen
 
OK,
hab den fehler selber beheben können.
nur zum verstzändniss:

die über die schnittstelle eingehenden daten, werden im puffer hinterlegt. in welcher form werden sie hinterlegt, werden alle daten hintereinander eingefügt, oder gibt es für jedes byte einen puffer? oder wie kann ich jedes kommende byte seperat abbarbeiten? am schönsten wäre es, wenn er mir jedes byte in eine var hinterlegt, z.b
byte1 = b1
..
byte8 = b8

so das ich mit diesen inhalten in anderen proceduren weiter arbeiten kann.

vielen dank

marabu 13. Sep 2005 06:52

Re: async Fragen
 
Hi,

sobald die empfangenen Daten im Empfangspuffer abgelegt wurden, kannst du jedes Byte über seinen Index ansprechen:

Delphi-Quellcode:
var
  i: integer;
begin
  Memo.Clear;
  for i := Low(ReceiveBuffer1) to High(ReceiveBuffer1) do
    Memo.Lines.Add(Format('Byte %d hat den Wert %d', [i, ReceiveBuffer1[i]]));
end;
Grüße vom marabu

xeus 13. Sep 2005 07:14

Re: async Fragen
 
suupppiii,
und wie kann ich den puffer, wieder löschen?

marabu 13. Sep 2005 07:19

Re: async Fragen
 
Delphi-Quellcode:
SetLength(ReceiveBuffer1, 0);
Aber du wirst doch nicht etwa so weiter machen wollen? Einen "Ringpuffer" hatte ich dir nahe gelegt...

marabu

xeus 13. Sep 2005 07:26

Re: async Fragen
 
ertsmal danke, für deine ganze hilfe.
ich bin mir sicher, das es mit einem ringbuffer besser geht.
nur das problem ist, dass ich nicht weiss was ein ringbuffer ist, und wie ich ihn erzeuge

marabu 13. Sep 2005 07:54

Re: async Fragen
 
Bevor ich dir einen Ringpuffer entwerfe - den Ringpuffer brauchst du, wenn dein Messgerät kontinuierliche oder auch periodische Datenströme produziert. Wenn die Kommunikation mit dem Gerät immer nur nach dem Muster kurze Frage knappe Antwort stattfindet, dann besteht keine Gefahr, dass Daten überschrieben werden, bevor sie von dir verarbeitet wurden.

Also: arbeitest du mit Datenströmen? Will heißen, kannst du das Gerät in einen Dauersendemodus schalten, so daß Zeit-Messreihen übermittelt werden, die erst durch ein Kommando von dir wieder beendet werden?

marabu

xeus 13. Sep 2005 08:20

Re: async Fragen
 
also die kommunikation ist wie folgt aufgebaut:

ich sende 10 bytes

1. Empfängeradresse, (da es mehr geräte sind)
2. Commando (welche info will ich)
3-8. sind zusätzliche parameter zum commando
9-10 ist fürs clc

auf diese anfrage bekomme ich eine antwort mit acht bytes

1. transmissionstate
2. status
3-6. parameter
7-8 clc


ich will die inhalte der bytes eigentlich nur in labels und einem memo darstellen. wenn ich dann wieder eine anfrage stell, sollen die labels gelöscht und der neue wert angezeigt werden. im memo am besten add line

marabu 13. Sep 2005 08:24

Re: async Fragen
 
Sieht nach einem rein sequentiellen Vorgehen aus. Du kannst mit dem einen dynamischen Puffer arbeiten. Gefahr für einen Datenverlust besteht nur bei Nebenläufigkeit. Viel Erfolg.

marabu

xeus 13. Sep 2005 08:41

Re: async Fragen
 
hhaaaaa, du willst mich doch bitte jetzt nich damit allein lassen;schlurz

wenn ich deine prozedur anwende, liefert er
mir leider nur byte 7 und 8 (wobei er es als byte 0 und 1 anzeigt), die anderen werden im memo nicht mit aufgelistet.

bin fast am verzweifeln!!!

xeus 13. Sep 2005 08:54

Re: async Fragen
 
supeer habs geschaft, dass er mir sämtliche bytes anzeigt. das einzige manko ist jetzt nur noch, das er abwechselnd vor jedes byte 'byte0, byte1' anzeigt, kann ich die empfangenen bytes nicht jeweils in eine integer hinterlegen? um sie dann in labels anzeigen zu lassen?

marabu 13. Sep 2005 09:05

Re: async Fragen
 
Sicher doch - alles was du willst:

Delphi-Quellcode:
begin
  Label1.Caption := IntToStr(ReceiveBuffer1[0]);
  Label2.Caption := CardToDual(ReceiveBuffer1[1]);
  Label3.Caption := IntToHex(ReceiveBuffer1[2], 2);
  ...
end;
marabu

Sharky 13. Sep 2005 09:10

Re: async Fragen
 
Zitat:

Zitat von marabu
Sicher doch - alles was du willst:

:shock:
Jetzt zeigt er Byte1 und Byte2 ja nicht als Dezimalzahl an ;-)
Entschuldigung. Das musste sein.

xeus 13. Sep 2005 09:12

Re: async Fragen
 
mit der methode komm ich irgendwie nicht klar, kannst du mir bitte zeigen, wie ich z.b. memo die erste zeile (den wert) in eine variable setzen kann... usw?;

weil mit deiner methode bringt er mir die reihung durcheinander

nochmals vielen dank

marabu 13. Sep 2005 09:18

Re: async Fragen
 
Die Ausgabe im Memo ist doch nur ein Beispiel für eine Visualisierung gewesen. So, wie die Daten ins Memo geschrieben werden, kannst du sie natürlich überall hin schreiben. Wenn du sie gerne auf einer Label-Komponente anzeigen möchtest, dann sagst du halt nicht Memo.Lines.Add() sondern:

Delphi-Quellcode:
 CLCLabel.Caption := IntToStr(ReceiveBuffer1[7]);
Auf jeden Fall holst du dir den Wert nicht aus dem Memo, sondern direkt aus deinem Puffer.

marabu

xeus 13. Sep 2005 09:19

Re: async Fragen
 
WUNDERFULL danke du profi. werd dich heut mit sicherheit noch öffter nerven. bis jetzt herzlichen dank

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?

Sharky 14. Sep 2005 11:24

Re: async Fragen
 
Zitat:

Zitat von xeus
... und für jeden wert einen entsprechenden buffer,

Von Async bekommst Du nur einen Buffer.
Wenn Du dir jetzt aber, so wie von marabu beschrieben, merkst was die "Frage" war kannst Du dann beim erhalt der "Antwort" mit den empfangenen Daten entsprechend deinen Vorstellungen verfahren. Du könntest also z.B. die Antworten auf Spannungsabfragen in ein Array (oder etwas vergleichbares schreiben) und die für Strom in ein anderes. Wobei es sicher einfacher wäre alles in ein "Array" zu schreiben und bei jedem Eintrag zu hinterlegen was die Werte bedeuten sollen. Dafür kannst Du zum Beispiel einen Record nehmen.

Du solltest aber in jedem Fall einmal von deinem gedanklichen Modell mit den Labels abstand nehmen.
Die primäre Aufgabe die Du hast ist es eine Anfrage an dein Messgerät zu senden und die Antwort von diesem in einer geeigneten Forum zu speichern. Wie die empfangenen Messdaten dann visuell ausgegeben werden ist dafür absolut unwichtig.

Ein Record den Du verwendest könnte zum Beispiel diese Struktur haben:
Delphi-Quellcode:
 Type
 TMessdaten = record
               geraete_id : integer;
               datum : TDateTime;
               typ  : integer; // 1 = Spannung, 2 = Stromstärke, 3 = Gewicht des Vorgesetzten
               wert : integer;
              end;

xeus 14. Sep 2005 11:52

Re: async Fragen
 
kannst du mir vielleicht noch erklären, wie ich die frage in commandcode hinterlege?

marabu 14. Sep 2005 11:57

Re: async Fragen
 
Etwa so:

Delphi-Quellcode:
CommandCode := Chr(50); // 'U'

Sharky 14. Sep 2005 11:58

Re: async Fragen
 
Zitat:

Zitat von xeus
kannst du mir vielleicht noch erklären, wie ich die frage in commandcode hinterlege?

Ich schlage vor Du zeigst jetzt ersteinmal was Du schon gemacht hast. Wenn wir dir jede Zeile Code vorsetzen wird das nämlich nie etwas werden. Zumal Du, entschuldige meine Offenheit, die Grundlagen von Delphi wohl noch nicht gelernt hast. ;-)

xeus 14. Sep 2005 12:09

Re: async Fragen
 
vielen dank für deine offenheit. wer nicht fragt bleibt dumm, oder so.

mir ist das schon selber bewusst. doch ich muss das prog fertig kriegen, dass hilft mir nichts.

aber trotzdem danke für deine hilfe

Sharky 14. Sep 2005 12:12

Re: async Fragen
 
Wir helfen ja auch gerne weiterhin.
Aber wenn Du uns nicht zeigst was für Code Du schon hast ist es schwer dir einen vernünftigen Ratschlag geben zu können.
Sonst reden wir nämlich alle aneinander vorbei.

marabu 14. Sep 2005 12:26

Re: async Fragen
 
Hi xeus,

noch besser können wir alle helfen, wenn du uns sagst, wo im Netz wir uns ein Handbuch zu deinem Messgerät ziehen können (hai sharky) - oder sage uns wenigstens um welchen Typ / Hersteller es sich handelt. Vielleicht kennt jemand das Gerät oder wir finden irgendwo die passenden Unterlagen. Es sind so viele Fragen noch offen, dass mir manchmal unwohl wird...

marabu

xeus 14. Sep 2005 12:30

Re: async Fragen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also im beigefügten anhang,

ist der bisherige code, mit 12 Geräten, und mit je zwei commandos und der entsprechenden (clc_l, clc_h)

bitteschön

xeus 14. Sep 2005 12:38

Re: async Fragen
 
ich kann euch leider nicht sagen, welches gerät es genau ist. nur soviel es handelt sich um einen pv-wechselrichter.

insgesamt sind es 12 an der zahl.
diese will ich auslesen und die daten visualisieren.
das abfragen des commandos 50 funzt einwandfrei.

doch sobalt ich über button17 die frage mit dem commando 78 sende und ich die antwort dafür bekomme, wird diese natürlich receivebuffer1 überschrieben, was auch nicht weiter schlimm ist. das prob ist, das halt dann im label für command 50 jetzt der wert für 78 steht, und man damit visuel und verarbeitungstechnisch nichts damit anfangen

-frage wird gestellt
-antwort wird erhalten
-die benötigten bytes aus der antwort selektiert
-daten bearbeitet
-ausgabe in labels

das selbe benötige ich jetzt noch für die fragen mit dem
commando 78 mit dem 1.par 0
commando 78 mit dem 1.par 3
commando 78 mit dem 1.par 4

marabu 19. Sep 2005 21:05

Re: async Fragen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi xeus,

alles klar bei dir? Lebst du noch? Wie weit ist dein Projekt? Ich hänge dir mal ein bischen Code an. Schmeiß weg, wenn du es nicht mehr brauchst.

Sorgenvolle Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
Seite 1 von 2  1 2      

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