Change E-Stop so that it can also work with one string

- Also optimized CV charging
This commit is contained in:
Matthias Heisig
2025-10-07 16:23:37 +02:00
parent 8ea7fd74e2
commit eaaa2371e8
16 changed files with 689 additions and 346 deletions

View File

@@ -8,6 +8,7 @@ VAR_INPUT
rKp : REAL;
rTn : REAL;
xEnable : BOOL;
xSaturated : BOOL := FALSE;
END_VAR
VAR_OUTPUT
@@ -19,6 +20,9 @@ VAR
_rIntegral : REAL := 0.0;
_rProportinal : REAL := 0.0;
_rErrorSign : REAL;
_xHoldIntegrator : BOOL;
_fbGetCurTaskIdx : GETCURTASKINDEX;
_rT : REAL;
END_VAR
@@ -31,10 +35,18 @@ _rError := rSP - rPV;
_rProportinal := rKp * _rError;
// Calculate controller output
rMV := _rProportinal + _rIntegral;
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 xSaturated) AND (rTn <> 0) THEN
IF (NOT _xHoldIntegrator) AND (rTn <> 0) THEN
_rIntegral := _rIntegral + (rKp * _rT / rTn) * _rError;
END_IF
@@ -56,7 +68,7 @@ END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[// Get current task time
_fbGetCurTaskIdx();
_rT := UDINT_TO_LREAL(TwinCAT_SystemInfoVarList._TASKInfo[_fbGetCurTaskIdx.index].CycleTime) * 10E-5;]]></ST>
_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}">

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<POU Name="FB_PT1Filter" Id="{bdcdd199-96b1-43e5-8e4f-5515b0a2225d}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_PT1Filter
VAR_INPUT
rInput : REAL;
timT : TIME := T#100MS;
END_VAR
VAR_OUTPUT
rOutput : REAL;
END_VAR
VAR
_rOutputLast : REAL := 0.0;
_fbGetCurTaskIdx : GETCURTASKINDEX;
_rT : REAL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Calculate output
rOutput := _rOutputLast + (rInput - _rOutputLast) * (_rT / (TIME_TO_LREAL(timT) + _rT));
// Save last output
_rOutputLast := rOutput;]]></ST>
</Implementation>
<Method Name="FB_init" Id="{8cf1c8f8-42a3-4c2a-b0ef-f9c06ee7877f}">
<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>
</POU>
</TcPlcObject>