Hallo,
mein Name ist Philipp und bin im Rahmen einer Studienarbeit über ein Problem gestolpert.
Aufgabe: Einlesen von Koordinaten aus einer Text-Datei, diese an ein System mit zwei Achsen übergeben und den Punkt linear anfahren.
Auslesen, Berechnen der Geschwindigkeiten für ein lineares Anfahren und übergeben an den Controller funktioniert wunderbar, ABER:
Der Controller (Parker Compax-S 2500 falls der ein oder andere das Teil kennt) des/der Motoren schickt keine Antwort zurück. Ich kann Befehle senden, die Position wird angefahren aber ich bekomme keine Antwort und somit wird der 2. Punkt schon nicht mehr angefahren. Ich bekomme nicht nur keine Antwort in Zeichenform, sonder rein gar nichts (BytesToRead = 0)
Ich würde mich freuen wenn jemand den Fehler findet, bzw mir einen Hinweis geben kann, der Code ist natürlich gekürzt, die ganzen eingelesen Koordinaten usw habe ich zu Testzwecken durch eine "manuelle" Eingabe ersetzt.
Befehlssyntax ist relativ simpel: POSA 100 $
Fahre auf absolut auf 100mm und gebe $ zurück wenn der Punkt erreicht ist
SerialPort port1 = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
port1.Handshake = Handshake.XOnXOff;
port1.NewLine = "\x0D";
port1.Open();
Console.Write("Sende an Compax: ");
string befehl = Console.ReadLine();
port1.WriteLine("\x13\x0D" + befehl + "\x0D\x11\x0D");
Console.Write("Empfange: ");
string antwort = port1.ReadLine();
Console.WriteLine(antwort);
//port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
port1.Close();
return antwort;
}
/* static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.Write(indata);
}*/
Grüße, Philipp
Hallo,
probier es mal mit dem Template SerialPort um zu sehen, was der Controller antwortet. Antwortet der Controller auch mit NewLine am Ende? Siehe SerialPort.ReadLine-Methode
Edit: Ich habe grade gesehen, du hast NewLine auf "\x0D" geändert hast. Trotzdem mal schauen, was er antwortet.
Das Template wird Montag getestet, eher gehts leider nicht...
Die Antwort vom Controller erfolgt laut Handbuch nur mit <CR>, hatte Anfangs den Verdacht dass er mir die Rückgabe nicht anzeigt weil er ständig auf <CR><LF> wartet, hat sich nur leider nicht bestätigt...
port1.NewLine ="\x0D";
Wozu? Es kommen Bytes an. Wenn die Gegenstelle kein 0x0D sendet, dann kommt bei Dir auch "nichts" an.
*Setze SerialPort.ReceivedBytesThreshold auf 1
*setzte den entsprechenden Handler um das Event abzufangen
*fülle im Event einen temporären Puffer mit dem Byte
*wenn das entsprechende Paket voll ist, dann erzeuge ein eigenes Event und kopierst dabei die Werte aus dem temporären Puffer
Dann siehst Du zumindest schon mal ob überhaupt was zurück kommt. Wenn Du Dich auf des NewLine verlässt, siehst Du erst was wenn das NewLine gesendet wurde (wenn es überhaupt gesendet wird).
port1.WriteLine("\x13\x0D" + befehl + "\x0D\x11\x0D");
Wieso teilst Du dem Gerät mit das Du von ihm nichts empfangen willst, sendest dann was und sagst dem Gerät jetzt will ich was von Dir empfangen? Das ist eine eigenwillige Herangehensweise. Die beiden Steuerbefehle brauchst Du nur senden wenn Dein Puffer voll läuft. Ich glaube aber nicht das Du irgend wann auf der PC-Seite Probleme mit einem voll laufenden Puffer hast 😃 Das Problemkind ist eher die andere Seite - und der sagt Dir dann mittels Xon/Xoff ob er noch was von Dir empfangen will.
Ich weis jetzt nicht wie die SerialPort-Implementierung an der Stelle genau aussieht. Ob der SerialPort diese ankommenden Befehle entsprechend selber verarbeitet und Du Dich um nichts kümmern musst. Oder ob die Bytes durch gereicht werden. In letzterem Fall siehst Du bei der Verwendung von "NewLine" aber erstmal nichts. Bis der Xoff Befehl bei Dir angekommen ist, kann es sein das die Gegenseite zu gemacht hat, weil der Empfangspuffer voll ist.
Hänge parallel einen weiteren Rechner an die Datenleitungen und liest die reinen Daten aus. Also Baud & Co müssen passen, aber kein Handshake (weder Soft- noch Hardware!). Anzeigen lassen kannst Du Dir die Daten z.B. mit Term95. Allerdings musst Du aufpassen, Du kannst nur die Daten in einer Richtung sehen. Wenn Du die andere Richtung sehen willst, dann musst Du am parallelen Rechner Rx unt Tx tauschen (oder nimm einen weiteren Rechner/COM-Port ^^).
Ggf. beide GND mit einander verbinden.
hand, mogel
Hallo,
ich habe gerade das unbearbeitete Template getestet. Der Controller sendet immer noch keine Antwort.
Mit der Original-Software bekomme ich eine Antwort und mit Programmen wie Docklight auch.
Ich weiß echt nicht wo der Fehler ist. Hat jemand einen Rat für einen verzweifelten Maschinenbau-Studenten?
Grüße,
Philipp
Verstehe zwar nix von Controllern, sehe aber auch, dass Du keinen Flush nach dem Write aufrufst - vielleicht ist das das Problem.
Hallo,
am besten besorgst du dir einen Serial Port Monitor und siehst dir an warum bei der Original Software eine Antwort kommt und bei dir nicht, bzw wo sich die Pakete unterscheiden.
Du sendest auch beim WriteLine 0xD zweimal am Ende (keine Ahnung ob das so gewollt ist) da das WriteLine das von dir Definierte NewLine erneut anhängt. Wahrscheinlich hast du einen Simplen Fehler in deinem Protokoll, und bekommst deshalb keine Antwort.
Fehler gefunden: Programm(ausschnitt) war in Ordnung, beim Konfigurieren hat er einfach die Hälfte der Parameter verschluckt und dadurch immer ein falsches /anderes Ende-Zeichen gesendet auf das der PC natürlich vergeblich gewartet hat...
Danke für eure Hilfe!