Codesy Speicherbelegung bei INOUT

SY50

Level-1
Beiträge
271
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich benutze einen Baustein, welcher eine INOUT Schnittstelle hat.
Nun habe ich mir um dessen Funktion zu erweitern einen FB drum herum programmiert.
Dieser besitzt natürlich auch diese INOUT Schnittstelle, welche er an den Ursprünglichen Baustein weiterleitet.

Jetzt habe ich die Variable, welche an die INOUT Schnittstelle gelegt werden muss global angelegt.
Wird nun der benötigte Speicherplatz der Variable 3fach auf der Steuerung
Benötigt? Also einmal da wo ich sie deklariert habe, einmal im "großen" FB und einmal um Ursprungs FB?

Oder wie teilt sich der Speicher bei INOUTs auf?
 
Variablen im Bereich IN_OUT werden als Zeiger übergeben. Je nach Architektur des Zielsystems ist dieser z.B. bei 32 Bit Systemen 4 Byte groß.
Beispiel:
Wenn du einen FB mit ausschließlich 3 Variablen als IN_OUT Parameter hast, nimmt der FB dann 12 Bytes in Anspruch. Egal ob dieses 3 Variablen vom Typ Integer sind, oder 3 Real-Arrays mit 1000 Variablen.

Du kannst dir den Speicherbedarf des FB mit SIZEOF(FbInstanz) ausgeben lassen. Online sieht es immer so aus als ob alle Variablen im FB nochmal gespeichert werden, das ist aber nicht der Fall.

Wenn du sonst keine Parameter hast und dein FB sich keine Daten für den nächsten Aufruf merken muss, warum erstellst du dann keine Funktion?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe ja noch mehrere Daten. Benutze den FB quasi als "Klasse" habe darin Methoden, Variablen und Properties um auf die Internen Variablen schreiben zu können. Kann man eigentlich in nem FB nicht einen Bereich deklarieren, der dann auch von Außen Global sichtbar ist? Sonst brauche ich ja für jede Varia ne die ich beschreiben möchte ne Propertie.
 
Also es handelt sich um einen Baustein, welcher Achsen ansteuert. Ich habe dort in Strukturen Handsollwerte, autosollwerte und visualisierungsbuttons uns. Greife dann in der Visu auf die Buttons zu (boolsche Variablen) und im automatiksblauf weise ich über properties sollwerte zu und starte bspw. Die Achse über Achse.start()
Wenn ich jetzt die sollwerte außerhalb des FBs deklariere, dann habe ich wieder 2 verschiedene Instanzen (Sollwerte.xy und fbinstanz.start() ) das will ich ja nicht. Hat jemand ne Idee?
 
Also schreibt einfach mal eure Meinung.
Lieber INOUT verwenden für Variablen, welche ich von Außen verändern mag, oder lieber properties?
Was meint ihr?
 
Warum nicht? Wenn Dein FB 50 Eingangsvariablen hat und Du diese in der aufrufenden POU in eine Strukturvariable packst, musst Du die einzelnen Variablen dort mit Werten beschreiben, bevor Du die Struktur per VAR_IN_OUT an den FB übergibst. Wo ist der Vorteil gegenüber dem direkten Beschreiben von VAR_INPUT des FB's?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Effizienz ...

Warum nicht? Wenn Dein FB 50 Eingangsvariablen hat und Du diese in der aufrufenden POU in eine Strukturvariable packst, musst Du die einzelnen Variablen dort mit Werten beschreiben, bevor Du die Struktur per VAR_IN_OUT an den FB übergibst. Wo ist der Vorteil gegenüber dem direkten Beschreiben von VAR_INPUT des FB's?

Wenn ich eine STRUCT habe (z.B. auch Global definiert), die ich dem FB per IN_OUT übergebe, so ist die Wahrscheinlichkeit recht hoch, dass von den vielen Membern der STRUCT zwischen den verschiedenen Aufrufen des FB sich nur wenige Member ändern, also die STRUCT einmal initialisiert wird und dann immer wieder nur leicht verändert (z.B. Laufvariable) in den FB reingegangen wird. Ausserdem kann diese STRUCT in einem FB dazu dienen, dass Memberwerte berechnet werden, in einem nächsten FB eine Sicherheits/Plausibilitäts Kontrolle vorgenommen wird und in einem weiteren FB die Ausgabe an die Hardware stattfindet, immer mit IN_OUT, sehr viel effektiver als Einzelparameter Übergabe.
 
Wenn ich eine STRUCT habe (z.B. auch Global definiert), die ich dem FB per IN_OUT übergebe, so ist die Wahrscheinlichkeit recht hoch, dass von den vielen Membern der STRUCT zwischen den verschiedenen Aufrufen des FB sich nur wenige Member ändern, also die STRUCT einmal initialisiert wird und dann immer wieder nur leicht verändert (z.B. Laufvariable) in den FB reingegangen wird.
Das geht mit VAR_INPUT genauso. Man braucht ja nicht bei jedem Aufruf jede Variable beschreiben.
Ausserdem kann diese STRUCT in einem FB dazu dienen, dass Memberwerte berechnet werden, in einem nächsten FB eine Sicherheits/Plausibilitäts Kontrolle vorgenommen wird und in einem weiteren FB die Ausgabe an die Hardware stattfindet, immer mit IN_OUT, sehr viel effektiver als Einzelparameter Übergabe.
Wenn eine Struktur nacheinander von mehreren FB's gelesen/beschrieben werden soll, ist die Übergabe als VAR_IN_OUT natürlich effektiver. Wobei ich persönlich allerdings bevorzuge, die zu einer Baugruppe gehörende Funktionalität in nur einem FB unterzubringen.
 
Zurück
Oben