Merge branch 'release/1.1'

This commit is contained in:
2026-02-02 09:58:58 +01:00
6 changed files with 544 additions and 6 deletions

View File

@@ -1,5 +1,5 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<TcSmProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.beckhoff.com/schemas/2012/07/TcSmProject" TcSmVersion="1.0" TcVersion="3.1.4026.19"> <TcSmProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.beckhoff.com/schemas/2012/07/TcSmProject" TcSmVersion="1.0" TcVersion="3.1.4026.20">
<DataTypes> <DataTypes>
<DataType> <DataType>
<Name GUID="{E1AAE90D-A058-4E83-848E-5E87CB5B885D}" PersistentType="true">AnalogOutput</Name> <Name GUID="{E1AAE90D-A058-4E83-848E-5E87CB5B885D}" PersistentType="true">AnalogOutput</Name>
@@ -136,7 +136,7 @@
</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="{BC065F54-D783-3F62-2B3C-EC8392B01342}" TmcPath="PLC\PLC.tmc"> <Instance Id="#x08502000" TcSmClass="TComPlcObjDef" KeepUnrestoredLinks="2" TmcHash="{5DBE1701-D5AF-C0A4-B386-82619480C86C}" TmcPath="PLC\PLC.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

@@ -9,7 +9,7 @@
<WriteProductVersion>false</WriteProductVersion> <WriteProductVersion>false</WriteProductVersion>
<GenerateTpy>false</GenerateTpy> <GenerateTpy>false</GenerateTpy>
<Name>BasicComponents</Name> <Name>BasicComponents</Name>
<ProgramVersion>3.1.4026.19</ProgramVersion> <ProgramVersion>3.1.4026.20</ProgramVersion>
<Application>{7cc9c530-510c-48e6-a294-2e6b5e6fa820}</Application> <Application>{7cc9c530-510c-48e6-a294-2e6b5e6fa820}</Application>
<TypeSystem>{951d7a0c-817c-4013-8204-ecd29ee0162e}</TypeSystem> <TypeSystem>{951d7a0c-817c-4013-8204-ecd29ee0162e}</TypeSystem>
<Implicit_Task_Info>{e6d3915d-876b-4120-9e42-92be330ed750}</Implicit_Task_Info> <Implicit_Task_Info>{e6d3915d-876b-4120-9e42-92be330ed750}</Implicit_Task_Info>
@@ -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.0</ProjectVersion> <ProjectVersion>1.1</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>
@@ -67,6 +67,12 @@
<Compile Include="POUs\Components\Analog\Types\ST_ANALOG_IO_CONFIG.TcDUT"> <Compile Include="POUs\Components\Analog\Types\ST_ANALOG_IO_CONFIG.TcDUT">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="POUs\Components\AxisPTP\E_AXIS_PTP_STATE.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Components\AxisPTP\FB_AxisPTP.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>
@@ -211,6 +217,7 @@
<Folder Include="GVLs" /> <Folder Include="GVLs" />
<Folder Include="POUs\Components\Analog" /> <Folder Include="POUs\Components\Analog" />
<Folder Include="POUs\Components\Analog\Types" /> <Folder Include="POUs\Components\Analog\Types" />
<Folder Include="POUs\Components\AxisPTP" />
<Folder Include="POUs\Components\EventListener" /> <Folder Include="POUs\Components\EventListener" />
<Folder Include="POUs\Components\EventListener\Types" /> <Folder Include="POUs\Components\EventListener\Types" />
<Folder Include="POUs\Components\Motor"> <Folder Include="POUs\Components\Motor">
@@ -285,6 +292,11 @@
<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

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="E_AXIS_PTP_STATE" Id="{e713a96e-1301-4139-8827-994d0c38662a}">
<Declaration><![CDATA[{attribute 'qualified_only'}
{attribute 'strict'}
{attribute 'to_string'}
TYPE E_AXIS_PTP_STATE :
(
OFF := 0,
WAIT_FOR_ENABLE,
ENABLED,
HOMING,
MOVING_ABSOLUTE,
MOVING_RELATIVE,
MOVING_VELOCITY,
HALTING,
WAIT_FOR_DISABLE,
ERROR,
RESET
);
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,504 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_AxisPTP" Id="{5a7035b7-f11b-403b-9828-9d2d1f662a54}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_AxisPTP
VAR_INPUT
xEnable : BOOL;
xCalibrationCam AT %I* : BOOL;
xInvertCalibrationCam : BOOL := FALSE;
xEnablePositive : BOOL := TRUE;
xEnableNegative : BOOL := TRUE;;
rOverride : REAL := 100.0;
lrVelocity : LREAL;
lrAcceleration : LREAL := 0.0;
lrDecelleration : LREAL := 0.0;
lrJerk : LREAL := 0.0;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
xEnabled : BOOL;
xHomed : BOOL;
lrActPosition : LREAL;
xIsStopped : BOOL;
xBusy : BOOL;
xError : BOOL;
END_VAR
VAR
// ========
// Axis fbs
// ========
_fbAxis : AXIS_REF;
_fbPower : MC_Power;
_fbHome : MC_Home;
_fbMoveAbsolute : MC_MoveAbsolute;
_fbMoveRelative : MC_MoveRelative;
_fbMoveVelocity : MC_MoveVelocity;
_fbHalt : MC_Halt;
_fbReset : MC_Reset;
// ======================
// Axis fbs control flags
// ======================
_xEnable : BOOL;
_xStartHomeing : BOOL;
_xStartMoveAbsolute : BOOL;
_xStartMoveRelative : BOOL;
_xStartMoveVelocity : BOOL;
_xHalt : BOOL;
_xReset : BOOL;
// =====================
// Sequence control data
// =====================
_xExecuteHoming : BOOL;
_xExecuteMoveAbs : BOOL;
_xExecuteMoveRel : BOOL;
_xExecuteMoveVelocity : BOOL;
_xExecuteHalt : BOOL;
// =========================
// Internal helper variables
// =========================
_lrTargetPosition : LREAL;
_lrRelativeDistance : LREAL;
_lrHomingPos : LREAL;
_eHomingMode : MC_HomingMode := MC_HomingMode.MC_DefaultHoming;
_xCalibrationCam : BOOL;
_eMoveVelDirection : MC_Direction;
_eState : E_AXIS_PTP_STATE;
// =============
// Ouput buffers
// =============
_xBusy : BOOL;
_xError : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Call axis interface
_fbAxis.ReadStatus();
IF xInvertCalibrationCam THEN
_xCalibrationCam := NOT xCalibrationCam;
ELSE
_xCalibrationCam := xCalibrationCam;
END_IF
// =================
// Call axis classes
// =================
_fbPower(
Axis:= _fbAxis,
Enable:= _xEnable,
Enable_Positive:= xEnablePositive,
Enable_Negative:= xEnableNegative,
Override:= rOverride);
IF _fbPower.Error THEN
_xError := TRUE;
END_IF
_fbHome(
Axis:= _fbAxis,
Execute:= _xStartHomeing,
Position:= _lrHomingPos,
HomingMode:= _eHomingMode,
bCalibrationCam:= _xCalibrationCam);
IF _fbHome.Error THEN
_xError := TRUE;
END_IF
_fbReset(
Axis:= _fbAxis,
Execute:= _xReset);
IF _fbReset.Error THEN
_xError := TRUE;
END_IF
_fbMoveAbsolute(
Axis:= _fbAxis,
Execute:= _xStartMoveAbsolute,
Position:= _lrTargetPosition,
Velocity:= lrVelocity,
Acceleration:= 0,
Deceleration:= 0,
Jerk:= 0);
IF _fbMoveAbsolute.Error THEN
_xError := TRUE;
END_IF
_fbMoveRelative(
Axis:= _fbAxis,
Execute:= _xStartMoveRelative,
Distance:= _lrRelativeDistance,
Velocity:= lrVelocity,
Acceleration:= 0,
Deceleration:= 0,
Jerk:= 0);
IF _fbMoveRelative.Error THEN
_xError := TRUE;
END_IF
_fbMoveVelocity(
Axis:= _fbAxis,
Execute:= _xStartMoveVelocity,
Velocity:= lrVelocity,
Acceleration:= 0,
Deceleration:= 0,
Jerk:= 0,
Direction:= _eMoveVelDirection);
IF _fbMoveVelocity.Error THEN
_xError := TRUE;
END_IF
_fbHalt(
Axis:= _fbAxis,
Execute:= _xHalt,
Deceleration:= 0,
BufferMode := MC_BufferMode.MC_Aborting,
Jerk:= 0);
IF _fbHalt.Error THEN
_xError := TRUE;
END_IF
// ====================
// Handle state machine
// ====================
CASE _eState OF
E_AXIS_PTP_STATE.OFF:
IF xEnable THEN
_xEnable := TRUE;
_xBusy := TRUE;
_eState := E_AXIS_PTP_STATE.WAIT_FOR_ENABLE;
END_IF
IF _xError THEN
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ERROR;
END_IF
E_AXIS_PTP_STATE.WAIT_FOR_ENABLE:
IF _fbPower.Status AND (NOT _xError) THEN
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ENABLED;
END_IF
IF _xError THEN
_xEnable := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ERROR;
END_IF
E_AXIS_PTP_STATE.ENABLED:
IF _xExecuteMoveAbs THEN
_xExecuteMoveAbs := FALSE;
_xBusy := TRUE;
_xStartMoveAbsolute := TRUE;
_eState := E_AXIS_PTP_STATE.MOVING_ABSOLUTE;
END_IF
IF _xExecuteMoveRel THEN
_xExecuteMoveRel := FALSE;
_xBusy := TRUE;
_xStartMoveRelative := TRUE;
_eState := E_AXIS_PTP_STATE.MOVING_RELATIVE;
END_IF
IF _xExecuteHoming THEN
_xExecuteHoming := FALSE;
_xStartHomeing := TRUE;
_xBusy := TRUE;
_eState := E_AXIS_PTP_STATE.HOMING;
END_IF
IF _xExecuteMoveVelocity THEN
_xExecuteMoveVelocity := FALSE;
_xStartMoveVelocity := TRUE;
_xBusy := TRUE;
_eState := E_AXIS_PTP_STATE.MOVING_VELOCITY;
END_IF
IF (NOT xEnable) AND (NOT _xError) THEN
_xEnable := FALSE;
_xBusy := TRUE;
_eState := E_AXIS_PTP_STATE.WAIT_FOR_DISABLE;
END_IF
IF _xError THEN
_xEnable := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ERROR;
END_IF
E_AXIS_PTP_STATE.HOMING:
IF (NOT _fbHome.Busy) AND (NOT _xError) THEN
_xStartHomeing := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ENABLED;
END_IF
IF _xExecuteHalt THEN
_xExecuteHalt := FALSE;
_xStartHomeing := FALSE;
_xHalt := TRUE;
_eState := E_AXIS_PTP_STATE.HALTING;
END_IF
IF _xError THEN
_xStartHomeing := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ERROR;
END_IF
E_AXIS_PTP_STATE.MOVING_ABSOLUTE:
IF (NOT _fbMoveAbsolute.Busy) AND (NOT _xError) THEN
_xStartMoveAbsolute := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ENABLED;
END_IF
IF _xExecuteHalt THEN
_xExecuteHalt := FALSE;
_xStartMoveAbsolute := FALSE;
_xHalt := TRUE;
_eState := E_AXIS_PTP_STATE.HALTING;
END_IF
IF _xError THEN
_xStartMoveAbsolute := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ERROR;
END_IF
E_AXIS_PTP_STATE.MOVING_RELATIVE:
IF (NOT _fbMoveRelative.Busy) AND (NOT _xError) THEN
_xStartMoveRelative := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ENABLED;
END_IF
IF _xExecuteHalt THEN
_xExecuteHalt := FALSE;
_xStartMoveAbsolute := FALSE;
_xHalt := TRUE;
_eState := E_AXIS_PTP_STATE.HALTING;
END_IF
IF _xError THEN
_xStartMoveRelative := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ERROR;
END_IF
E_AXIS_PTP_STATE.MOVING_VELOCITY:
IF _fbMoveVelocity.Error THEN
_xBusy := FALSE;
_xStartMoveVelocity := FALSE;
_eState := E_AXIS_PTP_STATE.ERROR;
END_IF
E_AXIS_PTP_STATE.HALTING:
IF (NOT _fbHalt.Busy) AND (NOT _xError) THEN
_xHalt := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ENABLED;
END_IF
IF _xError THEN
_xHalt := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ERROR;
END_IF
E_AXIS_PTP_STATE.WAIT_FOR_DISABLE:
IF (NOT _fbPower.Status) AND (NOT _xError) THEN
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.OFF;
END_IF
IF _xError THEN
_xEnable := FALSE;
_xBusy := FALSE;
_eState := E_AXIS_PTP_STATE.ERROR;
END_IF
E_AXIS_PTP_STATE.ERROR:
IF xConfirmAlarms THEN
_xBusy := FALSE;
_xReset := TRUE;
_xError := FALSE;
_eState := E_AXIS_PTP_STATE.RESET;
END_IF
E_AXIS_PTP_STATE.RESET:
IF _fbReset.Done THEN
_xReset := FALSE;
_xError := FALSE;
_eState := E_AXIS_PTP_STATE.OFF;
END_IF
ELSE
_eState := E_AXIS_PTP_STATE.ERROR;
_xError := TRUE;
END_CASE
// Copy internal buffers to outputs
xEnabled := _fbPower.Status;
xHomed := _fbAxis.Status.Homed;
lrActPosition := _fbAxis.NcToPlc.ActPos;
xIsStopped := _fbAxis.Status.StandStill OR _fbAxis.Status.Disabled;
xBusy := _xBusy;
xError := _xError;]]></ST>
</Implementation>
<Method Name="M_Halt" Id="{f6e3b049-4121-4299-b0f5-55178ecb35c3}">
<Declaration><![CDATA[METHOD M_Halt
VAR_OUTPUT
eResultCode : E_SequenceResultCode;
eFailureCode : E_SequenceFailureCode;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xBusy THEN
_xExecuteHalt := TRUE;
eResultCode := E_SequenceResultCode.EXECUTING;
eFailureCode := E_SequenceFailureCode.NONE;
ELSE
eResultCode := E_SequenceResultCode.DONE;
eFailureCode := E_SequenceFailureCode.NONE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Homing" Id="{816a1a43-38da-49f0-b902-c1027a6ba127}">
<Declaration><![CDATA[METHOD M_Homing
VAR_INPUT
lrHomingPosition : LREAL;
eHomingMode : MC_HomingMode := MC_HomingMode.MC_DefaultHoming;
END_VAR
VAR_OUTPUT
eResultCode : E_SequenceResultCode;
eFailureCode : E_SequenceFailureCode;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN
_xBusy := TRUE;
_lrHomingPos := lrHomingPosition;
_eHomingMode := eHomingMode;
_xExecuteHoming := TRUE;
eResultCode := E_SequenceResultCode.EXECUTING;
eFailureCode := E_SequenceFailureCode.NONE;
ELSE
eResultCode := E_SequenceResultCode.FAILED;
eFailureCode := E_SequenceFailureCode.OTHER;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_MoveAbs" Id="{f67a4861-cdb0-4dd2-93c8-1ae9dbc9a9a6}">
<Declaration><![CDATA[METHOD M_MoveAbs
VAR_INPUT
lrTargetPos : LREAL;
END_VAR
VAR_OUTPUT
eResultCode : E_SequenceResultCode;
eFailureCode : E_SequenceFailureCode;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN
_xBusy := TRUE;
_lrTargetPosition := lrTargetPos;
_xExecuteMoveAbs := TRUE;
eResultCode := E_SequenceResultCode.EXECUTING;
eFailureCode := E_SequenceFailureCode.NONE;
ELSE
eResultCode := E_SequenceResultCode.FAILED;
eFailureCode := E_SequenceFailureCode.OTHER;
END_IF
]]></ST>
</Implementation>
</Method>
<Method Name="M_MoveRel" Id="{51e5fe82-5e25-4de0-84c7-b4d6560c312f}">
<Declaration><![CDATA[METHOD M_MoveRel
VAR_INPUT
lrRelDist : LREAL;
END_VAR
VAR_OUTPUT
eResultCode : E_SequenceResultCode;
eFailureCode : E_SequenceFailureCode;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN
_xBusy := TRUE;
_lrRelativeDistance := lrRelDist;
_xExecuteMoveRel:= TRUE;
eResultCode := E_SequenceResultCode.EXECUTING;
eFailureCode := E_SequenceFailureCode.NONE;
ELSE
eResultCode := E_SequenceResultCode.FAILED;
eFailureCode := E_SequenceFailureCode.OTHER;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_MoveVelocity" Id="{fd4ad471-f522-45f2-a138-ebe509907cf6}">
<Declaration><![CDATA[METHOD M_MoveVelocity
VAR_INPUT
eDirection : MC_Direction := MC_Direction.MC_Positive_Direction;
END_VAR
VAR_OUTPUT
eResultCode : E_SequenceResultCode;
eFailureCode : E_SequenceFailureCode;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF (NOT _xBusy) AND _fbPower.Status THEN
_xBusy := TRUE;
_xExecuteMoveVelocity := TRUE;
_eMoveVelDirection := eDirection;
eResultCode := E_SequenceResultCode.EXECUTING;
eFailureCode := E_SequenceFailureCode.NONE;
ELSE
eResultCode := E_SequenceResultCode.FAILED;
eFailureCode := E_SequenceFailureCode.OTHER;
END_IF
]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -82,8 +82,6 @@ VAR
_sTmp : STRING; _sTmp : STRING;
_sLeft : STRING; _sLeft : STRING;
_sRight : STRING; _sRight : STRING;
_udiI : UDINT;
_udiPosition : UDINT;
END_VAR]]></Declaration> END_VAR]]></Declaration>
<Implementation> <Implementation>
<ST><![CDATA[// Edit source info name, so that we get the parent as a source <ST><![CDATA[// Edit source info name, so that we get the parent as a source