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

#201 Beitrag von Allgäu Max »

Arne aus dem Norden hat geschrieben:
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.
Der Kühlkörper scheint nicht das Problem zu sein, habe es mit einem Kühlkörper + Wärmeleitpaste probiert aber immer noch das selbe Problem. Meiner Meinung nach funktioniert das Shield tadellos und das Problem liegt wo anders.
Habe es mit WireShark untersucht, dabei nochmal festgestellt:

Sobald der Arduino mit der Übertragung an den seriellen Monitor aufhört und auch keine Ausgänge mehr steuert geschieht auf der Ethernet Seite keine Veränderung. Die TCP Verbindung mit dem Shield bleibt aufrecht und der Server sendet weiter seine Daten, die vom Arduino auch empfangen und quittiert werden.

Gibt es vielleicht einen anderen bekannten Fehler, den ich unbewusst mache?

Max

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

#202 Beitrag von Allgäu Max »

Habe das Problem nun festgestellt und behoben.
Der µC verzählte sich bei der Auswertung der Ebenen manchmal, wodurch die Bedingungen natürlich nie mehr erfüllt werden können.

Doch ein Problem habe ich noch, wobei ich um Hilfe sehr dankbar wäre. Das Auslesen der Zugsicherung macht mir Probleme, da diese ja ein wenig mehr Verschachtelungsebenen besitzt als z.B. SiFa.
Da bestimmt ein paar von euch schon vor diesem Problem standen, wäre es toll wenn ich ein Quellcode bekommen könnte, der genau diese Auswertung abarbeitet.

Max

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

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

#203 Beitrag von F. Schn. »

Hast du meine void loop genommen oder die von L-Vosje? Wenn letzteres: Welche Variable hat sich da verzählt? Wenn ersteres: Wo ist das Problem beim Zugsicherung-Paket?
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

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

#204 Beitrag von Allgäu Max »

Hallo,

ich habe den Quellcode aus deinem Post vom 25.3.2017 genommen also deine void loop. Die Variable "ebene" hat dabei sporadisch falsche Werte enthalten, zum Test habe ich nur die Daten der SIFA abgefragt und war dann bei den Werten der Variable "ebene" auf einmal irgendwo bei 5 und manchmal 7, was ja nicht sein kann. Dadurch waren die IF-Bedingungen der Auswertung natürlich nicht mehr erfüllt und die Ausgänge wurden nicht mehr gesteuert.

Zur Zugsicherung möchte ich gerne die 6 LM(55, 70, 85, Befehl, 500Hz und 1000Hz) auswerten, damit ich meine MFA damit ansteuern kann. Nur bin ich noch völlig auf dem Holzweg, was die Auswertung angeht, da die Verschachtelungsebene ja noch tiefer wird. Ganz konkret, wie muss ich abfragen und auswerten, dass ich den Zustand der LM bekomme?

Vielen Dank.

Max

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

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

#205 Beitrag von F. Schn. »

Ah, meine Skizze hat also offenbar sogar kompiliert. :) Hast du den Fehler mit der Ebene dann irgendwie näher untersucht bzw behoben?

Zu den PZB-Leuchtmeldern: Du führst ein ebene4Status ein, weist ihr analog zu den anderen Ebenen die entsprechenden Werte zu

Code: Alles auswählen

      } else if (ebene == 3) {
         ebene3Status = dataGroup.i;
      } else if (ebene == 4) {
         ebene4Status = dataGroup.i;
      }
und fragst dies Variablen dann an den Adressen entsprechend der Zusi-Doku ab:

Code: Alles auswählen

            } else if ((ebene >= 3) && (ebene3Status == 0x0065)) { //PZB
               if ((ebene >= 4) && (ebene4Status == 0x0003)) { //Indusi-Betriebsdaten
                  if (ebene == 4) {
                     if (dataGroup.i == 0x0005) { // Melder 1000 Hz
                        if (nutzdata.b[0] == 1) ...;
                        if (nutzdata.b[0] == 0) ...;
                     } else if (dataGroup.i == 0x0006) { // Melder U
                        ...
                     } else if (dataGroup.i == 0x0007) { // Melder M
                        ...
                     } else if (dataGroup.i == 0x0008) { // Melder O
                        ...
                     } else if (dataGroup.i == 0x000A) { // Melder 500 Hz
                        ...
                     } else if (dataGroup.i == 0x000B) { // Melder Befehl
                        ...
                     }
                  }
               }
            }
Zuletzt geändert von F. Schn. am 27.05.2017 12:45:51, insgesamt 1-mal geändert.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

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

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

#206 Beitrag von F. Schn. »

Hallo,

