RaspitroniK Steuerung für Holzvergaser

Flammtronik an Fhem und andere Steuerungs bzw. Visualisierungs Projekte
Benutzeravatar
jostmario
Administrator
Beiträge: 924
Holzvergaser: Do 28. Jan 2016, 00:11
Bewertung: 147
Wohnort: Zimmern ob Rottweil
Kontaktdaten:

RaspitroniK Steuerung für Holzvergaser

Beitrag #20529 von jostmario » Di 4. Dez 2018, 01:45

Hallo,

bin grad dabei mit Enrico eine Holzvergaser Steuerung per Raspberry und fhem zu entwickeln,
Enrico hat sich einen zweiten HV Quasi zum Spielen zugelegt,
Da er keine FT verwenden möchte,werden wir die Steuerung mit einem Raspberry realisieren.
Als Haupsteuerung setzen wir fhem ein da dies relativ ausgereift ist und man alle Möglichkeiten der Programmierung hat.
Wir sind jetzt soweit das wir die beiden Lüfter Primär und Secundär aus fhem heraus per Pythonscript und PWM steuern können.

Als nächstes binden wir 2 Typ-K Sensoren für Brennkammer und Abgas per i2C Modul in fhem ein.

Die Lambdasonde werden wir über die Knödler Steuerung und RS232 am Raspberry anbinden.

Dann folgt die Verknüpfung der Module und der HV sollte laufen .

Geplante Features:
RSS Feed als Übersichts Display des HV
Mail Benachrichtigung über HV Status
Audio Ausgabe bei z.b ausbrandende
Datenerfassung und Diagramme des Abbrandes.
Etc....
Holzvergaser Orlan 40KW Brennkammer und Turbolatoren von Spikisveni Holzgasverteiler von Jens
Flammtronik umbau mit getrennter Primär/Secundärluft 3200 Liter Puffer
Visualisierung über Raspberry mit FHEM

Bild

Benutzeravatar
jostmario
Administrator
Beiträge: 924
Holzvergaser: Do 28. Jan 2016, 00:11
Bewertung: 147
Wohnort: Zimmern ob Rottweil
Kontaktdaten:

Re: RaspitroniK Steuerung für Holzvergaser

Beitrag #20530 von jostmario » Di 4. Dez 2018, 01:49

Beitrag reserviert :D
Holzvergaser Orlan 40KW Brennkammer und Turbolatoren von Spikisveni Holzgasverteiler von Jens
Flammtronik umbau mit getrennter Primär/Secundärluft 3200 Liter Puffer
Visualisierung über Raspberry mit FHEM

Bild

Benutzeravatar
Reiner.E
--Mitglied--
Beiträge: 195
Holzvergaser: Di 2. Feb 2016, 19:23
Bewertung: 23
Wohnort: Göggingen

Re: RaspitroniK Steuerung für Holzvergaser

Beitrag #20542 von Reiner.E » Mi 5. Dez 2018, 10:24

Hallo Josty,

ich habe meine HV Regelung mit einer x2 ( da gibt es garantiert eine Laufzeit von 10 und mehr Jahren) und Knödlermodul gemacht da mir die FT keine Eingriffe erlaubte um den HV besser zu regeln und damit sind viel Probleme die ich vorher damit hatte mit einem Schlag verschwunden.

Sonnige Grüße Reiner
PS: ich hatte Anfang der Jahrtausendwende auch eine Eigenentwicklung per AVR Controller für den Ölkessel mit Heizkreis aber bin dann 2005 mit Einbau des Holzkessel auf die 1611 umgestiegen denn das Programm weiter zu Entwickeln war mir dann zu viel Arbeit
ETA BK 15 mit Saugzuggebläse geregelt mit der UVR16x2
3 X 800 l PS zwei mit Solarwendel und 14 m2 FK mit einem CTC 265 EM als Backup geregelt mit zwei UVR16x2 mit CAN-I/O44 CAN-MTX2 und CMI
DHH mit Anbau und 110m2 Heizfläche

