Forum: Haus & Smart Home RS485 Puma PID Pelletkessel


von Michael K. (cen)


Lesenswert?

Hallo zusammen,

ich habe mir in Polen einen Pelletkessel gekauft, dieser hat eine 
polnische Steuerung an Board die an sich sehr gut ist. Die Steuerung 
möchte ich nicht erneuern (Garantie). Die Steuerung Puma PID hat eine 
RS485 Schnittstelle die laut Hersteller wohl jedes Raumthermostat von 
jedem Hersteller unterstützt.
Ich habe mir von Ama... RS485 Dongles bestellt 5 an der Zahl alle 
liefern das gleiche komische Ergebnis.
1
P���A<+48+48+4e"D������A�<���A�<���A�<���A�<������p�H"q�p]p]p]p]����p�H"q�p]p]p]p]����p�H"q�p]p]p]p]��
2
���A�<��(P���A<+48+48+4e"D������A�<���A�<���A�<���A�<��
3
      ��;
4
���A�<��(P���A<+48+48+4e"D������A�<���A�<��p]p]����p�H"q�p]p]p]p]����p�H"q�p]p]p]p]����p�H"q�p]p]p]�A�<��
5
��;
6
���A�<��(P���A<+48+48+4e"D������A�<���A�<���A�<���A�<��
7
                    ��;
8
���A�<��(P���A<+48+48+4e"D�����p]p]p]p]����p�H"q�p]p]p]p]����p�H"q�p]p]p]p]����p�H"q�p]�A�<���A�<���A�<��
9
��;
10
���A�<��(P���A<+48+48+4e"D������A�<���A�<���A�<���A�<��
11
��;
12
���A�<��(P���A<+48+48+4e"q�p]p]p]p]����p�H"q�p]p]p]p]����p�H"q�p]p]
Ich habe hier schon die gängigen Baudraten durch probiert doch kommt 
immer das gleiche bei raus.
Der Aufbau ist: RPI -> USB to RS485 -> Puma PID
Als "Terminal" nutze ich "screen" auf dem PI
Auch habe ich schon Modbus probiert auch hier ohne Erfolg.

