Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Exception während RS232 Datenempfang (https://www.delphipraxis.net/203690-exception-waehrend-rs232-datenempfang.html)

akuk 20. Mär 2020 16:39

AW: Exception während RS232 Datenempfang
 
Hallo Zusammen
In der Unit F_MainWindows, Zeile 100 ist die Typendeklaration :
type
//Record for new files, will occur when LParam = TH_NEWFILE, WParam will be PNewFileRecord
PNewDataRecord = ^TNewDataRecord;
TNewDataRecord = record
ThreadID : Cardinal;
Data : OptiNumericComm.TMeldung;
DataLength : integer;
end;

Nur finde ich
auf der Zeile 145: NewDataRecord^.DataLength := Length(receivedMessage);
dann gibst Zeile 140: receivedMessage := commTest.receiveMessage;
aber das CommTest ist nicht auffindbar.Was ist das ?
Wo wird dem DAtaLength Wert zugewiesen ?


Ich kenne mich zu wenig gut im Delphi, aber könnte das die Ursache sein
für die Exception ?

Klaus01 20. Mär 2020 18:46

AW: Exception während RS232 Datenempfang
 
Hallo Anton,

Delphi-Quellcode:
receivedMessage := commTest.receiveMessage;
Hier wird receivedMessage ein Array bzw. dessen Adresse zugewiesen.
Die Größe des Array wird in recieveMessage festgelegt.

Daher muss bei receiveMessage keine Arraylänge gesetzt werden.
Ich denke nicht das der Fehler hier liegt.

Wo werden denn die erzeugten records wieder freigegeben?
Werden die eventuell an verschiedenen Stellen freigegeben?

Grüße
Klaus

Klaus01 20. Mär 2020 19:11

AW: Exception während RS232 Datenempfang
 
.. was möglich wäre..

receivedMessage ist eine lokale Variable.
Hier wird dem NewDataRecord^.Data die Adresse, nicht der Inhalt, der receivedMessage zugewiesen.
Am Ende der Methode wird die lokale Variable aufgeräumt.
Die Adresse auf die NewDataRecord^.Data zeigt ist möglicherweise
nicht mehr gültig bzw. überschrieben worden.

Versuche mal ob es so besser wird:
Delphi-Quellcode:
function ReciveDataCom( data : Pointer) : Integer;
var NewDataRecord : PNewDataRecord;
    SendDataRecord : PNewDataRecord;
    Done    : Boolean;
    receivedMessage : OptiNumericComm.TMeldung;
    msg : tagMSG;

begin
  if not commTest.initOptiNumericComm(COMPORT) then
  begin
    PostMessage( Form1.Handle, TH_MESSAGE, TH_ERROR, GetCurrentThreadID );
  end;
  while not commTest.checkCommActive do
  begin

  end;
  PostMessage( Form1.Handle, TH_MESSAGE, TH_CONNECTED, GetCurrentThreadID );

  Result := 0;
  Done := False;
  while not Done do
  begin
    Result := Result + 1;
    receivedMessage := commTest.receiveMessage;

    New(NewDataRecord);
    NewDataRecord^.ThreadID := GetCurrentThreadID;
    NewDataRecord^.DataLength := Length(receivedMessage);
    SetLenght(NewDataRecord^.Data, Length(receivedMessage));
    move(receivedMessage, NewDataRecord^.Data, NewDataRecord^.DataLength);
    PostMessage( Form1.Handle, TH_MESSAGE, TH_DATAM, Integer(NewDataRecord));

    //Done := True;

    if (receivedMessage[0] and $0F) = $06  then
    begin
      if PeekMessage(&msg, 0, 0, 0, PM_REMOVE) then
      begin
        case msg.wParam of
          TTH_SEND: begin
            SendDataRecord := PNewDataRecord(msg.lParam);
            commTest.transmitMessage(SendDataRecord.Data);
          end;
        end;
      end;
    end;

  end;
  //All done inform MainForm of ending
  PostMessage( Form1.Handle, TH_MESSAGE, TH_CLOSE, GetCurrentThreadID );
end;
Grüße
Klaus

akuk 21. Mär 2020 11:16

AW: Exception während RS232 Datenempfang
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus
Vielen Dank für Dein Vorschlag, leider ist immer noch eine System-Exception
da, aber eine andere. Siehe Beilage.
Gruss
Anton

Klaus01 21. Mär 2020 12:00

AW: Exception während RS232 Datenempfang
 
Hallo Anton,

tritt die "neue" Exception immer auf oder auch wieder nur sporadisch?
Wenn immer stehen die Chancen zu debuggen nicht so schlecht.

Grüße
Klaus

akuk 21. Mär 2020 13:54

AW: Exception während RS232 Datenempfang
 
Hallo Klaus
Ja die trifft immer, aber wie kann ich es Debuggen, mit BP und Schrittweise ?
oder gibt es andere Möglichkeit ?
Mit BP und Schrittweise ist natürlich sehr mühsam, die CNC Verhängt sich dann
da muss ich immer beides abschalten und dann neu starten.
Gruss
Anton

Klaus01 21. Mär 2020 14:22

AW: Exception während RS232 Datenempfang
 
.. im Aufruf Stack ist zu sehen, dass etwas beim System.Move
im Argen liegt.

Was ich bisher bei SO gefunden habe:
https://stackoverflow.com/questions/...lass-c00000005
bringt mich zurzeit noch nicht so richtig weiter.

Grüße
Klaus

Klaus01 21. Mär 2020 14:43

AW: Exception während RS232 Datenempfang
 
ersetze mal das move mit diesem:
Delphi-Quellcode:
    move(receivedMessage[0], NewDataRecord^.Data[0], NewDataRecord^.DataLength);
Grüße
Klaus

akuk 21. Mär 2020 14:56

AW: Exception während RS232 Datenempfang
 
Hallo Klaus
Ich habe schrittweise Probiert Letzte BP1 wo noch kein Exc auftritt,
beim BP 2 kommt EXc. bereits:


Bp1> EditorForm := TForm2.Create(self);
with EditorForm do begin
BorderIcons := [];
BorderStyle := bsNone;
parent := TabSheet1;
Align := alClient;
Visible := true;
end;

BP2 RefAnfForm := TForm5.Create(self);
with RefAnfForm do begin
BorderIcons := [];
BorderStyle := bsNone;
parent := TabSheet9;
Align := alClient;
Visible := true;
end;

Ich verstehe sowieso nicht warum wird Form1 create, es ist jetzt
Betriebswahl(BW)auf Manuell d.h es musste nur die Form11 kreiert werden.
Die Information über BW stellung ist in der
Status Meldung M6: Byte1, ZBETR., Manuelstellung ZBETR =08, aber es sind auch Stellungen 07,06,05,04 möglich ebenfalls für Form11.
Gruss
Anton

akuk 21. Mär 2020 15:16

AW: Exception während RS232 Datenempfang
 
Hallo Klaus
die move zeile habe ich geändert, exzeption kommt, aber wenn ich fortsetzen
drücke, kommt kurzzeitig das menu MAN jedoch verschwindet es wieder , vermutlich wenn ein Status oder Istwert Meldung kommt. dabei erscheint im MAN Menue die Meldung mit "ungültige Zeigeroperation"
Die CNC sendet ja andauernd weitere Meldungen:
CNCstatus, AchsenStatus, Istwerte.
Könnte das sein, das die Meldungen von der CNC gar nicht so schnell verarbeitet werden können ?
Gruss
Anton

akuk 21. Mär 2020 15:46

AW: Exception während RS232 Datenempfang
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus
Ich sende dir ein Offline Simulation Demo-programm der die CNC mit der Bediensoftware zusammen simmuliert. Allerdings nur die Stellungen MAN/REF, PROG,und AUTm es ist ein bisschen Spielzeug.
Das Programm habe ich nur vor paar Jahren schnell zusammengestellt, ist nicht ganz proper.
Im CNC Menue werden laufend Meldungen Angezeigt wie im echtem Betrieb
So hast Du Vorstellung wie das ganze Ablaufen soll.
Das jetztige Programm ist natürlich an die echte CNC über RS232/422 angebunden.
Gruss
Anton

akuk 21. Mär 2020 16:06

AW: Exception während RS232 Datenempfang
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus
Entschuldige, das vorher war nicht komplett.
Gruss
Anton

Klaus01 21. Mär 2020 18:35

AW: Exception während RS232 Datenempfang
 
Hallo Anton,

danke, kannst Du mir vielleicht noch die Unit mit den Message Konstanten geben?
TH_MESSAGE, TH_DATAM, TH_CONNECTED, TH_ERROR, TTH_SEND,...

Grüße
Klaus

akuk 21. Mär 2020 23:37

AW: Exception während RS232 Datenempfang
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Klaus
Vielen Dank Für Deine Hilfe.
Anbei NCTB__09.pas sowie Aufzeichnung der ersten Meldungen an der RS232.
Gruss
Anton

Klaus01 24. Mär 2020 10:19

AW: Exception während RS232 Datenempfang
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Anton,

ich habe mal versucht alles etwas zu entzerren.

Neu ist eine Thread: cncDataReceiver
Der liest Daten von dem comport und packt die Meldungen
in die Queue fInMessageQueue.
Diese Queue wird von dem Thread cnsMessageDispatcher gelesen.
Die Meldungen werden dort verarbeitet und entsprechende Messages gepostet.

Die Daten die zum comport geschickt werden sollen werden von dem Thread cncDataTransmitter verarbeitet.
Die Input Daten bekommt der Thread aus der fOutMessageQueue.
Die fOutMessageQueue wird in der F_MainWindow unit gefüllt.

fInMessageQueue und fOutMessageQueue basieren auf TThreadQueue.
TThreadQueue ist ein thread-Safe TQueue.

Daten vom und zum comPort werden nun gepuffert

Ich kann nicht versprechen, dass das alles auf Anhieb läuft, dazu sind die Umbauten zu groß.

Grüße
Klaus

akuk 25. Mär 2020 09:26

AW: Exception während RS232 Datenempfang
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus
Da bin ich wieder, da gibt es Problem wegen Klassenvererbung.
TCncMessageTransmitter =class(TThread).. ich habe probiert
(TCNCDataReceiver) das ist doch die Bassisklasse ? aber das funktioniert
nicht. siehe Beilage, Fehler in Zeile 17
Gruss
Anton

Klaus01 25. Mär 2020 09:35

AW: Exception während RS232 Datenempfang
 
Hallo Anton,

tut mir leid -mein Fehler.
TCncMessageTransmitter hat als Basisklasse TThread.

Kannst Du bitte das override am Ende der Create Definition entfernen?
Das gleiche dann bitte auch noch bei TCncDataReceiver.

Grüße
Klaus

akuk 25. Mär 2020 10:30

AW: Exception während RS232 Datenempfang
 
Hallo Klaus
leider der nächste im cncDataReceiver:

geQueue: TThreadQueue<TMeldung>; const comport: shortInt; const destHande: THandle);

