FUNCTION_BLOCK "FB_CommunicationWCSBL" { 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"; arPayloadHelp : Array[0..200] of Byte; cnt : UInt; LStream_JsonDeserializer_Instance : "LStream_JsonDeserializer"; typeElement : Array[0..10] of "LStream_typeElement"; xDone : Bool; rTrigConnectionActive {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; xSendHeartbeat : Bool; tOnHeartbeat {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; END_VAR VAR_TEMP xStart : Bool; test : "UDT_TelegramData_Send"; empty : "UDT_TelegramData_Send"; xSuccess : Bool; stLogTelegram : "UDT_TelegramData_Send"; i : Int; END_VAR BEGIN REGION Info // Kommunikation zu Fortna WCSBL // Telegramme: // Senden: // GOHDReqM (Zielanfrage) | Von Schönenberger -> Fortna WCSBL // GOHDUM (Update) | Von Schönenberger -> Fortna WCSBL // Empfangen: // GOHDRespM (Antwort auf Zielanfrage) | Von Fortna WCSBL -> Schönenberger END_REGION //172.22.160.23:30650 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 := 20; //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 := 30650; //partner port number, use only in case of client or specified partner (possible values: 1...49151; recommended values: 2000...5000) #fbTeleHandler.stInTcpTypeConfig.connection.partnerPort := 30650; //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] := 23; #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 Send Heartbeat IF #fbTeleHandler.xOutConnectionActive THEN #xSendHeartbeat := TRUE; IF #tOnHeartbeat.Q THEN #xSendHeartbeat := FALSE; "FC_Send_HB"(sInPLCID := "cPLCID", nInPartnerType:= 1, FIFO := "DB_LGF_FIFO_CommWCSBL", BUFFER := "DB_Buffer_CommunicationWCSBL".BUFFER, nInOutSequenceNumber := "DB_CommunicationParameters".nSeqNumWCSBL); END_IF; ELSE #xSendHeartbeat := FALSE; END_IF; #tOnHeartbeat(IN := #xSendHeartbeat, PT := t#15s); END_REGION REGION Empfangen CASE #nState OF 0: // Waiting // "DB_HandshakeStorage".str_StorageManagement.udt_HandshakeMESStorage.str_Ctrl.xNewDataAvaible := FALSE; //New Telegram IF #fbTeleHandler.xOutTelegramAvailable THEN #fbTeleHandler.xInGetFirst := TRUE; #nState := 100; END_IF; 100: // Get new Telegram #stNewTelegram := #fbTeleHandler.stOutNewTelegram; #fbTeleHandler.xInGetFirst := FALSE; #stLogTelegram.nDataCount := #stNewTelegram.nDataCount; FOR #i := 1 TO 15 DO #stLogTelegram.arDataString[#i] := #stNewTelegram.arDataString[#i]; END_FOR; REGION LOG IF "FB_CommunicationLogger_DB".fbTeleHandler.xOutConnectionActive THEN "FC_FIFO_Append"(DataIn := #stLogTelegram, InitialItem := #empty, MaxNo := 100, Success => #xSuccess, fifoBuffer := "DB_LGF_FIFO_CommLogger", buffer := "DB_Buffer_CommunicationLogger".BUFFER); END_IF; END_REGION #nState := 200; 200: //Analyze Telegram #stTeleGOHDRespM.stHeader.sPlcId := #stNewTelegram.arDataString[1]; #stTeleGOHDRespM.stHeader.sSeqNum := #stNewTelegram.arDataString[2]; #stTeleGOHDRespM.stHeader.sMessageType := #stNewTelegram.arDataString[3]; #stTeleGOHDRespM.stPayload.sTimeStamp := #stNewTelegram.arDataString[4]; #nState := 0; (* IF #stTeleGOHDRespM.stHeader.sMessageType = 'GOHDRespM' THEN Strg_TO_Chars(Strg := #stNewTelegram.arDataString[4], pChars := 0, Cnt => #cnt, Chars := #arPayloadHelp); #typeElement[0].type := 2; #typeElement[0].key := 'DecisionPoint'; #typeElement[1].type := 3; #typeElement[1].key := 'GIN'; #typeElement[2].type := 2; #typeElement[2].key := 'Barcode'; #typeElement[3].type := 1; #typeElement[3].key := 'Actions'; #typeElement[9].type := 1; #typeElement[9].key := 'TimeStamp'; #xStart := TRUE; IF #xDone THEN #xStart := FALSE; #stTeleGOHDRespM.stPayload.sDecisionPoint := #typeElement[0].value; STRG_VAL(IN := #typeElement[1].value, FORMAT := 0, P := 1, OUT => #stTeleGOHDRespM.stPayload.nGin); STRG_VAL(IN := #typeElement[2].value, FORMAT := 0, P := 1, OUT => #stTeleGOHDRespM.stPayload.nBarcode); #stTeleGOHDRespM.stPayload.arActions[0] := #typeElement[4].value; #stTeleGOHDRespM.stPayload.arActions[1] := #typeElement[5].value; #stTeleGOHDRespM.stPayload.arActions[2] := #typeElement[6].value; #stTeleGOHDRespM.stPayload.arActions[3] := #typeElement[7].value; #stTeleGOHDRespM.stPayload.arActions[4] := #typeElement[8].value; IF #stTeleGOHDRespM.stPayload.sDecisionPoint = 'GOH.REC.01' THEN #nState := 300; END_IF; #xDone := FALSE; #stTeleGOHDRespM.stPayload.sTimeStamp := #typeElement[9].value; END_IF; ELSE #nState := 0; END_IF; *) 300: //Transfer Telegram to StorageManagement ; #nState := 0; (* IF NOT "DB_HandshakeStorage".str_StorageManagement.udt_HandshakeMESStorage.str_Status.xReadingNewData AND NOT "DB_HandshakeStorage".str_StorageManagement.udt_HandshakeMESStorage.str_Status.xNewDataSaved THEN "DB_HandshakeStorage".str_StorageManagement.str_TelegramMES.udtIn_DataMES := #stTeleGOHDRespM; "DB_HandshakeStorage".str_StorageManagement.udt_HandshakeMESStorage.str_Ctrl.xNewDataAvaible := TRUE; END_IF; IF "DB_HandshakeStorage".str_StorageManagement.udt_HandshakeMESStorage.str_Ctrl.xNewDataAvaible AND "DB_HandshakeStorage".str_StorageManagement.udt_HandshakeMESStorage.str_Status.xNewDataSaved THEN #nState := 0; END_IF; *) END_CASE; END_REGION #LStream_JsonDeserializer_Instance(execute := #xStart, tree := #typeElement, raw := #arPayloadHelp); IF #LStream_JsonDeserializer_Instance.done THEN #xDone := TRUE; END_IF; END_FUNCTION_BLOCK