Der Typ selber legt meines Wissens keine Speicher fest.
Also mußt du den Typ ein Speicherbereich zuweisen (ähnlich C++ mit "new")
B.s.p. du erzeugst ein Array "ax_Dummy: ARRAY [0..31] OF BOOL;" irgendwo im Programm.
Diesem Array wir dann ein festen Speicherbereich zugeordnet (!Adresse kann sich aber beim "online change" ändern)
Dann kannst du über eine Adresszuweisung Daten in dein Typ speichern (letztenlich in dem ax_Dummy)
Sieht dann so aus
pntTest:=ADR(ax_Dummy);
Doof nur, dass du nur den Inhalt das "ax_Dummy" ändern kannst. Ich habe noch keinen Wag gefunden, wie das andersherum gehen kann. Ist eingentlich auch nicht nötig, da du direkt mit dem Arry arbeiten kannst.
Gruß Schuero
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
mhhhh, irgendwie gefällt mir das nicht. Mit dem New Operator wäre das schön, gibt es aber leider nicht im CoDeSys.
Ok, der Type selbst legt natürlich keinen Speicher an. Das ist auch gut so .
Nur wenn ich erst den Type deklarieren muss und dann über ADR erst die Adresse hole habe ich doch nichts gewonnen weil
ich dann doch die deklaration
ax_Dummy: ARRAY [0..31] OF BOOL
gemacht habe. So kann man doch keinen Speicher sparen oder?
Was passiert wenn ich folgendes mache....
Das ist mein Type weiterhin
TYPE testArr : POINTER TO ARRAY[0..31] OF BOOL;
END_TYPE
im Programm die deklaration von testArr vornehme
testArr1: testArr;
dann Speicher allokiere
SysMemAlloc(SIZEOF(testArr1));
Danke
MacToolz
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
TYPE testArr : POINTER TO ARRAY[0..1]OF FB_ExpKonv;
END_TYPE
PROGRAM PLC_PRG
VAR
testArr1:testArr;
end_var
testArr1 := SysMemAlloc(SIZEOF(testArr1^));
find ich so ganz toll .... geht auch und macht teileweise Sinn oder .... für einen Verwendungszweck muss ich mal sehen, spiele gerade ein wenig rum.
Laufzeit und Speichersparend finde ich es auch sinnvol wenn man erst zur Programmlaufzeit
Speicher einer Function oder FB reserviert und unter umständen wieder den Speicher freigibt, wobei ein FB dann bei der Speicherfreigabe seine eingentlich Aufgabe und Sinn verliert.
Aber Zur Laufzeit hat man auch Speicher gesparrt.
Oder wie sieht ihr diesen Möglichkeit mit FB oder generell Speicherreservierungen etc.....?
Danke
MacToolz
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
allen Frohen Weihnachten. Ich musste gerade mal kurz flüchten bevor es zum großen Essen ran geht.
Also ich muss meinen letzen Beitrag korrigieren.
Ich hatte gemeint das über das deklarieren von einem Type noch kein Speicher reserviert wurde.
Dem ist nicht so, ich denke sobald ein SysMemAlloc im Code vorhanden ist, wird sofort vom CoDeSys Speicher reserviert.
Ich habe das getestet indem ich die Deklaration von einem Type durchgeführt habe und einfach direkt mit SizeOf mir angeschaut habe wo groß meine Variabel aus der deklaration ist. Tja was soll ich sagen es kam eine gewisse Größe von Bytes zurück und nicht nur 4Bytes für einen Zeiger sondern z.B. 2981 Bytes.
Das entspricht meiner Größe von einem Array[0..10] of FB ....
Kann das sein das CoDeSys auch in dem Fall grundsätzlich immer Speicher anlegt, egal ob man Später eine allokation durchführt ???
Vielleicht aus dem Grund, dass man sagt in einer SoftSps aus Performance gründen alle Variabel ohne Speicherlücken hintereinander auf der Steuerung liegen sollen???
Mur dann Frage ich mich was man mit dem SysMemAlloc erreicht wenn man eh kein Speicher zur Laufzeit allokieren kann wenn er eh immer schon durch das kompalieren und nach einem LogIn vorhanden ist???
Na dann last euch es schmecken und bis später mal .....
Frohe Weihnachten
MacToolz
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo zusammen,
funktioniert diese Type definition
TYPE testArr : POINTER TO ARRAY[0..31] OF BOOL;
END_TYPE
Wenn ich eine Deklaration von testArr anlege
pntTest : testArr;
kann ich nicht auf die Inhalte zugreifen, selbst wenn dafür Speicher reserviert wird.
Was läuft bei mir falsch?
Danke
MacToolz
Hallo.
Der Typ selber legt meines Wissens keine Speicher fest.
Also mußt du den Typ ein Speicherbereich zuweisen (ähnlich C++ mit "new")
B.s.p. du erzeugst ein Array "ax_Dummy: ARRAY [0..31] OF BOOL;" irgendwo im Programm.
Diesem Array wir dann ein festen Speicherbereich zugeordnet (!Adresse kann sich aber beim "online change" ändern)
Dann kannst du über eine Adresszuweisung Daten in dein Typ speichern (letztenlich in dem ax_Dummy)
Sieht dann so aus
pntTest:=ADR(ax_Dummy);
Doof nur, dass du nur den Inhalt das "ax_Dummy" ändern kannst. Ich habe noch keinen Wag gefunden, wie das andersherum gehen kann. Ist eingentlich auch nicht nötig, da du direkt mit dem Arry arbeiten kannst.
Gruß Schuero
Hallo,
mhhhh, irgendwie gefällt mir das nicht. Mit dem New Operator wäre das schön, gibt es aber leider nicht im CoDeSys.
Ok, der Type selbst legt natürlich keinen Speicher an. Das ist auch gut so .
Nur wenn ich erst den Type deklarieren muss und dann über ADR erst die Adresse hole habe ich doch nichts gewonnen weil
ich dann doch die deklaration
ax_Dummy: ARRAY [0..31] OF BOOL
gemacht habe. So kann man doch keinen Speicher sparen oder?
Was passiert wenn ich folgendes mache....
Das ist mein Type weiterhin
TYPE testArr : POINTER TO ARRAY[0..31] OF BOOL;
END_TYPE
im Programm die deklaration von testArr vornehme
testArr1: testArr;
dann Speicher allokiere
SysMemAlloc(SIZEOF(testArr1));
Danke
MacToolz
Hallo,
ich habe mal folgendes getestet...
TYPE testArr : POINTER TO ARRAY[0..1]OF FB_ExpKonv;
END_TYPE
PROGRAM PLC_PRG
VAR
testArr1:testArr;
end_var
testArr1 := SysMemAlloc(SIZEOF(testArr1^));
find ich so ganz toll .... geht auch und macht teileweise Sinn oder .... für einen Verwendungszweck muss ich mal sehen, spiele gerade ein wenig rum.
Laufzeit und Speichersparend finde ich es auch sinnvol wenn man erst zur Programmlaufzeit
Speicher einer Function oder FB reserviert und unter umständen wieder den Speicher freigibt, wobei ein FB dann bei der Speicherfreigabe seine eingentlich Aufgabe und Sinn verliert.
Aber Zur Laufzeit hat man auch Speicher gesparrt.
Oder wie sieht ihr diesen Möglichkeit mit FB oder generell Speicherreservierungen etc.....?
Danke
MacToolz
Hallo,
allen Frohen Weihnachten. Ich musste gerade mal kurz flüchten bevor es zum großen Essen ran geht.
Also ich muss meinen letzen Beitrag korrigieren.
Ich hatte gemeint das über das deklarieren von einem Type noch kein Speicher reserviert wurde.
Dem ist nicht so, ich denke sobald ein SysMemAlloc im Code vorhanden ist, wird sofort vom CoDeSys Speicher reserviert.
Ich habe das getestet indem ich die Deklaration von einem Type durchgeführt habe und einfach direkt mit SizeOf mir angeschaut habe wo groß meine Variabel aus der deklaration ist. Tja was soll ich sagen es kam eine gewisse Größe von Bytes zurück und nicht nur 4Bytes für einen Zeiger sondern z.B. 2981 Bytes.
Das entspricht meiner Größe von einem Array[0..10] of FB ....
Kann das sein das CoDeSys auch in dem Fall grundsätzlich immer Speicher anlegt, egal ob man Später eine allokation durchführt ???
Vielleicht aus dem Grund, dass man sagt in einer SoftSps aus Performance gründen alle Variabel ohne Speicherlücken hintereinander auf der Steuerung liegen sollen???
Mur dann Frage ich mich was man mit dem SysMemAlloc erreicht wenn man eh kein Speicher zur Laufzeit allokieren kann wenn er eh immer schon durch das kompalieren und nach einem LogIn vorhanden ist???
Na dann last euch es schmecken und bis später mal .....
Frohe Weihnachten
MacToolz