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

Ergebnis 1 bis 7 von 7

Thema: Struktur als Übergabeparameter bei Aktionsaufrufen

  1. #1
    Registriert seit
    17.06.2009
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Erstmals an alle ein Hallo (zum zweiten mal, da mein erster Text aufgrund des Forum-Timeouts im Nirvana verschand

    Wie vermutlich viele andere hier im Forum auch, hab ich mich aufgrund eines Problems registriert und hoffe, dass mir jemand von Euch einen Tipp geben kann.
    Ich programmiere in strukturiertem Text (ST) und habe nun eine Frage zu Strukturen als Übergabeparameter. Ich beginne mal von vorn und liste auf, wie der prinzipielle Aufbau ausschaut.
    Als erstes hab ich da eine Struktur definiert:

    Code:
    TYPE T_SErrorSource :
    STRUCT
      wFbId : WORD;
      bSmId : BYTE;
      bState : BYTE;
    END_STRUCT
    END_TYPE
    Des weiteren hab ich folgenden FB definiert:

    Code:
     
    FUNCTION_BLOCK FB_Error
    VAR_INPUT
      i_scErrorSource : T_SNcErrorSource;
    END_VAR
    Ausserdem besitzt dieser FB eine Aktion set()

    Möchte ich diesen FB nun instanzieren, so kann ich den Inhalt von i_scErrorSource gleich mit Werten beschreiben:

    Code:
    fbErr : FB_Error := ( i_scErrorSource := (wFbId := 1,
                                              bSmId := 2,
                                              bState := 3));
    Dies funktioniert, da gibt es soweit keine Probleme.
    Nun möchte ich aber den Inhalt der Struktur beim Aktionsaufruf set() mit neuen Werten überschreiben:

    Code:
     
    fbErr.set(i_scErrorSource := (wFbId := 11,
                                  bSmId := 12,
                                  bState := 13));
    Dies funktioniert nun leider nicht mehr.

    Eine Alternative wäre das vorherige Abfüllen der Struktur, bevor der set() Aufruf erfolgt :

    Code:
     
    fbErr.i_scErrorSource.wFbId := 11;
    fbErr.i_scErrorSource.bSmId := 12;
    fbErr.i_scErrorSource.bState := 13;
    fbErr.set();
    Obwohl auch dies wieder einwandfrei funktioniert, finde ich es rein optisch nicht sehr elegant, da die Dazugehörigkeit des Aktions-Übergabeparameters nicht mehr so eindeutig ersichtlich ist.

    Hat irgend jemand von Euch eine andere Idee, die Struktur bei einem Aktionsaufruf sauber abzufüllen ?

    Besten Dank schonmal im Voraus.
    Greets
    VPCoder
    Zitieren Zitieren Struktur als Übergabeparameter bei Aktionsaufrufen  

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

    Standard

    Aktionen sind doch nichts weiter als ausgelagerter Quellcode. Sie verhalten sich nicht wie FBs, haben also auch keine eigenen Übergabeparameter. Auch wenn man sie mit
    Code:
    Action();
    aufrufen kann.
    Code:
    Action;
    Geht überigens auch!

    Du könnstest den Code deiner Aktion in separate Bausteine (im Baustein) packen und dann bei mehrmaligem Durchlauf unterschiedliche Parameter übergeben.
    Oder du rufst deinen FB im überlagerten Programm zweimal auf, jeweils mit anderen Übergabeparametern. Dumm is nur, wenn die FB-Abarbeitung mehrere Zyklen braucht. Dann würdest du evtl. ein Problem bekommen.

  3. #3
    vpcoder ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.06.2009
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von trinitaucher Beitrag anzeigen
    Aktionen sind doch nichts weiter als ausgelagerter Quellcode. Sie verhalten sich nicht wie FBs, haben also auch keine eigenen Übergabeparameter. Auch wenn man sie mit
    Code:
    Action();
    aufrufen kann.
    Code:
    Action;
    Geht überigens auch!
    Und genau deshalb (weil Aktionen eigentlich nur ausgelagerter Quellcode ist) versuchen wir, die von der Aktion benötigten Parameter irgendwie ersichtlich zu machen. Das ist meines Erachtens auch eine der grössten Schwachstellen, dass Aktionen keine Parameter und Stackvariablen besitzen.

    Zitat Zitat von trinitaucher Beitrag anzeigen
    Du könnstest den Code deiner Aktion in separate Bausteine (im Baustein) packen und dann bei mehrmaligem Durchlauf unterschiedliche Parameter übergeben.
    Oder du rufst deinen FB im überlagerten Programm zweimal auf, jeweils mit anderen Übergabeparametern. Dumm is nur, wenn die FB-Abarbeitung mehrere Zyklen braucht. Dann würdest du evtl. ein Problem bekommen.
    Dies gäbe dann allerdings eine Unmenge an neuen (Sub)FB's. Ausserdem sind die Parameter dynamisch, das Problem der Übergabe von Strukturen (und deren Members) bleibt trotzdem, auch bei (Sub)FB's. Zusätzlich kommt dann das Problem, dass die (Sub)FB's keinen direkten Zugriff auf die Variablen des Haupt-FB's haben (nur über Pointer).

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

    Standard

    Zitat Zitat von vpcoder Beitrag anzeigen
    Und genau deshalb (weil Aktionen eigentlich nur ausgelagerter Quellcode ist) versuchen wir, die von der Aktion benötigten Parameter irgendwie ersichtlich zu machen. Das ist meines Erachtens auch eine der grössten Schwachstellen, dass Aktionen keine Parameter und Stackvariablen besitzen.
    Mach doch durch Kommentare ersichtlich, welche Parameter von der Aktion benötigt werden.
    A programmer is just a tool which converts caffeine into code.

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

    Standard

    Zitat Zitat von vpcoder Beitrag anzeigen
    Das ist meines Erachtens auch eine der grössten Schwachstellen, dass Aktionen keine Parameter und Stackvariablen besitzen.
    Tja, so is das aber nunmal

    Zitat Zitat von vpcoder Beitrag anzeigen
    Nun möchte ich aber den Inhalt der Struktur beim Aktionsaufruf set() mit neuen Werten überschreiben:

    Code:
     
    fbErr.set(i_scErrorSource := (wFbId := 11,
                                  bSmId := 12,
                                  bState := 13));
    Dies funktioniert nun leider nicht mehr.

    Eine Alternative wäre das vorherige Abfüllen der Struktur, bevor der set() Aufruf erfolgt :

    Code:
     
    fbErr.i_scErrorSource.wFbId := 11;
    fbErr.i_scErrorSource.bSmId := 12;
    fbErr.i_scErrorSource.bState := 13;
    fbErr.set();
    Obwohl auch dies wieder einwandfrei funktioniert, finde ich es rein optisch nicht sehr elegant, da die Dazugehörigkeit des Aktions-Übergabeparameters nicht mehr so eindeutig ersichtlich ist.
    Dazu kann man nur sagen, dass es sicherlich eine Norm gibt, wie so ein Funktionsbausteinaufruf zu erfolgen hat.

  6. #6
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von vpcoder Beitrag anzeigen
    Und genau deshalb (weil Aktionen eigentlich nur ausgelagerter Quellcode ist) versuchen wir, die von der Aktion benötigten Parameter irgendwie ersichtlich zu machen. Das ist meines Erachtens auch eine der grössten Schwachstellen, dass Aktionen keine Parameter und Stackvariablen besitzen.
    Eine Aktion ist nun mal nur eine Aktion eines Bausteins wenn man einen eigenen Stack, Parameter und eventuell statische Variablen braucht sollte man zu einer Funktion bzw. zu einem Funktionsblock greifen.
    If you open your Mind too much, your Brain will fall out.

  7. #7
    vpcoder ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.06.2009
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Morgen allerseits

    Es scheint wohl, als gäbe es keine Syntax, welche die Struktur gleich beim Aufruf einer Aktion abfüllt

    Danke Euch für die Infos. Hier nochmals zusammenfassend:

    Für die Aktion einen eigenen Sub-FB verkompliziert meiner Meinung nach das Ganze noch mehr, denn die von mir genannte Aktion set() ist ja schlussendlich nicht die Einzige in diesem FB. Für jede Aktion einen eigenen Sub-FB wäre dann doch sehr viel. Ausserdem müsste sämtliche Sub-FB's trotzdem Zugriff auf Variablen des Haubt-FB's haben. Bei Funktionen wird ein Zugriff auf FB-Variablen gleich gänzlich geblockt, also auch keine Alternative.

    Die "Übergabeparameter" einer Aktion haben wir im Deklarationsteil mittels Kommentaren zugewiesen, nur wäre es einfach angenehmer, wenn dies auch im Quellcode selber deutlich zu sehen ist.

    Habt bitte etwas Nachsehen mit meinen Vorstellungen zu "optisch gut lesbarem Code". Da ich ursprünglich aus dem C und Java Lager komme (auch C ist lesbar, wenn man sich an gewisse Konventionen hält ) tue ich mich manchmal etwas schwer mit den Aktionen des strukturierten Textes.

    Ich habe mich nun dahingehend entschieden, dass ich aus den Strukturelementen (wFbId, bSmId, bState) einzelne Inputparameter i_wErrorSourceFbId, i_bErrorSourceSmId und i_bErrorSourceState mache. Diese kann ich dann bequem beim Aufruf von set() mitübergeben. Innerhalb der set() Aktion kann ich die Daten dann immer noch in die Struktur abfüllen, damit die Übergabe an andere Bausteine einfacher geht.

    Greets
    VPCoder

Ähnliche Themen

  1. Struktur in Array
    Von ipacsre im Forum CODESYS und IEC61131
    Antworten: 9
    Letzter Beitrag: 19.05.2010, 20:08
  2. Pointer auf Struktur (SCL)?
    Von momo99 im Forum Simatic
    Antworten: 26
    Letzter Beitrag: 25.03.2009, 10:23
  3. Freigabe durch Übergabeparameter
    Von Sven2603 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 15.01.2009, 12:17
  4. Struktur am Bildbaustein
    Von Neesen im Forum HMI
    Antworten: 4
    Letzter Beitrag: 21.09.2007, 22:06
  5. DB-struktur
    Von Pimsti im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 13.06.2006, 12:48

Lesezeichen

Berechtigungen

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