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

Page 1 of 4 123 ... LastLast
Results 1 to 10 of 32

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

  1. #1
    Join Date
    04.07.2007
    Posts
    149
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Default


    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.
    Reply With Quote Reply With Quote Wertübergabe eines UDT an einer Funktion in SCL  

  2. #2
    Join Date
    01.02.2008
    Posts
    28
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Default

    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 is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    04.07.2007
    Posts
    149
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Default

    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
    Join Date
    14.06.2005
    Posts
    17
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Default

    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
    Join Date
    27.05.2004
    Location
    Thüringen/Berlin
    Posts
    13,805
    Danke
    746
    Erhielt 3,127 Danke für 2,231 Beiträge

    Default

    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 is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    04.07.2007
    Posts
    149
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Default

    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
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    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
    Join Date
    27.05.2004
    Location
    Thüringen/Berlin
    Posts
    13,805
    Danke
    746
    Erhielt 3,127 Danke für 2,231 Beiträge

    Default

    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 is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    04.07.2007
    Posts
    149
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Default

    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
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default


    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

Similar Threads

  1. Step 7 Auslesen des Inhaltes eines UDT-Poiners mit SCL
    By SPS-Totalizer in forum Simatic
    Replies: 11
    Last Post: 30.10.2018, 18:01
  2. TIA Idee für SCL Funktion zum Koieren von UDT-Blöcken gesucht
    By S7_Programmer in forum Simatic
    Replies: 4
    Last Post: 02.03.2017, 10:05
  3. Step 7 SCL Zugriff auf Teil eines UDT
    By dentech in forum Simatic
    Replies: 12
    Last Post: 16.01.2017, 10:55
  4. Replies: 12
    Last Post: 30.10.2013, 23:35
  5. OB1 mit Aufruf einer Funktion in SCL
    By pinolino in forum Simatic
    Replies: 3
    Last Post: 29.04.2009, 17:18

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •