Started fixes for HMI

This commit is contained in:
2026-03-06 08:39:54 +01:00
parent 64f561b0c5
commit bcff5a1132
16 changed files with 899 additions and 270 deletions

View File

@@ -17,6 +17,7 @@ VAR
_fbCoolplate : FB_Coolplate;
_fbHVTesterHot : FB_HVTester;
_fbHVTesterCold : FB_HVTester;
//_fbInput : FB_Input;
//_fbNOK : FB_NOK;
//_fbTrayFeederOutput : FB_TrayFeeder(sIPAddr := '192.168.1.11', udiPort := 5000);
@@ -26,7 +27,6 @@ VAR
// =======================
_xReleaseAlarms : BOOL;
_xConfirmAlarms : BOOL;
_stRobotCmd : ST_PMLc;
_stRobotStatus : ST_PMLs;
_stRobotAdmin : ST_PMLa;
@@ -35,14 +35,6 @@ VAR
stCamResult AT %I* : ST_TrayFeederCamPosData;
_rtStopRobotFromSafety : R_TRIG;
// commands
_xClear : BOOL;
_xReset : BOOL;
_xStart : BOOL;
_xHold : BOOL;
_xUnhold : BOOL;
_xStop : BOOL;
_xStartCycle : BOOL;
_xStartTrigger : BOOL;
@@ -56,36 +48,6 @@ END_VAR
<ST><![CDATA[// Data from safety
_xReleaseAlarms := PRG_Safety.xEStopOk;
IF _xClear THEN
_xClear := FALSE;
_fbRobot.M_CmdClear();
END_IF
IF _xReset THEN
_xReset := FALSE;
_fbRobot.M_CmdReset();
END_IF
IF _xStart THEN
_xStart := FALSE;
_fbRobot.M_CmdStart();
END_IF
IF _xHold THEN
_xHold := FALSE;
_fbRobot.M_CmdHold();
END_IF
IF _xUnhold THEN
_xUnhold := FALSE;
_fbRobot.M_CmdUnhold();
END_IF
IF _xStop THEN
_xStop := FALSE;
_fbRobot.M_CmdStop();
END_IF
_rtStopRobotFromSafety(CLK := PRG_Safety.xStopRobot);
IF _rtStopRobotFromSafety.Q THEN
_stRobotCmd.eCntrlCmd := E_PackMLCmd.STOP;
@@ -100,7 +62,7 @@ _fbRobot(
stJobParams := _stRobotJobParams,
stUnitFeedbacks := _stUnitFeedbacks,
xReleaseAlarms:= _xReleaseAlarms,
xConfirmAlarms:= GVL_SCADA.xErrAck,
xConfirmAlarms:= GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest,
stStatus => _stRobotStatus,
stAdmin => _stRobotAdmin,
stHMIInterface := GVL_SCADA.stMachine.stKukaRobot);
@@ -117,42 +79,40 @@ _fbEtcher1(
xOpenDoor:= GVL_SCADA.xOpenAllChambers,
xOpenChuckClamp := GVL_SCADA.xOpenChuckClampEtcher1,
xReleaseAlarms := _xReleaseAlarms,
xConfirmAlarms := GVL_SCADA.xErrAck,
xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest,
stHMIInterface := GVL_SCADA.stMachine.stEtcher1);
_fbEtcher2(
xOpenDoor:= GVL_SCADA.xOpenAllChambers,
xOpenChuckClamp := GVL_SCADA.xOpenChuckClampEtcher2,
xReleaseAlarms := _xReleaseAlarms,
xConfirmAlarms := GVL_SCADA.xErrAck,
xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest,
stHMIInterface := GVL_SCADA.stMachine.stEtcher2);
_fbTrayFeederInput(
stCommand:= ,
xReleaseAlarms := _xReleaseAlarms,
xConfirmAlarms := GVL_SCADA.xErrAck,
stStatus=> GVL_SCADA.stTrayFeederInputState,
stAdmin=> GVL_SCADA.stTRayFeederInputAdmin,
xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest,
stHMIInterface := GVL_SCADA.stMachine.stTrayFeederIn);
_fbTrayFeederInput(
stCommand:= ,
xReleaseAlarms := _xReleaseAlarms,
xConfirmAlarms := GVL_SCADA.xErrAck,
stStatus=> GVL_SCADA.stTrayFeederInputState,
stAdmin=> GVL_SCADA.stTRayFeederInputAdmin,
stHMIInterface := GVL_SCADA.stMachine.stTrayFeederOut);
// _fbTrayFeederOut(
// stCommand:= ,
// xReleaseAlarms := _xReleaseAlarms,
// xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest,
// stStatus=> GVL_SCADA.stTrayFeederInputState,
// stAdmin=> GVL_SCADA.stTRayFeederInputAdmin,
// stHMIInterface := GVL_SCADA.stMachine.stTrayFeederOut);
_fbHotplate(stHMIInterface := GVL_SCADA.stMachine.stHotplate);
_fbCoolplate(stHMIInterface := GVL_SCADA.stMachine.stCoolplate);
_fbAligner(stCommand:= , stStatus=> , stAdmin=> , xConfirmAlarms:= GVL_SCADA.xErrAck, stHMIInterface := GVL_SCADA.stMachine.stAligner);
_fbAligner(stCommand:= , stStatus=> , stAdmin=> , xConfirmAlarms:= GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, stHMIInterface := GVL_SCADA.stMachine.stAligner);
// Call safety program
PRG_Safety(
xConfirmAlarms := GVL_SCADA.xErrAck,
xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest,
xRobotStopped := (_stRobotStatus.eStateCurrent <> E_PackMLState.EXECUTE));
// Handle robot cmds
@@ -249,11 +209,7 @@ END_IF
xTriggerCamera := _tofTriggerTime.Q;
// Reset alarm reset request
GVL_SCADA.xErrAck := FALSE;
IF _xConfirmAlarms THEN
_xConfirmAlarms := FALSE;
END_IF]]></ST>
GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest := FALSE;]]></ST>
</Implementation>
<Method Name="M_HandleRobotCmd" Id="{14934aaa-b667-4ddb-915d-1d84e8eb799d}">
<Declaration><![CDATA[METHOD PRIVATE M_HandleRobotCmd

View File

@@ -79,6 +79,9 @@ VAR
_fbRobot : FB_Mecademics;
xDisableVacuum AT %Q* : BOOL;
// Internals
_xOpenChuckClamp : BOOL;
END_VAR
]]></Declaration>
<Implementation>
@@ -100,8 +103,11 @@ ELSE
_tpEjectChuck(IN := FALSE);
END_IF
// Todo bessere implementierung finden
_xOpenChuckClamp := xOpenChuckClamp OR stHMIInterface.stChuckUnlockCmd.xRequest;
_fbUnlockLeft(
xAutomaticOpen:= xOpenChuckClamp,
xAutomaticOpen:= _xOpenChuckClamp,
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stValveUnlockLeftCfg,
xReleaseManualMode:= xReleaseManualMode,
@@ -109,7 +115,7 @@ _fbUnlockLeft(
stHMIInterface:= stHMIInterface.stChuckUnlockLeft);
_fbUnlockRight(
xAutomaticOpen:= xOpenChuckClamp,
xAutomaticOpen:= _xOpenChuckClamp,
xReleaseErrors:= xReleaseAlarms,
stValveConfig:= _stValveUnlockRightCfg,
xReleaseManualMode:= xReleaseManualMode,

View File

@@ -26,8 +26,7 @@ VAR
_xDone : BOOL;
_xError : BOOL;
_iDS : INT;
END_VAR
]]></Declaration>
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[SUPER^(stPackMLHMIInterface := stPackMLHMIInterface);
@@ -257,6 +256,7 @@ END_VAR]]></Declaration>
M_CmdAbort();
END_IF
// Set wrf
32:
M_ExecuteCmd(E_Meca_Cmds.SET_WRF, 163.5, -34.79, 465, -180, 0, 180, xDone => xExecDone, xError => xExecError);
@@ -271,7 +271,8 @@ END_VAR]]></Declaration>
// Set trf
33:
M_ExecuteCmd(E_Meca_Cmds.SET_TRF, 0, 0, 91, 0, 180, 90, xDone => xExecDone, xError => xExecError);
// SetTrf(32.38 , 27.52, 91, 0, 180, -90)
M_ExecuteCmd(E_Meca_Cmds.SET_TRF, 32.38, 27.52, 91, 0, 180, -90, xDone => xExecDone, xError => xExecError);
IF xExecDone THEN
_iSSM := 34;