Benutzeravatar
jostmario
Administrator
Beiträge: 924
Holzvergaser: Do 28. Jan 2016, 00:11
Bewertung: 147
Wohnort: Zimmern ob Rottweil
Kontaktdaten:

Re: RaspitroniK Steuerung für Holzvergaser

Beitrag #20561 von jostmario » Mi 5. Dez 2018, 23:11

Hallo,

So heute den ersten Typ-k Sensor angeschlossen nach ein paar Startschwierigkeiten funktioniert es.
Der Typ-K Sensor gibt die Temperatur an den PID20 Regler von fhem und dieser steuert schon mal das Primärgebläse.
Der PID Regler hat wahnsinig viele Parameter zum einstellen.
@Stefan da können wir bestimmt mal Hilfe gebrauchen später.

@Reiner.E
Hast du da ein fertiges Knödler Modul genommen ?
Oder selbst gelötet?

Gruß Jost
Holzvergaser Orlan 40KW Brennkammer und Turbolatoren von Spikisveni Holzgasverteiler von Jens
Flammtronik umbau mit getrennter Primär/Secundärluft 3200 Liter Puffer
Visualisierung über Raspberry mit FHEM

Bild

Benutzeravatar
Reiner.E
--Mitglied--
Beiträge: 195
Holzvergaser: Di 2. Feb 2016, 19:23
Bewertung: 23
Wohnort: Göggingen

Re: RaspitroniK Steuerung für Holzvergaser

Beitrag #20563 von Reiner.E » Do 6. Dez 2018, 08:05

Hallo Josty,

ich habe das fertige 24V Modul genommen wegen 2-20mA Ausgang den kann ich mit einem 100 Ohm Widerstand einfach an jeden Eingang der x2 legen da die x2 eine Auflösung von 16 Bit hat im Gegensatz zur 1611 die nur 10 Bit hat. Bei Knödlermodul muß ich aber eine Korrektur am Eingang vornehmen da ich in freier Luft nur 19,9% erreiche und ich habe das Modul schon mal zur Kontrolle zurückgeschickt aber das wäre i.O. und die 4.9 Sonde ist nagelneu und leider kann man das nicht per Software machen.

Sonnige Grüße Reiner
ETA BK 15 mit Saugzuggebläse geregelt mit der UVR16x2
3 X 800 l PS zwei mit Solarwendel und 14 m2 FK mit einem CTC 265 EM als Backup geregelt mit zwei UVR16x2 mit CAN-I/O44 CAN-MTX2 und CMI
DHH mit Anbau und 110m2 Heizfläche

Benutzeravatar
Stefan
...putzt hier nur
Beiträge: 2619
Holzvergaser: Do 28. Jan 2016, 00:08
Bewertung: 605
Wohnort: Ostelsheim

Re: RaspitroniK Steuerung für Holzvergaser

Beitrag #20565 von Stefan » Do 6. Dez 2018, 10:11

jostmario hat geschrieben:Der PID Regler hat wahnsinig viele Parameter zum einstellen.
@Stefan da können wir bestimmt mal Hilfe gebrauchen später.


Gerne, aber zu den Parametern außer P, I und D bräuchte ich auch eine Dokumentation, sonst ließe sich nur raten. :shock:
Gruß vom Stefan (aka Hobbele ),
der auch ernst kann, wenn es mal gar nicht anders geht... ;)

Orlan 40 kW Holzvergaser, 4k Puffer, 10 qm Solar Flachkollektor, 2 PV Anlagen zusammen 107 kwp, Eigenbau- Frischwasserstation, bisher kein Backup, BHKW in Planung.

Benutzeravatar
jostmario
Administrator
Beiträge: 924
Holzvergaser: Do 28. Jan 2016, 00:11
Bewertung: 147
Wohnort: Zimmern ob Rottweil
Kontaktdaten:

