|
ones |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 14
|
 |
|
 |
Anmeldedatum: 02.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 07.09.2010, 20:16
Titel:
|
 |
cool ich bin gespannt.
Aufjedenfall schonmal 1000-dank!
|
|
|
|
|
Linus |

Forum-Fortgeschrittener
|
 |
Beiträge: 69
|
 |
|
 |
Anmeldedatum: 30.08.10
|
 |
|
 |
Wohnort: Aachen
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 07.09.2010, 20:23
Titel:
|
 |
Also, das problem mit
ist, dass man die Ausgabe erst am Ende bekommt, und system bis dahin blockiert. Ist dir aufgefallen, hab ich auch so erwartet, ist dumm. Entweder also man startet telnet wirklich so auf ner Kommandozeile, dass es irgendwohin piped, und liest das dann aus MATLAB (named pipes sind das glaub ich):
Oder aber, man machts echt mit dem TCPIP Objekt. Bitte versuch doch mal:
Versuch das mal in die Richtung, hab das Beispiel von hier genommen:
http://www.mathworks.com/help/toolb.....6TM9tRQPnQgtFdZm2CGrzxxSs!448746820
_________________
RWTH - Mindstorms NXT Toolbox - free & open source
|
|
|
Linus |

Forum-Fortgeschrittener
|
 |
Beiträge: 69
|
 |
|
 |
Anmeldedatum: 30.08.10
|
 |
|
 |
Wohnort: Aachen
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 07.09.2010, 21:28
Titel:
|
 |
Jawoll, der Code funktioniert. Leider braucht man wohl die Instrument Control Toolbox. Die Daten sind noch nicht perfekt formatiert, aber da muss man halt nen bisschen rumpuzzlen:
Die Antwort auf der Kommandozeile lautet (und ja, die Daten kommen live mit ms-Verzögerung rein):
_________________
RWTH - Mindstorms NXT Toolbox - free & open source
|
|
|
ones |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 14
|
 |
|
 |
Anmeldedatum: 02.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.09.2010, 12:40
Titel:
|
 |
Das höhrt sich ja interessant an das ganze.mir ist nur nicht ganz klar an welcher stelle mein Code ausgeführt wird. Den muss ich ja irgendwie manuell starten?
Oder macht das sinn das script beim starten des Controllers automatisch zu starten?
Instrument Toolbox ist vorhanden, ich bin mir bloß beim Umgang damit nicht ganz sicher. Ich hab heute leider keine Zeit mal ein bischen zu spielen, aber morgen komme ich dazu,d ann sag ich bescheid was rauskommt.
Herzlichen dank für Deinen Einsatz!
|
|
|
Linus |

Forum-Fortgeschrittener
|
 |
Beiträge: 69
|
 |
|
 |
Anmeldedatum: 30.08.10
|
 |
|
 |
Wohnort: Aachen
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.09.2010, 13:37
Titel:
|
 |
|
 |
