Zusi-TCP-Schnittstelle für .NET

Soundthesizer, Zusitool und andere Zusatzsoftware

Moderatoren: Andreas Damm, Jens Haupert

Nachricht
Autor
Stephan/Taschi
Beiträge: 1050
Registriert: 30.10.2009 11:40:27
Aktuelle Projekte: Zusi boykottieren, gelegentlich mal gesperrt sein

Re: Zusi-TCP-Schnittstelle für .NET

#81 Beitrag von Stephan/Taschi »

Nach dem Reboot = vor dem Reboot.

Wenn ich meine ArduinoAnsteuerung.exe nicht aus VS starte, sondern direkt im Explorer, tritt obige Fehlermeldung allerdings nicht auf resp. wird nicht angezeigt (die Exception tritt wohl in irgendeinem Hintergrundthread auf), stattdessen bekomme ich dann, sobald Zusi das erste Mal Daten sendet, das hier:

Code: Alles auswählen

System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
   bei Zusi_Datenausgabe.ZusiTcpConn.EventMarshal[T](Object o)
Ich würde vermuten, das ist eine Folge des obigen Fehlers?

Andreas Karg
Beiträge: 4718
Registriert: 28.04.2002 12:56:00
Kontaktdaten:

Re: Zusi-TCP-Schnittstelle für .NET

#82 Beitrag von Andreas Karg »

Sorry, mir ist grad völlig schleierhaft, wie das zustandekommen kann.

Stephan/Taschi
Beiträge: 1050
Registriert: 30.10.2009 11:40:27
Aktuelle Projekte: Zusi boykottieren, gelegentlich mal gesperrt sein

Re: Zusi-TCP-Schnittstelle für .NET

#83 Beitrag von Stephan/Taschi »

Andreas Karg hat geschrieben:Sorry, mir ist grad völlig schleierhaft, wie das zustandekommen kann.
Mir auch.

Na ja, nach dem Essen versuche ich mal, das Ganze in einem neuen "sauberen" Projekt zu reproduzieren oder noch besser nicht zu reproduzieren. Danke jedenfalls für die schnelle Antwort.
Zuletzt geändert von Stephan/Taschi am 04.05.2013 21:02:43, insgesamt 1-mal geändert.

Andreas Karg
Beiträge: 4718
Registriert: 28.04.2002 12:56:00
Kontaktdaten:

Re: Zusi-TCP-Schnittstelle für .NET

#84 Beitrag von Andreas Karg »

Mal eben im Netz gefunden:
http://stackoverflow.com/questions/1127 ... onstructor" target="_blank

Das scheint auf dein Problem zuzutreffen. Was passiert, wenn du unter Tools -> Options -> Debugging -> General options "Just My Code" anhakelst?

Nachtrag:
Um nicht nur das Symptom, sondern auch die Ursache des Problems zu beseitigen (und die Schnittstelle noch einen Tick flotter zu machen), kann man die Assembly, die er da nicht findet, auch beim Kompilieren automatisch generieren lassen und mit dem Programm mitliefern. Der Serializer enthält einen Codegenerator, der zunächst nach einer fertigen Assembly sucht, sie nicht findet (-> Ausnahme wird geworfen) und sie dann eben im Betrieb automatisch erzeugt. Vielleicht stell ich das ja mal um.

Wenn das die tatsächliche Ursache ist, deutet die zweite Fehlermeldung darauf hin, dass du für den betreffenden Datentyp das Ereignis nicht abonniert hast. Sollte ich vielleicht mal prüfen und im Fall der Fälle 'ne ordentliche Fehlermeldung schmeißen...
Zuletzt geändert von Andreas Karg am 04.05.2013 21:15:39, insgesamt 1-mal geändert.

Andreas Karg
Beiträge: 4718
Registriert: 28.04.2002 12:56:00
Kontaktdaten:

Re: Zusi-TCP-Schnittstelle für .NET

#85 Beitrag von Andreas Karg »

Neue Version veröffentlicht. Siehe erstes Post.

