Fixed FB_AxisPTP and added controller FB's

- Fixed FB_AxisPTP by removing unsued types
- Added FB_Limit
- Added pi controller fb
- Moved files to own controller folder
- Renamed tmc file which contains the events
This commit is contained in:
2026-02-06 21:17:48 +01:00
parent ec332f372c
commit 74a9299609
6 changed files with 137 additions and 52 deletions

View File

@@ -131,12 +131,12 @@
</Task> </Task>
</Tasks> </Tasks>
<TypeSystem> <TypeSystem>
<AdditionalTmcFile Name="BaseComponents" File="BaseComponents.tmc"/> <AdditionalTmcFile Name="Events" File="Events.tmc"/>
</TypeSystem> </TypeSystem>
</System> </System>
<Plc> <Plc>
<Project GUID="{4E62D9E7-436C-457D-8DC4-82D2FEF91C96}" Name="BasicComponents" PrjFilePath="BasicComponents\BasicComponents.plcproj" TmcFilePath="BasicComponents\BasicComponents.tmc" ReloadTmc="true" AmsPort="851" FileArchiveSettings="#x000e" CopyTmcToTarget="true" CopyTpyToTarget="false" SymbolicMapping="true"> <Project GUID="{4E62D9E7-436C-457D-8DC4-82D2FEF91C96}" Name="BasicComponents" PrjFilePath="BasicComponents\BasicComponents.plcproj" TmcFilePath="BasicComponents\BasicComponents.tmc" ReloadTmc="true" AmsPort="851" FileArchiveSettings="#x000e" CopyTmcToTarget="true" CopyTpyToTarget="false" SymbolicMapping="true">
<Instance Id="#x08502000" TcSmClass="TComPlcObjDef" KeepUnrestoredLinks="2" TmcHash="{5DBE1701-D5AF-C0A4-B386-82619480C86C}" TmcPath="PLC\PLC.tmc"> <Instance Id="#x08502000" TcSmClass="TComPlcObjDef" KeepUnrestoredLinks="2" TmcHash="{FB895001-23AB-2B17-4B12-BEB2F42468E3}" TmcPath="BasicComponents\BasicComponents.tmc">
<Name>BasicComponents Instance</Name> <Name>BasicComponents Instance</Name>
<CLSID ClassFactory="TcPlc30">{08500001-0000-0000-F000-000000000064}</CLSID> <CLSID ClassFactory="TcPlc30">{08500001-0000-0000-F000-000000000064}</CLSID>
<Vars VarGrpType="2" AreaNo="1"> <Vars VarGrpType="2" AreaNo="1">

Binary file not shown.

View File

@@ -21,7 +21,7 @@
<GlobalVersionStructureIncluded>false</GlobalVersionStructureIncluded> <GlobalVersionStructureIncluded>false</GlobalVersionStructureIncluded>
<Company>Heisig GmbH</Company> <Company>Heisig GmbH</Company>
<Title>BaseComponents</Title> <Title>BaseComponents</Title>
<ProjectVersion>1.1</ProjectVersion> <ProjectVersion>1.2</ProjectVersion>
<DefaultNamespace>BC</DefaultNamespace> <DefaultNamespace>BC</DefaultNamespace>
<Author>M.Heisig</Author> <Author>M.Heisig</Author>
<Description>Basic components fb's (Valves, AI, AO, Motors, etc.)</Description> <Description>Basic components fb's (Valves, AI, AO, Motors, etc.)</Description>
@@ -73,6 +73,12 @@
<Compile Include="POUs\Components\AxisPTP\FB_AxisPTP.TcPOU"> <Compile Include="POUs\Components\AxisPTP\FB_AxisPTP.TcPOU">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="POUs\Components\Controller\FB_Limit.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Components\Controller\FB_PI.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Components\EventListener\FB_EventListener.TcPOU"> <Compile Include="POUs\Components\EventListener\FB_EventListener.TcPOU">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
@@ -224,6 +230,7 @@
<ExcludeFromBuild>true</ExcludeFromBuild> <ExcludeFromBuild>true</ExcludeFromBuild>
</Folder> </Folder>
<Folder Include="POUs\Components\Motor\Types" /> <Folder Include="POUs\Components\Motor\Types" />
<Folder Include="POUs\Components\Controller" />
<Folder Include="POUs\Components\Utilities" /> <Folder Include="POUs\Components\Utilities" />
<Folder Include="POUs\Components\Valves" /> <Folder Include="POUs\Components\Valves" />
<Folder Include="POUs\Components\Valves\Types" /> <Folder Include="POUs\Components\Valves\Types" />
@@ -283,7 +290,7 @@
</PlaceholderReference> </PlaceholderReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="PLC.tmc"> <None Include="BasicComponents.tmc">
<SubType>Content</SubType> <SubType>Content</SubType>
</None> </None>
</ItemGroup> </ItemGroup>
@@ -292,11 +299,6 @@
<SubType>Content</SubType> <SubType>Content</SubType>
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="BasicComponents.tmc">
<SubType>Content</SubType>
</None>
</ItemGroup>
<ProjectExtensions> <ProjectExtensions>
<PlcProjectOptions> <PlcProjectOptions>
<XmlArchive> <XmlArchive>

