TIA CPU RAM hoch ausgelastet

  • Ersteller Ersteller Gelöschtes Mitglied 129338
  • Erstellt am Erstellt am
G

Gelöschtes Mitglied 129338

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,
an einer unserer Linien ist bei einer SPS der Arbeitsspeicher stark ausgelastet (>85%) und da stelle ich mir die Frage ob es möglich ist den Arbeitsspeicher zu erweitern?
Ausserdem interessiert mich ob ein stark ausgelasteter RAM auch Einfluss auf die Zykluszeit haben kann?

Im Internet konnte ich nichts dazu finden.
Verbaut ist eine 1518f-4 pn/dp.
 
Man kann nur den Ladespeicher durch tausch der Speicherkarte erweitern aber nicht den Arbeitsspeicher.

Die Auslastung des Arbeitsspeichers hängt unmittelbar mit dem Umfang des Anwenderprogramms zusammen.
Die Zykluszeit hängt davon ab, wie viele Anweisungen ausgeführt werden müssen.

Wobei nicht gesagt ist, dass alle Anweisungen im Arbeitsspeicher auch immer ausgeführt werden.
So können bestimmte Programmteile bedingt ausgeführt werden und andere Programmteile werden eben nicht aufgerufen.
Dazu müsst man das Programm analysieren um hier eine Aussage zu tätigen.

Die eingesetzte CPU hat 26MB Arbeitsspeicher, da habt ihr aber fleißig programmiert ;-))
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man kann nur den Ladespeicher durch tausch der Speicherkarte erweitern aber nicht den Arbeitsspeicher.
Das wäre auch zu schön gewesen

Die eingesetzte CPU hat 26MB Arbeitsspeicher, da habt ihr aber fleißig programmiert ;-))
Wohl wahr.

Eine weitere Frage hätte ich in dem Zuge..
1665225186103.png

Aus einem Handbuch entnehme ich folgende Informationen bezüglich der Bearbeitungszeit der 1518er CPU.

Wie sieht es nun für String, Real usw. Datentypen aus? Wie lässt sich hier die Bearbeitungszeit ableiten/bestimmen? Mir geht es vor allem darum Zykluszeitfresser ausfindig zu machen im Anwenderprogramm.

Beispielsweise wenn Siemens Funktionen im Anwenderprogramm zyklisch abgearbeitet werden
 
Eine 1518 an den Rand des Abgrunds zu bringnen, dazu gehört schon Einiges! Ob du da einzelne Dinge ausmachen kannst? Oft ist dann eher das eigene System (Framework), das u.U. nicht besonders effektiv mit den Rssourcen umgeht. Ich bin mal gespannt, was du findest.
WIe ist denn die derzeitig Zykluszeit?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine 1518 an den Rand des Abgrunds zu bringnen, dazu gehört schon Einiges!
Meistens, weil man die SPS für irgendwas einsetzt, wofür der Erfinder sie nicht gemacht hat...
Oder man sich Supermonsterallinclusivbausteine ausgedacht hat...
Oder das halbe Werk mit einer SPS steuern will...
 
Eventuell irgendein System im Einsatz welches Maschinendaten ausliest? Vlt über MQTT? Irgendwas mit vielen Strings?
 
Meistens, weil man die SPS für irgendwas einsetzt, wofür der Erfinder sie nicht gemacht hat...
Oder man sich Supermonsterallinclusivbausteine ausgedacht hat...
Oder das halbe Werk mit einer SPS steuern will...
Noch mehr Gründe fallen dir nicht ein? Da bin ich aber enttäuscht
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,
an einer unserer Linien ist bei einer SPS der Arbeitsspeicher stark ausgelastet (>85%) und da stelle ich mir die Frage ob es möglich ist den Arbeitsspeicher zu erweitern?
Ausserdem interessiert mich ob ein stark ausgelasteter RAM auch Einfluss auf die Zykluszeit haben kann?

