Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 27

Thema: Bereich kopieren - verschiedene Datentypen

  1. #11
    Registriert seit
    01.10.2012
    Beiträge
    203
    Danke
    12
    Erhielt 56 Danke für 36 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich stecke nicht so dicke drin in TIA, aber es gäbe noch folgende Lösung.
    Dein Struct als Datentyp anlegen (UDT) und in dem DB wo das struct sein soll als Variable deklarieren.
    Dann eine Funtion schreiben, in der die UDT temporär mit einer AT Sicht in ein Bytearray zerlegt wird, dann dein Bytearray in das temporäre Array kopieren und dann kannst du die temporäre UDT symbolisch in das Struct in deinem optimierten DB kopieren.
    Nüchtern betrachtet war es besoffen besser.

  2. #12
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.735
    Danke
    321
    Erhielt 1.522 Danke für 1.283 Beiträge

    Standard

    Zitat Zitat von Snape Beitrag anzeigen
    Der Kunde verlangt rein optimierte Bausteine, keine Standard-Zugriffe. Also entfallen alle bisher aufgelisteten Möglichkeiten.
    Also imho entfallen ALLE Möglichkeiten, ein optimierter Baustein hat auch keine (nachvollziehbaren) 100 Byte Länge (auf den tatsächlichen Speicherverbrauch bezogen).
    Insofern kann ein anderer, anderst struckturierter Datentyp erst recht kein "garantierten" 100 Byte Länge haben, und selbst wenn er 100 Byte enthalten würde,
    dann ist die tatsächliche Reihenfolge im Speicher rein von der momentan genehmen Firmware / Compilerversion abhängig.
    Geändert von MSB (02.02.2016 um 12:57 Uhr)
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  3. #13
    Snape ist offline Benutzer
    Themenstarter
    Registriert seit
    12.11.2007
    Beiträge
    92
    Danke
    1
    Erhielt 5 Danke für 5 Beiträge

    Standard

    Die 100 Byte sind ein Sammelsorium aus Bool, Byte, Integer und UDINT. Dieses "Array" bekomme ich von einem Koppelpartner zugeschickt, welches ich dann auseinander nehmen muss. Deserialize() wäre eine prima Funktion, nur geht die auch nur mit Standard-Bausteinen.

  4. #14
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Die (vermutlich? Marketing-)Entscheidung, auch vom dummen Programmierer ausdrücklich deklarierte STRUCT zu "optimieren", war Schwachsinn und fällt uns immer wieder auf die Füße...

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #15
    Registriert seit
    10.11.2009
    Beiträge
    12
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    wenn Du die Daten von deinem Koppelparter bekommst dann müsste der DB in dem die Daten ankommen "nicht Optimiert" sein oder??

  6. #16
    Registriert seit
    26.01.2008
    Ort
    Weida
    Beiträge
    127
    Danke
    58
    Erhielt 47 Danke für 36 Beiträge

    Standard

    Hallo,

    mit Optimierten Bausteinen geht es nicht, da man die Anordnung im Ziel nicht beeinflussen kann.

    Für nicht Optimierten Bausteine gibt es dafür die Funktion Deserialisieren.

    Im Bild wird ein Feld von 100Byte auf eine Struktur kopiert. Geht Problemlos. Man kann nur nicht eine Konstanze an den Eingang POS anlegen.


    Harald


    Deserialisieren.jpg

  7. #17
    Registriert seit
    31.01.2016
    Ort
    In der naehe von São Paulo, in der Naehe vom Strand...
    Beiträge
    44
    Danke
    2
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Habe mich gerade an meine C64er Zeiten erinnert....

    Hat du es schon mal mit PEEK und POKE versucht?
    PEEK=Lesen, POKE = schreiben

    sollte eigentlich mit optimierten DBs und nicht optimierten DBs und im mixed mode funzen(der compliler meckert jedenfalls nicht rum ueber irgenwelche falsche Symbolik)

    machs mit SCL:

    ***********************CutStart**********************************

    FUNCTION "CopyAll" : Void
    { S7_Optimized_Access := 'TRUE' }
    VERSION : 0.1
    VAR_INPUT
    QuellDB : Int;
    ZielDB : Int;
    Menge : Int;
    END_VAR


    VAR_TEMP
    Temp : Byte;
    i : Int;
    END_VAR




    BEGIN
    #i:=0; //wird zum initialisieren gebraucht, sonst meckert Compiler

    //byteweise Kopieren
    For #i := 0 To (#Menge -1) Do //Hundert Bytes am eingang sind 100 in diesem Fall
    #Temp := PEEK(area := 16#84, dbNumber := #QuellDB, byteOffset := #i);
    POKE(area := 16#84, dbNumber := #ZielDB, byteOffset := #i, value := #Temp);
    ;
    End_For;

    //ohne ueberpruefung auf die tatsaechliche bausteingroessen vom Quell und Ziel DB
    //da koennte man ja noch ne routine mit testDB vom Quell und Ziel DB einbinden
    //die die Menge begrenzt
    //eventuell mit einem output
    //war ich zu faul dafuer

    END_FUNCTION



    ********************************CutEnd****************************************** *
    erklaert sich eigentlich von selbst

    C64.png

  8. #18
    Snape ist offline Benutzer
    Themenstarter
    Registriert seit
    12.11.2007
    Beiträge
    92
    Danke
    1
    Erhielt 5 Danke für 5 Beiträge

    Standard

    Peek und Poke gehen nicht, da sie nur für Standard-Speicherbereiche funktionieren. In optimierten Bausteinen habe ich keinen ByteOffset.

    Die Daten hole ich mit TRCV in ein array im IDB, daher ist auch der optimiert und kein Standard.

  9. #19
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von abe01 Beitrag anzeigen
    BEGIN
    #i:=0; //wird zum initialisieren gebraucht, sonst meckert Compiler

    //byteweise Kopieren
    For #i := 0 To (#Menge -1) Do //Hundert Bytes am eingang sind 100 in diesem Fall
    Interessehalber: was hat der Compiler da zu meckern? Wie lautet der Meldungstext?



    Tip: Programmcode wird besser dargestellt (z.B. mit Einrückungen), wenn man den Code zwischen [CODE]-Tags einfügt - z.B. mit dem #-Button im Beitragseditor. Das sieht dann so aus:
    Code:
    FUNCTION "CopyAll" : Void
    { S7_Optimized_Access := 'TRUE' }
    VERSION : 0.1
       VAR_INPUT 
          QuellDB : Int;
          ZielDB : Int;
          Menge : Int;
       END_VAR
    
    
       VAR_TEMP 
          Temp : Byte;
          i : Int;
       END_VAR
    
    
    
    
    BEGIN
    	#i:=0; //wird zum initialisieren gebraucht, sonst meckert Compiler
    	
    	//byteweise Kopieren
    	For #i := 0 To (#Menge -1) Do //Hundert Bytes am eingang sind 100 in diesem Fall ;-)
    	    #Temp := PEEK(area := 16#84, dbNumber := #QuellDB, byteOffset := #i);
    	    POKE(area := 16#84, dbNumber := #ZielDB, byteOffset := #i, value := #Temp);
    	    ;
    	End_For;
    	
    	//ohne ueberpruefung auf die tatsaechliche bausteingroessen vom Quell und Ziel DB
    	//da koennte man ja noch ne routine mit testDB vom Quell und Ziel DB einbinden
            //die die Menge begrenzt 
            //eventuell mit einem output
            //war ich zu faul dafuer ;)
    	
    END_FUNCTION
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #20
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    In anderen Sprachen (C, PASCAL...) gibt es das Konstrukt UNION, da kann mann den gleichen Speicherbereich beliebig interpretieren.
    Man muss da nicht einmal umkopieren.

    Aber bei "Optimiert" ist das wie oben schon erwähnt nicht möglich. Und die IEC Norm hat das wohl explizit verboten.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Union  

Ähnliche Themen

  1. TIA Datentypen kopieren, Datentypen kopieren
    Von Dublin im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 17.06.2015, 16:37
  2. Verschiedene bereichslängen kopieren
    Von -Melanie- im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 18.02.2010, 18:24
  3. DB bereich kopieren / Syntaxproblem
    Von Kodan im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 30.04.2008, 19:21
  4. Antworten: 0
    Letzter Beitrag: 25.04.2007, 07:50
  5. Daten von einem DB inTemp Bereich kopieren
    Von neuer_user im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 05.10.2006, 14:29

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •