Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

Da immer mehr Zusi User von einem 1:1 Führerstand mit träumen, soll es zumindest an Datenaustausch nicht hapern.
Nachricht
Autor
Mike B.
Beiträge: 13
Registriert: 14.09.2015 18:36:32

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#181 Beitrag von Mike B. »

Es ist ja schon ein Segen das es jemand geschafft hat einen Arduino direkt lauffähig zu bekommen mit Zusi3,

gibt es eine möglichkeit dieses Arduino Script downzuloaden?
Ich fummel die ganze Zeit rum meinen 110er Führerstand ans laufen zu bekommen.

Lg
Mike

L-Vosje
Beiträge: 19
Registriert: 01.03.2016 23:07:40

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#182 Beitrag von L-Vosje »

Mike B. hat geschrieben: gibt es eine möglichkeit dieses Arduino Script downzuloaden?
Wenn Sie unser Programm meine, kein Problem, aber Sie müssen noch warten, wir haben eine Störung auf der Website.
Wir sind keine erfahrenen Programmierer und das Programm ist noch nicht fertig.

L-Vosje
Beiträge: 19
Registriert: 01.03.2016 23:07:40

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#183 Beitrag von L-Vosje »

Unser Script finden Sie hier.

http://www.l-vosje.nl/html/arduino_script.html" target="_blank

Vielleicht ist es auch für andere nützlich.
Zuletzt geändert von L-Vosje am 03.07.2016 20:27:58, insgesamt 1-mal geändert.

Benutzeravatar
Carsten Hölscher
Administrator
Beiträge: 33384
Registriert: 04.07.2002 00:14:42
Wohnort: Braunschweig
Kontaktdaten:

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#184 Beitrag von Carsten Hölscher »

Hab mir die Beschleunigungswerte angeschaut und da war ein Rechenfehler drin. Ist in der nächsten Version korrigiert.

Carsten

L-Vosje
Beiträge: 19
Registriert: 01.03.2016 23:07:40

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#185 Beitrag von L-Vosje »

@Carsten

Danke für die info.

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: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#186 Beitrag von Arne aus dem Norden »

L-Vosje hat geschrieben:Unser Script finden Sie hier.
http://www.l-vosje.nl/html/arduino_script.html" target="_blank
Vielleicht ist es auch für andere nützlich.
Hi,

der Link gibt leider nur noch ein

Not Found
The requested URL /html/arduino_script.html was not found on this server.
Mein Baubericht von der echten Bahn zum Schönberger Strand:
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/

L-Vosje
Beiträge: 19
Registriert: 01.03.2016 23:07:40

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#187 Beitrag von L-Vosje »

Seltsam, aber es sollte jetzt funktionieren.

http://www.l-vosje.nl/html/arduino_script.html" target="_blank

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: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#188 Beitrag von Arne aus dem Norden »

Ja,

sieht gut aus, läuft wieder. Vielen Dank.
Mein Baubericht von der echten Bahn zum Schönberger Strand:
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/

Benutzeravatar
Jeff Becker
Beiträge: 364
Registriert: 16.05.2015 10:26:52
Aktuelle Projekte: Fahrpultbau, mich mit Blender anfreunden und über eine CFL Strecke für Zusi träumen...

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#189 Beitrag von Jeff Becker »

Hallo Zusianer, ich habe heute mal alle meine neuen Leuchtmelder ans Pult angschlossen, einfach super. Jedoch habe ich noch immer die Verzögerung der PZB. Und absofort wenn sich der Wert der PZB ändert dh von 85 ins wechselblinken, etc... dann verzögern sich auch die Leuchtmelder. Deswegen meine Frage gibt es derzeit schon ein neues Script was den Zusi3 Server benutzt? Denn momentan fahre ich über das Script von Arne aus dem Norden + den Converter von F. Schn

Mit freundlichen Grüßen Jeff
Mein Projekt: Mein eigenes Fahrpult. Schaut doch mal vorbei
https://m.youtube.com/channel/UCrpDMup3YWCyJkPzLzLuf2w

Gero
Beiträge: 71
Registriert: 30.04.2014 12:49:56
Aktuelle Projekte: Fahrpult Wittenberger / IC Steuerwagen

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#190 Beitrag von Gero »

Hallo zusammen,

ich stehe total auf dem Schlauch...

Code: Alles auswählen