View File

@@ -393,29 +393,18 @@ xError := _xError;]]></ST>
<Method Name="M_Halt" Id="{f6e3b049-4121-4299-b0f5-55178ecb35c3}"> <Method Name="M_Halt" Id="{f6e3b049-4121-4299-b0f5-55178ecb35c3}">
<Declaration><![CDATA[METHOD M_Halt <Declaration><![CDATA[METHOD M_Halt
VAR_OUTPUT VAR_OUTPUT
eResultCode : E_SequenceResultCode;
eFailureCode : E_SequenceFailureCode;
END_VAR]]></Declaration> END_VAR]]></Declaration>
<Implementation> <Implementation>
<ST><![CDATA[IF _xBusy THEN <ST><![CDATA[IF _xBusy THEN
_xExecuteHalt := TRUE; _xExecuteHalt := TRUE;
eResultCode := E_SequenceResultCode.EXECUTING;
eFailureCode := E_SequenceFailureCode.NONE;
ELSE
eResultCode := E_SequenceResultCode.DONE;
eFailureCode := E_SequenceFailureCode.NONE;
END_IF]]></ST> END_IF]]></ST>
</Implementation> </Implementation>
</Method> </Method>
<Method Name="M_Homing" Id="{816a1a43-38da-49f0-b902-c1027a6ba127}"> <Method Name="M_Homing" Id="{816a1a43-38da-49f0-b902-c1027a6ba127}">
<Declaration><![CDATA[METHOD M_Homing <Declaration><![CDATA[METHOD M_Homing : BOOL
VAR_INPUT VAR_INPUT
lrHomingPosition : LREAL; lrHomingPosition : LREAL;
eHomingMode : MC_HomingMode := MC_HomingMode.MC_DefaultHoming; eHomingMode : MC_HomingMode := MC_HomingMode.MC_DefaultHoming;
END_VAR
VAR_OUTPUT
eResultCode : E_SequenceResultCode;
eFailureCode : E_SequenceFailureCode;
END_VAR]]></Declaration> END_VAR]]></Declaration>
<Implementation> <Implementation>
<ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN <ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN
@@ -423,79 +412,59 @@ END_VAR]]></Declaration>
_lrHomingPos := lrHomingPosition; _lrHomingPos := lrHomingPosition;
_eHomingMode := eHomingMode; _eHomingMode := eHomingMode;
_xExecuteHoming := TRUE; _xExecuteHoming := TRUE;
eResultCode := E_SequenceResultCode.EXECUTING; M_Homing := TRUE;
eFailureCode := E_SequenceFailureCode.NONE;
ELSE ELSE
eResultCode := E_SequenceResultCode.FAILED; M_Homing := FALSE;
eFailureCode := E_SequenceFailureCode.OTHER;
END_IF]]></ST> END_IF]]></ST>
</Implementation> </Implementation>
</Method> </Method>
<Method Name="M_MoveAbs" Id="{f67a4861-cdb0-4dd2-93c8-1ae9dbc9a9a6}"> <Method Name="M_MoveAbs" Id="{f67a4861-cdb0-4dd2-93c8-1ae9dbc9a9a6}">
<Declaration><![CDATA[METHOD M_MoveAbs <Declaration><![CDATA[METHOD M_MoveAbs : BOOL;
VAR_INPUT VAR_INPUT
lrTargetPos : LREAL; lrTargetPos : LREAL;
END_VAR
VAR_OUTPUT
eResultCode : E_SequenceResultCode;
eFailureCode : E_SequenceFailureCode;
END_VAR]]></Declaration> END_VAR]]></Declaration>
<Implementation> <Implementation>
<ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN <ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN
_xBusy := TRUE; _xBusy := TRUE;
_lrTargetPosition := lrTargetPos; _lrTargetPosition := lrTargetPos;
_xExecuteMoveAbs := TRUE; _xExecuteMoveAbs := TRUE;
eResultCode := E_SequenceResultCode.EXECUTING; M_MoveAbs := TRUE;
eFailureCode := E_SequenceFailureCode.NONE;
ELSE ELSE
eResultCode := E_SequenceResultCode.FAILED; M_MoveAbs := FALSE;
eFailureCode := E_SequenceFailureCode.OTHER;
END_IF END_IF
]]></ST> ]]></ST>
</Implementation> </Implementation>
</Method> </Method>
<Method Name="M_MoveRel" Id="{51e5fe82-5e25-4de0-84c7-b4d6560c312f}"> <Method Name="M_MoveRel" Id="{51e5fe82-5e25-4de0-84c7-b4d6560c312f}">
<Declaration><![CDATA[METHOD M_MoveRel <Declaration><![CDATA[METHOD M_MoveRel : BOOL;
VAR_INPUT VAR_INPUT
lrRelDist : LREAL; lrRelDist : LREAL;
END_VAR
VAR_OUTPUT
eResultCode : E_SequenceResultCode;
eFailureCode : E_SequenceFailureCode;
END_VAR]]></Declaration> END_VAR]]></Declaration>
<Implementation> <Implementation>
<ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN <ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN
_xBusy := TRUE; _xBusy := TRUE;
_lrRelativeDistance := lrRelDist; _lrRelativeDistance := lrRelDist;
_xExecuteMoveRel:= TRUE; _xExecuteMoveRel:= TRUE;
eResultCode := E_SequenceResultCode.EXECUTING; M_MoveRel := TRUE;
eFailureCode := E_SequenceFailureCode.NONE;
ELSE ELSE
eResultCode := E_SequenceResultCode.FAILED; M_MoveRel := FALSE;
eFailureCode := E_SequenceFailureCode.OTHER;
END_IF]]></ST> END_IF]]></ST>
</Implementation> </Implementation>
</Method> </Method>
<Method Name="M_MoveVelocity" Id="{fd4ad471-f522-45f2-a138-ebe509907cf6}"> <Method Name="M_MoveVelocity" Id="{fd4ad471-f522-45f2-a138-ebe509907cf6}">
<Declaration><![CDATA[METHOD M_MoveVelocity <Declaration><![CDATA[METHOD M_MoveVelocity : BOOL;
VAR_INPUT VAR_INPUT
eDirection : MC_Direction := MC_Direction.MC_Positive_Direction; eDirection : MC_Direction := MC_Direction.MC_Positive_Direction;
END_VAR END_VAR
VAR_OUTPUT
eResultCode : E_SequenceResultCode;
eFailureCode : E_SequenceFailureCode;
END_VAR
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>
<ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN <ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN
_xBusy := TRUE; _xBusy := TRUE;
_xExecuteMoveVelocity := TRUE; _xExecuteMoveVelocity := TRUE;
_eMoveVelDirection := eDirection; _eMoveVelDirection := eDirection;
eResultCode := E_SequenceResultCode.EXECUTING; M_MoveVelocity := TRUE;
eFailureCode := E_SequenceFailureCode.NONE;
ELSE ELSE
eResultCode := E_SequenceResultCode.FAILED; M_MoveVelocity := FALSE;
eFailureCode := E_SequenceFailureCode.OTHER;
END_IF END_IF
]]></ST> ]]></ST>
</Implementation> </Implementation>

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_Limit" Id="{b96bc001-8221-07a5-2342-3de34e6faf1f}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Limit
VAR_INPUT
rIn : REAL;
rMin : REAL;
rMax : REAL;
END_VAR
VAR_OUTPUT
rOut : REAL;
xClampedUpper : BOOL;
xClampedLower : BOOL;
END_VAR
VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF rIn > rMax THEN
rOut := rMax;
xClampedUpper := TRUE;
ELSIF rIn < rMin THEN
rOut := rMin;
xClampedLower := TRUE;
ELSE
rOut := rIn;
xClampedUpper := FALSE;
xClampedLower := FALSE;
END_IF]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_PI" Id="{d504557e-7fd7-4784-a00a-5d7d1bed0c95}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_PI
VAR_INPUT
rSP : REAL;
rPV : REAL;
rKp : REAL;
rTn : REAL;
xEnable : BOOL;
xSaturatedUpper : BOOL := FALSE;
xSaturatedLower : BOOL := FALSE;
END_VAR
VAR_OUTPUT
rMV : REAL;
END_VAR
VAR
_rError : REAL := 0.0;
_rIntegral : REAL := 0.0;
_rProportinal : REAL := 0.0;
_rDeltaIntegral : REAL := 0.0;
_fbGetCurTaskIdx : GETCURTASKINDEX;
_rT : REAL;
_xFirstCylce : BOOL := TRUE;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xFirstCylce THEN
_xFirstCylce := FALSE;
// Get current task time
_fbGetCurTaskIdx();
_rT := LREAL_TO_REAL(UDINT_TO_LREAL(TwinCAT_SystemInfoVarList._TASKInfo[_fbGetCurTaskIdx.index].CycleTime) * 10E-5);
END_IF
IF xEnable THEN
_rError := rSP - rPV;
ELSE
_rError := 0.0;
_rIntegral := 0.0;
rMV := 0.0;
RETURN;
END_IF
// Calculate proportinal part
_rProportinal := rKp * _rError;
// Calculate controller output
rMV := _rProportinal + _rIntegral;
// Calculate integral for this step
IF rTn <> 0 THEN
_rDeltaIntegral := (rKp * _rT / rTn) * _rError;
ELSE
_rDeltaIntegral := 0;
END_IF
// Only add new integral part if we are going away from the upper or lower bound
IF (xSaturatedUpper AND (_rDeltaIntegral > 0.0)) THEN
_rDeltaIntegral := 0.0;
END_IF
IF (xSaturatedLower AND (_rDeltaIntegral < 0.0)) THEN
_rDeltaIntegral := 0.0;
END_IF
// Calculate integral part
_rIntegral := _rIntegral + _rDeltaIntegral;
// Reset integral with deactivated integral time
IF (rTn = 0.0) AND (_rIntegral <> 0) THEN
_rIntegral := 0.0;
END_IF]]></ST>
</Implementation>
</POU>
</TcPlcObject>