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
Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

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

#321 Beitrag von Kevin1897 »

Habe den Code wie folgt abgeändert:

Code: Alles auswählen

#include <SPI.h>
#include <Ethernet.h>  //<Ehternet2.h>
boolean running = false;
unsigned long interval = 500;  // the time we need to wait
unsigned long previousMillis = 0; // millis() returns an unsigned long.

byte ZusiIP[4] = {192, 168, 178, 34};
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, 178, 44);//ip adres Arduino Ethernet Shield
IPAddress server(192, 168, 178, 34); //ip Adresse Zusi3

// 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, 0x2, 0x0,  // Druck Hauptluftleitung
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, 0x0,  // Druck Bremszylinder
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0,  // Druck Hauptluftbehälter
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x25, 0x0, // Fahrtrichtung Vorne
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x26, 0x0, // Fahrtrichtung Rueck
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x57, 0x0, // Zustand Federspeicherbremse
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x9, 0x0,  // Zugkraft gesamt
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x13, 0x0, // Hauptschalter
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x15, 0x0, // Fahrstufe
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x20, 0x0, // LM Hochabbremsung Aus/Ein
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1b, 0x0, // LM Schleudern
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1c, 0x0, // LM Gleiten
                      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           <<<<<  T Ü R E N  >>>>>
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x7c, 0x0, // Zugkraft gesamt Steuerwagen
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x85, 0x0, // Fahrstufe Steuerwagen
                      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(21, OUTPUT); //PIN21 AUSGANG LM SCHLEUDERN
  pinMode(22, OUTPUT); //PIN22 Ausgang LM hohe Abbremsung ein
  pinMode(23, OUTPUT); //PIN23 Ausgang LM TAV
  pinMode(24, OUTPUT); //PIN24 Ausgang TT LINKS
  pinMode(25, OUTPUT); //PIN25 Ausgang TT RECHTS
  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

  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, 122);              // *** Vorsicht !!! *** Muss der tatsaechlichen Anzahl von Bytes in der Serie "Abfrage" s.o. entsprechen #154
}

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
            if (dataGroup.i == 0x000A) {
              if (nutzdata.b[0] == 0) {
                digitalWrite(23, LOW);
              }
              if (nutzdata.b[0] == 1) {
                digitalWrite(23, HIGH);
              }

            }
            // TT LINKS

            else if (dataGroup.i == 0x0008) {
              Serial.print("Status Melder links: ");
              Serial.println(nutzdata.b[0]);
              if (nutzdata.b[0] == 1) {

                digitalWrite(24, HIGH);
              }
              if (nutzdata.b[0] == 0) {
                digitalWrite(24, LOW);
              }
            }

            // TT RECHTS
            else if (dataGroup.i == 0x0009) {
              if (nutzdata.b[0] == 1) {
                digitalWrite(25, HIGH);
              }
              if (nutzdata.b[0] == 0) {
                digitalWrite(25, LOW);
              }
            }


            //TT LINKS & RECHTS BLINKEND
            unsigned long currentMillis = millis();
            if (nutzdata.b[0] == 2 && currentMillis - previousMillis >= interval) {
              previousMillis = currentMillis;
              running = !running; // toggle running variable
              digitalWrite(24, running); // indicate via LED
              digitalWrite(25, running);
            }

          } 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 ();
  }
}
Naja mich würde es erstmal in erster Linie interessieren, warum er sich nicht als Client in ZUSI anmeldet, obwohl alle angaben stimmen, und wo der Fehler in dem Sketch ist.
BR620/622/642 BR8442 ;-)

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

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

#322 Beitrag von F. Schn. »

Hast du auf die *** Vorsicht ***-Zeile geachtet?
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

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

#323 Beitrag von Kevin1897 »

Ja habe Ich. Habe das auch schon angepasst. Er zeigt mir aber trotzdem in ZUSI Kein Client an.
Welchen Programmcode nutzt du denn?

Hinweis: Habe herausgefunden das nach der Eingabe der Parameter

Code: Alles auswählen

0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1D, 0x0, // MG-Bremse
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x25, 0x0, // Fahrtrichtung Vorne
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x26, 0x0, // Fahrtrichtung Rueck
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x57, 0x0, // Zustand Federspeicherbremse
Kein Clientname mehr angezeigt wird in ZUSI.
BR620/622/642 BR8442 ;-)

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

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

#324 Beitrag von F. Schn. »

Also ich lese da 122. Ich komme auf 3*10+8*18 = 174.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

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

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

#325 Beitrag von Arne aus dem Norden »