Re: RaspitroniK Steuerung für Holzvergaser

Beitrag #20567 von jostmario » Do 6. Dez 2018, 11:20

Hallo Stefan,

hier die Doku zum PID Regler

https://wiki.fhem.de/wiki/PID20_-_Der_PID-Regler
https://forum.fhem.de/index.php/topic,1 ... #msg111615
Dauert aber noch ein bisschen bis wir den Regler grob einstellen müssen.

Gruß Josty

Projekt-Status


Text aus dem WIKI:
Das Modul ist seit dem 26.03.2014 Bestandteil von FHEM.
Features

einstellbarer Bewertungs-/Berechnungszyklus
Überwachung des Istwert-Gebers über dessen Zeitstempel (Sensorausfall)
Skalierbarkeit der Ausgabehäufigkeit an das Stellglied über Zeit und Mindeständerung
Zwangsausgabe an das Stellglied nach Ablauf eines einstellbaren Zeitintervalls
Notstellung des Stellgliedes, falls Istwert-Geber ausgefallen ist
Begrenzung des Stellbereichs nach oben und unten
Festlegung der Nachkommastellen (0..5) des Ausgabewertes zum Stellglied
Festlegen einer minimalen Regelabweichung, ab der der Regler aktiv wird
Festlegen des Reading-Namens für den Sollwert
Festlegen des Reading-Namens für den Istwert
Invertierung des Reglerwirksinns
Festlegen der minimalen Aktualisierungsrate der Readings
Festlegen der Proportionalitätskonstanten P,I,D

Thread im Forum

Diskussion zu PID20 im Forum
Define

define <name> PID20 sensor[:reading[:regexp]] actor:cmd

Attribute
Parameter Wertebereich Default Beschreibung
pidActorValueDecPlaces [0..5] 0 Anzahl der Nachkommastellen für Ausgabewert zu Aktor
pidActorInterval uint 180 minimale Wartezeit in Sekunden, bis eine neue Ausgabe an das Stellglied erfolgen kann
pidActorThreshold uint 1 Notwendige minimale Änderung zum Altwert der Stellgliedausgabe, damit diese erneut erfolgt
pidActorErrorAction [freeze, errorPos] freeze legt das Verhalten der Ausgabe zum Stellglied fest, wenn der Istwert nicht innerhalb von <pidSensorTimeout> aktualisiert wurde (Sensor-Ausfall)

freeze: Position des Stellgliedes beibehalten
ErrorPos: Position anfahren, die unter Attribut <pidActorErrorPos> angegeben ist."
pidActorErrorPos int 0 Diese Position ist einzunehmen, wenn pidActorErrorAction auf errorPos steht und der Istwert-Geber ausgefallen ist.
pidActorKeepAlive uint 1800 Spätestens nach dieser Zeit erfolgt eine Zwangsausgabe an das Stellglied

(wenn PID nicht disabled und nicht stopped)
pidActorLimitLower float 0 untere Begrenzung für das Stellglied
pidActorLimitUpper float 100 obere Begrenzung für das Stellglied
pidCalcInterval uint 60 Berechnungszyklus in Sekunden, nach dem die PID-Berechnung durchgeführt wird.
pidDeltaTreshold pos. float 0 wenn die Regeldifferenz(delta) kleiner als pidDeltaThreshold, dann wird der Regler eingefroren (state=idle)
pidDesiredName string desired Name für das Reading, das den Sollwert für den Regler aufnehmen soll
pidMeasuredName string measured Name für das Reading, das den Istwert für den Regler aufnehmen soll
pidSensorTimeout uint 3600 Zeitlimit in Sekunden, nach dessen Überschreitung der Ausfall des Istwert-Gebers anzunehmen ist
pidReverseAction [0,1] 0 Umgekehrter Wirksinn des Reglers
pidUpdateInterval uint 300 Zeitlimit in Sekunden, nach der ein Zwangsupdate der Readings erfolgen muss (Kurvendarstellung).
pidFactor_P pos. float 25 Proportionalitätskonstante für P-Anteil
pidFactor_I pos. float 0.25 Proportionalitätskonstante für I-Anteil
pidFactor_D pos. float 0 Proportionalitätskonstante für D-Anteil
disable [0,1] 0 Freigabe/Sperren des Reglers
Setter