if (c == 100) {                        
     //    Serial.print(c);Serial.print("---->");
     n = 0;
     do {
      x = client.read();
      if (n == 27 ) { //|| n==41 || n==48 || n==55 // 27=lamp 34=toeter
       //Serial.print(x);
       //Serial.print(" ");
       if (x == 1) Serial3.println("L1B"); // Sifa aan
       if (x == 0) Serial3.println("L1b"); // Sifa uit
      }
      if (n == 34 ) { //|| n==41 || n==48 || n==55 // 27=lamp 34=toeter
       
      }
      n++;
     }
     while (x != 255);
     //   Serial.println();
     // positie 27 is lampje SIFA/0 is uit/1 is aan
     // positie 34 0 is uit/1 is waarschuwingssignaal/3 is dwangremming
    }
Wie kommt man jetzt auf diese 27 bzw. 34 Male, die mein Ardunio die von Zusi gesendeten Daten ignoriert, bevor er etwas damit anfängt?

Gero
Zuletzt geändert von Gero am 05.01.2017 16:08:59, insgesamt 1-mal geändert.

Benutzeravatar
Johannes
Beiträge: 3197
Registriert: 14.03.2009 22:36:06
Aktuelle Projekte: Zusitools (http://git.io/zusitools)

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#191 Beitrag von Johannes »

Anscheinend liest das Skript das Zusi-3-Datenpaket "Status Sifa" nicht strukturiert aus, sondern behandelt es als Folge von Bytes. Wenn man Glueck hat, steht dort tatsaechlich als 28. Byte der Status des Leuchtmelders und als 35. Byte der Status der Hupe. Sobald sich aber Zusi entscheidet, die Knoten in einer anderen Reihenfolge zu senden (was erlaubt ist), oder sobald man eine Sifa-Bauart mit laengerem Namen hat (der Name wird auch uebertragen), loest sich diese Rechnung in Luft auf.

Bild

Fazit: Bitte so nicht programmieren :)

Gero
Beiträge: 71
Registriert: 30.04.2014 12:49:56
Aktuelle Projekte: Fahrpult Wittenberger / IC Steuerwagen

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#192 Beitrag von Gero »

Hmm...

bekomme bei Zusi auf der passenden Sifa folgendes:
Byte : Byte : 0 Wert : 0 //Erstes immer unbrauchbar
Byte : 1 Wert : 16 //Länge des Attributs in Byte (niedrigstes Byte zuerst)
Byte : 2 Wert : 0 // "
Byte : 3 Wert : 0 // "
Byte : 4 Wert : 0 // "
Byte : 5 Wert : 1 // ID niedrigeres Byte
Byte : 6 Wert : 0 // ID höheres Byte
Byte : 7 Wert : 90 //Z (Beginn Wert des Attributs)
Byte : 8 Wert : 101 //e
Byte : 9 Wert : 105 //i
Byte : 10 Wert : 116 //t
Byte : 11 Wert : 45 //-
Byte : 12 Wert : 90 //Z
Byte : 13 Wert : 101 //e
Byte : 14 Wert : 105 //i
Byte : 15 Wert : 116 //t
Byte : 16 Wert : 45 //-
Byte : 17 Wert : 83 //S
Byte : 18 Wert : 105 //i
Byte : 19 Wert : 102 //f
Byte : 20 Wert : 97 //a

Byte : 21 Wert : 3 //Länge des nächsten Attributs in Byte
Byte : 22 Wert : 0 // "
Byte : 23 Wert : 0 // "
Byte : 24 Wert : 0 // "
Byte : 25 Wert : 2 //ID niedrigeres Byte --> Beginn von ID2
Byte : 26 Wert : 0 //ID höheres Byte
Byte : 27 Wert : 0 //Wert (= 0)

Byte : 28 Wert : 3 //Länge des nächsten Attributs in Byte
Byte : 29 Wert : 0 // "
Byte : 30 Wert : 0 // "
Byte : 31 Wert : 0 // "
Byte : 32 Wert : 3 //ID niedrigeres Byte --> ID3
Byte : 33 Wert : 0 //ID höheres Byte
Byte : 34 Wert : 0 //Wert (=0)

Byte : 35 Wert : 3 //Länge des nächsten Attributs in Byte
Byte : 36 Wert : 0 // "
Byte : 37 Wert : 0 // "
Byte : 38 Wert : 0 // "
Byte : 39 Wert : 4 //ID niedrigeres Byte --> ID4
Byte : 40 Wert : 0 //ID höheres Byte
Byte : 41 Wert : 2 //Wert (=2)

Byte : 42 Wert : 3 //Länge des nächsten Attributs in Byte
Byte : 43 Wert : 0 // "
Byte : 44 Wert : 0 // "
Byte : 45 Wert : 0 // "
Byte : 46 Wert : 5 //ID niedrigeres Byte --> ID5
Byte : 47 Wert : 0 //ID höheres Byte
Byte : 48 Wert : 2 //Wert (=2)

