TIA in AWL Array elemente Addieren

batindeko

Level-2
Beiträge
106
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte gerne in einem Array of Real, alle meiner 50 Array-Elemente addieren jedes Mal wenn in dem Array geschrieben wird.
in SCL hätte ich es mit einer FOR-schleife gelöst. Aber in diesem Fall muss ich es in AWL schreiben.
was kann ich als Lösung wenden. Ich möchte keine schleife in AWL benutzen denn es könnte zu Probleme führen. Welche Alternative habe ich noch?
 
Servus,

zu welchen Problemen könnte denn eine Schleife in AWL führen?
Ohne Schleife bleibt dir wahrscheinlich nichts anderes über, als deine 50 Elemente einzeln zu addieren.

Ein FC programmiert in SCL der in AWL aufgerufen wird ist wohl auch keine Option.
 
Die Taktung ist bei mir sehr schnell für einige Regelungsprozesse und hat schon in der vergangenheit für ein paar Sekunden zu falschen Messwerte geführt haben wegen Auslatung der CPU deswegen würde ich vorerst nicht einsetzen.
Servus,

zu welchen Problemen könnte denn eine Schleife in AWL führen?
Ohne Schleife bleibt dir wahrscheinlich nichts anderes über, als deine 50 Elemente einzeln zu addieren.

Ein FC programmiert in SCL der in AWL aufgerufen wird ist wohl auch keine Option.
Würde ein FC programmiert in SCL in einem AWL Programm nicht funktionieren?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was sind das denn für Elemente? Was soll bei einem Überlauf passieren?
es handelt sich um Temperaturen, ich möchte eine Fehlerbehandlung damit erreichen. Die ersten 50 Temperaturen in einem Array speichern und addieren wenn Sie nicht alle gleich null sind dann kann ich sie in einem anderen DB kopieren sonst schreiben einen 7FFF um einen Fehler zu melden
 
Meinst Du, eine FOR-Schleife in SCL wäre schneller als eine Schleife in AWL? Was für Probleme befürchtest Du?
Was für eine SPS programmierst Du überhaupt?
Wo liegt denn Dein Array of Real? In einem Global-DB?
Problem in AWL: AWL kann nicht mit Arrays umgehen, sondern nur mit Adressen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Taktung ist bei mir sehr schnell für einige Regelungsprozesse und hat schon in der vergangenheit für ein paar Sekunden zu falschen Messwerte geführt haben wegen Auslatung der CPU deswegen würde ich vorerst nicht einsetzen.
Also, die Addierung durch ein SCL Schleife dauert zu lange für die Regelungsprozess. Durch Umsetzung auf AWL willst du die Addierung schneller machen ?
Lautet eigenartig. Eine kleine und einfache SCL Schleife sollte nicht auf die CPU Zyklus spuhrbar sein. Oder ist es vielleicht eine S7-1200 ?
 
Meinst Du, eine FOR-Schleife in SCL wäre schneller als eine Schleife in AWL? Was für Probleme befürchtest Du?
Was für eine SPS programmierst Du überhaupt?
Wo liegt denn Dein Array of Real? In einem Global-DB?
Problem in AWL: AWL kann nicht mit Arrays umgehen, sondern nur mit Adressen.

Harald
ich arbeite mit CPU 1500. Mein Array liegt in einem Global-DB. Ich befürchte dass es zum lange in der Schleife hängt und zum unerwünschte Verhalten bzw. Messwerte liefert auch wenn es kurzzeitig dauert.
Wenn AWL kann mit Addresse umgehen heißet es pointer auf die Adresse zeigen und den Inhalt addieren? wenn ja wie setze ich das um ?
 
ich arbeite mit CPU 1500. Mein Array liegt in einem Global-DB.
Ist diese Global-DB optimiert ?
Wenn nicht, wenn du auf optimiert wechselst wird die Abarbeitung um ein Faktor 10 schneller.

Ich befürchte dass es zum lange in der Schleife hängt und zum unerwünschte Verhalten bzw. Messwerte liefert auch wenn es kurzzeitig dauert.
Das Programm 'hängt' nicht in eine Schleife. Eine SCL Schleife mit 50 mal Additionen ist für eine S7-1500 triviell.

Ich denke du hast etwas unerwünschtes erlebt (welches ?), und jetzt bist du auf diese SCL Schleife fokusiert als der Sünder.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
es handelt sich um Temperaturen, ich möchte eine Fehlerbehandlung damit erreichen. Die ersten 50 Temperaturen in einem Array speichern und addieren wenn Sie nicht alle gleich null sind dann kann ich sie in einem anderen DB kopieren sonst schreiben einen 7FFF um einen Fehler zu melden