Kevin1897 hat geschrieben: 04.11.2022 15:30:20 Naja mich würde es erstmal in erster Linie interessieren, warum er sich nicht als Client in ZUSI anmeldet, obwohl alle angaben stimmen, und wo der Fehler in dem Sketch ist.
Äh, du wunderst dich wirklich das er sich nicht verbinden will wenn er bei Upload auf den Arduino schon Fehler schmeisst?
Mein Baubericht von der echten Bahn zum Schönberger Strand:
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/

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

#326 Beitrag von Arne aus dem Norden »

Kevin1897 hat geschrieben: 04.11.2022 15:05:37 Gut dann muss ich nochmal suchen :)
Ich finde es nämlich nicht auf die schnelle xD Gibst du mir nen Tipp Bitte? :wand
Korrektur: Kann es mit dem Befehl AnalogWrite Zusammen hängen? Wo müsste denn was hin?
Ich zitiere mich mal selber und formatiere es diesmal etwas:
Du sagst ihm insgesant 12 mal im Script er soll die Geschwindigkeit auf den AnalogPIN "Tacho" ausgeben ohne vorher geschrieben zu haben welcher Pin das sein soll...
Und was noch viel schlimmer ist: du hast nirgends deklariert was "Tacho" überhaupt ist. Ein

Code: Alles auswählen

int Tacho;
ganz am Anfang des Scriptes könnte hier schon Wunder wirken, besser noch wäre

Code: Alles auswählen

int Tacho = 7;
wenn z.B. der AnalogPIN 7 genommen werden sollte.

Aber anscheinend hast du den Teil mit der Ausgabe ja aus dem Script gelöscht...
Kevin1897 hat geschrieben: 04.11.2022 15:05:37 Aber mal was anderes: Warum zeigt er mir im Seriellen Monitor solche Hyroglyphen denn an: v�������f�
Meistens weil die im serial.beginn(); aufgerufene Baudrate nicht genauso im seriellen Monitor der Arduino IDE eingestellt ist.
In deinem Fall vermutlich eher, weil das Script mit der Fehlermeldung ja garnicht vernünftig hochgeladen sein kann.
Kevin1897 hat geschrieben: 04.11.2022 15:05:37 Eine Verbindung zu ZUSI3 kommt auch nicht zustande, obwohl die IP adressen stimmen. :O
Wie schon mehrfach geschrieben - ich verstehe dich hier so, das der Upload garnicht funtioniert wegen fehlerhafter Deklarationen im Script. Dann wird auch sicher keine Verbindung zu Stande kommen...
Es sei denn du hast die Fehlermeldungen umgangen durch entfernen der entsprechenden Abschnitte der Ausgabe. Dann ist nur die Frage wozu du die Geschwindigkeit überhaupt berechnest...
Mein Baubericht von der echten Bahn zum Schönberger Strand:
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

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

#327 Beitrag von Kevin1897 »

So jetzt hab ich den Fehler Gefunden verbessert und Korrigiert.
Jetzt meckert er nur noch rum mit der Set HL Variable..
Deshalb habe ich die jetzt mal auskommentiert...

Jetzt habe Ich nur noch das Problem, dass das Programm kompiliiert wird, aber der Arduino wird nicht in ZUSI angezeigt...
BR620/622/642 BR8442 ;-)

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

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

#328 Beitrag von Kevin1897 »

F. Schn. hat geschrieben: 04.11.2022 17:00:04 Also ich lese da 122. Ich komme auf 3*10+8*18 = 174.
Darf ich fragen wie du die Werte Addiert bzw errechnet hast?

Anbei mal der jetzige Code mit Auskommentiertem HBL HL Druck...

Code: Alles auswählen

#include <SPI.h>
#include <Ethernet.h>  //<Ehternet2.h>
boolean running = false;
unsigned long interval = 500;  // the time we need to wait
unsigned long previousMillis = 0; // millis() returns an unsigned long.

byte ZusiIP[4] = {192, 168, 178, 34};
float vv;
int hll = 0;
int n = 0;
int nn = 0;
int f = 1;
int x = 0;
int vIst;
int Tacho = 7;
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, 178, 44);//ip adres Arduino Ethernet Shield
IPAddress server(192, 168, 178, 34); //ip Adresse Zusi3

