TIA Teil eines Arrays an einen Eingang eines FB übergeben

motorcross

Level-1
Beiträge
8
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes SPS Forum,

ich hätte eine Frage bezüglich der Übergabe eines Arrays an einen Funktionbaustein.

Ich habe in einem Funktionsbaustein einen Eingang mit einem Array von 1 bis 5 eines selbst erstellten Struct-Datentyps erstellt.

Dieser Baustein wird als Multiinstanz aufgerufen. Dabei sollen ihm 5 Arrayeinträge aus einem größeren Array des selben Datentyps übergeben werden.

Wie würde das funktionieren? Ich bekomme vom TIA Portal immer nur den Fehler, dass die Datentypen nicht zusammenpassen...

Vielen Dank für eure Hilfe!

Gruß motorcross
 
Was willst du denn hier übergeben ?
Den STRUCT als einzelnes ARRAY-Element ? Oder das komplette Array ?
In jedem Fall muss der Datentyp deines Bausteins dem entsprechen, was du da übergeben willst (also z.B. die STRUCT). Das sollte gehen.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Larry,

ich will aus dem Array [ 1 .. 100] of Struct die ersten 5 Elemente übergeben,
Das Eingangsarray des Bausteins ist nämlich Array [1 .. 5] of Struct.

Wie würde das gehen?

Gruß motorcross
 
Nein ... weil die Elemente selbst ja keinen eigenen Typ ergeben.
Du kannst aber 5 IN-Variablen des Typs STRUCT anlegen und dann die Elemente so übergeben ... oder das komplette Array und als Hilfsvariable den ersten Index (falls die weiteren Elemente immer direkt anschliessend sind) ...

Gruß
Larry
 
Du kannst das Array z.B. auch in 2 Dimensionen aufteilen:
MyArray[1..20, 1..5] of myudt

Dann kannst Du am Baustein-Eingang ein Array der 2. Dimension anlegen: MyArray[1..5] of myudt
und jedes einzelne Element der 1. Dimension Deines Arrays daran übergeben: z.B. MyArray[11].

Das funktioniert natürlich nur, wenn man keine beliebigen 5 Elemente auswählen möchte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wäre auch eine Möglichkeit.
Es sollen halt dem Funktionsbaustein nur 5 Punkte aus dem Array übergeben werden, in welchem mehrere hundert Stück drinstehen.
Diese 5 Punkte folgen in dem Array auch immer aufeinander, sodass man dann zum Beispiel nur sowas übergibt: DBDaten.Beispielarray[5] und dann werden vom Index 5 bis halt 10 die Daten übergeben.
 
Wäre auch eine Möglichkeit.
Es sollen halt dem Funktionsbaustein nur 5 Punkte aus dem Array übergeben werden, in welchem mehrere hundert Stück drinstehen.
Diese 5 Punkte folgen in dem Array auch immer aufeinander, sodass man dann zum Beispiel nur sowas übergibt: DBDaten.Beispielarray[5] und dann werden vom Index 5 bis halt 10 die Daten übergeben.
Dann würde es ja mit den 2 Dimensionen passen.
Wenn Du Array[11] übergibst, wären das dann 51..55 beim ursprünglichen Array gewesen.

Was trotzdem nicht geht, wäre z.B. 53..57.
 
Wie groß ist denn so eine Struktur?
Du könntest auch immer das selbe Array [1..5] of Struct übergeben, und vor dem FB-Aufruf die Daten von 5 einzelnen (sogar beliebigen) Punkten in das Übergabe-Array kopieren.
Nicht dass womöglich eine "elegante" Lösung viel aufwendiger ist als simples Kopieren.

Oder ganz extrem simpel: die 5 Punkte einzeln über 5 Parameter übergeben.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi,
bei codesys sollte das ähnlich sein ...
hier übergebe ich ein einzelnes element eines arrays einer struktur an einen baustein ...
der eingang "Element" ist dann als Element:elementStruct definiert ...
struct1.PNG

wird der eingang als "Element: array[1..5] of elementStruct;" definiert, kann ein ganzes array übergeben werden.
 
Es sollen halt dem Funktionsbaustein nur 5 Punkte aus dem Array übergeben werden, in welchem mehrere hundert Stück drinstehen.
Diese 5 Punkte folgen in dem Array auch immer aufeinander, sodass man dann zum Beispiel nur sowas übergibt: DBDaten.Beispielarray[5] und dann werden vom Index 5 bis halt 10 die Daten übergeben.

dann solltest du aber wirklich (auch um alles offen zu haben) es so machen :
... oder das komplette Array und als Hilfsvariable den ersten Index (falls die weiteren Elemente immer direkt anschliessend sind) ...
Der Baustein lädt ja dadurch nicht das ganze Array - er hat halt nur kompletten (und symbolischen) Zugriff darauf ...

Gruß
Larry
 
Alles klar,

ich hatte nur die Bedenken, dass wenn ich das "ganze" Array übergebe, die Ramauslastung unnötig steigt und ggf. die Zykluszeit erhöht wird.
Aber wenn dadurch nur der Zugriff auf das gesamte Array ermöglicht wird, ist das nicht tragisch.
Ich werde das jetzt mit einer Index Inputvariablen realisieren.

Danke für eure Hilfe!

Gruß motorcross
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Damit der DB bei der Übergabe nicht kopiert wird, sondern nur als Referenz übergeben wird, muß er als IN_OUT deklariert sein und vom selben Zugriffstyp Standard/optimiert wie der FB sein.

Harald
 
Hm, das ist bei meiner Umsetzung wieder problematisch weil eigentlich nur lesen zugegriffen werden darf. Ebenso muss es möglich sein den Eingang am Baustein frei zu lassen und das ist ja leider bei In/Out Variablen nicht möglich.
 
Wie du darauf zugreifst liegt ja an der Programmierung innerhalb des Bausteins.
Wenn du den Parameter nicht benutzen willst dann brauchst du den Baustein ja auch gar nicht aufzurufen - die Parameterübergabe erfolgt ja schließlich schon bei der Erstellung und nicht erst im laufenden Betrieb.
Vielleicht solltest du doch noch mal genau beschreiben, was du eigentlich machen willst ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht solltest du doch noch mal genau beschreiben, was du eigentlich machen willst ...
Larry

Ja da hast du vielleicht recht.

Bei dem Baustein handelt es sich um eine universelle Ansteuerung für Roboter. Diesem Baustein müssen entsprechende Positionen zum Anfahren übergeben werden.
Je nachdem welcher Roboterhersteller ausgewählt ist, werden an den Baustein entweder die Positionsdaten (Array vom Typ Struct) an den Eingang "Position Kuka" oder Position Staubli angelegt.
Der andere bleibt jeweils leer. Ich musste zwei verschiedene Eingänge nehmen, da die Positionsdatentypen zwischen Kuka und Stäubli unterschiedlich sind.

Das Problem ist halt, wenn ich diese Eingänge nun als IN/Out Variablen definiere, wirft mir das TIA Portal einen Fehler, dass entsprechend ein In/out Eingang nicht angeschlossen ist und daher nicht kompilliert werden kann.

Diese Eingänge sind unterschiedliche Structs.

eq5y5ylpdDEz8YotqWyTpiAz1QbLOw78K IA8nKc13VOwI4FZICYS7hehvxBDqlzsIdwvR3aggNEHuINwtRHejgtAEuYNwtxDdjQpCE QOwh0AABiCcAcAAIYg3AEAgCEIdwAAYAjCHQAAGIJwBwAAhiDcAQCAIQh3AABgCMIdAAAY8v8BDWCN4a0OiXEAAAAASUVORK5CYII=


Gruß motorcross
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    11,7 KB · Aufrufe: 19
... Der andere bleibt jeweils leer. Ich musste zwei verschiedene Eingänge nehmen, da die Positionsdatentypen zwischen Kuka und Stäubli unterschiedlich sind.

Das Problem ist halt, wenn ich diese Eingänge nun als IN/Out Variablen definiere, wirft mir das TIA Portal einen Fehler, dass entsprechend ein In/out Eingang nicht angeschlossen ist und daher nicht kompilliert werden kann.

Diese Eingänge sind unterschiedliche Structs...
Dann würde sich hier der Parametertyp "VARIANT" anbieten. Diesen kannst du u.a. auf den Datentyp abfragen. Siehe hierzu in der Onlinehilfe nach "VARIANT-Anweisungen". Das ist zwar etwas aufwendiger, man kann damit aber auch einiges machen.
 
Das Problem ist halt, wenn ich diese Eingänge nun als IN/Out Variablen definiere, wirft mir das TIA Portal einen Fehler, dass entsprechend ein In/out Eingang nicht angeschlossen ist und daher nicht kompilliert werden kann.
Ist das denn wirklich ein Fehler oder etwas, das TIA nur nicht mag ?
Ich konnte das jetzt nur mit Classic nachstellen - da ist das aber beim Aufruf erstmal egal ...
Ggf. Kannst du ja auch eine Prüfung abstellen ... oder einen Dummy-Pointer übergeben ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So habe ich das jetzt gemacht. Ich übergebe die Arrays als VARIANT und schlüssel die Elemente im Baustein wieder auf.
Das hat wunderbar geklappt. Ich hatte zuvor noch nicht von diesem Datentyp gehört.
Vielen Dank für die Hilfe!
 
So habe ich das jetzt gemacht. Ich übergebe die Arrays als VARIANT und schlüssel die Elemente im Baustein wieder auf.
Das hat wunderbar geklappt. Ich hatte zuvor noch nicht von diesem Datentyp gehört.
Würdest Du für diejenigen, die da auch noch nichts davon gehört haben, vlt. Screenshots und/oder Codeauszüge von Deiner Löung posten?
Hilft vielleicht mal anderen mit einem ähnlichen Problem.
:cool:
 
Für die Übergabe eines Teils eines Arrays vom Typ Struct an einen Funktionsbaustein hat sich die Übergabe mit dem Datentyp "VARIANT" im Inputbereich als am Besten geeignet herausgestellt.
Dies liegt daran, dass das zu übergebene Array in meinem Fall sehr groß ist aber nur 5 Elemente aus diesem benötigt werden. Ebenso soll ein weiteres Array mit einem anderen Struct Datentyp am gleichen Eingang übergeben werden.
Die VARIANT Eingangsvariable ist ein Zeiger auf den Anfang des entsprechend übergebenen Arrays.
Durch einen weiteren Eingang hier "Robot Type" wird letztendlich festgelegt aus welchem Struct-Datentyp das übergebene Array besteht.
Mit dem Baustein "MOVE_BLK_VARIANT" wird dann letztendlich der gewünschte Indexbereich aus dem übergebenen Array in ein datentypgleiches temporäres Array mit z.B 5 Elementen kopiert.
Mit diesem kann dann innerhalb des Bausteins weiter verfahren werden.

In den Bilder könnt ihr die Verarbeitung sehen!
Danke nochmal für eure Hinweise!

Gruß motorcross
MOVE_BLK_VARIANT.PNGEingangsvariablen.PNG
 
Zurück
Oben