Hallo,
ich habe folgenden Regler definiert:
Internals:
DEF RE_TEMP_VorlaufHK:temperature D_MischerPID
NAME PID.FUBO
NR 363
NTFY_ORDER 50-PID.FUBO
STATE A: 2 AC: 0 Soll: 30.9°C Ist: 31.0°C
TYPE PID20
VERSION 1.0.0.9
Helper:
Dblog:
Actuation:
Logdb:
TIME 1479066801.95683
VALUE 2
Actuationcalc:
Logdb:
TIME 1479066801.95683
VALUE -0.0990000000000014
Alt:
Logdb:
TIME 1479066802.04754
VALUE I: 0.9 P: 28 D: 50
Delta:
Logdb:
TIME 1479066801.95683
VALUE -0.100000000000001
Desired:
Logdb:
TIME 1479066801.95683
VALUE 30.9
Measured:
Logdb:
TIME 1479066801.95683
VALUE 31
P_d:
Logdb:
TIME 1479066801.95683
VALUE 0
P_i:
Logdb:
TIME 1479066801.95683
VALUE 0
P_p:
Logdb:
TIME 1479066801.95683
VALUE -0.0990000000000014
Pidfactor_d:
Logdb:
TIME 1479066802.04754
VALUE 0
Pidfactor_i:
Logdb:
TIME 1479066802.04754
VALUE 0
Pidfactor_p:
Logdb:
TIME 1479066802.04754
VALUE 0.99
State:
Logdb:
TIME 1479066802.04754
VALUE processing
Readings:
2016-11-13 20:53:21 actuation 2
2016-11-13 20:53:21 actuationCalc -0.0990000000000014
2016-11-13 20:53:22 alt I: 0.9 P: 28 D: 50
2016-11-13 20:53:21 delta -0.100000000000001
2016-11-13 20:53:21 desired 30.9
2016-11-13 20:53:21 measured 31
2016-11-13 20:53:21 p_d 0
2016-11-13 20:53:21 p_i 0
2016-11-13 20:53:21 p_p -0.0990000000000014
2016-11-13 20:53:22 pidFactor_D 0
2016-11-13 20:53:22 pidFactor_I 0
2016-11-13 20:53:22 pidFactor_P 0.99
2016-11-13 20:53:22 state processing
Helper:
actor D_MischerPID
actorCommand
actorErrorAction freeze
actorErrorPos 0
actorInterval 180
actorKeepAlive 1800
actorLimitLower -5
actorLimitUpper 5
actorThreshold 1
actorTimestamp 2016-11-13 20:51:51
actorValueDecPlaces 0
adjust
calcInterval 45
deltaGradient -0.0158472823831443
deltaOld -0.600000000000001
deltaOldTS 2016-11-13 20:53:32
deltaTreshold 0
desiredName desired
disable 0
factor_D 0
factor_I 0
factor_P 0.99
isWindUP
measuredName measured
reading temperature
regexp ^([\+,\-]?\d+\.?\d*$)
reverseAction 0
sensor RE_TEMP_VorlaufHK
sensorTimeout 3600
stopped 0
updateInterval 600
Attributes:
DbLogInclude .*
pidActorLimitLower -5
pidActorLimitUpper 5
pidActorValueDecPlaces 0
pidCalcInterval 45
pidFactor_D 0
pidFactor_I 0
pidFactor_P 0.99
room Heizung
stateFormat {sprintf("A: %d AC: %d Soll: %.1f°C Ist: %.1f°C", ReadingsVal("PID.FUBO","actuation",0),ReadingsVal("PID.FUBO","actuationCalc",0),ReadingsVal("PID.FUBO","desired",0),ReadingsVal("PID.FUBO","measured",0),)}
userReadings alt {sprintf("I: 0.9 P: 28 D: 50");},
pidFactor_D { AttrVal("PID.FUBO","pidFactor_D",1)},
pidFactor_I { AttrVal("PID.FUBO","pidFactor_I",1)},
pidFactor_P { AttrVal("PID.FUBO","pidFactor_P",1)}
Wie man schön sieht, ist actuationCalc = -0.0990000000000014, während actuation noch auf 2 steht.
Das veranlasst mein notify, welches auf actuation hört, den Mischer in die falsche Richtung zu fahren.
Jemand eine Idee, warum das so ist?
In der commandref wird aufs Wiki verwiesen, und im wiki steht
Zitat
actuation = actuationCalc
jedoch begrenzt durch pidActorLimitLower und pidActorLimitUpper und formatiert via pidActorValueDecPlaces
Grenzen sind bei mir weit enfernt, also müsste PID20 nur runden, aber egal wie, komme ich von -0,9 nicht auf +2.
Edit: bei AC -3,5 und actuation -4 sind sie sich wieder einig ...
Grüße
Stephan