erstmal herzlichen Dank für die Antworten.
mein Fehler war selbsgemacht, der Teil, der den Initialisierungswert für den I-Anteil ausrechnet wurde immer durchgeführt, nicht nur ausserhalb der Schwelle wo der Regler arbeiten soll.
Dies hab ich nun geändert und die Initialisierung für "beide" Regler mit reingenommen und nun gehts.
die Funktion schaut nun so aus:
das Subtrahieren bei Integralteil kommt aus der Kennlinie.Code:Function Pid_regler(byval _text As String) As Byte Local _y As Single , _x As Single , _e As Single , _pid As Single , _pwm As Byte Local _kp As Single , _ki As Single , _kd As Single Local _proportionalteil As Single , _integralteil As Single , _differentialteil As Single Local _esum As Single , _ealt As Single Local _betrag_e As Word Local _schwelle As Word Local _pwm_max As Byte Local _p_typ As Byte Local _t_typ As Word Local _m As Single , _n As Single Const _ta = 1 'Abtastintervall Select Case _text Case "L": Sreg.7 = 0 _pwm = Ocr1a _y = T_ist_luft Sreg.7 = 1 _x = Prog_temperatur_luft _kp = Kp_l _ki = Ki_l _kd = Kd_l _esum = Esum_luft _ealt = Ealt_luft _schwelle = Schwelle_l _pwm_max = P_l_ueberw _p_typ = P_l_typ 'typische Heizleistung bezogen auf _t_typ = T_l_typ 'typische Lufttemperatur Case "K": Sreg.7 = 0 _pwm = Ocr1b _y = T_ist_kondensat Sreg.7 = 1 _x = Prog_temperatur_kondensat _kp = Kp_k _ki = Ki_k _kd = Kd_k _esum = Esum_kondensat _ealt = Ealt_kondensat _schwelle = Schwelle_k _pwm_max = P_k_hzg_max _p_typ = P_k_typ 'typische Heizleistung bezogen auf _t_typ = T_k_typ 'typische Kondensattemperatur End Select _e = _x - _y 'Regelfehler _betrag_e = Abs(_e) If _betrag_e > _schwelle Then Help_single = _t_typ - 2000 'delta T _m = _p_typ / Help_single 'Anstieg Heizsteuerung Help_single = _m * _t_typ _n = _p_typ - Help_single 'Abschnitt Heizsteuerung _integralteil = _m * _x _integralteil = _integralteil + _n If _integralteil < 0 Then _integralteil = 0 _esum = _integralteil / _ki 'Vorgabe I-Anteil If _e > 0 Then _pwm = 255 Else _pwm = 0 'Vollaussteuerung Else If _pwm > 0 And _pwm < _pwm_max Then _esum = _esum + _e _proportionalteil = _kp * _e 'Proportionalteil berechnen _integralteil = _ki * _ta 'Integralteil berechnen _integralteil = _integralteil * _esum _differentialteil = _e - _ealt 'Differentialglied berechnen _differentialteil = _differentialteil * _kd _differentialteil = _differentialteil / _ta _pid = _proportionalteil + _integralteil 'Alle Glieder zusammenfassen _pid = _pid + _differentialteil _ealt = _e If _pid <= 255 And _pid >= 0 Then _pid = Round(_pid) _pwm = _pid Else If _pid > 255 Then _pwm = 255 Else _pwm = 0 End If End If Select Case _text Case "L": Esum_luft = _esum Ealt_luft = _ealt Case "K": Esum_kondensat = _esum Ealt_kondensat = _ealt End Select Pid_regler = _pwm End Function
Ich möchte ja erst bei einer Solltemperatur über 20°C losheizen - also geht die Heizleistungskurve nicht durch Null, sondern hat einen Achsenabschnitt.
Gruß BoGe-Ro







Zitieren

Lesezeichen