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

Ergebnis 1 bis 10 von 10

Thema: Flanke SCL

  1. #1
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hatte letztens eine hitzige Debatte mit einem Kollegen wegen einer Flankenauswertung in SCL. Ich versteh auch nicht ganz wieso das eigentlich funktioniert. Hier erstmal der Code:

    Code:
    Trigger := False;
    Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    
    IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
    IndexAnf := IndexAnf + 1;
    
    
    IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN 
        Trigger := True;
        Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    END_IF;
    Der Index wird jeden SPS-Zyklus um eins erhöht. Anforderung_alt ist ein Array of Bool und eine Stat-Variable. Anforderung ist ebenfalls ein Array of Bool und eine Eingangsvariable.
    Das Signal Trigger setzt er mit einer pos. Flanke. Ich versteh allerdings nicht wie die Flanke überhaupt zustande kommen kann. Angenommen der Index ist jetzt 1 und das Signal Anforderung an der Indexstelle ist ebenfalls log 1. Dann wird doch am Anfang des Programms folgendes gemacht:
    Anforderung_alt[1]:= True; (weil ja Anforderung[1] ebenfalls True ist)

    Wie kann jetzt die Flanke erfolgen?

    If Anforderung[1] = True and not Anforderung_alt[1] = False weil sie ja davor mit dem Wert True überschrieben wird!?!

    Verstehen würde ich es wenn er das nur einmalig machen will! Dann würde ich es allerdings so schreiben:

    Code:
    Trigger := False;
    
    IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
    IndexAnf := IndexAnf + 1;
    
    
    IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN 
        Trigger := True;
        Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    END_IF;
    So würde Trigger nur einmal an der jeweiligen Indexstelle gesetzt werden, wenn das Signal Anforderung True ist.

    Wenn er es bei jeder pos. Flanke machen will würde ich es so schreiben:

    Code:
    Trigger := False;
    
    IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
    IndexAnf := IndexAnf + 1;
    
    
    IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN 
        Trigger := True;
    END_IF; 
        Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    Dennoch funktioniert aber seine Variante auch... Wieso?? Ich denk bei SCL nämlich immer gerne Zeile für Zeile... Sprich was ganz oben steht wird auch als erstes durchgeführt...

    Vielleicht denk ich aber auch nur falsch / zu kompliziert ?!?
    Zitieren Zitieren Flanke SCL  

  2. #2
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Zitat Zitat von nutellahase Beitrag anzeigen
    Hatte letztens eine hitzige Debatte mit einem Kollegen wegen einer Flankenauswertung in SCL. Ich versteh auch nicht ganz wieso das eigentlich funktioniert. Hier erstmal der Code:

    Code:
    Trigger := False;
    Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    
    IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
    IndexAnf := IndexAnf + 1;
    
    
    IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN 
        Trigger := True;
        Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    END_IF;
    Der Index wird jeden SPS-Zyklus um eins erhöht. Anforderung_alt ist ein Array of Bool und eine Stat-Variable. Anforderung ist ebenfalls ein Array of Bool und eine Eingangsvariable.
    Das Signal Trigger setzt er mit einer pos. Flanke. Ich versteh allerdings nicht wie die Flanke überhaupt zustande kommen kann. Angenommen der Index ist jetzt 1 und das Signal Anforderung an der Indexstelle ist ebenfalls log 1. Dann wird doch am Anfang des Programms folgendes gemacht:
    Anforderung_alt[1]:= True; (weil ja Anforderung[1] ebenfalls True ist)

    Wie kann jetzt die Flanke erfolgen?

    If Anforderung[1] = True and not Anforderung_alt[1] = False weil sie ja davor mit dem Wert True überschrieben wird!?!

    Verstehen würde ich es wenn er das nur einmalig machen will! Dann würde ich es allerdings so schreiben:

    Code:
    Trigger := False;
    
    IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
    IndexAnf := IndexAnf + 1;
    
    
    IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN 
        Trigger := True;
        Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    END_IF;
    So würde Trigger nur einmal an der jeweiligen Indexstelle gesetzt werden, wenn das Signal Anforderung True ist.

    Wenn er es bei jeder pos. Flanke machen will würde ich es so schreiben:

    Code:
    Trigger := False;
    
    IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
    IndexAnf := IndexAnf + 1;
    
    
    IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN 
        Trigger := True;
    END_IF; 
        Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    Dennoch funktioniert aber seine Variante auch... Wieso?? Ich denk bei SCL nämlich immer gerne Zeile für Zeile... Sprich was ganz oben steht wird auch als erstes durchgeführt...

    Vielleicht denk ich aber auch nur falsch / zu kompliziert ?!?

    Hallo!

    Könntest du noch etwas mehr ausholen?Wie wird die Eingansvariable Anforderung beschrieben?Bzw. in welchem zusammenhang wird dieser Baustein verwendet?

    Mfg

  3. #3
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard

    Zitat Zitat von nutellahase Beitrag anzeigen
    Der Index wird jeden SPS-Zyklus um eins erhöht.
    Das sehe ich auch so, denn die zweite IF Anweisung wird doch wohl gar nie durchlaufen:
    Code:
    Trigger := False;
    Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
     
    IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
    IndexAnf := IndexAnf + 1;
     
    // Diese Anweisung wird nie bearbeitet da Anforderung_alt immer gleich Anforderung ist. 
    IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN 
        Trigger := True;
        Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    END_IF;
    Das einzige was an dem Code relevant ist, sind die grün markierten Zeilen.
    Den Rest kann dein Kollege weglassen und du hast Recht, das hat nichts mit einer Flankenauswertung zu tun.
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  4. #4
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Wenn der Baustein das erste mal aufgerufen wird macht er sehrwohl die Flanken aber nur solange bis der Index einmal komplett durchlaufen wurde!Wenn am eingang Anforderung[IndexAnf] wieder 0 anliegt denn dann werden die Statisch gespeicherten Nforderung_alt[IndexAnf] Werte wieder mit False überschrieben!Wird das auch einen ganzen Indexdurchlauf gemacht kann wieder mit der Flankenausauswertung begonnen werden!

    Mfg

  5. #5
    Registriert seit
    17.03.2011
    Ort
    im Wald
    Beiträge
    284
    Danke
    11
    Erhielt 36 Danke für 35 Beiträge

    Standard

    Hallo,

    1. Aussage vom TE es funktioniert.

    2. es liegt wohl daran, das z.B. am Anfang des Codes, also vor dem grünen.

    IndexAnf, z.B. 17 ist und dann auf 18 geändert wird.

    Gruß, Voxe

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Zitat Zitat von nutellahase Beitrag anzeigen
    Hatte letztens eine hitzige Debatte mit einem Kollegen wegen einer Flankenauswertung in SCL. Ich versteh auch nicht ganz wieso das eigentlich funktioniert. Hier erstmal der Code:

    Code:
    Trigger := False;
    Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    
    IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
    IndexAnf := IndexAnf + 1;
    
    
    IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN 
        Trigger := True;
        Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    END_IF;
    Vielleicht denk ich aber auch nur falsch / zu kompliziert ?!?
    Du denkst wohl zu kompliziert!

    Ich versuch das mal zu erklären

    1. Trigger := False; //hier wird der Trigger immer False gesetzt
    2. Anforderung_alt[IndexAnf] := Anforderung[IndexAnf]; //hier wird die Anforderung X immer gleich gesetzt!!!!!!!!!!!!!!!!!

    3. IF IndexAnf > 99 THEN
    4. IndexAnf := 0;
    5. END_IF; //Kontrolle, ober der Index überläuft, wenn ja zurücksetzen auf 0, Paule, du hast hier das END_IF überlesen, das ist so korrekt
    6. IndexAnf := IndexAnf + 1; //hier wird der Index immer um 1 erhöht X := X+1


    7. IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN //Anforderung (X+1 in Bezug auf Zeile 2!!!) True und Anforderung _alt (X+1 in Bezug auf Zeile 2!!!) noch False!!!, dann
    8. Trigger := True; //Trigger auf True
    9. Anforderung_alt[IndexAnf] := Anforderung[IndexAnf]; //Anforderung_alt auf gleichen Wert wie Anforderung setzen
    10. END_IF; [/CODE]

    Zeile 2 setzt die Anforderung_alt(X) auf den Wert von Anforderung(X)
    Zeile 6 erhöht den Index Anforderung auf X+1
    Zeile 7 Anforderung X+1 auf True mit Anforderung_alt X auf False und
    Zeile 8 setzt den Trigger
    Zeile 9 setzt Anforderung_alt X+1 auf den Wert von Anforderung X+1, damit ist Anforderung alt auch auf True,

    Es ergibt sich: Wenn Anforderung auf True geht und Anforderung_alt noch False ist kommt eine Flanke zustande, anschließend sind Anforderung und Anforderung_alt gleichgesetzt!!!
    In nächsten Durchlauf (Zyklus) wird Anforderung_alt und Anforderung gleichgesetzt, dann muß Anforderung also wieder False sein, sonst funtkioniert der Code nicht!!!!!!!

    Der Code bringt Flanken bei Kommen des Ereignisses, also wenn Anforderung (Index) True, aber nur jedes 2. Mal oder aber, Anforderung ist selbst schon eine Flanke!

    Warum? Der Code bekommt nicht mit, dass Anforderung auf False geht, es sei denn, Anforderung ist selbst eine Flanke, also im nächstfolgenden Zyklus schon wieder False.
    Wenn Anforderung zu einem beliebigen Zeitpunkt False wird, dann wird beim nächsten Durchlauf (Z+1) des Index keine Flanke erkannt, denn Anforderung_alt ist noch True, Anforderung_Alt wird aber immerhin wieder False gesetzt und so wird dann beim Durchlauf Z+2 die Flanke erkannt, so Anforderung dann immer noch auf True steht!!!
    Geändert von Ralle (16.10.2011 um 14:36 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

  7. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    nutellahase (16.10.2011)

  8. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Wie auch immer ...
    Ich würde auch die Variante favourisieren, die der TE selbst auch für besser hält (also die Flanke nach der Überprüfung bilden). Es ist so auf Anhieb ersichtlich.

    Gruß
    Larry

  9. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Wie auch immer ...
    Ich würde auch die Variante favourisieren, die der TE selbst auch für besser hält (also die Flanke nach der Überprüfung bilden). Es ist so auf Anhieb ersichtlich.

    Gruß
    Larry
    Das grundsätzliche Problem an dem Code ist, dass erst beim nächsten Indexzähldurchgang wieder alles zurückgestellt werden kann! In den restlichen 99 Zyklen, kann die Variable Anforderung, deren Index gerade nicht an der Reihe ist, machen, was sie will, es passiert nichts. Angenommen, man hat 10ms Zykluszeit, dann sind das 1 Sekunde und da kann viel passieren, zumindest wird dann nur alle 2 Sekunden überhaupt eine Flanke erkennbar sein, denn nach 1 Sekunde muß ja erstmal zurückgestellt werden. Kann sein, dass das für die Aufgabe ausreichend ist, mir würde das so nicht gefallen.
    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

  10. #9
    nutellahase ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Du denkst wohl zu kompliziert!

    Ich versuch das mal zu erklären
    [...]
    Danke ... na klar ... das mit x und x+1 wäre mir jetzt so nie in den Sinn gekommen . Habe das immer mit den gleichen Index verglichen und dabei völlig vergessen, dass die Zeile ja davor steht.

    So würde es dann aber nie funktionieren oder bzw. wäre es völlig sinnlos?:

    Code:
    Trigger := False;
    
    IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
    IndexAnf := IndexAnf + 1;
    
    Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    
    IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN 
        Trigger := True;
        Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
    END_IF;
    Ich bleibe dennoch bei meiner Variante, weil wie man sieht verwirrt es einen anfangs scheinbar doch sehr.

    Zum Thema Zyklen:
    Wir haben das auch schon mit einer Schleife probiert, das Problem dabei ist dass dann die Zykluszeit enorm ansteigt (was auch logisch bei einer Schleife ist). Für unsere Anwendung reicht die zyklische Abarbeitung vollkommen aus. Das Signal Anforderung ist im Grunde ein digitaler Eingang von einer Klappe. Dieser Eingang liegt solange an bis Material nachgefüllt wurde. Nachdem wir 100 Dinger davon haben eben ein Array von 100 Einträgen.

    Von daher versteh ich auch seine Auswertung nicht warum er das so macht. Da werte ich doch gleich die Flanke im gleichen Index aus (Variante 3 im ersten Beitrag). Sollte das Signal beim nächsten Durchlauf immer noch anliegen wird die Variable Trigger sowieso nicht mehr gesetzt.
    Die Art und Weise wie er manchmal die If-Blöcke schreibt (in einer Wurst) habe ich auch schon mal kritisiert. Das ist teilweise auch sehr unübersichtlich und man überliest dann schon manchmal ein End_if!
    Aber ich bin ja nur Instandhalter und er der Programmierer also kann ich schon verstehen das man es vl. irgendwann nur mehr so runterschreibt und nichts mehr kommentiert.

    Aber man lernt halt nie aus! Daher ein Danke an Euch für eure Hilfe.

  11. #10
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ja, der Code in deinem letzten Post würde nicht funktionieren!
    Für die beschriebene Anwendung funktioniert der Ausgangscode, es dauert wohl einen Durchlauf länger, bis die neue Klappenstellung erkannt wird, das sollte nichts ausmachen, Material nachfüllen dauert sicher länger.
    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

Ähnliche Themen

  1. Flanke bei S7-200 vs. S7-300
    Von Strohsternbastler im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 02.08.2011, 20:02
  2. Flanke
    Von lieuthnant im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 18.08.2009, 10:40
  3. SCL- Flanke
    Von hans55 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 07.02.2008, 20:28
  4. Flanke
    Von Hitschkock im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 20.11.2007, 23:51
  5. N flanke P flanke
    Von bastek- im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 04.09.2007, 19:58

Lesezeichen

Berechtigungen

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