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

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

Thema: Array in FB mit Größe als Parameter

  1. #1
    Registriert seit
    23.11.2010
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,

    ist es möglich, einem FB bei der Deklaration einen Parameter so zu übergeben, dass dieser innerhalb des FB als Größe für ein Array herhalten kann?
    Zum Hintergrund: ich möchte einen Buffer-FB erstellen, wobei ich aber nicht pauschal 1000bytes o.ä. reservieren möchte. Denn mal brauche ich große Buffer und mal sehr kleine. Bisher deklariere ich das Array extern und übergebe die Größe und Startadresse. Dabei kann ich aber nicht absichern, dass die Größe tatsächlich der Größe des Arrays entspricht. Außerdem muss der übergeordnete Block zwei Variablen deklarieren.

    Gruß, Heimchen
    Zitieren Zitieren Array in FB mit Größe als Parameter  

  2. #2
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    Die Größe eines Arrays muss eine Konstante sein.
    A programmer is just a tool which converts caffeine into code.

  3. #3
    Registriert seit
    27.07.2007
    Ort
    Leipzig
    Beiträge
    239
    Danke
    25
    Erhielt 47 Danke für 43 Beiträge

    Standard

    Hallo,

    du könntest deinem FB das Array über Pointer übergeben. Dabei ist die größe so ziemlich egal.

  4. #4
    Heimchen ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    23.11.2010
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Genau so mach ich es ja. Aber wie ich schon geschrieben hab, kann ich mich innerhalb des FBs nicht gegen Pufferüberläufe schützen.

    Dass Arraygrößen nur Konstanten sein dürfen, weiß ich. Kann man vielleicht irgendwie erreichen, dass ich eine Konstante erst bei der Deklaration festlegen kann?

  5. #5
    Registriert seit
    27.07.2007
    Ort
    Leipzig
    Beiträge
    239
    Danke
    25
    Erhielt 47 Danke für 43 Beiträge

    Standard

    Hallo, was willst du den genau mit dem FB erreichen?

    Soll das Array nur zwischengespeichert werden oder musst du an dem Puffer etwas ändern.

  6. #6
    Heimchen ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    23.11.2010
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Der FB hat einen Input uiSize. In dem FB soll ein Array-Puffer angelegt werden, mit eben der Größe uiSize. Im Betrieb wird der Puffer als FIFO mit neuen Werten gefüllt üder die dann der Mittelwert berechnet wird. Der Mittelwert wird dann wieder ausgegeben.

  7. #7
    Registriert seit
    27.07.2007
    Ort
    Leipzig
    Beiträge
    239
    Danke
    25
    Erhielt 47 Danke für 43 Beiträge

    Standard

    Hallo,

    dann kannst du doch mit Pointern arbeiten.

    Als Eingang übergibst du die Größe und Adresse deines Arrays.

    In dem Baustein greifst du dann auf den Inhalt deines Arrays mit Hilfe der Pointer zu.

  8. #8
    Heimchen ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    23.11.2010
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Wie bereits geschrieben: das tue ich, habe dann aber in meinem FB nicht die Möglichkeit, einen Buffer Overrun zu verhindern. Oder kann ich irgendwie überprüfen, ob die übergebene Größe und das adressierte Array zusammenpassen?

  9. #9
    Registriert seit
    27.07.2007
    Ort
    Leipzig
    Beiträge
    239
    Danke
    25
    Erhielt 47 Danke für 43 Beiträge

    Standard

    Wenn du dem FB folgendes übergibst z.B.:
    Code:
    (*Deklaration*)
    VAR_INPUT
    	Size_Array	: UINT;
    	ADR_Array	: POINTER TO REAL;
    END_VAR
    VAR
    	i: INT;
    	Summe: REAL;
    	MW: REAL;
    END_VAR
    (*FB-Anweisungen im ST*)
    Summe:=0;
    FOR i:=0 TO Size_Array	DO
    	Summe:=Summe+ADR_Array^;
    	ADR_Array:=ADR_Array+1;
    END_FOR
    
    MW:=Summe/Size_Array;
    kannst du eigentlich keinen Überlauf erzeugen. Wenn du eine Kontrolle machen willst z.B.: Begrenzung - musst du eine Abfrage vor der Berechnung einfügen.

    PS: habs noch nicht auf Richtigkeit geprüft
    Geändert von bonatus (23.11.2010 um 14:10 Uhr) Grund: FB-Fehler

  10. #10
    Heimchen ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    23.11.2010
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Und wenn der Nutzer des FB dann sowas macht:
    Code:
    arBuffer : ARRAY [1..20] OF REAL;
    avgAverage(..., prBuffer:=ADR(arBuffer), uiSize:=500);
    Genau davor möchte ich mich schützen. Auch wenn's eigentlich der Fehler von dem andern ist...

    PS: REAL-Pointer muss man um 4 erhöhen.

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 21.12.2016, 17:03
  2. Fehler: Array Größe
    Von ysh032 im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 28.09.2011, 07:28
  3. SCL - OB und Array als Parameter
    Von Bluescreener im Forum Hochsprachen - OPC
    Antworten: 1
    Letzter Beitrag: 15.02.2008, 15:21
  4. Größe UDT in SCL
    Von Larry Laffer im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 17.12.2007, 20:25
  5. Bool-Array in Byte-Array
    Von Techniker im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 13.01.2006, 19:12

Lesezeichen

Berechtigungen

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