Byte : 49 Wert : 3 //Länge des nächsten Attributs in Byte
Byte : 50 Wert : 0 // "
Byte : 51 Wert : 0 // "
Byte : 52 Wert : 0 // "
Byte : 53 Wert : 6 //ID niedrigeres Byte --> ID6
Byte : 54 Wert : 0 //ID höheres Byte
Byte : 55 Wert : 2 //Wert (=2)
Byte : 56 Wert : 255 //255 = Ende der Übertragung
Sollte jetzt soweit stimmen, oder?

Gero
Zuletzt geändert von Gero am 06.01.2017 16:12:37, insgesamt 5-mal geändert.

Benutzeravatar
Johannes
Beiträge: 3197
Registriert: 14.03.2009 22:36:06
Aktuelle Projekte: Zusitools (http://git.io/zusitools)

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#193 Beitrag von Johannes »

Ich habe dir das mal richtig kommentiert:
Byte : 0 Wert : 0 // das zweite Byte der Knoten-ID "Status Sifa" (0x0064, uebertragen als 0x64 0x00); das erste Byte ist dasjenige, das in der ersten Zeile auf c = 100 (=0x64) verglichen wird

Byte : 1-4 Wert : 16 0 0 0 // Laenge des ersten Attributs inkl. ID: 16
Byte : 5-6 Wert : 1 0 // ID des Attributs: 0x0001 -> Bauart Sifa
Byte : 7-20 // Es folgen 14 Bytes (16 Bytes Laenge - 2 Bytes Laenge der ID), die den Wert des Attributs darstellen.

Byte : 21-24 Wert : 3 0 0 0 // Laege des zweiten Attributs inkl. ID: 3
Byte : 25-26 Wert : 2 0 ID des Attributs: 0x0002 -> Status Leuchtmelder
Byte : 27 Wert : 0 //Wert = 0

[...]

Byte : 56-59 Wert : 255 255 255 255 // Es folgt kein weiteres Attribut, sondern der Knoten ist zu Ende -> 0xffffffff
Wenn man eine Zeit-Weg-Sifa verwendet, dann ist der Name ein Zeichen kuerzer, das erste Attribut schon bei Byte 19 zu Ende und der Leuchtmelderstatus steht in Byte 26.

Lies dir bitte mal in der Doku Kapitel 11.3.1 durch, um zu verstehen, wie das Datenformat aufgebaut ist. Anhand dieses Scripts kann man das nicht sinnvoll lernen.

(Edit: Der vorherige Beitrag wurde nachtraeglich stark editiert, jetzt stimmt er einigermassen :))
Zuletzt geändert von Johannes am 06.01.2017 17:42:17, insgesamt 3-mal geändert.

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

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#194 Beitrag von F. Schn. »

Ich verlinke mal meine Gedanken für eine alternative Loop-Implentierung:

http://forum.zusi.de/viewtopic.php?p=263157#p263157" target="_blank
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

L-Vosje
Beiträge: 19
Registriert: 01.03.2016 23:07:40

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#195 Beitrag von L-Vosje »

Gero hat geschrieben:Hallo zusammen,

ich stehe total auf dem Schlauch...

Code: Alles auswählen

if (c == 100) {                        
     //    Serial.print(c);Serial.print("---->");
     n = 0;
     do {
      x = client.read();
      if (n == 27 ) { //|| n==41 || n==48 || n==55 // 27=lamp 34=toeter
       //Serial.print(x);
       //Serial.print(" ");
       if (x == 1) Serial3.println("L1B"); // Sifa aan
       if (x == 0) Serial3.println("L1b"); // Sifa uit
      }
      if (n == 34 ) { //|| n==41 || n==48 || n==55 // 27=lamp 34=toeter
       
      }
      n++;
     }
     while (x != 255);
     //   Serial.println();
     // positie 27 is lampje SIFA/0 is uit/1 is aan
     // positie 34 0 is uit/1 is waarschuwingssignaal/3 is dwangremming
    }
Wie kommt man jetzt auf diese 27 bzw. 34 Male, die mein Ardunio die von Zusi gesendeten Daten ignoriert, bevor er etwas damit anfängt?

Gero
Es stimmt, dass dieser Abschnitt nicht funktioniert, es war nur ein erster Test.
Die Absicht war, je nach name, die zugehörigen Daten Suche und dann weiter zu verarbeiten.
Es ist also noch nicht fertig.

