Fixed aligner and started main state machine

- Fixed datatype for received offsets
- Added HMI Interface for Hot and Coolplate
This commit is contained in:
2026-02-06 14:39:41 +01:00
parent c1850f780b
commit bdaaf1fe9f
13 changed files with 295 additions and 4599 deletions

View File

@@ -115,7 +115,9 @@ _fbTrayFeederInput(
stStatus=> GVL_SCADA.stTrayFeederInputState, stStatus=> GVL_SCADA.stTrayFeederInputState,
stAdmin=> GVL_SCADA.stTRayFeederInputAdmin); stAdmin=> GVL_SCADA.stTRayFeederInputAdmin);
_fbHeatCoolPlates(xConfirmAlarms:= GVL_SCADA.xErrAck); _fbHeatCoolPlates(
stHMIInterface := GVL_SCADA.stHCPlatesHMIInterface,
xConfirmAlarms:= GVL_SCADA.xErrAck);
_fbAligner(stCommand:= , stStatus=> , stAdmin=> , xConfirmAlarms:= GVL_SCADA.xErrAck); _fbAligner(stCommand:= , stStatus=> , stAdmin=> , xConfirmAlarms:= GVL_SCADA.xErrAck);
@@ -313,6 +315,70 @@ CASE _iState OF
_fbRobot.xAckPLCCmd := TRUE; _fbRobot.xAckPLCCmd := TRUE;
_iState := 0; _iState := 0;
END_IF END_IF
E_KukaRobot_JobNumerPLC.UNLOCK_CHUCK_ETCHER1:
_fbEtcher1.xOpenChuckClamp := TRUE;
// Check FOR timeout
_tonTimeout(IN := TRUE, PT := T#10S);
IF _tonTimeout.Q THEN
_fbRobot.xAckPLCCmd := TRUE;
_fbRobot.xPLCJobFailed := TRUE;
_iState := 0;
END_IF
IF _fbEtcher1.xChuckClampOpen THEN
_fbRobot.xAckPLCCmd := TRUE;
_iState := 0;
END_IF
E_KukaRobot_JobNumerPLC.LOCK_CHUCK_ETCHER1:
_fbEtcher1.xOpenChuckClamp := FALSE;
// Check FOR timeout
_tonTimeout(IN := TRUE, PT := T#10S);
IF _tonTimeout.Q THEN
_fbRobot.xAckPLCCmd := TRUE;
_fbRobot.xPLCJobFailed := TRUE;
_iState := 0;
END_IF
IF (NOT _fbEtcher1.xChuckClampOpen) THEN
_fbRobot.xAckPLCCmd := TRUE;
_iState := 0;
END_IF
E_KukaRobot_JobNumerPLC.UNLOCK_CHUCK_ETCHER2:
_fbEtcher2.xOpenChuckClamp := TRUE;
// Check FOR timeout
_tonTimeout(IN := TRUE, PT := T#10S);
IF _tonTimeout.Q THEN
_fbRobot.xAckPLCCmd := TRUE;
_fbRobot.xPLCJobFailed := TRUE;
_iState := 0;
END_IF
IF _fbEtcher2.xChuckClampOpen THEN
_fbRobot.xAckPLCCmd := TRUE;
_iState := 0;
END_IF
E_KukaRobot_JobNumerPLC.LOCK_CHUCK_ETCHER2:
_fbEtcher2.xOpenChuckClamp := FALSE;
// Check FOR timeout
_tonTimeout(IN := TRUE, PT := T#10S);
IF _tonTimeout.Q THEN
_fbRobot.xAckPLCCmd := TRUE;
_fbRobot.xPLCJobFailed := TRUE;
_iState := 0;
END_IF
IF (NOT _fbEtcher2.xChuckClampOpen) THEN
_fbRobot.xAckPLCCmd := TRUE;
_iState := 0;
END_IF
ELSE ELSE
_iState := 90; _iState := 90;

View File

@@ -19,13 +19,11 @@ VAR
_xDisableVacuum AT %Q* : BOOL := TRUE; _xDisableVacuum AT %Q* : BOOL := TRUE;
_xVacuumOk AT %I* : BOOL; _xVacuumOk AT %I* : BOOL;
_udiXOffset AT %I* : UDINT; _udiXOffset AT %I* : DINT;
_udiYOffset AT %I* : UDINT; _udiYOffset AT %I* : DINT;
_rXPosToGo : REAL; _rXPosToGo : REAL;
_rYPosToGo : REAL; _rYPosToGo : REAL;
_iState : INT := 0;
END_VAR END_VAR
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>
@@ -39,13 +37,7 @@ END_VAR
lrAcceleration:= 0, lrAcceleration:= 0,
lrDecelleration:= 0, lrDecelleration:= 0,
lrJerk:= 0, lrJerk:= 0,
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms);
xEnabled=> ,
xHomed=> ,
lrActPosition=> ,
xIsStopped=> ,
xBusy=> ,
xError=> );
_fbYAxis( _fbYAxis(
xEnable:= TRUE, xEnable:= TRUE,
@@ -57,20 +49,14 @@ _fbYAxis(
lrAcceleration:= 0, lrAcceleration:= 0,
lrDecelleration:= 0, lrDecelleration:= 0,
lrJerk:= 0, lrJerk:= 0,
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms);
xEnabled=> ,
xHomed=> ,
lrActPosition=> ,
xIsStopped=> ,
xBusy=> ,
xError=> );
// Drei mal ausführen damit die Position genau ist // Drei mal ausführen damit die Position genau ist
IF xAlign THEN IF xAlign THEN
xAlign := FALSE; xAlign := FALSE;
_rXPosToGo := UDINT_TO_REAL(_udiXOffset) * -0.001; _rXPosToGo := DINT_TO_REAL(_udiXOffset) * -0.001;
_rYPosToGo := ((UDINT_TO_REAL(_udiYOffset) * 0.001) - 37.5) * -1; _rYPosToGo := ((DINT_TO_REAL(_udiYOffset) * 0.001) - 37.5) * -1;
IF (ABS(_rXPosToGo) < 10.0) AND (ABS(_rYPosToGo) < 10.0) AND (NOT _fbXAxis.xError) AND (NOT _fbYAxis.xError) THEN IF (ABS(_rXPosToGo) < 10.0) AND (ABS(_rYPosToGo) < 10.0) AND (NOT _fbXAxis.xError) AND (NOT _fbYAxis.xError) THEN
_fbXAxis.M_MoveRel(lrRelDist := _rXPosToGo); _fbXAxis.M_MoveRel(lrRelDist := _rXPosToGo);

View File

@@ -86,7 +86,7 @@ _fbValveDoor(
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stDoorHMIInterface); stHMIInterface:= stHMIInterface.stDoorHMIInterface);
xDoorOpen := _fbValveDoor.IsOpen;
// Chuck // Chuck
_rtEjectChuckCmd(CLK := xEjectChuck); _rtEjectChuckCmd(CLK := xEjectChuck);
@@ -134,6 +134,8 @@ _xDisableVacuum := (NOT xEnableVacuum);
SUPER^(); SUPER^();
// Copy internal signals to output // Copy internal signals to output
xDoorOpen := _fbValveDoor.IsOpen;
xChuckClampOpen := _fbUnlockLeft.IsOpen AND _fbUnlockRight.IsOpen;
xVacuumEnabled := _xVacuumOk;]]></ST> xVacuumEnabled := _xVacuumOk;]]></ST>
</Implementation> </Implementation>
<Method Name="FB_Init" Id="{afcda70c-3e52-4a32-9ca9-670a6b854f24}"> <Method Name="FB_Init" Id="{afcda70c-3e52-4a32-9ca9-670a6b854f24}">

