PZB 90 Leuchtmelderblock zu verkaufen

Hier können Informationen zum Strecken- und Fahrzeugbau ausgetauscht werden, also z.B. Datenblätter, Gleispläne, Fahrpläne, Fotos.
Antworten
Nachricht
Autor
Benutzeravatar
Timo
Beiträge: 43
Registriert: 17.01.2011 14:47:24
Aktuelle Projekte: www.railswitch.de
Kontaktdaten:

PZB 90 Leuchtmelderblock zu verkaufen

#1 Beitrag von Timo »

Bereits verkauft, wer noch so einen haben möchte findet ihn im RailSwitch Webshop.

Bild

Beste Grüße,
Timo
Zuletzt geändert von Timo am 17.03.2024 16:05:09, insgesamt 5-mal geändert.
Schalter und Leuchtmelder für deinen Eisenbahnsimulator: www.RailSwitch.de

Benutzeravatar
Timo
Beiträge: 43
Registriert: 17.01.2011 14:47:24
Aktuelle Projekte: www.railswitch.de
Kontaktdaten:

Re: PZB 90 Leuchtmelderblock zu verkaufen - wieder verfügbar!

#2 Beitrag von Timo »

Anbei noch der Programmcode für den NodeMCU zur drahtlosen Übertragung der Daten zwischen Zusi TCP und PZB Leuchtmelderblock.

Code: Alles auswählen

#include <ESP8266WiFi.h>

#define SendKey 0

const char *host = "192.168.178.80"; // Lokale IP vom Zusi TCP Server häufig 192.168.X.X
const uint16_t port = 1436;  // Port zum Server
//WiFiServer server(port);

//Server connect to WiFi Network
const char *ssid = "FRITZ!Box 7590";  // WiFi SSID (Netzwerkname)
const char *password = "xxxxxx";  // WiFi Passwort

// 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
                    };

int count=0;

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

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();
}

void(* resetFunc) (void) = 0;  