Im übrigen funktioniert der Rest einwandfrei.

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

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#196 Beitrag von F. Schn. »

Hi,
ich habe gerade eine PN erhalten, die nach einem lauffähigen Script fragt. Da das sicherlich für alle interressant ist, wollte ich hier mal die Frage an alle, insbesondere Arne richten, ob es da etwas gibt. Das von L-Vosje ist jedenfalls schon wieder nicht mehr erreichbar, und kam ja glaube ich auch nicht mit beliebig tiefen Verschachtelungstiefen des Knoten-Protokolls zurecht.

Für den Fall das keiner Antwortet, habe ich noch mal die Kombination von L-Vosjes setup mit meiner Loop-Idee unten angehängt, es kann aber sein, dass ihr dort noch ein bisschen basteln müsst, bevor es läuft.

Code: Alles auswählen

#include <SPI.h>
#include <Ethernet2.h>


IPAddress ip(192, 168, 1, 100);//IP-Adresse vom Arduino Ethernet Shield
IPAddress server(192, 168, 1, 103); //IP-Adresse vom Zusi3-Rechner

uint8_t aanmelding[] = { 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2, 0x0, 0x2, 0x0, 0xA, 0x0,
             0x0, 0x0, 0x3, 0x0, 0x46, 0x61, 0x68, 0x72, 0x70, 0x75, 0x6C, 0x74, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x32, 0x2E, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
            };

uint8_t vraagsnelheid[] = { 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xA, 0x0,
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, // Snelheid
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, // Luchtdruk Hoofdleiding
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, 0x0, // Druk Remcylinder
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0, // Luchtdruk Tank
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0xD, 0x0, // Stroom
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0xE, 0x0, // Spanning (Draad)
              //0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x13, 0x0, // Hoofdschakelaar
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x19, 0x0, // Afgelegde weg in Mtr
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x23, 0x0, // Tijd Digitaal
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4C, 0x0, // Bocht Radius
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4F, 0x0, // Acceleratie X
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x50, 0x0, // Acceleratie Y
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x52, 0x0, // Middelpuntzoekende kracht X
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x53, 0x0, // Middelpuntzoekende kracht Y
              0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x64, 0x0, // SIFA
              //0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x66, 0x0, // Deuren
              0xFF, 0xFF, 0xFF, 0xFF,
              0xFF, 0xFF, 0xFF, 0xFF,
              0xFF, 0xFF, 0xFF, 0xFF
             };

EthernetClient client;

void setup() {
 Ethernet.begin(mac, ip);
 Serial.begin(9600);                        // seriele poort naar de USB poort voor debugging
 Serial1.begin(19200);
 Serial2.begin(19200);
 Serial3.begin(19200);                       // seriele output naar de print met lampen en analoge meters
 while (!Serial) {
  ;                                // Wacht op seriële poort om contact op te bouwen
 }



 delay(1000);                            // Geef de Ethernet Shield even tijd om te intialiseren
 Serial.println("verbinden...");

 if (client.connect(server, 1436)) {                // Als de verbinding gelukt is dan melding op de monitor
  Serial.println("Verbunden!");
  Serial.println(ip);                       // ip Client
  Serial.println(server);                     // ip Server (Zusi3)
 }
 else {
  Serial.println("Verbinden Fehlgeschlagen");               // Als de verbinding niet gelukt is dan melding op de monitor
 }
 client.write (aanmelding, 59);
 client.write (vraagsnelheid, 158);                 // *** Let op !!! *** Moet overeenkomen met werkelijk aantal bytes in de reeks
}

Code: Alles auswählen

union {
  byte b[4];
  int i;
} dataLng;

union {
  byte b[2];
  int16_t i;
} dataGroup;

int ebene = 0;
int16_t ebene1Status = 0;
int16_t ebene2Status = 0;
int16_t ebene3Status = 0;

union {
  byte b[4];
  float f;
  int i;
} nutzdata;

#define MAX_NUTZDATA 4

