STOP durch Fehler beim Allokieren von Lokaldaten

Limette

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


leider geht die Steuerung beim Programmdurchlauf in Stop. Grund: "STOP durch Fehler beim Allokieren von Lokaldaten".

habe vor kurzem mir eine SCL Funktion zu eigen gemacht. ...Gleicht ein Array mit einem Array in einem DB ab.
siehe:
http://www.sps-forum.de/showthread.php/50824-Array-in-DB-suchen?p=372334#post372334

Hier habe ich nun gelesen das SCL Stringoperation viele Lokaldaten erzeugen und möglichst wenige direkt Datenbausteinzugriffe verwendet werden sollen.
siehe:
http://www.spsforum.eu/showthread.ph...183#post351183

Bei meiner SCL File ist das doch nicht der Fall(viele Datenbausteinzugriffe)...
im worstcase benutze ich das SCL File, mit verschiedenen Abänderungen 7 mal im Zyklus. An der Anzahl kann ich eigentlich kaum was einsparen..
An was könnte ich da arbeiten ?

edit: hab eine CPU 317F-2PN/DP projektiert, benutze aber PLCSIM.
 
Zuletzt bearbeitet:
Eigenartig. Hast du konsequent überall die Strings begrenzt, also in deinem Fall war das wohl String[30]. Wenn du irgendwo im SCL-Code mal das [30] vergessen hast, steigt der Lokaldatenbedarf pro String auf 255. Geh mal im Bausteinordner mit der rechten Maustaste auf den Baustein, "Objekteigenschafte/Allgemein", dort siehst du den Lokaldatenbedarf des Bausteins.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

so wie ich dich verstanden habe, spielt es keine Rolle wie oft ich die FC pro Zyklus aufrufe, sondern ob ein FC oder FB mehr als 255 Byte benötigt. Wenn man die ineinander verschachtelt spielt es keine rolle ?! Nein, das ist nicht der Fall. Habe alles durchgeschaut, alles unter 255. Der des Fehlers bezichichtige FB hat auch unter 255. Ich benutze rund um den String FCs schon manchmal die Blkmove funktion um ein Char Array in ein Byte Array umzuwandeln, - um es für die SCL FC richtig aufzubereiten. Aber das müsste ja auch alles in beim Abrufen der Lokaldaten Länge mit eingerechnet sein.
 
Beim verschachtelten Aufruf spielt das schon eine Rolle. Man hat pro Prioritätsklasse nur einen begrenzten Lokaldatenstack zur Verfügung. Ich glaube 512 Byte war die normale Größe, bei 318, Speed7 und 400-er kann man diese Stackzuordnung abändern.

Hier mal die Step7-Hilfe dazu:

Lokaldaten-Stack
Der L-Stack speichert:
die temporären Variablen der Lokaldaten von Bausteinen
die Startinformation der Organisationsbausteine
Informationen zum Übergeben von Parametern
Zwischenergebnisse der Logik in Kontaktplan-Programmen
Beim Erstellen von Organisationsbausteinen können Sie temporäre Variablen (TEMP) deklarieren, die nur während der Bearbeitung des Bausteins zur Verfügung stehen und dann wieder überschrieben werden. Vor dem ersten Zugriff müssen die Lokaldaten initialisiert werden. Außerdem benötigt jeder Organisationsbaustein für seine Startinformation 20 Lokaldaten-Byte.
Die CPU besitzt einen begrenzten Speicher für die temporären Variablen (Lokaldaten) gerade bearbeiteter Bausteine. Die Größe dieses Speicherbereichs, des Lokaldaten-Stacks, ist CPU-abhängig. Der Lokaldaten-Stack wird zu gleichen Teilen unter den Prioritätsklassen aufgeteilt (Voreinstellung). Das bedeutet, jede Prioritätsklasse verfügt über einen eigenen Lokaldatenbereich. Damit ist gewährleistet, dass auch hochpriore Prioritätsklassen und ihre zugeordneten OBs Platz für ihre Lokaldaten zur Verfügung haben.
Nachfolgendes Bild zeigt die Zuordnung von Lokaldaten zu den Prioritätsklassen in einem Beispiel, in dem im L-Stack der OB 1 vom OB 10 unterbrochen wird, der dann wiederum vom OB 81 unterbrochen wird.
Vorsicht
Bitte beachten Sie bei der Verwendung von temporären Variablen, dass diese nur innerhalb des jeweiligen Bausteins gültig sind bzw. als Vorgängerlokaldaten weiteren, in diesem Baustein aufgerufenen Bausteinen zur Verfügung stehen. Es ist insbesondere nicht gewährleistet, dass nach Verlassen und erneutem Aufruf des Bausteins die temporären Variablen wieder die Werte enthalten, mit denen der vorangegangene Aufruf des Bausteins beendet wurde. Temporäre Variablen sind beim Aufruf eines Bausteins zunächst per Definition unbestimmt und müssen bei jeder erstmaligen Verwendung im Baustein immer wieder initialisiert werden.
Alle temporäre Variablen (TEMP) eines OB und seiner unterlagerten Bausteine werden im L-Stack gespeichert. Wenn Sie viele Schachtelungsebenen in Ihrer Bausteinbearbeitung verwenden, kann der L-Stack überlaufen.
S7-CPUs wechseln in den Betriebszustand "STOP", wenn Sie die zulässige L-Stack-Größe für ein Programm überschreiten.
Testen Sie den L-Stack (die temporären Variablen) in Ihrem Programm.
Berücksichtigen Sie den Lokaldatenbedarf von Synchronfehler-OBs.

Zuordnen von Lokaldaten zu Prioritätsklassen
Nicht jede Prioritätsklasse benötigt gleich viel Speicher im Lokaldaten-Stack. Durch Parametrierung mit STEP 7 können Sie bei S7-400-CPUs und bei der CPU 318 die Größe des Lokaldatenbereichs für die einzelnen Prioritätsklassen unterschiedlich festlegen. Nicht benötigte Prioritätsklassen können Sie abwählen. Bei S7-400-CPUs und der CPU 318 wird damit der Speicherbereich für andere Prioritätsklassen erweitert. Abgewählte OBs werden bei der Programmbearbeitung nicht berücksichtigt, dadurch sparen Sie Rechenzeit.
Bei den anderen S7-300-CPUs ist jeder Prioritätsklasse eine feste Anzahl von Lokaldaten zugeordnet (256 Bytes), die nicht verändert werden kann.

PS: Bild fehlt leider:confused:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
512 ? ok, dann muss ich mal zusammenrechnen. :)...auf wieviel kann man die anderen Steuerung aufblasen ?

Kommt auf deine Steuerung an, bei einer normalen 300-er geht da gar nichts, wenn ich richtig erinnere, dann mußt du du dein Programm etwas anders aufteilen, also weniger verschachteln z.Bsp.
 
Hallo, angenommen ich projektiere - da plcsim - einfach eine andere Steuerung wo ich die Lokaldaten bearbeiten kann. wie genau würde das funktionieren ?
Auf dem Bild ist die Rede von 29 Prioritätsklassen. Für was stehen die denn ? Woher weiß ich was da was ist ? und wie kann ich rausfinden welcher Prioritätklasse ich mehr Speicher geben muss, damit die Steuerung nicht mehr stopt.

 
Zuletzt bearbeitet:
... wie Ralle es schon geschrieben hat : Es geht nicht bei jeder CPU einzustellen. Die kleinen 300er-CPU's können es generell nicht. Ich habe an einigen meiner Anlagen eine VIPA-CPU dran (die hat die Eigenschaften einer 318). Dort kann man es unter den CPU-Eigenschaften in der HW-Konfig (Unter-Eigenschaft Speicher) einstellen. Die entsprechende Prioritäts-Klasse, unter der das ganze läuft, wird dir durch die Fehler-Meldung mitgeteilt. Hier dann den Lokaldaten-Speicher erhöhen.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

in deinem Fall dürfte das die Prioritätsklasse 1 sein.
Wenn mich nicht alles täuscht sind die anderen Klassen für verschiedenste OB-Aufrufe.
Hier ein Link mit einer Beispielrechnung:
http://support.automation.siemens.c...objaction=csview&extranet=standard&viewreg=WW

Dort steht auch folgender Hinweis:
Hinweis:Pro Programmbearbeitungsebene (Ablaufebene) sind 256 Byte je Prioritätsklasse vorgesehen.
- bei S7-300 fest
- bei S7-400 standardmäßig, einstellbar unter "CPU-Eigenschaften” Hardware-Konfiguration

Bei 400er CPU hatte ich es auch schon oft das ich die Lokaldaten in der Prioritätsklasse 1 hochsetzen musste wegen eben genau solcher Effekte.

Gruß
Matthias
 
Stimmt, es ist Prioritätsklasse 1. Eine Übersicht was welche Prioritätsklasse ist gibt es nicht...muss ich es halt durch ausprobieren aufteilen.
 
Zurück
Oben