// 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, 0x2, 0x0,  // Druck Hauptluftleitung
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, 0x0,  // Druck Bremszylinder
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0,  // Druck Hauptluftbehälter
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1D, 0x0, // MG-Bremse
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x25, 0x0, // Fahrtrichtung Vorne
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x26, 0x0, // Fahrtrichtung Rueck
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x57, 0x0, // Zustand Federspeicherbremse
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x9, 0x0,  // Zugkraft gesamt
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x13, 0x0, // Hauptschalter
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x15, 0x0, // Fahrstufe
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x20, 0x0, // LM Hochabbremsung Aus/Ein
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1b, 0x0, // LM Schleudern
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1c, 0x0, // LM Gleiten
                      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           <<<<<  T Ü R E N  >>>>>
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x7c, 0x0, // Zugkraft gesamt Steuerwagen
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x85, 0x0, // Fahrstufe Steuerwagen
                      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(21, OUTPUT); //PIN21 AUSGANG LM SCHLEUDERN
  pinMode(22, OUTPUT); //PIN22 Ausgang LM hohe Abbremsung ein
  pinMode(23, OUTPUT); //PIN23 Ausgang LM TAV
  pinMode(24, OUTPUT); //PIN24 Ausgang TT LINKS
  pinMode(25, OUTPUT); //PIN25 Ausgang TT RECHTS
  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
 

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

  delay(2000);                             // Zeit, dass sich das Ethernet Shield initialisiert (2000ms)
  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, 174);              // *** Vorsicht !!! *** Muss der tatsaechlichen Anzahl von Bytes in der Serie "Abfrage" s.o. entsprechen #154
}

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
            if (dataGroup.i == 0x000A) {
              if (nutzdata.b[0] == 0) {
                digitalWrite(23, LOW);
              }
              if (nutzdata.b[0] == 1) {
                digitalWrite(23, HIGH);
              }

            }
            // TT LINKS

            else if (dataGroup.i == 0x0008) {
              Serial.print("Status Melder links: ");
              Serial.println(nutzdata.b[0]);
              if (nutzdata.b[0] == 1) {

                digitalWrite(24, HIGH);
              }
              if (nutzdata.b[0] == 0) {
                digitalWrite(24, LOW);
              }
            }

            // TT RECHTS
            else if (dataGroup.i == 0x0009) {
              if (nutzdata.b[0] == 1) {
                digitalWrite(25, HIGH);
              }
              if (nutzdata.b[0] == 0) {
                digitalWrite(25, LOW);
              }
            }


            //TT LINKS & RECHTS BLINKEND
            unsigned long currentMillis = millis();
            if (nutzdata.b[0] == 2 && currentMillis - previousMillis >= interval) {
              previousMillis = currentMillis;
              running = !running; // toggle running variable
              digitalWrite(24, running); // indicate via LED
              digitalWrite(25, running);
            }

          } 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);
              switch(dataGroup.i){
            case 0x0001:   //Geschwindigkeit in m/s
            float geschwindigkeit = nutzdata.f * 3.6;
            if (geschwindigkeit == 0) analogWrite(Tacho, 0);
            else if(geschwindigkeit <=  10) analogWrite(Tacho,      geschwindigkeit     /10* 8);
            else if(geschwindigkeit <=  20) analogWrite(Tacho,   8+(geschwindigkeit- 10)/10* 4);
            else if(geschwindigkeit <=  30) analogWrite(Tacho,  12+(geschwindigkeit- 20)/10* 12);
            else if(geschwindigkeit <=  40) analogWrite(Tacho,  24+(geschwindigkeit- 30)/10* 13);
            else if(geschwindigkeit <=  80) analogWrite(Tacho,  37+(geschwindigkeit- 40)/10* 14);
            else if(geschwindigkeit <=  90) analogWrite(Tacho,  93+(geschwindigkeit- 80)/10* 13);
            else if(geschwindigkeit <= 100) analogWrite(Tacho, 106+(geschwindigkeit- 90)/10* 15);
            else if(geschwindigkeit <= 130) analogWrite(Tacho, 121+(geschwindigkeit-100)/10* 13);
            else if(geschwindigkeit <= 140) analogWrite(Tacho, 160+(geschwindigkeit-130)/10* 12);
            else if(geschwindigkeit <= 145) analogWrite(Tacho, 172+(geschwindigkeit-140)/10* 13);
            else analogWrite(Tacho, 177);
          break;
        
      //  case 0x0002:  {  //Druck HL
      //   Serial.println("HL");
      //    set_hl(nutzdata.f); //eigene Funktion zum Ansteuern des Schrittmotors
      //  break; }
        
      //  case 0x0004:  {  //Druck HBL
      //    Serial.println("HBL");
      //    set_hbl(nutzdata.f); //eigene Funktion zum Ansteuern des Schrittmotors
      //  break; }
      //        }
            }
          }
        }

      }
    }
  }
  // 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 ();
    }
  }
 }
BR620/622/642 BR8442 ;-)

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