Es handelt sich dabei größtenteils um ein Bugfix-Release ohne Änderung der Schnittstelle nach außen.

Was ich zukünftig vor habe, für die, die's interessiert:
  • Der Code möchte dringend mal aufgeräumt und besser strukturiert werden.
  • Es bietet sich an, ihn bei der Gelegenheit Unit Test-freundlicher zu gestalten. Dependency Injection ist ein wohl recht populäres Konstrukt, an dem ich mich mal versuchen mag.
  • Ich habe von F. Schn. eine Variante mit eingebautem TCP-Server bekommen. Die habe ich versuchsweise bei mir lokal schon integriert, aber noch nicht getestet. Die dafür nötigen Anpassungen sind so umfangreich, dass es mir sinniger schien, erst aufzuräumen und dann neue Features hinzuzufügen.

Benutzeravatar
Roland Ziegler
Beiträge: 5508
Registriert: 04.11.2001 22:09:26
Wohnort: 32U 0294406 5629020
Kontaktdaten:

Re: Zusi-TCP-Schnittstelle für .NET

#86 Beitrag von Roland Ziegler »

Andreas Karg hat geschrieben:Es bietet sich an, ihn bei der Gelegenheit Unit Test-freundlicher zu gestalten. Dependency Injection ist ein wohl recht populäres Konstrukt, an dem ich mich mal versuchen mag.
Das Konzept stammt wohl von Martin Fowler, einem der Pattern-Päpste. Es gehört zu den Verdiensten von Java, Software-Design per Interface zu gestalten. Der ursprüngliche Anlass war möglicherweise ganz profan: Zirkulare Abhängigkeiten zu vermeiden.

Selbst wenn man es weniger formal handhabt, dieses Pattern dürfte sich in vielem modernen Code wiederfinden, vor allem natürlich in Java und .Net. In .Net kommen neben den klassischen Interfaces häufig auch die Delegates dafür zum Einsatz. C++-Anwender tun sich historisch bedingt schwerer, aber auch in C++ kann man prima mit "pure virtual"-Basisklassen als Interface-Ersatz arbeiten (Virtuellen Destruktor nicht vergessen).

Typischerweise werden solche Abhängigkeiten entweder im Konstruktor oder per Setter in die Frameworkklasse injiziert. Und typischerweise heißen die Setter, wenn als Methode ausgeführt, dann "Register (IMyInterface impl)".

Ein Verwandter ist übrigens das Factory-Pattern.

Es sind solche Aspekte, bei denen sich in der Softwareentwicklung Eleganz und Ästhetik herausbildet,vom praktischen Nutzen einmal ganz abgesehen.

lukmilei
Beiträge: 253
Registriert: 29.03.2010 21:00:15
Kontaktdaten:

Re: Zusi-TCP-Schnittstelle für .NET

#87 Beitrag von lukmilei »

Hallo,

ich möchte gerne einen PZB-Block in mein kleines Fahrpult einbauen. Leider bin ich, was programmieren angeht, nicht ganz so fit. Deshalb verzeiht mir diese wahrscheinlich sehr laienhafte Frage: Wenn ich das richtig verstanden habe, greift dieses Programm hier die benötigten Daten vom TCP-Server ab und sendet sie direkt an den Arduino. Dieser wertet die Daten aus und steuert die jeweilige LED an. Ist das so richtig? Warum kann hier kein komplettes Programm zur Verfügung gestellt werden? Liegt es den unterschiedlichen Arduino Typen oder an den benötigten Daten, die bei jedem Fahrpult anders sind?

Gruß
Lukas

Benutzeravatar
Arne aus dem Norden
Beiträge: 721
Registriert: 25.12.2011 14:28:21
Aktuelle Projekte: Fahrpult VT628/VS928 - Versuch eines Nachbaus
Wohnort: Str.Km "6,8" der Kiel-Schönberger Eisenbahn (DB-Str. 9107)

Re: Zusi-TCP-Schnittstelle für .NET

#88 Beitrag von Arne aus dem Norden »

