Forum: PC-Programmierung VB - Verständnissproblem mit Ereignissen


von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Angehängte Dateien:

Lesenswert?

Hallo Forengemeinde,

ja, habe weitere Schwierigkeiten gewisse Sachen umzusetzen.

Es geht weiter um meine Isel-CNC. Kann nun mit der Isel zumindest soweit 
kommunizieren, dass sie mir z.B. den Status mitteilt.
Habe einen Screenshoot vom Programmausschnitt, den es betrifft und das 
Formular angehängt.
Folgendes Problem:
mit dem Button 'Status' sende ich eine Sequenz an die Isel, und diese 
gibt mir dann das im oberen Fenster zurück. Beim drücken des Buttons 
'Übersetzen' werden CR zu CR/LF umgewandelt, so das die Meldung sauber 
erscheint. Siehe rechtes unteres Bild/Fenster.

Ich möchte aber natürlich, dass dies in einem Rutsch passiert. Also 
Button 'Status' drücken, und in einem Textfenster erscheint die Meldung 
korrekt.

Es ist aber so, dass die Antwort, bis die Isel diese übertragen hat ein 
paar Sekunden dauert, weil sie z.B. den Speicher und Weiteres erst 
checkt. und man erst auf die Vollständigkeit der Meldung warten muss. 
Die Meldung baut sich nach und nach auf.

Nun habe ich hier ein Brett vor dem Kopf, wie ich das realisieren kann. 
Habe einen Button mit übersetzen, der aber soll weg, und die übersetzung 
automatisch erfolgen.

wer kann / möchte mir helfen?

von Franko S. (frank_s866)


Lesenswert?

Warten bis alles da ist, erst dann filtern und darstellen.

von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Lesenswert?

Franko S. schrieb:
> Warten bis alles da ist, erst dann filtern und darstellen.

Und woher kommt dieses Feedback?

von Christian H. (ch-hunn)


Lesenswert?

Du müsstest im Ereignis der mscomm1 das Ende des Empfangsbuffers 
auswerten (endet auf check finished) und dann die Übersetzung anstossen

von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Lesenswert?

Christian H. schrieb:
> Du müsstest im Ereignis der mscomm1 das Ende des Empfangsbuffers
> auswerten (endet auf check finished) und dann die Übersetzung anstossen

Genau das ist die Frage, wie ich dies bewerkstellige. Da steh ich auf 
dem Schlauch.

Ich könnte auf die Meldungslänge z.B. >315 reagieren, oder eben wirklich 
auf 'FINISHED'.
 Aber wo baue ich das ein?
Im ...OnComm()? - funktioniert das nicht. Diese wird anscheinen nur bei 
Ankunft eines Zeichen aufgerufen. Nicht einmal eine MessageBox öffnet 
sich hier. Auch eine If-Anweisung mit Meldungskorrektur wird hier 
ignoriert. Auch in der aufrufenden Funktion / Procedure klappt das 
nicht. HIer habe ich das Ablauf-Verständniss-Problem.

von Peter M. (r2d3)


Lesenswert?

Hallo Thomas S.,

Thomas S. schrieb:
> Im ...OnComm()? - funktioniert das nicht. Diese wird anscheinen nur bei
> Ankunft eines Zeichen aufgerufen.

Das ist nur Deine Vermutung. Du musst der Schnittstelle bei der Arbeit 
zusehen!

Statt
Me.Text1=M.Text1 + InBuffer
besser noch ein Zeichen für Debugging einsetzen:
Me.Text1=M.Text1 + InBuffer + "/"

Dann siehst Du genau, in wieviel Portionen die Antwort ankommt.
Ich glaube nicht, dass Dein Gerät die Antwort byteweise liefert!

> Nicht einmal eine MessageBox öffnet

Das wäre der totale Gau und ist vollkommen sinnlos. Was ist, wenn Du nur 
ankommende Daten verarbeiten willst? Für die Anzeige von Daten bist Du 
verantwortlich.

Wenn Deine Gerätedokumentation das nicht hergibt, musst Du für jeden Typ 
von Sende-Anfrage die Antwort protokollieren.

Dann musst Du Dir überlegen, wie Du die Antworten separierst.
Status-Anfragen sind gerne mehrzeilig, also kannst Du einen typischen 
Endebezeichner wie CR LF nicht als Endemarkierung verwenden.

Die On-Com-Methode sollte wissen, wonach du vorher gefragt hast und 
dementsprechend reagieren. In einem Fall prüft sie das "Check Finished" 
am Ende der Nachricht, im anderen Fall reichen vielleicht das Prüfen der 
Endemarkierung CR LF.

Wenn CR LF am Anfang auftauchen, ist wohl etwas schiefgelaufen.

Hast Du "empfang" und "inBuffer" auch mit DIM deklariert?

von Peter M. (r2d3)


Lesenswert?

