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 ? |
AW: Exception während RS232 Datenempfang
Hallo Anton,
Delphi-Quellcode:
Hier wird receivedMessage ein Array bzw. dessen Adresse zugewiesen.
receivedMessage := commTest.receiveMessage;
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 |
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:
Grüße
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; Klaus |
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 |
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 |
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 |
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 |
AW: Exception während RS232 Datenempfang
ersetze mal das move mit diesem:
Delphi-Quellcode:
Grüße
move(receivedMessage[0], NewDataRecord^.Data[0], NewDataRecord^.DataLength);
Klaus |
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 |
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 |
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 |
AW: Exception während RS232 Datenempfang
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus
Entschuldige, das vorher war nicht komplett. Gruss Anton |
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 |
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 |
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 |
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 |
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 |
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 |
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:
.. wenn Du das override wieder hereinnimmst.
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; TThread.create() hat eine andere Signatur. Also müsste override gesetzt werden. Grüße Klaus |
AW: Exception während RS232 Datenempfang
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus
Geht leider nicht, siehe Beilage. Grüsse Anton |
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 |
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 |
AW: Exception während RS232 Datenempfang
Hallo Anton,
Delphi-Quellcode:
receivedMessage ist schon richtig, nur das man dort nicht den Type übergeben sollte (mea culpa).
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; Es sollte dort der Parameter meldung übergeben werden. Grüße Klaus |
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 |
AW: Exception während RS232 Datenempfang
Zitat:
Delphi-Quellcode:
Zwei Zeilen tiefer ist nochmal derselbe Lapsus drin.
fCncMessageTransmitter := TCncMessageTransmitter.create(fOutMessageQueue, COMPORT, Form1.Handle);
Grüsse Klaus |
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 |
AW: Exception während RS232 Datenempfang
Hallo Anton,
TMeldung habe ich nach cncDataTypes verschoben. Die TInMessageQueue hat einen generischen Type TMeldung.
Delphi-Quellcode:
Grüßesaetze_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)); Klaus Wenn toSend als Parameter verwendet werden kann, spart das die |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 Uhr. |
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