# ARRAY an FC übergeben



## klauserl (4 Januar 2008)

Hallo!

Hab im DB10 ein Array[1..3] vom Format Real angelegt.
Will damit nun einen FC Var IN versorgen.
Wie bitte lautet da die genaue Eingabe, damit der FC dies auch akzeptiert?
Habe bis dato mit Arrays noch nichts zu tun.
Schöne Grüße!


----------



## Ralle (4 Januar 2008)

Die Einfachste ist, im FC als IN (Test) ebenfalls ein Array[1..3] anzulegen.
Der Aufruf erfolgt dann am FC symbolisch, jedenfalls gelingt mir das nur, wenn ich das symbolisch antrage, obwohl es auch mit dem entsprechenden Pointer gehen sollte. Im FC kannst du dann mit Test[1], Test[2] auf die Arraywerte zugreifen.

Bsp.: Der DB heißt "DB_Test_Array"
darin definiert Test_Array Array[1..3] of Real

dann lautet der Aufruf am FC: "DB_Test_Array".Test_Array
eigentlich sollte auch P#DB301.DBX 0.0 BYTE 12 funktionieren, aber das kann man aus irgendeinem unerfindlichen Grund, nicht von Hand an den FC schreiben, er akzeptiert es nicht, trotz abgeschalteter Typprüfung.

Weiß jemand eigentlich den Grund?


----------



## tim_taylor (4 Januar 2008)

*NurEinVersuch*

wenn du P#DB301.DBX 0.0 Real 4 schreibst, funktioniert es dann?


----------



## Günter (4 Januar 2008)

Ich habe da auch mal ne Frage wo schaltet man die Typenprüfung im Simatic Manager aus?


----------



## klauserl (4 Januar 2008)

tim_taylor schrieb:


> wenn du P#DB301.DBX 0.0 Real 4 schreibst, funktioniert es dann?


Hallo!
Leider NEIN!

Es handelt sich um den Baustein (FC65) LINEAR_INT aus der aktuellen Oscat Bibliothek2.5 (Arethmetische Funktionen) 
Gruß!!!


----------



## OHGN (4 Januar 2008)

Günter schrieb:


> Ich habe da auch mal ne Frage wo schaltet man die Typenprüfung im Simatic Manager aus?


Im KOP/FUP/AWL- Editor:

Extras->Einstellungen->KOP/FUP: Das Häkchen "Typprüfung von Operanden" rausnehmen


----------



## Ralle (4 Januar 2008)

Nochmal nachfragen: Was für eine Variable erwartet denn der FC?

So er eine einzige Real erwartet dann: "DB_Test_Array".Test_Array[1] bzw. DB301.DBD0, je nachdem, welcher DB und welches DBD.


----------



## Onkel Dagobert (4 Januar 2008)

P#DB301.DBX 0.0 Real 4 würde funktionieren, wenn der Eingang als ANY deklariert wäre. Wenn man das ARRAY als solches übergeben möchte, so geht es wohl nur so wie Ralle es beschrieben hat, wobei der Bereich [1..3] genau übereinstimmen muss.

Am saubersten wäre es wenn man ein UDT of ARRAY vereinbart, welches man dann im DB und als Eingangsvariable in der FC (als UDT) verwendet.


Gruß, Onkel


----------



## holland (4 Januar 2008)

So gehts:

Bausteinparameter:

VAR_IN_OUT
  ElTab                    :tElTab;    // Elemententabelle FOEL
  ElMerker                 :tElMerker; // Elementmerker FOEL
  Status                   :tElStatus; // Status FOEL
  Merker AT ElMerker       :STRUCT

Aufruf:

ElTab                := "dbElInfo".Ix[ElIxTemp].Eltab, 
ElMerker            := "dbElInfo".Ix[ElIxTemp].ElMerker,
Status              := "dbElInfo".Ix[ElIxTemp].Status,


----------



## IBN-Service (5 Januar 2008)

Onkel Dagobert schrieb:


