MIN, MAX, LIMIT --> Zeiten

SPS-newbie

Level-1
Beiträge
23
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

in einem Projekt sollen CFC Pläne in SCL mit möglichst hoher Performance gewandelt werden. Jetzt stellt sich für mich die Frage, ob die Funktionen MIN, MAX. LIMIT langsamer oder schneller sind als einfache If Statements.
Habe auch schon in der einschlägigen Literatur gesucht aber leider nichts dazu gefunden.
Vielleicht liegt jmd. von euch die genauen Zeiten für die Befehle auf einer IM151/8 CPU vor.

Vielen Dank schon mal im vorraus!
Gruß
SPS-newbie
 
Jetzt stellt sich für mich die Frage, ob die Funktionen MIN, MAX. LIMIT langsamer oder schneller sind als einfache If Statements.
Probiere es doch einfach aus.

Mach' ein Testprojekt, rufe 1000x die Funktionen auf und 1000x den alternativ-Code,
lade es in eine echte CPU, laß es abwechselnd laufen und schau dabei auf die Zykluszeit.

Gruß
Harald
 
Danke für Eure Antworten,

ist AWL wirklich soviel perfomanter wie SCL???
ich meine wieviel Ersparnis hab ich denn aus Erfahrung wenn man ein Programm mit ca 100 Rechenoperationen hat??

Spart man nur bei Rechenoperationen oder auch bei Peripheriezugriffen??

z.B.
L PID 10
T DB10.DBD 10

zu
DB10.DBD10 := DWORD_TO_REAL(PIW10);

Gruß
SPS-newbie
 
Hallo nochmal,

also ich hab mir etz gedacht ich probier einfach mal eine mathematische Funktion in SCL und in AWL aus -> kopiere diese 10 mal un messe mit RDSYS die Zeit hier das erstaunliche Ergebnis:
hier der SCL Code:
Code:
tmp := SQRT(2.0);
tmp1 := SQRT(1200);
tmp2 := 10*0.001+2*tmp**tmp1;

und hier in AWL:
Code:
      L     2.000000e+000
      SQRT  
      T     #tmp
      L     1200
      SQRT  
      T     #tmp1
      L     #tmp
      LN    
      L     #tmp1
      *R    
      EXP   
      L     2
      *R    
      T     #Save
      L     10
      L     1.000000e-003
      *R    
      L     #Save
      *R    
      T     #tmp2


das Ergebnsi is tlaut RDsys benötigt AWL ca 1350 us und SCL etwa zwischen 800 und 900us.

Könnt ihr euch diese tatsache erklären??
OK, AWL benötigt den LN um x^y zu rechnen, muss ich aber mit berücksichtigen, denn diese Operation kommt bei mir im Programm auch öfter vor.

Viele Grüße
SPS-newbie
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
wie sieht denn der awl code aus der übersetzung des scl-codes aus?

dieses scl anweisung
DB10.DBD10 := DWORD_TO_REAL(PIW10);
ergibt diesen code. fragen? keine!
Code:
      SET   
      SAVE  
      =     L      0.1
      L     PED   10
      T     DB10.DBD   10
      SAVE  
      BE
 
Code:
*
//tmp := SQRT(2.0);
      L     1.414214e+000
      T     #tmp
//tmp1 := SQRT(1200);
      L     3.464102e+001
      T     #tmp1
//tmp2 := 10*0.001+2*tmp**tmp1;
      L     #tmp
      LN    
      TAK   
      *R    
      EXP   
      L     2.000000e+000
      *R    
      L     1.000000e-002
      +R    
      T     #tmp2

interessant ist, dass der compiler bei festzahlen schon das ergebnis einträgt und nur noch speichert ... klingt komisch, ist aber so ... manchmal sollte man eben auch beim schreiben von AWL-code nachdenken, was nun sinnvoll ist...
 
Danke vierlag und volker,

ich hab's grad selbst bemerkt das der Compiler die Werte sofort ausrechent und das Ergebnis speichert, bin ja noch net so lange im Geshäft damit. Nun habe ich mal Variablen stattdessen eingetragen und nun hab ich den Salat --> SCL ist bei diesem Code ca 30-40 % langsamer wie AWL!

muss nun überlegen ob ich das komplette Programm umschreibe!

Veieln Dank nochmals und Gruß
SPS-newbie
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie sind denn deine Compilereinstellungen?

- "Objektcode optimieren" angehakt?
- "Feldgrenzen überwachen" abgewählt?
- "Debug Info erstelen" abgewählt?
- "OK Flag setzen" abgewählt?

Das wären die Einstellungen um kleinen Code zu erhalten.
 
danke, doch genau diese Compilereinstellungen habe ich schon ausgewählt (aus dem S7-SCL V5.3 für S7-300/400 Handbuch)! Wie gesagt, ich versuche jettz mal den code ineigermasen leserlich von SCL in AWL umzuschrieben um dann zu sehen ob ich die geforderte Zeit von < 1ms einhalten kann (ca 750 us wären echt super)

Gruß
SPS-newbie
 
Wobei zu deiner Frage, ob die Funktionen MIN, MAX, LIMIT langsamer oder schneller sind, zu sagen wäre, dass ein ausprogrammieren dieser Funktionen immer schneller sein wird als ein Funktionsaufruf, da dieser Aufruf auch wieder Code erzeugt.
Allerdings wirst du durch das Ausprogrammieren (nicht trivialer) Funktionen mehr Speicherplatz benötigen, und so eine Programmierweise widerspricht auch dem Bibliotheksgedanken.
Da muss man abwägen ob einem ein schnelles Programm oder wenig Speicherplatz wichtiger ist.

In C gibt es zu diesem Zwecke inline Funktionen, d.h. der Compiler setzt den Code aus der aufgerufenen Funktion an der entsprechenden Stelle im Programm ein. Ggf. macht der Optimierer das mit einer passenden Übersetzungsfunktion selbständig.
Der Siemens SCL-Compiler ist aber relativ dumm, außer dass er Konstanten zusammenfasst macht er so gut wie keine Optimierung.
 
Zurück
Oben