# Fehler 3101: Datenbereich zu groß?



## troebbe (21 Oktober 2010)

Hallo,

ich programmiere ein kleines Überwachungssystem, das einige Eingänge überwacht und bei Auslösung ein SNMP-Trap verschickt. Das Ganze wird mit einer Wago 750-841 realisiert.

Nun bekomme ich beim Übersetzen des Programms in CoDeSys folgende Fehlermeldung:

Fehler 3101: Datenbereich zu groß: 65535 Byte (63K). Maximale Größe: 1286979249 Byte (57132776K)

Leider sagt mir die Fehlermeldung überhaupt nichts, da der Datenbereich nach Adam Riese weit unter dem Limit liegt, das CoDeSys mir mitteilt. Auch Handbücher, Hilfen und der Große Bruder Google haben mir nicht weitergeholfen.

Das ist übrigens mein erstes Projekt, ich bin noch blutigster Anfänger.


----------



## KvT (21 Oktober 2010)

Ich weiß leider nicht mehr genau, welcher Fehler zu dieser Meldung gehört. Darum prüfe folgende Punkte mal ab:

- Hast Du in der Steuerungskonfiguration evtl. Teilnehmer mit unsinnig belegten PDO's (10 Kanäle mit LREAL)

- Im Programm Arrays oder Strukturen größer als das Zielsystem erlaubt (normalerweise 64K), z.B. Array [0..5000] OF LREAL

- Verschwindet die Fehlermeldung, wenn Du bei Projekt-> Optionen -> Übersetzungsoptionen, das Debugging ausschaltest oder die Anzahl der Datensegmente vergrößerst?


----------



## troebbe (21 Oktober 2010)

- Die Steuerungskonfiguration ist gecheckt, da ist alles in Ordnung.
- in den Übersetzungoptionen kann ich diese beiden Optionen momentan nicht verändern, da mir noch Hardwarekomponenten für die geplante Steuerung fehlen und ich deshalb im Simulationsmodus arbeite.
bez. dem zweiten Punkt: wie finde ich die Größe einer Struktur heraus? Schließlich kann sich die ja verändern?

Ich habe inzwischen auch rausgefunden, dass es sich um ein Programm handelt, das mir diesen Fehler erzeugt. Wenn ich dieses vom Übersetzen ausschließe, funktioniert der restliche Code.


----------



## KvT (21 Oktober 2010)

Klingt irgendwie nicht nach den Problemen, die ich mit der Speichergröße hatte, aber:

- Strukturen sind auch fest definiert. Du kannst die einzelnen Variablen einer Struktur zusammenrechnen (Die Größe jeder Variablen steht in der Hilfe). Aber ich denke hier reicht der Daumenfaktor. Wenn Du eine Struktur mit Strings[100] (z.B. 100 Byte) und LREAL (8Byte) hast und diese Struktur dann in ein Array[0..100] packst, kommst Du bald an eine solche Größe.


----------



## troebbe (21 Oktober 2010)

Wenn ich die Variablen im Deklarationsteil zusammenzähle, komme ich auf ein paar hundert Byte.
Wie verhält sich das, wenn ich Funktionsblöcke innerhalb dieses Programms aufrufe? Werden die dazugezählt oder nicht?


----------



## KvT (21 Oktober 2010)

Ja. Jeder angelegte Instanz eines FB's belegt einen Datenbereich. Das kannst Du auch ganz einfach testen, in dem Du Deinem Projekt FB's hinzufügst und im Kompilierfenster Dir die Größe der verbrauchten Daten anschaust....


----------



## troebbe (22 Oktober 2010)

okay... verstanden hab ichs, glaub ich. Das heisst, ich habe jetzt mal nach und nach Funktionsblöcke aus dem Programm gelöscht und jedes mal versucht, zu übersetzen.

Und siehe da: Wenn ich den letzten Funktionsblock weglasse, dann funktioniert das Programm. Im Kompilierfenster steht dann:
Bausteinindizies: 189 (18%)
Größe der verbrauchten Daten: 0 von 249856 Bytes  (0.00%)
Größe der verbrauchten Retain-Daten: 0 von 16384 Bytes (0.00%)

Ich gehe mal davon aus, dass der Speicherverbrauch durch die Bausteinindizies angegeben wird. Da ich den entfernten Funktionsblock im gleichen Programm aber nochmal verwende, kann ich mir nicht erklären, warum dieser Wert plötzlich auf 18% sinkt. Schließlich steht der andere FB ja noch, da kann es doch nicht sein, dass dieser Block einmal ganz wenig und einmal ganz viel Speicher benötigt?


----------