Im Internet konnte ich nichts dazu finden.
Verbaut ist eine 1518f-4 pn/dp.
Mhm. Welcher Arbeitsspeicher ist zu 85% voll? Code oder Daten?

Code ist nicht erweiterbar. Datenspeicher lassen sich mit Firmware 2.9 und TIA 17 statt der 20 MB 60 MB freischalten.

Voller RAM hat keine direkte Auswirkung. Es ist klar - je mehr Code umso mehr Laufzeit ist logisch. Man kann aber auch mit mini-Programmen die Zykluszeit hoch drehen.

Ich hatte zuletzt einige CPUs (1510SP) mit Codespeicher auf 99,6%. War kein Problem. Änderungen laden ist trotzdem kein Problem.
 
Ich hatte zuletzt einige CPUs (1510SP) mit Codespeicher auf 99,6%. War kein Problem. Änderungen laden ist trotzdem kein Problem.
Ladespeicher sollte halt mehr als 50% frei sein... Arbeitspeicher ist nicht das Problem.
99,6% würd ich trotzdem nicht ausliefern. Wenn bei Inbetriebnahme oder TIA Update oder späteren Änderungen noch bissl was dazu kommt, stehst da... Hätt ich dann auf ne 1512SP umgeschwenkt.
Bei uns fordern eigentlich alle Kunden 20% Reserve. Egal ob im Schaltschrank oder der SPS....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Noch mehr Gründe fallen dir nicht ein? Da bin ich aber enttäuscht
Die drei Punkte decken eigentlich alle konzeptionellen Fehler ab, die mir so abundzu unterkommen 😉
Mal von "Programmierdummheiten" wie Monsterschleifen oder IF THEN ELSE Orgien aus Unkenntnis abgesehn.
 
Zuletzt bearbeitet:
Ladespeicher sollte halt mehr als 50% frei sein... Arbeitspeicher ist nicht das Problem.
99,6% würd ich trotzdem nicht ausliefern. Wenn bei Inbetriebnahme oder TIA Update oder späteren Änderungen noch bissl was dazu kommt, stehst da... Hätt ich dann auf ne 1512SP umgeschwenkt.
Bei uns fordern eigentlich alle Kunden 20% Reserve. Egal ob im Schaltschrank oder der SPS....
Ich gebe dir recht. Handelt sich um die ersten 8 Stück eines Serienproduktes mit den 99%. Ab Nr. 9 wurde auf 1512 umgestellt.
Auf die schnelle mal 8 F-CPUs tauschen bei aktuellen Lieferzeiten ist halt so eine Sache....
Ladespeicher 65% (bei 12 MB Karten) macht in der Praxis massiv Schwierigkeiten.

Was sich gezeigt hat, ist halt folgendes Verhalten:
Wenn Codeänderungen in eine CPU mit vollem Arbeitsspeicher geladen werden, funktioniert das. Zu S7-300 Zeiten mussten die alten und neuen Bausteine gleichzeitig im Anwenderspeicher Platz haben, das ist jetzt zumindest bei den kleinen CPUs nicht notwendig.
Beim Ladespeicher ist das alte Muster geblieben und eher schlimmer geworden.

Und ich wollte damit sagen: Der TE wird aktuell noch nicht so schnell an Grenzen stoßen, aber bei einer größeren Erweiterung wird evtl. das Splitten des Programms auf 2 CPUs notwendig werden.
 
Und ich wollte damit sagen: Der TE wird aktuell noch nicht so schnell an Grenzen stoßen, aber bei einer größeren Erweiterung wird evtl. das Splitten des Programms auf 2 CPUs notwendig werden.
Was genau er macht/machen will/machen muss, wissen wir ja nicht.
Pauschal bin ich eher für mehrere kleine SPSn pro Teilanlage, als für eine Große. Solange sich Teilfunktionen ableiten lassen und der Datenaustausch untereinander nicht zu viel/aufwändig wird...
Auch die Trennung von F-Teil und normalem Teil macht oft Sinn...
Aber konkret muss man auf den konkreten Anwendungsfall schaun.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Safety über die SPS-CPU finde ich nicht so prickelnd, vor allem wenn damit "stupid" nur ein einziger Notaus-Kreis realisiert wird. Wenn durch solch einen SPS-Notaus-Kreis auch Notaus in angebundenen Anlagen und Maschinen ausgelöst wird, dann reicht ein STOP der SPS-CPU und das halbe Werk steht solange still.