void loop() {
 if (client.available()) {
	dataLng.b[0] = client.read();
	dataLng.b[1] = client.read();
	dataLng.b[2] = client.read();
	dataLng.b[3] = client.read();
	
	if (dataLng.i == 0) { //BEGIN NODE
		ebene++;
		dataGroup.b[0] = client.read();
		dataGroup.b[1] = client.read();
		if (ebene == 1) {
			ebene1Status = dataGroup.i;
		} else if (ebene == 2) {
			ebene2Status = dataGroup.i;
		} else if (ebene == 3) {
			ebene3Status = dataGroup.i;
		}
	} else if (dataLng.i == -1) { //END NODE
		ebene--;
	} else { //ATTRIBUTE
		dataGroup.b[0] = client.read();
		dataGroup.b[1] = client.read();
		nutzdata.i = 0; //CLEAR
		for(int i = 0; i < dataLng.i - 2; i++) {
			byte b = client.read();
			if (i < MAX_NUTZDATA) {
				nutzdata.b[i] = b;
			}
		}
		
		//AUSWERTUNG
		if ((ebene >= 1) && (ebene1Status == 0x0001)) { //VERBINDUNGSAUFBAU
		} else if ((ebene >= 1) && (ebene1Status == 0x0002)) { //FAHRPULT
			if ((ebene >= 2) && (ebene2Status == 0x000A)) { //FST-DATA
				if ((ebene >= 3) && (ebene3Status == 0x0022)) { //NBÜ-DATA
				} else if ((ebene >= 3) && (ebene3Status == 0x0064)) { //SIFA
					if (ebene == 3) {
						if (dataGroup.i == 0x0002) { // Status Sifa-Leuchtmelder
							if (nutzdata.b[0] == 1) Serial.println("sifa aan");
							if (nutzdata.b[0] == 0) Serial.println("sifa uit");
						} else if (dataGroup.i == 0x0003) { // Status Sifa-Hupe
							if (nutzdata.b[0] == 2) Serial.println("sifa dwangrem aan");
							if (nutzdata.b[0] == 1) Serial.println("sifa toeter aan");
							if (nutzdata.b[0] == 0) Serial.println("sifa toeter uit");
						}
					}
				} else if ((ebene >= 3) && (ebene3Status == 0x0065)) { //PZB
				} else if ((ebene >= 3) && (ebene3Status == 0x0066)) { //DOORS
				} else if (ebene == 2) {
					if (dataGroup.i == 0x0001) { // Geschwindigkeit m/s
						byte v = nutzdata.f * 3.6;
						Serial3.print("A");
						Serial3.println(v);
					} else if (dataGroup.i == 0x004F) { // Beschleunigung x m/s^2
						byte vv = nutzdata.f * 3000;
						Serial2.println(vv);
					}
				}
			}
		}
	}
 }
 // if the server's disconnected, stop the client:
 if (!client.connected()) {
  Serial.println();
  Serial.println("verbinding verbroken");
  client.stop();
  // do nothing:
  while (true);
 }
}
[/size]
Zuletzt geändert von F. Schn. am 25.03.2017 20:56:43, insgesamt 2-mal geändert.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Gero
Beiträge: 71
Registriert: 30.04.2014 12:49:56
Aktuelle Projekte: Fahrpult Wittenberger / IC Steuerwagen

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#197 Beitrag von Gero »

Moin,
hab den Code von L-Vosje mit kleinen Änderungen auf Deutsch noch rumfliegen, Fehler bitte per PN melden!

Code: Alles auswählen

#include <SPI.h>
#include <Ethernet.h>  //<Ehternet2.h>
byte ZusiIP[4] = {192, 168, 0, 44};
float vv;
int hll = 0;
int n = 0;
int nn = 0;
int f = 1;
int x = 0;
int vIst;
int Data1[5];
int Eingangswerte[16];
int StartSerie[16] = { 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 10, 0, 6, 0, 0, 0 };
int StartSerie2[16] = { 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0 };
byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0x1D, 0x8E };
IPAddress ip(192, 168, 0, 100);//ip adres Arduino Ethernet Shield
IPAddress server(ZusiIP[0], ZusiIP[1], ZusiIP[2], ZusiIP[3]); //ip Adresse Zusi3

uint8_t Anmeldung[] = { 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2, 0x0, 0x2, 0x0, 0xA, 0x0,
                        0x0, 0x0, 0x3, 0x0, 0x46, 0x61, 0x68, 0x72, 0x70, 0x75, 0x6C, 0x74, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x32, 0x2E, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
                      };

uint8_t Abfrage[] = { 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xA, 0x0,   // Abfrage = "Serie"
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, // v Ist
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, // P HLL
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, 0x0, // P BrZyl
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0, // P HBL
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x9, 0x0, // F Gesamt
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0xD, 0x0, // I Fahrleitung LOK
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0xE, 0x0, // U Fahrleitung LOK
                      //0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x13, 0x0, // HS LOK
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x19, 0x0, // s Zurückgelegt
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x23, 0x0, // t
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4C, 0x0, // r Bogen
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4F, 0x0, // a X
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x50, 0x0, // a y
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x52, 0x0, // Drehbeschleunigung X
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x53, 0x0, // Drehbeschleunigung Y
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x64, 0x0, // Status SIFA
                      //0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x66, 0x0, // Status Türen
                      0xFF, 0xFF, 0xFF, 0xFF,
                      0xFF, 0xFF, 0xFF, 0xFF,
                      0xFF, 0xFF, 0xFF, 0xFF
                    };