> ...
> Am saubersten wäre es wenn man ein UDT of ARRAY vereinbart, welches man dann im DB und als Eingangsvariable in der FC (als UDT) verwendet.
> 
> 
> Gruß, Onkel



Hallo OD,

ich bin genau deiner Meinung...

Der Einsatz des UDT hat noch weitere Vorteile.
Z.B. sind Kommentaränderungen im UDT an allen referenzierten Stellen
sichtbar, das erhöht die Transparenz eines Programmes sehr.

Weiterhin wird mittels Konsistenzprüfung ein geänderter / erweiterter UDT
an allen Einsatzstellen sichtbar. Eine Programmerweiterung läst sich dann
schnell an allen relevanten Stellen durchführen.

CU

Jürgen

.


----------



## dalbi (5 Januar 2008)

Danke!

in der nächsten Release 2.6 werden dann die Arrays als UDT übergeben.
Ist einfacher wenn man kein SCL hat.

MfG
Daniel


----------



## Ralle (5 Januar 2008)

Wenn ich mich recht entsinne, hat das aber den Nachteil, daß man UDT nicht nach "unten" weiterreichen kann, also nur eine Bausteinebene damit erreichen kann. Ein FC, der eine UDT mitbekommt, kann diese also nicht an den nächsten FC weiterreichen. Von daher ist das u.U. hinderlich.


----------



## IBN-Service (5 Januar 2008)

Ralle schrieb:


> Wenn ich mich recht entsinne, hat das aber den Nachteil, daß man UDT nicht nach "unten" weiterreichen kann, also nur eine Bausteinebene damit erreichen kann. Ein FC, der eine UDT mitbekommt, kann diese also nicht an den nächsten FC weiterreichen. Von daher ist das u.U. hinderlich.



Hallo Ralle,

du entsinnst dich richtig.

Allerdings sollte sich das, _im Vergleich zu einem Array_, nicht zusätzlich
hinderlich auswirken, da sich in FC auch Arrays nicht weiterreichen lassen, siehe Ausszug aus der S7 Onlinehilfe:


```
Obwohl kein Typkonflikt zwischen Aktualparameter (rechte Seite) und 
Formalparameter (linke Seite) vorliegt, kann diese Parameterzuweisung 
nicht zugelassen werden. Folgende Gründe können vorliegen:

...

·      Das Maschinenmodell STEP 7 erlaubt die Zuweisung nicht, 
       z.B. kann ein STRUCT/[B]ARRAY[/B]/ANY/[B]UDT[/B]/STRING -  
       INPUT/OUTPUT/IN_OUT - Parameter eines FCs nicht an einen darin 
       aufgerufenen Baustein weitergereicht werden.

...
```


----------



## dalbi (6 Januar 2008)

Hallo,

weiterreichen Funktioniert schon man muss hier nur denn Umweg über die Temporären gehen. 

MfG
Daniel


----------



## Ralle (6 Januar 2008)

Ja, das ist klar, es sollte ja möglichst einfach sein. Aber in SCL läßt sich das ohnehin viel einfacher lösen als in AWL  .


----------



## klauserl (6 Januar 2008)

Ralle schrieb:


> Nochmal nachfragen: Was für eine Variable erwartet denn der FC?
> 
> So er eine einzige Real erwartet dann: "DB_Test_Array".Test_Array[1] bzw. DB301.DBD0, je nachdem, welcher DB und welches DBD.


 
Hallo
Funktioniert alles nicht.
Hab nun schon wirklich alle Varianten probiert.
Der Eingang des FC ist folgendermassen deklariert!

```
XY : ARRAY[1..20,0..1] OF REAL;
```
Wie muss ich nun den Eingang beschalten, ohne das Step7 mekert?

L.G.


----------



## IBN-Service (6 Januar 2008)

klauserl schrieb:


> Wie muss ich nun den Eingang beschalten, ohne das Step7 mekert?
> 
> L.G.



Hallo Klaus,

z.B. so: DB1.XY_ARRAY

Wobei XY_ARRAY das *Symbol *für den gleichwertigen Array im DB1 ist.

Ich schick dir per PM noch ein Beispiel zu, dann siehst du genau,
wie es funktioniert.