#329 Beitrag von Carsten Hölscher »

Ich denke, Du solltest mal ein paar Tage in die Grundlagen stecken. Es gibt sicherlch ausreichend Tutorials zum Arduino.

Carsten

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

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

#330 Beitrag von Kevin1897 »

Tut mir leid falls ich mit meinen Fragen Genervt hab :(
Nur Arduino war bisschen zu neu für mich und Ich dachte die Sketche würden so simpel funktionieren.

Liebe Grüße,

Kevin
BR620/622/642 BR8442 ;-)

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

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

#331 Beitrag von F. Schn. »

Kevin1897 hat geschrieben: 04.11.2022 18:03:51
F. Schn. hat geschrieben: 04.11.2022 17:00:04 Also ich lese da 122. Ich komme auf 3*10+8*18 = 174.
Darf ich fragen wie du die Werte Addiert bzw errechnet hast?
Ich kann mich natürlich verzählt oder verrechnet haben, aber
0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0xFF, 0xFF, 0xFF, 0xFF,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0xFF, 0xFF, 0xFF, 0xFF,
0x0, 0x0, 0x0, 0x0, 0xA, 0x0, + 0xFF, 0xFF, 0xFF, 0xFF,
sind drei Knoten zu je 10 Bytes. (Das sind die eine Zeile ganz am Anfang und die drei Zeilen ganz am Ende)

Von Geschwindigkeit m/s bis Fahrstufe Steuerwagen sind es 18 Zeilen zu je 8 Bytes.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

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

#332 Beitrag von Kevin1897 »

Hallo Zusammen,

dank deiner Antwort habe Ich es jetzt geschafft, das Programm lauffähig zu bekommen. Dank der Rechenweise ist das jetzt 182. Das hat Funktioniert. Danke F. Schn. für den Tipp.

Wenn mir jetzt noch jemand Helfen könnte mit den Ausgaben der Werte für HBL und HL dass diese per PWM Ausgegeben werden.
Aufgrund eines Fehlers habe Ich diese jetzt im Sketch Auskommentiert

Code: Alles auswählen

#include <SPI.h>
#include <Ethernet.h>  //<Ehternet2.h>
boolean running = false;
unsigned long interval = 500;  // the time we need to wait
unsigned long previousMillis = 0; // millis() returns an unsigned long.

byte ZusiIP[4] = {192, 168, 178, 34};
float vv;
int hll = 0;
int n = 0;
int nn = 0;
int f = 1;
int x = 0;
int vIst;
int Tacho = 7;
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, 178, 44);//ip adres Arduino Ethernet Shield
IPAddress server(192, 168, 178, 34); //ip Adresse Zusi3

