UDT an FB übergeben

Ralle

Super-Moderator , User des Jahres 2006-2007
Teammitglied
Beiträge
15.414
Reaktionspunkte
4.043
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich haben einen fremden FB, welcher als IN_OUT-Variable eine UDT verlangt. Das funktioniert problemlos.
Jetzt will ich diesen FB in einen eigenen FC verpacken, welcher also u.a. diese UDT-Var weitergibt. Das geht lt. Siemens nicht:

Code:
Beschreibung:

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

·	Die Zuweisung ist aus technischen Gründen nicht möglich, z.B. kann keine STRING- oder DATE_AND_TIME-Konstante als Aktualparameter verwendet werden (zu viele Einzelbefehle).

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

·	Ihr Formalparameter trägt ein S7_server Attribut und läßt daher die entsprechende Versorgung nicht zu, da z.B. der Aktual Parameter vom Server selbst vergeben werden muß oder lokal versorgt werden soll.

Behebung:

Bitte passen Sie Ihren Bausteinaufruf entsprechend diesen Regeln an.

Kennt jemand eine elegante Möglichkeit dies doch zu bewerkstelligen, ohne den ganzen UDT-Bereich mit BLK_MOVE umzukopieren?
 
Hallo Ralle,

beim ANY-Pointer ging so etwas, indem man ihn in die Lokaldaten übertrug, und ihn von dort an den aufzurufenden Baustein übergab. Mir ist jedoch bis heute der Unterschied zwischen den Parametertypen "UDT" und "ANY" noch nicht klar.
Beim SPS-conceptler gab es mal einen "ANY-MOVER"-Baustein für so etwas.


Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Definiere in deinem FC eine TMP_Variable (Typ UDTxx).
Kopiere den Inhalt der "echten" Variable (Typ UDTxx) in die temporäre Variable (weiß nicht ob es so einfach mit BLOCK MOVE geht. sonst mit Hilfe der Adressregister)
Rufe den FB innerhalb deiner FC mit der TMP_Variablen auf.

Also ohne umkopieren (mit oder ohne Block Move) wirds wohl nicht gehen
 
@SinusQuadrat

Danke, das habe ich auch schon vermutet. Ich will jetzt mal versuchen, die UDT gar nicht mehr in einem extra DB abzulegen, sondern im aufrufenden FB als statische Variable, dann erscheint sie im Instanz-DB und kann an den untergeordneten FB übergeben werden (Jedenfalls gibt es keine Fehlermeldung beim Programmieren). Ob es in der Praxis funktioniert muß ich dann ausprobieren.
 
Ja das geht, ist ja das gleiche wie ein Image im Temp abzulegen. Das Problem bei dir ist halt der fest vorgegebene FB. Wenn du dir selber ein schreibst, kannst du dir die Adresse als Eingang übernehmen, aber so, :shock:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, stimmt, das war wahrscheinlich bequem, da man die Bezeichnungen in der übergebenen UDT innerhalb des FB prima nutzen kann. Nur leider nicht nochmal eine Ebene tiefer weiterreichen.
 
Zurück
Oben