Fehlerkorrektur:

>Status-Anfragen sind gerne mehrzeilig,

muss heißen

" Antworten auf Status-Anfragen sind gerne mehrzeilig,"

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Ich hatte mal ein ähnliches Problem mit einem Hand-Scanner.
Die Aufgabe damals war, eine eingescannte EAN anschließend in
einer DB zu suchen und bei Fund in eine Gridbox einzutragen.

Da hatte ich den Scanner auch auf das CR als Endezeichen eingestellt
und einen HotKey (halt CR) definiert. So ein CR bzw. RETURN reagiert
ja bei einzeiligen Editfeldern mit einem Klingelton (Bing). Jedenfalls
hatte das damals einwandfrei funtkioniert. Man muß nur darauf achten,
daß das Editfeld nach Auslesen den Focus behält. Wenn so ein Editfeld
halt stört, kann man es auch unsichtbar für den User machen.

Vielleicht kannst du hier ein ähnliches bzw. leicht abgewandeltes
Verfahren anwenden.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Thomas S. schrieb:

> Im ...OnComm()? - funktioniert das nicht.

Doch natürlich. Wenn man's richtig machen würde, würde das schon 
funktionieren. Die Grundstruktur dessen, was nötig ist, hast du ja hier 
sogar bereits eingebaut (sinnloserweise sogar gleich doppelt...), aber 
ich kann hier keinerlei Ansatz zur Auswertung bezüglich des 
Nachrichtenendes entdecken.

> Diese wird anscheinen nur bei
> Ankunft eines Zeichen aufgerufen.

Nein, die wird immer dann aufgerufen, wenn einerseits ungelesene Zeichen 
im Puffer des "COM-Ports" liegen, und andererseits das OS gerade Zeit 
hat, den Task deiner Anwendung laufen zu lassen.

von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Angehängte Dateien:

Lesenswert?

VB macht mich wahnsinnig. Ich habe weiterhin ein Verständnissproblem

Habe nun das geschaft, dass die Statusmeldung nun sauber ist, da ich den 
Tausch CR = CR/LF sofort in OnComm mache.

Nun ein Schritt weiter, möchte ich die aktuelle Position der CNC in 
Erfahrung bringen.
Dazu sende ich :@0P + Chr(13)
Die Isel antwortet nun mit insgesamt 19 Bytes. Da die CNC sich noch 
nicht bewegt hat, ist das Ergebnis: 0000000000000000000
Das möcht ich nun im Textfeld stehen haben.

Habe nun den Code, mit allenmöglichen Änderungen versucht. Aber 
anscheinend ist das event 'button' schon wieder raus, oder was weiß ich.
Habe es mit einer Variablen: empfang versucht. Empfang am 
Funktionsanfang gelöscht, usw.

Die Routine ist anscheinend zu schnell, und die Isel zu langsam mit 
9600.
Jedes Komando, wenn die CNC es versteht wird mit '0' quitiert. Ansonsten 
kommt ne Zahl >0 als Fehlercode.

Bitte erklärt mir, wo meine Denk-Fehler hier sind,

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Thomas S. schrieb:
> VB macht mich wahnsinnig.

Nein, das hat mit VB nichts zu tun. Du kannst einfach nur nicht 
programmieren. Du verstehst ganz offensichtlich nicht, was du da tust. 
Das würdest du in jeder anderen Sprache genausowenig begreifen.

> Bitte erklärt mir, wo meine Denk-Fehler hier sind,

Dein grundsätzlicher Denk-Fehler ist, daß man Programmieren erklären 
könnte. Nein, das kann man nur lernen. Indem man die Sache wirklich 
durchdenkt und überlegt, was da passiert und wie man das Geschehen in 
die richtige Richtung lenkt.

Hier ist das Problem, dass der Code in OnComm überhaupt keinen Kontext 
hat. Er weiß also nicht, was überhaupt die Frage war, die irgendwo 
anders gestellt wurde, soll aber die Antwort sinnvoll aufarbeiten. Das 
kann nicht funktionieren. Schon deshalb nicht, weil die Antworten halt 
verschieden sein können (und es offensichtlich auch sind).

In erster Näherung musst du also einen Mechanismus schaffen, der dem 
Code in OnComm sagt, was er da jetzt als Eingangsdaten zu erwarten hat. 
Dann mußt du in OnComm eine Verzweigung schaffen. die die 
unterschiedlichen zu erwartenden Eingangsströme auch unterschiedlich 
behandelt.

Und (viele Programmierstunden später) kannst du dann noch versuchen, die 
Gemeinsamkeiten der verschiedenen Aktionen zu einem gemeinsamen 
PROTOKOLL zusammen zu fassen, welches der OnComm-Handler zunächst mal 
einheitlich behandeln könnte. Erst wenn dieser Teil der gundsätzlichen 
Behandlung des Informationsaustauschs abgehandelt ist (also im Minimum: 
Erkennung von Nachrichten-Anfang/Ende), muss dann verzweigt werden.