lukmilei hat geschrieben:Wenn ich das richtig verstanden habe, greift dieses Programm hier die benötigten Daten vom TCP-Server ab und sendet sie direkt an den Arduino.?
Ja.
lukmilei hat geschrieben:Dieser wertet die Daten aus und steuert die jeweilige LED an. Ist das so richtig?
Ja.
lukmilei hat geschrieben:Warum kann hier kein komplettes Programm zur Verfügung gestellt werden?
Weil die Schnittstelle für mehr als nur den Arduino und mehr als z.B. nur die PZB Melder gedacht ist.
lukmilei hat geschrieben:Liegt es den unterschiedlichen Arduino Typen
Nein. So explizit geht die Schnittstelle auch garnicht auf den Arduino ein. Mega und Uno laufen halt damit, der Rest teilweise nicht (Leonardo).
lukmilei hat geschrieben:oder an den benötigten Daten, die bei jedem Fahrpult anders sind?
Eher das. Es gibt wohl keine zwei völlig gleichen Projekte hier ;-)
Aber wie ich dir schon geschrieben habe: mich stört es auch ein wenig, das man an zwei Stellen Schrauben muß (Arduino-IDE und VB.NET) um die Sache zum laufen zu kriegen. Auf den VB.NET Kram hatte ich nie besonders Lust (ich bin mehr Mechaniker als Programmierer).
Deswegen würde ich inzwischen eher den Weg über ein Ethernetshield gehen wenn ich nur den Arduino verwenden will und eher wenig Ahnung habe.
Das kostet nicht viel und man hat nur noch eine Baustelle (den Arduino selbst).
Der Server ist ganz gut dokumentiert, ist schneller durchblickt als wenn man in VB neu einsteigt und eigentlich nur den Zusikrams zum laufen bringen will.
Viele Grüße, Arne
Mein Baubericht von der echten Bahn zum Schönberger Strand:
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/

Benutzeravatar
F. Schn.
Beiträge: 6607
Registriert: 24.10.2011 18:58:26

Re: Zusi-TCP-Schnittstelle für .NET

#89 Beitrag von F. Schn. »