// 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, 0x2, 0x0,  // Druck Hauptluftleitung
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, 0x0,  // Druck Bremszylinder
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0,  // Druck Hauptluftbehälter
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1D, 0x0, // MG-Bremse
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x25, 0x0, // Fahrtrichtung Vorne
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x26, 0x0, // Fahrtrichtung Rueck
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x57, 0x0, // Zustand Federspeicherbremse
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x9, 0x0,  // Zugkraft gesamt
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x13, 0x0, // Hauptschalter
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x15, 0x0, // Fahrstufe
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x20, 0x0, // LM Hochabbremsung Aus/Ein
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1b, 0x0, // LM Schleudern
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1c, 0x0, // LM Gleiten
                      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           <<<<<  T Ü R E N  >>>>>
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x7c, 0x0, // Zugkraft gesamt Steuerwagen
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x85, 0x0, // Fahrstufe Steuerwagen
                      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(21, OUTPUT); //PIN21 AUSGANG LM SCHLEUDERN
  pinMode(22, OUTPUT); //PIN22 Ausgang LM hohe Abbremsung ein
  pinMode(23, OUTPUT); //PIN23 Ausgang LM TAV
  pinMode(24, OUTPUT); //PIN24 Ausgang TT LINKS
  pinMode(25, OUTPUT); //PIN25 Ausgang TT RECHTS
  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
 

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

  delay(2000);                             // Zeit, dass sich das Ethernet Shield initialisiert (2000ms)
  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, 182);              // *** Vorsicht !!! *** Muss der tatsaechlichen Anzahl von Bytes in der Serie "Abfrage" s.o. entsprechen #154/174
}

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
            if (dataGroup.i == 0x000A) {
              if (nutzdata.b[0] == 0) {
                digitalWrite(23, LOW);
              }
              if (nutzdata.b[0] == 1) {
                digitalWrite(23, HIGH);
              }

            }
            // TT LINKS

            else if (dataGroup.i == 0x0008) {
              Serial.print("Status Melder links: ");
              Serial.println(nutzdata.b[0]);
              if (nutzdata.b[0] == 1) {

                digitalWrite(24, HIGH);
              }
              if (nutzdata.b[0] == 0) {
                digitalWrite(24, LOW);
              }
            }

            // TT RECHTS
            else if (dataGroup.i == 0x0009) {
              if (nutzdata.b[0] == 1) {
                digitalWrite(25, HIGH);
              }
              if (nutzdata.b[0] == 0) {
                digitalWrite(25, LOW);
              }
            }


            //TT LINKS & RECHTS BLINKEND
            unsigned long currentMillis = millis();
            if (nutzdata.b[0] == 2 && currentMillis - previousMillis >= interval) {
              previousMillis = currentMillis;
              running = !running; // toggle running variable
              digitalWrite(24, running); // indicate via LED
              digitalWrite(25, running);
            }

          } 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);
              switch(dataGroup.i){
            case 0x0001:   //Geschwindigkeit in m/s
            float geschwindigkeit = nutzdata.f * 3.6;
            if (geschwindigkeit == 0) analogWrite(Tacho, 0);
            else if(geschwindigkeit <=  10) analogWrite(Tacho,      geschwindigkeit     /10* 8);
            else if(geschwindigkeit <=  20) analogWrite(Tacho,   8+(geschwindigkeit- 10)/10* 4);
            else if(geschwindigkeit <=  30) analogWrite(Tacho,  12+(geschwindigkeit- 20)/10* 12);
            else if(geschwindigkeit <=  40) analogWrite(Tacho,  24+(geschwindigkeit- 30)/10* 13);
            else if(geschwindigkeit <=  80) analogWrite(Tacho,  37+(geschwindigkeit- 40)/10* 14);
            else if(geschwindigkeit <=  90) analogWrite(Tacho,  93+(geschwindigkeit- 80)/10* 13);
            else if(geschwindigkeit <= 100) analogWrite(Tacho, 106+(geschwindigkeit- 90)/10* 15);
            else if(geschwindigkeit <= 130) analogWrite(Tacho, 121+(geschwindigkeit-100)/10* 13);
            else if(geschwindigkeit <= 140) analogWrite(Tacho, 160+(geschwindigkeit-130)/10* 12);
            else if(geschwindigkeit <= 145) analogWrite(Tacho, 172+(geschwindigkeit-140)/10* 13);
            else analogWrite(Tacho, 177);
          break;
        
 //           case 0x0002:  {  //Druck HL
 //           Serial.println("HL");
 //           set_hl(nutzdata.f); //eigene Funktion zum Ansteuern des Schrittmotors
 //           break; }
        
 //           case 0x0004:  {  //Druck HBL
 //           Serial.println("HBL");
 //           set_hbl(nutzdata.f); //eigene Funktion zum Ansteuern des Schrittmotors
 //           break; }
             }
            }
          }
        }

      }
    }
  }
  // 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 ();
      }
    } 
  
Beste Grüße,
Kevin
BR620/622/642 BR8442 ;-)

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

#333 Beitrag von nonesense »

Kevin1897 hat geschrieben: 08.11.2022 19:29:27Wenn mir jetzt noch jemand Helfen könnte mit den Ausgaben der Werte für HBL und HL dass diese per PWM Ausgegeben werden.
Aufgrund eines Fehlers habe Ich diese jetzt im Sketch Auskommentiert

Code: Alles auswählen

 //           case 0x0002:  {  //Druck HL
 //           Serial.println("HL");
 //           set_hl(nutzdata.f); //eigene Funktion zum Ansteuern des Schrittmotors
 //           break; }
        
 //           case 0x0004:  {  //Druck HBL
 //           Serial.println("HBL");
 //           set_hbl(nutzdata.f); //eigene Funktion zum Ansteuern des Schrittmotors
 //           break; }
Warum schreibst du denn nicht, was für einen Fehler? Aber lass mich raten... Er meckert, weil es die Funktion "set_hl" nicht gibt.
Vorgesehen sind zwei Funktionen, denen jeweils die beiden Drücke übergeben werden. Da jeder seine Manometer anders Ansteuert muss sich der Verwender des Beispielcodes selber ausdenken, wie er es mache will, bzw. die Funktionen "set_hl" und "set_hbl" selber schreiben.