Also bei der 1500 werden alle Programmiersprachen direkt in Maschinencode übersetzt. Es dürfte also egal sein, welche Sprache verwendet wird, man sollte deshalb auf Übersichtlichkeit setzen, in Deinem Fall bei 50 Array Elementen addieren in Schleife mit Arrayindex in SCL.

Sind das 50 verschiedene Temperaturen?
Oder ist das eine zeitliche Abfolge?

Es ist schon ein extremer Zufall, wenn alle 50 Temperaturen (Real-Werte) = 0 sind. Du meinst bestimmt, dass die Summe der Temperaturwerte ca. 0 sein muss.
 
ich möchte gerne in einem Array of Real, alle meiner 50 Array-Elemente addieren jedes Mal wenn in dem Array geschrieben wird.
in SCL hätte ich es mit einer FOR-schleife gelöst. Aber in diesem Fall muss ich es in AWL schreiben.
für S7-1500, ungetestet:
Code:
//AWL
// #tmpSumme := 0.0; initialisieren
      L     0.0
      T     #tmpSumme

// ptr := Address("MyDB".RealArray); Pointer AR1 auf "MyDB".RealArray setzen
      AUF   "MyDB"
      L     P#DBX0.0             //(P#0.0 geht auch) Offset des RealArray in "MyDB" per Hand einsetzen
      LAR1                       //DBNO + AR1 zeigen jetzt auf das erste Element des RealArrays in MyDB

// For #tmpLoopCount := 50 TO 1 BY -1 DO
      L     50                   //50 Elemente addieren