Harald
 
Zuletzt bearbeitet:
Wie sieht es nun für String, Real usw. Datentypen aus?
[W]STRING ist ein Kapitel für sich. Sehr abhängig von der StringLänge und auch ein Bisschen von der Anzahl Bytes pro Zeichen (1 bei STRING vs. 2 bei WSTRING). Bei SPS sucht man auch oft vergebens Möglichkeiten, die in anderen Sprachen für die TextVerarbeitung sehr hilfreich sein können.
Ansonsten kann man grob einteilen nach der Länge der Daten, Bit alias BOOL, BYTE/CHAR inkl. SINT und USINT, Wort inkl. WORD und INT und UINT, DoppelWort inkl. DWORD und DINT und UNDINT und REAL, VierfachWort inkl. LINT und ULINT und LREAL.
Aber auch nach "ZahlenTypen" GleitKomma alias GleitPunkt einerseits und FestKomma alias FestPunkt alias Ganzzahl andererseits und auch noch BOOL als der grosse "Ausreisser".
Die Anzahl der Bytes eines DatenTyps besagt aber über die Schnelligkeit resp. die Langsamkeit von Operatoren mit diesen DatenTypen zunächst einmal nichts aus. Man kann nicht generell sagen, dass BYTE langsamer als BOOL ist oder INT langsamer als BYTE, DINT langsamer als INT, LDINT langsamer als DINT.
Arbeitet der "interne Prozessor" z.B. "bevorzugt" mit 32 Bit (DWORD, DINT, UDINT, REAL), so muss er mehr Aufand treiben bei längeren DatenTypen, aber wahrscheinlich auch bei kürzeren.
Das Bereitstellen/Isolieren eines bestimmten Bits aus einer grösseren Gruppe von Bits, um es anschliessend mit anderen Bits verknüpfen zu können, und das Ablegen des Ergebnisses der Bitverknüpfung in einer grösseren Gruppe von Bits sind aufwändig, zumal das einzelne Bit dort nicht die benachbarten Bits stören/verändern darf. Die Verknüpfung selbst hat einen recht kleinen Anteil an der benötigten Zeit.

Die DatenTypen (SINT,) INT, DINT, LINT sind bei arithmetischen Operationen verhältnismässig schnell, da sie "eng verwandt" sind mit dem, was der Prozessor sowieso "beherrscht" (ZweierKomplement). Dies kann man auch für die DatenTypen BYTE, CHAR, WORD, DWORD, LWORD sagen, wenn es um die logischen Operationen geht. Die Bereiche arithmetisch und logisch sind intern kaum gegeneinander abgegrenzt. Die Grenzen sind "eigentlich nicht vorhanden" über "künstlich übergestülpt" bis hin zu "schwammig".

Beim Programmieren müssen wir die notwendigen DatenTypKonvertierungen explizit programmieren, obwohl die Notwendigkeit dafür nicht immer nachvollziehbar ist. Die Compiler verlangen es, dass wir immer mit den "richtigen" DatenTypen arbeiten. In vielen Fällen können sie fehlende explizite Konvertierungen automatisch "auffüllen". Dieses automatische Auffüllen der KonvertierungsLücken, das sind dann die sog. impliziten DatenTypKonvertierungen. Wie es so ist mit Automatiken, können sie einem RoutineArbeiten abnehmen und meistens auch genau das tun, was sie sollen. Aber wenn sie mal nicht durchschauen, was man da genau programmieren will, dann sorgen sie für FehlFunktionen, die schwer aufzuspüren und zu verstehen sind. Also lieber ohne diese Automatik programmieren, dann wird man mit der Nase auf die Stellen gestossen, wo es etwas zu beachten gibt.