Also musst du dir diese beiden Funktionen, mit Floatingpoint-Übergabeparameter, einbauen. Innerhalb dieser skalierst du den Floatingpoint-Wert auf den PWM-Ausgang und konvertierst den zu einem Byte. Also z.B. 0bar bis 12bar nach 0 bis 255, unter der Annahme, dass 255 der Maximale Ausschlag des Anzeiger ist und dieser dann auf 12bar zeigt.
Bitte lies dir dazu folgende Artikel durch:
Datentyp float/
Eigene Funktionen schreiben
Werte begrenzen
Wertebereich einem anderen Wertebereich zuweisen
PWM auf Pin ausgeben

Gruß
Jens

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

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

#334 Beitrag von Kevin1897 »

Stimmt dann sollte Ich mir das mal anschauen, weil ich bin ehrlich das übersteigt jetzt mein verstand XD
BR620/622/642 BR8442 ;-)

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

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

#335 Beitrag von Kevin1897 »

Hallo Zusammen,

bitte Entschuldigt, wenn Ich dieses Alte Thema wieder aufgreife. Ich habe nun etwas am Code Experimentiert und einige Dinge hinzugefügt und geändert.
Jetzt habe ich Allerdings ein Phänomen, dass die Seriellen Ausgaben vom Arduino in die IDE mit �k���ڞ�f�ڛ�ޒ���:�Z�:�JL Gekennzeichnet wird, Anstatt den Text darzustellen..

Habe Ich im Programmcode etwas übersehen? Oder habe ich da orgendwo einen Fehler gemacht? Ich finde den Fehler Einfach nicht.
Ebenso bräuchte ich noch kurz hilfe mit der Funktion für die Ausgabe der Variablen HBL und HL Bitte.

Anbei der Code:

Code: Alles auswählen

// (C) ZUSI3 Steuerung für Arduino Mega 2560
// Folgende Funktionen müssen noch Implementiert werden:
// - Tastenbefehle welche die Tasten Befehl 40, Frei und Wachsam vom Arduino auf den PC übersetzt
// - Tastenbefehle für Fahrtrichtung V/R
// - Tastenbefehle für SIFA
// - Tastenbefehle für Federspeicher Anlegen/Lösen
// - Tastenbefehle für Sanden / Mg-Bremse
// - Tastenbefehle für Hauptschalter / Stromabnehmer
// - HL HBL Werte Ausgabe über PWM an Schrittmotoren
// - Geschwindigkeitsausgabe über PWM an Schrittmotor

#include <SPI.h>
#include <Ethernet.h>  //<Ehternet2.h>
#include <Wire.h> // Verkabelung
#include <LiquidCrystal_I2C.h> //I2C-Steuerung eines LCD-Displays
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
//in “20, 4” ändern wenn 20x04 benutzt wird
boolean running = false;
unsigned long interval = 500;      // the time we need to wait
unsigned long previousMillis = 0;  // millis() returns an unsigned long.

byte ZusiIP[4] = { 192, 168, 178, 34 };
float vv;
int hll = 0;
int n = 0;
int nn = 0;
int f = 1;
int x = 0;
int vIst;
int Tacho = 7;
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, 178, 44);      //ip Adresse Arduino Ethernet Shield
IPAddress server(192, 168, 178, 34);  //ip Adresse Zusi3

// 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, 0x2, 0x0,   // Druck Hauptluftleitung
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, 0x0,   // Druck Bremszylinder
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0,   // Druck Hauptluftbehälter
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1D, 0x0,  // MG-Bremse
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x25, 0x0,  // Fahrtrichtung Vorne
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x26, 0x0,  // Fahrtrichtung Rueck
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x57, 0x0,  // Zustand Federspeicherbremse
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x9, 0x0,   // Zugkraft gesamt
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x13, 0x0,  // Hauptschalter
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x15, 0x0,  // Fahrstufe
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x20, 0x0,  // LM Hochabbremsung Aus/Ein
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1b, 0x0,  // LM Schleudern
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1c, 0x0,  // LM Gleiten
                      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           <<<<<  T Ü R E N  >>>>>
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x7c, 0x0,  // Zugkraft gesamt Steuerwagen
                      0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x85, 0x0,  // Fahrstufe Steuerwagen
                      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() {
  // LCD Initialisieren
  lcd.init();
  lcd.backlight();
  delay(250);
  lcd.noBacklight();
  delay(500);
  lcd.backlight();
  delay(500);
  // Aus und Eingänge festlegen
  pinMode(21, OUTPUT);  //PIN21 AUSGANG LM SCHLEUDERN
  pinMode(22, OUTPUT);  //PIN22 Ausgang LM hohe Abbremsung ein
  pinMode(23, OUTPUT);  //PIN23 Ausgang LM TAV
  pinMode(24, OUTPUT);  //PIN24 Ausgang TT LINKS
  pinMode(25, OUTPUT);  //PIN25 Ausgang TT RECHTS
  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(38, OUTPUT);  //PIN38 Ausgang PZB Summer




  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


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

  delay(1500);                     // Zeit, dass sich das Ethernet Shield initialisiert (1500ms)
  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("Keine Verbindung");  // Falls die Verbindung nicht klappt erfolgt die Meldung auf den Monitor
  }

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

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