LSUM: T     #tmpLoopCount

      L DBD [ AR1 , P#0.0 ]      //#tmpSumme += *ptr;
      L     #tmpSumme
      +R
      T     #tmpSumme

      +AR1  P#4.0                //ptr auf nächstes Element im RealArray setzen

      L     #tmpLoopCount
      LOOP  LSUM                 //END_FOR;  (#tmpLoopCount - 1) = 0 ?

      L     #tmpSumme
      T     "MyDB".Summe
entspricht etwa in SCL:
Code:
//SCL
#tmpSumme := 0.0;
FOR #tmpLoopCount := 0 TO 49 DO
    #tmpSumme += "MyDB".RealArray[#tmpLoopCount];
END_FOR;
"MyDB".Summe := #tmpSumme;

"MyDB" ist nicht optimiert, weil AWL geht nicht mit "optimiert"
AWL: als FC 180 Byte Arbeitsspeicher
SCL: als FC 189 Byte Arbeitsspeicher
SCL mit optimiertem DB?

Wer Lust hat kann ja mal mit einer realen S7-1500-CPU die Performance messen, ob da wirklich ein Faktor 10 schneller bei rauskommt.

Harald
 
Zuletzt bearbeitet:
Also bei der 1500 werden alle Programmiersprachen direkt in Maschinencode übersetzt. Es dürfte also egal sein, welche Sprache verwendet wird, man sollte deshalb auf Übersichtlichkeit setzen, in Deinem Fall bei 50 Array Elementen addieren in Schleife mit Arrayindex in SCL.

Sind das 50 verschiedene Temperaturen?
Oder ist das eine zeitliche Abfolge?

Es ist schon ein extremer Zufall, wenn alle 50 Temperaturen (Real-Werte) = 0 sind. Du meinst bestimmt, dass die Summe der Temperaturwerte ca. 0 sein muss.
wir haben eine cpu 1516 DP/PN mit einem alten RS485 buskoppler angeschlossen. Und es ist schon mal passiert die Datenübertragung schiefgelaufen ist und bei den ersten 50 Temperaturen 0 schreibt. Deswegen möchte ich es verhindern in dem ich die Summe aller ersten 50 Temperaturen summiere um sicher zu sein dass der Buskoppler keine Störung aufweist und damit mit Drahtbruch reagieren kann
 
Zuviel Werbung?
-> Hier kostenlos registrieren
für S7-1500, ungetestet:
Code:
//AWL
// #tmpSumme := 0.0; initialisieren
      L     0.0
      T     #tmpSumme

// ptr := Address("MyDB".RealArray); Pointer AR1 auf "MyDB".RealArray setzen
      AUF   "MyDB"
      L     P#DBX0.0             //(P#0.0 geht auch) Offset des RealArray in "MyDB" per Hand einsetzen
      LAR1                       //DBNO + AR1 zeigen jetzt auf das erste Element des RealArrays in MyDB

// For #tmpLoopCount := 50 TO 1 BY -1 DO
      L     50                   //50 Elemente addieren
LSUM: T     #tmpLoopCount

      L DBD [ AR1 , P#0.0 ]      //#tmpSumme += *ptr;
      L     #tmpSumme
      +R
      T     #tmpSumme

      +AR1  P#4.0                //ptr auf nächstes Element im RealArray setzen

      L     #tmpLoopCount
      LOOP  LSUM                 //END_FOR;  (#tmpLoopCount -= 1;) = 0 ?

      L     #tmpSumme
      T     "MyDB".Summe
entspricht etwa in SCL:
Code:
//SCL
#tmpSumme := 0.0;
FOR #tmpLoopCount := 0 TO 49 DO
    #tmpSumme += "MyDB".RealArray[#tmpLoopCount];
END_FOR;
"MyDB".Summe := #tmpSumme;

"MyDB" ist nicht optimiert, weil AWL geht nicht mit "optimiert"
AWL: als FC 180 Byte Arbeitsspeicher
SCL: als FC 189 Byte Arbeitsspeicher
SCL mit optimiertem DB?

Wer Lust hat kann ja mal mit einer realen S7-1500-CPU die Performance messen, ob da wirklich ein Faktor 10 schneller bei rauskommt.

Harald
Danke ! ich probiere es!
 
Wer Lust hat kann ja mal mit einer realen S7-1500-CPU die Performance messen, ob da wirklich ein Faktor 10 schneller bei rauskommt.
Ich habe einige Tests gemacht und habe eine Performanceerhöhung gemessen um ungf. Faktor 10 für boolsche Anweisungen und Faktor 3 für alle andere. Ja vielleicht ist ein Faktor 10 zu viel, aber ein Faktor 2 oder 3 wurde ich erwarten.

wir haben eine cpu 1516 DP/PN mit einem alten RS485 buskoppler angeschlossen. Und es ist schon mal passiert die Datenübertragung schiefgelaufen ist und bei den ersten 50 Temperaturen 0 schreibt
Kommt es kein Busfehler oder Hardwarefehler ?

Ein 1516 kann 50 REAL Werte durchschleifen viel schneller als die Übertragung von die Werte über Profibus egal ob SCL oder AWL.
 
Ich habe einige Tests gemacht und habe eine Performanceerhöhung gemessen um ungf. Faktor 10 für boolsche Anweisungen und Faktor 3 für alle andere. Ja vielleicht ist ein Faktor 10 zu viel, aber ein Faktor 2 oder 3 wurde ich erwarten.


Kommt es kein Busfehler oder Hardwarefehler ?

Ein 1516 kann 50 REAL Werte durchschleifen viel schneller als die Übertragung von die Werte über Profibus egal ob SCL oder AWL.
rs485 ist kein Busprotokoll sondern eine serielle schnittstelle und bei diesem BK8000 Buskoppler gibt es keine Kommunikation Überwachung so viel ich weiß das sollte man sich selber bauen. Die Fehlermeldung heißt Übertragungsfehler(z.B Paritätsbitfehler)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In deinem Fall brauchst du ja nicht alle 50 zu addieren. Sobald ein Element ungleich 0 ist, müsste es ja passen. Ist die Schnittstelle nicht änderbar? Normal baut man bei sowas ein Lebenszeichen-Bit ein.
 
ich arbeite mit CPU 1500. Mein Array liegt in einem Global-DB. Ich befürchte dass es zum lange in der Schleife hängt und zum unerwünschte Verhalten bzw. Messwerte liefert auch wenn es kurzzeitig dauert.
Wenn AWL kann mit Addresse umgehen heißet es pointer auf die Adresse zeigen und den Inhalt addieren? wenn ja wie setze ich das um ?
In der S7-1500 kannst Du die Arrayelemente auch variabel in AWL ansprechen. Da brauchst Du keinen Pointer. Nur nen AWL LOOP... (und dann auch mit "optimiertem" DB)

Aber schneller als in SCL ist das bestimmt nicht.

Die Frage, was ist für Dich "schnell genug"
 
Zuletzt bearbeitet:
In deinem Fall brauchst du ja nicht alle 50 zu addieren. Sobald ein Element ungleich 0 ist, müsste es ja passen. Ist die Schnittstelle nicht änderbar? Normal baut man bei sowas ein Lebenszeichen-Bit ein.
👍
Wobei für REAL nen Vergleich auf Gleichheit immer problematisch ist. Würd vielleicht eher x>0.01 OR x<0.01 abfragen...
 
Zurück
Oben