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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Instanz DB in Global DB verschieben - blkmov in SCL

  1. #1
    Registriert seit
    10.06.2014
    Beiträge
    7
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    derzeit programmiere ich einen FB, der Werte aufnehmen und diese aufbereiten soll, um im Anschluss daran die Werte vom eigenen Instanz-DB in ein globalen DB zu schieben.
    Um dies zu realisieren, will ich den SFC20 blkmov verwenden.
    Leider habe ich es bis jetzt noch nicht geschafft und bin mit meinem Latein am Ende, weswegen ich hoffe, hier Hilfe zu finden.
    Das habe ich bis jetzt (nur Code, welcher für den BlockMove relevant ist):

    Code:
    VAR_INPUT    
    
        PV_COUNT : WORD;    //exemplarische Input-Variable
    
    END_VAR  
    
    VAR_TEMP
    
        //ANY-Pointer zur Ermittlung der Nummer des Instanz-DBs
        IDBPointer : ANY;
        AnyPointerIDB AT IDBPointer: STRUCT
            BYTE0   :BYTE;
            TYP     :BYTE;
            ANZ     :WORD;
            DBNR    :WORD;
            BZ      :DWORD;
        END_STRUCT;
        
        //ANY-Pointer auf den Quell-DB (Instanz-DB)
        SourcePointer: STRUCT
            BYTE0   :BYTE;
            TYP     :BYTE;
            ANZ     :WORD;
            DBNR    :WORD;
            BZ      :DWORD;
        END_STRUCT;    
        AnyPointerSource AT SourcePointer: ANY;    
        
        //ANY-Pointer auf den Ziel-DB
        DestinPointer: STRUCT
            BYTE0   :BYTE;
            TYP     :BYTE;
            ANZ     :WORD;
            DBNR    :WORD;
            BZ      :DWORD;
        END_STRUCT;        
        AnyPointerDestin AT DestinPointer: ANY;
    END_VAR
    Variablendeklaration


    Code:
        IDBPointer  := PV_COUNT;    //Zuweisung des Instanz-DB-Pointers zur Ermittlung der Nummer des Instanz-DBs
        
    
        //Initialisierung des ANY-Pointers auf den Quell-DB (Instanz-DB)
        SourcePointer.BYTE0     := 16#10;                    //Syntax-ID
        SourcePointer.TYP         := 16#02;                    //02 für Datentyp BYTE
        SourcePointer.ANZ         := 16#a;                    //Länge der zu kopierenden Daten 10Byte
        SourcePointer.DBNR         := AnyPointerIDB.DBNR;        //DB-Nummer (Nummer des eigenen Instanz-DBs)
        SourcePointer.BZ         := 16#2a;                    //Startadresse des Quell-DBs 42
        
        //Initialisierung des ANY-Pointers auf den Ziel-DB
        DestinPointer.BYTE0     := 16#10;    //Syntax-ID
        DestinPointer.TYP         := 16#02;    //02 für Datentyp BYTE
        DestinPointer.ANZ         := 16#a;    //Länge der zu empfangenden Daten 10Byte
        DestinPointer.DBNR         := 16#2;    //DB-Nummer DB2
        DestinPointer.BZ         := 16#22;    //Startadresse des Ziel-DBs 34    
       
    
        erg := SFC20(srcblk := AnyPointerSource, dstblk := AnyPointerDestin);    //Schiebe den Quell-DB in Ziel-DB
    Quellcode zum Befüllen des Quell-DBs

    Zwar gibt mir der Kompiler keine Fehlermeldung aus, jedoch werden die erwarteten Werte auch nicht im DB2 geschrieben/angezeigt.
    Ich weiß nicht, was ich noch falsch mache.
    Ich hoffe hier kann mir jemand bei meinem Problem helfen. Vielen Dank dafür schonmal im Voraus!
    Zitieren Zitieren Instanz DB in Global DB verschieben - blkmov in SCL  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    es fehlt die Angabe des Speicherbereichs: 84 - globalDB und 85 - IDB
    die Startadressen sollten auch in das richtige Format (Pointer: DWORD, 3BIT - Bitadresse, 16BIT - Byteadresse) gebracht werden
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. #3
    newirobi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.06.2014
    Beiträge
    7
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke für die schnelle Antwort jedoch weiß ich nicht genau, was du mit dem Speicherbereich meinst, der mir noch fehlen soll.

    es fehlt die Angabe des Speicherbereichs: 84 - globalDB und 85 - IDB
    Wofür soll der sein und wo muss ich den angeben?

  4. #4
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von newirobi Beitrag anzeigen
    Wofür soll der sein und wo muss ich den angeben?
    http://www.sps-forum.de/faq/12923-an...atentypen.html

    ich ging fälschlicherweise davon aus, dass man sich bereits mit dem Thema ANY-Zeigern beschäftigt hat
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  5. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    newirobi (30.07.2014)

  6. #5
    newirobi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.06.2014
    Beiträge
    7
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vielen DANK!!!
    Nach so einer Übersicht habe ich vorhin schon ewig gesucht...

    Jetzt funktioniert es auch so wie ich es haben wollte!

    Vielen Dank nochmal

  7. #6
    Registriert seit
    14.11.2008
    Beiträge
    66
    Danke
    3
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Dieses Zusammenbauen der Any-Pointer sollte in der Regel nicht nötig sein. Wenn die Werte in einem UDT stehen, muss nur der Name der UDT-Variablen an srcblk und dstblk übergeben werden. Step7 erzeugt den ANY-Pointer intern selbst, das gilt für SCL wie AWL.

    Selbst wenn es kein UDT ist, sondern nur eine anonyme STRUCT, funktioniert das. Bei Teilen von Arrays würde ich statt BLKMOV mit Bastelpointern eine FOR-Schleife nehmen. BLKMOV ist strikt langsamer als Alternativen, anders als C - memmove. Das Kopieren erfolgt nicht schneller als selbstgeschriebener Code und dazu kommt die Parameterübergabe.

  8. #7
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von Drutbluck Beitrag anzeigen
    BLKMOV ist strikt langsamer als Alternativen, anders als C - memmove. Das Kopieren erfolgt nicht schneller als selbstgeschriebener Code und dazu kommt die Parameterübergabe.
    GERÜCHT!
    schau in die Baugruppendaten der jeweiligen CPUs ... vor 6 Jahren haben wir diese Rechnung in diesem Forum auch schon aufgemacht. BLKMOV ist ab dem Wert x ... ich glaube mich zu erinnern, 12 Byte, schneller als Lade- und Transferbefehle.
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  9. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.207
    Danke
    927
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    Vergleich Ausführungszeit SFC20 BLKMOV vs. AWL-Schleife auf 315-2PN/DP (315-2EH13)
    Zitat Zitat von PN/DP Beitrag anzeigen
    Code:
    Normal verständliche AWL-Schleife    : 19,3ms
    Optimierte Schleife                  : 16,2ms
    2 INT-Werte gleichzeitig umspeichern :  8,7ms
    mit SFC20 umspeichern                :  2,7ms
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Tuffi (18.08.2014)

  11. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.742
    Danke
    143
    Erhielt 1.688 Danke für 1.226 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Vergleich Ausführungszeit SFC20 BLKMOV vs. AWL-Schleife auf 315-2PN/DP (315-2EH13)
    Mit welchem Baustein bekommt man denn eine zeitliche Auflösung bzw. Genauigkeit von unter 1ms hin?
    TIME_TCK und READ_CLK besitzen alle nur Millisekunden-Auflösung.

  12. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.207
    Danke
    927
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Den zu messenden Codeabschnitt 10 mal ausführen und dann die Ausführungszeit durch 10 teilen.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Daten von Instanz-DB nach Global-DB kopieren
    Von DiGo1969 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 20.05.2010, 06:21
  2. blkmov in SCL
    Von Felse im Forum Simatic
    Antworten: 31
    Letzter Beitrag: 25.03.2009, 14:20
  3. SCL : Instanz in Instanz
    Von Larry Laffer im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 16.02.2009, 11:01
  4. Global und Instanz DBs ?
    Von Insane im Forum Simatic
    Antworten: 22
    Letzter Beitrag: 07.01.2009, 13:27
  5. Global-DB vs. Instanz-DB
    Von b0den im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 16.06.2008, 13:17

Stichworte

Lesezeichen

Berechtigungen

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