// Endlosschleife
void loop() {
  // LCD Routine mit Definiertem Text
  lcd.setCursor(0, 0);
  lcd.print(" ZUSI3 FAHRPULT");
  lcd.setCursor(0, 1);
  lcd.print("CKD TATRA KT4Dt");
  delay(1000);

  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] == 0) {
                  digitalWrite(26, HIGH);  //SIFA Leuchtmelder einschalten
                }
                if (nutzdata.b[0] == 1) {
                  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] == 0) {
                    digitalWrite(37, HIGH);
                  }
                  if (nutzdata.b[0] == 1) {
                    digitalWrite(37, LOW);
                  }
                } else if (dataGroup.i == 0x0006) {  // Melder U
                  if (nutzdata.b[0] == 0) {
                    digitalWrite(27, HIGH);
                  }
                  if (nutzdata.b[0] == 1) {
                    digitalWrite(27, LOW);
                  }
                } else if (dataGroup.i == 0x0007) {  // Melder M
                  if (nutzdata.b[0] == 0) {
                    digitalWrite(29, HIGH);
                  }
                  if (nutzdata.b[0] == 1) {
                    digitalWrite(29, LOW);
                  }
                } else if (dataGroup.i == 0x0008) {  // Melder O
                  if (nutzdata.b[0] == 0) {
                    digitalWrite(31, HIGH);
                  }
                  if (nutzdata.b[0] == 1) {
                    digitalWrite(31, LOW);
                  }
                } else if (dataGroup.i == 0x000A) {  // Melder 500 Hz
                  if (nutzdata.b[0] == 0) {
                    digitalWrite(35, HIGH);
                  }
                  if (nutzdata.b[0] == 1) {
                    digitalWrite(35, LOW);
                  }
                } else if (dataGroup.i == 0x000B) {  // Melder Befehl
                  if (nutzdata.b[0] == 0) {
                    digitalWrite(33, HIGH);
                  }
                  if (nutzdata.b[0] == 1) {
                    digitalWrite(33, LOW);
                  } else if (dataGroup.i == 0x0009) {  // PZB-Summer
                    if (nutzdata.b[0] >= 0) {
                      digitalWrite(38, HIGH);
                    }
                    if (nutzdata.b[0] == 1) {
                      digitalWrite(38, LOW);
                    }
                  }
                }
              }
            } else if ((ebene >= 3) && (ebene3Status == 0x0066)) {  //Türsystem
              if (dataGroup.i == 0x000A) {
                if (nutzdata.b[0] == 0) {
                  digitalWrite(23, LOW);
                }
                if (nutzdata.b[0] == 1) {
                  digitalWrite(23, HIGH);
                }

              }
              // TT LINKS

              else if (dataGroup.i == 0x0008) {
                Serial.print("Status Melder links: ");
                Serial.println(nutzdata.b[0]);
                if (nutzdata.b[0] == 1) {

                  digitalWrite(24, HIGH);
                }
                if (nutzdata.b[0] == 0) {
                  digitalWrite(24, LOW);
                }
              }

              // TT RECHTS
              else if (dataGroup.i == 0x0009) {
                if (nutzdata.b[0] == 1) {
                  digitalWrite(25, HIGH);
                }
                if (nutzdata.b[0] == 0) {
                  digitalWrite(25, LOW);
                }
              }


              //TT LINKS & RECHTS BLINKEND
              unsigned long currentMillis = millis();
              if (nutzdata.b[0] == 2 && currentMillis - previousMillis >= interval) {
                previousMillis = currentMillis;
                running = !running;         // toggle running variable
                digitalWrite(24, running);  // indicate via LED
                digitalWrite(25, running);
              }

            } 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);
                switch (dataGroup.i) {
                  case 0x0001:  //Geschwindigkeit in m/s
                    float geschwindigkeit = nutzdata.f * 3.6;
                    if (geschwindigkeit == 0) analogWrite(Tacho, 0);
                    else if (geschwindigkeit <= 10) analogWrite(Tacho, geschwindigkeit / 10 * 8);
                    else if (geschwindigkeit <= 20) analogWrite(Tacho, 8 + (geschwindigkeit - 10) / 10 * 4);
                    else if (geschwindigkeit <= 30) analogWrite(Tacho, 12 + (geschwindigkeit - 20) / 10 * 12);
                    else if (geschwindigkeit <= 40) analogWrite(Tacho, 24 + (geschwindigkeit - 30) / 10 * 13);
                    else if (geschwindigkeit <= 80) analogWrite(Tacho, 37 + (geschwindigkeit - 40) / 10 * 14);
                    else if (geschwindigkeit <= 90) analogWrite(Tacho, 93 + (geschwindigkeit - 80) / 10 * 13);
                    else if (geschwindigkeit <= 100) analogWrite(Tacho, 106 + (geschwindigkeit - 90) / 10 * 15);
                    else if (geschwindigkeit <= 130) analogWrite(Tacho, 121 + (geschwindigkeit - 100) / 10 * 13);
                    else if (geschwindigkeit <= 140) analogWrite(Tacho, 160 + (geschwindigkeit - 130) / 10 * 12);
                    else if (geschwindigkeit <= 145) analogWrite(Tacho, 172 + (geschwindigkeit - 140) / 10 * 13);
                    else analogWrite(Tacho, 177);
                    break;

                    //           case 0x0002:  {  //Druck HL
                    //           Serial.println("HL");
                    //           set_hl(nutzdata.f); //eigene Funktion zum Ansteuern des Schrittmotors
                    //           break; }

                    //           case 0x0004:  {  //Druck HBL
                    //           Serial.println("HBL");
                    //           set_hbl(nutzdata.f); //eigene Funktion zum Ansteuern des Schrittmotors
                    //           break; }
                }
              }
            }
          }
        }
      }
    }
    // wenn der Server getrennt wird, stoppt der Client und gibt seriell eine Meldung ab:
    if (!client.connected()) {
      Serial.println();
      Serial.println("Verbindung Gestoppt!");
      client.stop();
      // mache nichts:
      while (true)
        ;
      //resetFunc ();
    }
  }
}
Vielen Dank und Liebe Grüße
BR620/622/642 BR8442 ;-)

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

