231 lines
10 KiB
Plaintext
231 lines
10 KiB
Plaintext
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
|
|
|