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

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 32

Thema: Wertübergabe eines UDT an einer Funktion in SCL

  1. #1
    Registriert seit
    04.07.2007
    Beiträge
    147
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Morgen,

    ich habe folgende Problemstellung. An einem Funktionsbaustein wird ein DatenbausteinUDT mit mehreren Bool-Werten übergeben. Nun wollte ich diesen UDT an einer Funktion übergeben die in dem Baustein aufgerufen wird. Dies funktioniert nicht da beim kompilieren folgende Fehlermeldung erscheint:
    Code:
    Hilfe zur Meldung 15:4664
    Beschreibung:
    Es liegt ein Aufruf eines (S)FC oder (S)FB vor, bei dem eine Parameterversorgung nicht im Anwenderprogramm abgebildet werden kann, obwohl der Parameter mit einem Objekt zulässigen Datentyps versorgt wird.
    In STEP 7 gibt es bestimmte Kombinationen von Parametern (Formalparameter) und Objekten (hier Aktualparameter genannt), die nicht abgebildet werden können und daher nicht erlaubt sind. Eine genauere Beschreibung dieser Kombinationen sollte der STEP 7-Dokumentation bzw. dem S7-SCL-Handbuch entnommen werden.
    Behebung:
    Wählen Sie für den betreffenden Aktualparameter, falls möglich, eine andere Objektklasse (z.B. lokale Variable statt globaler Datenbereich, lokale Variable statt FC-Eingangsparameter, Bausteinbezeichner statt Variable, ...) und übersetzen Sie erneut. Wenn Sie mit dieser Methode nicht nach wenigen Versuchen eine erlaubte Kombination finden, empfiehlt sich das Nachschlagen in der STEP 7-Dokumentation.
    Gibt es eine elegante Methode in SCL um dies zu beheben? Zur Not muss ich jeden einzelnen Bool Wert separat an die Funktion übermitteln, dies wäre allerdings unschön.
    Zitieren Zitieren Wertübergabe eines UDT an einer Funktion in SCL  

  2. #2
    Registriert seit
    01.02.2008
    Beiträge
    28
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,
    ein UDT ist nur eine Beschreibung. Also sowas wie ein type in C. Willst Du da Daten reinschreiben, musst du erst ein DB vom Typ deines UDT anlegen. Diesen kannst Du dann auch in Funktionen hinein/ausgeben.

    Grüsse
    Jens

  3. #3
    Hotsch ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.07.2007
    Beiträge
    147
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Standard

    Ich hab mich vielleicht etwas blöd ausgedrückt, also probiere ich es noch mal.
    Ich hab in einem Globalen DB ein UDT angelegt. Diesen Übergebe ich an einem FB. Soweit klappt es auch noch ohne Probleme. Nun wollte ich aber in diesem FB die Daten weiter an einem FC übergeben und da versagt dann SCL und die obige Fehlermeldung erscheint.

  4. #4
    Registriert seit
    14.06.2005
    Beiträge
    17
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo
    Hast du den DB als "DB vom Typ" UDT xy angelegt oder hast du in einem DB eine Variable varX vom Typ UDT xy angelegt?

    Gruss Hansruedi

  5. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.255
    Danke
    537
    Erhielt 2.705 Danke für 1.954 Beiträge

    Standard

    Du kannst eine UDT nicht an weitere FB durchreichen. Was du evtl. probieren könntest, ist etwas aufwendig. Im FB die selbe UDT als STAT deklarieren. Dann die IN-UDT per Block-Move in die Stat-UDT und diese an den internen FB übergeben. Für den Blockmove mußt du ja eine Any zusammenbauen, schau dazu mal hier in der FAQ. Aber du könntest auch gleich auf die UDT verzichten, statt dessen einen Any-Pointer auf den gewünschten Bereich als IN-Parameter anlegen und diesen dann jeweils in dem FB, in welchem er gebraucht wird per Blockmove auf Temp oder Stat-Variablen kopieren, die dann deine einzelnen Bits enthalten.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. #6
    Hotsch ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.07.2007
    Beiträge
    147
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Standard

    Danke, für die Antwort. Ich hab befürchtet, dass das nicht geht. Ich werd meine Bemühungen jetzt wohl einstellen, da mir der Aufwand etwas zu groß ist nur um eine Handvoll BOOL Variablen zu übergeben.

  7. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.786
    Danke
    398
    Erhielt 2.414 Danke für 2.010 Beiträge

    Standard

    Hallo,
    es reicht, wenn du in dem FB den UDT anlegst - es geht sogar im TEMP-Bereich. Die Übertragung der Werte geht dann ganz einfach in dem du schreibst :
    Code:
    interne_UDT := IN_UDT ;
     
    call FC100 (IN_UDT := interne_UDT) :
    um das hin- und herkopieren der UDT-Inhalte mußt du dich innerhalb von SCL nicht kümmern. Das übernimmt SCL automatisch für dich.
    Wichtig ist hier lediglich, dass SCL den Aufbau der UDT kennt und das IN_UDT und interne_UDT vom gleichen Typ sind ...

    Gruß
    LL

  8. Folgende 5 Benutzer sagen Danke zu Larry Laffer für den nützlichen Beitrag:

    Flux (29.01.2014),Ganz (08.01.2009),Hotsch (06.01.2009),Ralle (06.01.2009),Smurf (15.04.2016)

  9. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.255
    Danke
    537
    Erhielt 2.705 Danke für 1.954 Beiträge

    Standard

    Ah ja, da hat Larry natürlich recht, wie immer hab ich die AWL-Variante hingeschrieben. In SCl ist das weniger aufwändig, das Prinzip aber das Selbe.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  10. #9
    Hotsch ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.07.2007
    Beiträge
    147
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Standard

    Die Wertübergabe funktioniert jetzt soweit einwandfrei, aber nun bin ich auf ein neues Problem gestoßen.
    Also ich rufe eine Funktion mehrfach in einem FB auf. Der Funktion wird jeweils der oben genannte UDT übergeben, sowie einzelne BOOL Werte eines Arrays (z.B. MyArray[3]) als INOUT Variable. Nun werden die Rückgabewerte der Funktionen in einer if Anweisung abgefragt. Das Setzen der Array Variablen funktioniert nur unzuverlässig. Also bei einigen Arrays funktioniert es, bei anderen nicht. Ich denke mir dies ist so weil Step 7 wohl ein Problem damit hat, dass man Funktionen vom gleichen Typ mehrfach aufruft. Gibt es hierfür irgendeine einfache Möglichkeit um diese Geschichte zu realisieren. Als Beispiel hänge ich noch mal den prinzipiellen Code an, wie ich mir das gedacht habe.
    Code:
    FUNCTION_BLOCK MYFUNCTIONBLOCK
    VAR INPUT
      UDT1    :GLOBALUDT;
    END_VAR
    VAR
       MYARRAY:ARRAY[1..50] OF BOOL;
    END_VAR
    VAR_TEMP
      UDT2    :GLOBALUDT;
    END_VAR
    BEGIN
    UDT2:=UDT1;
    ...
     
    IF (    
      (MYFUNCTION(MYUDT:=UDT2, Array1:=MYArray[2],Array2:=MYARRAY[4])) OR
       (MYFUNCTION(MYUDT:=UDT2, Array1:=MYArray[30],Array2:=MYARRAY[32])) OR
       (MYFUNCTION(MYUDT:=UDT2, Array1:=MYArray[34],Array2:=MYARRAY[36]))
    ) then
    WERT:=TRUE;
    END_IF;
     
    END_FUNCTION_BLOCK

  11. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.786
    Danke
    398
    Erhielt 2.414 Danke für 2.010 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ein Mehrfach-Aufruf, wie du ihn beschrieben hast, funktioniert grundsätzlich. Was mich ein hier stört ist, dass du UDT2 im Temp-Bereich des FB's erstellt hast. Das könnte zu den beschriebenen Zufalls-Ergebnissen führen.
    Es würde mich aber auch interessieren, was MyFunction intern so macht ... Das wäre dann die nächste Möglichkeit ...

    Gruß
    LL

Ähnliche Themen

  1. Funktion eines Impulsformers
    Von BennyK im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 25.03.2013, 22:15
  2. Pointer als Rückgabewert einer Funktion
    Von kai86 im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 12.04.2010, 12:07
  3. OB1 mit Aufruf einer Funktion in SCL
    Von pinolino im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 29.04.2009, 17:18
  4. Länge eines String mit der LEN-Funktion auslesen
    Von baggerandy im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 10.04.2009, 16:13
  5. Alle gesetzten Merker einer Funktion zurücksetzen
    Von dominik_Thesis im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 25.11.2008, 13:07

Lesezeichen

Berechtigungen

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