# Eingangs- und Ausgangsvariablen in der Main.pou



## tuxwurst (9 September 2019)

*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: 

```
[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.


----------



## plcSniffer (9 September 2019)

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.


----------



## tuxwurst (10 September 2019)

plcSniffer schrieb:


> 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.


plcSniffer schrieb:


> 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:
	
	



```
VAR_OUTPUT
  myMsg: String;
END_VAR
----------------------------------------------------------------
myMsg:="Hello World.";
```
sidetask.pou:
	
	



```
VAR
   myCopy:String;
END_VAR
----------------------------------------------------------------
myCopy:=Main.myMsg;
```
dürfte das nicht auch mit einfachen VARs funktionieren?


----------



## StructuredTrash (10 September 2019)

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.


----------



## MasterOhh (11 September 2019)

"MAIN" ist ein ganz normaler Programmbaustein. Daher kommt er auch mit dem Standard Interface eines Programmbausteins.


----------



## tuxwurst (11 September 2019)

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.


----------



## MasterOhh (11 September 2019)

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).


----------

