Was mich noch interessiert, gibt es irgendwie auch eine Dokumentation zum SFC20 (BLKMOV), wo drinnen steht, wie lege er für eine bestimmte Datenmenge braucht?
Für diese Frage hat der Kollege vierlagig das hier schön dokumentiert.
http://sps-forum.de/showpost.php?p=237189&postcount=4
Was?für die verlinkten berechnungen habe ich eien pi*daumen-schnitt hergenommen
*
Netzwerk 2 (UDT)
UN #E_Bereit
O #St_Schieber_ext
O #St_End_auf
O #St_End_zu
= #Daten.SIGNALE.HMI_Stoerung
Netzwerk 2 (ohne UDT)
UN #E_Bereit
O #St_Schieber_ext
O #St_End_auf
O #St_End_zu
= #Temp_Daten.SIGNALE.HMI_Stoerung
*
Netzwerk 2 (UDT)
UN DIX [AR2,P#0.3]
O DIX [AR2,P#8.5]
O DIX [AR2,P#8.6]
O DIX [AR2,P#8.7]
BLD 18
T LD 4
TAK
T LD 8
L DIW [AR2,P#12.0]
T LW 12
AUF DB [LW 12]
L DID [AR2,P#14.0]
LAR1
L LD 8
L LD 4
= [AR1,P#0.0]
Netzwerk 2 (ohne UDT)
UN DIX [AR2,P#0.3]
O DIX [AR2,P#18.5]
O DIX [AR2,P#18.6]
O DIX [AR2,P#18.7]
= DIX [AR2,P#32.0]
Ich muss zugeben, ich habe nicht ganz verstanden was du machst, bzw. machen willst. Aber wenn du die Struktur im FB in der Deklaration hast, brauchst sie speicher, da sie ja im InstanzDB erstellt wird. Wenn du Sie im FC in den Lokaldaten hast nicht, da Sie dort ja nur temporär existiert, solange sie bearbeitet wird.
Gruß Philip
Ich sehe, dass hier im MC7-Code schon ein deutlicher unterschied besteht.
Kann ich mit den MC7 Code von meinen Programm irgendwie anschauen/auslesen?
ja, du hast das problem tatsächlich nicht verstanden.
er hat zwei funktional gleiche FBs
im FB A hat er die STATs mit hilfe einer UDT eingefügt
im FB B die selben daten im STAT bereich als Struct angelegt
FB A ist mehr als doppelt so groß im vergleich zu FB B
grund: siehe meinen post oben
Das liegt daran, daß alle Datentypen größer 4 Byte nicht als call_by_value sondern als call_by_reference übergeben werden,Wenn ich eine Anwenderdefinierte Struktur in Step 7 erstelle (UDT) in diese als Parameter (IN, OUT oder IN/OUT) bei einem FC oder FB angebe und dann innerhalb des Bausteines drauf zu greife habe ich einen sehr großen Speicherbedarf für einen Baustein, obwohl nur Quellcode drinnen steht.
Hi Harald,Das liegt daran, daß alle Datentypen größer 4 Byte nicht als call_by_value sondern als call_by_reference übergeben werden,
d.h. es wird nicht der Wert der Variablen (als Kopie) übergeben, sondern die Adresse der Original-Variablen.
Das ist in Step7 leider nicht so deutlich sichtbar wie z.B. in C, das muß man halt wissen.
Weil dadurch die Adresse der übergebenen Variablen zur Compilierzeit nicht bekannt ist, muß der Baustein die Adresse der Variablen
zur Laufzeit auflösen und in ein AR-Register laden, um danach den Wert der Variablen indirekt zu lesen.
Soweit ich mich erinnere, sind das bei jedem Zugriff etwa 42 Byte mehr Code als ein Zugriff auf Variablen im TEMP- oder STAT-Bereich.
Vorsicht!
Egal, ob die Struktur als IN, IN_OUT oder OUT übergeben wird, kann auf Variablen der Struktur geschrieben werden.
Dabei wird die Original-Variable verändert! Der Step7-Editor/Compiler verhindert das nicht!
Gruß Harald
Das liegt daran, daß alle Datentypen größer 4 Byte nicht als call_by_value sondern als call_by_reference übergeben werden,
d.h. es wird nicht der Wert der Variablen (als Kopie) übergeben, sondern die Adresse der Original-Variablen.
Das ist in Step7 leider nicht so deutlich sichtbar wie z.B. in C, das muß man halt wissen.
Weil dadurch die Adresse der übergebenen Variablen zur Compilierzeit nicht bekannt ist, muß der Baustein die Adresse der Variablen
zur Laufzeit auflösen und in ein AR-Register laden, um danach den Wert der Variablen indirekt zu lesen.
Soweit ich mich erinnere, sind das bei jedem Zugriff etwa 42 Byte mehr Code als ein Zugriff auf Variablen im TEMP- oder STAT-Bereich.
Vorsicht!
Egal, ob die Struktur als IN, IN_OUT oder OUT übergeben wird, kann auf Variablen der Struktur geschrieben werden.
Dabei wird die Original-Variable verändert! Der Step7-Editor/Compiler verhindert das nicht!
Gruß Harald
Hallo Harald
Hab das mal ausporbiert. Habe eine UDT erstellt, der folgenden Aufbau hat. 2*REAL + 2*Byte = 10 Byte länge. Habe diese dann als IN-Paramer an einem FB angegeben. Innerhalb des FB's hab ich nur eine kleines Programm geschrieben, wo ich lesend und schreiben auf die Struktur zugreife. Was ich nun festegestellt habe ich folgendes. Die Wert habe sich in dem übergebene DB mit der Struktur nicht verändert. Also ist das mit call_by_referenc bei Strukturen doch nicht ganz richtig oder hab ich was falsch gemacht?
Bei einem FB hingegen, wirken sich "normale" L/T U O = Operationen intern ausschließlich auf dem IDB aus.
Bei IN_OUT findet hingegen wieder analog zum FC die Pointerberechnung statt.
...und bei einem FB gibt es nochmal die zwei Anwendungsfälle: Multiinstanz oder nicht Multiinstanz.
Das unterscheidet sich auch nochmal nicht unerheblich.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?