Auf der 1500 gibt es in SCL seit neuestem einen Befehl namens Runtime. Damit kann man messen wie lange die Ausführung eines Stückchen Codes dauert. Das muss zwei mal aufgerufen werden, einmal zum Start dann wieder zum Stop und dann bekommt man Sekunden zurück als REAL also mit Nachkommastellen. Die Auflösung dieser Messung liegt bei der 1500 scheinbar -- nee ich müsste offensichtlich -- im µs-Bereich. Das gefällt mir. Viel besser als das was ich früher immer probiert habe. (Mach was 1000 mal und schau die Zykluszeit an -- viel zu viel unbekannte Schwankungen.)
Mit dem bin ich mal an die verschiedenen Möglichkeiten alte AWL Unsitten und sonstige Tipps und Tricks aus dem Berger Büchern nachzumessen. Dabei komme ich aus dem staunen nicht mehr raus.
Also klar ist, dass Runtime irgendwie Echtzeitmessungen macht. Wer also außer dem OB1 noch andere Zyklische OB hat, der bekommt heftige Ausreißer. Zum Messen immer nur einen OB verwenden
Auf der Messe wird gesagt, die 1516 sei so schnell wie eine 317. Das stimmt tendenziell aber das stimmt bei verschiedenen Gelegenheiten überhaupt nicht. Ausgehend von den Zykluszeitmessungen habe ich folgende grobe Erkenntnisse für die 1516 gewonnen.
Lese-Zugriffe in optimierte DB sind in etwa Faktor 3 schneller als in nicht optimierte DB.
Schreib-Zugriffe auf einzelne Bool sind in optimierte DB sind in etwa Faktor 6 schneller als in nicht optimierte DB.
Schreib-Zugriffe auf anderes als Bool sind in optimierte DB sind in etwa Faktor 2-4 schneller als in nicht optimierte DB.
Zugriffe auf Eingänge Ausgänge und Merker sind genauso langsam wie nicht optimierte DB.
AWL ist oft langsamer als SCL/KOP/FUP. Wenn man Glück hat, dann ist AWL genauso schnell wie SCL/KOP/FUP. Also Beispiel: Ein KOP-Netz mit einer Multiplikation, wobei zwei Werte aus zwei DB und das Ergebnis in einen dritten DB geschrieben wird sind in allen Sprachen gleich schnell. (Da Runtime nicht im KOP geht -- Hey Siemens warum denn das nun wieder? -- wickelt man das Messobjekt in einen Aufruf ein, und rechnet die ungefähr 4µs für den Bausteinaufruf ab)
Typische AWL Zugriffe wie die oben beschriebenen, also das Wort mal als Wort und dann wieder als 16 einzelne Bits zu verwenden kann man nur im nicht optimierten Speicher machen. Wenn man also auf die 16 Bits einzeln zugreift, dann dauert das 16*3 = 48 so lange wie der Wortzugriff. Aber hallo!
Legt man ein 16 Bool Array nun im optimierten Speicher an, dann dauert die SCL-Schleife über die 16 Bools auch 16 mal so lange wie ein Zugriff auf ein Wort. Deutlich besser als 48.
So kleine SCL-Schleifen sind verglichen mit der 317 rasend schnell. Ich habe keine Ahnung was da auf der 317 für ein AWL dahintersteckt, aber die 1516 brauchte nur ein zehntel der Zeit. (Ich konnte zehn mal soviele Durchläufe machen um auf die gleiche Zykluszeit zu kommen. Vergleichende Messung zwischen 317 und 1516 sind saumäßig schwer.
Was die 1516 am allerwenigsten mag sind Adressregister. Ich bin noch nicht dahintergestiegen; wann und wie und was. Aber ein migriertes AWL Programm hat zwar funktioniert -- ich geb ja zu, dass ich drei Anläufe gebraucht habe um es zu migrieren -- aber dann hat es funktionert. Die Zykluszeit des Programm war jedoch auf der 1516 deutlich schlechter als bei der 317 :-( Nach einigem suchen (Danke für Runtime) habe ich ein paar AWL Bausteine identifiziert. Dann hab ich mir genau angesehen, was diese AWL Teile eigentlich versuchen. Viel Adressregisterakrobatik, Anypointer zusammensetzen und auseinandernehmen, misteriöse SFC Aufrufe. Ein Baustein fiel besonders aus dem Rahmen, voller AR Verwendung. Die Ganze unsägliche Adressregisterorgie diente dazu einen Arrayzugriff auf das Element i zu bekommen, i wurde errechnet aus verschiedenen Inputs. Mal so, mal so. Also habe ich aus den 70 AWL Zeilen 10 SCL Zeilen gemacht, so mit IF-THEN-ELSE und #feld[ #index ]. Und plötzlich war die Zykluszeit verschwunden ... also für diesen Baustein in abgemagerter Testumgebung kleiner als 1ms. Auf der 317 dauerte es immernoch 58ms die gleiche Anzahl von Calls zu machen. Also zwischen der AWL Version und der SCL Version liegt in diesem Falle der Faktor 70
Zurück zum Problem: Wie setzt man 16 Bools in einem Array auf FALSE? Man schreibe eine Schleife in SCL.
Wie setzt man 16 Bools in einer Struktur auf FALSE. Man schreibe "dbname".strukturname.namedeserstenbools := FALSE; "dbname".strukturname.namedeszweitenbools := FALSE; ...
Kann man in der Sprache seiner Wahl machen, hier gibt es keinen Unterschied zwischen KOP/FUP/SCL/AWL!
Ja, das ist verdammt viel tippen. Aber es wird auf der 1516 im optimierten DB schneller ausgeführt als das AT auf der 317.
Das bringt mich zu der Frage. Wer kann das erklären?
Ich bilde mir ein irgendwo (vielleicht sogar hier) gelesen zu haben, dass die 317 (oder war das die 319) und die 1516 sogar die gleiche Hardwarebasis -- sprich Prozessor -- haben. Weiß einer, was in der 1516 für ein Prozessor drin ist?