Und wenn man die Parameter byval übergibt, muss man ja nicht nur den Baustein innen betrachte, sondern auch den Aufruf außen, denn dieser wird ja durch den byval Aufruf größer und langsamer!
Das ist sonnenklar, doch anscheinend hat hier noch niemand fundierte Erfahrung was denn nun wirklich schneller ist bei S7-1x00:
- byVal: aufwendige langsamere Parameterversorgung beim Bausteinaufruf und dafür im Baustein 10 einfache schnellere Parameterzugriffe
oder
- byRef: einfache schnellere Parameterversorgung beim Bausteinaufruf und dafür im Baustein 10 aufwendigere langsamere Parameterzugriffe
TIA-SCL habe ich gerade nicht greifbar. Vielleicht hat ja jemand Lust die selben Vergleiche für S7-1x00 zu machen.
Ich habe es mal gemacht.
Der TIA-SCL-Compiler (V13 SP1 Upd8 ) für S7-1x00 optimiert anscheinend gar nicht die Zugriffe auf Übergabeparameter, und es scheint direkt OpCodes oder Zwischencode für das Lesen aus ByRef-Übergabeparametern zu geben (bzw. für das Addieren von Variablen aus Übergabeparametern), es kommt immer die fast gleiche Codegröße raus, egal ob byRef- oder byVal-Übergabeparameter.
Jede SCL-Addition "
+ #IntVariable" erzeugt Programmcode von 10 Byte Arbeitsspeicher, egal ob der Zugriff auf eine byRef- oder byVal-Übergabe-Variable oder eine Static-Variable erfolgt, und egal ob "optimierter" oder Standard-Bausteinzugriff eingestellt ist. Wenn die Variable in Temp liegt, dann werden 9 Byte Code erzeugt (nicht immer (*)). Die Größe des erzeugten Codes ist anscheinend nicht äquivalent zur Ausführungszeit.
Hier der Vergleich der Codegrößen TIA-SCL V13 SP1 Upd8 für S7-1500 und S7-1200, FB multinstanzfähig.
Code:
S7-1500 | S7-1200
Arbeits- Ausführg-|Arbeits- Ausführg-
Beispiel speicher zeit |speicher zeit
Bytes | Bytes
ByRef SCL optimiert 103 ? 39 ? Übergabe 1 Struct, Summe 3 INT aus dem Struct
ByRef SCL Standard 103 ? 39 ?
ByVal SCL optimiert 104 ? 40 ? Übergabe 1 Struct, Summe 3 INT aus dem Struct
ByVal SCL Standard 103 ? 39 ?
ByVal AWL optimiert 114 ? -
ByVal AWL Standard 114 ? -
ByRef 9 SCL optimiert 163 ? 97 ? Übergabe 9 Struct, Summe je ein INT aus jedem Struct
ByRef 9 SCL Standard 163 ? 97 ?
ByVal 9 SCL optimiert 164 ? 100 ?
ByVal 9 SCL Standard 164 ? 100 ?
leerer FB SCL optimiert 82 18
leerer FB SCL Standard 82 18
leerer FB AWL optimiert 82 -
leerer FB AWL Standard 87 -
leerer FB SCL S7-300 48 / 12 Bytes MC7
leerer FB AWL S7-300 38 / 2 Bytes MC7
Leider habe ich keine S7-1500 CPU zur Verfügung, vielleicht ermittelt mal jemand die Ausführungszeiten? (die Programm-Quellen im Anhang)
(*) Bei S7-1200-Bausteinen (aber nicht bei S7-1500) mit "optimiertem" Bausteinzugriff ignoriert der SCL-Compiler anscheinend "sinnlose" Anweisungen im Zusammenhang mit Temp-Variablen, z.B. Zuweisungen an Temp-Variablen und dann nie wieder lesen benötigen 0 Byte Code, addieren von nicht-initialisierten Temp-Variablen benötigen 0 Byte Code (keine Warnungen)
Harald