ich poste mal das Script so, es jetzt läuft. Vielleicht hilft es ja noch anderen

Code: Alles auswählen

#include <Dhcp.h>                                             //Einbindung der Bibliotheken
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <SPI.h>

IPAddress ip(169, 254, 111, 122);                              //IP-Adresse vom Arduino Ethernet Shield
IPAddress server(169, 254, 111, 121);                          //IP-Adresse vom Zusi3-Rechner
byte mac[] = { 0x00, 0x1B, 0xB9, 0x84, 0xCB, 0x60 };           //MAC des Arduinos (fast frei wählbar)

// Byte Serie zum Verbindungsaufbau
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
            };
// Byte Serie der angeforderten Daten, die der Server senden soll
uint8_t Abfrage[] = { 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,  // Geschwindigkeit m/s
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0xA, 0x0,  // Zugkraft IST/Achse N
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0xC, 0x0,  // Zugkraft Soll/Achse N
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x13, 0x0, // Hauptschalter
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x17, 0x0, // AFB Soll m/s
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x20, 0x0, // LM Hochabbremsung Aus/Ein
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x64, 0x0, // SIFA
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x65, 0x0, // Zugsicherung
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x66, 0x0, // Türen
                      0xFF, 0xFF, 0xFF, 0xFF,
                      0xFF, 0xFF, 0xFF, 0xFF,
                      0xFF, 0xFF, 0xFF, 0xFF
                    };

EthernetClient client;