|
ones hat Folgendes geschrieben: |
Das höhrt sich ja interessant an das ganze.mir ist nur nicht ganz klar an welcher stelle mein Code ausgeführt wird. Den muss ich ja irgendwie manuell starten?
|
Sorg dafür, dass der Telnet-Server auf dem Controller läuft, und dass du dich dorthin verbinden kannst. Wenn es mit Putty geht, geht es mit diesem MATLAB-Programm aus dem Beispiel oben auch.
Im Idealfall fängt der Telnet-Server direkt an Daten zu senden, sobald die Verbindung da ist. So einfach wird das wohl dann doch nicht...
ones hat Folgendes geschrieben: |
Oder macht das sinn das script beim starten des Controllers automatisch zu starten?
|
Weiß ich nicht, könnte sein, muss aber nicht. Ich denke das offensichtlichste ist jetzt:
1.) Controller ist an, Skript läuft aber nicht, Telnet ist verfügbar
2.) MATLAB Programm nutzt TCPIP Objekt wie oben angegeben, verbindet sich zum Controller.
3.) Controller sendet Text wie "blabla welcome", gefolgt von einer Konsole: "user@controller~:" oder so.
4.) Du sendest den Command zum Starten des Skripts als String: "./meinskript" + CRLF. (CRLF ist quasi Enter).
5.) Jetzt müssten die Daten als Text reinkommen, wie du sie sonst über Putty siehst.
6.) Problem: Daten richtig zuordnen. Aufsammeln kannst du sie, aber du musst sie parsen, also richtig erkennen: "ah, altes Stück zu Ende, neuer Messwert jetzt". Recht einfach, wenn du z.B. ein ; zwischen den Werten hast oder so...
ones hat Folgendes geschrieben: |
Instrument Toolbox ist vorhanden, ich bin mir bloß beim Umgang damit nicht ganz sicher. |
Versuch einfach den Code oben zu kopieren und auszuführen, und lies die Doku des TCPIP Objekts. Dann sehen wir weiter!
_________________
RWTH - Mindstorms NXT Toolbox - free & open source
|
|
|
ones |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 14
|
 |
|
 |
Anmeldedatum: 02.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.09.2010, 17:49
Titel:
|
 |
Hi Linus, ich hab heute mal ein bischen rumprobiert ob das geht, bin aber leider nicht weitergekommen. Hatte es gemacht wie Du geschrieben hast. Ich denke dass der login auf dem Controller irgendwie schief geht. Zuerst hatte ich nur dass hier versucht:
es kam aber keine Rückmeldung vom Controller in irgendeiner Form. Im Test&Measurement Tool wurde aber der Status open angezeigt.
Zum aufbau der Telnetverbindung muss ich immer nen user und pw dazu eingeben. deshalb habe ich versucht ihm dass so klar zu machen:
Das mochte er aber irgendwie auch nicht weil er CRLF nicht kennt. Ich hab dann en bischen geschaut und drauf gekommen dass man das einstellen kann was er als return benutzt und habs dann mit LF und CR jeweils probiert, wollte er aber auch nicht haben.
Hast Du ne Idee an was es gelegen haben könnte?
Gruß, Stefan
|
|
|
Linus |

Forum-Fortgeschrittener
|
 |
Beiträge: 69
|
 |
|
 |
Anmeldedatum: 30.08.10
|
 |
|
 |
Wohnort: Aachen
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 10.09.2010, 14:00
Titel:
|
 |
|
 |
