Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Array flexibel in der Größe anlegen

  1. #1
    Registriert seit
    29.08.2009
    Beiträge
    776
    Danke
    25
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo, ich möchte einen FB ertsellen, welcher flexibel in einer Arraygröße sein soll.

    Also dieser FB soll werte in ein Array speichern könn. Dabei kann es vorkommen, dass er ur mal 10 Werte speichern muss, oder auch mal 1000.

    Gibt es eine möglichkeit das Array im code zu erzeugen, so dass ich nicht immer ein Array mit 1000 Elementen anlegen muss?
    Zitieren Zitieren Array flexibel in der Größe anlegen  

  2. #2
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    nein .....

  3. #3
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard

    Zitat Zitat von trinitaucher Beitrag anzeigen
    nein .....
    weil das Entwicklungs System bei einer SPS garantieren muss, dass der Fall, dass das Memory nicht reicht, nie eintritt.

    Stell Dir vor, Du willst ein Array aus 1000.000 INT allocieren (normal nur 10 oder 1000), was soll dann die SPS machen? Anhalten, einfach nur das Maximum Mögliche hergeben oder dezent abstürzen?

    Deshalb legt das System zusammen mit dem verwendeten Target beim Erstellen fest, ob es geht oder nicht und dazu braucht es eine exakte Grösse.
    Als Freelancer immer auf der Suche nach interessanten Projekten.

  4. Folgender Benutzer sagt Danke zu RobiHerb für den nützlichen Beitrag:

    Bensen83 (12.10.2012)

  5. #4
    Registriert seit
    08.01.2007
    Beiträge
    54
    Danke
    1
    Erhielt 10 Danke für 8 Beiträge

    Standard

    Was jedoch geht, sollte noch angemerkt werden:

    VAR
    myArray: ARRAY[1..myArraySize] OF BYTE;
    END_VAR
    VAR_CONSTANT
    myArraySize:INT:=100;
    END_VAR

    Da Du nicht gesagt hast wann du die Flexibilität brauchst.
    Während des Kompilierens ist es nämlich möglich.
    Zur Laufzeit, wie meine Vorredner schon sagten, definitiv nicht.

  6. Folgender Benutzer sagt Danke zu soma für den nützlichen Beitrag:

    Bensen83 (12.10.2012)

  7. #5
    Registriert seit
    15.02.2011
    Ort
    Stromness, Scotland, UK
    Beiträge
    339
    Danke
    25
    Erhielt 34 Danke für 33 Beiträge

    Standard

    Hier ein Beitrag aus einem anderen Thread, der vlt. helfen könnte, falls du wirklich dynamische Arrays hast:
    Zitat Zitat von gloeru Beitrag anzeigen
    Also wenn man die Array-Grösse ändert, MUSS immer neu kompiliert werden, das geht zur Laufzeit sicher nicht. Die Grösse muss als VAR_CONSTANT deklariert sein...

    Ich mache oft 2 Variablen, eine die max. Grösse, die erlaubt ist (damit instanziere ich das Array) und eine Anzahl Werte (Also wieviel ich vom Instanzierten Array verwende)

    Dies ist zwar Speicherfressend, aber man kann zur Laufzeit die nutzbare Array-Grösse anpassen...

    P.S. Aus Erfahrung auch nie Online-Changes nach dem Ändern der Arraygrösse machen, das kann ein wunderbares Durcheinander im Speicher verursachen

  8. #6
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Wenn der FB flexibel sein soll und die Arraygröße vorm Übersetzen bekannt ist,
    schau doch mal im Info Sys unter Pointer nach. Mit Hilfe des ADR und Sizeof Operators kannst du dann am Bausteineingang die Startadresse und Größe des Zielarrays ünergeben.
    Im Baustein selbst kannst du dann per Pointer hochzählen und deine Daten in das Array schreiben.

    Ich nutze diese Möglichkeit z.B. um mit einem FB Arrays aus CSV Dateien zu füllen.


    Gruß

  9. #7
    Registriert seit
    27.11.2009
    Beiträge
    205
    Danke
    1
    Erhielt 32 Danke für 31 Beiträge

    Standard

    Zitat Zitat von trinitaucher Beitrag anzeigen
    nein .....
    Doch! Zumindest mit TwinCAT3 /CoDeSys3!

    PLC_PRG(PRG)
    VAR
    bInit: BOOL := TRUE;
    bDelete: BOOL;
    pArrayBytes : POINTER TO BYTE;
    pArrayDuts : POINTER TO BYTE;

    test: INT;

    parr : POINTER TO BYTE;

    END_VAR

    IF (bInit) THEN

    pArrayBytes := __NEW(BYTE, 25);

    bInit := FALSE;

    END_IF

    IF (pArrayBytes <> 0) THEN

    pArrayBytes[24] := 125;

    test := pArrayBytes[24];

    END_IF

    IF (bDelete) THEN

    __DELETE(pArrayBytes);

    END_IF
    Geändert von KGU (17.10.2012 um 12:03 Uhr)

  10. #8
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Wer ist denn so mutig und setzt TwinCat 3 produktiv ein ?

  11. #9
    Registriert seit
    18.10.2012
    Beiträge
    34
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    google mal nach "verkettete Liste", eine dynamische Datenstruktur
    könnte dir vielleicht helfen

  12. #10
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    750
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von mkd Beitrag anzeigen
    Wer ist denn so mutig und setzt TwinCat 3 produktiv ein ?
    Männer ohne Nerven gibt es immer, und die finden dann auch bestimmt eine Möglichkeit, dynamische Variablen in einem Automationsprogramm sinnvoll einzusetzen. Wie viele von denen wohl den Hinweis in der CoDeSys-Hilfe verstehen, dass die dynamische Speicherverwaltung nicht reentrant ist?
    Zitat Zitat von Mensetta Beitrag anzeigen
    google mal nach "verkettete Liste", eine dynamische Datenstruktur
    könnte dir vielleicht helfen
    Das ist in CoDeSys schwierig. Der Knoten einer verketteten Liste würde ja etwa so aussehen:
    Code:
    TYPE strNode
    STRUCT
       Prev:POINTER TO strNode;
       Next:POINTER TO strNode;
       Data:POINTER TO strData;
    END_STRUCT
    END_TYPE
    CoDeSys erlaubt aber innerhalb eines Structs keinen Verweis auf den eigenen Typ. Da müsste man schon in der strNode mit einem "POINTER TO ARRAY[0..11] OF BYTE" arbeiten und dann immer in externe Variablen vom Typ "POINTER TO strNode" umkopieren. Wäre mir zu umständlich.

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 22.10.2011, 11:17
  2. Fehler: Array Größe
    Von ysh032 im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 28.09.2011, 07:28
  3. Array in FB mit Größe als Parameter
    Von Heimchen im Forum CODESYS und IEC61131
    Antworten: 15
    Letzter Beitrag: 26.11.2010, 10:33
  4. Array Feld flexibel deklarieren
    Von husox81 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 20.06.2009, 02:32
  5. Beckhoff Array auf Merker anlegen?
    Von Jush im Forum Sonstige Steuerungen
    Antworten: 3
    Letzter Beitrag: 26.07.2007, 16:08

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •