- Beiträge
- 5.763
- Reaktionspunkte
- 1.707
-> Hier kostenlos registrieren
Ich habe grade ein Speicherproblem das wohl standard ist ich aber nicht verstehe. Jetzt bin ich aber bei ner CPU am Datenarbeitsspeicheranschlag und weiss nicht warum und wo ich optimieren könnte.
Ich habe alle Zugriffe auf Optimiert und dachte erst obwohl ich so oft wie möglich INOUT verwende, dass da irgendwo dann noch ein CallByValue gemacht wird, aber das kann ich nahezu ausschliessen. Was mir jetzt aber aufgefallen ist, sind die exorbitanten Datenarbeitspeicherverbräuche von einfachen Funktionsbausteinen. Ich habe in meinen Programmen, sehr viele kleinstbausteine die mir einfachste Funktionen kapseln so in dieser Art:
Dieser Baustein benötigt simple 172 Byte. wenn ich als Flankenmerker die R_Trig Funktion verwende dann sinds locker 188 Byte.
Wozu wird dieser Speicher verwendet? und wie kann ich das optimieren?
Zum verständnis, den Timestamp nutze ich in einem Baustein in nem Array[0..47] deklariert und diesen Baustein rufe ich dann über 100 Mal auf. Da ballert mir dieser minibaustein alleine den Datenarbeitsspeicher zu. Ich kann die Funktion jetzt natürlich in eine For schleife packen und da einfach n Array dafür hernehmen das benötigt natürlich nur noch einen Bruchteil an speicher, aber das Programm wird dann halt unübersichtlicher. Ich mag die minifunktionen und Minibausteine eigentlich.
Ich habe alle Zugriffe auf Optimiert und dachte erst obwohl ich so oft wie möglich INOUT verwende, dass da irgendwo dann noch ein CallByValue gemacht wird, aber das kann ich nahezu ausschliessen. Was mir jetzt aber aufgefallen ist, sind die exorbitanten Datenarbeitspeicherverbräuche von einfachen Funktionsbausteinen. Ich habe in meinen Programmen, sehr viele kleinstbausteine die mir einfachste Funktionen kapseln so in dieser Art:
Code:
FUNCTION_BLOCK "FB_Timestamper"{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
Alarm { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
END_VAR
VAR_IN_OUT
localtime {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
Timestamp {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
END_VAR
VAR
merk { S7_SetPoint := 'True'} : Bool;
END_VAR
BEGIN
IF #Alarm AND NOT #merk THEN
#Timestamp := #localtime;
END_IF;
#merk := #Alarm;
END_FUNCTION_BLOCK
Dieser Baustein benötigt simple 172 Byte. wenn ich als Flankenmerker die R_Trig Funktion verwende dann sinds locker 188 Byte.
Wozu wird dieser Speicher verwendet? und wie kann ich das optimieren?
Zum verständnis, den Timestamp nutze ich in einem Baustein in nem Array[0..47] deklariert und diesen Baustein rufe ich dann über 100 Mal auf. Da ballert mir dieser minibaustein alleine den Datenarbeitsspeicher zu. Ich kann die Funktion jetzt natürlich in eine For schleife packen und da einfach n Array dafür hernehmen das benötigt natürlich nur noch einen Bruchteil an speicher, aber das Programm wird dann halt unübersichtlicher. Ich mag die minifunktionen und Minibausteine eigentlich.