Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
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
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
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
Wenn Sie unser Programm meine, kein Problem, aber Sie müssen noch warten, wir haben eine Störung auf der Website.Mike B. hat geschrieben: gibt es eine möglichkeit dieses Arduino Script downzuloaden?
Wir sind keine erfahrenen Programmierer und das Programm ist noch nicht fertig.
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
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.
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.
- Carsten Hölscher
- Administrator
- Beiträge: 33445
- Registriert: 04.07.2002 00:14:42
- Wohnort: Braunschweig
- Kontaktdaten:
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
Hab mir die Beschleunigungswerte angeschaut und da war ein Rechenfehler drin. Ist in der nächsten Version korrigiert.
Carsten
Carsten
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
@Carsten
Danke für die info.
Danke für die info.
- 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
Hi,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.
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/
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
Seltsam, aber es sollte jetzt funktionieren.
http://www.l-vosje.nl/html/arduino_script.html" target="_blank
http://www.l-vosje.nl/html/arduino_script.html" target="_blank
- 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
Ja,
sieht gut aus, läuft wieder. Vielen Dank.
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/
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/
- 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
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
Mit freundlichen Grüßen Jeff
Mein Projekt: Mein eigenes Fahrpult. Schaut doch mal vorbei
https://m.youtube.com/channel/UCrpDMup3YWCyJkPzLzLuf2w
https://m.youtube.com/channel/UCrpDMup3YWCyJkPzLzLuf2w
-
- 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
Hallo zusammen,
ich stehe total auf dem Schlauch...
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
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
}
Gero
Zuletzt geändert von Gero am 05.01.2017 16:08:59, insgesamt 1-mal geändert.
- Johannes
- Beiträge: 3203
- Registriert: 14.03.2009 22:36:06
- Aktuelle Projekte: Zusitools (http://git.io/zusitools)
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
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.
Fazit: Bitte so nicht programmieren
Fazit: Bitte so nicht programmieren
-
- 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
Hmm...
bekomme bei Zusi auf der passenden Sifa folgendes:
Gero
bekomme bei Zusi auf der passenden Sifa folgendes:
Sollte jetzt soweit stimmen, oder?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
Gero
Zuletzt geändert von Gero am 06.01.2017 16:12:37, insgesamt 5-mal geändert.
- Johannes
- Beiträge: 3203
- Registriert: 14.03.2009 22:36:06
- Aktuelle Projekte: Zusitools (http://git.io/zusitools)
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
Ich habe dir das mal richtig kommentiert:
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 )
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.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
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.
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
Ich verlinke mal meine Gedanken für eine alternative Loop-Implentierung:
http://forum.zusi.de/viewtopic.php?p=263157#p263157" target="_blank
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
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
Es stimmt, dass dieser Abschnitt nicht funktioniert, es war nur ein erster Test.Gero hat geschrieben:Hallo zusammen,
ich stehe total auf dem Schlauch...
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?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 }
Gero
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.
Re: Der Ardunio und direkte Ausgaben vom ZusiServer über TCP
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.
[/size]
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);
}
}
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
-
- 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
Moin,
hab den Code von L-Vosje mit kleinen Änderungen auf Deutsch noch rumfliegen, Fehler bitte per PN melden!
Gero
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);
}
}
-
- 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
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
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
- 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
Hi,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.
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/
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/
-
- 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
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
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