EthernetClient client;

void setup() {
  Ethernet.begin(mac, ip);
  Serial.begin(9600);                        // Serial 1 für Debugging
  Serial1.begin(19200);
  Serial2.begin(19200);
  Serial3.begin(19200);                       // Serial 3 für LM und Analoganzeigen
  while (!Serial) {
    ;                                // Wartet, bis die serielle Schnittstelle Kontakt aufgebaut hat
  }

  delay(1000);                            // Zeit zum initialisieren
  Serial.println("Verbinden...");

  if (client.connect(server, 1436)) {                // Wenn Verbindung erfolgreich auf Monitor ausgeben
    Serial.println("Verbunden");
    Serial.println(ip);                       // ip Client (Shield)
    Serial.println(server);                     // ip Server (Zusi3)
  }
  else {
    Serial.println("Verbinden fehlgeschlagen");               // Wenn Verbindung nicht erfolgreich auf Monitor ausgeben
  }
  client.write (Anmeldung, 59);
  client.write (Abfrage, 166);                 // *** Achtung !!! *** Muss der tatsächlichen Anzahl von Bytes in der Serie entsprechen
}

float inputValue;

union u_tag {
  byte b[4];
  float fval;
} u;

void loop() {
  if (client.available()) {
    byte c = client.read();
    Eingangswerte[16] = (c);

    if (f == 1) {
      for (int i = 0; i <= 15; i++) {
        Eingangswerte[i] = Eingangswerte[i + 1];
      }
      n = 0; nn = 0;
      for (int i = 0; i <= 15; i++) {
        if (Eingangswerte[i] == StartSerie[i]) {
          n++;
        }
        if (Eingangswerte[i] == StartSerie2[i]) {
          nn++;
        }
      }

      if (n == 16 || nn == 16) {
        byte c = client.read();
        //************Sifa******************************************************************************************
      }
      //************Türen******************************************************************************************
      if (c == 102)
      {
      }
      //------------------------------------------------
      //************Zugbeeinflussung******************************************************************************************
      if (c == 101) // Nicht in der Serie!
      {
      }
      //------------------------------------------------
      else    //Andere Datenverarbeitung
        if (c != 100 && c != 101 && c != 102) {
          {
            Data1[0] = c;       //ID
            x = client.read();     //leeres High-Byte der ID
            Data1[1] = client.read(); //Wert
            Data1[2] = client.read(); //Wert
            Data1[3] = client.read(); //Wert
            Data1[4] = client.read(); //Wert


            u.b[0] = Data1[1];
            u.b[1] = Data1[2];
            u.b[2] = Data1[3];
            u.b[3] = Data1[4];



            inputValue = (u.fval);



            //************Geschwindigkeit******************************************************************************************
            if (Data1[0] == 0x1) {
              byte v = inputValue * 3.6;
              vIst = v;
              Serial3.print("A");
              Serial3.println(v);
              if (v >= 38)
              {
                Serial3.println("L1F");//LM Hochabbremsung an
              }
              else
              {
                Serial3.println("L1f");//LM Hochabbremsung aus
              }
            }
            //************Durck HLL******************************************************************************************
            if (Data1[0] == 0x2) {

              hll = inputValue * 10;
              int inputValue = 1180 - (hll * 4.66);
              Serial3.print("#6 P");
              Serial3.print(inputValue);
              Serial3.println(" T1000");
              Serial.print("#6 P");
              Serial.print(inputValue);
              Serial.println(" T1000");
            }

            //************Druck BrZyl******************************************************************************************
            if (Data1[0] == 0x3) {
              hll = inputValue * 10;
              int inputValue = 730 + (hll * 26.6);
              Serial3.print("#7 P");
              Serial3.print(inputValue);
              Serial3.println(" T1000");
              Serial.print("#7 P");
              Serial.print(inputValue);
              Serial.println(" T1000");
            }
            //************Beschleunigung******************************************************************************************
            if (Data1[0] == 0x4F) {
              vv = inputValue * 2000;
              Serial2.println(vv);
            }
            //************Radius******************************************************************************************
            if (Data1[0] == 0x4C) {
              vv = int(0 - (inputValue * 1000));
              if (vv > 3500) {
                vv = 3500;
              }
              if (vv < -3500) {
                vv = -3500;
              }
              Serial1.println(vv);
              //Serial.println(vv);
            }
            //************Uhrzeit******************************************************************************************
            if (Data1[0] == 0x23) {
              long ZeitInSekunden = inputValue * 86400;
              long Stunden = ZeitInSekunden / 3600;
              long Minuten = (ZeitInSekunden - (Stunden * 3600)) / 60;
              long Sekunden = (ZeitInSekunden - (Stunden * 3600) - (Minuten * 60));
              Serial3.print("T");
              Serial.print("T");
              if (Stunden < 10) Serial3.print("0");
              if (Stunden < 10) Serial.print("0");
              Serial3.print(Stunden);
              Serial.print(Stunden);
              Serial.print(":");
              if (Minuten < 10) Serial3.print("0");
              if (Minuten < 10) Serial.print("0");
              Serial3.println(Minuten);
              Serial.println(Minuten);

            }

            //************Oberspannung******************************************************************************************

            if (Data1[0] == 0xE) {
              int vv = (inputValue / 100);
              Serial3.print("E");
              Serial3.println(vv);
              Serial.print("Spanning "); Serial.println(vv);
            }

            //************Zugkraft gesamt******************************************************************************************

            if (Data1[0] == 0x9) {
              int vv = (inputValue / 100);
              Serial3.print("D");
              Serial3.println(vv);
              Serial.print("Kracht "); Serial.println(vv);
            }

            //------------------------------------------------
            do {
              x = client.read(); // 255
              //------------------------------------------------
              if (x != 255) {
                x = client.read(); //leeres Byte
                x = client.read(); //leeres Byte
                x = client.read(); //leeres Byte

                Data1[0] = client.read(); //ID
                x = client.read();     //leeres Byte, HIGH-Byte der ID
                Data1[1] = client.read(); //Wert
                Data1[2] = client.read(); //Wert
                Data1[3] = client.read(); //Wert
                Data1[4] = client.read(); //Wert

                u.b[0] = Data1[1];
                u.b[1] = Data1[2];
                u.b[2] = Data1[3];
                u.b[3] = Data1[4];
                inputValue = (u.fval);

                //************Geschwindigkeit******************************************************************************************
                if (Data1[0] == 0x1) {
                  byte v = inputValue * 3.6;
                  vIst = v;
                  Serial3.print("A");
                  Serial3.println(v);
                  if (v >= 38)
                  {
                    Serial3.println("L1F");//LM Hochabbremsung an
                  }
                  else
                  {
                    Serial3.println("L1f");//LM Hochabbremsung aus
                  }
                }
                //************Druck HLL******************************************************************************************
                if (Data1[0] == 0x2) {

                  hll = inputValue * 10;
                  int inputValue = 1180 - (hll * 4.66);
                  Serial3.print("#6 P");
                  Serial3.print(inputValue);
                  Serial3.println(" T1000");
                  Serial.print("#6 P");
                  Serial.print(inputValue);
                  Serial.println(" T1000");
                }

                //************Druck BrZyl******************************************************************************************
                if (Data1[0] == 0x3) {

                  hll = inputValue * 10;
                  int inputValue = 730 + (hll * 26.6);
                  Serial3.print("#7 P");
                  Serial3.print(inputValue);
                  Serial3.println(" T1000");
                  Serial.print("#7 P");
                  Serial.print(inputValue);
                  Serial.println(" T1000");
                }
                //************Beschleunigung******************************************************************************************
                if (Data1[0] == 0x4F) {
                  vv = inputValue * 2000;
                  Serial2.println(vv);
                }
                //************Radius******************************************************************************************
                if (Data1[0] == 0x4C) {
                  vv = int(0 - (inputValue * 1000));
                  if (vv > 3500) {
                    vv = 3500;
                  }
                  if (vv < -3500) {
                    vv = -3500;
                  }
                  Serial1.println(vv);
                  //Serial.println(vv);
                }
                //************Uhrzeit******************************************************************************************
                if (Data1[0] == 0x23) {
                  //Serial.print("Zeit in Prozent: "); Serial.println(inputValue, DEC);
                  long ZeitInSekunden = inputValue * 86400;
                  long Stunden = ZeitInSekunden / 3600;
                  long Minuten = (ZeitInSekunden - (Stunden * 3600)) / 60;
                  long Sekunden = (ZeitInSekunden - (Stunden * 3600) - (Minuten * 60));
                  Serial3.print("T");
                  Serial.print("T");
                  if (Stunden < 10) Serial3.print("0");
                  if (Stunden < 10) Serial.print("0");
                  Serial3.print(Stunden);
                  Serial.print(Stunden);
                  Serial.print(":");
                  if (Minuten < 10) Serial3.print("0");
                  if (Minuten < 10) Serial.print("0");
                  Serial3.println(Minuten);
                  Serial.println(Minuten);
                }
                //************Oberspannung******************************************************************************************
                if (Data1[0] == 0xE) {
                  int vv = (inputValue / 100);
                  Serial3.print("E");
                  Serial3.println(vv);
                  Serial.print("Spanning "); Serial.println(vv);
                }
                //************Zugkraft gesamt******************************************************************************************
                if (Data1[0] == 0x9) {
                  int vv = (inputValue / 100);
                  Serial3.print("D");
                  Serial3.println(vv);
                  Serial.print("Kracht "); Serial.println(vv);
                }
              }
            }
            while (x != 255);
          }
        }
    }
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("Verbindung abgebrochen");
    client.stop();
    // do nothing:
    while (true);
  }
} 
Gero

