PZB 90 Leuchtmelderblock zu verkaufen
Verfasst: 14.10.2021 23:29:54
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 ();
}
}
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 ();
}
}
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);}
}
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.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^^
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.
Super erklärt, danke dir! Das wird ein kleines Projekt werden, da ist die direkte Ansprache vielleicht ein guter Kompromiss.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. )