Step 7 UDT als Eingangsvariable eines Multiinstanz-FBs

Bär1971

Level-1
Beiträge
220
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe einen Multiinstanz-FB welcher intern einen UDT in seinen STAT-Lokaldaten referenziert. In dem UDT sind die Verbindungsdaten einer IE-Kommunikation.
Nun möchte ich diesen UDT flexibel als Eingangsvariable haben um mit dem FB auf verschiedene Geräte zugreifen zu können. Die Kommunikations-FBs von Siemens welche innerhalb meines FBs in Multiinstanz aufgerufen werden sind flankengetriggert, sodass ich meinen Multiinstanz-FB einfach nach Bedarf neu beschalten mag um andere Geräte anzusteuern.
Gewollt wäre beim Aufruf des FBs eine Eingangsvariable UDT wo ich dann mit "UDT 50" beschreibe, oder eine Integer-Eingangsvariable welche nur mit "50" beschrieben wird, und dann intern im Programm des FBs auf den entsprechenden UDT referenziert. Die Größe der UDTs sind alle identisch.
Mein Problem ist nun, das ich nicht weis, wie ich die Eingangsvariable anlegen soll. Ich kann z.Bsp. Datentyp "UDT 50" angeben und somit nur direkt den UDT adressieren, aber eben nicht flexibel.
Alternativ kann ich auch eine Zahl übergeben, aber ich weis leider nicht wie ich dann den "UDT-Bereich" richtig als STAT-Variable anlege und mit der übergebenen Zahl referenziere...

Wer hat hier eine Idee?
 
Du hast sozusagen eine Eingangsvariable iUdtNummer vom Typ Integer, und dann soll intern im Programm eine Struktur vom Typ UDT[#iUdtNummer] sein?
Das funktioniert nicht.
 
Hallo,
an dieser Stelle vielleicht erstmal der Hinweis, das ein UDT keine Referenz eines Speicherbereiches ist sondern nur eine Aufbau-Festlegung.
Du mußt diese UDT's also immer einem erreichbaren Speicher zuordnen - z.B. einem DB. Willst du alle UDT's in einen DB packen, also eigentlich darin Strukuren definieren, dann muss es dem Entflechtungs-Programm (also der Baustein, dem du die Index-Nummer übergibst) bekannt sein, wie groß jeder der Strukturen ist um die Anfangsadresse der gewünschten Struktur berechnen zu können. Dann müßtest du in dem Baustein alle Strukturen (z.B. im TEMP-Bereich) deklariert haben damit du später sinnvoll auf die Einzel-Elemente zugreifen kannst.
Das wäre mir (gelinde gesagt) ein "bißchen" zu viel Aufwand für den möglichen Nutzen unter Abwägung der (Nicht-)Nachvollziehbarkeit des Codes ...

Gruß
Larry
 
Hm... mal kurz bis wohin ich Gedanklich schon vorgestossen bin:

Der Siemens-Baustein T_CON hat eine In/Out-Variable von Typ Any für die Verbindungsparameter.
Hier gibt man ja die Datenbausteinvariable an, in welcher der UDT referenziert ist.

Ich rufe nun den T_CON innerhalb meines eigenen FBs auf und möchte beim Aufruf meines eingenen FBs frei definieren, welche Struktur gültig ist (UDT50, UDT51, UDT52...) Jede dieser UDTs sind strukturell gleich, haben nur andere Verbindungsdaten für verschiedene durch IE angebundene Geräte.

Ich habe in meinem FB eine In/Out-Variable vom Typ ARRAY [0..64] of Byte angelegt (entspricht der Größe eines UDTs), kopiere Diese in eine STAT-Variable vom Typ ARRAY [0..64] of Byte und verschalte nun diese Variable an den Any-In/Out des T_CON. Step7 frisst das soweit noch.

Aber ich kann nun sicher nicht wenn ich meinen FB aufrufe an die In/Out-Variable "UDT50" schreiben, das geht eben nicht. Oder doch?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein ... das geht nicht weil UDT50 keine Variable ist. Du mußt also schon irgendwo (DB oder Lokaldaten) eine Variable anlegen, deren Typ nicht INT oder REAL sondern UDT50 ist ...
 
ich versuche eben zu vermeiden, das wenn mein Baustein aufgerufen wird in den Globaldaten angepasst werden muss... klar könnte ich im aufrufenden Baustein STAT-Variablen für alle UDTs schaffen und dann die entsprechende Variable an meinen Baustein beschalten, aber dann bin ich nicht mehr flexibel. Ich weis ja nicht, hab ich 1, 2, 5... Geräte und möchte es eben flexibel halten ohne in den Datenstrukturen aktualisiernötige Einträge zu verursachen... soll eben ein in sich geschlossener multiinstanzfähiger Vorlagenbaustein werden, der beim Aufruf beschaltet wird und fertig
 
Das mit deinen unterschiedlichen UDTs verstehe ich nicht. Es gibt doch nur eine UDT-Struktur! Diese kann natürlich X-Mal verwendet werden und mit unterschiedlichen Daten gefüttert werden. Also DB erstellen und X Variablen vom Typ UDTx erstellen. Diese kannst anschließend deinem FB übergeben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
so ähnlich versuch ichs grad. Im aufrufenden Baustein habe ich eine STAT-Variable vom Typ UDT50 angelegt. Diese Variable beschalte ich an meinen Multi-FB an eine IN-Variable, ebenso vom Typ UDT50. Vor Aufruf des Multi-FB berschreibe ich direkt im Instanz-DB des aufrufenden Bausteins die UDT-Daten "id" und "rem_staddr" mit den Verbindungsdaten des gerade gewünschten Teilnehmers (der Rest bleibt sowieso gleich).
Innerhalb meines Multi-FBs kann ich nun wie gewohnt den T_CON beschalten.

Ist nicht ganz das was ich vorhatte, aber annähernd. Vielleicht noch kurz zur Erläuterung, ich hatte die UDTs bisher für alle Teilnehmer über den Open-Communication-Wizzard generiert. Aber nach Analyse der Inhalte reicht wirklich ein UDT dessen zugeordneter Datenbereich in den Lokaldaten eben wie oben beschrieben kurz verändert wird.

Manchmal wirds erst deutlicher wenn man reduziert (warum einfach wenns auch kompliziert geht)
Danke fürs Mitdenken :)
 
Wenn es so ist ... warum übergibst du dann einen UDT und nicht die 2 oder Variablen direkt und dann ggf. auch by Value (also Beschaltung mit einer Konstanten).

Gruß
Larry
 
ist einfacher die IP-Adresse im Datenbereich des aufrufenden Bausteins wo auch der UDT referenziert wird einzutragen und dann die ganze "UDT-Variable" an den Instanz-FB anzuschalten. Zumindest kommt mir das grad einfacher und übersichtlicher vor...
 
Ich danke auch jedem Vorschlag ;-) Ich finde es prima wie hier immer wieder geholfen und mitüberlegt wird, gerade auch von den sehr Erfahrenen unter Euch. Natürlich kennt niemand die Anwendung so wie derjenige der sie schaffen mag... Und es wäre auch nicht der erste Vorschlag der mich von meinem Weg abbringt und auf einen Besseren führt... Ich habe mit Eurer Hilfe schon viel lernen können, also einfach nochmal ein herzliches Dankeschön :)
 
Zurück
Oben