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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: Problem bei mehrfach aufruf von FC

  1. #11
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Anbei die Quelle:

    Code:
    FUNCTION "average_value" : VOID
    TITLE =
    //average=last average+((value-last average)/quantity)
    AUTHOR : mz
    VERSION : 0.1
     
    VAR_INPUT
      start : BOOL ; 
      init : BOOL ; 
      PEW : INT ; 
    END_VAR
    VAR_OUTPUT
      average : REAL ; 
      quantity : INT ; 
      min_value : REAL ; 
      max_value : REAL ; 
    END_VAR
    VAR_TEMP
      pPEW : DINT ; 
      PEW_int : INT ; 
      PEW_value_real : REAL ; 
      last_average_real : REAL ; 
      quantity_real : REAL ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          U     #start; 
          SPBN  goon; 
    NETWORK
    TITLE =
    //change PEW with 2x 2x 2x (=8) to pointer format
    //load PEW, 32bit, real
    //put PEW in pointer format
          L     #PEW; 
          SLD   3; 
          T     #pPEW; 
    NETWORK
    TITLE =
          L     PEW [#pPEW]; 
          T     #PEW_int; 
    NETWORK
    TITLE =
    //values to real format
    // PEW to real
          L     #PEW_int; 
          ITD   ; 
          DTR   ; 
          T     #PEW_value_real; 
    // increase quantity
          L     #quantity; 
          L     1; 
          +I    ; 
          T     #quantity; 
    //
    // integer to real for calc
          L     #quantity; 
          ITD   ; 
          DTR   ; 
          T     #quantity_real; 
    NETWORK
    TITLE =
    //average=last average+((PEW_value-last average)/quantity)
    // value-last average
          L     #PEW_value_real; 
          L     #last_average_real; 
          -R    ; 
    // divide by quantity
          L     #quantity_real; 
          /R    ; 
    // result + last average
          L     #last_average_real; 
          +R    ; 
          T     #average; 
    // result to last average
          L     #average; 
          T     #last_average_real; 
    NETWORK
    TITLE =
    //check min value
          L     #PEW_value_real; 
          L     #min_value; 
          <R    ; 
          SPB   min; 
          SPA   jp; 
    NETWORK
    TITLE =
    //adjust min value
    min:  L     #PEW_value_real; 
          T     #min_value; 
    NETWORK
    TITLE =
    //check max value
    jp:   L     #PEW_value_real; 
          L     #max_value; 
          >R    ; 
          SPB   max; 
          SPA   nojp; 
    NETWORK
    TITLE =
    //adjust max value
    max:  L     #PEW_value_real; 
          T     #max_value; 
    NETWORK
    TITLE =
    nojp: NOP   0; 
          SPA   goon; 
    NETWORK
    TITLE =
    goon: U     #init; 
          SPB   init; 
          SPA   done; 
    NETWORK
    TITLE =
    //reset values
    init: L     0; 
    //  T     #PEW_value_real
    //      T     #last_average_real
    //      T     #quantity_real
    //      T     #average
          T     #quantity; 
          L     3.402823e+038; 
          T     #min_value; 
          L     -3.402823e+038; 
          T     #max_value; 
    NETWORK
    TITLE =
    done: NOP   0; 
    END_FUNCTION
    Danke an alle, Kai hast recht mit last average, werd ich wohl dann als In/Out anlegen.

    Dies erklaert aber noch nicht mein eigentliches Problem. Der FC nimmt nur ein und denselben PEW wert zum rechnen.

    mzva

  2. #12
    Registriert seit
    20.10.2004
    Beiträge
    650
    Danke
    5
    Erhielt 26 Danke für 26 Beiträge

    Standard

    Hallöchen

    ----
    er nimmt doch eh das richtige PEW nur deine ausgabe stimmt im mittelwert nicht ( siehe unten )
    ----
    Ich will jetzt nicht Lehrer haft sein

    aber weist du was eine TEMP variabel ist

    eine TEMP variabel darf nur zu einen Zyklus verwendet werden
    Soll heisen am anfang beschreiben und dann später im selber zyklus im selben fc wieder lesen


    im nächsten zyklus kann noch das selbe drinnen stehen muss aber nicht !!!!!

    deshalb gehts bei einen aufruf und beim 2 gehts auf einmal nicht mehr

    Ich hab zwar nur einen kurzen blick reingeworfen aber bei deiner TEMP Variabel "last_average_real" greifst du gleich lesend drauf zu und da steht natrürlich der müll vom letzten aufruf drinnen

    ich hoffe ich hab dir geholfen

  3. #13
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Zitat Zitat von mzva Beitrag anzeigen
    Danke an alle, Kai hast recht mit last average, werd ich wohl dann als In/Out anlegen.

    Dies erklaert aber noch nicht mein eigentliches Problem. Der FC nimmt nur ein und denselben PEW wert zum rechnen.

    mzva
    Wie kpeter bereits geschrieben hat, sieht Dein PEW-Aufruf im Programm richtig aus.

    Du solltest also erst einmal Deine Variable #last_average_real als INOUT-Variable anlegen und dann den FC noch einmal testen.

    Gruß Kai

  4. #14
    Registriert seit
    06.10.2003
    Beiträge
    3.448
    Danke
    454
    Erhielt 509 Danke für 411 Beiträge

    Standard

    Hallo mzva,

    die Ausgänge einer Funktion müssen bei jedem Aufruf der Funktion beschrieben werden! Du überspringst die Zuweisungen bedingt. Bei einem FB ginge das, bei einer FC nicht!


    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  5. #15
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Zitat Zitat von Onkel Dagobert Beitrag anzeigen
    die Ausgänge einer Funktion müssen bei jedem Aufruf der Funktion beschrieben werden! Du überspringst die Zuweisungen bedingt. Bei einem FB ginge das, bei einer FC nicht!
    Also bei meinem FC funktioniert das Überspringen der Ausgangszuweisung ohne Probleme.

    E0.0=1 -> MW10 = PEW572
    E0.0=0 -> MW10 = letzter Wert, wird nicht aktualisiert

    E0.1=1 -> MW12 = PEW574
    E0.1=0 -> MW12 = letzter Wert, wird nicht aktualisiert

    Code:
    FUNCTION FC 40 : VOID
    TITLE =
    VERSION : 0.1
     
    VAR_INPUT
      PEW : INT ;   
      START : BOOL ;    
    END_VAR
    VAR_OUTPUT
      MW : WORD ;   
    END_VAR
    VAR_TEMP
      pPEW : DINT ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          U     #START; 
          SPBN  GOON; 
          L     #PEW; 
          SLW   3; 
          T     #pPEW; 
          L     PEW [#pPEW]; 
          T     #MW;
    GOON: NOP   0; 
     
    END_FUNCTION
     
    ORGANIZATION_BLOCK OB 1
    TITLE = Hauptprogramm
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : SEGMENT
    VERSION : 1.0
     
    VAR_TEMP
      OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
      OB1_SCAN_1 : BYTE ;   //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
      OB1_PRIORITY : BYTE ; //Priority of OB Execution
      OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
      OB1_RESERVED_1 : BYTE ;   //Reserved for system
      OB1_RESERVED_2 : BYTE ;   //Reserved for system
      OB1_PREV_CYCLE : INT ;    //Cycle time of previous OB1 scan (milliseconds)
      OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
      OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
      OB1_DATE_TIME : DATE_AND_TIME ;   //Date and time OB1 started
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          CALL FC    40 (
               PEW                      := 752,
               START                    := E      0.0,
               MW                       := MW    10);
    NETWORK
    TITLE =
          CALL FC    40 (
               PEW                      := 754,
               START                    := E      0.1,
               MW                       := MW    12);
     
    END_ORGANIZATION_BLOCK
    Gruß Kai

  6. #16
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Zitat Zitat von mzva Beitrag anzeigen
    Code:
    FUNCTION "average_value" : VOID
    TITLE =
    //average=last average+((value-last average)/quantity)
    AUTHOR : mz
    VERSION : 0.1
     
    VAR_INPUT
      start : BOOL ; 
      init : BOOL ; 
      PEW : INT ; 
    END_VAR
    VAR_OUTPUT
      average : REAL ; 
      quantity : INT ; 
      min_value : REAL ; 
      max_value : REAL ; 
    END_VAR
    VAR_TEMP
      pPEW : DINT ; 
      PEW_int : INT ; 
      PEW_value_real : REAL ; 
      last_average_real : REAL ; 
      quantity_real : REAL ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          U     #start; 
          SPBN  goon; 
    NETWORK
    TITLE =
    //change PEW with 2x 2x 2x (=8) to pointer format
    //load PEW, 32bit, real
    //put PEW in pointer format
          L     #PEW; 
          SLD   3; 
          T     #pPEW; 
    NETWORK
    TITLE =
          L     PEW [#pPEW]; 
          T     #PEW_int; 
    NETWORK
    TITLE =
    //values to real format
    // PEW to real
          L     #PEW_int; 
          ITD   ; 
          DTR   ; 
          T     #PEW_value_real; 
    // increase quantity
          L     #quantity; 
          L     1; 
          +I    ; 
          T     #quantity; 
    //
    // integer to real for calc
         L     #quantity; 
          ITD   ; 
          DTR   ; 
          T     #quantity_real; 
    NETWORK
    TITLE =
    //average=last average+((PEW_value-last average)/quantity)
    // value-last average
          L     #PEW_value_real; 
          L     #last_average_real; 
          -R    ; 
    // divide by quantity
          L     #quantity_real; 
          /R    ; 
    // result + last average
          L     #last_average_real; 
          +R    ; 
          T     #average; 
    // result to last average
          L     #average; 
          T     #last_average_real; 
    NETWORK
    TITLE =
    //check min value
          L     #PEW_value_real; 
          L     #min_value; 
          <R    ; 
          SPB   min; 
          SPA   jp; 
    NETWORK
    TITLE =
    //adjust min value
    min:  L     #PEW_value_real; 
          T     #min_value; 
    NETWORK
    TITLE =
    //check max value
    jp:   L     #PEW_value_real; 
          L     #max_value; 
          >R    ; 
          SPB   max; 
          SPA   nojp; 
    NETWORK
    TITLE =
    //adjust max value
    max:  L     #PEW_value_real; 
          T     #max_value; 
    NETWORK
    TITLE =
    nojp: NOP   0; 
          SPA   goon; 
    NETWORK
    TITLE =
    goon: U     #init; 
          SPB   init; 
          SPA   done; 
    NETWORK
    TITLE =
    //reset values
    init: L     0; 
    //  T     #PEW_value_real
    //      T     #last_average_real
    //      T     #quantity_real
    //      T     #average
          T     #quantity; 
          L     3.402823e+038; 
          T     #min_value; 
          L     -3.402823e+038; 
          T     #max_value; 
    NETWORK
    TITLE =
    done: NOP   0; 
    END_FUNCTION
    Mit der Variablen #quantity stimmt auch etwas nicht. Sie ist als OUT-Variable deklariert, wird aber zuerst abgefragt und dann erst zugewiesen. Die Variable #quantity sollte daher auch als INOUT-Variable deklariert werden.

    Du solltest wirklich noch einmal ALLE Variablen überprüfen, ob sie im Schnittstellenbereich des FC richtig deklariert sind.

    Gruß Kai

  7. #17
    Registriert seit
    20.10.2004
    Beiträge
    650
    Danke
    5
    Erhielt 26 Danke für 26 Beiträge

    Standard

    Zitat Zitat von Kai Beitrag anzeigen
    Also bei meinem FC funktioniert das Überspringen der Ausgangszuweisung ohne Probleme.

    E0.0=1 -> MW10 = PEW572
    E0.0=0 -> MW10 = letzter Wert, wird nicht aktualisiert

    E0.1=1 -> MW12 = PEW574
    E0.1=0 -> MW12 = letzter Wert, wird nicht aktualisiert
    Ich muss kai rechtgeben solange außerhalb des FC nicht auf das Ausgangsword geschrieben wird ist es egal ob bedingt aufgerufen oder nicht oder ob als out oder in/out deklariert ist.

    desweiteren frag ich mich schon die ganze zeit was du mit deinen fc machen willst

    wie oft wird der denn zurück gesetzt das dein mittelwert nicht überläuft

  8. #18
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Erstmal Danke fuer die Hilfe. Lehrehaft ist ok, sehe mich als Lernender an.
    Der FC soll ca. 500 werte aufnehmen. Die Werte kommen von einer Motorkarte (AO) und werden von der S7 als AI eingelesen. Die Werte schwanken zwischen 500 und 1500 incremente. Diese nehme ich und bilde mir einen Mittelwert (Formel), Anzahl der aufgenommenen Werte, min & max Wert.

    Dachte mir dies ist einfacher als 500 Werte irgendwo hinzuschreiben und danach einen Mittelwert zu bilden.

    "Ueberlaufen" sollte nicht (real).

    Habe die IN/OUT modifiziert, was auch Sinn macht, mein Fehler, sorry.

    Werde mir das ganze nochmal zu "Gemuete" fuehren muessen.

    Also besten Dank fuer die Hilfe. Melde mich wenn ich weiss woran es lag.

    mzva

  9. #19
    Registriert seit
    20.10.2004
    Beiträge
    650
    Danke
    5
    Erhielt 26 Danke für 26 Beiträge

    Standard

    Zitat Zitat von mzva Beitrag anzeigen

    "Ueberlaufen" sollte nicht (real).
    real kann genau so überlaufen du hast nur eine sechsstellige genauigkeit wenn die abläuft macht es schwups und dein wert steht.

    sechstellig heist nicht nach dem komma sondern insgesamt 6 stellen dann beginnt die ungenauigkeit und irgendwann zählt er nicht mehr richtig

    ich bin selber schon mal darüber gestolbert.

    nur bin ich mir von deiner formel nicht sicher ob dieser mittelwert so auch stimmt

    du zählst ja permanent alles zusammen und dividiertst durch die anzahl nach einiger zeit wird sich dein mittelwert festfressen wenn du in nicht wieder zurücksetzt.

  10. #20
    Registriert seit
    06.10.2003
    Beiträge
    3.448
    Danke
    454
    Erhielt 509 Danke für 411 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Kai,

    Zitat Zitat von Kai Beitrag anzeigen
    Also bei meinem FC funktioniert das Überspringen der Ausgangszuweisung ohne Probleme...
    Ok, unter Umständen, wie auch in deinem Beispiel, wird es funktionieren.

    Hier ein Siemens-Beitrag dazu:
    http://support.automation.siemens.com/WW/view/de/189227

    oder auch in der Step7-Hilfe nachzulesen unter "Vermeiden von Fehlern beim Aufruf von Bausteinen".

    Wenn man mit bedingten Sprüngen arbeitet ist es am einfachsten, entsprechende Parameter am Anfang der Funktion zu initialisieren.


    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

Ähnliche Themen

  1. SFC 12 - mehrfach aufrufen
    Von maweri im Forum Programmierstrategien
    Antworten: 3
    Letzter Beitrag: 21.07.2009, 08:41
  2. Antworten: 50
    Letzter Beitrag: 02.06.2008, 06:54
  3. Problem mit FB-Aufruf in SCL
    Von puehri im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 07.08.2007, 10:32
  4. Problem mit FB Aufruf in Codesys
    Von master im Forum Sonstige Steuerungen
    Antworten: 3
    Letzter Beitrag: 19.04.2006, 10:06
  5. Antworten: 6
    Letzter Beitrag: 04.02.2006, 20:00

Lesezeichen

Berechtigungen

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