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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: Funktion Count/Len/Length um Anzahl der Elemente in einem Array auszulesen

  1. #11
    Registriert seit
    12.04.2010
    Beiträge
    300
    Danke
    22
    Erhielt 54 Danke für 52 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,
    also dynamisch anpassen (interpretiere ich so: während der Laufzeit des Systems, da ist auch der Hochlauf mit dabei) finde ich nicht notwendig.

    Meine Beispiele oben gehen davon aus dass das Projekt noch mal durch den Compiler geht. Während der Laufzeit ist die Größe dann fix.

    Wenn während der Laufzeit unterschiedliche Größen zu behandeln sind, muss dass meiner Meinung nach über Pointer und Memory-Alloc realisiert werden.

    Ich keine eigentlich überhaupt keine Funktion welche Strukturen, also UDTs ändern kann, auch nicht außerhalb von SPS Programmierung. Gäbe es so was ?

    bg
    bb

    ah ja, wollte noch sagen bei B&R funktioniert das bereits so ....
    Code:
    #define MAX_ARR 10            ; Typ-1  
    myArr = INT[0...MAX_ARR];   
    
    ...
    
     loop index = 0 to MAX_ARR - 1 do   
     myArr[index] .....
    
     endloop
    Geändert von bits'bytes (08.07.2011 um 18:18 Uhr) Grund: Ergänzung

  2. #12
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard

    Wenn die Arraygröße variiert, dann sollte man für die Arraydefinition Konstanten vorsehen. Vielleicht ist das eine kleine Abhilfe.

    Code:
    VAR CONSTANT
        MaxArr: INT:= 10;
    END_VAR
    
    VAR
        myArr: ARRAY[0..MaxArr] OF INT;
    END_VAR
    Die Konstante lässt sich im Normalfall sogar per ADS auslesen (wenn die Übersetzungsoption "Konstanten ersetzen" nicht aktiviert ist), damit sich z.B. eine Visualisierung an die Arraygröße automatisch anpassen kann.

    Gruß,
    witkatz

  3. #13
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.709 Danke für 1.240 Beiträge

    Standard

    Zitat Zitat von witkatz Beitrag anzeigen
    Wenn die Arraygröße variiert, dann sollte man für die Arraydefinition Konstanten vorsehen. Vielleicht ist das eine kleine Abhilfe.

    Code:
    VAR CONSTANT
        MaxArr: INT:= 10;
    END_VAR
    
    VAR
        myArr: ARRAY[0..MaxArr] OF INT;
    END_VAR
    Die Konstante lässt sich im Normalfall sogar per ADS auslesen (wenn die Übersetzungsoption "Konstanten ersetzen" nicht aktiviert ist), damit sich z.B. eine Visualisierung an die Arraygröße automatisch anpassen kann.
    Viel Spaß dabei dir deinen Speicher der SPS zu zerschießen.
    Du kannst ja mal nach dem myArr eine INT Variable anlegen und dann ein MaxArr auf 11 erhöhen und einen Wert reinschreiben. Was meinst du welcher Wert in der folgenden Variable landet?

    Das Programm wird kompiliert und nicht interpretiert! Falls dir das etwas sagen sollte...

  4. #14
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard

    Ich hab's schon so oft angewendet und auf diese Weise ohne Probleme online Änderungen durchgeführt, dass ich dir nicht glauben kann. Wenn du den Wert von MaxArr änderst, dann wird auch die Arraygröße angepasst und neu compiliert. Das passt schon. Das ist das gleiche wie eine Änderung der Definition der Arrayvariablen, nur eben mit einer benannten Konstanten statt eines Literals für die Arraygrenzen.

    Natürlich darf man nicht außerhalb der Array-Grenzen schreiben. Das lässt sich zwar mit checkbounds abfangen, checkbounds frisst aber Ressourcen.

    Gruß,
    witkatz

  5. #15
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.709 Danke für 1.240 Beiträge

    Standard

    Zitat Zitat von witkatz Beitrag anzeigen
    Ich hab's schon so oft angewendet und auf diese Weise ohne Probleme online Änderungen durchgeführt, dass ich dir nicht glauben kann. Wenn du den Wert von MaxArr änderst, dann wird auch die Arraygröße angepasst und neu compiliert. Das passt schon. Das ist das gleiche wie eine Änderung der Definition der Arrayvariablen, nur eben mit einer benannten Konstanten statt eines Literals für die Arraygrenzen.
    Aber garantiert nicht wenn du wie du oben geschrieben hast über ADS den Wert von MaxArr anpasst!

    Über TwinCat kann man den Wert wenn man online ist über 'Wert schreiben' ebenfalls ändern.
    Ich würde vermuten dass die unter VAR CONSTANT abgelegten Variablen zwar als Variable angelegt werden, z.B. damit sie von anderen Programmteilen oder auch Visualisierungen als Wert abgefragt werden können, aber die Speicheradressen in der üblichen Manier beim Übersetzungsprozess eindeutig festgelegt werden.

    Vom Programm aus sind die Variablen aus dem Bereivch 'VAR CONSTANT' auch nur lesefähig.

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

    Standard

    "VAR_CONSTANT" sind Konstanten und können während des Programmablaufs nicht verändert werden. Der Wert muss vor dem kompilieren feststehen.
    Also ist gegen witzkatz's Methode nichts einzuwenden. Mache ich auch oft, z. B. wenn man eine Applikation mit unterschiedlicher Anzahl von identischen Module programmiert.
    Dann lege ich ein Array von diesen Modulen an, wobei es je nach Anwendung mal 5 sind und mal 10 oder sonst was. Man braucht nur an der einen Stelle der Konstantendeklaration im Code die Zahl anpassen.

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

    Standard

    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. #18
    Registriert seit
    20.09.2005
    Beiträge
    63
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard

    So, ich meld mich dann auch mal wieder. War am WE unterwegs und konnte die Arbeit mal Arbeit sein lassen.

    Vielen Dank für die rege Diskussion und auch vielen Dank an Trinittaucher dessen Lösung mir sehr gut gefällt. Ich werde mal schauen ob ich in dem Stress auf Arbeit mir eine Funktion schreiben kann, die das relativ Komfortabel löst.

    Wenn man das Array mit Konstanten instanziiert ist es ja auch klar, dass man diese nicht zur Laufzeit ändern sollte. Nur recht neue Hochsprachen lassen wirkliche dynamische Arrays zu. Unter C, C++ ist da nix mit Dynamik ohne irgendwelche Zusätze. von daher ist das schon okay so wie Beckhoff das implementiert hat.

  9. #19
    Registriert seit
    17.03.2011
    Ort
    im Wald
    Beiträge
    284
    Danke
    11
    Erhielt 36 Danke für 35 Beiträge

    Standard

    Hallo,

    moderne Hochsprachen ?

    Bei Delphi, geht das schon ganz lange, heisst min. 10 Jahre (und weiter, will gerade mal nicht zurückdenken). Und da C++, das A und das O ist bestimmt auch.

    Gruß Voxe

  10. #20
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Aber garantiert nicht wenn du wie du oben geschrieben hast über ADS den Wert von MaxArr anpasst!
    Das ist eine böse Unterstellung. Ich habe deutlich geschrieben, dass man die Konstante per ADS auslesen kann, damit sich z.B. eine Visu-Applikation an das SPS Projekt zur Laufzeit anpassen kann.
    Für eine Änderung der Konstanten ändert man den Quelltext, dokumentiert die Änderung und beim Einloggen in das laufende System per online change wird das Projekt recompiliert. Auf die Idee, auf Konstanten per ADS schreibend zuzugreifen wäre ich nie gekommen. Wer macht denn so was, das ist grob fahrlässig!

    Gruß,
    witkatz
    Geändert von witkatz (20.07.2011 um 00:27 Uhr)

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 21.12.2016, 17:03
  2. Funktion mit Array-Rückgabewert
    Von cas im Forum CODESYS und IEC61131
    Antworten: 9
    Letzter Beitrag: 25.03.2011, 12:07
  3. Antworten: 0
    Letzter Beitrag: 06.10.2009, 06:32
  4. Antworten: 1
    Letzter Beitrag: 14.12.2005, 21:42
  5. Anzahl der 1sen iin einem Byte.
    Von Anonymous im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 01.09.2005, 14:29

Lesezeichen

Berechtigungen

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