[dcc32 Fehler] cncDataReceiver.pas(26): E2037 Deklaration von 'create' unterscheidet sich von vorheriger Deklaration

Grüsse
Antin

Klaus01 25. Mär 2020 10:50

AW: Exception während RS232 Datenempfang
 
Delphi-Quellcode:
  TCncDataReceiver = class(TThread)
    private
      fCommTest: TOptiNumericComm;
      fMessageQueue: TThreadQueue<TMeldung>;
      fComPort: ShortInt;
      fDestHandle: THandle;
      function receiveDataCom: TMeldung;
    public
      constructor create(var messageQueue: TThreadQueue<TMeldung>; const comport: shortInt; const destHandle: THandle); override;
      destructor destroy; override;
      procedure Execute; override;
  end;
Delphi-Quellcode:
constructor TCncDataReceiver.create(var messageQueue: TThreadQueue<TMeldung>; const comport: shortInt; const destHande: THandle);
begin
  inherited create(true);
  fCommTest := TOptiNumericComm.Create;
  fMessageQueue := messageQueue;
  fComPort := comPort;
  fDestHandle := destHandle;
  suspended := false;
end;
.. wenn Du das override wieder hereinnimmst.
TThread.create() hat eine andere Signatur.
Also müsste override gesetzt werden.

