FUNCTION_BLOCK "FB_CommunicationWES_ASRS"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_IN_OUT 
      fbInOutSendFIFO : "LGF_FIFO";
      arFifoSendBuffer : Array[1..100] of "UDT_TelegramData_Send";
   END_VAR

   VAR 
      fbTeleHandler : "FB_TCP_LCOM_TeleHandler";
      xReset : Bool;
      xSendTele : Bool;
      stTelegramToSend : "UDT_TelegramData_Send";
      nState : Int;
      xRetVal : Bool;
      stNewTelegram { S7_SetPoint := 'False'} : "UDT_TelegramData";
      stTeleGOHDRespM : "UDT_Telegram_GOHDRespM";
      stTeleCReqM : "UDT_Telegram_CReqM";
      stTeleCRCanM : "UDT_Telegram_CRCanM";
      rTrigConnectionActive {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
      xSendHeartbeat : Bool;
      tOnHeartbeat {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
   END_VAR


BEGIN
	REGION Info
	    // Kommunikation zu Fortna WES/ASRS Driver
	    // Telegramme:
	    // Senden:
	    // CRRespM  (Abruf Bestätigung/Update)  | Von Schönenberger -> Fortna WES/ASRS Driver
	    // CSRespM  (Einlagern Bestätigung)     | Von Schönenberger -> Fortna WES/ASRS Driver
	    // Empfangen:
	    // CReqM  (Abruf)                       | Fortna WES/ASRS Driver  -> Schönenberger
	    // CRCanM (Abruf Cancel)                | Fortna WES/ASRS Driver  -> Schönenberger
	END_REGION
	
	REGION Call TeleHandler
	    // hardware identifier of the local interface, PLC tags--Default tag table--System constant default value: PROFINET_interface_1 = 64
	    #fbTeleHandler.stInTcpTypeConfig.connection.interfaceID := "Local~PN-Interface_Customer";
	    //unique connection identifier (W#16#0001...W#16#0FFF)
	    #fbTeleHandler.stInTcpTypeConfig.connection.connectionID := 21;
	    //used protocol: 1=TCP protocol, 2=LCom protocol
	    #fbTeleHandler.stInTcpTypeConfig.connection.comService := "LCOM_TCP_CONNECTION";
	    //FALSE: passive (server), TRUE: active connection establishment (client)
	    #fbTeleHandler.stInTcpTypeConfig.connection.isClient := TRUE;
	    //TRUE: accept requests from all partners, FALSE: only specified partner is allowed in case of server
	    #fbTeleHandler.stInTcpTypeConfig.connection.acceptUnknownPartner := TRUE;
	    //local port number (possible values: 1...49151; caution: some may be reserved for internal use; recommended values: 2000...5000)
	    #fbTeleHandler.stInTcpTypeConfig.connection.localPort := 30635;
	    //partner port number, use only in case of client or specified partner (possible values: 1...49151; recommended values: 2000...5000)
	    #fbTeleHandler.stInTcpTypeConfig.connection.partnerPort := 30635;
	    
	    //partner IP address xxx.xxx.xxx.xxx = [1].[2].[3].[4], use only in case of client or specified partner
	    #fbTeleHandler.stInTcpTypeConfig.connection.partnerIP.ADDR[1] := 172;
	    #fbTeleHandler.stInTcpTypeConfig.connection.partnerIP.ADDR[2] := 22;
	    #fbTeleHandler.stInTcpTypeConfig.connection.partnerIP.ADDR[3] := 160;
	    #fbTeleHandler.stInTcpTypeConfig.connection.partnerIP.ADDR[4] := 21;
	    
	    #fbTeleHandler.stInTcpTypeConfig.connection.connectType := "LCOM_CON_TYPE_IPV4";
	    
	    // Telegramdefinition
	    #fbTeleHandler.stInTelegramDefinition.sStartMarker := '$02';
	    #fbTeleHandler.stInTelegramDefinition.sEndMarker := '$03';
	    #fbTeleHandler.stInTelegramDefinition.sStartMarkerSend := '$02';
	    #fbTeleHandler.stInTelegramDefinition.sEndMarkerSend := '$03';
	    #fbTeleHandler.stInTelegramDefinition.bSeparatorByte := '$1D'; //',';
	    #fbTeleHandler.stInTelegramDefinition.nLength := 0;
	    #fbTeleHandler.stInTelegramDefinition.nTelegramIDDataField := 0;
	    #fbTeleHandler.stInTelegramDefinition.xTelegramIDIsNumber := FALSE;
	    
	    #fbTeleHandler(xInReset := #xReset,
	                   xInOutSendTele := #xSendTele,
	                   stInTelegramSend := #stTelegramToSend,
	                   fbInOutSendFIFO := #fbInOutSendFIFO,
	                   arFifoSendBuffer := #arFifoSendBuffer);
	END_REGION
	
	REGION Reset SequenceNumber
	    #rTrigConnectionActive(CLK := #fbTeleHandler.xOutConnectionActive);
	    
	    IF #rTrigConnectionActive.Q THEN
	        "DB_CommunicationParameters".nSeqNumWESASRS := 0;
	    END_IF;
	END_REGION
	
	REGION Send Heartbeat
	    IF #fbTeleHandler.xOutConnectionActive THEN
	        #xSendHeartbeat := TRUE;
	        
	        IF #tOnHeartbeat.Q THEN
	            #xSendHeartbeat := FALSE;
	            "FC_Send_HB"(sInPLCID := 'GOHPLC02',
	                         nInPartnerType:= 3,
	                         FIFO := "DB_LGF_FIFO_CommWES_ASRS",
	                         BUFFER := "DB_Buffer_CommunicationWES_ASRS".BUFFER,
	                         nInOutSequenceNumber := "DB_CommunicationParameters".nSeqNumWESASRS);
	        END_IF;
	    ELSE
	        #xSendHeartbeat := FALSE;
	    END_IF;
	    
	    #tOnHeartbeat(IN := #xSendHeartbeat,
	                  PT := t#15s);
	END_REGION
	
	REGION Empfangen
	    CASE #nState OF
	        0: // Waiting
	            //New Telegram
	            IF #fbTeleHandler.xOutTelegramAvailable THEN
	                #fbTeleHandler.xInGetFirst := TRUE;
	                #nState := 100;
	            END_IF;
	        100: // Get new Telegram
	            #stNewTelegram := #fbTeleHandler.stOutNewTelegram;
	            #fbTeleHandler.xInGetFirst := FALSE;
	            #nState := 200;
	        200: //Analyze Telegram
	            IF #stNewTelegram.arDataString[3] = 'GOHDRespM' THEN
	                #stTeleGOHDRespM.stPayload.sDecisionPoint := #stNewTelegram.arDataString[3];
	
	                // Parse field [4] into 
	                
	                
	                
	                
	            (*    REGION Send ACK
	                    "FC_TeleClear"(#stTelegramToSend);
	                    
	                    #xRetVal := "FC_TeleSetData"(nDataField := 1,
	                                                 sData := '4711',
	                                                 stInOutTelegram := #stTelegramToSend);
	                    
	                    #xRetVal := "FC_TeleSetData"(nDataField := 2,
	                                                 sData := #stNewTelegram.arDataString[2],
	                                                 stInOutTelegram := #stTelegramToSend);
	                    
	                    #xRetVal := "FC_TeleSetData"(nDataField := 3,
	                                                 sData := 'ACK',
	                                                 stInOutTelegram := #stTelegramToSend);
	                    
	                    #xRetVal := "FC_TeleSetData"(nDataField := 4,
	                                                 sData := '123',
	                                                 stInOutTelegram := #stTelegramToSend);
	                    #xSendTele := TRUE;
	                END_REGION *)
	                
	       
	            END_IF;
	            
	            
	            #nState := 0;
	    END_CASE;
	END_REGION
END_FUNCTION_BLOCK

