Wechselrichter Daten auslesen

Hallo zusammen,

ich möchte mit einem Wemos meine Wechselrichter seriell auslesen und habe mich mal ans Werk gemacht, leider komme ich nicht ganz weiter.

Das Gerät ein Phocos Anygrid, besitzt eine Serielle Schnittstelle RJ45, RX,TX und GND. Davon hängen bei mir 3 Stück im Inselbetrieb, diese sind auch miteinander verbunden Parallelkabeln und Signalleitungen) und liefern mit Hterm auch Daten. Damit Daten gesendet werden, muss man vorher was senden, QPGS0.
Mit Hterm sind das folgende Daten in Hex:

51 50 47 53 30 3F DA für QPGS0 Wechselrichter 1
51 50 47 53 31 2F FB für QPGS1 Wechselrichter 2
51 50 47 53 32 1F 98 für QPGS2 Wechselrichter 3

Empfangen in Hterm wird nach senden für z.B. die Hex Werte von QPGS0

Mein Code:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(4, 5); // RX, TX nodeMcu D1 = GPIO 5 /  D2 = GPIO 4

const unsigned int SEND_DURATION = 1000;
const unsigned int SEND_PAUSE = 10;

const int SERIAL_BUFFER_SIZE = 150;


unsigned long previousMillis;
bool sending;

const byte QPGS0[] = { 0x51, 0x50, 0x47, 0x53, 0x30, 0x3F, 0xDA  };
const byte QPGS1[] = { 0x51, 0x50, 0x47, 0x53, 0x31, 0x2F, 0xFB  };
const byte QPGS2[] = { 0x51, 0x50, 0x47, 0x53, 0x32, 0x1F, 0x98  };

char Ausgabe[50];
int i = 0;

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
// set the data rate for the SoftwareSerial port
  
}
mySerial.begin(2400);
}
void loop() {

  if (mySerial.available())
  {
    
    if (millis() - previousMillis > SEND_DURATION)
   {
    previousMillis = millis();
    mySerial.write(QPGS0,sizeof(QPGS0));
    mySerial.write( '\r' );
     delay(SEND_PAUSE);      //mal ganz einfach. 10ms sind hier nicht so schlimm
      //sending = false;
 //serielle Schnittstelle auslesen
  
    empfangeDaten(); // Sende über Softwareserial Empfange über Serial
   }
    if (millis() - previousMillis > SEND_DURATION)
   { 
    previousMillis = millis();
    mySerial.write(QPGS1,sizeof(QPGS1));
    mySerial.write( '\r' );
    delay(SEND_PAUSE);      //mal ganz einfach. 10ms sind hier nicht so schlimm
      //sending = false;
   }  

    empfangeDaten();
 
   
    if (millis() - previousMillis > SEND_DURATION)
   { 
    previousMillis = millis();
    mySerial.write(QPGS2,sizeof(QPGS2));
    mySerial.write( '\r' );
     delay(SEND_PAUSE);      //mal ganz einfach. 10ms sind hier nicht so schlimm
      //sending = false;
   } 

   
    empfangeDaten();

    
  }
    
}
  
  void empfangeDaten() {
    
    while (Serial.available()) {
    Serial.println("Ausgabe beginnt ");
    if (i < 149) {
      Ausgabe[i] = mySerial.read();
      Serial.print(Ausgabe[i]);
      Serial.println(i);
      i++;
    }
   } 
    
  }
   

  

Leider Empfange ich nichts auf der Seriellen Konsole, kann sich das jemand anschauen, was ich hier falsch mache?

Bilder vom Wemos:


Das Query Protokoll des Anygrid Wechselrichters:
Any-Grid_PSW-H_RS-232 Query Protocol_2019-02-21 (1).pdf (560.0 KB)

Das Ziel, die Wechselrichter Daten, über MQTT an den Iobroker zusenden.
Noch ein weiter Weg, denn wenn ich endlich mal eine Ausgabe auf dem Seriellenmonitor habe, muss ich die Daten erst Parsen.

Grüsse
Antonio

Wo setzt Du previousMillis = millis();?

Du mußt erst was empfangen, bevor mySerial.available() wahr wird.

1 Like

Hallo agmue,

du hast natürlich recht:

  if (millis() - previousMillis > SEND_DURATION)
   { 
    previousMillis = millis();
    mySerial.write(QPGS2,sizeof(QPGS2));
    mySerial.write( '\r' );
     delay(SEND_PAUSE);      //mal ganz einfach. 10ms sind hier nicht so schlimm
      sending = false;
   } 

   
    empfangeDaten();

