Laden...

[erledigt] Fehlende Antwort von Controller über RS232

Erstellt von PhilippU vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.606 Views
P
PhilippU Themenstarter:in
4 Beiträge seit 2013
vor 10 Jahren
[erledigt] Fehlende Antwort von Controller über RS232

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

190 Beiträge seit 2012
vor 10 Jahren

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.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

P
PhilippU Themenstarter:in
4 Beiträge seit 2013
vor 10 Jahren

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...

156 Beiträge seit 2010
vor 10 Jahren
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

P
PhilippU Themenstarter:in
4 Beiträge seit 2013
vor 10 Jahren

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

W
872 Beiträge seit 2005
vor 10 Jahren

Verstehe zwar nix von Controllern, sehe aber auch, dass Du keinen Flush nach dem Write aufrufst - vielleicht ist das das Problem.

C
258 Beiträge seit 2011
vor 10 Jahren

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.

P
PhilippU Themenstarter:in
4 Beiträge seit 2013
vor 10 Jahren

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!