View File

@@ -7,6 +7,9 @@ VAR_INPUT
END_VAR END_VAR
VAR_OUTPUT VAR_OUTPUT
END_VAR END_VAR
VAR_IN_OUT
stHMIInterface : ST_HCPlateHMIInterface;
END_VAR
VAR VAR
// Card inputs // Card inputs
_stStatus AT %I* : ST_SerialStatus; _stStatus AT %I* : ST_SerialStatus;
@@ -31,7 +34,8 @@ END_VAR
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>
<ST><![CDATA[// Clamp temperature settings <ST><![CDATA[// Clamp temperature settings
_rTempSetpoint := rTempSetpoint; // Currently only controlled throught hmi interface
_rTempSetpoint := stHMIInterface.rSetpoint;
IF _rTempSetpoint > 60.0 THEN IF _rTempSetpoint > 60.0 THEN
_rTempSetpoint := 60.0; _rTempSetpoint := 60.0;
@@ -62,8 +66,8 @@ IF _stStatus.bTransmitAccepted THEN
END_IF END_IF
// Debug test // Debug test
IF _xTempTest THEN IF stHMIInterface.xEnable THEN
_xTempTest := FALSE; stHMIInterface.xEnable := FALSE;
M_SetTemp(rTemp := _rTempSetpoint); M_SetTemp(rTemp := _rTempSetpoint);
_xSend := TRUE; _xSend := TRUE;
END_IF]]></ST> END_IF]]></ST>