desired

Funktion: Sollwert einstellen
Name des Setters kann vom Anwender über das Attribute "pidDesiredName" definiert werden

start

PID nimmt den Betrieb wieder auf, es werden P-, I- und D-Anteil vor dem Stop übernommen

stop

PID geht in den Zustand stopped; alles wird praktisch eingefroren

restart

arbeitet zunächst wie Start, jedoch gibt man an, mit welchen Prozentwert der Stellausgang anfangs stehen soll

Readings

13 10 20 Pid readings.png

actuation liefert den tatsächlichen Ausgabewert an das Stellglied
actuationCalc liefert den internen Rechenwert des Ausgabewertes für das Stellglied(ohne Begrenzung)
delta, die aktuelle Regeldifferenz
desired (Name ist variabel), der Sollwert
measured (Name ist variabel), der aktuelle Wert vom Istwert-geber
p_p, der P-Anteil des Ausgabewertes für das Stellglied
p_i, der I-Anteil des Ausgabewertes für das Stellglied
p_d, der D-Anteil des Ausgabewertes für das Stellglied
state, der Betriebszustand des Reglers

delta

delta = desired - measured (also Sollwert-Istwert)

actuation

actuation = actuationCalc

jedoch begrenzt durch pidActorLimitLower und pidActorLimitUpper und formatiert via pidActorValueDecPlaces

actuationCalc

Der Ausgabewert für das Stellglied wird wie folgt berechnet

actuationCalc = p_p + p_i + p_d

state
state Erläuterung
disabled PID-Instanz ist inaktiv
initializing Modul wurde initialisiert
idle Berechnung ist inaktiv
processing Berechnung ist aktiv, Normalbetrieb
alarm Ausnahmezustand, z.B. Timout des Istwert-Gebers
Inbetriebnahme

PID20 definieren, hier mit HMS100TF als Istwert-Geber für die Temperatur und ein MAX-Thermostat als Stellglied; Auslegung für eine Fußbodenheizung (sehr träge)

define PID.FUBO PID20 DG.BAD.TF:temperature HT.FUBO:maxValveSetting

<sensor> = "DG.BAD.TF": Name des Istwert-Geber s (HMS100TF)
<reading> = "temperature": das Reading vom HMS100TF, das die Temperatur liefert
<regexp> = nicht definiert, wir können also direkt den Wert des Readings verwenden
<actor> = "HT.FUBO" : Name des MAX-Thermostats, das als Stellglied verwendet wird
<cmd> = "maxValveSetting" : Das Kommando mit dem PID20 die Stellausgabe realisieren soll

Letztlich wird mit <actor> und <cmd> Folgendes ausgeführt:

set <actor> <cmd> <setting-value>

Zusätzlich noch einige Attribute anpassen:

die Ausgabehäufigkeit an das Stellglied auf 15 Minuten begrenzen

attr PID.FUBO pidActorInterval 900

nur dann einen Wert an das Stellglied ausgeben, wenn die Differenz zum Altwert >= 5%

attr PID.FUBO pidActorTreshold 5

Nachommastellen für das Stellglied festlegen; MAX-Thermostate erlauben nur Werte ohne Nachkommastellen

attr PID.FUBO pidActorValueDecPlaces 0

I-Faktor festlegen; Überlegung: bei einer Regelabweichung von 1 Grad, soll der I-Anteil um 0.2% pro Minute inkrementieren/dekrementieren

