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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: SCL -1 subtrahieren

  1. #1
    Registriert seit
    19.01.2007
    Beiträge
    69
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich bin nun schon ein zweites mal auf dieses Problem gestoßen und konnte es noch nicht lösen.
    Ich möchte im DB einen Wert um minus 1 subtrahieren. Das Problem ist, dass entweder der Wert durch die Schleife die ganze Zeit runterzählt oder ich habe es so wie hier im Bsp. das ich einen bestimmten Wert (xb) um 1 erhöhe und beim nächsten Durchlauf soll er es nicht mehr machen. Dann zählt er garnicht mehr ... Hoffe ihr versteht das Problem so und könnt mir weiterhelfen.

    Code:
    FUNCTION FC54 : INT
    
    VAR_INPUT
    MagazinLeerenAusgewaehlt:      BOOL;
    FreigabeDBWertNullSetzen:    BOOL;
    AngefahrenSpalte:               INT;
    
    END_VAR
    VAR_OUTPUT
    
    END_VAR
    
    VAR_TEMP
      // temporäre Variablen
    z:                           INT;
    xb:                           INT;
    za:                          INT;
    Groesse:                     INT;
    END_VAR
    VAR_IN_OUT
    
    END_VAR
    
      // Anweisungsteil
    
    
    IF FreigabeDBWertNullSetzen = False THEN
        xb := 1;
    END_IF;
    
    IF MagazinLeerenAusgewaehlt = True AND FreigabeDBWertNullSetzen = True THEN 
        
        FOR z := 1 TO 3 BY 1 DO
            "lager".Zeile[z].Spalte[AngefahrenSpalte].Belegt := False;
            Groesse := "lager".Zeile[z].Spalte[AngefahrenSpalte].Groesse;
            FOR za := 1 TO 30 BY 1 DO
              IF "anpassung".anpassung[za].Wahre_Groesse = Groesse and xb =1 THEN
                "anpassung".anpassung[za].ISTBestand := "anpassung".anpassung[za].ISTBestand -1 ;
                xb := xb+1;
              END_IF;
            END_FOR;
        END_FOR;
    
    END_IF;
     ;
      FC54 := 100;
    END_FUNCTION
    Zitieren Zitieren SCL -1 subtrahieren  

  2. #2
    Registriert seit
    11.10.2006
    Ort
    Verden (Aller)
    Beiträge
    532
    Danke
    31
    Erhielt 58 Danke für 49 Beiträge

    Standard

    Setze mal die Bedingungen in Klammern:

    IF (MagazinLeerenAusgewaehlt = True) AND (FreigabeDBWertNullSetzen = True) THEN

    obwohl man hier auch schreiben könnte:
    IF MagazinLeerenAusgewaehlt AND FreigabeDBWertNullSetzen THEN

    Aber vor allem diese hier:
    IF ("anpassung".anpassung[za].Wahre_Groesse = Groesse) AND (xb =1) THEN
    Geändert von derwestermann (14.04.2008 um 15:47 Uhr)
    "Ein lahmer Drecksplanet ist das, ich habe nicht das geringste Mitleid" (Prostetnik Vogon Jeltz)

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

    Zitat Zitat von derwestermann Beitrag anzeigen
    IF ("anpassung".anpassung[za].Wahre_Groesse = Groesse) AND (xb =1) THEN
    aber selbst dann würde er nur einmal dekrementieren, da ja xb in der selben if-bedingung inkrementiert wird und somit xb=1 nicht mehr VKE=1 ergibt
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  4. #4
    Registriert seit
    11.10.2006
    Ort
    Verden (Aller)
    Beiträge
    532
    Danke
    31
    Erhielt 58 Danke für 49 Beiträge

    Standard

    Ja, wie? Ist da etwa eine FOR NEXT Schleife drumrum???

    Um das xb hatte ich mir nicht so Gedanken gemacht, frage mich aber nun, wozu dieses.

    Ich gestehe, ich habe das Problem noch nicht gerafft, habe aber selbst meist ein Problem mit nicht Boolschen Abfragen in IF-Bedingungen, wenn ich keine Klammern setze, daher der Schnellschuß.

    Sorry
    "Ein lahmer Drecksplanet ist das, ich habe nicht das geringste Mitleid" (Prostetnik Vogon Jeltz)

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

    Zitat Zitat von derwestermann Beitrag anzeigen
    Sorry
    nich schlim

    also eigentlich sollte es ohne xb funktionieren ... wie wäre es mal mit bißchen feedback, sr-83? du siehst doch, das wir noch im nebel stochern ... mahc mal das xb weg also aus der IF-anweisung, der rest ist ja erstmal egal ... was passiert dann?
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  6. #6
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Du schreibst hier:
    Code:
    IF FreigabeDBWertNullSetzen = False THEN
        xb := 1;
    END_IF;
    und dann:
    Code:
    IF MagazinLeerenAusgewaehlt = True AND FreigabeDBWertNullSetzen = True THEN 
        
        FOR z := 1 TO 3 BY 1 DO
            "lager".Zeile[z].Spalte[AngefahrenSpalte].Belegt := False;
            Groesse := "lager".Zeile[z].Spalte[AngefahrenSpalte].Groesse;
            FOR za := 1 TO 30 BY 1 DO
              IF "anpassung".anpassung[za].Wahre_Groesse = Groesse and xb =1 THEN
                "anpassung".anpassung[za].ISTBestand := "anpassung".anpassung[za].ISTBestand -1 ;
                xb := xb+1;
              END_IF;
            END_FOR;
        END_FOR;
    D.h. Dein ganzes Konstrukt wird nur abgearbeitet, wenn "FreigabeDBWertNullSetzen" True ist. Wenn das aber True ist, setzt Du oben aber Dein "xb" nicht mehr auf 1.

    Dann ist auch Dein
    Code:
     IF "anpassung".anpassung[za].Wahre_Groesse = Groesse and xb =1 THEN
    ......
    nie mehr erfüllt. Also zählt er nicht.

  7. #7
    sr-83 ist offline Benutzer
    Themenstarter
    Registriert seit
    19.01.2007
    Beiträge
    69
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich habe das nun mit einem kleinen Code ausprobiert, aber ich bekomme das einfach nicht hin.

    Sobald Merker und HMerker True sind, zählt der Wert "testwert" immer weiter ins Minus. Kann man die Schleife nur einmal durchlaufen lassen und dann stoppen? Ich will sobald man Merker und HMerker True setzt, dass er den Wert "testwert" um 1 verringert und dann erst wieder ein ins Minus zählt, wenn Hmerker und Merker wieder eine positive Flanke bekommen usw...

    Code:
    FUNCTION FC54 : INT
    
    VAR_INPUT
        
    Merker:     BOOL;
    HMerker:    BOOL;
        
        
    END_VAR
    
    VAR_TEMP
        // temporäre Variablen
        
    x: INT;
    s: INT;
    
    
    END_VAR
    
        // Anweisungsteil
        IF Merker = True THEN
          FOR s := 1 TO 30 BY 1 DO
                IF s = 10 AND HMerker = true THEN
                "lager".testwert := "lager".testwert -1;
                END_IF;
            END_FOR;
        END_IF;
      
        ;
        FC54 := 100;
    END_FUNCTION

  8. #8
    Registriert seit
    18.09.2004
    Ort
    Münsterland/NRW
    Beiträge
    4.719
    Danke
    729
    Erhielt 1.159 Danke für 970 Beiträge

    Standard

    Vielleicht hilft dir dieser Beitrag weiter
    http://www.sps-forum.de/showthread.p...ght=flanke+scl

  9. #9
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Wenn Du eine Flankenauswertung haben möchtest, hast Du es mit einer Funktion sehr schwer.

    Das Problem ist, das Du zum Auswerten einer Flanke ja irgendwo speichern musst, wie der Zustand Deines Bits einen Zyklus vorher war.

    Ein Beispiel:

    Bit : Bool;
    Hilfsbit : Bool;
    Meine_Positive_Flanke : Bool;

    Eine pos. Flanke hast Du, wenn Dein Bit True ist und im letzten Zyklus False, also so etwa:

    Meine_Positive_Flanke := Bit AND NOT Hilfsbit;

    Bevor Du den Baustein verlässt, speicherst Du den Zustand Deines Bits in Deiner Hilfsvariable, also so:

    Hilfsbit := Bit;

    So könnte man also seine eigene Flanke bauen. (FP in AWL funktioniert im Prinzip auch so)

    Dein Problem ist nun, dass Du in einem FC zwar diesen Code programmieren könntest, in einem FC aber keine Variablen gespeichert werden können. Die Variable "Hilfsbit" wäre im nächsten Zyklus jedesmal wieder FALSE. Und damit würdest Du immer eine positive Flanke erkennen wo keine ist. Abhilfe würde an dieser Stelle die Verwendung eines FBs schaffen. Diese haben ein "Gedächtnis" in Form eines Instanz-DBs. Die Variable "Hilfsbit" müsste dann statisch angelegt werden und der Code würde funktionieren.

  10. #10
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Noch mal so am Rande:

    Wenn Du eine Schleife vorzeitig verlassen möchtest, kannst Du auch "EXIT" verwenden. Das beendet die For-Schleife, die Dein "EXIT" Kommando umschließt. Hat den Vorteil, das die Schleife nicht mehr unnötig durchlaufen wird.

Ähnliche Themen

  1. TIME of DAY subtrahieren etc.
    Von hank12 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 29.05.2009, 14:42
  2. P#0.1 vom AR subtrahieren
    Von godi im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 19.02.2006, 19:34

Lesezeichen

Berechtigungen

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