Regelkreise und Loop Objekte

Für die Abbildung von Regelkreisen stellt der BACnet Standard das Loop-Objekt bereit. Dabei werden die Regelparameter, wie z. B. P, I, D, Begrenzungen des Regelbereichs oder die Wirkrichtung als Properties des Loop Object Typs an den Reglerbaustein weitergegeben. Der Typ des Reglers selbst ist im BACnet-Standard nicht vorgegeben.

In der Bibliothek Tc3_BA2_Common findet sich die Implementierung des PID-Reglers (FB_BA_PIDCtrl), welcher über die Bausteine FB_BACnet_Loop bzw. FB_BACnet_LoopRef abgebildet wird.

FB_BACnet_Loop implementiert einen Regler, dessen Sollwert, Ausgangswert sowie Istwert, über Baustein-interne Variablen abgebildet wird.

FB_BACnet_LoopRef verwendet als Sollwert eine Referenz auf ein Analog Value Objekt, als Ausgangswert eine Referenz auf ein Analog Output Objekt sowie für den Istwert eine Referenz auf ein Analog-Input-Objekt.

Während für die meisten Anwendungen der Bausteintyp FB_BACnet_Loop ausreicht, kann dem Bediener der Management Bedienebene mit dem Bausteintyp FB_BACnet_LoopRef der Zugriff auf die Reglerwerte (Sollwert, Ausgangswert und Istwert) über BACnet ermöglicht werden. Damit erhöht sich jedoch die Anzahl der BACnet-Objekte pro Regelkreis auf 4.

Die nachfolgenden Beispiele zeigen exemplarisch die Realisierung eines PI-Reglers.

Variablen

// control loop using internal variables
fbLoopInternal : FB_BACnet_Loop := (
                        bEn := TRUE,
                        sDescription := 'Loop using internal control parameters',
                        eOutputUnit := E_BA_Unit.eOther_Percent,
                        eAction := E_BA_Action.eReverse,
                        fProportionalConstant := 5.0,
                        fIntegralConstant := 180,
                        fSetpoint := 20
        );
fCtrlVal : REAL := 18;


// control loop using external BACnet objects
fbLoopRef_Setpt : FB_BACnet_AV_Setp := (
                        fValue := 20 );
fbLoopRef_CtrlVar : FB_BACnet_AI := (
                        fVal := 18 );
fbLoopRef_Y : FB_BACnet_AO := ();
fbLoopRef : FB_BACnet_Loop_Ref := (
                        bEn := TRUE,
                        sDescription := 'Loop using reference objects',
                        stControlledVariableReference :=
                            F_BACnet_Reference( fbLoopRef_CtrlVar, PropPresentValue),
                        stSetpointReference :=
                            F_BACnet_Reference( fbLoopRef_Setpt, PropPresentValue),
                        stManipulatedVariableReference :=
                            F_BACnet_Reference( fbLoopRef_Y, PropPresentValue),
                        eOutputUnit := E_BA_Unit.eOther_Percent,
                        eAction := E_BA_Action.eReverse,
                        fProportionalConstant := 5.0,
                        fIntegralConstant := 180
        );


Code

// internal control loop
fbLoopInternal.fCtrlVar := fCtrlVal;
fbLoopInternal();

// control loop using external object references
fbLoopRef_Setpt();
fbLoopRef_CtrlVar();
fbLoopRef_Y();
fbLoopRef();