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

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

Thema: Konstanten an FB übergeben

  1. #1
    Registriert seit
    20.08.2007
    Beiträge
    112
    Danke
    13
    Erhielt 10 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich habe mehrere global deklarierte Arrays, die von mehreren Instanzen des selben FBs bearbeitet werden sollen. Wenn ich diese global deklarierten Arrays alle gleichgroß mache, dann bekomme ich ein Speicherplatzproblem, deshalb habe ich folgende Lösungsansätze probiert:

    1. Lösungsansatz funktioniert leider nicht

    Einem FB ein Array als IN_OUT Variable deklariere, und die Größe des Arrays mit einer Konstanten definiere.
    Diese Konstante dann aber als INPUT_VARIABLE übergeben
    Code:
    VAR_INPUT CONSTANT
       MYCONSTANT : INT;
    END_VAR
    VAR_IN_OUT 
       myArray : ARRAY[0..MYCONSTANT] OF BYTE;
    END_VAR
    Wenn ich das so mache, und den FB mit den nötigen Eingangsvaribalen versorge kommt immer die Fehlermeldung
    Unzulässiger Typ für Eingang myArray von Baustein TEST: KANN ARRAY[0..76] of BYTE nicht in ARRAY[0..MYCONSTANT] of BYTE(VAR_IN_OUT) konvertieren.
    2.Lösung die tutm gefällt mir aber nicht

    Abhilfe würde das Arbeiten mit Pointern schaffen, etwa so.
    Code:
    VAR_IN_OUT 
       startAdresseArray : WORD;
       sizeOfArray : WORD;
    END_VAR
    Die zweite Lösung gefällt mir aus folgenden Gründen nicht:
    1. Pointer sind an sich kein Problem, aber die obere Lösung wäre aus meiner Sicht schöner und auch sicherer.
    2. Ich müsste bei der zweiten Lösung relativ viel im FB ändern.
    3. Die erste Lösung hatte außerdem den Charme, dass man Konstanten an FBs übergeben kann. Das heißt ich sehe am FB-Eingang, dass er von Konstanten abhängig ist und von welchen.

    Weiß jemand noch ne dritte Lösung oder wich ich das mit Lösung eins doch noch hinbekommen kann?

    Vielen Dank schon mal im vorraus
    wonderfulworld

    P.S.
    Das von mir eingesetzte System ist eine ELAU-Steuerung (EPAS-4 basiert auf Codesys 2.3). Wäre aber auch an einer Lösung die nur in Codesys V3 funktioniert interessiert.
    Geändert von wonderfulworld (05.06.2013 um 11:30 Uhr)
    Solls was Rechtes sein, oder darfs auch was von Siemens sein?
    Zitieren Zitieren Konstanten an FB übergeben  

  2. #2
    Registriert seit
    24.02.2009
    Beiträge
    1.244
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Warum willst du die Arrays an die FBs übergeben? Wenn die Arrays global sind, kannst du aus deinem FB direkt auf sie zugreifen. Das ist ja der Sinn von globalen Variablen (global = überall verfügbar).

  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 wonderfulworld Beitrag anzeigen

    Code:
    VAR_INPUT CONSTANT
       MYCONSTANT : INT;
    END_VAR
    VAR_IN_OUT 
       myArray : ARRAY[0..MYCONSTANT] OF BYTE;
    END_VAR
    Wenn ich das so mache, und den FB mit den nötigen Eingangsvaribalen versorge kommt immer die Fehlermeldung
    Ich sehe da mehrere Probleme:

    Als Eingangsvariable deklarierst Du eine NEUE Variable MYCONSTANT. Das ist vom Wert vielleicht das gleiche wie die Globale Variable MYCONSTANT aber eine andere neue Variable!

    Weiterhin ist die Eingangsvariable MYCONSTANT als CONSTANT deklariert aber beim Aufruf wirst Du doch MYCONSTANT einen Wert zuweisen wollen? Das ist nicht erlaubt, der Wert einer CONSTANT wird bei der Deklaration festgelegt.

    In C++ ist so etwas zulässig, da bedeutet es aber einen Hinweis an den Compiler, dass er sicher stellen muss, dass die Variable Innerhalb der Funktion nicht verändert wird.
    Als Freelancer immer auf der Suche nach interessanten Projekten.

  4. #4
    wonderfulworld ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.08.2007
    Beiträge
    112
    Danke
    13
    Erhielt 10 Danke für 8 Beiträge

    Standard

    Zitat Zitat von MasterOhh Beitrag anzeigen
    Warum willst du die Arrays an die FBs übergeben? Wenn die Arrays global sind, kannst du aus deinem FB direkt auf sie zugreifen. Das ist ja der Sinn von globalen Variablen (global = überall verfügbar).
    Ich will einen FB mehrere unterschiedliche Arrays bearbeiten. Das heißt ich habe drei Instanzen von dem FB, die jeweils ein anderes Array bearbeiten. Wenn ich jetzt nicht für jedes Array einen eigenen FB schreiben will, dann muss ich das Array mittels IN_OUT übergeben.
    [QOUTE=RobiHerb;446787]
    Als Eingangsvariable deklarierst Du eine NEUE Variable MYCONSTANT. Das ist vom Wert vielleicht das gleiche wie die Globale Variable MYCONSTANT aber eine andere neue Variable!
    [/QUOTE]
    Das ist auch nicht ganz richtig. Ich weise MYCONSTANT nämlich keine Variable sondern eine KONSTANTE zu. Somit ist MYCONSTANT immer noch eine Konstante und das interessante ist, dass der Kompiler ja auch akzeptiert, das ich MYCONSTANT eine KONSTATNE zuweise. Er meckert ja nur an, dass das übergebene Array scheinbar andere Grenzen hat, als das im FB benutzte.

    Gruß wonderfulworld
    Geändert von wonderfulworld (05.06.2013 um 19:44 Uhr)
    Solls was Rechtes sein, oder darfs auch was von Siemens sein?

  5. #5
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    755
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    Wenn der Compiler etwas schluckt, heisst das noch lange nicht, dass es auch funktioniert. Wenn MYCONSTANT eine Konstante ist, kannst Du ihr nicht erst zur Laufzeit einen Wert zuweisen. So wie Du die Deklaration geschrieben hast (ohne Wertzuweisung), hat MYCONSTANT den Wert 0 und behält den auch, selbst wenn Du beim FB-Aufruf versuchst, etwas anderes zu übergeben. Trotzdem, ein sehr kreativer Versuch, Arraygrössen erst zur Laufzeit festzulegen. Aber das geht nun mal nicht, Du wirst also in den sauren Pointer beissen müssen.

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

    Standard

    Zitat Zitat von MasterOhh Beitrag anzeigen
    Warum willst du die Arrays an die FBs übergeben? Wenn die Arrays global sind, kannst du aus deinem FB direkt auf sie zugreifen. Das ist ja der Sinn von globalen Variablen (global = überall verfügbar).
    M.M.n. ganz schlechter Stil !

    Ea gibt mehrere gute Gründe so einen Unfug nicht zu machen:
    - Wie wonderfulworld schon geäussert hat, ist das Array dann fix und jedes mal wenn ein neues Array benötigt wird, bedeutet das eine neue Instanz vom FB. Stichwort Wiederverwendbarkeit.
    - Der Code wird schlecht zu warten sein, weil unleserlich. An einen FB gehört eine saubere Schnittstelle.
    Allein um den Code im FB nachvollziehen zu können, ist es wichtig alle Variablen in seiner eigenen Schnittstelle wiederzufinden
    - Nicht umsonst gibt es in modernen, zugegeben objektorientierten Programmiersprachen, keine globalen Variablen mehr. Man wird gezwungen sauber zu kapseln. Das kann in der SPS Welt auch nicht schaden.


    Um zur Problemlösung beizutragen:

    Ich würde die Pointer Variante bevorzugen. So bist du in der Arraylänge flexibel und hast eine saubere Schnittstelle.


    Daniel

  7. #7
    Registriert seit
    24.02.2009
    Beiträge
    1.244
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Recht hast du.
    Ich hatte aus dem Anfangspost nicht herausgelesen das jede Instanz nur auf bestimmte Arrays zugreifen soll und nicht auf alle ....
    Dann bleiben wirklich nur noch Pointer. Auf echte dynamische Speicherverwaltung werden wir im SPS Bereich noch lange warten müssen. Da gibt es noch zu viele Probleme mit der Sicherheit und/oder der Echtzeitfähigkeit.

  8. #8
    wonderfulworld ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.08.2007
    Beiträge
    112
    Danke
    13
    Erhielt 10 Danke für 8 Beiträge

    Standard

    Zitat Zitat von MasterOhh Beitrag anzeigen
    Recht hast du.
    Ich hatte aus dem Anfangspost nicht herausgelesen das jede Instanz nur auf bestimmte Arrays zugreifen soll und nicht auf alle ....
    Dann bleiben wirklich nur noch Pointer. Auf echte dynamische Speicherverwaltung werden wir im SPS Bereich noch lange warten müssen. Da gibt es noch zu viele Probleme mit der Sicherheit und/oder der Echtzeitfähigkeit.
    Also, das was ich wollte ist ja keine dynamische Speicherverwaltung. Ich will eigentlich nur die Möglichkeit eine Konstante an eine andere Konstante (die in einem FB deklariert wurde) zu übergeben. Die Übergabe soll nicht zur Laufzeit stattfinden, sondern bei der Initialisierung der FB-Instanz. Dass das nicht geht, hatte ich mir schon fast gedacht, aber als ich gesehen habe das man VAR_INPUT das Schlüsselwort CONSTANT mitgeben kann, habe ich halt gehofft...
    Naja, jetzt geht das halt nicht. Dann muss ich halt die Pointer-Variante einsetzten. (Die eigentlich ja auch nur eine verkappte dynamische Speicherverwaltung ist und deshalb auch so gefährlich). Aber warum kann man dan VAR_INPUT das Schlüsselwort CONSTANT dann mitgeben?

    Vielen Dank für eure Beteiligung es hat Spaß gemacht mit euch zu fachsimpeln
    wonderfulworld
    Solls was Rechtes sein, oder darfs auch was von Siemens sein?

  9. #9
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    755
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    Zitat Zitat von wonderfulworld Beitrag anzeigen
    Aber warum kann man dan VAR_INPUT das Schlüsselwort CONSTANT dann mitgeben?
    Was nicht verboten ist, ist erlaubt, auch wenn es wenig sinnvoll erscheint. Gut, mit VAR_INPUT CONSTANT könnte man ein Zwischending zwischen globaler und FB-lokaler Konstante bauen, nämlich eine FB-lokale Konstante, die auch noch in der aufrufenden POU lesbar ist. VAR_OUTPUT CONSTANT wäre dafür aber wohl die bessere Wahl.

  10. #10
    wonderfulworld ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.08.2007
    Beiträge
    112
    Danke
    13
    Erhielt 10 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich hab heute zufällig das gefunden:

    Code:
    FUNCTION SUM:INT;
    VAR_IN_OUT
         A: ARRAY[*] OF INT;
    END_VAR;
    VAR
        i, sum2 : DINT; 
    END_VAR;
    
    sum2 := 0;
    FOR i:= LOWER_BOUND(A,1) TO UPPER_BOUND(A,1)
        sum2:= sum2 + A[i];
    END_FOR;
    SUM := sum2;
    END_FUNCTION
    Quelle: http://www.plt.rwth-aachen.de/filead...er-61131-3.pdf Seite 12

    Aber leider funktioniert es bei mir nicht.
    Solls was Rechtes sein, oder darfs auch was von Siemens sein?

Ähnliche Themen

  1. Globale Konstanten in SCL-Quellen
    Von Aventinus im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 16.08.2012, 12:42
  2. Deklaration Konstanten PLC-Control
    Von MarkusP im Forum Programmierstrategien
    Antworten: 3
    Letzter Beitrag: 15.02.2011, 16:21
  3. Antworten: 2
    Letzter Beitrag: 20.06.2010, 22:58
  4. Konstanten redefinieren
    Von Majestic_1987 im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 13.08.2009, 12:22
  5. Konstanten Deklarierung
    Von COOLT im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 01.08.2009, 00:37

Lesezeichen

Berechtigungen

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