Allgäu Max
Beiträge: 14
Registriert: 26.01.2017 14:42:41
Aktuelle Projekte: Fahrpult
Wohnort: Weiler im Allgäu

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#198 Beitrag von Allgäu Max »

Hallo,
ich bin mit dem Thema Arduino Anbindung über TCP zwar ziemlicher Neuling, doch ich habe es mit dem Sketch von L-Vosje ziemlich schnell zum laufen bekommen. Nur habe ich jetzt noch ein Problem mit dem ich auch nach ewigem Rumprobieren nicht weiterkomme.
Zur Situation, ich habe meine Arduino Mega mit Ethernet Shield direkt an den Versuchs-Laptop über Ethernet angebunden, darüber hinaus ist der µC auch noch über USB für die Spannungsversorgung und das Debugging angeschlossen.
Sobald sich der Arduino erfolgreich mit dem TCP Server verbindet gibt er das auch wie gewollt über den seriell Monitor aus, und gibt auch dann die Daten der SIFA kontinuierlich aus. Testweise habe ich noch eine LED angeschlossen, die den SIFA Leuchtmelder darstellen soll, passt soweit auch.
Doch dies funktioniert nur mehr oder weniger lange, dann bricht die Auswertung ab, das Shield ist zwar dann immer noch mit dem TCP Server verbunden, was auch über WireShark erkennbar ist. Aber die Ausgabe über den Seriellen Monitor stoppt und auch die LED wird nicht mehr angesteuert.
Ich habe auch schon an den Einstellungen für Sendeintervall und Buffergröße verschiedene Konfigurationen getestet, doch dies ist auch nicht sehr zielführend. Aktuell habe ich folgende Einstellungen, die mehr oder weniger lange funktionieren:
Sendeintervall: 0,1s
Buffergröße: 2000
kontinuierliches Senden ein
Baudrate der seriellen Ausgabe: 9600

