Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: UDT als Eingangsvariable eines Multiinstanz-FBs

  1. #1
    Registriert seit
    18.10.2009
    Beiträge
    220
    Danke
    71
    Erhielt 17 Danke für 16 Beiträge

    Standard


    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?
    Grüßele vom Bärle
    Zitieren Zitieren UDT als Eingangsvariable eines Multiinstanz-FBs  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.793
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    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.

  3. #3
    Bär1971 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    18.10.2009
    Beiträge
    220
    Danke
    71
    Erhielt 17 Danke für 16 Beiträge

    Standard

    deswegen frag ich ja auch ob jemand da eine Idee hat das zu realisieren, der Multi-FB von mir soll eben universal einsetzbar werden ohne intern was zu verändern
    Grüßele vom Bärle

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

    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

  5. #5
    Bär1971 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    18.10.2009
    Beiträge
    220
    Danke
    71
    Erhielt 17 Danke für 16 Beiträge

    Standard

    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?
    Geändert von Bär1971 (19.08.2013 um 13:15 Uhr) Grund: Ergänzungen
    Grüßele vom Bärle

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

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

  7. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Bär1971 (19.08.2013)

  8. #7
    Bär1971 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    18.10.2009
    Beiträge
    220
    Danke
    71
    Erhielt 17 Danke für 16 Beiträge

    Standard

    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
    Grüßele vom Bärle

  9. #8
    Registriert seit
    03.09.2009
    Beiträge
    129
    Danke
    15
    Erhielt 19 Danke für 19 Beiträge

    Standard

    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.

  10. Folgender Benutzer sagt Danke zu Beckx-net für den nützlichen Beitrag:

    Bär1971 (19.08.2013)

  11. #9
    Bär1971 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    18.10.2009
    Beiträge
    220
    Danke
    71
    Erhielt 17 Danke für 16 Beiträge

    Standard

    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
    Grüßele vom Bärle

  12. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Ähnliche Themen

  1. Timer in SCL als Eingangsvariable deklarieren
    Von Snoopy123123 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 18.05.2012, 16:40
  2. UDT als In_Out an Multiinstanz FB
    Von dirknico im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 01.10.2009, 12:28
  3. FB aufrufen, DB als Eingangsvariable?
    Von jackjones im Forum Programmierstrategien
    Antworten: 9
    Letzter Beitrag: 13.10.2008, 09:20
  4. Timer in Multiinstanz-FBs (AWL)
    Von lariamat im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 23.08.2006, 11:13
  5. Laufzeitmessung eines FBs
    Von TonyMono im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 05.07.2006, 17:53

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •