Autor Thema: VAR_IN_OUT  (Gelesen 12493 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline hugo

  • Global Moderator
  • *****
  • Beiträge: 2 150
    • Profil anzeigen
VAR_IN_OUT
« am: 16. November 2008, 13:12:59 »
Wie Verwende ich einen Baustein mit VAR_IN_OUT soll hier am Beispiel ONTIME erklärt werden.

ein Bautein mit VAR_OUT YOUT END_VAR schreibt sein ergebnis in die Variable YOUT der Instanz:
zugriff durch instanzname.YOUT.

ein Bautein mit VAR_IN_OUT YIO END_VAR definiert keine instanzvariable sondern einen Pointer auf eine externe Variable.
der Aufruf des Bausteins INSTANZNAME(YIO := varname) übergibt der Instaz den Pointer auf eine externe Variable, in diesem Fall varname.
varname wird extern deklariert: VAR varname end_VAR.

der zugriff von aussen erfolgt dann natürlich nicht über instanzname.yio denn diese variable gibt es in der instanz gar nicht.
der zugriff kann direkt extern auf die variable varname erfolgen.

Das Beispiel unten zeigt ONTIME wie es mit externen Variablen verwendet wird.


[gelöscht durch Administrator]

Offline hugo

  • Global Moderator
  • *****
  • Beiträge: 2 150
    • Profil anzeigen
Re: VAR_IN_OUT
« Antwort #1 am: 16. November 2008, 20:12:26 »
hier noch weiterführende literatur zu VAR_IN_OUT

http://www.ipsta.de/download/freies/Folge_10.pdf

Offline hugo

  • Global Moderator
  • *****
  • Beiträge: 2 150
    • Profil anzeigen
Re: VAR_IN_OUT
« Antwort #2 am: 01. Dezember 2008, 21:46:50 »
Var_in_out scheint vielen Anwendern etwas unheimliches zu sein.
Viele fragen warum wir mehr und mehr I/O verwenden.
Hier ein paar erläuterungen warum und weshalb I/O variablen an einigen stellen sehr wohl sinnmachen.

1. eine I/O variable ist ein pointer auf eine ausserhalb des Bausteins definierte Variable.
das im grafischen Designer der Anschluß auf der Input seite liegt sollte niemanden stören denn eine I/O ist nun mal gleichermassen ein Eingang wie auch ein Ausgang.

2. die nutzung einer I/O variable kann deutliche performance vorteile bringen wenn es sich um große datenblöcke handelt, wie z.b arrays oder strings.
denn es wird beim aufruf lediglich ein 32 bit pointer übergeben und nicht wie sonst die gesamte datenstruktur.
würde man ein 1K byte großes array als input übergeben wird bei jedem aufruf das gesamte array von 1KB im speicher übertragen.
zusätzlich zu dem enormen zeitaufwand wird auch die datenstruktur doppelt angelegt, was schnell viel speicherplatz vergeuden kann.

fazit I/O variablen können stark zur performance steigerung und speicherplatz einsparung beitragen.

3. ein input eines fb kann nur von aussen beschrieben werden, und ein output von aussen nur gelesen werden.
eine i/O variable kann sowohl von innerhalb des bausteins wie auch von ausserhalb gelesen und geschrieben werden.
dadurch ist eine bidirektionale kommunikation möglich, die sonst nur sehr umständlich und ineffizient realisiert werden kann.
ein dimmer mit I/O bedeutet das auf dasselble dimm signal (die extern definierte variable) auch ein weiterer baustein zum beispiel szeneninformationen schreiben kann.
bei einer rampe koennte so von ausserhalb des bausteins ohne großen aufwand ein reset odder preset erzeugt werden.
man schreibt den neuen wert ganz simpel in die varaiable
ohne i/O musste man eine speziellen input pin auf den gewünschten wert setzen, den set input auf true setzen, den baustein aufrufen und dann wieder den set input auf false setzen.
der aufwand ist um ein vielfaches höher und die performance sehr schlecht.

4. remenent und persisitent sind möglichkeiten variablen bei spannungsausfall, reset und reload der software zu erhalten, dies ist zwar prinzipiell auch für bausteine möglich, dann wird aber immer der gesamte bautein remanent gehalten obwohl meist nur eine eizige variable nötig ist.
im falle von I/O kann der anwender selbst bei der deklaration der externen variable enscheiden was er remanent und was nicht remenant haben will.
da der remanente speicher meist nur relativ begrenzt ist wird hierdurch der speicherplatz effizienter genutzt.
ein weiterer grund nur das nötige remenent zu halen und nicht ganze bausteine ist die tatsache das der remanente speicher (meist flash) im vergleich zum normalen speicher sehr langsam ist und deshalb ganze bausteine im remanenten speicher stark die performance beeinflussen können.


also:
keine angst vor i/O variablen, sie sind an vielen stellen sinnvoll und erlauben höhere funktionalität.
in oscat werden wir überall dort wo deutliche vorteile sind I/O variablen einsetzen.
die angst etlicher anwender ist völlig unbegründet und wird sich nach dem ersten einsatz und verständniss auch sicherlich in gefallen wandeln.


fazit: i/O variablen erlauben höhere funktionalität bei geringem aufwand.