Und, wie schon gesagt, das hat alles mit der Sprache nix zu tun. Das 
Problem wäre in jeder anderen Sprache gundsätzlich ganz genauso zu 
lösen.

von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Lesenswert?

Peter M. schrieb:
> Wenn CR LF am Anfang auftauchen, ist wohl etwas schiefgelaufen.

Dies sendet die Isel so. Auch im Terminal kommt der Aufbau so.

Ob S. schrieb:
> Hier ist das Problem, dass der Code in OnComm überhaupt keinen Kontext
> hat. Er weiß also nicht, was überhaupt die Frage war, die irgendwo
> anders gestellt wurde, soll aber die Antwort sinnvoll aufarbeiten.

So viel kann die CNC nicht.
Ich schicke ihr ein Komando, und im besten Fall antwortet die CNC mit 
'0', ansonsten kommt ein Fehler mit einer Nummer zwischen 1 und 99.

Ich lösche den Puffer 'empfang', und erwarte in der aufrufenden 
Procedure zum Button 'Position', dass hier dann in 'empfang' die 
Position mit länge 19 steht. Aber wie oben schon durch, also benötige 
ich etwas, ds solngae hier wartet, bis die 19 Bytes dann da sind.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Thomas S. schrieb:

> So viel kann die CNC nicht.
> Ich schicke ihr ein Komando, und im besten Fall antwortet die CNC mit
> '0', ansonsten kommt ein Fehler mit einer Nummer zwischen 1 und 99.

Du begreifst es wohl wirklich nicht...

Es ist überhaupt nicht Aufgabe der CNC, sich mit den Befindlichkeiteten 
des Clients zu beschäftigen. Der (und nicht die CNC) muß sich merken, 
was er die CNC zuletzt gefragt hat und der (und nicht die CNC) muss 
auswerten, was da als Antwort auf die Frage zurück kam. Geht halt 
deutlich besser, wenn der Client sich an die gestellte Frage erinnert, 
wenn die Antwort der CNC darauf eingeht...

Mein Gott. Sowas ist dermaßen logisch, dass ich einfach nicht begreifen 
kann, dass irgendjemandem das nicht sofort selber klar ist.

Beitrag #7719437 wurde vom Autor gelöscht.
von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Lesenswert?

Ob S. schrieb:
> Du begreifst es wohl wirklich nicht...
>
> Es ist überhaupt nicht Aufgabe der CNC, sich mit den Befindlichkeiteten
> des Clients zu beschäftigen.

Das sage ich ja nicht. Ich weiß, das min Programm drauf reagieren muss. 
Ist mir schon klar. Und ich kriege ja auch das Feedback von ihr.

Lassen wir es. Anscheinend kann ich es nicht vermitteln wo es klemmt.

Guten Tag noch.

von Peter M. (r2d3)


Lesenswert?

Hallo Thomas S.,

Thomas S. schrieb:
> Aber wo baue ich das ein?
> Im ...OnComm()? - funktioniert das nicht. Diese wird anscheinen nur bei

Natürlich. Du erhältst ein Zeichen, hängst es an Deinen Ergebnisstring 
an und prüfst, ob die ISEL-Rückmeldung vollständig ist. Wenn ja, 
verarbeitest Du die Rückmeldung, also den Ergebnisstring, wenn nein, 
machst Du gar nichts und die Prozedur des OnComm-Event wird beendet.

Das ist deswegen möglich, weil das OnComm-Event völlig ohne Dein Zutun 
von Excel aufgerufen wird, sobald ein Byte im Empfangspuffer der 
Schnittstelle liegt.

Es hängt nun davon ab, wie Du im Event prüfst, ob die Rückmeldung Deiner 
Schnittstelle komplett ist. Du könntest prüfen, ob der String "empfang" 
auf 19 Stellen Länge angewachsen ist oder ob der String auf CR LF endet.

Erst wenn das Ergebnis der Schnittstelle komplett ist, beginnt die 
Nachbearbeitung und die Verarbeitung des Ergebnisses.

Nachbearbeitung bedeutet z.B., ein CR LF am Anfang des Strings "empfang" 
zu entfernen. Diese Entfernung gehört in die OnComm-Logik, aber nicht in 
eine Extra-Prozedur wie Deine Command6-Klick, die mit Klick auf eine 
Schaltfläche manuell gestartet wird, schließlich soll Dein Programm das 
ohne Dein explizites Zutun von alleine machen.

Dann verarbeitest Du das Ergebnis. Du schreibst es vielleicht in eine 
Textbox in Dein Formular. Bei einem Datalogger würdest Du das Ergebnis 
in eine Zahl umwandeln, und z.B. in einer Excel-Spalte protokollieren 
oder vielleicht in eine Datei schreiben.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.