attr PID.FUBO pidFactor_I 0.2

P-Faktor festlegen; Überlegung:Bei einer Regel-Abweichung von 1 Grad, soll der P-Anteil +/-50% betragen

attr PID.FUBO pidFactor_P 50

Häufigkeit der Events begrenzen: Die Readings werden im Intervall von "pidCalcInterval" aktualisiert. Die damit erzeugten Events kann man mit den Standard-Mechanismen von FHEM begrenzen. Hier wird festgelegt, dass die Readings nur dann einen Event feuern, wenn diese sich tatsächlich ändern. Der Wert hinter dem Doppelpunkt, gibt die Mindeständerung an. Fehlt dieser, feuert jede Änderung einen Event.

attr PID.FUBO event-on-change-reading actuation:1,actuationCalc:0.5,delta:0.2,desired,measured:0.2,p_d:0.1,p_i:1.0,p_p:1.0

Events feuern, wenn sich über lange Zeit ein Reading nicht ändert: wenn sich z.B. desired über Stunden nicht ändert, so wird kein einziger Event gefeuert. Mit nachfolgender Einstellung erreicht man, dass ein Event auch dann erzeugt wird, wenn sich das Reading nach einer festgelegten Zeit nicht ändert(sinnvoll für Charts, hier z.B. alle 30 Minuten)

attr PID.FUBO event-min-interval actuation:1800,actuationCalc:1800,delta:1800,desired:1800,measured:1800,p_d:1800,p_i:1800,p_p:1800

Chart einrichten

Es ist für das Einstellen der Regel-Faktoren (P,I,D) überaus hilfreich, das Verhalten über die Zeit aufzuzeichnen, um das Verhalten objektiv beurteilen zu können.

Zunächst ein Filelog einrichten
define PID.FUBO.File FileLog ./log/PID.FUBO-%Y.log PID\.FUBO
attr PID.FUBO.File logtype text

Danach ein Chart definieren, angelehnt an folgendes Beispiel:

13 12 03 PID ChartDef.png


Hintergrund-Informationen
list <pid-name>

Internals:
DEF DG.BAD.TF PID.Actor:state
NAME PID.PID
NR 616
NTFY_ORDER 50-PID.PID
STATE processing
TYPE PID
Readings:
2013-10-20 17:13:41 actuation 97
2013-10-20 17:21:42 actuationCalc 97.2079999999999
2013-10-20 17:21:42 delta 0.199999999999999
2013-10-20 17:13:41 desired 22
2013-10-20 17:13:41 measured 21.8
2013-10-20 17:21:42 p_d 0
2013-10-20 17:21:42 p_i 92.2079999999999
2013-10-20 17:21:42 p_p 4.99999999999998
2013-10-20 17:21:42 state processing
Helper:
actor PID.Actor
actorCommand state
actorErrorAction freeze
actorErrorPos 0
actorInterval 300
actorKeepAlive 1800
actorLimitLower 0
actorLimitUpper 100
actorThreshold 4
actorTimestamp 2013-10-20 17:13:41
actorValueDecPlaces 0
calcInterval 60
deltaGradient 0
deltaOld 0.199999999999999
deltaOldTS 2013-10-20 17:18:07
deltaTreshold 0
desiredName desired
disable 0
factor_D 0
factor_I 0.25
factor_P 25
isWindUP 0
measuredName measured
reading temperature
regexp ([\d\.]*)
reverseAction 0
sensor DG.BAD.TF
sensorTimeout 3600
updateInterval 600
Attributes:
pidActorInterval 300
pidActorTreshold 4
pidActorValueDecPlaces 0
room PID
verbose 4

Anti-WindUp-Strategie

