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

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

Thema: Realwert Vergleich in SCL

  1. #1
    Registriert seit
    31.03.2015
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich habe ein kleines Problem, habe länger kein Step7 mehr gemacht,wahrscheinlich stehe ich nur auf der Leitung.

    Ich habe eine, bzw. mehrer Achsen, deren Istwert (Real) ich mir "umspeichern, bzw. auswerten möchte. Es geht jetzt nicht sooo genau.
    Mein Problem ist, wie stelle ich jetzt fest, das die Achse sich NICHT bewegt.

    Mein Code ist ungefähr so, aus dem Gedächtnis nachgetippt :

    Code:
    Var_Input 
    Act_pos : Real;
    End_Var
    
    Var_output
      Is_Forw : Bool;
      Is_Backw : Bool;
      Out_Value : Real;
    End_Var
    
    Var
      My_Movement : Real;
      Save_pos : Real;
    End_Var
    
    If  ( (Act_pos - Save_pos ) > 0 ) then
         
          Is_forw := True;
          Is_Backw := False;
          My_Movement := My_Movement + (Act_pos - Save_pos) ;
    End_if;
    
    If ( (Act_pos - Save_pos) < 0 ) then
          Is_forw := False;
          Is_Backw := True;
          My_Movement := My_Movement - (Save_pos - Act_pos);
    end_if;
    Kann das ganze nur am PG derzeit Testen, mit Simulierten WErten, d.h. Ich lasse ein MD hochzählen und bei 250.0 wieder runterzählen. Das ist Act_Pos
    Zitieren Zitieren Realwert Vergleich in SCL  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    Sie bewegt sich nicht, wenn sich die Position zum letzten Zyklus nicht geändert hat.
    Eigentlich brauchst du auch nicht subtrahieren, es reicht:

    Code:
    IF Act_pos > Save_pos THEN
      (* vorwärts *)
    ELSIF Act_pos < Save_pos THEN
      (* rückwärts *)
    ELSE
      (* Keine Änderung*)
    END_IF;
    Oder wenn du die Differenz später eh nochmal benötigst:
    Code:
    delta := Act_pos - Save_pos;
    Is_forw := delta > 0.0;
    Is_Backw := delta < 0.0;
    Is_stopped := NOT Is_forw AND NOT Is_Backw;
    My_Movement := My_Movement + delta;

  3. #3
    quick_2015 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    31.03.2015
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke erstmal, muss meinen Code morgen nochmals Prüfen

    Code:
    Is_stopped := NOT Is_forw AND NOT Is_Backw;
    Sowas hatte ich schon probiert, hat nicht geklappt, muss irgendwo nen Fehler drin haben. Danke erstmal

  4. #4
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    Zitat Zitat von quick_2015 Beitrag anzeigen
    Danke erstmal, muss meinen Code morgen nochmals Prüfen

    Code:
    Is_stopped := NOT Is_forw AND NOT Is_Backw;
    Sowas hatte ich schon probiert, hat nicht geklappt, muss irgendwo nen Fehler drin haben. Danke erstmal
    Das hängt vom Bausteintyp ab ob das überhaupt zulässig ist.
    Bei einem FB ist es möglich und in SCL auch erlaubt, bei einem FC wäre es ein Programmierfehler. Da du in einem Beispiel den Datenbereich VAR angegeben hast und auch irgendwo den Alt-Wert von Pos speichern musst, bin ich mal davon ausgegangen dass du einen FB hast.

    An dieser Stelle ist aber auch ein Vergleich auch Gleichheit bei Real-Zahlen erlaubt:
    Code:
    Is_stopped := delta = 0.0;

  5. #5
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard

    In deiner Simulation wird das problemlos funktionieren.
    In der reelen Anlage wirst du aber Probleme bekommen, wenn der Istwert nicht hundertprozentig stehen bleibt.
    Kleinste Schwankungen würden als Bewegungen erkannt werden.
    Ich würde so eine Abfrage nur mit Hysterese, bzw. "Fensterbereich" programmieren.
    z.B.
    IF Act_pos>(Save_pos+Hyst) THEN ...

  6. #6
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard

    Besser:

    IF (ABS (Act_pos -Save_pos) > Hyst) THEN ...
    Als Freelancer immer auf der Suche nach interessanten Projekten.

  7. #7
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard

    Nur besser, wenn keine Richtung erkannt werden muss.

    s. Post #1
    Var_output
    Is_Forw : Bool;
    Is_Backw : Bool;
    Out_Value : Real;
    End_Var

  8. #8
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Zitat Zitat von quick_2015 Beitrag anzeigen
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Code:
    delta := Act_pos - Save_pos;
    Is_forw := delta > 0.0;
    Is_Backw := delta < 0.0;
    Is_stopped := NOT Is_forw AND NOT Is_Backw;
    My_Movement := My_Movement + delta;
    Sowas hatte ich schon probiert, hat nicht geklappt, muss irgendwo nen Fehler drin haben.
    Das hängt vom Bausteintyp ab ob das überhaupt zulässig ist.
    ... bei einem FC wäre es ein Programmierfehler.
    @Thomas_v2.1,

    warum wäre denn Dein Codeauszug (bzw. die von quick_2015 zitierte Zeile) bei einem FC ein Programmierfehler?



    PS: Ich hätte per se erst mal wegen Temp-Variablen vermutet. Aber Lesen vor Schreiben kann man bei diesem Auszug ja nicht wirklich feststellen.


    PPS: Ah' okay, hab' die Variablendefinition in Post#1 nicht mit Deinem Beispielcode in Zusammenhang gesehen. Damit wären Outputs lesend verwendet.
    Geändert von hucki (31.03.2015 um 20:52 Uhr)

  9. #9
    quick_2015 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    31.03.2015
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Das ganze klappt nicht bei mir.

    Ein Simples :
    Code:
    Is_Forw := (Act_Value > Save_Value);
    Bringt den Ausgang Is_Forw zum takten bei mir. Ist eigentlich klar, aber ich hatte das nicht so erwart und kann das auch nicht so brauchen. Ich werd das ganze doch Setzten müssen.

    Hysterese ist klar, bau ich schon mit ein. Aber erstmal brauch ich die Grundfunktion

  10. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wenn Du Is_Forw setzen/rücksetzen willst, dann muß Is_Forw ein Gedächtnis haben, müsste also ein IN_OUT sein.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Step 7 SCL Zuweisungen, indirekter Vergleich
    Von lexxoe im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.08.2014, 11:38
  2. Step 7 SCL Array Vergleich - S7-313C
    Von Sickone4 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 08.01.2014, 13:27
  3. Pointer Vergleich AWL -> SCL??
    Von Carsten77 im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 16.08.2011, 14:21
  4. in scl indirekt auf realwert zugreifen
    Von Bensen83 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 14.03.2011, 21:14
  5. Vergleich AWl <--> SCL
    Von nobug im Forum Programmierstrategien
    Antworten: 6
    Letzter Beitrag: 11.03.2008, 20:11

Lesezeichen

Berechtigungen

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