Grüße
Klaus

akuk 25. Mär 2020 11:07

AW: Exception während RS232 Datenempfang
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus
Geht leider nicht, siehe Beilage.
Grüsse
Anton

Klaus01 25. Mär 2020 12:04

AW: Exception während RS232 Datenempfang
 
Hallo Anton,

bei mir ist ein Tippfehler im Create.
override muss raus.

constructor TCncDataReceiver.create(var messageQueue: TThreadQueue<TMeldung>; const comport: shortInt; const destHandle: THandle);

Grüße
Klaus

akuk 25. Mär 2020 14:29

AW: Exception während RS232 Datenempfang
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus
Zeile 16 CNCMessageDispatcher:
constructor Create(const destHandle: THandle; var messageQueue: TThreadQueue<TMeldung>);// override; hier habe ic das override entfernt
nächste sind 12 Fehler : siehe Beilage:
Sollte das receivedMessage nicht receiveMessage sein ?
Grüsse
Anton

Klaus01 25. Mär 2020 15:36

AW: Exception während RS232 Datenempfang
 
Hallo Anton,

Delphi-Quellcode:
procedure TCncMessageDispatcher.processMessage(meldung: TMeldung);
var
  NewDataRecord : PNewDataRecord;
  SendDataRecord : PNewDataRecord;
  receivedMessage : TMeldung;
  msg : tagMSG;

