FUNCTION_BLOCK "IbaSimDatFrmWrkSt" { S7_Optimized_Access := 'FALSE' } VERSION : 0.1 VAR_INPUT I_Data : Any; // Eingangsdaten END_VAR VAR_IN_OUT IO_Cmd : "IbaSimDatFrmWrkSt.T_Cmd"; // Triggersignal IO_Data { S7_HMI_Visible := 'False'} : Any; // Datenausgabe END_VAR VAR adr : Int; // Adresszähler END_VAR VAR_TEMP pTmpData : Any; // Pointer Tmp-Daten pTmpDataAny AT pTmpData : "Any.T_AnyPoint"; // Pointer Tmp-Daten Detail noElements : Int; // Anzahl der Elemente flt : Int; // Fehler von Blkmov adrOffSet : Int; // Adress-Offset END_VAR BEGIN (*################################################################################################# Copyright (c) Fondium Singen GmbH ### Änderungshistorie ### Datum: Version: Bearbeiter: Beschreibung: 10.03.2021 0.0 St. Maier Neuerstellung #################################################################################################*) IF NOT #IO_Cmd.Frg OR NOT #IO_Cmd.PcSnd THEN RETURN; END_IF; // Pointer initizialisieren #pTmpData := #I_Data; // Anzahl der Einzelelemente/Typen bestimmen #noElements := "Any.NoOfBytes"(#I_Data) / "Any.NoOfBytes"(#IO_Data) - 1; // // Adressgrenzen überwachen // IF #adr >= #adrOffSet + #noElements * "Any.NoOfBytes"(#IO_Data) THEN // #adr := #adrOffSet; // END_IF; // Byte-Offset berechnen #adrOffSet := "Any.GetOffset"(#I_Data); // Daten zum Kopieren zusammenstellen #pTmpDataAny.BytePointer := #pTmpDataAny.BytePointer OR SHL(IN := WORD_TO_DWORD(INT_TO_WORD(#adrOffSet)), N := 3); // Byte-Adresse in Pointer laden #pTmpDataAny.DataCount := "Any.NoOfBytes"(#IO_Data); // Länge // Daten kopieren und am Ausgang bereitstellen #flt := BLKMOV(SRCBLK := #pTmpData, DSTBLK => #IO_Data); // Eingangs-Daten kopieren #IO_Cmd.NewDat := false; END_FUNCTION_BLOCK