View File

@@ -7,6 +7,9 @@ VAR_INPUT
END_VAR END_VAR
VAR_OUTPUT VAR_OUTPUT
END_VAR END_VAR
VAR_IN_OUT
stHMIInterface : ST_HCStationHMIInterface;
END_VAR
VAR VAR
_fbHeatingPlate : FB_HotPlate; _fbHeatingPlate : FB_HotPlate;
@@ -21,11 +24,12 @@ END_VAR
<ST><![CDATA[_fbHeatingPlate( <ST><![CDATA[_fbHeatingPlate(
xEnable:= _xEnableHotplate, xEnable:= _xEnableHotplate,
rTargetTemp:= _rTargetTemp, rTargetTemp:= _rTargetTemp,
stHMIInterface := stHMIInterface.stHotplateHMIInterface,
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms,
uiNextFreeSlot=> , uiNextFreeSlot=> ,
uiNextReadySlot=> ); uiNextReadySlot=> );
_fbCoolPlate();]]></ST> _fbCoolPlate(stHMIInterface := stHMIInterface.stCoolplateHMIInterface);]]></ST>
</Implementation> </Implementation>
</POU> </POU>
</TcPlcObject> </TcPlcObject>

View File

@@ -13,6 +13,9 @@ VAR_OUTPUT
uiNextFreeSlot : UINT; uiNextFreeSlot : UINT;
uiNextReadySlot : UINT; uiNextReadySlot : UINT;
END_VAR END_VAR
VAR_IN_OUT
stHMIInterface : ST_HCPlateHMIInterface;
END_VAR
VAR VAR
_xEnableHotplate AT %Q* : BOOL; _xEnableHotplate AT %Q* : BOOL;
@@ -53,13 +56,23 @@ _fbTempSensor(
xReleaseHardwareErrors:= TRUE, xReleaseHardwareErrors:= TRUE,
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> ); stHMIInterface=> );
// Clamp HMI Setpoint
IF stHMIInterface.rSetpoint > 140.0 THEN
stHMIInterface.rSetpoint := 140;
END_IF
IF stHMIInterface.rSetpoint < 0.0 THEN
stHMIInterface.rSetpoint := 0.0;
END_IF
// For now get setpoint from HMI interface
_fbPITempControl( _fbPITempControl(
rSP:= rTargetTemp, rSP:= stHMIInterface.rSetpoint,
rPV:= _fbTempSensor.rScaledValue, rPV:= _fbTempSensor.rScaledValue,
rKp:= 2, rKp:= 6,
rTn:= 0, rTn:= 0,
xEnable:= xEnable, xEnable:= stHMIInterface.xEnable,
xSaturatedUpper:= _xSaturatedUpper, xSaturatedUpper:= _xSaturatedUpper,
xSaturatedLower:= _xSaturatedLower, xSaturatedLower:= _xSaturatedLower,
rMV=> _rMV); rMV=> _rMV);
@@ -82,15 +95,9 @@ _fbPWMOut(
rPWM:= _rMV, rPWM:= _rMV,
timPeriod:= T#10S, timPeriod:= T#10S,
xOutput=> _xEnableHotplate); xOutput=> _xEnableHotplate);
// Control temperature with two point controller // Output HMI Interface
// IF _fbTempSensor.rScaledValue < (rTargetTemp - rDeadBand) THEN stHMIInterface.rPV := _fbTempSensor.rScaledValue;
// _xEnableHotplate := TRUE;
// END_IF
//
// IF _fbTempSensor.rScaledValue >= (rTargetTemp) THEN
// _xEnableHotplate := FALSE;
// END_IF
]]></ST> ]]></ST>
</Implementation> </Implementation>
<Method Name="M_AddItem" Id="{9707459a-6558-487c-b730-c9dc92d598ed}"> <Method Name="M_AddItem" Id="{9707459a-6558-487c-b730-c9dc92d598ed}">

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HCPlateHMIInterface" Id="{cc97f396-14fe-4cf1-8a0f-254b86749233}">
<Declaration><![CDATA[TYPE ST_HCPlateHMIInterface :
STRUCT
xEnable : BOOL;
rSetpoint : REAL;
rPV : REAL;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HCStationHMIInterface" Id="{2459de16-cb2e-4745-be67-cc251c8b91cf}">
<Declaration><![CDATA[TYPE ST_HCStationHMIInterface :
STRUCT
stHotplateHMIInterface : ST_HCPlateHMIInterface;
stCoolplateHMIInterface : ST_HCPlateHMIInterface;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -13,6 +13,9 @@ VAR_GLOBAL
// Unit states // Unit states
stTrayFeederInputState : ST_PMLs; stTrayFeederInputState : ST_PMLs;
stTRayFeederInputAdmin : ST_PMLa; stTRayFeederInputAdmin : ST_PMLa;
// HMI Interface
stHCPlatesHMIInterface : ST_HCStationHMIInterface;
END_VAR]]></Declaration> END_VAR]]></Declaration>
</GVL> </GVL>
</TcPlcObject> </TcPlcObject>

View File

@@ -70,6 +70,12 @@
<SubType>Code</SubType> <SubType>Code</SubType>
<LinkAlways>true</LinkAlways> <LinkAlways>true</LinkAlways>
</Compile> </Compile>
<Compile Include="01_Stationen\HeatCoolPlates\ST_HCPlateHMIInterface.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\HeatCoolPlates\ST_HCStationHMIInterface.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\HeatCoolPlates\ST_SerialCrl.TcDUT"> <Compile Include="01_Stationen\HeatCoolPlates\ST_SerialCrl.TcDUT">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
@@ -302,8 +308,8 @@
<ProjectExtensions> <ProjectExtensions>
<PlcProjectOptions> <PlcProjectOptions>
<XmlArchive> <XmlArchive>
<Data> <Data>
<o xml:space="preserve" t="OptionKey"> <o xml:space="preserve" t="OptionKey">
<v n="Name">"&lt;ProjectRoot&gt;"</v> <v n="Name">"&lt;ProjectRoot&gt;"</v>
<d n="SubKeys" t="Hashtable" ckt="String" cvt="OptionKey"> <d n="SubKeys" t="Hashtable" ckt="String" cvt="OptionKey">
<v>{192FAD59-8248-4824-A8DE-9177C94C195A}</v> <v>{192FAD59-8248-4824-A8DE-9177C94C195A}</v>
@@ -384,14 +390,14 @@
</d> </d>
<d n="Values" t="Hashtable" /> <d n="Values" t="Hashtable" />
</o> </o>
</Data> </Data>
<TypeList> <TypeList>
<Type n="Boolean">System.Boolean</Type> <Type n="Boolean">System.Boolean</Type>
<Type n="Hashtable">System.Collections.Hashtable</Type> <Type n="Hashtable">System.Collections.Hashtable</Type>
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type> <Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
<Type n="String">System.String</Type> <Type n="String">System.String</Type>
</TypeList> </TypeList>
</XmlArchive> </XmlArchive>
</PlcProjectOptions> </PlcProjectOptions>
</ProjectExtensions> </ProjectExtensions>
</Project> </Project>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -19,6 +19,14 @@
</OwnerB> </OwnerB>
</OwnerA> </OwnerA>
</UnrestoredVarLinks> </UnrestoredVarLinks>
<UnrestoredVarLinks ImportTime="2026-02-05T10:33:22">
<OwnerA Name="InputDst" Prefix="TIPC^PLC^PLC Instance" Type="1">
<OwnerB Name="TIID^Device 1 (EtherCAT)^Box 26 (TM-X5K_CB-NEC20E)">
<Link VarA="PRG_Main._fbAligner._udiXOffset" TypeA="UDINT" InOutA="0" GuidA="{18071995-0000-0000-0000-000000000008}" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data7" RestoreInfo="TypeMismatch" OldTypeA="UDINT" OldGuidA="{18071995-0000-0000-0000-000000000008}" NewTypeA="DINT" NewGuidA="{18071995-0000-0000-0000-000000000009}"/>
<Link VarA="PRG_Main._fbAligner._udiYOffset" TypeA="UDINT" InOutA="0" GuidA="{18071995-0000-0000-0000-000000000008}" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data8" RestoreInfo="TypeMismatch" OldTypeA="UDINT" OldGuidA="{18071995-0000-0000-0000-000000000008}" NewTypeA="DINT" NewGuidA="{18071995-0000-0000-0000-000000000009}"/>
</OwnerB>
</OwnerA>
</UnrestoredVarLinks>
<Contexts> <Contexts>
<Context> <Context>
<Id>0</Id> <Id>0</Id>