Regelkreise
BACnet spezifiziert einen Loop-Objekttyp, um die Parameter für Regelkreise bereitzustellen (z. B. P, I, D, Bias, Maximum_Output, usw.). Diese Werte werden als Eigenschaften des Objekttyps Loop bereitgestellt.
Falls der Sollwert, der Stellgrößenwert und der Regelgrößenwert für BACnet-Clients sichtbar sein sollen, können zusätzlich zum Loop-Objekt Analog-Objekte angegeben werden. TwinCAT bietet zwei Implementierungen für Regelkreise:
FB_BACnet_Loop: Loop-Objekt ohne externe Referenzen, der Sollwert und die Stell- und Regelwerte werden von internen Variablen übernommen.
FB_BACnet_Loop_Ref: Loop-Objekt mit externen Referenzen. Eine typische Implementierung kann ein Analog-Value-Objekt für den Sollwert, einen Analogausgang für den Stellgrößenwert und einen Analogeingang für den Regelgrößenwert umfassen.
Beispiel:
VAR
// 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
);
END_VAR
------------------------------------------------------------------
// internal control loop
fbLoopInternal.fCtrlVar := fCtrlVal;
fbLoopInternal();
// control loop using external object references
fbLoopRef_Setpt();
fbLoopRef_CtrlVar();
fbLoopRef_Y();
fbLoopRef();