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