Nun, im Prinzip ist die Schnittstelle für Programme gedacht, die auf dem PC laufen. (Z.B. http://forum.zusi.de/viewtopic.php?p=216431#p216431)
Man kann sie aber auch dazu benutzen, dass Daten an unabhängige externe Mikroprozessoren wie z.B. den Audorino weitergeleitet werden.

Warum braucht man überhaupt dieses Zwischenprogramm?
In der Grundausstattung ist auf dem Audorino kein Netzwerkanschluss eingebaut. Den braucht man aber, damit man sich über das Netzwerkprotokoll TCP mit dem TCP-Server verbinden kann. Es ist allerdings eine Serielle Schnittstelle vorhanden, mit der eine direkte Verbindung mit dem PC hergestellt werden kann. Dabei dient das .Net-Programm als Vermittlungsprogramm. Für diese Serielle Schnittstelle muss man sich ein Protokoll überlegen, mit dem Daten zwischen dem PC und dem Audorino übertragen werden. Eine Idee wäre es, einfach das Zusi-Protokoll zu übernehmen. Dann ist zwar das .Net-Programm relativ klein, aber dann muss man dieses relativ aufwendige Protokoll auf dem Audorino erst mal dekodieren, bevor man es benutzen kann. Hingegen existiert für das .Net-Programm bereits eine DLL, die dem Programmierer die Details des Zusi-Protokolls abnimmt. nonsense (?) als Schreiber des Protokolls hat sich daher dafür entschieden, das das .Net-Programm für die Aufbereitung der Daten zuständig ist, also im Falle von kontinuierlichen Werten (wie z.B. der Geschwindigkeit) die Werte auf den Ausgabebereich des Audorino anpasst. Der Audorino muss dann viel weniger machen. Dafür ist dann das .NET-Programm sehr stark darauf angepasst, was du letzlich an den Audorino anschließen willst - und schließlich will nicht jeder "nur" einen PZB-Würfel als "Fahrpult".

Wenn du ein "komplettes Programm" willst, das mit jeder Audorino-Konfiguration umgehen kann, kann man natürlich auch ein Protokoll entwerfen, das alle von Zusi übermittelten Daten übertragen kann. Das wäre dann weitaus weniger stark an die Ausgabehardware des Audorino angepasst.

Dude schlägt da einen anderen Weg ein. Er hat im Internet eine Netzwerkbuchse gefunden, die man an den Audorino anschließen kann. Problem: Damit alleine ist es nicht getan: So weit ich das richtig verstanden habe, muss er außer dem Zusi-Protokoll auch das TCP-Protokoll noch selbst basteln. Das bedeutet natürlich auch mehr Code auf dem Audorion. Am Ende warten auf einen dann noch ein paar Detailfragen, so muss man z.B. die IP-Addresse des Rechners irgendwie fixieren, mit dem man sich verbinden möchte, und bevor man sich mit einem anderen Rechner verbinden kann, wird man vermutlich den Audorino umprogrammieren müssen. Alles in allem ist es aber doch die irgendwie elegantere Methode, weil man das .NET-Zwischenprogramm nicht mehr braucht und sich direkt mit dem TCP-Server verbinden kann.
Zuletzt geändert von F. Schn. am 09.09.2013 20:53:33, insgesamt 3-mal geändert.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Benutzeravatar
Arne aus dem Norden
Beiträge: 721
Registriert: 25.12.2011 14:28:21
Aktuelle Projekte: Fahrpult VT628/VS928 - Versuch eines Nachbaus
Wohnort: Str.Km "6,8" der Kiel-Schönberger Eisenbahn (DB-Str. 9107)

Re: Zusi-TCP-Schnittstelle für .NET

#90 Beitrag von Arne aus dem Norden »

F. Schn. hat geschrieben:Dude schlägt da einen anderen Weg ein. Er hat im Internet eine Netzwerkbuchse gefunden, die man an den Audorino anschließen kann. Problem: Damit alleine ist es nicht getan: So weit ich das richtig verstanden habe, muss er außer dem Zusi-Protokoll auch das TCP-Protokoll noch selbst basteln. Das bedeutet natürlich auch mehr Code auf dem Audorion.
Nein, so schlimm ist es nicht wirklich. Es braucht keine 10 Zeilen, um sich mit dem Server grundsätzlich zu verbinden. Vom TCP-Protokoll muß man eigentlich garnichts wissen.
F. Schn. hat geschrieben:Am Ende warten auf einen dann noch ein paar Detailfragen
Ja, das fürchte ich allerdings auch. Die Leuchtmelder waren ja vermutlich die leichteste Übung am Anfang...
F. Schn. hat geschrieben:so muss man z.B. die IP-Addresse des Rechners irgendwie fixieren, mit dem man sich verbinden möchte, und bevor man sich mit einem anderen Rechner verbinden kann, wird man vermutlich den Audorino umprogrammieren müssen.
Das stimmt. Ist aber nur ein Anpassen von zwei Zeilen und gemessen an der Konfiguration der .NET <-> Arduino Version noch sehr übersichtlich.
F. Schn. hat geschrieben:Alles in allem ist es aber doch die irgendwie elegantere Methode, weil man das .NET-Zwischenprogramm nicht mehr braucht und sich direkt mit dem TCP-Server verbinden kann.
Interessant dürfte das erst richtig mit Zusi 3 werden, wenn dann alle Ein- und Ausgaben (immerhin 54 I/Os am Mega) direkt verarbeitet werden können...

Ich muß an der Geschichte mal weiterbasteln wenn jetzt die Tage wieder kürzer werden. Ich wollte das Script noch aufräumen und eine Funktion für die Tachoausgabe einbauen bevor ich es hier veröffentliche...
Mein Baubericht von der echten Bahn zum Schönberger Strand:
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/

lukmilei
Beiträge: 253
Registriert: 29.03.2010 21:00:15
Kontaktdaten:

Re: Zusi-TCP-Schnittstelle für .NET

#91 Beitrag von lukmilei »

Danke schon mal für die Antworten.

Ich habe den Vorteil, dass ich erstmal nur die PZB Ausgabe über den Arduino laufen lassen will. Die Eingabe wird erstmal weiterhin über ein altes Gamepad geschehen. Dadurch wird die Programmierung (hoffe ich :whatever ) nicht soo umfangreich.

Lukas

Benutzeravatar
F. Schn.
Beiträge: 6607
Registriert: 24.10.2011 18:58:26

Re: Zusi-TCP-Schnittstelle für .NET

#92 Beitrag von F. Schn. »

Hallo,

obwohl sich jetzt langsam die Anzeichen mehren, dass die Restlebensdauer von Zusi 2 sich möglicherweise doch allmählich dem Ende nähert, habe ich mir noch einmal Andreas Code angeschaut, und meinen Ausbau zu einem TCP-Server mal funktionsfähig gemacht.

Sobald Andreas es online stellt, könnt ihr euch also einen "neuen" (experimentellen) TCP-Server herunterladen. Er ist noch ohne Benutzeroberfläche, sondern erst einmal nur ein Konsolenprogramm / Konsolenbeispiel. (Das Beispiel befindet sich im Ordner "examples/cs/ServerTest1".) Ich würde mich aber freuen, wenn sich jemand freiwillig meldet, eine graphische Oberfläche für den Server zu erstellen. :)