View File

@@ -4,15 +4,31 @@
<Declaration><![CDATA[FUNCTION_BLOCK FB_Input EXTENDS FB_PackMLGeneric
VAR_INPUT
stRecipe : ST_Input_Recipe;
xReleaseAlarms : BOOL;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
END_VAR
VAR_IN_OUT
stHMIInterface : ST_HMI_Input;
END_VAR
VAR
_fbTrayFeeder : FB_TrayFeeder(sIPAddr := '192.168.1.10', udiPort := 5000);
_fbCamera : FB_KeyenceVS;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
<ST><![CDATA[// Call components
// ===============
// _fbTrayFeeder(
// stHMIInterface:= stHMIInterface.stTrayFeeder,
// xReleaseAlarms:= xReleaseAlarms,
// xConfirmAlarms:= xConfirmAlarms);
//
// _fbCamera(
// xReleaseAlarms:= xReleaseAlarms,
// xConfirmAlarms:= xConfirmAlarms);]]></ST>
</Implementation>
<Method Name="FB_init" Id="{bbceb3b3-f8a1-472a-b29a-eebb04390aa6}">
<Declaration><![CDATA[//FB_Init ist immer implizit verfügbar und wird primär für die Initialisierung verwendet.

View File

@@ -0,0 +1,388 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_KeyenceVS" Id="{2ea89630-4476-43f8-991b-76955c0d8baf}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_KeyenceVS
VAR_INPUT
xReleaseAlarms : BOOL;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
xBusy : BOOL;
xDone : BOOL;
xError : BOOL;
END_VAR
VAR
// ======
// Inputs
// ======
i_xTriggerRdy AT %I* : BOOL;
i_xTriggerAck AT %I* : BOOL;
i_xResultRdy AT %I* : BOOL;
i_xRunStatus AT %I*: BOOL;
i_xCmdComplete AT %I* : BOOL;
i_xCmdError AT %I* : BOOL;
i_xCmdRdy AT %I* : BOOL;
i_xProgLoadComplete AT %I* : BOOL;
i_xError0State AT %I* : BOOL;
i_xError1State AT %I* : BOOL;
i_udiError0Code AT %I* : UDINT;
i_udiError1Code AT %I* : UDINT;
i_udiPrgNr AT %I* : UDINT;
i_udiTotalCnt AT %I* : UDINT;
i_abyResult128 AT %I* : ARRAY[0..127] OF BYTE;
// =======
// Outputs
// =======
o_xTrigger AT %Q* : BOOL;
o_xResultHandshakeEnable AT %Q* : BOOL;
o_xResultAck AT %Q* : BOOL;
o_xGotoRun AT %Q* : BOOL;
o_xGotoSetting AT %Q* : BOOL;
o_xError0Clear AT %Q* : BOOL;
o_xError1Clear AT %Q* : BOOL;
o_xCmdRequest AT %Q* : BOOL;
o_xPrgLoadExec AT %Q* : BOOL;
o_udiPrgNr AT %Q* : UDINT;
// ======
// Alarms
// ======
_fbError0Alarm : FB_AlarmMessage(stEventEntry := TC_EVENTS.KeyenceVS.Error0, xWithConfirmation := TRUE);
_rtError0 : R_TRIG;
_fbError1Alarm : FB_AlarmMessage(stEventEntry := TC_EVENTS.KeyenceVS.Error1, xWithConfirmation := TRUE);
_rtError1 : R_TRIG;
// ==============
// Ouputs buffers
// ==============
_xBusy : BOOL;
_xDone : BOOL;
_xError : BOOL;
// =============
// State machine
// =============
// State of state machine
_uiState : UINT;
// Command to start loading a program with defined number
_xLoadProgNr : BOOL;
// Program number to load
_udiProgNrToLoad : UDINT;
// Command to change camera into run mode
_xSwitchToRunMode : BOOL;
// Command to change to config mode
_xSwitchToConfigMode : BOOL;
// Trigger a picture
_xTrigger : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// ==============
// Alarm handling
// ==============
// If error 0 occurs, add error code to alarm message
_rtError0(CLK := i_xError0State);
IF _rtError0.Q THEN
_fbError0Alarm.Arguments.Clear().AddUDInt(i_udiError0Code);
END_IF
_fbError0Alarm(
xActive:= i_xError0State,
xRelease:= xReleaseAlarms,
xAcknowledge:= xConfirmAlarms);
IF _fbError0Alarm.Active THEN
_xError := TRUE;
END_IF
// If error 1 occurs, add error code to alarm message
_rtError1(CLK := i_xError1State);
IF _rtError1.Q THEN
_fbError1Alarm.Arguments.Clear().AddUDInt(i_udiError1Code);
END_IF
_fbError1Alarm(
xActive:= i_xError1State,
xRelease:= xReleaseAlarms,
xAcknowledge:= xConfirmAlarms);
IF _fbError1Alarm.Active THEN
_xError := TRUE;
END_IF
// =============
// State machine
// =============
CASE _uiState OF
// Idle
0:
// Load program number
IF _xLoadProgNr THEN
_xLoadProgNr := FALSE;
_uiState := 10;
END_IF
IF _xSwitchToRunMode THEN
_xSwitchToRunMode := FALSE;
_uiState := 20;
END_IF
IF _xSwitchToConfigMode THEN
_xSwitchToConfigMode := FALSE;
_uiState := 30;
END_IF
IF _xTrigger THEN
_xTrigger := FALSE;
_uiState := 40;
END_IF
// Load program number
10:
o_udiPrgNr := _udiProgNrToLoad;
o_xPrgLoadExec := TRUE;
IF i_xProgLoadComplete THEN
o_xPrgLoadExec := FALSE;
_xDone := TRUE;
_xBusy := FALSE;
_uiState := 0;
END_IF
IF _xError THEN
_uiState := 900;
END_IF
// Switch to run mode
20:
o_xGotoRun := TRUE;
o_xGotoSetting := FALSE;
IF i_xRunStatus THEN
o_xGotoRun := FALSE;
_xDone := TRUE;
_xBusy := FALSE;
_uiState := 0;
END_IF
IF _xError THEN
_uiState := 900;
END_IF
// Switch to config mode
30:
o_xGotoSetting := TRUE;
o_xGotoRun := FALSE;
IF (NOT i_xRunStatus) THEN
o_xGotoRun := FALSE;
_xDone := TRUE;
_xBusy := FALSE;
_uiState := 0;
END_IF
IF _xError THEN
_uiState := 900;
END_IF
// Trigger
40:
o_xTrigger := TRUE;
IF i_xTriggerAck THEN
o_xTrigger := FALSE;
_uiState := 41;
END_IF
IF _xError THEN
_uiState := 900;
END_IF
// Wait for result
41:
IF i_xResultRdy THEN
o_xResultAck := TRUE;
_uiState := 42;
END_IF
IF _xError THEN
_uiState := 900;
END_IF
// Wait for result ack done
42:
IF (NOT i_xResultRdy) THEN
o_xResultAck := FALSE;
_uiState := 0;
END_IF
IF _xError THEN
_uiState := 900;
END_IF
// Error state
900:
_xError := TRUE;
_xDone := FALSE;
_xBusy := FALSE;
_uiState := 901;
// Wait for error ack
901:
IF xConfirmAlarms THEN
_xError := FALSE;
_uiState := 0;
END_IF
END_CASE
// =============================
// Copy output buffers to output
// =============================
xBusy := _xBusy;
xDone := _xDone;
xError := _xError;
]]></ST>
</Implementation>
<Method Name="M_GetResult128" Id="{80736d9c-5f6b-4185-a62e-60e64078b87d}">
<Declaration><![CDATA[// Get result data from 128 Byte input
METHOD M_GetResult128 : BOOL
VAR_INPUT
// Start index in result byte array
uiIdx : UINT;
// Target buffer
pTarget : PVOID;
// Target buffer size
udiSize : UDINT := 0;
// Result of copy
udiResult : UDINT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Check index size
IF (uiIdx < 0)
OR (uiIdx > 127) // Index to big
OR ((uiIdx + udiSize) > 128) // Start index and size will read over the input array bounds
OR udiSize = 0 // No target size given
OR pTarget = 0 // No valid target pointer
THEN
M_GetResult128 := FALSE;
RETURN;
END_IF
// Copy data
udiResult := MEMCPY(destAddr := pTarget, srcAddr := ADR(i_abyResult128[uiIdx]), n := udiSize);
// Check if copy was successful
IF udiResult <> udiSize THEN
M_GetResult128 := FALSE;
ELSE
M_GetResult128 := TRUE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_SetProgramNr" Id="{61381180-0979-4559-a38e-7a94f647a142}">
<Declaration><![CDATA[METHOD M_SetProgramNr : BOOL
VAR_INPUT
udiPrgNr : UDINT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xBusy OR _xError THEN
M_SetProgramNr := FALSE;
RETURN;
END_IF
// Set Prg nr
_udiProgNrToLoad := udiPrgNr;
// Start command
_xLoadProgNr := TRUE;
// Set busy
_xBusy := TRUE;
_xDone := FALSE;
// Report command result
M_SetProgramNr := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="M_SwitchToConfig" Id="{97bb226a-9857-448a-8000-4f7ffa070011}">
<Declaration><![CDATA[METHOD M_SwitchToConfig : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xBusy OR _xError THEN
M_SwitchToConfig := FALSE;
RETURN;
END_IF
// Start command
_xSwitchToConfigMode := TRUE;
// Set busy
_xBusy := TRUE;
_xDone := FALSE;
// Report command result
M_SwitchToConfig := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="M_SwitchToRun" Id="{949f243b-ddfd-4924-8c44-0bc4957e34cf}">
<Declaration><![CDATA[METHOD M_SwitchToRun : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xBusy OR _xError THEN
M_SwitchToRun := FALSE;
RETURN;
END_IF
// Start command
_xSwitchToRunMode := TRUE;
// Set busy
_xBusy := TRUE;
_xDone := FALSE;
// Report command result
M_SwitchToRun := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="M_Trigger" Id="{d463f53a-1fcf-4a61-a95a-507b0a863218}">
<Declaration><![CDATA[METHOD M_Trigger : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xBusy OR _xError OR (NOT i_xTriggerRdy) THEN
M_Trigger := FALSE;
RETURN;
END_IF
// Start command
_xTrigger := TRUE;
// Set busy
_xBusy := TRUE;
_xDone := FALSE;
// Report command result
M_Trigger := TRUE;]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HMI_Input" Id="{a4730084-6aa8-4ec8-a056-5ec2c2cb728b}">
<Declaration><![CDATA[TYPE ST_HMI_Input :
STRUCT
stTrayFeeder : ST_HMI_PackML;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -356,7 +356,7 @@ END_IF
<Declaration><![CDATA[METHOD PROTECTED M_Idle
]]></Declaration>
<Implementation>
<ST><![CDATA[_stJobParams := stJobParams;]]></ST>
<ST><![CDATA[_stJobParams := stHMIInterface.stJobParams;]]></ST>
</Implementation>
</Method>
<Method Name="M_Resetting" Id="{dfe4d36a-80aa-4364-bfd8-6ddd41636d59}" FolderPath="StateMachine\">

View File

@@ -139,7 +139,7 @@ END_VAR]]></Declaration>
IF _tonReconnect.Q THEN
_tonReconnect(IN := FALSE, PT := T#5S);
_xConnect := TRUE;
_iSSM := 35;
_iSSM := 40;
END_IF
35:

View File

@@ -11,8 +11,6 @@ VAR_GLOBAL
// DEBUG - NOT FOR HMI!
// ====================
xErrAck : BOOL;
xOpenAllChambers : BOOL;
xOpenChuckClampEtcher1 : BOOL;

View File

@@ -146,6 +146,12 @@
<Compile Include="01_Stationen\Input\FB_Input.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\Input\FB_KeyenceVS.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\Input\ST_HMI_Input.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\Input\ST_Input_Recipe.TcDUT">
<SubType>Code</SubType>
</Compile>
@@ -480,8 +486,8 @@
<ProjectExtensions>
<PlcProjectOptions>
<XmlArchive>
<Data>
<o xml:space="preserve" t="OptionKey">
<Data>
<o xml:space="preserve" t="OptionKey">
<v n="Name">"&lt;ProjectRoot&gt;"</v>
<d n="SubKeys" t="Hashtable" ckt="String" cvt="OptionKey">
<v>{192FAD59-8248-4824-A8DE-9177C94C195A}</v>
@@ -626,14 +632,14 @@
</d>
<d n="Values" t="Hashtable" />
</o>
</Data>
<TypeList>
<Type n="Boolean">System.Boolean</Type>
<Type n="Hashtable">System.Collections.Hashtable</Type>
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
<Type n="String">System.String</Type>
</TypeList>
</XmlArchive>
</Data>
<TypeList>
<Type n="Boolean">System.Boolean</Type>
<Type n="Hashtable">System.Collections.Hashtable</Type>
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
<Type n="String">System.String</Type>
</TypeList>
</XmlArchive>
</PlcProjectOptions>
</ProjectExtensions>
</Project>

File diff suppressed because one or more lines are too long