|
ones hat Folgendes geschrieben: |
Zuerst hatte ich nur dass hier versucht:
es kam aber keine Rückmeldung vom Controller in irgendeiner Form.
|
Dem Controller "an sich" merkst du das nicht an. Hast du überprüft, ob der Controller dir was sendet? z.B. müsste das mit diesem Code passen. Da sollte dann was erscheinen im Command window, sowas wie "login as".
ones hat Folgendes geschrieben: |
Im Test&Measurement Tool wurde aber der Status open angezeigt.
|
Das ist richtig. Wenn deine Verbindung t open ist, dann passiert erstmal gar nichts, aber Daten kommen an und landen in irgendwelchen Puffern.
Das ist jetzt ein Missverständnis. Die "Enter"-Taste sendest du als Steuerzeichen CR & LF, google das ruhig. Auf Linux evtl. nur LF. Der MATLAB-Code sähe dafür ungefährt so aus:
ones hat Folgendes geschrieben: |
Zum aufbau der Telnetverbindung muss ich immer nen user und pw dazu eingeben. deshalb habe ich versucht ihm dass so klar zu machen:
|
Kann man die Authentifizierung nicht auf dem Linux irgendwo ausschalten?
Oder guck mal in der Instrument Control Toolbox Hilfe nach, ob da nicht was zu Telnet steht und ob die nicht die automatische Möglichkeit haben, da Username und Passwort einer MATLAB Funktion zu übergeben. Schau dir einfach alle Befehle an, die die Toolbox so bietet!
ones hat Folgendes geschrieben: |
Das mochte er aber irgendwie auch nicht weil er CRLF nicht kennt. Ich hab dann en bischen geschaut und drauf gekommen dass man das einstellen kann was er als return benutzt und habs dann mit LF und CR jeweils probiert, wollte er aber auch nicht haben.
Hast Du ne Idee an was es gelegen haben könnte?
|
Jo, siehe oben, Stichwort ASCII codes, das dürfte so etwas besser hinhauen.
Ein Problem bis jetzt: Du musst ne Art "Ping Pong" / "Tennis" implementieren, bevor es losgeht.
Controller sendet Dir (wahrscheinlich): "Hallo, wer bist du?", dann du "Username", dann er "Passwort?", dann du "geheim", dann er "ok, logged in, was willst du?", dann du "script starten", dann er "hier kommen die Messwerte".
D.h. du musst im Wechsel deine Verbindung lesen und die richtigen Antworten senden. Dann hast du es geschafft, und kannst nur die Messwerte empfangen.
Schau also genau, wann du was mit fprintf() schreibst, und wann du was liest mit fread().
Du kannst zum Testen mal mit dem GMX POP-Server sprechen (siehe mein Beispiel oben), wenn du dem "HELP" gefolgt von CR LF schickst, müsste der dir ne Antwort schicken...
_________________
RWTH - Mindstorms NXT Toolbox - free & open source
|
|
|
ones |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 14
|
 |
|
 |
Anmeldedatum: 02.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 14.09.2010, 16:05
Titel:
|
 |
HI Linus, ich bin leider immer noch nicht weitergekommen. Ich schreib Dir nochmal ganz genau wie ich vorgehe und was dabei rauskommt.
Also: Ich definiere und öffne die TCP verbindung:
mit instrfind
sagt er mir dann:
wenn ich mir mit fread(t, t.BytesAvailable) die Bytes anschaue bekomme ich:
da ich mit den Zahlen nichts anfangen kann gehe ich mal davon aus dass es sich um die login Anforderung
handelt
aha, also keine Bytes mehr verfügbar.
Ich sende ihm:
worauf hin ich ja von ihm die Passwortanforderung erwarten würde. Jedoch ganz egal was ich ihm auch sende, die BytesAvailable bleiben immer 0.
Ich habe nur char(13) genommen da das CR entspricht, was ja der Terminator ist. Ich hatte es auch in LF und CR/LF geändert, jedoch immer das gleiche Ergebnis. Ich hoffe mal Du hast noch ne Idee.
Gruß,
Stefan
|
|
|
Linus |

Forum-Fortgeschrittener
|
 |
Beiträge: 69
|
 |
|
 |
Anmeldedatum: 30.08.10
|
 |
|
 |
Wohnort: Aachen
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 14.09.2010, 16:55
Titel:
|
 |
|
 |
|
Das ist alles schade und ärgerlich. Die unleserlichen Bytes sollten eigentlich ASCII-Code sein, hätte ich mal gedacht. Du müsstest sie eigentlich mit char() leserlich machen können. In deinem Fall kommt da aber echt nix cooles raus... Wäre die Frage, ob es nicht doch SSH ioder irgendwie verschlüsselt?
Man müsste mal nach dem Telnet-Protokoll googlen (Stichwort RFC) und gucken, wie das funktioniert.
Deinen Versuch mit dem CR / LF hätte ich auch ausprobiert. Komisch dass das so gar nich klappt
Egal, was ich jetzt machen würde:
1.) Mir Wireshark besorgen ( http://www.wireshark.org/ ) und mal gucken, was passiert, wenn man sich mit nem funktionierenden Telnet-Client (wie z.B. Putty) verbindet. Das dann in MATLAB nachbauen. Es kann nicht so wild sein, du bist ganz nah dran.
2.) Sich sonst irgendwie einen Proxy / Tunnel bauen, der einfach TCP Daten empfängt und weiterreicht, und dabei aufschreibt welche Daten. Das scheint leider in MATLAB nicht so einfach zu gehen... Ist aber z.B. mit Hochsprachen wie VB / C# oder so recht einfach (wenn man dann weiß wie).
Insofern bleibt nur 1., und vielleicht echtmal Telnet-Protokoll-Zeugs nachlesen (ist aber viel). Es sollte doch eigentlich möglich sein, mit Wireshark aufzunehmen was in der Leitung abgeht und dass dann aus MATLAB zu emulieren (Replay quasi).
_________________
RWTH - Mindstorms NXT Toolbox - free & open source
|
|
|
ones |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 14
|
 |
