Added hot and cold plates

- Started spinner chuck io's
This commit is contained in:
2026-02-01 13:53:21 +01:00
parent 8c41ff9bad
commit 1ade81c1c5
30 changed files with 3626 additions and 5882 deletions

View File

@@ -0,0 +1,376 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_TFProtocol" Id="{f0c44f0b-70b8-45d0-8720-9bd7e08b6aa6}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_TFProtocol
VAR_INPUT
sIpAddr : STRING;
udiPort : UDINT;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
xConnected : BOOL;
xNewResponseReady : BOOL;
xBusy : BOOL;
xError : BOOL;
END_VAR
VAR
// Connection settings
_fbTcpConnection : FB_ClientServerConnection;
_sIpAddr : STRING;
_udiPort : UDINT;
_hSocket : T_HSOCKET;
_xConnect : BOOL := TRUE;
_xConnected : BOOL;
// Socket send
_fbSocketSend : FB_SocketSend;
_timSendTimeout : TIME := T#5S;
// Socket receive
_fbSocketReceive : FB_SocketReceive;
_timReceiveTimeout : TIME := T#5S;
_abReceivedBuffer : ARRAY[0..100] OF BYTE;
_sReceivedResponse : STRING;
_udiCounterReceive : UDINT;
_udiReceivedBytes : UDINT;
_timPollingTime : TIME := T#50MS;
_tonPollTimer : TON;
_xEnableReceiveTimeout : BOOL;
_timReceiveTimeoutTime : TIME := T#500MS;
_tonReceiveTimeout : TON;
_uiLastReceivedResponseId : UINT := 0;
// Receive state machine
_iStateReceive : INT;
// Command data
_uiCmdId : UINT := 1;
_sCmd : STRING(255);
_sAck : STRING(255);
// Main state machine
_iState : INT := 0;
_diCounter : DINT;
_xSendCmd : BOOL;
_uiRetries : UINT;
_xCmdReceived : BOOL;
_iPlaceCmdSeperator : INT;
_sTmp : STRING;
_xReceivedResponseOk : BOOL;
_uiReceivedCommandId : UINT;
// Buffer before output
_xBusy : BOOL;
_xError : BOOL;
END_VAR
VAR CONSTANT
MAX_RETRIES : UINT := 3;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Call client server connection fb
_fbTcpConnection(
sSrvNetID:= '',
nMode:= ,
sRemoteHost:= sIpAddr,
nRemotePort:= udiPort,
bEnable:= _xConnect,
tReconnect:= T#2S,
bBusy=> ,
bError=> ,
nErrId=> ,
hSocket=> _hSocket,
eState=> );
// Get connected state
_xConnected := (_fbTcpConnection.eState = E_SocketConnectionState.eSOCKET_CONNECTED);
// Receive timeout after sending a command
_tonReceiveTimeout(IN := _xEnableReceiveTimeout, PT := _timReceiveTimeoutTime);
// Receive state machine
CASE _iStateReceive OF
// Main socket not connected
0:
IF _xConnected THEN
_iStateReceive := 10;
END_IF
// Call receive
10:
_fbSocketReceive(
sSrvNetId:= '',
hSocket:= _hSocket,
cbLen:= SIZEOF(_abReceivedBuffer) - _udiReceivedBytes,
pDest:= ADR(_abReceivedBuffer) + _udiReceivedBytes,
bExecute:= TRUE,
tTimeout:= _timReceiveTimeout,
bBusy=> ,
bError=> ,
nErrId=> ,
nRecBytes=> );
IF (NOT _fbSocketReceive.bBusy) AND (NOT _fbSocketReceive.bError) THEN
_fbSocketReceive(bExecute := FALSE);
IF _fbSocketReceive.nRecBytes > 0 THEN
_udiReceivedBytes := _udiReceivedBytes + _fbSocketReceive.nRecBytes;
_iStateReceive := 20;
ELSE
_iStateReceive := 15;
END_IF
END_IF
// If we have an error, check if we are connected
IF _fbSocketReceive.bError THEN
_fbSocketReceive(bExecute := FALSE);
_iStateReceive := 0;
END_IF
// Wait some time before rechecking
15:
_tonPollTimer(IN := TRUE, PT := _timPollingTime);
IF _tonPollTimer.Q THEN
_tonPollTimer(IN := FALSE);
_iStateReceive := 10;
END_IF
// Check if we are still connected
IF (NOT _xConnected) THEN
_tonPollTimer(IN := FALSE);
_sReceivedResponse := '';
_iStateReceive := 0;
END_IF
// Check received data
20:
// Check if received command is complete
MEMCPY(destAddr := ADR(_sReceivedResponse), srcAddr := ADR(_abReceivedBuffer), n := _udiReceivedBytes);
_udiReceivedBytes := 0;
//_xCmdReceived := TRUE;
// Go back to polling wait state
_iStateReceive := 15;
END_CASE
CASE _iState OF
// Wait for active connection to tray feeder
0:
IF _xConnected THEN
_iState := 10;
END_IF
// Connected and idle
10:
// Got to disconnected state if connection is lost
IF (NOT _xConnected) THEN
_iState := 0;
END_IF
IF _xSendCmd THEN
_xSendCmd := FALSE;
_xBusy := TRUE;
_iState := 20;
END_IF
// Check if we received a response without sending a command
// IF _xCmdReceived THEN
// _iState := 50;
// END_IF
// Send command
20:
_fbSocketSend(
sSrvNetId:= '',
hSocket:= _hSocket,
cbLen:= SIZEOF(_sCmd),
pSrc:= ADR(_sCmd),
bExecute:= TRUE,
tTimeout:= _timSendTimeout,
bBusy=> ,
bError=> ,
nErrId=> );
IF (NOT _fbSocketSend.bBusy) AND (NOT _fbSocketSend.bError) THEN
_fbSocketSend(bExecute := FALSE);
//_xEnableReceiveTimeout := TRUE;
//_iState := 30;
END_IF
IF _fbSocketSend.bError THEN
_fbSocketSend(bExecute := FALSE);
_iState := 90;
END_IF
// Wait for response
30:
// Received a response
IF _xCmdReceived THEN
_xCmdReceived := FALSE;
_xEnableReceiveTimeout := FALSE;
_uiRetries := 0;
_iState := 40;
END_IF
// Didnt receive command ack in time
// So resend the command if max retries are not reached
IF _tonReceiveTimeout.Q THEN
_xEnableReceiveTimeout := FALSE;
_uiRetries := _uiRetries + 1;
// Check if we reached the max number of retries
IF _uiRetries > MAX_RETRIES THEN
_iState := 90;
ELSE
// Retry by sendind command again
_iState := 20;
END_IF
END_IF
// Check response
40:
// Check for cmd id
IF (TO_STRING(_sReceivedResponse[0]) <> UINT_TO_STRING(_uiCmdId)) THEN
// Wrong command id received
_iState := 90;
END_IF
// For for response indicator
IF _sReceivedResponse[1] <> F_ToASC('<') THEN
// Wrong response indicator
_iState := 90;
END_IF
// Check for correct cmd
_xReceivedResponseOk := TRUE;
FOR _diCounter := 2 TO (LEN(_sReceivedResponse) - 1) DO
IF _sReceivedResponse[_diCounter] = F_ToASC(':') THEN
EXIT;
ELSIF _sReceivedResponse[_diCounter] <> _sCmd[_diCounter] THEN
_xReceivedResponseOk := FALSE;
EXIT;
END_IF
END_FOR
IF _xReceivedResponseOk THEN
_iState := 10;
ELSE
_iState := 90;
END_IF
50:
// Get command id
_uiReceivedCommandId := STRING_TO_UINT(TO_STRING(_sReceivedResponse[0]));
// Check if it is a new command
IF (_uiReceivedCommandId <> _uiLastReceivedResponseId) OR (_uiReceivedCommandId = 0) THEN
_uiLastReceivedResponseId := _uiReceivedCommandId;
xNewResponseReady := TRUE;
// Send acknowledgement
_iState := 60;
END_IF
// Prepare ack response
60:
_sAck := CONCAT(UINT_TO_STRING(_uiLastReceivedResponseId), '<');
FOR _diCounter := 2 TO (LEN(_sReceivedResponse) - 1) DO
IF _sReceivedResponse[_diCounter] <> F_ToASC(':') THEN
_sAck[_diCounter] := _sReceivedResponse[_diCounter];
ELSE
_sAck[_diCounter] := F_ToASC('\0');
EXIT;
END_IF
END_FOR
_iState := 70;
// Send ack response
70:
_fbSocketSend(
sSrvNetId:= '',
hSocket:= _hSocket,
cbLen:= SIZEOF(_sAck),
pSrc:= ADR(_sAck),
bExecute:= TRUE,
tTimeout:= _timSendTimeout,
bBusy=> ,
bError=> ,
nErrId=> );
IF (NOT _fbSocketSend.bBusy) AND (NOT _fbSocketSend.bError) THEN
_fbSocketSend(bExecute := FALSE);
_xEnableReceiveTimeout := TRUE;
_iState := 10;
END_IF
IF _fbSocketSend.bError THEN
_fbSocketSend(bExecute := FALSE);
_iState := 90;
END_IF
// Error
90:
_xError := TRUE;
_xBusy := FALSE;
IF xConfirmAlarms THEN
_xError := FALSE;
_iState := 0;
END_IF
END_CASE
// Copy output buffers to outputs
xConnected := _xConnected;
xBusy := _xBusy;
xError := _xError;]]></ST>
</Implementation>
<Method Name="M_GetResponse" Id="{48f8719d-7ed0-4fb1-824a-0bf475fcfc2c}">
<Declaration><![CDATA[METHOD M_GetResponse : STRING
VAR
_sTmp : STRING(255);
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[xNewResponseReady := FALSE;
MEMCPY(destAddr := ADR(_sTmp), ADR(_sReceivedResponse) + 2, n := INT_TO_UDINT(LEN(_sReceivedResponse) - 2));
M_GetResponse := _sTmp;]]></ST>
</Implementation>
</Method>
<Method Name="M_SendCmd" Id="{d00a8c1a-c183-4659-9c9e-be5b30566b7c}">
<Declaration><![CDATA[METHOD M_SendCmd : BOOL
VAR_INPUT
sCmd : STRING(80);
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Check if we are already sending a command
IF _xBusy OR _xError THEN
M_SendCmd := FALSE;
RETURN;
END_IF
// Increment command id
_uiCmdId := _uiCmdId + 1;
// Overflows at 9 and is reset to 1
IF _uiCmdId > 9 THEN
_uiCmdId := 1;
END_IF
// Create command with id
_sCmd := CONCAT(UINT_TO_STRING(_uiCmdId), '>');
_sCmd := CONCAT(_sCmd, sCmd);
// start sendind command state machine
_xSendCmd := TRUE;
M_SendCmd := TRUE;]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -1,38 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_TrayFeeder" Id="{e2e3e993-37de-42b1-80e1-7dba99a66e94}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FINAL FB_TrayFeeder EXTENDS FB_Isa88_SM
<Declaration><![CDATA[FUNCTION_BLOCK FINAL FB_TrayFeeder EXTENDS FB_PackMLGeneric
VAR_INPUT
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
_fbTcpConnection : FB_ClientServerConnection;
_sIpAddr : STRING;
_udiPort : UDINT;
_fbProtocolHandler : FB_TFProtocol;
_xTest : BOOL;
_xSendResult : BOOL;
_sCmd : STRING := 'STAT-FEED:';
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Call client server connection fb
_fbTcpConnection(
sSrvNetID:= '',
nMode:= ,
sRemoteHost:= _sIpAddr,
nRemotePort:= ,
bEnable:= ,
tReconnect:= ,
bBusy=> ,
bError=> ,
nErrId=> ,
hSocket=> ,
eState=> );
<ST><![CDATA[// IPs
// 192.168.1.10
// 192.168.1.11
_fbProtocolHandler(
sIpAddr:= _sIpAddr,
udiPort:= _udiPort,
xConfirmAlarms:= xConfirmAlarms,
xConnected=> ,
xNewResponseReady=> ,
xBusy=> ,
xError=> );
IF _xTest THEN
_xTest := FALSE;
_xSendResult := _fbProtocolHandler.M_SendCmd(sCmd := _sCmd);
END_IF
// Call isa88 base state machine
SUPER^();
// IPs
// 192.168.1.10
// 192.168.1.11]]></ST>
SUPER^();]]></ST>
</Implementation>
<Method Name="FB_init" Id="{6c7048d9-3836-4289-b5f3-f8878267494f}">
<Declaration><![CDATA[//FB_Init ist immer implizit verfügbar und wird primär für die Initialisierung verwendet.
@@ -48,8 +54,17 @@ sIPAddr : STRING;
udiPort : UDINT;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[_sIpAddr := sIPAddr;
_udiPort := udiPort;]]></ST>
<ST><![CDATA[// Save connection settings
_sIpAddr := sIPAddr;
_udiPort := udiPort;
// Config state machine
_stSMConfig.xStoppingDisabled := TRUE;
_stSMConfig.xCompletingDisabled := TRUE;
_stSMConfig.xCompletedDisabled := TRUE;
_stSMConfig.xAbortingDisabled := TRUE;]]></ST>
</Implementation>
</Method>
</POU>