Der integrale Anteil des PID-Reglers wird ohne Gegenmassnahmen auch dann weiter integriert, wenn das Stellglied bereits an seine Grenzen gestossen ist. Dies hat den Nachteil, dass nach einer Reduzierung der Regeldifferenz lange Wartezeiten entstehen können, bis das Stellglied reagiert. Dies nennt man den WindUP-Effekt. Hierzu wurde die folgende Strategie entwickelt:

WindUP

Sobald das rechnerische Stellsignal (Ventilstellung Calc=actuationCalc) die obere Grenze des Stellgliedes überschreitet (pidActorLimitUpper) oder die untere Grenze unterschreitet (pidActorLimitLower), wird die Integration des I-Anteils eingefroren.

Am Beispiel:

An Position L1 überschreitet der rechnerische Ausgabewert des Stellgliedes die obere Grenze (100%). Der I-Anteil verändert sich nicht mehr bis zur Position L2. Hier unterschreitet der Ausgabewert die obere Grenze, der I-Anteil kann wieder verändert werden.
Fragen und Antworten
Wie kann ich den I-Anteil (p_i) im Regler auf 0 setzen ?

Dies ist nach folgender Anweisung möglich:

set <Pid-Name> restart <p_p + p_d>

Temperatur im Raum steigt nicht oder stark verzögert, was kann ich tun?
1. Fehlerquelle: Heizsystem ist nicht ausreichend entlüftet

In diesem Fall behindern die Luftblasen im System den Durchfluss des Heizmediums.

Der Heizkörper erwärmt sich nur teilweise oder "gluckert". Hier ist das Entlüften der Heizkörper angesagt.

Natürlich können sich die Gasblasen an anderer Stelle befinden. Normalerweise sorgen automatische Entlüfter dafür, dass das Gas entweichen kann.

Aber auch diese "verkalken" im Lauf der Zeit.
2. Fehlerquelle: Totzone beim Stellglied

Der Temperaturanstieg erfolgt erst ab einer bestimmten Ventilöffnung von xy%.

Der PID-Regler geht davon aus, dass jede Änderung des Stellausgangs auf die Regelgröße wirkt (also bei Ventil weiter öffnen, wird mehr Wärme abgegeben).

Ist dies nicht der Fall, wird der PID über die Zeit (I-Anteil) das Ventil weiter öffnen. Allerdings vergeht hierbei Zeit und damit leidet die Regelgüte.

Es ist also wichtig die Totzone zu ermitteln und im Attribut pidActorLimitLower zu hinterlegen.
3. Fehlerquelle: Hydraulische Fehlanpassung

Wenn einzelne Heizkreise einen sehr kleinen hydraulischen Widerstand aufweisen, kann es passieren, dass Heizkreise mit höherem Widerstand zeitweise unterversorgt sind.

Erst wenn die gut versorgten Heizkreise die Ventile schließen (Soll-Temperatur ist erreicht), werden die Heizkreise mit hohem Widerstand ausreichend versorgt.

Dies kann man dank FHEM sehr gut über die Charts nachvollziehen.

Es ist regelungstechnisch, ökologisch und energetisch absolut sinnvoll geregelte Hocheffizienz-Pumpen im Heizkreis einzusetzen. Diese sorgen für konstanten Druck im Hauptstrang bei sehr geringen Energiebedarf.

Man kann gezielt den hydraulischen Widerstand einzelner Thermostate erhöhen, indem man deren maximale Ventilöffnung begrenzt.

Dies erreicht man durch Reduzieren des Wertes pidActorLimitUpper. Dies ist gleichbedeutend mit der Erhöhung des hydraulischen Widerstandes durch voreinstellbare Heizungsventile beim hydraulischen Abgleich.
Holzvergaser Orlan 40KW Brennkammer und Turbolatoren von Spikisveni Holzgasverteiler von Jens
Flammtronik umbau mit getrennter Primär/Secundärluft 3200 Liter Puffer
Visualisierung über Raspberry mit FHEM

Bild


Zurück zu „Raspberry , FHEM , Arduino etc.“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast