TIA Achsbaustein: AXIS_REF als InOut-Variable

D-Platoon

Level-2
Beiträge
43
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin mal wieder in der Siemens-Welt gelandet und hab folgendes vor:
Ich habe 4 Achsen, die prinzipiell das Selbe bewerkstelligen sollen. Also möchte ich mir einen FB_Achse erstellen, in dem alle benötigten Bausteine aufgerufen werden. Z.B. MC_Init, MC_MoveAbsolute ect.pp. So mache ich das zumindest in der Beckhoff immer.
Jetzt gibt's ja da an jedem Baustein die Variable Axis vom Typ AXIS_REF. Diese ist bei den einzelnen Bausteinen eine IO-Variable.
Diese möchte ich bei meinem FB_Achse nun auch als IO-Variable nach draußen geben, so dass ich schön Instanzieren kann. Ich nennen sie mal iostr_Axis. Wenn ich diese (bzw. das Element Ax darin) nun an die Bausteine Verknüpfen will, mag mich TIA nicht mehr, sondern meckert "Unzulässige Parameterversorgung für Axis.". Deklariere ich selbige Variable als Static ist alles okay. Nur bringt mich das zum instanzieren ja nicht wirklich weiter.

Hat jemand einen Tipp?
 
meckert "Unzulässige Parameterversorgung für Axis."
Nur elementare Datentypen können von IN_OUT an aufgerufene Bausteine weitergereicht werden.


Deklariere ich selbige Variable als Static ist alles okay. Nur bringt mich das zum instanzieren ja nicht wirklich weiter.
Wieso nicht? Du kannst doch Instanzen Deines FB_Achse erstellen.

Wenn Du denn Deine Achs-Instanzen außerhalb des FB_Achse haben willst, dann müßtest Du am Anfang des FB_Achse die iostr_Axis auf eine lokale Variable kopieren, mit dieser Kopie arbeiten und am Ende wieder auf iostr_Axis kopieren. Und penibel aufpassen, daß die Variablen der FB_Achse nicht zwischen den Instanzen vermischt werden! Im Grunde benutzt Du den FB_Achse dann wie eine FC und die STAT-Variablen dürfen nur wie TEMP-Variablen benutzt werden (sind aber im Gegensatz zu TEMP von außen beobachtbar).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald!

Vielen Dank für deine Ausführungen!

Nur elementare Datentypen können von IN_OUT an aufgerufene Bausteine weitergereicht werden.
Gut zu wissen! Bin wohl von Beckhoff zu sehr verwöhnt worden - dort gehen auch Strukturen.

Wieso nicht? Du kannst doch Instanzen Deines FB_Achse erstellen.
Ich bin jetzt bei den Bausteinen noch nicht so tief drin. Aber ich war es von Beckhoff gewöhnt, dass ich die Struktur direkt an die Hardware weitergebe. Damit wird dann alles übergeben, was die Achse braucht (Solldrehzahl, Sollposition, Istopsition ect.).
Deshalb dachte ich, dass das mit dem AXIS_REF auch so ist. Ergo bräuchte ich die Variable außerhalb des Bausteins. Oder bin ich da auf dem Holzweg?

Mein Problem ist, dass ich noch im Büro am Schreibtisch sitze und die Hardware noch nicht fertig ist, sonst könnte ich schonmal probieren.

Wenn Du denn Deine Achs-Instanzen außerhalb des FB_Achse haben willst, dann müßtest Du am Anfang des FB_Achse die iostr_Axis auf eine lokale Variable kopieren, mit dieser Kopie arbeiten und am Ende wieder auf iostr_Axis kopieren.
Das hatte ich schon befürchtet.

Und penibel aufpassen, daß die Variablen der FB_Achse nicht zwischen den Instanzen vermischt werden!
Also bei Beckhoff ist eine Instanz in sich abgeschlossen. Was in der Instanz abgearbeitet wird, bleibt auch drinne. Es sei denn, man verweist explizit nach draußen. Ist das bei Siemens anders?
Bzw. wie könnten sie sich vermischen bzw. wie kann ich es verhindern?

Grüße,
Thomas
 
Zuletzt bearbeitet:
Also bei Beckhoff ist eine Instanz in sich abgeschlossen. Was in der Instanz abgearbeitet wird, bleibt auch drinne. Es sei denn, man verweist explizit nach draußen. Ist das bei Siemens anders?
Bei Siemens kann ungehindert auf alle Instanzvariablen von außen zugegriffen werden. Das wird nur von der Disziplin des Programmierers begrenzt.


Bzw. wie könnten sie sich vermischen bzw. wie kann ich es verhindern?
Dein FB_Achse wäre bei Deinem Vorhaben gar nicht "instanziiert" bzw. es gäbe nur 1 Instanz des FB.

Das Problem: Du willst alles in einen FB packen, der FB kann Static-Variablen haben, man könnte in Versuchung kommen die Static-Variablen als Variablen mit "Gedächtnis" zu nutzen (z.B. für Flankenmerker oder Timer), der FB (die selbe Instanz!) wird dann aber für jede externe Achs-Instanz einmal aufgerufen --> dann arbeitet jede Achs-Instanz mit den Hinterlassenschaften der davor aufgerufenen Achs-Instanz. Bei einem FC besteht diese Gefahr nicht.

Abhilfe: Für jede Achs-Instanz eine eigene FB_Achse-Instanz benutzen - dann kann aber auch gleich die Achs-Instanz in FB_Achse liegen und müßte dann nicht kopiert werden.

Harald
 
Zurück
Oben