Eigener Type ...

mactoolz
2010-12-10
2010-12-24
  • mactoolz - 2010-12-10

    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

     
  • Schuero - 2010-12-10

    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

     
  • mactoolz - 2010-12-10

    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

     
  • mactoolz - 2010-12-10

    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

     
  • mactoolz - 2010-12-24

    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

     

Log in to post a comment.