ARRAY an FC übergeben

klauserl

Level-2
Beiträge
246
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
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!
 
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?
 
Ich habe da auch mal ne Frage wo schaltet man die Typenprüfung im Simatic Manager aus?
 
Zuletzt bearbeitet:
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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,
 
...
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

.
 
Danke!

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

MfG
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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:

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

...
 
Hallo,

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

MfG
Daniel
 
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!
Code:
 XY : ARRAY[1..20,0..1] OF REAL;
Wie muss ich nun den Eingang beschalten, ohne das Step7 mekert?

L.G.
 
Zuletzt bearbeitet:
Zurück
Oben