union //Datentyp zur Abfrage des Knotens
{
  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;
int16_t ebene4Status = 0;
 
int count;// Testvariable für TEST LED blinken

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

#define MAX_NUTZDATA 4

uint8_t clientForceRead()
{
  while (!client.available()) {}
  return client.read();
}

//Hauptprogramm
void setup() {
 // Aus und Eingänge festlegen
 pinMode(22, OUTPUT); //PIN22 Ausgang LM hohe Abbremsung ein
 pinMode(23, OUTPUT); //PIN23 Ausgang LM ZS Aus
 pinMode(24, OUTPUT); //PIN24 Ausgang LM HS Aus
 pinMode(25, OUTPUT); //PIN25 Ausgang LM TAV
 pinMode(26, OUTPUT); //PIN26 Ausgang LM SIFA
 pinMode(27, OUTPUT); //PIN27 Ausgang LM 55
 pinMode(28, OUTPUT); //PIN28 Ausgang LM 99
 pinMode(29, OUTPUT); //PIN29 Ausgang LM 70
 pinMode(30, INPUT);  //PIN30 Eingang Lampentest MFA
 pinMode(31, OUTPUT); //PIN31 Ausgang LM 85
 pinMode(32, INPUT);  //PIN32 Eingang Beleuchtung MFA heller
 pinMode(33, OUTPUT); //PIN33 Ausgang LM Befehl 40
 pinMode(34, INPUT);  //PIN34 Eingang Beleuchtung MFA dunkler
 pinMode(35, OUTPUT); //PIN35 Ausgang LM 500Hz
 pinMode(37, OUTPUT); //PIN37 Ausgang LM 1000Hz

 
 
 Ethernet.begin(mac, ip);                 // Zuordnung von IP und MAC an das Shield
 Serial.begin(115200);                    // serielle Schnittstelle am USB Anschluss für Debugging
 Serial1.begin(19200);                    // serielle Ausgabe an den nächsten µC (falls vorhanden) für die Zeiger und Lampenausgabe
 Serial2.begin(19200);                    // serielle Ausgabe an den nächsten µC (falls vorhanden) für die Zeiger und Lampenausgabe
 Serial3.begin(19200);                    // serielle Ausgabe an den nächsten µC (falls vorhanden) für die Zeiger und Lampenausgabe

 while (!Serial) {
  ;                                       // auf die serielle Schnittstelle warten
 }

 delay(1000);                             // Zeit, dass sich das Ethernet Shield initialisiert (1000ms)
 Serial.println("verbinden...");          // Meldung an den seriellen Monitor

 if (client.connect(server, 1436)) {      // Sobald die Verbindung steht erfolgt die Meldung auf den Monitor
  Serial.println("Verbunden!");           // Meldung verbunden
  Serial.println(ip);                     // ip Client (PC) auf dem Monitor ausgeben
  Serial.println(server);                 // ip Server (Zusi3) auf dem Monitor ausgeben
 }
 else {
  Serial.println("Verbindung Fehlgeschlagen");               // Falls die Verbindung nicht klappt erfolgt die Meldung auf den Monitor
 }

 // Byte Serien zum Zusi Server schreiben
 client.write (Anmeldung, 59);
 client.write (Abfrage, 102);              // *** Vorsicht !!! *** Muss der tatsaechlichen Anzahl von Bytes in der Serie "Abfrage" s.o. entsprechen
}

void(* resetFunc) (void) = 0;              // Reset Funktion war nur für einen Test gedacht, wird nicht benötigt


// Endlosschleife
void loop() {
  
 if (client.available()) {
 
   dataLng.b[0] = clientForceRead();
   dataLng.b[1] = clientForceRead();
   dataLng.b[2] = clientForceRead();
   dataLng.b[3] = clientForceRead();

   
   if (dataLng.i == 0) { //BEGINN KNOTEN
      ebene++;
      dataGroup.b[0] = clientForceRead();
      dataGroup.b[1] = clientForceRead();
      if (ebene == 1) {
         ebene1Status = dataGroup.i;
      } else if (ebene == 2) {
         ebene2Status = dataGroup.i;
      } else if (ebene == 3) {
         ebene3Status = dataGroup.i;
      } else if (ebene == 4) {
         ebene4Status = dataGroup.i;
      }
      
   } else if (dataLng.i == -1) { //ENDE KNOTEN
      ebene--;
      
      if (ebene < 0) { //AUSNAHMEFEHLER: Sollte nicht auftreten, Hilfsweise Arduino neustarten
        resetFunc ();
      }
   } else if (dataLng.i == 1)  { //AUSNAHMEFEHLER: Sollte nicht auftreten, Hilfsweise Arduino neustarten
        resetFunc ();
      
   } else { //ATTRIBUT
      dataGroup.b[0] = clientForceRead();
      dataGroup.b[1] = clientForceRead();
      nutzdata.i = 0;                           //Löschen der Nutzdaten Variable
      for(int i = 0; i < dataLng.i - 2; i++) {  //Schleife zum Auslesen der Nutzdaten
         byte b = clientForceRead();                
         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) {digitalWrite(26, HIGH);}    //SIFA Leuchtmelder einschalten
                     if (nutzdata.b[0] == 0) {digitalWrite(26,LOW);}      // SIFA Leuchtmelder ausschalten
                  } else if (dataGroup.i == 0x0003) { // Status Sifa-Hupe
                     if (nutzdata.b[0] == 2) Serial.println("SIFA Hupe Zwangsbremsung");
                     if (nutzdata.b[0] == 1) Serial.println("SIFA Hupe Warnung");
                     if (nutzdata.b[0] == 0) Serial.println("SIFA Hupe aus");
                  }
               }
            } else if ((ebene >= 3) && (ebene3Status == 0x0065)) { //PZB
               if ((ebene >= 4) && (ebene4Status == 0x0003)) { //Indusi-Betriebsdaten
                  if (ebene == 4) {
                     if (dataGroup.i == 0x0005) { // Melder 1000 Hz
                        if (nutzdata.b[0] == 1) {digitalWrite(37, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(37, LOW);}
                     } else if (dataGroup.i == 0x0006) { // Melder U
                        if (nutzdata.b[0] == 1) {digitalWrite(27, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(27, LOW);}
                     } else if (dataGroup.i == 0x0007) { // Melder M
                        if (nutzdata.b[0] == 1) {digitalWrite(29, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(29, LOW);}
                     } else if (dataGroup.i == 0x0008) { // Melder O
                        if (nutzdata.b[0] == 1) {digitalWrite(31, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(31, LOW);}
                     } else if (dataGroup.i == 0x000A) { // Melder 500 Hz
                        if (nutzdata.b[0] == 1) {digitalWrite(35, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(35, LOW);}
                     } else if (dataGroup.i == 0x000B) { // Melder Befehl
                        if (nutzdata.b[0] == 1) {digitalWrite(33, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(33, LOW);}
                     }
                  }
               }
            } else if ((ebene >= 3) && (ebene3Status == 0x0066)) { //Türsystem
            } else if (ebene == 2) {
               if (dataGroup.i == 0x0001) {          // Geschwindigkeit Meter/Sekunde
                  byte Geschw = nutzdata.f * 3.6;
                  //Serial.print("A");
                  //Serial.println(Geschw);
               } else if (dataGroup.i == 0x000A) {   // Zugkraft Ist/Achse in Newton
                  byte Zugkraft_ist = nutzdata.f;
                  //Serial.println(Zugkraft_ist);
               } else if (dataGroup.i == 0x000C) {   // Zugkraft Soll/Achse in Newton
                  byte Zugkraft_soll = nutzdata.f;
                  //Serial.println(Zugkraft_soll);
               } 
            }
         }
      }
   }
 }
 
 // wenn der Server getrennt wird, stoppt der Client und gibt seriell eine Meldung ab:
 if (!client.connected()) {
  Serial.println();
  Serial.println("Verbindung abgebrochen");
  client.stop();
  // mache nichts:
  while (true);
  //resetFunc ();
 }
}
[/size]
Zuletzt geändert von F. Schn. am 02.06.2017 23:01:07, insgesamt 1-mal geändert.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

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

#207 Beitrag von Jeff Becker »

Hi, echt super dass du die verbesserte Version gepostet hast. Wäre es möglich noch eine kleine Anleitung zu erstellen so wie Arne das gemacht hat, wo erklärt wird wie man noch weitere TCP Daten hinzufügen kann wie zum Beispiel weitere Leuchtmelder und so weiter. Das wäre echt nett.

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

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

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

#208 Beitrag von F. Schn. »

Puh...

Also ich beschreibe es mal: Gemäß 11.3 der Doku hat das Zusi-Protokoll Knoten und Attribute. Die meisten relevanten Größen für Fahrpult-Bauer sind in Abschnitt 11.3.3.3 zu finden: Dort sieht man, wie sie sich im Knoten 00 02 "Client-Anwendung Fahrpult" befinden:

Code: Alles auswählen

      } else if ((ebene >= 1) && (ebene1Status == 0x0002)) { //FAHRPULT
Dann befindet sich in der Nächsten Zeile eine Spalte weiter Links der untergeordnete Knoten 00 0A "Führerstandsanzeigen"

Code: Alles auswählen

         if ((ebene >= 2) && (ebene2Status == 0x000A)) { //FST-DAT
Die meisten Daten sind nun in Tabelle 11.3.3.3.1 zu finden. Bei den Daten, bei denen nicht "s. eigener Abschnitt" steht, handelt es sich um Attribute. Die Auswertung von Attributen wird mit dem

Code: Alles auswählen

            } else if (ebene == 2) {
eingeleitet. Danach frage ich über

Code: Alles auswählen

               if (dataGroup.i == 0x0001) {          // Geschwindigkeit Meter/Sekunde
die konkreten Werte ab.

Die Meisten Daten liegen gemäß Tabelle 11.3.3.3.1 als "Single"-Werte vor. Diese Werte werden mit nutzdata.f abgerufen. Details und Einheiten finden sich in der Spalte "Dimension" der Tabelle. Ein paar Hinweise dazu: "aus/an" bedeutet, dass der Wert > 0 ist, wenn der Leuchtmelder ein und <= 0 ist, wenn der Leuchtmelder aus ist. "m/s" beutet, dass der Wert mit 3.6 mal genommen werden muss, um km/h zu erreichen.

Für bestimmte Werte gibt es komplexere Knoten. Beim Abschnitt PZB (11.3.3.3.4) geht es zum Beispiel nach 00 02 und 00 0A mit einem weiteren "<Knoten>" 00 65 ("Status Zugsicherung") weiter

Code: Alles auswählen

            } else if ((ebene >= 3) && (ebene3Status == 0x0065)) { //PZB
und anschließend mit einem Knoten 00 03 "Indusi Betriebsdaten"

Code: Alles auswählen

               if ((ebene >= 4) && (ebene4Status == 0x0003)) { //Indusi-Betriebsdaten
weiter, bevor die Attribute kommen:

Code: Alles auswählen

                  if (ebene == 4) {
                     if (dataGroup.i == 0x0005) { // Melder 1000 Hz
In diesen Abschnitten treten auch ein paar andere Datentypen auf: Der Datentyp byte wird mit nutzdata.b[0] abgefragt (byte ist ein ganzzahliger Wert), Word über nutzdata.i16
Hinweis: Ich traue euch zu, dass ihr selbst wisst, dass man Dinge, die man mit if (...) { auf macht, mit } wieder zu machen muss, und das } else if (...) { den bisherigen if-Block zu macht und dann anschließend wieder einen neuen auf macht. Und ich erinnere euch noch mal dran, dass Einrückungen formal keine Bedeutung haben, aber wenn man den Überblick über den eignen Code nicht verlieren will, dringend richtig gemacht werden sollten!

So, nun zum Thema Daten abonieren
Um die Daten auszuwerten, müssen sie erst mal von Zusi angefragt werden. Was genau wie aboniert werden muss, steht in 11.3.3.1: Daten aus der Gruppe 00 02 / 00 0A müssen mit den IDs gemäß
Tabelle 11.3.3.3.1 aboniert werden. Große Knoten wie z.B. die PZB bilden gewissermaßen eine Ausnahme, bei ihnen werden keine einzelen Werte sondern der ganze Knoten aboniert. Welche Daten aboniert werden, wird in Rohem Code angegeben. Die ersten 6 Bytes bilden das Protokoll, bei den hinteren zwei gibt man die den Wert an, den man abonieren möchte:

Code: Alles auswählen

                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x13, 0x0, // Hauptschalter
Da wir hier das Protkoll roh haben, müssen die Werte in Umgekehrter Reinfolge angegeben werden.

Nur der Vollständigkeit halber: Wenn man die Gruppe 00 0B abonieren möchte, muss man die letzten zwei Zeilen mit den F stehen lassen, und davor folgendes einfügen:

Code: Alles auswählen

                      0x0, 0x0, 0x0, 0x0, 0x0, 0xB, 0x0,
                      0xFF, 0xFF, 0xFF, 0xFF,
Bei 00 0C genauso (in der ersten Zeile B gegen C ersetzen), bei 00 0C müssen die zu abonierenden Werte allerdings konkret analog zu 00 0A angegeben werden, was man dann einfach zwischen die erste und zweite Zeile des einschubes schreibt.
Der Vollständigkeit halber noch ein paar Details: Ein Knoten beginnt mit 4 0en gefolgt von den zwei Bytes für die Nummer des Knotens und endet mit den 4 Fs. Wenn ihr also vor habt, das Paket 01 0A oder 01 0B zu verwenden, könnt ihr euch nach dem selben Schema ein "hard codiertes" Paket schreiben und es mit client.write an Zusi senden. ;)

Länge der abonierten Daten
Wenn man etwas in den abonierten Daten geändert hat, muss man auf diese Zeile aufpassen

Code: Alles auswählen

 client.write (Abfrage, 102);              // *** Vorsicht !!! *** Muss der tatsaechlichen Anzahl von Bytes in der Serie "Abfrage" s.o. entsprechen
In ihr muss die exakte Anzahl an Bytes stehen. Wenn man also einen weiteren Wert aboniert hat, muss man diesen Wert um 6 vergrößern.
Zuletzt geändert von F. Schn. am 02.06.2017 23:28:42, insgesamt 1-mal geändert.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

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

#209 Beitrag von Jeff Becker »

Ich muss dir wirklich sehr danken :respekt , das ist wirklich sehr nett von dir gewesen, vielen Dank nochmals. Das wird den Anderen und mir sicher helfen.

Das Ganze Script funktioniert ja ohne Converter oder?

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

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

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

#210 Beitrag von F. Schn. »

Für Zusi 3 schon. Für Loksim und Zusi 2 nicht. :P (Für die beiden muss ich den Converter allerdings erst noch schreiben. :P )
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

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

#211 Beitrag von Jeff Becker »

Das ist gut, denn ich habe bis jetzt immer mit dem Script von Arne für Zusi2 und mit dem Converter gearbeitet und das war immer etwas aufwendiger. Dann werde ich das ganze dann Mal probieren. Nochmals vielen Dank.

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

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

#212 Beitrag von Jeff Becker »

Code: Alles auswählen

#include <Dhcp.h>                                             //Einbindung der Bibliotheken
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <SPI.h>

IPAddress ip(169, 254, 111, 122);                              //IP-Adresse vom Arduino Ethernet Shield
IPAddress server(169, 254, 111, 121);                          //IP-Adresse vom Zusi3-Rechner
byte mac[] = { 0x00, 0x1B, 0xB9, 0x84, 0xCB, 0x60 };           //MAC des Arduinos (fast frei wählbar)

// Byte Serie zum Verbindungsaufbau
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
            };
// Byte Serie der angeforderten Daten, die der Server senden soll
uint8_t Abfrage[] = { 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,  // Geschwindigkeit m/s
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0xA, 0x0,  // Zugkraft IST/Achse N
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0xC, 0x0,  // Zugkraft Soll/Achse N
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x13, 0x0, // Hauptschalter
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x17, 0x0, // AFB Soll m/s
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x20, 0x0, // LM Hochabbremsung Aus/Ein
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x64, 0x0, // SIFA
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x65, 0x0, // Zugsicherung
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x66, 0x0, // Türen
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1B, 0x0, // LM Schleudern
                      0xFF, 0xFF, 0xFF, 0xFF,
                      0xFF, 0xFF, 0xFF, 0xFF,
                      0xFF, 0xFF, 0xFF, 0xFF
                    };

EthernetClient client;

union //Datentyp zur Abfrage des Knotens
{
  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;
int16_t ebene4Status = 0;
 
int count;// Testvariable für TEST LED blinken

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

#define MAX_NUTZDATA 4

uint8_t clientForceRead()
{
  while (!client.available()) {}
  return client.read();
}

//Hauptprogramm
void setup() {
 // Aus und Eingänge festlegen
 pinMode(22, OUTPUT); //PIN22 Ausgang LM hohe Abbremsung ein
 pinMode(23, OUTPUT); //PIN23 Ausgang LM ZS Aus
 pinMode(24, OUTPUT); //PIN24 Ausgang LM HS Aus
 pinMode(25, OUTPUT); //PIN25 Ausgang LM TAV
 pinMode(26, OUTPUT); //PIN26 Ausgang LM SIFA
 pinMode(27, OUTPUT); //PIN27 Ausgang LM 55
 pinMode(28, OUTPUT); //PIN28 Ausgang LM 99
 pinMode(29, OUTPUT); //PIN29 Ausgang LM 70
 pinMode(30, INPUT);  //PIN30 Eingang Lampentest MFA
 pinMode(31, OUTPUT); //PIN31 Ausgang LM 85
 pinMode(32, INPUT);  //PIN32 Eingang Beleuchtung MFA heller
 pinMode(33, OUTPUT); //PIN33 Ausgang LM Befehl 40
 pinMode(34, INPUT);  //PIN34 Eingang Beleuchtung MFA dunkler
 pinMode(35, OUTPUT); //PIN35 Ausgang LM 500Hz
 pinMode(37, OUTPUT); //PIN37 Ausgang LM 1000Hz
 pinMode(21, OUTPUT); //PIN21 AUSGANG LM SCHLEUDERN

 
 
 Ethernet.begin(mac, ip);                 // Zuordnung von IP und MAC an das Shield
 Serial.begin(115200);                    // serielle Schnittstelle am USB Anschluss für Debugging
 Serial1.begin(19200);                    // serielle Ausgabe an den nächsten µC (falls vorhanden) für die Zeiger und Lampenausgabe
 Serial2.begin(19200);                    // serielle Ausgabe an den nächsten µC (falls vorhanden) für die Zeiger und Lampenausgabe
 Serial3.begin(19200);                    // serielle Ausgabe an den nächsten µC (falls vorhanden) für die Zeiger und Lampenausgabe

 while (!Serial) {
  ;                                       // auf die serielle Schnittstelle warten
 }

 delay(1000);                             // Zeit, dass sich das Ethernet Shield initialisiert (1000ms)
 Serial.println("verbinden...");          // Meldung an den seriellen Monitor

 if (client.connect(server, 1436)) {      // Sobald die Verbindung steht erfolgt die Meldung auf den Monitor
  Serial.println("Verbunden!");           // Meldung verbunden
  Serial.println(ip);                     // ip Client (PC) auf dem Monitor ausgeben
  Serial.println(server);                 // ip Server (Zusi3) auf dem Monitor ausgeben
 }
 else {
  Serial.println("Verbindung Fehlgeschlagen");               // Falls die Verbindung nicht klappt erfolgt die Meldung auf den Monitor
 }

 // Byte Serien zum Zusi Server schreiben
 client.write (Anmeldung, 59);
 client.write (Abfrage, 108);              // *** Vorsicht !!! *** Muss der tatsaechlichen Anzahl von Bytes in der Serie "Abfrage" s.o. entsprechen
}

void(* resetFunc) (void) = 0;              // Reset Funktion war nur für einen Test gedacht, wird nicht benötigt


// Endlosschleife
void loop() {
  
 if (client.available()) {
 
   dataLng.b[0] = clientForceRead();
   dataLng.b[1] = clientForceRead();
   dataLng.b[2] = clientForceRead();
   dataLng.b[3] = clientForceRead();

   
   if (dataLng.i == 0) { //BEGINN KNOTEN
      ebene++;
      dataGroup.b[0] = clientForceRead();
      dataGroup.b[1] = clientForceRead();
      if (ebene == 1) {
         ebene1Status = dataGroup.i;
      } else if (ebene == 2) {
         ebene2Status = dataGroup.i;
      } else if (ebene == 3) {
         ebene3Status = dataGroup.i;
      } else if (ebene == 4) {
         ebene4Status = dataGroup.i;
      }
      
   } else if (dataLng.i == -1) { //ENDE KNOTEN
      ebene--;
      
      if (ebene < 0) { //AUSNAHMEFEHLER: Sollte nicht auftreten, Hilfsweise Arduino neustarten
        resetFunc ();
      }
   } else if (dataLng.i == 1)  { //AUSNAHMEFEHLER: Sollte nicht auftreten, Hilfsweise Arduino neustarten
        resetFunc ();
      
   } else { //ATTRIBUT
      dataGroup.b[0] = clientForceRead();
      dataGroup.b[1] = clientForceRead();
      nutzdata.i = 0;                           //Löschen der Nutzdaten Variable
      for(int i = 0; i < dataLng.i - 2; i++) {  //Schleife zum Auslesen der Nutzdaten
         byte b = clientForceRead();                
         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) {digitalWrite(26, HIGH);}    //SIFA Leuchtmelder einschalten
                     if (nutzdata.b[0] == 0) {digitalWrite(26,LOW);}      // SIFA Leuchtmelder ausschalten
                  } else if (dataGroup.i == 0x0003) { // Status Sifa-Hupe
                     if (nutzdata.b[0] == 2) Serial.println("SIFA Hupe Zwangsbremsung");
                     if (nutzdata.b[0] == 1) Serial.println("SIFA Hupe Warnung");
                     if (nutzdata.b[0] == 0) Serial.println("SIFA Hupe aus");
                  }
               }
            } else if ((ebene >= 3) && (ebene3Status == 0x0065)) { //PZB
               if ((ebene >= 4) && (ebene4Status == 0x0003)) { //Indusi-Betriebsdaten
                  if (ebene == 4) {
                     if (dataGroup.i == 0x0005) { // Melder 1000 Hz
                        if (nutzdata.b[0] == 1) {digitalWrite(37, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(37, LOW);}
                     } else if (dataGroup.i == 0x0006) { // Melder U
                        if (nutzdata.b[0] == 1) {digitalWrite(27, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(27, LOW);}
                     } else if (dataGroup.i == 0x0007) { // Melder M
                        if (nutzdata.b[0] == 1) {digitalWrite(29, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(29, LOW);}
                     } else if (dataGroup.i == 0x0008) { // Melder O
                        if (nutzdata.b[0] == 1) {digitalWrite(31, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(31, LOW);}
                     } else if (dataGroup.i == 0x000A) { // Melder 500 Hz
                        if (nutzdata.b[0] == 1) {digitalWrite(35, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(35, LOW);}
                     } else if (dataGroup.i == 0x000B) { // Melder Befehl
                        if (nutzdata.b[0] == 1) {digitalWrite(33, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(33, LOW);}
                     }
                  }
               }
            } else if ((ebene >= 3) && (ebene3Status == 0x0066)) { //Türsystem
            } else if (ebene == 2) {
               if (dataGroup.i == 0x0001) {          // Geschwindigkeit Meter/Sekunde
                  byte Geschw = nutzdata.f * 3.6;
                  //Serial.print("A");
                  //Serial.println(Geschw);
               } else if (dataGroup.i == 0x000A) {   // Zugkraft Ist/Achse in Newton
                  byte Zugkraft_ist = nutzdata.f;
                  //Serial.println(Zugkraft_ist);
               } else if (dataGroup.i == 0x000C) {   // Zugkraft Soll/Achse in Newton
                  byte Zugkraft_soll = nutzdata.f;
                  //Serial.println(Zugkraft_soll);
               } 
            }
         }
      }
   }
 }
 
 // wenn der Server getrennt wird, stoppt der Client und gibt seriell eine Meldung ab:
 if (!client.connected()) {
  Serial.println();
  Serial.println("Verbindung abgebrochen");
  client.stop();
  // mache nichts:
  while (true);
  //resetFunc ();
 }
}
So ich habe mal den LM Schleudern hinzugefügt. Ist das so richtig oder habe ich noch was vergessen. Denn ich finde dieses Script etwas komplizierter als das von Arne und da ich auch kein Programmierer bin ist das für mich auch immer etwas schwerer.

Noch eine kleine Frage wenn man jetzt die geschwindigkeits Daten an ein Schrittmotor weiter geben möchte, wie würde man das denn mit einbinden?

Mfg jeff
Mein Projekt: Mein eigenes Fahrpult. Schaut doch mal vorbei
https://m.youtube.com/channel/UCrpDMup3YWCyJkPzLzLuf2w

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

#213 Beitrag von Arne aus dem Norden »

Jeff Becker hat geschrieben:Denn ich finde dieses Script etwas komplizierter als das von Arne
Das liegt wohl daran, das die Verschachtelungstiefe der Serverdaten bei Zusi 3 eine andere ist. Das alte Script für Zusi 2 mußte nicht viel erkennen und analysieren können. Wenn man darauf vertraut hat das keine Fehler in der Übertragung sind konnte man die Datenpakete immer nach Schema F mit ganz einfachen Schleifen auslesen. Zusi 3 sendet aber Knoten, die weitere untergeordnete Knoten und Attribute enthalten können. Die Pakete sind also viel unterschiedlicher.
Jeff Becker hat geschrieben:Noch eine kleine Frage wenn man jetzt die geschwindigkeits Daten an ein Schrittmotor weiter geben möchte, wie würde man das denn mit einbinden?
Wenn man sich das Leben einfach machen will oder wenig Ahnung hat bindet man dafür am besten eine fertige Library ins Script ein. Das ging früher mit der X25-Library sehr einfach ( https://github.com/clearwater/SwitecX25" target="_blank ).
Das Problem war vor einiger Zeit allerdings, das diese Library (zumindest bei mir) auf Teufel komm raus Fehler geschmissen hat in der Version der Arduino IDE die für das Zusi 3 Script nötig ist. Mit älteren IDEs ging dann die X25, aber das Z3 Script nicht. Das war der Punkt wo ich erstmal den Converter benutzt und das alte Script gelassen hab...
Mein Baubericht von der echten Bahn zum Schönberger Strand:
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/

Benutzeravatar
nonesense
Beiträge: 504
Registriert: 15.07.2006 12:50:10
Aktuelle Projekte: QDmi
Fahrpult Einheitsführerstand
Ludmilla
Wohnort: Köln
Kontaktdaten:

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

#214 Beitrag von nonesense »

Jeff Becker hat geschrieben:Noch eine kleine Frage wenn man jetzt die geschwindigkeits Daten an ein Schrittmotor weiter geben möchte, wie würde man das denn mit einbinden?
Wenn es ein Schrittmotor mit 4 Anschlüssen ist, kannst du auch meinen Code für die Manometerplatinen verwenden.
Gruß
Jens
Zuletzt geändert von nonesense am 07.06.2017 09:08:51, insgesamt 1-mal geändert.

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

#215 Beitrag von Jeff Becker »

Ok klingt interessant und wo bekomme ich den her?
Mit freundlichen Grüßen Jeff
Mein Projekt: Mein eigenes Fahrpult. Schaut doch mal vorbei
https://m.youtube.com/channel/UCrpDMup3YWCyJkPzLzLuf2w

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

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

#216 Beitrag von F. Schn. »

Jeff Becker hat geschrieben:So ich habe mal den LM Schleudern hinzugefügt. Ist das so richtig oder habe ich noch was vergessen.
Also das abonieren sieht richtig aus, mir ist allerdings nicht so klar, wie du den Leuchtmelder dann verarbeiten möchtest. So wie ich sehe frägst du das empfangene Signal nirgendwo ab.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

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

#217 Beitrag von Jeff Becker »

Ok das heißt das abonnieren wäre getan, das heißt ich muss jetzt noch etwas hinzufügen. Ist das das mit diesen Ebenen. Du musst mich entschuldigen wenn ich es nicht sofort auf den Blick verstehe, denn wie gesagt meine Programmierkünste sind nicht wirklich gut :D

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

#218 Beitrag von Gero »

Moin,

habe da mal eine Frage:

Hat irgendwer von euch einen Trick, wie ich die Fahrstufenanzeige bei Drehstromloks ausschalte bzw. bei 0 belasse?
Die zeigt bei Drehstromloks auch mal Werte >100 (Sollzugkraft gesamt?)
Ist etwas eklig anzusehen in meinem Steuerwagenpult, weil die Stufenanzeige für 110, 218 & Co funktionieren muss.
Wird die Fahrstufenvariable bei der Berechnung von Drehstromantrieben überhaupt verwendet? @Carsten

LG Gero
Zuletzt geändert von Gero am 09.07.2017 15:56:13, insgesamt 1-mal geändert.

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

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

#219 Beitrag von F. Schn. »

Vermutlich schwierig, siehe hier: https://forum.zusi.de/viewtopic.php?f=73&t=12792" target="_blank
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

#220 Beitrag von Gero »

An meinem Arduino Mega hängt schon per i2c ein 1,8" Kalibrierdisplay, auf dem die schiebende Baureihe eingestellt werden muss, könnte da den Wert abzapfen. Aber gibt eine Drehstromlok nicht irgendwo mal einen Wert weniger aus?

Man kann ja jetzt schon nach dem Schema vorgehen:

Code: Alles auswählen

Zugkraft/Achse != 0 && Zugkraft/Achse STW == 0 --> Es führt eine Lok
Zugkraft/Achse == 0 && Zugkraft/Achse STW != 0 --> Es führt ein Steuerwagen
Zugkraft/Achse != 0 && Zugkraft/Achse STW != 0 --> Es liegt eine Mehrfachtraktion vor

Motordrehzahl == 0 && Motorstrom != 0 --> Es handelt sich um einen Elektroantrieb
Motordrehzahl != 0 && Motorstrom == 0 --> Es handelt sich um einen Dieselantrieb
Senden Drehstromantriebe eine Motorspannung?

Gero
Zuletzt geändert von Gero am 09.07.2017 17:08:52, insgesamt 2-mal geändert.

Antworten