Benchmark
Wie macht der SFC20 das eigentlich in 1/7 der Zeit einer Schleife?
Ist in dem SFC nicht auch nur "normaler" AWL-Code? Wenn ja, AWL ist ja bekanntlich sehr Maschinencode-nahe.
Vielleicht hat der in S7-300 verbaute Prozessor einen Blockmove-Befehl im Microcode (MOVSB)?
Vielleicht arbeitet die SFC20 auch mit Speicheradressen in einem Flat-Modell und muß nicht für
jeden Speicherzugriff die DBx.DBWy-Adresse auf die tatsächliche Speicheradresse umrechnen?
Auch AWL ist nur eine (Hardware-nah aussehende) Interpretersprache. Der SFC20 ist aber schon
in echtem Maschinencode in der Firmware der CPU enthalten.
Das für uns Programmierer zugängliche AR1-Register enthält nur den "halben" Pointer (nur den
Offset zum Beginn des DB). Der Prozessor muß bei jedem AWL-Zugriff auf den Speicher den Wert im
AR1 prüfen, die Nummer des aktuell geöffneten DB (Selektor) ermitteln, dann aus einer Tabelle die
Anfangsadresse dieses DB auslesen und zum Offset aus dem AR1 addieren. Der SFC20 macht diese
Prüfung und Berechnung nur einmal.
Ich hatte mal für eine Thema, wo es um das Umspeichern von 2879 INT-Werten in einem FIFO ging,
auf einer echten CPU 315-2PN/DP (315-2EH13) verschiedene Programmversionen programmiert und
die benötigte Bearbeitungszeit gemessen:
jede Minute einen Datensatz aufzeichnen
Code:
Normal verständliche AWL-Schleife : 19,3ms
Optimierte Schleife : 16,2ms
2 INT-Werte gleichzeitig umspeichern : 8,7ms
mit SFC20 umspeichern : 2,7ms
Daher kommt meine Aussage, daß der SFC20 nur ein siebtel der Bearbeitungszeit einer in AWL
programmierten Programmschleife benötigt.
Manche Sachen muß man einfach in der Praxis ausprobieren, um solche Erkenntnisse zu gewinnen.
Gruß Harald