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

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 32

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

  1. #11
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard


    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.
    Geändert von Ralle (07.01.2009 um 13:12 Uhr)
    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
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    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
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    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 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.07.2007
    Beiträge
    147
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Standard

    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.
    Geändert von Hotsch (07.01.2009 um 14:43 Uhr)

  5. #15
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    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 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 da vertippt, UDT1 ist als INOUT deklariert und die letzte Zeile UDT1:=UDT2 hab ich auch vergessen. Sorry
    Geändert von Hotsch (07.01.2009 um 15:11 Uhr)

  7. #17
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    hat es funktioniert ?

  8. #18
    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

    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 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.07.2007
    Beiträge
    147
    Danke
    6
    Erhielt 13 Danke für 13 Beiträge

    Standard

    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
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard


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

Ä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
  •