Struktur als Übergabeparameter bei Aktionsaufrufen

vpcoder

Level-1
Beiträge
3
Reaktionspunkte
0
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

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).
 
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.
 
Das ist meines Erachtens auch eine der grössten Schwachstellen, dass Aktionen keine Parameter und Stackvariablen besitzen.
Tja, so is das aber nunmal :rolleyes:

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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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 :ROFLMAO:) 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
 
Zurück
Oben