PID20: actuationCalc und actuation unterscheiden sich scheinbar grundlos

Begonnen von abc2006, 13 November 2016, 20:57:51

Vorheriges Thema - Nächstes Thema

abc2006

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
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX