# Variable indirekt adressieren -CoDeSys-



## olb (15 Januar 2011)

Hallo,
Ich habe folgendes Problem:
ich möchte in einem FB eine boolsche Ausgangsvariable schalten, adressiert werden soll der Ausgang über ein Eintrag in einer INPUT_Variable.

Ich hab folgende globale Variablen: POS_301, POS_302, POS_303 ..... POS_328 (alle BOOL) diese sind ausgängen zugewiesen

Über den Eingang des FBs soll die Nummer eingegeben werden z.B. 301 dadurch soll im FB der Ausgang POS_ mit 301 verknüpft werden. Diesen will ich dann weiterverknüpfen. Hoffe das is bischen verständlich -.-

Ich habs mit Pointer, Arrays versucht aber nix hinbekomm 
vielleicht wirds durch mein nicht funktionierendes Beispiel klarer wass ich will ;>
-----------------------------------------
VAR_GLOBAL
    Pos_301 AT %QX100.0 :BOOL;           (* Beleuchtungsgruppe 301  *)
    Pos_301_P AT %QX100.1:BOOL;          (* Pausenlicht Beleuchtungsgruppe 301  *)
    Pos_302 AT %QX100.2:BOOL;            (* Beleuchtungsgruppe 302  *)
    Pos_302_P AT %QX100.3:BOOL;          (* Pausenlicht Beleuchtungsgruppe 302  *)
    ...
END_VAR

VAR_INPUT
    Ein_13:BOOL;
    BEL_NR:ARRAY [0..500] OF INT;
END_VAR

IF EIN_13=TRUE THEN
POS_[BEL_NR]:=TRUE;
ELSE
POS_[BEL_NR]_P:=TRUE;
END_IF;

-----------------------------------------

vielleicht kann mir ja jemand helfen 
über die sufu hab ich nüx gefunden


----------



## ebt'ler (15 Januar 2011)

Hi,

soweit ich mich erinnere kann man in den Symbolen keine Variablen unterbringen. 
Sicherlich müsstest du eine Startadresse vorgeben (z.B. QX100.0) und dann variabel einen Offset dazurechnen, jenachdem wo du hin willst.
Hier mal ein Beispiel: http://sps-forum.de/showthread.php?t=40485


----------



## Thomas_v2.1 (15 Januar 2011)

Ich hatte mal bei TwinCat etwas probiert, weiß aber nicht ob du das auch auf andere Systeme anwenden kannst.
Und zwar habe ich mir einmal eine Struktur angelegt, meinetwegen:

```
TYPE EA_STRUCT :
STRUCT
	Signal_1 : BOOL;
	Signal_2 : BOOL;
END_STRUCT
END_TYPE
```
Dann für deine mehrfachen Objekte ein E/A-Array z.B.:

```
E_Aggregat AT %I* : ARRAY[0..16] OF EA_STRUCT;
```

Im Twincat Systemmanager muss man dann die Eingangssignale mit den entsprechenden Variablen verknüpfen.
Hier gibt es aber ein paar Einschränkungen, weil in der Twincat Konfigurationsdatei immer ein ganzes Eingangs-Byte mit dem Array verknüpft wird. Mit wild durcheinandergewürfelten E/A wird das nichts.

Vom Prinzip her funktioniert das allerdings. Nur für deine Ausgänge musst du noch ein zweites Array anlegen.
Vielleicht haben die Codesys Spezis da noch eine bessere Vorgehensweise parat.


----------



## BerndAllgäu (16 Januar 2011)

Deklariere doch einfach in deinem FB die Ein- und Ausgänge folgendermaßen:


FUNCTION_BLOCK FB_Licht (*01.DEZ 2010,  *)
VAR
    (* Hardaware ein- und ausgänge *)
    Ausgang  AT %Q* :    BOOL;         (* Ausgang *)
    Eingang AT %I* :    BOOL;         (* Eingang *)

    (* intern benutzte Variablen *)
    iregenwas : Bool;
END_VAR

(* -------------------------------------------------------------- *)

Dann deklarierst du z.B. in deinem Programm oder in den Globalen Variablen die instanzen deines FB´s.

Dies kann z.B. so aussehen:

Licht               :    ARRAY [1..10] OF FB_Licht;


(* -------------------------------------------------------------- *)



Dann machst du dir in den Recurcen eine neue Variablen Liste die z.B. EA_VarConfig heißt.
Dieser kann erstmal leer sein...


Jezt kannst du wenn die Instanzen deklariert sind und die liste offen ist ind der Menüleiste auf "Einfügen->Alle Instanzpfade" Klicken


in deinem "EA_VarConfig" sollte dann folgendes stehen:

VAR_CONFIG
    .Licht[1].Ausgang AT %Q : BOOL;
    .Licht[1].Eingang AT %I : BOOL;
    .Licht[2].Ausgang AT %Q : BOOL;
    .Licht[2].Eingang AT %I : BOOL;
    .Licht[3].Ausgang AT %Q : BOOL;
    .Licht[3].Eingang AT %I : BOOL;
    .Licht[4].Ausgang AT %Q : BOOL;
    .Licht[4].Eingang AT %I : BOOL;
    .Licht[5].Ausgang AT %Q : BOOL;
    .Licht[5].Eingang AT %I : BOOL;
    .Licht[6].Ausgang AT %Q : BOOL;
    .Licht[6].Eingang AT %I : BOOL;
    .Licht[7].Ausgang AT %Q : BOOL;
    .Licht[7].Eingang AT %I : BOOL;
    .Licht[8].Ausgang AT %Q : BOOL;
    .Licht[8].Eingang AT %I : BOOL;
    .Licht[9].Ausgang AT %Q : BOOL;
    .Licht[9].Eingang AT %I : BOOL;
    .Licht[10].Ausgang AT %Q : BOOL;
    .Licht[10].Eingang AT %I : BOOL;
END_VAR

Jetzt mußt di nur noch den unvollständigen deklarationen eine Adresse vergeben.
Also aus %Q wir %QX10.0, %I wird %IX10.5 usw....

Das is meiner Meinung nach der eleganteste Weg in einem FB mit Hardware E/A´s zu arbeiten...


Gruß Bernd


----------

