Eingangs- und Ausgangsvariablen in der Main.pou

tuxwurst

Level-1
Beiträge
18
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
VAR_INPUT/VAR_OUTPUT in der Main.pou und I/O-Linkliste

Ich bin noch relativ neu in SPS, nutze TwinCAT 3 XAE und komme eher aus der c/c++ Ecke. Ich soll mir den alten ST Code eines Kunden vorknöpfen und die Anlage um ein paar kleinere Features erweitern. Dabei bin ich schon ein paar mal über "seltsamen programmierstil" gestolpert. Kommentiert ist der Code natürlich kaum:/ Deshalb bin ich beim folgenden Tema jetzt nicht ganz sicher, ob der Kunde auf der Tastatur ausgerutscht ist oder ob ich noch etwas grundlegendes an SPS nicht verstanden habe:

In dem Projekt gibt es im wesentlichen eine MAIN.POU die in einem Zyklus von 100ms ausgeführt wird. Diese ruft dann Blöcke und Funktionen auf. Alle Hardware Ein-und Ausgänge sind schön säuberlich in einer Globalen Variablenliste deklariert.
Der Variablenteil der MAIN.POU sieht ungefähr so aus:
Code:
[I]VAR
[...]
END_VAR

[/I][I]VAR_INPUT[/I][I]
[...]
END_VAR
[/I]
[I]VAR_OUTPUT[/I][I]
[...]
END_VAR[/I]
Die Sektionen sind auch alle drei prall gefüllt. Ich kann aber bei den meisten nur einen mittlbaren Zusammenhang mit einer Periferie sehen. Die Werte der übrigen werden einmal pro Zyklus übertragen auf eine globale IO-Variable.

Wie ich verstanden habe sind VAR_INPUT und VAR_OUTPUT doch nur für Funktionen und Blöcke gedacht um Parameter mit der aufrufenden Instanz zu kommunizieren. Wie parameter und Rückgabewerte in höheren Programmiersprachen Oder gibt es noch irgend einen Mechanismus, dass der aufrufende Thread Eingangsparameter des entprechenden Programms ändert? In das Thema Einstellungen in den Threads muss ich mich auch noch rein wühlen. Offensichtlich meckert der Kompiler ja nicht, wenn man ihm ein Programm mit input-Variablen vorsetzt aber einen richtigen Sinn ergibt das irgendwie nicht. Korregiert mich.

Macht es in dem Fall noch einen Unterschied, ob ich die Variablen als VAR oder als VAR_INPUT deklariere?

Wenn wir schon dabei sind: gibt es eine Möglichkeit in der TcXaeShell, sich alle Linkings zwischen IO-variablen/IO-Devices in einer Tabelle übersichtlich dar stellen zu lassen, ohne sich mühsam durch den I/O-Baum durch klicken zu müssen?

Besten Dank.
 
Zuletzt bearbeitet:
In der Tat sinnfrei in Main.POU VAR_INPUT oder VAR_OUTPUT zu deklarieren. Was dieser Wrapper bezwecken soll, ist mir ein Rätstel. Eventuell werden über die Variablen Daten über das Prozessbild (unterschiedliche Tasks) ausgetauscht. Wobei auch dann ergibt VAR_INPUT keinen Sinn.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In der Tat sinnfrei in Main.POU VAR_INPUT oder VAR_OUTPUT zu deklarieren. Was dieser Wrapper bezwecken soll, ist mir ein Rätstel.
Danke. das beruhigt mich.
Eventuell werden über die Variablen Daten über das Prozessbild (unterschiedliche Tasks) ausgetauscht. Wobei auch dann ergibt VAR_INPUT keinen Sinn.
Ok. Wie würde das dann funktionieren? etwa so:
main.pou:
Code:
VAR_OUTPUT
  myMsg: String;
END_VAR
----------------------------------------------------------------
myMsg:="Hello World.";
sidetask.pou:
Code:
VAR
   myCopy:String;
END_VAR
----------------------------------------------------------------
myCopy:=Main.myMsg;
dürfte das nicht auch mit einfachen VARs funktionieren?
 
Zuletzt bearbeitet:
Ganz so sinnfrei ist das nicht. Man kann auch aus eínem PRG ein anderes PRG aufrufen. Wird heute nicht mehr so oft getan, sondern man arbeitet lieber mit FBs, um die Segnungen der OOP nutzen zu können.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok. Ich glaube, ich habs verstanden. Da ich den Aufruf der Main von einem anderen PRG hier ausschließen kann, ist es wohl in meinem Falle doch sinnfrei.

Wie sieht es eigentlich mit meiner anderen Frage aus? Kann ich mir irgendwo eine vollständige Liste aller deklarierten I/O Variablen im Projekt anzeigen lassen, mit deren verlinkten Klemmen/Registern? Also andersherum als im I/O-Baum.
 
In der Baumansicht, unter [Projektname] Project sollte [Projektname] Instance zu finden sein. Wenn du das aufklappst, findest du alle im Projekt deklarierten IO-Variablen. Ob diese mit der Hardware verknüpft sind oder nicht erkennst du am Symbol.
Über das Kontextmenü der Variablen kannst du dann z.B. zur Definition der Variablen springen oder zum verknüpften IO-Port (wenn eine Verknüpfung existiert).
 
Zurück
Oben