begin
  receivedMessage := meldung;
  try
    New(NewDataRecord);
    NewDataRecord^.ThreadID := GetCurrentThreadID;
    NewDataRecord^.DataLength := Length(receivedMessage);
    SetLength(NewDataRecord^.Data, Length(receivedMessage));
    move(receivedMessage[0], NewDataRecord^.Data[0], NewDataRecord^.DataLength);
  except
    on e: Exception do
      raise Exception.Create(format('Receiver thread error: %s',[e.Message]));
  end;
  PostMessage( fDestHandle, TH_MESSAGE, TH_DATAM, Integer(NewDataRecord));

  if (receivedMessage[0] and $0F) = $06  then
  begin
    if PeekMessage(&msg, 0, 0, 0, PM_REMOVE) then
    begin
      case msg.wParam of
        TTH_SEND: begin
          SendDataRecord := PNewDataRecord(msg.lParam);
          fCommTest.transmitMessage(SendDataRecord^.Data);
        end;
      end;
    end;
  end;
  PostMessage( fDestHandle, TH_MESSAGE, TH_CLOSE, GetCurrentThreadID );
end;
receivedMessage ist schon richtig, nur das man dort nicht den Type übergeben sollte (mea culpa).
Es sollte dort der Parameter meldung übergeben werden.

Grüße
Klaus

akuk 25. Mär 2020 16:22

AW: Exception während RS232 Datenempfang
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus
da kommt das nechste:
schlimmste ist, ich sehe da kein Fehler:

zBsp Zeile 145:
[dcc32 Fehler] F_MainWindow.pas(145): E2029 ')' erwartet, aber ',' gefunden

fCncMessageTransmitter := TCncMessageTransmitter(fOutMessageQueue, COMPORT, Form1.Handle); // ????

Da bin ich ehrlich gesagt total überfordert
Grüsse
Anton

Klaus01 25. Mär 2020 17:07

AW: Exception während RS232 Datenempfang
 
Zitat:

Zitat von akuk (Beitrag 1460506)
Hallo Klaus
da kommt das nechste:
schlimmste ist, ich sehe da kein Fehler:

zBsp Zeile 145:
[dcc32 Fehler] F_MainWindow.pas(145): E2029 ')' erwartet, aber ',' gefunden

fCncMessageTransmitter := TCncMessageTransmitter(fOutMessageQueue, COMPORT, Form1.Handle); // ????

Da bin ich ehrlich gesagt total überfordert
Grüsse
Anton

Delphi-Quellcode:
fCncMessageTransmitter := TCncMessageTransmitter.create(fOutMessageQueue, COMPORT, Form1.Handle);
Zwei Zeilen tiefer ist nochmal derselbe Lapsus drin.

Grüsse
Klaus

akuk 25. Mär 2020 22:23

AW: Exception während RS232 Datenempfang
 
Hallo Klaus
Dies kommt vielfach vor :

fOutMessageQueue.Enqueue(SendDataRecord);

die Fehler Meldung dazu :

[dcc32 Fehler]
F_MainWindow.pas(616): E2010 Inkompatible Typen: 'TMeldung' und 'TDataMessage'

ich dachte SendDataRecord ist ein Pointer
(SendDataRecord : PDataMessage;) dereferenzieren stimmt ofenbar nicht : SendDataRecord^, wo ist dann die TMeldung drin ?

Grüsse
Anton

Klaus01 26. Mär 2020 06:41

AW: Exception während RS232 Datenempfang
 
Hallo Anton,

TMeldung habe ich nach cncDataTypes verschoben.
Die TInMessageQueue hat einen generischen Type TMeldung.

Delphi-Quellcode:
                 
saetze_holen := saetze_holen + 1;
LongInt_NCByte(saetze_holen,toSend[1],toSend[2],BufByte);{Satz-Nr ablegen}
//New(SendDataRecord2);
//SendDataRecord2^.Data := toSend;
//SendDataRecord2^.ThreadID := GetCurrentThreadID;
//SendDataRecord2^.DataLength := Length(toSend);
//fOutMessageQueue.Enqueue(SendDataRecord2^.Data);
// oder
fOutMessageQueue.Enqueue(toSend);
//PostThreadMessage(Threadinfo.ThreadId,TTH_MESSAGE,TTH_SEND,Integer(SendDataRecord));
Grüße
Klaus

Wenn toSend als Parameter verwendet werden kann, spart das die


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 Uhr.
Seite 2 von 2     12   

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