Files
infineon_plc/PLC/01_Stationen/TrayFeeder/FB_TrayFeederParser.TcPOU
m.heisig 4e923aa101 Bugfixes in TrayFeeder and Aligner
Aligner
=======
- Fixed Aligner during resetting with library update to 1.3.4
- Added Vacuum valve to HMI

Etcher
======
- Added Vacuum valve to HMI

TrayFeeder
==========
- Fixed a bug in protocoll parsing
- Added automatic reconnect tries to protocoll handler
- Added buttons to hmi interface for tray feeding and unloading
2026-03-13 14:51:58 +01:00

280 lines
6.7 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_TrayFeederParser" Id="{d60acdcf-8e59-48d2-93a2-171510b93e18}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_TrayFeederParser
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
_stStatus : ST_TrayFeederStatus;
END_VAR
VAR CONSTANT
MAX_PARAMS : UINT := 10;
PARAMS_SEP : STRING(1) := ';';
VALUE_SEP : STRING(1) := '=';
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
<Method Name="M_EvenSystParams" Id="{29bd9922-3af8-4120-835a-1d02226f2809}">
<Declaration><![CDATA[METHOD PRIVATE M_EvenSystParams
VAR_INPUT
sParam : STRING(30);
END_VAR
VAR
_sParamName : STRING(15);
_sParamValue : STRING(15);
_xSplitOk : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_xSplitOk := FindAndSplit(
pSeparator := ADR(VALUE_SEP), pSrcString := ADR(sParam),
pLeftString := ADR(_sParamName), nLeftSize := SIZEOF(_sParamName),
pRightString := ADR(_sParamValue), nRightSize := SIZEOF(_sParamValue),
bSearchFromRight := FALSE);
IF _xSplitOk THEN
// Check for parameter names
IF 'Door' = _sParamName THEN
IF 'Opened' = _sParamValue THEN
_stStatus.xDoorOpen := TRUE;
ELSIF 'Closed' = _sParamValue THEN
_stStatus.xDoorOpen := FALSE;
END_IF
END_IF
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_NoteSystParams" Id="{d4055987-9814-4c22-8525-7aafb690c294}">
<Declaration><![CDATA[METHOD PRIVATE M_NoteSystParams
VAR_INPUT
sParam : STRING(30);
END_VAR
VAR
_sParamName : STRING(15);
_sParamValue : STRING(15);
_xSplitOk : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_xSplitOk := FindAndSplit(
pSeparator := ADR(VALUE_SEP), pSrcString := ADR(sParam),
pLeftString := ADR(_sParamName), nLeftSize := SIZEOF(_sParamName),
pRightString := ADR(_sParamValue), nRightSize := SIZEOF(_sParamValue),
bSearchFromRight := FALSE);
IF _xSplitOk THEN
// Check for parameter names
IF 'InpStack' = _sParamName THEN
IF 'Empty' = _sParamValue THEN
_stStatus.eStateInputStack := E_TFInputStackState.EMTPY;
ELSIF 'NoMaga' = _sParamValue THEN
_stStatus.eStateInputStack := E_TFInputStackState.NO_MAGAZINE;
ELSIF 'AlmEmpty' = _sParamValue THEN
_stStatus.eStateInputStack := E_TFInputStackState.ALMOST_EMPTY;
ELSE
_stStatus.eStateInputStack := E_TFInputStackState.UNDEFINED;
END_IF
ELSIF 'Opera' = _sParamName THEN
IF 'Busy' = _sParamValue THEN
_stStatus.eState := E_TrayFeederState.BUSY;
END_IF
END_IF
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_ParseCmd" Id="{093187fd-e820-430f-868b-5e3643bdddf4}">
<Declaration><![CDATA[METHOD M_ParseCmd
VAR_INPUT
sResponse : STRING(255);
END_VAR
VAR
_iLength : INT;
_sGAF : STRING(9);
_sParams : STRING(255);
_sParam : STRING(20);
_sParamName : STRING(10);
_sValue : STRING(10);
_xSplitResult : BOOL;
_uiCounter : UINT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Get group and function
_sGAF := MID(sResponse, 9, 2);
// Get length
_iLength := LEN(sResponse);
IF 'STAT-FEED' = _sGAF THEN
// Get parameter string
_sParams := MID(sResponse, LEN(sResponse) - 11, 12);
FOR _uiCounter := 0 TO MAX_PARAMS DO
_xSplitResult := FindAndSplit(
pSeparator := ADR(PARAMS_SEP), pSrcString := ADR(_sParams),
pLeftString := ADR(_sParam), nLeftSize := SIZEOF(_sParam),
pRightString := ADR(_sParams), nRightSize := SIZEOF(_sParams),
bSearchFromRight := FALSE);
IF _xSplitResult THEN
M_StatFeedParams(_sParam);
ELSE
EXIT;
END_IF
END_FOR
RETURN;
END_IF
IF 'EVEN-SYST' = _sGAF THEN
// Get parameter string
_sParams := MID(sResponse, LEN(sResponse) - 11, 12);
FOR _uiCounter := 0 TO MAX_PARAMS DO
_xSplitResult := FindAndSplit(
pSeparator := ADR(PARAMS_SEP), pSrcString := ADR(_sParams),
pLeftString := ADR(_sParam), nLeftSize := SIZEOF(_sParam),
pRightString := ADR(_sParams), nRightSize := SIZEOF(_sParams),
bSearchFromRight := FALSE);
IF _xSplitResult THEN
M_EvenSystParams(_sParam);
END_IF
END_FOR
END_IF
IF 'EVEN-INIT' = _sGAF THEN
RETURN;
END_IF
IF 'EVEN-BUTT' = _sGAF THEN
RETURN;
END_IF
IF 'EVEN-CONV' = _sGAF THEN
RETURN;
END_IF
IF 'EVEN-ELEV' = _sGAF THEN
RETURN;
END_IF
IF 'NOTE-SYST' = _sGAF THEN
RETURN;
END_IF
IF 'NOTE-CONN' = _sGAF THEN
RETURN;
END_IF
IF 'NOTE-ELEV' = _sGAF THEN
RETURN;
END_IF
IF 'INVA-SYST' = _sGAF THEN
RETURN;
END_IF
IF 'INVA-CONV' = _sGAF THEN
RETURN;
END_IF
IF 'INVA-ELEV' = _sGAF THEN
RETURN;
END_IF
IF 'INVA-COMM' = _sGAF THEN
RETURN;
END_IF
IF 'ERRO-ELEV' = _sGAF THEN
RETURN;
END_IF
IF 'ERRO-CONV' = _sGAF THEN
RETURN;
END_IF
IF 'ERRO-STAC' = _sGAF THEN
RETURN;
END_IF
IF 'ERRO-SYST' = _sGAF THEN
RETURN;
END_IF
IF 'ERRO-INIT' = _sGAF THEN
RETURN;
END_IF
IF 'ERRO-FATA' = _sGAF THEN
RETURN;
END_IF
IF 'ERRO-DISP' = _sGAF THEN
RETURN;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_StatFeedParams" Id="{0f709e96-deb5-41d4-a649-6a94f81e2861}">
<Declaration><![CDATA[METHOD PRIVATE M_StatFeedParams
VAR_INPUT
sParam : STRING(30);
END_VAR
VAR
_sParamName : STRING(15);
_sParamValue : STRING(15);
_xSplitOk : BOOL;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[_xSplitOk := FindAndSplit(
pSeparator := ADR(VALUE_SEP), pSrcString := ADR(sParam),
pLeftString := ADR(_sParamName), nLeftSize := SIZEOF(_sParamName),
pRightString := ADR(_sParamValue), nRightSize := SIZEOF(_sParamValue),
bSearchFromRight := FALSE);
IF _xSplitOk THEN
// Check for parameter names
IF 'Feeder' = _sParamName THEN
IF 'LoadPos' = _sParamValue THEN
_stStatus.eState := E_TrayFeederState.LOAD_POS;
ELSIF 'FeedPos' = _sParamValue THEN
_stStatus.eState := E_TrayFeederState.FEED_POS;
ELSIF 'Busy' = _sParamValue THEN
_stStatus.eState := E_TrayFeederState.BUSY;
ELSIF 'Hold' = _sParamValue THEN
_stStatus.eState := E_TrayFeederState.HOLD;
END_IF
ELSIF 'PickRdy' = _sParamName THEN
IF 'True' = _sParamValue THEN
_stStatus.xInPickPosition := TRUE;
ELSIF 'False' = _sParamValue THEN
_stStatus.xInPickPosition := FALSE;
END_IF
ELSIF 'TrayNbr' = _sParamName THEN
_stStatus.uiActTray := STRING_TO_UINT(_sParamValue);
END_IF
END_IF]]></ST>
</Implementation>
</Method>
<Property Name="P_Status" Id="{20979751-d4c1-49d9-b10b-c37404f0389d}">
<Declaration><![CDATA[PROPERTY P_Status : ST_TrayFeederStatus]]></Declaration>
<Get Name="Get" Id="{fd6a9782-a339-4e31-8a2f-e1b1d771cedb}">
<Declaration><![CDATA[VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[P_Status := _stStatus;]]></ST>
</Implementation>
</Get>
</Property>
</POU>
</TcPlcObject>