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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 13 von 13

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

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    nach Durchsicht der Antworten habe ich noch mal beispielhaft eine "Operationsliste" gelesen. Ja, es ist tatsächlich denkbar, dass BLKMOV intern etwas schneller arbeitet als eine gut optimierte Schleife. Aber wenn schon eine optimierte Schleife fast 2x so lang braucht wie eine "normale", dann ist der Test und seine Folgerungen von begrenzter Aussagekraft. Ein Faktor 7, eine Grenze von 12 Byte erfordern ein passend "optimiertes" Vergleichsprogramm.

    BLKMOV ist oft das Mittel der Wahl, auch schon für 2-Byte-UDTs, weil es ohne unlesbaren/unwartbaren Code auskommt. SCL kann hier schneller sein, wenn es einfache L; T; -Befehle erzeugt. Das nächste Mittel wären automatisch erzeugte L; T; -Befehle in AWL, die sind übrigens laut meiner Beispielliste je nach CPU schneller oder zumindest nicht wesentlich langsamer als BLKMOV, selbst wenn die konstanten (mehr als) 75-90 µs ignoriert werden.

    AWL-Schleifen oder Zusammenbau von ANY-Pointern gehören für mich nur in Ausnahmesituationen, z.B. Compilerbau.

  2. #12
    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 Drutbluck Beitrag anzeigen
    Ja, es ist tatsächlich denkbar, dass BLKMOV intern etwas schneller arbeitet als eine gut optimierte Schleife. Aber wenn schon eine optimierte Schleife fast 2x so lang braucht wie eine "normale", dann ist der Test und seine Folgerungen von begrenzter Aussagekraft.
    Da hast Du irgendwas missverstanden, wenn Du die hingetrickste Schleife als "normale" Schleife betrachtest. Und selbst die hat noch ca. dreimal so lange wie BLKMOV gebraucht.

    Es ging da um das Umspeichern von ca. 2800 INT. Die Schleife, welche 2x schneller als die optimierte arbeitete, hat ungeachtet des Datentyps tricky immer gleich 2 INT gleichzeitig umgespeichert, was den AWL-Code noch zusätzlich schwerverständlich machte. Dieses Vorgehen kann man nicht verallgemeinern. Stell Dir mal die nötige Trickserei vor, wenn das ein ARRAY von 39999 BOOLs gewesen wäre...


    Zitat Zitat von Drutbluck Beitrag anzeigen
    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.
    Gut, sagen wir mal ich hätte ein Archiv als ARRAY von 1000 Datensätzen und ich möchte da 20 zusammenhängende Datensätze in verschiedene Sendepuffer zu anderen Maschinen herauskopieren. Ich würde dem Kopierbaustein die Nummer des ersten der 20 Datensätze geben (z.B. 140 für die Datensätze 140 bis 169) und irgendwie die variable Adresse des Ausgabe-Arrays (Sendepuffer).

    Wie müsste ein selbstgeschriebener Code aussehen, der das schneller oder gleich schnell wie BLKMOV erledigt?
    Code:
    TYPE "Datensatz"
    VERSION : 0.1
    
      STRUCT
       Timestamp : DATE_AND_TIME ;
       Messwert1 : REAL ;
       Messwert2 : REAL ;
       States : WORD ;
      END_STRUCT ;
    END_TYPE
    
    DATA_BLOCK "DB_Archiv"
    VERSION : 0.1
    
      STRUCT
       Archiv : ARRAY  [0 .. 999] OF "Datensatz";
      END_STRUCT ;
    BEGIN
    
    END_DATA_BLOCK
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    vierlagig (18.08.2014)

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wie "tricky" das ist, ist mir egal. Der größte Verlust an Wartbarkeit tritt ein, wenn derartiger Code in AWL geschrieben wird im Vergleich zu SCL. Das DINT-weise statt BOOL-weise zu kopieren, ist im Verhältnis dazu das kleinere Problem.

    Dass BLKMOV schneller sein kann als eine Schleife, glaube ich Euch, wie gesagt (unter den richtigen Bedingungen). Für das genannte Beispiel würde ich eine SCL-Schleife nehmen, die könnte aber mehrmals BLKMOV aufrufen und damit am langsamsten sein, ich glaube 18 Bytes ist gerade über der Grenze. Problem dabei: ich würde die "variable Adresse des Ausgabe-Arrays" so übergeben, dass es ohne Pointer geht, weil das sowohl die Wartbarkeit als auch die Effizienz minimiert. Wenn das nicht möglich ist, muss ich auf AWL umsteigen. Dann ist alles offen.

    Bei konstanten Adressen und nicht sehr großen Datensätzen ist eine Folge von L... T... Befehlen klar schneller als BLKMOV, aber ich nehme BLKMOV, weil ich noch keine bessere Idee mit vergleichbarer Wartbarkeit umgesetzt habe.

    Für den BLKMOV-Wettbewerb: einfach die schnellstmögliche DINT-Schleife erstellen. Dazu AR1, AR2, DB und DI soweit nötig sichern und benutzen. Ob, und interessanter: bis zu welcher Größe, die Schleife schneller ist als BLKMOV, kann nachmessen, wer will.

    Wo BLKMOV Zeit verliert, ist bei der Parametererstellung und -übergabe. Wo BLKMOV gewinnt, ist innerhalb der Schleife.

    Außerdem funktioniert BLKMOV, und damit SCL, in manchen Situationen aus unerklärlichen Gründen nicht (in FBs). Ob das an einer kaputten CPU-Firmware liegt oder einfach zum Step7-Design gehört, weiß ich nicht.

Ä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
  •