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();