|
 |
Anmeldedatum: 02.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 20.09.2010, 17:00
Titel:
|
 |
|
 |
|
Hi Linus, ich bin zwischenzeitlich etwas weiter gekommen. Ich hab das ganze jetzt doch mit udp-sockets gemacht. Es gibt für Matlab die TCP/UDP Toolboxhttp://www.mathworks.com/matlabcentral/fileexchange/345 damit sammle ich ganz einfach udp datagramme welche ich mit nem C++ Code generiere. Das funktioniert wunderbar soweit.
Ich empfange in Matlab ein char in welchem meine Daten stehen. Jetzt bin ich mir bloß unsicher wie ich weiter machen soll. Ich habe 6Ports die ich auslese und jeweils 3 Messwerte. Meine Idee war jetzt die Daten in der Form zu senden: U1220.0I10.45P180 als ein zeichen. das nächste zeichen wäre dann sowas wie U2220.1I20.34P289 usw. Das müsste ich ja dann aber in Matlab zerlegen. Nur wie?
Und wenn ich dann lauter einzelne Werte habe, gibt es ne möglichkeit ne if-abfrage der ersten beiden zeichen, also U1, I1 ect. zumachen damit ich die Werte für die Weiterverarbeitung auseinander halten kann?
edit:
Evtl wäre es auch ne Option dass ich einfach die Messwerte nacheinander schicke und dann nur die beiden ersten zeichen abtrenne und teste was für ein wert vorliegt. Also mach ich aus U1220.4 U1 und 220.4 und mach dann ne abfrage if(erste 2 Zeichen = U1){do..
Geht sowas?
Gruß,
Stefan
|
|
|
Linus |

Forum-Fortgeschrittener
|
 |
Beiträge: 69
|
 |
|
 |
Anmeldedatum: 30.08.10
|
 |
|
 |
Wohnort: Aachen
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 21.09.2010, 13:12
Titel:
|
 |
|
 |
|
ones hat Folgendes geschrieben: |
Hi Linus, ich bin zwischenzeitlich etwas weiter gekommen. Ich hab das ganze jetzt doch mit udp-sockets gemacht. Es gibt für Matlab die TCP/UDP Toolboxhttp://www.mathworks.com/matlabcentral/fileexchange/345 damit sammle ich ganz einfach udp datagramme welche ich mit nem C++ Code generiere. Das funktioniert wunderbar soweit.
|
Ok, auch gut. UDP ist übrigens nicht "reliable", das heißt die Zustellung / Reihenfolge der Datagramme wird nicht garantiert. Bei einer lokalen Verbindung wie deiner wirst du zwar in 99.9% der Fälle nichts merken, aber Gedanken über den Fall, dass ein Paket 2mal auftaucht oder verloren geht, solltest Du dir machen (also ob das ok ist). Ansonsten kansnt du das rausfinden, indem du z.B. die Pakete durchnummerierst.
ones hat Folgendes geschrieben: |
Ich empfange in Matlab ein char in welchem meine Daten stehen.
|
Nur um Missverständnissen vorzubeugen: Du empfängst einen String, also mehrere Chars.
ones hat Folgendes geschrieben: |
Jetzt bin ich mir bloß unsicher wie ich weiter machen soll. Ich habe 6Ports die ich auslese und jeweils 3 Messwerte. Meine Idee war jetzt die Daten in der Form zu senden: U1220.0I10.45P180 als ein zeichen. das nächste zeichen wäre dann sowas wie U2220.1I20.34P289 usw. Das müsste ich ja dann aber in Matlab zerlegen. Nur wie?
Und wenn ich dann lauter einzelne Werte habe, gibt es ne möglichkeit ne if-abfrage der ersten beiden zeichen, also U1, I1 ect. zumachen damit ich die Werte für die Weiterverarbeitung auseinander halten kann?
|
Ich denke, das ist jetzt ein neues Problem, für das sich ein neuer Thread lohnen würde. Außerdem sind das eher "MATLAB-Grundlagen", ich würde dir z.B. empfehlen, mal die String-Funktionen durchzuschauen. Da gibts in der Hilfe unter dem Punkt MATLAB, Programming Fundamentals, Examples den Bereich "Characters and Strings", da kriegst du Ideen welche String-Funktionen du brauchst.
ones hat Folgendes geschrieben: |
edit:
Evtl wäre es auch ne Option dass ich einfach die Messwerte nacheinander schicke und dann nur die beiden ersten zeichen abtrenne und teste was für ein wert vorliegt. Also mach ich aus U1220.4 U1 und 220.4 und mach dann ne abfrage if(erste 2 Zeichen = U1){do..
Geht sowas?
|
Ja, klar geht sowas, und du musst jetzt rausfinden wie das geht . Wie gesagt, zur Not nen neuen Thread.
Die Idee, die Du hier erklärst, könntest du ausprobieren, denke das klappt dann...
Weiter viel Erfolg!
_________________
RWTH - Mindstorms NXT Toolbox - free & open source
|
|
|
ones |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 14
|
 |
|
 |
Anmeldedatum: 02.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 21.09.2010, 13:24
Titel:
|
 |
Hi Linus,
habs zwischenzeitlich geregelt. ich kann mit data(x) auf das jeweilige Element zugreifen, und da ich ja weiß was für einen String ich sende kann ich dann ganz easy mit sprintf() meine Werte wieder zusammensetzen.
ich schicke vom Controller her schon ne Controllnummer mit, so dass ich auch weiß welchen wert ich gerade habe. Wenn dann mal ein Packet untergeht, dann muss das Modell für welches die Werte Bestimmt sind eben ein paar ms warten. TCP muss nicht unbedingt sein.
Ich danke Dir echt nochmal für Deine Hilfe!
gruß aus Ka.
|
|
|
Rocky1 |

Forum-Newbie
|
 |
Beiträge: 5
|
 |
|
 |
Anmeldedatum: 26.11.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 16.10.2014, 08:14
Titel: Daten TCP deserialisieren
|
 |
Hallo zusammen,
ich schreibe hier da mein Problem thematisch gut in den Thread passt, da
ich ein Problem mit einer TCP Schnittstelle habe. Ich möchte von einem anderen Programm die Daten über TCP in Matlab einlesen. Das Programm stellt die Messwerte zur Verfügung. Ich habe mit tcpip eine Verbindung aufgebaut und kann auch Zahlen einlesen. Allerdings haben diese Zahlen nichts mit den Werten zu tuen die eigentlich ausgegeben werden müssten. Es werden immer Datenblöcke mit einer Größe von 184 Byte versendet. Diese enthalten die Werte und sind vom Typ double, bool und int. In Matlab muss ich die ankommenden Daten wieder deserialisieren. Leider weiß ich nicht wie das geht. Kann mir da jemand weiterhelfen?
Vielen Dank für eure Hilfe
|
|
|
|
Gehe zu Seite Zurück 1, 2
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|