CU

Jürgen
IBN-Service

.


----------



## Ralle (6 Januar 2008)

@Klauserl

Das hatte ich dir doch hier genau beschrieben, liest du die Posts ?

http://www.sps-forum.de/showpost.php?p=113381&postcount=2



> dann lautet der Aufruf am FC: "DB_Test_Array".Test_Array



Das Ganze setzt voraus, das die Definitionen der Arrays am FC-INPUT und im DB exakt gleich sind!


----------



## zotos (6 Januar 2008)

Ralle schrieb:


> @Klauserl
> 
> Das hatte ich dir doch hier genau beschrieben, liest du die Posts ?
> ...



...vielleicht bevorzugt er den Support via PM?


----------



## Onkel Dagobert (18 Januar 2008)

klauserl schrieb:


> ...
> Funktioniert alles nicht.
> Hab nun schon wirklich alle Varianten probiert.
> Der Eingang des FC ist folgendermassen deklariert!
> ...


Hat das eigentlich mal jemand probiert? Klauserl übergibt ein zweidimensionales Array. Das geht nicht, oder?


Gruß, Onkel


----------



## Kai (18 Januar 2008)

klauserl schrieb:


> Der Eingang des FC ist folgendermassen deklariert!
> 
> ```
> XY : ARRAY[1..20,0..1] OF REAL;
> ...


 
Hier mal ein kurzes Beispielprogramm.

Gruß Kai


----------



## IBN-Service (18 Januar 2008)

Onkel Dagobert schrieb:


> Hat das eigentlich mal jemand probiert? Klauserl übergibt ein zweidimensionales Array. Das geht nicht, oder?
> 
> 
> Gruß, Onkel




Doch, das geht.

Auch mit mehrdimensionalen Array, siehe Anhang.

Gruß,

Jürgen.


----------



## dalbi (18 Januar 2008)

Hallo Leute,

anbei noch mal ein Beispiel.
Mit der alten Version und der neuen.

Unterschied: alt ARRAY [1..20, 0..1] REAL
                  neu UDT

Verstehe das Problem hier bei nicht? Warum soll es nicht gehen?


MfG
Daniel


----------



## Nordischerjung (10 November 2008)

Hallo,

ich möchte dieses Thema noch einmal erneuern.
Ich habe ein UDT1 angelegt mit einem ARRAY[0..20] Of BOOL.
Diesen UDT habe ich 2 mal im DB11 eingefügt.
Jetzt möchte ich dies ARRAYs an den FC 2 übergeben als IN Parameter.
(Im FC 2 als IN UDT1 2x). Ich kann beim Bausteinaufruf den DB11 und dann die beiden Parameter anwählen. 
Trotzdem bleibt die Bezeichnung rot und er sagt es ist keine Komponente von DB 11. Warum???

Grüße von der Ostsee

Nordischerjung


----------



## Larry Laffer (10 November 2008)

Hallo,
berücksichtige bitte, dass du dort einen Pointer übergibst.
Am Einfachsten geht es, wenn du den Parameter symbolisch übergibst.

Ansonsten : wie sieht dein Beispiel denn konkret aus ?

Gruß
LL


----------



## Nordischerjung (10 November 2008)

Hallo,
hab ich alles symbolisch gemacht. Irgendwie komisch,
ich hab jetzt einen neuen DB angelegt, mit dem selben UDT usw usf.
Jetzt klappte es


----------



## Ralle (10 November 2008)

Nordischerjung schrieb:


> Hallo,
> hab ich alles symbolisch gemacht. Irgendwie komisch,
> ich hab jetzt einen neuen DB angelegt, mit dem selben UDT usw usf.
> Jetzt klappte es



Wenn man des FC offen hat in welchem die Udt verwendet wird und dann einen DB mit der Udt anlegt bzw. die UDT oder den DB ändert, ist es nötig, den FC und den DB zumindest zu speichern. Manchmal hilft auch nur, beide zu speichern und zu schließen, damit beim nächsten Öffnen das Ganze dann erkannt wird.


----------