DatenTypKonvertierungen, die die Daten umrechnen müssen, kosten zur Laufzeit des Programms natürlich AusführungsZeit. Diejenigen, die den Daten lediglich einen anderen Typ überstülpen ("TypeCast"), ohne die Daten selbst zu verändern, eigentlich nicht. Aber, es gibt auch TypeCasts, die je nach Inhalt der betroffenen Variablen, zu Fehlern führen können. Z.B. kann ein UINT grössere Zahlen enthalten, als sich in INT darstellen lässt. Konvertiert man UINT in INT, wird dies zur Laufzeit des Programmes überwacht und kostet AusführungsZeit. Sie wird nutzlos verschwendet, wenn man im Programm schon abgefangen hat, dass solche Fälle überhaupt auftreten können.
Es kann also schon Sinn machen, Algorithmen ggfs so zu schreiben (oder abzuwandeln), dass DatenKonvertierungen eingespart werden.
Für (Neben-)Rechnungen ist es oft sinnlos, aus PlatzSparGründen einen sehr knapp bemessenen DatenTyp (z.B. UINT) zu wählen, wenn ein reichlicher bemessener DatenTyp (z.B. DINT) mit mehr "Reserve" und ohne Überläufe arbeiten kann. Das einmalige Überprüfen des Endergebnisses sollte dann genügen.
Besonders interessant ist dieser Effekt, wenn so über viele SchleifenDurchläufe hinweg viele TypKonvertierungen umgangen werden können.

Vorsicht mit GleitPunktZahl-DatenTypen.
Die Berechnungen mit ihnen sind nicht unbedingt die schnellsten, sie sind nicht unbedingt die genauesten und wenn man häufig zwischen ihnen und GanzzahlTypen hin- und herkonvertieren zu müssen glaubt, sollte man überprüfen, warum. Mit "häufig" meine ich, wenn man einen Wert während einer längeren Berechnung mal als GleitPunktZahl, mal als Ganzzahl, dann wieder als GleitPuntZahl u.s.w. benötigt.
Manchmal benötigt man GleitPunktZahlen nur, um Funktionen nutzen zu können, die für Ganzzahlen nicht verfügbar sind. Warum nicht verfügbar? Vielleicht, weil sie leicht anders zu realisieren/umgehen wären.
Mit zwei identischen Zahlen zu rechnen kann schneller sein, als mit zwei verschiedenen Zahlen.
Z.B. kann man statt 2*x auch x+x rechnen oder statt x² kann man x*x rechnen.
Allgemein gültige Tipps oder Regeln kann man wohl kaum aufstellen. Die Eigenschaften der jeweiligen Prozessoren und die möglichen/nötigen Anpassungen der Compiler sind zu vielfältig.
Darum im Zweifelsfalle "messen":
Wie lässt sich hier die Bearbeitungszeit ableiten/bestimmen?
Siehe Michaels Link.
Mir geht es vor allem darum Zykluszeitfresser ausfindig zu machen im Anwenderprogramm.
ProgrammSchleifen (FOR, WHILE, REPEAT oder wie auch immer sie heissen mögen) sind die Kandidaten, auf die man achten muss.
Die Anwendung von Schleifen, um Zeit zu fressen, d.h. um Wartezeiten zu realisieren/"überbrücken", ist mit ziemlicher Sicherheit nicht im Sinne einer zyklischen Programmierung. Anfällig sind hier insbesondere SPS-Neulinge, die "Hochsprachen"Kenntnisse mitbringen.

Bedenken, dass die Verwaltung/Ausführung einer Schleife auch Zeit benötigt. Werden ohnehin nur sehr wenige SchleifenDurchläufe benötigt und ist die Anzahl der Durchläufe sowieso konstant und werden in der Schleife ohnehin nur wenige Befehle ausgeführt, so sollte man die Schleife ganz vermeiden und die Befehle als Sequenz statt als Iteration schreiben.

