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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Problem bei mehrfach aufruf von FC

  1. #1
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    habe ein Problem bei einem mehrfach aufruf eines FC. Der FC wird/soll 4x aufgerufen werden. Der FC bildet einen Mittelwert (aus analog input PEW). Habe IN, OUT & TEMP darin verwendet (wie schon oft zuvor). Beim aufruf wird der FC mit verschiedenen DB Adressen belegt.
    Was nun passiert ist folgendes: FC arbeitet wie er soll, leider aber werten alle FC's nur das ein und selbe PEW aus.

    Fuer Rat jeder Art schon ein Danke im voraus.

    mzva
    Zitieren Zitieren Problem bei mehrfach aufruf von FC  

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

    Standard

    hallöchen

    ich trau mich fast nicht dies zu sagen

    aber könnte es sein das du in deinen FC auf irgendwas direkt zugreifst und nicht über deine schnittstellen

    wie sieht denn dein baustein aus

  3. #3
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.520 Danke für 1.282 Beiträge

    Standard

    Variablen im Temp-Bereich sind nur für einen Aufruf gültig,
    da eine Mittelwertbildung ja Werte über mehrere Zyklen erfordert,
    ist das mit Variablen im TEMP Bereich definitiv nicht zu machen.
    Oder nur mit diversen Effekten.

    Möglichkeit 1:
    Du legst eine Variable vom Typ IN/OUT an, z.B. ein Array of INT mit der benötigten Anzahl an Werten

    Möglichkeit 2:
    Du verwendest einen FB, und schreibst alles was du jetzt im TEMP-Bereich hast,
    in den STAT-Bereich.

    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

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

    Standard

    Die Auswertung von PEWs sollte eigentlich kein Problem sein. Hier ein kurzes Beispiel:

    Code:
    FUNCTION FC 40 : VOID
    TITLE =
    VERSION : 0.1
     
    VAR_INPUT
      EW : WORD ;   
    END_VAR
    VAR_OUTPUT
      MW : WORD ;   
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          L     #EW; 
          T     #MW; 
          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 (
               EW                       := PEW  752,
               MW                       := MW    10);
          NOP   0; 
    NETWORK
    TITLE =
          CALL FC    40 (
               EW                       := PEW  754,
               MW                       := MW    12);
          NOP   0; 
    END_ORGANIZATION_BLOCK
    Sonst stell doch mal Deinen FC (Programmcode) und die Aufrufe Deines FCs hier ins Forum.

    Gruß Kai

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

    Standard

    Zitat Zitat von MSB Beitrag anzeigen
    Variablen im Temp-Bereich sind nur für einen Aufruf gültig,
    da eine Mittelwertbildung ja Werte über mehrere Zyklen erfordert,
    ist das mit Variablen im TEMP Bereich definitiv nicht zu machen.
    Oder nur mit diversen Effekten.
    Manuel schreibt aber, dass er bei seiner Mittelwertbildung mit DBs arbeitet. Das könnte also so in Ordnung sein.

    Es bleibt aber alles nur Spekulation, solange wir den Programmcode von Manuel nicht haben.

    Gruß Kai

  6. #6
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.520 Danke für 1.282 Beiträge

    Standard

    Manuel bin ich, er der fragt nennt sich mzva.

    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

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

    Standard

    Zitat Zitat von MSB Beitrag anzeigen
    Manuel bin ich, er der fragt nennt sich mzva.

    Mfg
    Manuel
    Ooops, kleiner Fehler meinerseits.

    Gruß Kai

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

    Standard

    danke fuer die Tips. Anbei mein Code.

    Code:
    NW1 
    U     #start
    SPBN  goon
     
    NW2
    //put PEW in pointer format
    L     #PEW
    SLD   3
    T     #pPEW
     
    NW3
    L     PEW [#pPEW]
    T     #PEW_int
     
    NW4
    // 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
     
    NW5
    // 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
     
    NW6
    goon: NOP 0
    mzva

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

    Standard

    Nun der FC aufruf.

    Code:
          CALL  "average_value"
           start    :="measure_02_in_op"
           init     :="init_calc_values"
           PEW      :=280
           average  :="data_log".current_ST29
           quantity :="data_log".quantity_values_ST29
           min_value:="data_log".min_current_ST29
           max_value:="data_log".max_current_ST29
    mzva

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Kannst Du den FC mal als STEP7-Quelle posten, damit man den Schnittstellenbereich des FC sehen kann?

    Ansonsten ist mir folgendes aufgefallen:

    Zitat Zitat von mzva Beitrag anzeigen
    Code:
    NW1 
    U     #start
    SPBN  goon
     
    NW2
    //put PEW in pointer format
    L     #PEW
    SLD   3
    T     #pPEW
     
    NW3
    L     PEW [#pPEW]
    T     #PEW_int
     
    NW4
    // 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
     
    NW5
    // 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
     
    NW6
    goon: NOP 0
    Wenn es sich bei der Variable #last_average_real um eine TEMP-Variable handelt, dann kann der Code so nicht funktionieren.

    TEMP-Variablen sind nur innerhalb eines FB oder FC gültig. Nach Beendigung des FB oder FC geht der Inhalt der TEMP-Variablen verloren.

    Wenn Du Dir den Inhalt der Variablen #last_average_real bis zum nächsten Aufruf des FC merken willst, dann mußt Du die Variable als INOUT-Parameter deklarieren oder statt des FC einen FB verwenden und dort die Variable als STAT-Parameter deklarieren.

    Gruß Kai

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