Hat von euch evtl. jemand eine Idee woran das liegen kann? Kann es sein, dass sich der µC aufhängt?
Ich wäre auf jeden Fall für einen Lösungsansatz sehr dankbar da ich leider nicht mehr weiter komme.

Max

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: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#199 Beitrag von Arne aus dem Norden »

Allgäu Max hat geschrieben: Hat von euch evtl. jemand eine Idee woran das liegen kann? Kann es sein, dass sich der µC aufhängt?
Ich wäre auf jeden Fall für einen Lösungsansatz sehr dankbar da ich leider nicht mehr weiter komme.
Hi,

bei mir wurde das damals besser nachdem ich einen Kühlkörper auf den Prozessor vom Ethernetshield aufgeklebt habe. Die Dinger von den Stepper-Drivern vom 3D-Drucker passten da glaub ich ganz gut. Mein Arduino hatte sich damals immer wieder komplett resettet. War mit dem Kühlkörper dann kein Problem mehr.
Darüber hinaus sorgt auch eine zu hohe Spannungsversorgung am Mega manchmal für Hitzeprobleme am Spannungsregler. Aber wenn du ihn über USB versorgst ist das kein Problem.
Mein Baubericht von der echten Bahn zum Schönberger Strand:
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/

Allgäu Max
Beiträge: 14
Registriert: 26.01.2017 14:42:41
Aktuelle Projekte: Fahrpult
Wohnort: Weiler im Allgäu

Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP

#200 Beitrag von Allgäu Max »

Das wäre ja super wenn das bereits die Lösung ist.
Komisch ist nur, es geht manchmal 5 Minuten gut und dann wieder nur 10 Sekunden.
Ich probier s mal mit dem Kühlkörper.
Danke.

Max

Antworten