Sind viele SchleifenDurchläufe nötig und in der Schleife viele Befehle abzuarbeiten, wird es kritisch.
Ist die SchwankungsBreite der Anzahl SchleifenDurchläufe gross, weil die Anzahl von den jeweiligen Daten abhängt, dann ist das auch kritisch und man muss von der maximal möglichen Anzahl Durchläufe (worst case) ausgehen.

Manchmal ist es sinnvoller die ZykluszeitBelastug durch die Schleife konstant zu halten, statt möglichst kurz zu machen.
Sind mehrere Schleifen ineinandergeschachtelt, dann ist auch äusserste Vorsicht geboten!

Überlegen, ob die komplette Schleife in einem einzigen Zyklus fertig werden muss. Ggfs auf mehrere Zyklen aufteilen.
Das kann jedoch die Übersichtlichkeit des Programms ruinieren. Wenn die Schleife auf viele Zyklen aufgeteilt werden muss, kann das Warten auf die Beendung der Schleife unerwartet/störend lang werden.

Wenn bei einem einzigen SchleifenDurchlauf pro Zyklus die Abarbeitung der kompletten Schleife ausreichend schnell ist, dann auf diese Schleife ganz verzichten. Das zyklische Programm läuft ja bereits in einer "Endlos"Schleife. Jeder Zyklus ist ein SchleifenDurchlauf.
Jetzt "nur" noch die Organisation der Schleife zu Fuss programmieren.

Muss in den SchleifenDurchläufen auf etwas gewartet werden? Z.B. auf das Anliefern soeben angeforderter Daten? Dann kommt ohnehin nur so eine selbstgemachte Schleife in Frage.

Muss die Funktionalität, für die die Schleife gebraucht wird, überhaupt in der SPS realisiert oder kann sie irgendwohin ausgelagert werden?

Beispielsweise wenn Siemens Funktionen im Anwenderprogramm zyklisch abgearbeitet werden
Die zyklische Bearbeitung dürfte in einer SPS eher die Regel als die Ausnahme sein, also mehr als nur "ein Beispiel".

Wenn diese Siemens Funktionen in bestimmten zeitlichen Abständen aufgerufen werden sollen/müssen, dann würde ich die MessMimik genau da drumherum einbauen, wo die Bausteine bereits aufgerufen werden und sie nicht irgendwo hin verlagern, wo sie in einem anderen ZeitTakt aufgerufen werden.

Oder man sich Supermonsterallinclusivbausteine ausgedacht hat...
oder man SuperMonsterAll-IinclusiveBausteine aus irgendwelchen Quellen (z.B. auch Hersteller der verwendeten Steuerung) verwendet, weil man sich zu Schade ist, für einfache Anwendungen etwas Angemessenes selbst zu schneidern oder aus "irgendwelchen Quellen" rauszusuchen.

Edit:
Folgende DatenTypen hatte ich ja ganz vergessen zu erwähnen:
- "ausgefallene", wie z.B. BCD, GRAY, EXCESS-3 , ..., mit denen man im Alltag eher selten zu tun hat und die von der CPU nur mässig bis gar nicht unterstützt werden.
- "normale", wie KalenderDaten und/oder Uhrzeiten.

Letztere gibt's in 2 Ausführungen.
- Für die CPU gut lesbar.
Also Anzahl Tage seit Datum x oder Anzahl der ms bzw. ns seit 0 Uhr.
- Für uns gut lesbar.
Also z.B. 2022-10-15 19:00:00.
Und dazwischen scheinen Welten zu klaffen, spätestens wenn Überraschungen wie SchaltJahre, KalenderWochen, WochenTage, Winter- und SommerZeit auftauchen. Und mit ihnen merkwürdige UmwandlungsWorkArounds. ;)
 
Zuletzt bearbeitet:
@Heinileini interessante Ausführung. Dem entnehme ich, das mir am Ende des Tages nichts anderes übrig bleibt, als die Laufzeit bestimmter Programmabschnitte zu messen 😉
 
Zurück
Oben