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

Page 2 of 4 FirstFirst 1234 LastLast
Results 11 to 20 of 32

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

  1. #11
    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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hm, aber er füllt ja die Temp-UDT am Anfang bit den Daten der UDT aus dem Input. Mehrfachaufruf gerade von Funktionen sollte gehen, aber ich habe schon Probleme gehabt, wenn Inputs an den Funktionen gemischt aus unterschiedlichen Quellen (z.Bsp. unterschiedliche DB und Temp) angelegt wurden. Hatte dann den Eindruck, daß die DB wild durcheinander beschrieben wurden. Kann man denn mal versuchsweise UDT2 als Stat anlegen?

    PS: Wird in der Funktion evtl. mit dem AR2 gearbeitet? Auf jeden Fall ist es sinnvoll am Anfang der Funktion AR1 und AR2 zu sichern und am Ende diese wieder zu restaurieren.
    Last edited by Ralle; 07.01.2009 at 13:12.
    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

  2. #12
    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

    Quote Originally Posted by Ralle View Post
    Hm, aber er füllt ja die Temp-UDT am Anfang bit den Daten der UDT aus dem Input.
    Das ist (denke ich) das Problem ...
    Wir wissen ja gar nicht, was MyFunction nun wirklich tut ... Vielleicht ergänzt es auch nur den UDT2 mit den neuen Werten ... oder ... oder ... oder ...

  3. #13
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default

    ich hätte da mal sone einfache, strukturelle anmerkung:

    - ich würde myfunction nicht als bedingung sondern als funktion vor der if-abfrage aufrufen, dass darf dann auch mehrfach sein.

    - dadurch gehst du sicher, dass alle werte verarbeitet werden und brauchst am ende nur noch die elemente deines arrays in einer einfachen logischen verknüpfung verdaddeln, kannst dir also das IF sparen

    - wenn du das nicht machen willst, so empfehle ich dir aber mindestens einen else-zweig in dem wert (der wahrscheinlich im stat, inout oder out liegt) auf false gesetzt wird.
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  4. #14
    Hotsch is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    04.07.2007
    Posts
    149
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Default

    Also MYFunction ist nur eine Abfolge von IF Anweisungen. Die Vergleichen die UDT Werte auf TRUE und schieben dann je nach Fall die Werte von MYArray[x] in MYArray[y] oder umgekehrt.
    Code:
    FUNCTION MYFUNCTION :BOOL
    VAR INPUT
          UDTFUNCTION:GLOBALUDT
    end_VAR
    VAR INOUT
          ARRAY1:BOOL;
          ARRAY2:BOOL;
    end_VAR
    BEGIN
    if UDTFUNCTION.TEACH then
      ARRAY1:=ARRAY2;
    end_IF;
    if MYARRAY1<>MyARRAY2 then
       MYFUNCTION:=TRUE;
    else MYFUNCTION:=FALSE;
    end_function
    Wenn ich diese IF Anweisungen direkt in dem FB Aufrufe dann funktioniert das ganze Programm auch genau so wie es soll, aber sobald ich Funktionen einsetzte wird es für mich nicht mehr nachvollziehbar.

    Ich hab den UDT2 jetzt auch in den statischen Speicher verlegt, aber leider ohne Erfolg.
    Last edited by Hotsch; 07.01.2009 at 14:43.

  5. #15
    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

    Sorry,
    ich reviediere mich. Der Fehler ist, dass das UDT2 in IN-Parameter ist. Es müßte ein IN_OUT-Parameter sein, da ja mit den veränderten Werten im nächsten Zyklus weitergearbeitet werden soll ...


    Code:
    FUNCTION_BLOCK MYFUNCTIONBLOCK
    VAR INOUT
        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;
     
    UDT1:=UDT2;
    END_FUNCTION_BLOCK
    Wie sieht es jetzt aus ?

    Gruß
    LL

  6. #16
    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 da vertippt, UDT1 ist als INOUT deklariert und die letzte Zeile UDT1:=UDT2 hab ich auch vergessen. Sorry
    Last edited by Hotsch; 07.01.2009 at 15:11.

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

    hat es funktioniert ?

  8. #18
    Hotsch is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    04.07.2007
    Posts
    149
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Default

    Nein, es hat nicht funktioniert. Was ich meinte ich hatte das schon bei der ersten Version so drin, hab nur vergessen das bei dem Code oben einzufügen.

  9. #19
    Hotsch is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    04.07.2007
    Posts
    149
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Default

    Dann hätte ich noch eine andere Frage, wäre es egal wenn ich statt Array vom Typ BOOL, Arrays vom Typ TIME,DINT oder INT verwende? Oder gibt es da Beschränkungen die man beachten muss? Also die Funktion würde dann so aussehen:
    Code:
    FUNCTION MYFUNCTION :BOOL
    VAR INPUT
          UDTFUNCTION:GLOBALUDT
    end_VAR
    VAR INOUT
          ARRAY1:TIME;
          ARRAY2:TIME;
    end_VAR
    BEGIN
    if UDTFUNCTION.TEACH then
      ARRAY1:=ARRAY2;
    end_IF;
    if MYARRAY1<>MyARRAY2 then
       MYFUNCTION:=TRUE;
    else MYFUNCTION:=FALSE;
    end_function

  10. #20
    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
    Du kannst erstmal grundsätzlich jeden Variablentyp übergeben.

    Zu deinem Problem nochmal :
    Bist du sicher, dass deine Function korrekt funktioniert ?
    Was ist der Sinn derselben ? Das habe ich aus dem Code nicht nachvollziehen können ...

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
  •