OK, dann empfange ich nichts, habe mir von Sparkfun ein RS232 TTL Adapter heute bestellt, glaube das mini Teilchen das ich eingebaut hab, geht nicht.

Gruss
Antonio

Hast Du auch den zweiten Satz beachtet?

1 Like

Hallo agmue,

hab es umgeschrieben :slight_smile:

while (mySerial.available()) {

werde ich gleich testen

Gruß
Antonio

Hallo,

kommt nix an, glaube der Max ist defekt

Gruß
Tedesco

Ich mache mal darauf aufmerksam:

Wenn Du willst, das man Dir hilft, dann gehören die Bilder etc. hier her.
Zum nachlesen: Direktlink

Sorry, werde ich sofort ändern

Hallo zusammen,

habe gestern das neue RS232--TTL Adapter getauscht (eines von Sparkfun gekauft).

Habe dann auch den Code grundlegend geändert, jetzt werden Daten gesendet und empfangen, muss dieses aber beobachten da es immer wieder zu probleme kommt, da die Anygrid Wechselrichter wirklich sehr träge die Daten rausgeben. Hier der Code, in der zwischenzeit ergänzt mit MQTT. Nächster schritt ist die Daten zu Parsen.

#include <SoftwareSerial.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>

// Anforderung Wechselrichter Kommandos in HEX 16-bit Kalkulation

const byte QPGS0[] = { 0x51, 0x50, 0x47, 0x53, 0x30, 0x3F, 0xDA  };
const byte QPGS1[] = { 0x51, 0x50, 0x47, 0x53, 0x31, 0x2F, 0xFB  };
const byte QPGS2[] = { 0x51, 0x50, 0x47, 0x53, 0x32, 0x1F, 0x98  };

// WiFi-Zugangsdaten
const char* ssid = "mein ssid";
const char* password = "mein password";


// MQTT-Zugangsdaten
const char* mqtt_server = "192.168.2.68";
const int mqtt_port = 1886;
const char* mqtt_user = "*";
const char* mqtt_password = "*";
const char* mqtt_topic = "wechselrichter/werte";


// SoftwareSerial-Pins
const int rxPin = D2; // RX-Pin (Wechselrichter-Ausgang)
const int txPin = D1; // TX-Pin (Wechselrichter-Eingang)
SoftwareSerial serial(rxPin, txPin);


// PubSubClient-Instanz
WiFiClient espAnygrid;
PubSubClient client(espAnygrid);


void setup() 
{

// Starten der seriellen Kommunikation
Serial.begin(9600);
serial.begin(2400);

// Verbindung zum WiFi-Netzwerk herstellen
Serial.print("Verbindung zum WiFi-Netzwerk wird hergestellt...");
WiFi.begin(ssid, password);
		while (WiFi.status() != WL_CONNECTED) 
	{
		delay(5000);
		Serial.print(".");
	}

Serial.println();
Serial.println("WiFi-Verbindung hergestellt");

// Verbindung zum MQTT-Server herstellen
client.setServer(mqtt_server, mqtt_port);

		while (!client.connected()) 
	{
		Serial.print("Verbindung zum MQTT-Server wird hergestellt...");

			if (client.connect("wechselrichter-client", mqtt_user, mqtt_password))	
		{
			Serial.println("verbunden");

		}

		        else
		   {
			Serial.print("fehlgeschlagen, rc=");
			Serial.println(client.state());
			delay(5000);
		   }
	}
}


void loop()
 {
	// Wechselrichter 1 abfragen
	//serial.write("QPGS0+3FDA+\r");
	serial.write(QPGS0,sizeof(QPGS0));
	serial.write('\r');
	delay(10000); // Warten auf Antwort
		while (serial.available())
	 {
		// Lesen der Antwort
		String response = serial.readStringUntil('\r');
		Serial.println(response);
		client.publish(mqtt_topic, response.c_str());
	}
	// Wechselrichter 2 abfragen
	//serial.write("QPGS1+2FFB+\r");
	serial.write(QPGS1,sizeof(QPGS1));
	serial.write('\r');
	delay(10000); // Warten auf Antwort
		while (serial.available()) 
	{
		// Lesen der Antwort
		String response = serial.readStringUntil('\r');
		Serial.println(response);
		client.publish(mqtt_topic, response.c_str());
	}
	// Wechselrichter 3 abfragen
	//serial.write("QPGS2+1F98\r");
	serial.write(QPGS2,sizeof(QPGS2));
	serial.write('\r');
	delay(10000); // Warten auf Antwort
		while (serial.available()) 
	{
		// Lesen der Antwort
		String response = serial.readStringUntil('\r');
		Serial.println(response);
		client.publish(mqtt_topic, response.c_str());
	}
// Warten auf nächsten Durchlauf
delay(5000);
}

Das ist die Ausgabe vom Seriellen Monitor:

Grüße
Antonio

Hallo zusammen,

es gibt noch ein anderes Problem, die Daten werden nicht alle Empfangen.
Also müsste der Code so geändert werden, das erst wenn alles vom ersten anfordern, empfangen wurde, die nächste Anforderung kommt.

Siehe Hterm ausgabe, gegenüber Serialmonitor.

Wie könnte man sowas realisieren?

Grüsse
Antonio

Ich glaube Du hast ein konzeptionelles Problem.
Bevor Du den Broker bedienst, brauchst Du erstmal was vernünftig lokal funktionierendes.
Leider habe ich keine Zeit um jetzt ne Anleitung zur Kommunikation mit den WR's zu suchen - nehme aber den Code mal mit und versuch Dir was daraus zu bauen.

1 Like

Hallo my_xy_projekt,

vielen Dank, das Query Protokoll ist als PDF in meinen ersten Post beigefügt.

Gruß
Antonio

Sorry, den hatte ich übersehen... :roll_eyes:
Ich hab aber mal was in kurz gebaut.

[edit] - Ich hab die Doku kurz überflogen - ich bau mal schnell was.... Mein Kurzsketch muss ausgebaut werden und ich habe gelesen, das es ein Start-Zeichen gibt :wink:
[edit2]
Selber Sketch mit größerem Buffer, damit alles rein passt.
Ich will mal die Ausgabe sehen - die Seriennummer bitte lsöchen :wink:

// Forensketch Datenabfrage via Serieller - Anfrage senden und auf Antwort warten; mit Abbruchfunktion
// https://forum.arduino.cc/t/wechselrichter-daten-auslesen/1104441/13
// UNGETESTET! - kompiliert Fehler- und Warnungsfrei
#include <SoftwareSerial.h>
// SoftwareSerial-Pins
const int rxPin = D2; // RX-Pin (Wechselrichter-Ausgang)
const int txPin = D1; // TX-Pin (Wechselrichter-Eingang)
SoftwareSerial qpgCom(rxPin, txPin);

// Anforderung Wechselrichter Kommandos in HEX 16-bit Kalkulation
const byte qpgsStartSeq[] = {0x51, 0x50, 0x47, 0x53,};
const byte qpgsNums = 3;
const byte qpgs[][qpgsNums] =
{
  { 0x30, 0x3F, 0xDA },
  { 0x31, 0x2F, 0xFB },
  { 0x32, 0x1F, 0x98 },
};
byte wrNum;
enum {qWait, qRequest, qResponse, endMessage};

byte state = qWait;
const uint32_t intervall = 10000;
uint32_t switchTime;
char messageBuf[145] = {'\0'};
byte idx;

void setup()
{
  // Starten der seriellen Kommunikation
  Serial.begin(9600);
  Serial.println(F("Start..."));
  qpgCom.begin(2400);
  switchTime = millis();
}

void wrSendMessage(const byte *wr, const byte &len)
{
  qpgCom.write(qpgsStartSeq, sizeof(qpgsStartSeq));
  qpgCom.write(wr, len);
  qpgCom.write('\r');
}

void loop()
{
  switch (state)
  {
    case qWait:
      qpgCom.read();                                   // Schnittstelle leeren
      if (millis() - switchTime > intervall)           // Wenn Zeit abgelaufen ...
      { state = qRequest; }                            // ... nächster Schritt
      break;
    case qRequest:
      wrSendMessage(qpgs[wrNum], sizeof(qpgs[wrNum])); // Anforderung passend zum Wechselrichter
      switchTime = millis();                           // Zeit meken
      state = qResponse;                               // ... nächster Schritt
      break;
    case qResponse:
      if (qpgCom.available())                          // wenn was anliegt
      {
        byte x = qpgCom.read();                        // einlesen
        if (isControl(x) ||                            // Ist Steuerzeichen ODER
            idx >= sizeof(messageBuf)-1 ||             // buffer voll ODER
            (millis() - switchTime > intervall))       // Zeit abgelaufen
        {
          state = endMessage;                          // nächster Schritt
        }
        else                                           // sonst
        {
          messageBuf[idx] = x;                         // zeichen in den Buffer schreiben
          idx++;                                       // nächste Position setzen
        }
      }
      break;
    case endMessage:
      Serial.print(F("Response von WR "));             // Ausgabe
      Serial.print(wrNum);
      Serial.print(":\t");
      Serial.println(*messageBuf);
      memset(messageBuf, '\0', sizeof(messageBuf));    // Buffer leeren
      idx = 0;                                         //
      wrNum++;                                         // nächstes Gerät
      if (wrNum > qpgsNums)                            // Wenn letztes Gerät überlaufen
      { wrNum = 0; }                                   // erstes Gerät setzen
      switchTime = millis();                           // Zeit merken
      state = qWait;                                   // beginne von vorn
      break;
  }
}
1 Like

Hallo my_xy_projekt

also schau dir die Ausgabe an, leider kommt da nix.

Gruß
Antonio

Doch ah - da kommt was.
Ok, das Startzeichen ist tatsächlich die sich öffnende Klammer. Dann kann die Auswertung der Sequenz darauf abgebildet werden - ich bau mal kurz...

Hinweis: Du kannst im seriellen Monitor auch mit der Maus markieren und mit STRG-C kopieren und hier mit dem Button <code> einfügen :wink:

1 Like

Also der Zähler funktioniert und die Antwort ist mit der Klammer eingeleitet.
Das ganze jetzt mal mit Ausgabe als HEX. Ich hoffe ja, das die 10 Sekunden nicht zu kurz sind.
Wenn Du in der Ausgabe hast und da mehr als eine HEX-Zahl ausgegeben wird, ist die Seriennummer die erste 14byte-Folge. jeweils getrennt durch 1 Leerzeichen.

// Forensketch Datenabfrage via Serieller - Anfrage senden und auf Antwort warten; mit Abbruchfunktion
// https://forum.arduino.cc/t/wechselrichter-daten-auslesen/1104441/13
// UNGETESTET! - kompiliert Fehler- und Warnungsfrei
#include <SoftwareSerial.h>
// SoftwareSerial-Pins
const int rxPin = D2; // RX-Pin (Wechselrichter-Ausgang)
const int txPin = D1; // TX-Pin (Wechselrichter-Eingang)
SoftwareSerial qpgCom(rxPin, txPin);

// Anforderung Wechselrichter Kommandos in HEX 16-bit Kalkulation
const byte qpgsStartSeq[] = {0x51, 0x50, 0x47, 0x53,};
const byte qpgsNums = 3;
const byte qpgs[][qpgsNums] =
{
  { 0x30, 0x3F, 0xDA },
  { 0x31, 0x2F, 0xFB },
  { 0x32, 0x1F, 0x98 },
};
byte wrNum;
enum {qWait, qRequest, qResponse, endMessage};

byte state = qWait;
const uint32_t intervall = 10000;
uint32_t switchTime;
char messageBuf[150] = {'\0'};
byte idx;

void setup()
{
  // Starten der seriellen Kommunikation
  Serial.begin(9600);
  Serial.println(F("Start..."));
  qpgCom.begin(2400);
  switchTime = millis();
}

void wrSendMessage(const byte *wr, const byte &len)
{
  qpgCom.write(qpgsStartSeq, sizeof(qpgsStartSeq));
  qpgCom.write(wr, len);
  qpgCom.write('\r');
}

void loop()
{
  switch (state)
  {
    case qWait:
      qpgCom.read();                                   // Schnittstelle leeren
      if (millis() - switchTime > intervall)           // Wenn Zeit abgelaufen ...
      { state = qRequest; }                            // ... nächster Schritt
      break;
    case qRequest:
      wrSendMessage(qpgs[wrNum], sizeof(qpgs[wrNum])); // Anforderung passend zum Wechselrichter
      switchTime = millis();                           // Zeit meken
      state = qResponse;                               // ... nächster Schritt
      break;
    case qResponse:
      if (qpgCom.available())                          // wenn was anliegt
      {
        char x = qpgCom.read();                        // einlesen
        if (x == '(')                                  // Startzeichen erkannt
        {
          memset(messageBuf, '\0', sizeof(messageBuf));// Buffer initialisieren
          idx = 0;                                     //
        }
        if (isControl(x) ||                            // Ist Steuerzeichen ODER
            idx >= sizeof(messageBuf) - 1 ||           // buffer voll ODER
            (millis() - switchTime > intervall))       // Zeit abgelaufen
        {
          state = endMessage;                          // nächster Schritt
        }
        else                                           // sonst
        {
          messageBuf[idx] = x;                         // zeichen in den Buffer schreiben
          idx++;                                       // nächste Position setzen
        }
      }
      break;
    case endMessage:
      Serial.print(F("Response von WR "));             // Ausgabe
      Serial.print(wrNum);
      Serial.print(":\t");
      for (byte b = 0; b < idx; b++)
      {
        Serial.print(messageBuf[b], HEX);
        Serial.print(' ');
      }
      Serial.println();
      wrNum++;                                         // nächstes Gerät
      if (wrNum > qpgsNums)                            // Wenn letztes Gerät überlaufen
      { wrNum = 0; }                                   // erstes Gerät setzen
      switchTime = millis();                           // Zeit merken
      state = qWait;                                   // beginne von vorn
      break;
  }
}
1 Like

Hallo my_xy_projekt,

das sieht gut aus:

Liste

|17:37:15.493 -> Response von WR 0:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 38 20 42 20 30 30 20 32 32 39 2E 37 20 35 30 2E 30 31 20 32 32 39 2E 38 20 35 30 2E 30 31 20 30 32 35 32 20 30 32 32 34 20 30 30 35 20 34 39 2E 39 20 30 30 30 20 30 34 37 20 33 30 33 2E 39 20 30 30 32 20 30 31 32 34 30 20 30 31 31 32 38 20 30 30 37 20 31 30 31 30 30 30 31 30 20 34 20 32 20 30 32 30 20 30 38 30 20 31 30 20 30 30 2E 35 20 30 30 32 D4 93 |
|---|---|
|17:37:26.426 -> Response von WR 1:|28 31 20 39 32 39 33 32 30 30 37 31 30 30 39 35 36 20 42 20 30 30 20 32 32 38 2E 35 20 34 39 2E 39 38 20 32 33 31 2E 30 20 34 39 2E 39 39 20 30 30 36 39 20 30 30 31 35 20 30 30 31 20 34 39 2E 39 20 30 30 32 20 30 34 37 20 32 38 32 2E 37 20 30 30 32 20 30 31 32 31 38 20 30 31 30 39 30 20 30 30 37 20 31 30 31 30 30 30 31 30 20 32 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 35 20 30 30 30 D1 68 |
|17:37:37.313 -> Response von WR 2:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 31 20 42 20 30 30 20 32 32 39 2E 33 20 34 39 2E 39 39 20 32 33 30 2E 31 20 34 39 2E 39 33 20 30 38 39 37 20 30 38 33 37 20 30 31 37 20 34 39 2E 39 20 30 30 30 20 30 34 37 20 31 32 30 2E 30 20 30 30 32 20 30 31 32 31 38 20 30 31 30 37 35 20 30 30 37 20 31 30 31 30 30 30 31 30 20 33 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 34 20 30 31 37 B1 |
|17:37:48.089 -> Response von WR 3:|28 30 20 33 32 30 30 39 31 30 35 30 37 38 30 50 30 20 50 20 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 30 20 30 30 30 30 20 30 30 36 20 30 30 2E 30 20 30 30 32 20 30 34 38 20 31 31 37 2E 33 20 30 31 35 20 30 30 30 31 30 20 30 30 30 38 30 20 30 30 30 20 30 30 30 31 30 |
|17:37:58.903 -> Response von WR 0:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 38 20 42 20 30 30 20 32 32 39 2E 36 20 34 39 2E 39 36 20 32 33 30 2E 30 20 34 39 2E 39 38 20 30 32 35 33 20 30 32 31 36 20 30 30 35 20 34 39 2E 39 20 30 30 30 20 30 34 37 20 33 30 32 2E 32 20 30 30 32 20 30 31 32 31 38 20 30 31 30 39 35 20 30 30 37 20 31 30 31 30 30 30 31 30 20 34 20 32 20 30 32 30 20 30 38 30 20 31 30 20 30 30 2E 35 20 30 30 32 A5 B1 |
|17:38:09.793 -> Response von WR 1:|28 31 20 39 32 39 33 32 30 30 37 31 30 30 39 35 36 20 42 20 30 30 20 32 32 38 2E 30 20 34 39 2E 39 37 20 32 32 39 2E 33 20 34 39 2E 39 37 20 30 30 36 38 20 30 30 33 30 20 30 30 31 20 34 39 2E 39 20 30 30 32 20 30 34 37 20 32 38 32 2E 32 20 30 30 32 20 30 31 32 36 33 20 30 31 31 33 38 20 30 30 37 20 31 30 31 30 30 30 31 30 20 32 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 35 20 30 30 30 |
|17:38:20.679 -> Response von WR 2:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 31 20 42 20 30 30 20 32 32 39 2E 34 20 34 39 2E 39 35 20 32 33 30 2E 32 20 34 39 2E 39 37 20 30 39 31 39 20 30 38 36 37 20 30 31 38 20 34 39 2E 39 20 30 30 30 20 30 34 37 20 31 32 30 2E 30 20 30 30 32 20 30 31 32 34 30 20 30 31 31 31 34 20 30 30 37 20 31 30 31 30 30 30 31 30 20 33 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 34 20 30 31 38 F3 C3 |
|17:38:31.461 -> Response von WR 3:|28 30 20 33 32 30 30 39 31 30 35 30 37 38 30 50 30 20 50 20 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 30 20 30 30 30 30 20 30 30 37 20 30 30 2E 30 20 30 30 32 20 30 34 38 20 31 32 34 2E 31 20 31 32 32 20 30 30 30 31 30 20 30 30 30 38 30 20 30 30 30 20 30 30 30 31 30 |
|17:38:42.297 -> Response von WR 0:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 38 20 42 20 30 30 20 32 32 39 2E 36 20 34 39 2E 39 39 20 32 33 30 2E 31 20 34 39 2E 39 38 20 30 32 35 33 20 30 32 32 33 20 30 30 35 20 34 39 2E 38 20 30 30 30 20 30 34 36 20 33 30 35 2E 33 20 30 30 32 20 30 31 32 36 35 20 30 31 31 35 30 20 30 30 37 20 31 30 31 30 30 30 31 30 20 34 20 32 20 30 32 30 20 30 38 30 20 31 30 20 30 30 2E 35 20 30 30 32 FC AF |
|17:38:53.206 -> Response von WR 1:|28 31 20 39 32 39 33 32 30 30 37 31 30 30 39 35 36 20 42 20 30 30 20 32 32 37 2E 36 20 34 39 2E 39 35 20 32 33 31 2E 30 20 34 39 2E 39 37 20 30 30 36 39 20 30 30 33 38 20 30 30 31 20 34 39 2E 38 20 30 30 32 20 30 34 36 20 32 38 34 2E 37 20 30 30 32 20 30 31 32 34 32 20 30 31 31 33 31 20 30 30 37 20 31 30 31 30 30 30 31 30 20 32 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 35 20 30 30 30 D5 6F |
|17:39:04.115 -> Response von WR 2:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 31 20 42 20 30 30 20 32 32 39 2E 38 20 34 39 2E 39 38 20 32 32 39 2E 39 20 35 30 2E 30 30 20 30 39 31 39 20 30 38 36 39 20 30 31 38 20 34 39 2E 38 20 30 30 30 20 30 34 36 20 31 31 39 2E 39 20 30 30 32 20 30 31 32 34 31 20 30 31 31 32 33 20 30 30 37 20 31 30 31 30 30 30 31 30 20 33 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 34 20 30 31 38 D9 61 |
|17:39:14.900 -> Response von WR 3:|28 30 20 33 32 30 30 39 31 30 35 30 37 38 30 50 30 20 50 20 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 30 20 30 30 30 30 20 30 30 37 20 30 30 2E 30 20 30 30 32 20 30 34 38 20 31 32 38 2E 38 20 31 32 35 20 30 30 30 31 30 20 30 30 30 38 30 20 30 30 30 20 30 30 30 31 30 |
|17:39:25.680 -> Response von WR 0:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 38 20 42 20 30 30 20 32 32 39 2E 39 20 34 39 2E 39 36 20 32 32 39 2E 38 20 35 30 2E 30 30 20 30 32 35 32 20 30 32 32 31 20 30 30 35 20 34 39 2E 38 20 30 30 30 20 30 34 36 20 33 30 33 2E 36 20 30 30 32 20 30 31 32 36 32 20 30 31 31 33 35 20 30 30 37 20 31 30 31 30 30 30 31 30 20 34 20 32 20 30 32 30 20 30 38 30 20 31 30 20 30 30 2E 35 20 30 30 32 C9 B2 |
|17:39:36.607 -> Response von WR 1:|28 31 20 39 32 39 33 32 30 30 37 31 30 30 39 35 36 20 42 20 30 30 20 32 32 37 2E 38 20 34 39 2E 39 34 20 32 32 39 2E 37 20 34 39 2E 39 36 20 30 30 36 38 20 30 30 32 37 20 30 30 31 20 34 39 2E 38 20 30 30 32 20 30 34 36 20 32 38 31 2E 33 20 30 30 32 20 30 31 33 30 39 20 30 31 31 36 39 20 30 30 37 20 31 30 31 30 30 30 31 30 20 32 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 35 20 30 30 30 C1 40 |

Gruß
Antonio

1 Like

OK - passt.
Ich hab das mal aufgelöst:

28 31 20                                          (A
39 32 39 33 32 30 30 39 31 30 35 30 37 31 20      BBBBBBBBBBBB
42 20                                             C
30 30 20                                          DD
32 32 39 2E 33 20                                 EEE.E
34 39 2E 39 39 20                                 FF.FF
32 33 30 2E 31 20                                 GGG.G
34 39 2E 39 33 20                                 HH.HH
30 38 39 37 20                                    IIII
30 38 33 37 20                                    JJJJ
30 31 37 20                                       KKK
34 39 2E 39 20                                    LL.L
30 30 30 20                                       MMM
30 34 37 20                                       NNN
31 32 30 2E 30 20                                 OOO.O
30 30 32 20                                       PPP
30 31 32 31 38 20                                 QQQQQ
30 31 30 37 35 20                                 RRRRR
30 30 37 20                                       SSS
31 30 31 30 30 30 31 30 20                        b7b6b5b4b3b2b1b0
33 20                                             T
32 20                                             U
30 33 30 20                                       VVV
30 38 30 20                                       WWW
31 30 20                                          XX
30 30 2E 34 20                                    YY.Y
30 31 37 B1                                       ZZZ<CRC>

Damit stimmt der Datenstream mit der Doku. Oder anders, die Doku stimmt mit der Ausgabe :slight_smile:
So jetzt die Frage: Welche Werte willst Du davon haben?
Es ist machbar, alles auszuwerten.
Die Werte würde ich dann in entsprechende Variablen schreiben udn dem Broker dann kompakt unterjubeln.
Und das gleich so als numerische Werte, das es nicht zu Missverständnissen kommt; insbesondere die Werte mit Komma würde ich als Ganzzahlen - ohne Trennzeichen - als int speichern und später in der Ausgabe durch 10 dividieren um wieder auf die Nachkommastelle zu kommen.
Das spart Speicherplatz und Übertragungskapazität.

1 Like

Hallo my_xy_projekt,

Supi mega klasse.

Ja am besten alle Werte.
Übrigens habe ich mal mit dem Intervall Zeiten gespielt, einmal 5000 und dann sogar 1000, die Daten kommen sehr stabil und ohne aussetzer.
Die untere Ausgabe, mit einer Sekunde.

Liste
|18:09:01.977 -> Response von WR 2:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 31 20 42 20 30 30 20 32 32 39 2E 39 20 34 39 2E 39 38 20 32 33 30 2E 31 20 34 39 2E 39 39 20 31 31 34 38 20 30 38 39 38 20 30 32 32 20 34 39 2E 36 20 30 30 30 20 30 34 34 20 31 32 30 2E 30 20 30 30 30 20 30 31 33 39 39 20 30 31 31 30 36 20 30 30 37 20 31 30 31 30 30 30 31 30 20 33 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 32 20 30 31 35 97 AB |
|---|---|
|18:09:03.733 -> Response von WR 3:|28 30 20 33 32 30 30 39 31 30 35 30 37 38 30 50 30 20 50 20 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 30 20 30 30 30 30 20 30 30 36 20 30 30 2E 30 20 30 30 30 20 30 34 38 20 31 33 35 2E 35 20 30 34 37 20 30 30 30 31 30 20 30 30 30 38 30 20 30 30 30 20 30 30 30 31 30 |
|18:09:05.539 -> Response von WR 0:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 38 20 42 20 30 30 20 32 33 30 2E 33 20 34 39 2E 39 37 20 32 33 30 2E 32 20 35 30 2E 30 35 20 30 32 30 36 20 30 31 38 37 20 30 30 34 20 34 39 2E 36 20 30 30 30 20 30 34 34 20 31 32 30 2E 30 20 30 30 30 20 30 31 32 38 37 20 30 31 30 30 31 20 30 30 36 20 31 30 31 30 30 30 31 30 20 34 20 32 20 30 32 30 20 30 38 30 20 31 30 20 30 30 2E 32 20 30 30 34 |
|18:09:07.445 -> Response von WR 1:|28 31 20 39 32 39 33 32 30 30 37 31 30 30 39 35 36 20 42 20 30 30 20 32 32 38 2E 35 20 34 39 2E 39 38 20 32 33 30 2E 33 20 34 39 2E 39 38 20 30 30 36 38 20 30 30 33 33 20 30 30 31 20 34 39 2E 36 20 30 30 30 20 30 34 33 20 31 31 39 2E 39 20 30 30 30 20 30 31 33 39 38 20 30 31 31 31 31 20 30 30 37 20 31 30 31 30 30 30 31 30 20 32 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 32 20 30 30 30 AC BD |
|18:09:09.351 -> Response von WR 2:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 31 20 42 20 30 30 20 32 32 39 2E 39 20 34 39 2E 39 38 20 32 33 30 2E 31 20 34 39 2E 39 39 20 31 31 34 38 20 30 38 39 38 20 30 32 32 20 34 39 2E 36 20 30 30 30 20 30 34 34 20 31 32 30 2E 30 20 30 30 30 20 30 31 33 39 39 20 30 31 31 30 36 20 30 30 37 20 31 30 31 30 30 30 31 30 20 33 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 32 20 30 31 35 97 AB |
|18:09:11.158 -> Response von WR 3:|28 30 20 33 32 30 30 39 31 30 35 30 37 38 30 50 30 20 50 20 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 30 20 30 30 30 30 20 30 30 36 20 30 30 2E 30 20 30 30 30 20 30 34 38 20 31 33 35 2E 35 20 30 34 37 20 30 30 30 31 30 20 30 30 30 38 30 20 30 30 30 20 30 30 30 31 30 |
|18:09:12.964 -> Response von WR 0:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 38 20 42 20 30 30 20 32 33 30 2E 33 20 34 39 2E 39 37 20 32 33 30 2E 32 20 35 30 2E 30 35 20 30 32 30 36 20 30 31 38 37 20 30 30 34 20 34 39 2E 36 20 30 30 30 20 30 34 34 20 31 32 30 2E 30 20 30 30 30 20 30 31 32 38 37 20 30 31 30 30 31 20 30 30 36 20 31 30 31 30 30 30 31 30 20 34 20 32 20 30 32 30 20 30 38 30 20 31 30 20 30 30 2E 32 20 30 30 34 |
|18:09:14.817 -> Response von WR 1:|28 31 20 39 32 39 33 32 30 30 37 31 30 30 39 35 36 20 42 20 30 30 20 32 32 38 2E 35 20 34 39 2E 39 38 20 32 33 30 2E 33 20 34 39 2E 39 38 20 30 30 36 38 20 30 30 33 33 20 30 30 31 20 34 39 2E 36 20 30 30 30 20 30 34 33 20 31 31 39 2E 39 20 30 30 30 20 30 31 33 39 38 20 30 31 31 31 31 20 30 30 37 20 31 30 31 30 30 30 31 30 20 32 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 32 20 30 30 30 AC BD |
|18:09:16.724 -> Response von WR 2:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 31 20 42 20 30 30 20 32 32 39 2E 39 20 34 39 2E 39 38 20 32 33 30 2E 31 20 34 39 2E 39 39 20 31 31 34 38 20 30 38 39 38 20 30 32 32 20 34 39 2E 36 20 30 30 30 20 30 34 34 20 31 32 30 2E 30 20 30 30 30 20 30 31 33 39 39 20 30 31 31 30 36 20 30 30 37 20 31 30 31 30 30 30 31 30 20 33 20 32 20 30 33 30 20 30 38 30 20 31 30 20 30 30 2E 32 20 30 31 35 97 AB |
|18:09:18.530 -> Response von WR 3:|28 30 20 33 32 30 30 39 31 30 35 30 37 38 30 50 30 20 50 20 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 2E 30 20 30 30 2E 30 30 20 30 30 30 30 20 30 30 30 30 20 30 30 37 20 30 30 2E 30 20 30 30 30 20 30 34 38 20 31 34 39 2E 30 20 31 37 39 20 30 30 30 31 30 20 30 30 30 38 30 20 30 30 30 20 30 30 30 31 30 |
|18:09:20.320 -> Response von WR 0:|28 31 20 39 32 39 33 32 30 30 39 31 30 35 30 37 38 20 42 20 30 30 20 32 32 39 2E 37 20 35 30 2E 30 32 20 32 33 30 2E 30 20 34 39 2E 39 34 20 30 31 38 34 20 30 31 37 37 20 30 30 33 20 34 39 2E 35 20 30 30 30 20 30 34 33 20 31 32 30 2E 30 20 30 30 30 20 30 31 30 38 32 20 30 30 38 39 38 20 30 30 35 20 31 30 31 30 30 30 31 30 20 34 20 32 20 30 32 30 20 30 38 30 20 31 30 20 30 30 2E 32 20 30 30 34 DE FC |
1 Like

Naja, sind ja nicht mal 150 Bytes. Die sollten schon sauber kommen :wink:
Dann werd ich mal was zusammensetzen, damit da eine vernünftige Ausgabe auf dem SerMon kommt.
Und die Daten lassen sich dann genauso auch weiterverwenden für den Broker. - Den musste aber selber bestücken, da ich weder Hardware habe noch jemals irgendwas damit gebaut... Ich mach das sozusagen also blind. :face_with_monocle:

1 Like