Added hot and cold plates
- Started spinner chuck io's
This commit is contained in:
376
PLC/01_Stationen/TrayFeeder/FB_TFProtocol.TcPOU
Normal file
376
PLC/01_Stationen/TrayFeeder/FB_TFProtocol.TcPOU
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user