So, was kann der Server denn alles? Als erstes mal, ich habe noch nicht getestet, was alles läuft. Auf jeden fall funktionieren Programme, die mit der selben Version der DLL laufen, außerdem funktioniert das Verbinden von Zusi* und der Soundthizer.

* Nach einem Neustart von Zusi schlägt der 1. Verbindungsverschuch im Moment immer fehl, offenbar ist es der selbe Fehler, der hier beschrieben ist. Einfach noch mal versuchen.

Aber es gibt auch Dinge, die der Server kann, und der alte Server nicht. Dazu gehört das "Späte verbinden". Beim alten TCP-Server werden Verbindungen ja grundsätzlich abgelehnt, wenn der Server bereits verbunden ist. Dieses Kriterium wurde mit diesem Server leicht aufgeweicht. Programme können sich jetzt auch nach Zusi verbinden, dürfen dann jedoch keine IDs anfordern, die nicht bereits von Zusi angefordert wurden. (Der zugehörige Fehlercode, den ich in so einem Fall sende, lautet 4/3. Alte Programme melden in so einem Fall vermutlich einen "Unbekannten Fehler" beim Verbinden.)

Das gaze geht sogar so weit, dass man dem Server sagen kann, dass er einfach alle (ihm bekannten) IDs von Zusi anfordern soll. Damit ist die Verbindungsreinfolge dann vollständig egal. So wurde es beispielsweise in dem oben beschiebenen "example" gelöst.

Ich plane noch eine Möglichkeit, Zusi über Windows Messages Befehle zu geben. Dazu jedoch, wenn es so weit ist. (Solange Zusi 3 mich nicht einholt.)

In der Hoffnung, dass der Server in der Restlebensdauer von Zusi 2 noch nützlich seien möge

F. Schn.

Edit: Hier ist der Link: Git
Zuletzt geändert von F. Schn. am 09.07.2014 14:28:19, insgesamt 1-mal geändert.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

<Bernd>
Beiträge: 152
Registriert: 21.01.2008 10:01:35
Aktuelle Projekte: Warten auf ...
Wohnort: Windeck/Sieg- RE9 Bhf Schladern

Re: Zusi-TCP-Schnittstelle für .NET

#93 Beitrag von <Bernd> »

F. Schn. hat geschrieben: Ich würde mich aber freuen, wenn sich jemand freiwillig meldet, eine graphische Oberfläche für den Server zu erstellen. :)
Du hast Post !
Grüsse von Bernd

Antworten