Mit einem kleinen Python Script bekomme ich folgende Ausgabe:
1
▒"▒▒B&BB"""r"▒""""""▒▒▒▒P▒▒▒▒"▒

Hier das Script:
1
#!/usr/bin/env python
2
3
import serial
4
5
port = '/dev/ttyUSB0'
6
serial_comunication = serial.Serial(port, baudrate=1200, timeout=0.75)
7
serial_comunication.write(b'frame')
8
answer = serial_comunication.read(255)
9
serial_comunication.close()
10
print answer

Der Grund warum ich an die RS485 Schnittstelle möchte ist das Auslesen 
der Sensoren in der PID und das Ausschalten des Brennvrogangs. Die PID 
hat leider keine Funktion um einen Pufferspeicher zu befüllen und leider 
auch nicht um 3 Wege Ventile zu steuern, dies möchte ich jedoch mit 
einem PI oder Arduino realisieren.

Kann mir hier jemand Helfen?

Vielen Dank schon mal an euch alle.

Grüße Micha

EDIT: Was ich noch vergessen habe, es scheint als wenn der PID Regler 
die ganze Zeit irgendwas sendet.

: Bearbeitet durch User
von hinz (Gast)


Lesenswert?

Michael K. schrieb:
> EDIT: Was ich noch vergessen habe, es scheint als wenn der PID Regler
> die ganze Zeit irgendwas sendet.

Oszi ran.

von Michael K. (cen)


Lesenswert?

Da gibt es leider ein Problem, ich habe kein Oszi zur Verfügung. Das was 
ich so gelesen habe da ist das doch nicht normal das die Heizung 
dauerhaft etwas sendet oder? Zumal der Anschluss für Raumthermostate 
sein soll.....

von Martin (Gast)


Lesenswert?

Wie wäre es mal mit einer Darstellung in hex. Und wenn zB 100ms nichts 
kam ein LF?

von zufaulzumanmelden (Gast)


Lesenswert?

> ich habe kein Oszi zur Verfügung

Ein Logic-Analyzer für ’nen Zehner mag den Job auch tun

> das [ist] doch nicht normal das die Heizung
> dauerhaft etwas sendet

Vielleicht pollt sie die Thermostate? Ohne mal nachgeschaut zu haben, 
was denn da für Signale anliegen, wird man’s jedenfalls nie 
rausbekommen.

von EvenOddNoParity (Gast)


Lesenswert?

Versuch malmit den anderen Paramtern zu spielen... Parity, Wortlänge, 
Stoppbits....

von Michael K. (cen)


Angehängte Dateien:

Lesenswert?

Vielen Dank für die zahlreichen Tipps.

ich hab mal das Python Script erweitert und durchlaufen lassen, aber 
viel erkennen kann ich da leider nicht. Das Ergebnis habe ich in eine 
Datei schreiben lassen.

Hier das Python Script
1
#!/usr/bin/env python
2
3
import serial
4
5
running = True
6
port = '/dev/ttyUSB0'
7
serial_comunication = serial.Serial(port, baudrate=2400, timeout=0.75)
8
baud = [2400,4800,9600,19200,38400,57600,115200,230400,460800,500000]
9
bsize = ['FIVEBITS', "SIXBITS", "SEVENBITS", "EIGHTBITS"]
10
parity = ["PARITY_NONE", "PARITY_EVEN", "PARITY_ODD", "PARITY_MARK", "PARITY_SPACE"]
11
stopbits = ["STOPBITS_ONE", "STOPBITS_ONE_POINT_FIVE", "STOPBITS_TWO"]
12
#serial_comunication.write(b'frame')
13
14
f = open("Puma-PID-Serial.txt", "a")
15
16
try:
17
    serial_comunication.rs485_mode
18
    for i in baud:
19
        serial.baudrate = i
20
        print("Baudrate: "+str(i))
21
        f.write("Baudrate: "+str(i)+"\n")
22
        answer = serial_comunication.readline()
23
#        serial_comunication.close()
24
        if answer > 0:
25
            print answer.encode("hex")
26
            f.write(answer.encode("hex")+"\n")
27
            x = 0
28
            while x <= 4:
29
                serial.parity = str(parity[x])
30
                print("Baud: "+str(i)+" Parity: "+str(parity[x]))
31
                f.write("Baud: "+str(i)+" Parity: "+str(parity[x])+"\n")
32
                answer = serial_comunication.readline()
33
                print answer.encode("hex")
34
                f.write(answer.encode("hex")+"\n")
35
                for bytesize in bsize:
36
                    serial.bytesize = str(bytesize)
37
                    print("Baud: "+str(i)+" Parity: "+str(parity[x])+" Bytesize: "+str(bytesize))
38
                    f.write("Baud: "+str(i)+" Parity: "+str(parity[x])+" Bytesize: "+str(bytesize)+"\n")
39
                    answer = serial_comunication.readline()
40
                    print answer.encode("hex")
41
                    f.write(answer.encode("hex")+"\n")
42
                for stbits in stopbits:
43
                    serial.stopbits = str(stbits)
44
                    print("Baud: "+str(i)+"Parity: "+str(parity[x])+" Bytesize: "+str(bytesize)+" Stopbits: "+str(stbits))
45
                    f.write("Baud: "+str(i)+"Parity: "+str(parity[x])+" Bytesize: "+str(bytesize)+" Stopbits: "+str(stbits)+"\n")
46
                    answer = serial_comunication.readline()
47
                    print answer.encode("hex")
48
                    f.write(answer.encode("hex")+"\n")
49
                x += 1
50
        else:
51
            try:
52
                print("No answer Baud: "+str(i)+" Parity: "+str(parity[x])+" Bytesize: "+str(bytesize))
53
                f.write("No answer Baud: "+str(i)+" Parity: "+str(parity[x])+" Bytesize: "+str(bytesize)+"\n")
54
            except Exception as err:
55
                print("Error in else: "+str(err))
56
                f.write("Error in else: "+str(err)+"\n")
57
58
    f.close()
59
    serial_comunication.close()
60
except KeyboardInterrupt:
61
   print("close")
62
   serial_comunication.close()

@zufaulzumanmelden
Welchen Logic Analyzer würdest du mir empfehlen?
Kennst du dazu auch ein gutes Tut?

Vielen Dank für eure Hilfe

von wurster (Gast)


Lesenswert?

Michael K. schrieb:
> Welchen Logic Analyzer würdest du mir empfehlen?

Billigen Saleae Clone mit 24 MHz. Gibts zutausende auf Ebay.

von Michael K. (cen)


Lesenswert?

Okay habe einen bestellt der sollte dann morgen da sein. Muss mich da 
erst mal rein Arbeiten. Kennt jemand ein gutes Tut?

Danke

von zufaulzumanmelden (Gast)


Lesenswert?

> Kennt jemand ein gutes Tut?

Gibt sicher viele, aber um reinzufinden, mag’s einige Minuten von diesem 
tun: https://www.youtube.com/watch?v=dobU-b0_L1I&t=5m10s

von Michael K. (cen)


Lesenswert?

Wie ich gelesen/gehört habe muss ich mit dem Logic Analyzer direkt an 
den MAX485 gehen. Kann mir jemand sagen an welche PINs ich da ran muss.

Danke

von Datenblatt (Gast)


Lesenswert?

Etwas solltest Du schon tun/können.
Im Datenblatt ist alles zu finden.

von Michael K. (cen)


Lesenswert?

Ich würde den Analyzer an GND und RO anschließen, was sagt ihr dazu?

von Sebastian R. (sebastian_r569)


Lesenswert?

Michael K. schrieb:
> Ich würde den Analyzer an GND und RO anschließen, was sagt ihr
> dazu?

Kann man machen. Sofern es der RO von deinem 485-Dongle ist.

PulseView kann glaube ich aber auch mit dem differentiellen Signal 
arbeiten. Dann kann man es (einfacher) an A und B vom Bus hängen.

: Bearbeitet durch User
von Michael K. (cen)


Lesenswert?

Danke

Der RO wäre direkt am MAX485. Wenn ich den Logic Analyzer direkt an A 
und B stecke geht er doch kaputt da RS485 5V hat oder habe ich das 
Datenblat vom Logiy Analyzer falsch verstanden.....

von zufaulzumanmelden (Gast)


Lesenswert?

Michael K. schrieb:
> Wenn ich den Logic Analyzer direkt an A
> und B stecke geht er doch kaputt da RS485 5V hat oder habe ich das
> Datenblat[t] vom Logiy Analyzer falsch verstanden[?]

Also im Datenblatt zu meinem steht bei den Maximum Ratings was von 
-25V…+25V, bei „Common supported logic standards“ steht ’ne Reihe von 
+1,8V bis +12V, außerdem ist RS-485 explizit aufgelistet.

von Michael K. (cen)


Lesenswert?

Bei mir steht das hier: Spezifikation:
Maximale Abtastgeschwindigkeit: 24Msps
Eingangsspannungsbereich: 0 ~ 5V
Digitalkanal: 8
Niedriger Eingangspegel: <0,8V
High-Eingangspegel: >1,4V
Support-Protokoll: SPI, IIC, UART, SMBus, I2S, CAN, Parallel, 
Benutzerdefiniert, Suche, Async, 1-Wite, PS / 2
Eingangsimpedanz: 1Mohm || 10pF (typisch, ungefähr)
Kristall: ± 20 ppm, 24 MHz
Fehler / Genauigkeit: Pulsbreitenmessung: ± 42 ns (bei 24 MHz)

Denke da aber eher an Tippfehler.....

von zufaulzumanmelden (Gast)


Lesenswert?

Beziehst du dich auf „High-Eingangspegel: >1,4V“? Das bedeutet nur, dass 
mehr als 1,4V anliegen müssen, um’s als High zu erkennen.

von Michael K. (cen)


Angehängte Dateien:

Lesenswert?

Hatte mich genau darauf bezogen. Habe den Analyzer jetzt direkt an den 
RS485 Bus gehangen und aufzeichnen lassen. Doch so richtig werde ich 
nicht schlau daraus. Ich habe euch die Aufzeichnung mal hochgeladen.

Danke

von Michael K. (cen)


Angehängte Dateien:

Lesenswert?

Ein Kollege hat mir geraten Masse mit anzuschließen, gesagt getan und 
schon sehen die Daten besser aus.

Das einzige Problem was ich jetzt noch habe ist, das ich per Raspberry 
Pi und Python es nicht schaffe die Daten auszuwerten. Ich denke das dass 
ding Modbus spricht aber wenn ich minimalmodbus für Python verwende 
kommt nur ein Checksummen Fehler dabei raus.

Kann natürlich auch möglich sein das die Regelung kein Modbus spricht.

Könnt ihr euch das bitte einmal anschauen.

Vielen Dank

von Michael K. (cen)


Lesenswert?

Habe noch was vergessen.
Bei der Bytefolge:
4 16 0 0 0 6 12 0 0 0 237 0 65 1 7 0 60 12 145 182 250

ist die 65 der Sollwert für den Vorlauf, wenn ich diesen Wert in der 
Regelung ändere, ändert er sich auch auf der Schnittstelle.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.