//=======================================================================
//                    Power on setup
//=======================================================================
void setup() 
{
   // Aus und Eingänge festlegen
   pinMode(15, OUTPUT); // Tacho
   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(14, OUTPUT); // PIN27 Ausgang LM 55
   pinMode(28, OUTPUT); // PIN28 Ausgang LM 99
   pinMode(13, OUTPUT); // PIN29 Ausgang LM 70
   pinMode(30, INPUT);  // PIN30 Eingang Lampentest MFA
   pinMode(5, OUTPUT); // PIN31 Ausgang LM 85
   pinMode(32, INPUT);  // PIN32 Eingang Beleuchtung MFA heller
   pinMode(12, OUTPUT); // PIN33 Ausgang LM Befehl 40
   pinMode(34, INPUT);  // PIN34 Eingang Beleuchtung MFA dunkler
   pinMode(2, OUTPUT); // PIN35 Ausgang LM 500Hz
   pinMode(4, OUTPUT); // PIN37 Ausgang LM 1000Hz
  
  Serial.begin(115200);
  pinMode(SendKey,INPUT_PULLUP);
  Serial.println();
  
  WiFi.hostname("PZB 90 LM");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password); // Verbindung mit WiFi herstellen
 
  // Wait for connection  
  Serial.println("Verbindung herstellen zu ");
  Serial.println(ssid);
  while (WiFi.status() != WL_CONNECTED) {   
    delay(500);
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.print("Erfolgreich verbunden mit ");
  Serial.println(ssid);

  if(client.connect(host, port))
    {
      Serial.println("Verbunden mit Zusi TCP");
    } else {
      Serial.println("ERROR: Keine Verbindung zu Zusi TCP möglich!");
      delay(5000);
      return;
    }
    if(client.connected()){
        client.write (Anmeldung, sizeof(Anmeldung));
        delay(5000);
        client.write (Abfrage, sizeof(Abfrage)); 
    } 
}
//=======================================================================
//                    Loop
//=======================================================================

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

   Serial.println(dataLng.b[0]);
   Serial.println(dataLng.b[1]);
   Serial.println(dataLng.b[2]);
   Serial.println(dataLng.b[3]);

   
   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(4, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(4, LOW);}
                     } else if (dataGroup.i == 0x0006) { // Melder U
                        if (nutzdata.b[0] == 1) {digitalWrite(14, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(14, LOW);}
                     } else if (dataGroup.i == 0x0007) { // Melder M
                        if (nutzdata.b[0] == 1) {digitalWrite(13, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(13, LOW);}
                     } else if (dataGroup.i == 0x0008) { // Melder O
                        if (nutzdata.b[0] == 1) {digitalWrite(5, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(5, LOW);}
                     } else if (dataGroup.i == 0x000A) { // Melder 500 Hz
                        if (nutzdata.b[0] == 1) {digitalWrite(2, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(2, LOW);}
                     } else if (dataGroup.i == 0x000B) { // Melder Befehl
                        if (nutzdata.b[0] == 1) {digitalWrite(12, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(12, 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;
                  byte tacho = Geschw * 2.125; // Umrechnen für den Tacho
                  //Serial.print("A");
                  //Serial.println(Geschw);
                  analogWrite(15, tacho);
               } 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("Die Verbindung mit Zusi TCP wurde getrennt!");
  client.stop();
  // mache nichts:
  while (true);
  //resetFunc ();
 }
}
Liebe Grüße aus Hessen,
Timo
Schalter und Leuchtmelder für deinen Eisenbahnsimulator: www.RailSwitch.de

Zugprofi
Beiträge: 4
Registriert: 12.03.2024 20:33:43

Re: - verkauft - PZB 90 Leuchtmelderblock zu verkaufen

#3 Beitrag von Zugprofi »

Hi Timo,

ich hab's gekauft und muss sagen das sieht top aus. Gute Arbeit!

Funktioniert der Code auch mit einem Arduino Uno R4 Wifi oder muss ich da noch was basteln?

Grüße
Till

Benutzeravatar
Timo
Beiträge: 43
Registriert: 17.01.2011 14:47:24
Aktuelle Projekte: www.railswitch.de
Kontaktdaten:

Re: - verkauft - PZB 90 Leuchtmelderblock zu verkaufen

#4 Beitrag von Timo »

Hey Till,

Das sollte funktionieren, ich habe leider keinen Uno R4 Wifi zur Hand, du kannst aber mal folgendes probieren:
Ersetze #include <ESP8266WiFi.h> durch #include <WiFi.h>, um die richtige Bibliothek für den ESP32-Chip zu verwenden.

Code: Alles auswählen

#include <WiFi.h>
#define SendKey 0

// Zusi TCP Verbindungsdaten
const char *host = "192.168.178.80"; // Lokale IP vom Zusi TCP Server
const uint16_t port = 1436;  // Port zum Server TCP Server

// Mit deinem bestehenden Netzwerk verbinden
const char *ssid = "FRITZ!Box 7590";  // WiFi SSID (Netzwerkname)
const char *password = "xxxxxx";  // WiFi Passwort

// 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
                    };

int count=0;

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

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();
}

void(* resetFunc) (void) = 0;  

void setup() 
{
   // Aus und Eingänge festlegen
   pinMode(15, OUTPUT); // Tacho
   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(14, OUTPUT); // PIN27 Ausgang LM 55
   pinMode(28, OUTPUT); // PIN28 Ausgang LM 99
   pinMode(13, OUTPUT); // PIN29 Ausgang LM 70
   pinMode(30, INPUT);  // PIN30 Eingang Lampentest MFA
   pinMode(5, OUTPUT); // PIN31 Ausgang LM 85
   pinMode(32, INPUT);  // PIN32 Eingang Beleuchtung MFA heller
   pinMode(12, OUTPUT); // PIN33 Ausgang LM Befehl 40
   pinMode(34, INPUT);  // PIN34 Eingang Beleuchtung MFA dunkler
   pinMode(2, OUTPUT); // PIN35 Ausgang LM 500Hz
   pinMode(4, OUTPUT); // PIN37 Ausgang LM 1000Hz
  
  Serial.begin(115200);
  pinMode(SendKey,INPUT_PULLUP);
  Serial.println();
  
  WiFi.hostname("PZB 90 LM");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password); // Verbindung mit WiFi herstellen
 
  // Wait for connection  
  Serial.println("Verbindung herstellen zu ");
  Serial.println(ssid);
  while (WiFi.status() != WL_CONNECTED) {   
    delay(500);
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.print("Erfolgreich verbunden mit ");
  Serial.println(ssid);

  if(client.connect(host, port))
    {
      Serial.println("Verbunden mit Zusi TCP");
    } else {
      Serial.println("ERROR: Keine Verbindung zu Zusi TCP möglich!");
      delay(5000);
      return;
    }
    if(client.connected()){
        client.write (Anmeldung, sizeof(Anmeldung));
        delay(5000);
        client.write (Abfrage, sizeof(Abfrage)); 
    } 
}

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

   Serial.println(dataLng.b[0]);
   Serial.println(dataLng.b[1]);
   Serial.println(dataLng.b[2]);
   Serial.println(dataLng.b[3]);

   
   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(4, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(4, LOW);}
                     } else if (dataGroup.i == 0x0006) { // Melder U
                        if (nutzdata.b[0] == 1) {digitalWrite(14, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(14, LOW);}
                     } else if (dataGroup.i == 0x0007) { // Melder M
                        if (nutzdata.b[0] == 1) {digitalWrite(13, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(13, LOW);}
                     } else if (dataGroup.i == 0x0008) { // Melder O
                        if (nutzdata.b[0] == 1) {digitalWrite(5, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(5, LOW);}
                     } else if (dataGroup.i == 0x000A) { // Melder 500 Hz
                        if (nutzdata.b[0] == 1) {digitalWrite(2, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(2, LOW);}
                     } else if (dataGroup.i == 0x000B) { // Melder Befehl
                        if (nutzdata.b[0] == 1) {digitalWrite(12, HIGH);}
                        if (nutzdata.b[0] == 0) {digitalWrite(12, 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;
                  byte tacho = Geschw * 2.125; // Umrechnen für den Tacho
                  //Serial.print("A");
                  //Serial.println(Geschw);
                  analogWrite(15, tacho);
               } 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("Die Verbindung mit Zusi TCP wurde getrennt!");
  client.stop();
  // mache nichts:
  while (true);
  //resetFunc ();
 }
}
Du kannst den Quelltext gerne mal ausprobieren und mir eine Rückmeldung geben, gerne auch was im Seriellen Monitor ausgegeben wird.

Dein positives Feedback freut mich sehr!
Und falls jemand noch so einen PZB90 Würfel haben möchte, der findet ihn im RailSwitch Webshop.

Beste Grüße,
Timo
Schalter und Leuchtmelder für deinen Eisenbahnsimulator: www.RailSwitch.de

Zugprofi
Beiträge: 4
Registriert: 12.03.2024 20:33:43

Re: PZB 90 Leuchtmelderblock zu verkaufen

#5 Beitrag von Zugprofi »

Jo ich Versuche es und melde mich. Hatte mir auch fix ein NodeMCU bestellt und da hängt das Blinken der Lampen etwas. Also es ist unregelmäßig. Ist das bei dir auch so?

Grüße

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

Re: PZB 90 Leuchtmelderblock zu verkaufen

#6 Beitrag von nonesense »

Zugprofi hat geschrieben: 19.03.2024 18:06:53... da hängt das Blinken der Lampen etwas. Also es ist unregelmäßig.

Code: Alles auswählen

else if (dataGroup.i == 0x0006) { // Melder U
  if (nutzdata.b[0] == 1) {digitalWrite(14, HIGH);}
  if (nutzdata.b[0] == 0) {digitalWrite(14, LOW);}
} else if (dataGroup.i == 0x0007) { // Melder M
  if (nutzdata.b[0] == 1) {digitalWrite(13, HIGH);}
  if (nutzdata.b[0] == 0) {digitalWrite(13, LOW);}
} else if (dataGroup.i == 0x0008) { // Melder O
  if (nutzdata.b[0] == 1) {digitalWrite(5, HIGH);}
  if (nutzdata.b[0] == 0) {digitalWrite(5, LOW);}
 }
Moin!
Wenn man so programmiert ist das normal.
Die Leuchtmelder gehen dann an and aus, wenn Zusi ein neues Paket übertragen hat.
Nun gibt es auf der TCP Verbindung aber keine Echtzeitübertragung. Von daher läuft das recht unregelmäßig.

Besser ist es die IDs 0x0030 bis 0x0032 anstatt 0x0006 bis 0x0008 zu verwenden und sich das Blinken im Arduino selber zu erzeugen. Wollte hierzu schon immer mal einen generischen Code machen. ...Iregend wann^^
Zuletzt geändert von nonesense am 21.03.2024 12:30:51, insgesamt 1-mal geändert.

Wolfgang E.
Beiträge: 570
Registriert: 28.10.2021 12:16:41
Aktuelle Projekte: https://github.com/machinae-vectoriae-ductor/
Wohnort: Köln
Kontaktdaten:

Re: PZB 90 Leuchtmelderblock zu verkaufen

#7 Beitrag von Wolfgang E. »

ZusiDisplay hört auch auf die Bit-Signale für die Leuchtmelder. Dort fühlt es sich nicht so unregelmäßig an. Aber die Lösung, den Blinktakt selber zu erzeugen, ist auf jeden Fall besser.

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

Re: PZB 90 Leuchtmelderblock zu verkaufen

#8 Beitrag von F. Schn. »

Wesentlich einfacher und schneller als das ist, einfach in die Zusi-Einstellungen zu gehen und die Übertragungsrate noch mal etwas nach oben setzen. ;) (Die Wirkung ist da aber natürlich begrenzt. :) )
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Zugprofi
Beiträge: 4
Registriert: 12.03.2024 20:33:43

Re: PZB 90 Leuchtmelderblock zu verkaufen

#9 Beitrag von Zugprofi »

Besser ist es die IDs 0x0030 bis 0x0032 anstatt 0x0006 bis 0x0008 zu verwenden und sich das Blinken im Arduino selber zu erzeugen. Wollte hierzu schon immer mal einen generischen Code machen. ...Iregend wann^^
Sowas dachte ich auch schon, aber ich habe keinen Plan wie das alles abgefragt wird. Da müsste ich mich jetzt erst reinfuchsen. Aber danke für die Antwort. Da weiß ich, was noch möglich ist.

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

Re: PZB 90 Leuchtmelderblock zu verkaufen

#10 Beitrag von F. Schn. »

Du musst dich dann halt um einige Punkte selbst kümmern, wie z.B. die verschiedenen Taktraten von LZB- und Nicht-LZB-Geräten, sowie bei Bedarf auch den Einfluss des Zeitraffers, sowie möglichen abweichenden Daten bei Alt-PZB-Bauarten. (Ich bin mal gespannt, klingt zwischen den Zeilen so, als gäbe es mehrere Leute, die mal irgendwann was in die Richtung veröffentlichen wollten. ;) )
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Benutzeravatar
Timo
Beiträge: 43
Registriert: 17.01.2011 14:47:24
Aktuelle Projekte: www.railswitch.de
Kontaktdaten:

Re: PZB 90 Leuchtmelderblock zu verkaufen

#11 Beitrag von Timo »

Zugprofi hat geschrieben: 19.03.2024 18:06:53 Jo ich Versuche es und melde mich. Hatte mir auch fix ein NodeMCU bestellt und da hängt das Blinken der Lampen etwas. Also es ist unregelmäßig. Ist das bei dir auch so?

Grüße
Das ist am Anfang normal und lässt sich wie von F. Schn. beschrieben mit geringeren Werten (kürzere Zeiten) in den TCP Einstellungen bei Zusi gut kompensieren.
Einfach ein bisschen probieren, dann läuft es stabil und ohne störenden Verzug. Habe es so bei mir am Laufen und bin zufrieden mit der Übertragung.

Es macht natürlich Sinn den Quelltext zu optimieren, der ist im Moment jedenfalls mehr als Basis gedacht worauf man aufbauen kann.
Funktionieren sollte es aber und die Latenzen bei einer echten 189er sind schon zum Teil ausgeprägter im Display :schiel

Das mag für manche nur eine Spielerei sein, aber zusammen mit einer 18650er Zelle kann das einfach kabellos auf dem Tisch gestellt werden.
Bild
F. Schn. hat geschrieben: 19.03.2024 23:50:16 Du musst dich dann halt um einige Punkte selbst kümmern, wie z.B. die verschiedenen Taktraten von LZB- und Nicht-LZB-Geräten, sowie bei Bedarf auch den Einfluss des Zeitraffers, sowie möglichen abweichenden Daten bei Alt-PZB-Bauarten. (Ich bin mal gespannt, klingt zwischen den Zeilen so, als gäbe es mehrere Leute, die mal irgendwann was in die Richtung veröffentlichen wollten. ;) )
Super erklärt, danke dir! Das wird ein kleines Projekt werden, da ist die direkte Ansprache vielleicht ein guter Kompromiss.

Beste Grüße,
Timo
Schalter und Leuchtmelder für deinen Eisenbahnsimulator: www.RailSwitch.de

Zugprofi
Beiträge: 4
Registriert: 12.03.2024 20:33:43

Re: PZB 90 Leuchtmelderblock zu verkaufen

#12 Beitrag von Zugprofi »

Bild

Ich habe mir schon etwas gebastelt, ein LCD Display für die Sifa und Geschwindigkeit noch mit rein. Für MFA habe ich dann einen kleinen Bildschirm.

TCP Einstellungen ändere ich dann mal, etwas ruckeln stört nicht.

Grüße

Antworten