80 lines
2.3 KiB
XML
80 lines
2.3 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
|
|
<POU Name="FB_PI" Id="{8fe95419-3a89-4668-8d22-4f91ef3ca204}" SpecialFunc="None">
|
|
<Declaration><![CDATA[FUNCTION_BLOCK FB_PI
|
|
VAR_INPUT
|
|
rSP : REAL;
|
|
rPV : REAL;
|
|
rKp : REAL;
|
|
rTn : REAL;
|
|
|
|
xEnable : BOOL;
|
|
xSaturated : BOOL := FALSE;
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
rMV : REAL;
|
|
END_VAR
|
|
VAR
|
|
|
|
_rError : REAL := 0.0;
|
|
_rIntegral : REAL := 0.0;
|
|
_rProportinal : REAL := 0.0;
|
|
|
|
_rErrorSign : REAL;
|
|
_xHoldIntegrator : BOOL;
|
|
|
|
_fbGetCurTaskIdx : GETCURTASKINDEX;
|
|
_rT : REAL;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Calculate error
|
|
_rError := rSP - rPV;
|
|
|
|
// Calculate proportinal part
|
|
_rProportinal := rKp * _rError;
|
|
|
|
// Calculate controller output
|
|
IF xEnable THEN
|
|
rMV := _rProportinal + _rIntegral;
|
|
ELSE
|
|
rMV := 0.0;
|
|
END_IF
|
|
|
|
_rErrorSign := _rError * rMV;
|
|
|
|
_xHoldIntegrator := xSaturated AND (_rErrorSign > 0);
|
|
|
|
// Stop integrator if saturated
|
|
IF (NOT _xHoldIntegrator) AND (rTn <> 0) THEN
|
|
_rIntegral := _rIntegral + (rKp * _rT / rTn) * _rError;
|
|
END_IF
|
|
|
|
// Reset integral with deactivated integral time
|
|
IF (rTn = 0.0) AND (_rIntegral <> 0) THEN
|
|
_rIntegral := 0.0;
|
|
END_IF]]></ST>
|
|
</Implementation>
|
|
<Method Name="FB_init" Id="{58ddb3c6-73d3-470a-927d-f677bf66bbfe}">
|
|
<Declaration><![CDATA[//FB_Init ist immer implizit verfügbar und wird primär für die Initialisierung verwendet.
|
|
//Der Rückgabewert wird nicht ausgewertet. Für gezielte Einflussnahme können Sie
|
|
//die Methoden explizit deklarieren und darin mit dem Standard-Initialisierungscode
|
|
//zusätzlichen Code bereitstellen. Sie können den Rückgabewert auswerten.
|
|
METHOD FB_Init: BOOL
|
|
VAR_INPUT
|
|
bInitRetains: BOOL; // TRUE: Die Retain-Variablen werden initialisiert (Reset warm / Reset kalt)
|
|
bInCopyCode: BOOL; // TRUE: Die Instanz wird danach in den Kopiercode kopiert (Online-Change)
|
|
END_VAR]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Get current task time
|
|
_fbGetCurTaskIdx();
|
|
_rT := LREAL_TO_REAL(UDINT_TO_LREAL(TwinCAT_SystemInfoVarList._TASKInfo[_fbGetCurTaskIdx.index].CycleTime) * 10E-5);]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Action Name="Reset" Id="{4227580c-e163-4250-9575-dd60ff3083af}">
|
|
<Implementation>
|
|
<ST><![CDATA[_rIntegral := 0.0;]]></ST>
|
|
</Implementation>
|
|
</Action>
|
|
</POU>
|
|
</TcPlcObject> |