#336 Beitrag von Arne aus dem Norden »

Kevin1897 hat geschrieben: 07.05.2023 08:29:31 Jetzt habe ich Allerdings ein Phänomen, dass die Seriellen Ausgaben vom Arduino in die IDE mit �k���ڞ�f�ڛ�ޒ���:�Z�:�JL Gekennzeichnet wird, Anstatt den Text darzustellen..
Hi,

laß mich raten: die Geschwindigkeit am seriellen Monitor des Arduino steht noch auf 9600 Baud?
Falls ja: stell mal auf 115200...

LG, Arne
Mein Baubericht von der echten Bahn zum Schönberger Strand:
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

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

#337 Beitrag von Kevin1897 »

huhu,

habs mal Probiert mit 9600 Baud, jetzt gehts.
Könntest du mir bitte helfen mit den HL/HBL Drücken?

Ich raffs nicht :(
BR620/622/642 BR8442 ;-)

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

#338 Beitrag von Arne aus dem Norden »

Kevin1897 hat geschrieben: 08.05.2023 19:22:46 Könntest du mir bitte helfen mit den HL/HBL Drücken?
Ohne zu wissen für was oder in welcher Form die Werte ausgegeben werden sollen eher schlecht...

Edit: lese gerade weiter oben als PWM...
Das geht ganz genau so wie mit dem Tacho in den Zeilen darüber.
Nur das man - genau wie Jens schon geschrieben hat - den Ausgabewert entsprechend auf das Instrument skalieren muß. Also dem analogen Spannungsbereich entsprechend.
Mein Baubericht von der echten Bahn zum Schönberger Strand:
https://www.facebook.com/Hein-Sch%C3%B6 ... 601976323/

Kevin1897
Beiträge: 56
Registriert: 07.10.2022 21:53:59

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

#339 Beitrag von Kevin1897 »

Frage in die Runde,
suche das Kommando um die SIFA Hupe zu Aktivieren.
Als Ausgang habe Ich 39 definiert. Finde aber auf die Schnelle nicht den Befehl zum Einlesen der SIFA Hupe
BR620/622/642 BR8442 ;-)

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

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

#340 Beitrag von F. Schn. »

Lässt sich recht schnell finden, indem man die Doku "Anhang" aufmacht und nach "Sifa Hupe" sucht. Ergebnis ist 0002.000A.0064.0003 mit ein paar Sonderbedeutungen. Heißt, dass man hier die Knoten/ebenen beachten und auch auf den Datentyp aufpassen muss.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Antworten