Step 7 Realwert Vergleich in SCL

quick_2015

Level-1
Beiträge
5
Reaktionspunkte
0
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
 
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;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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;
 
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 ...
 
Nur besser, wenn keine Richtung erkannt werden muss.

s. Post #1
Var_output
Is_Forw : Bool;
Is_Backw : Bool;
Out_Value : Real;
End_Var
 
Code:
delta := Act_pos - Save_pos;
Is_forw := delta > 0.0;
Is_Backw := delta < 0.0;
[B][COLOR=#800080]Is_stopped := NOT Is_forw AND NOT Is_Backw;[/COLOR][/B]
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?
:confused:


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.
:oops:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :)
 
Wenn Du Is_Forw setzen/rücksetzen willst, dann muß Is_Forw ein Gedächtnis haben, müsste also ein IN_OUT sein.

Harald
 
:idea::idea: F.. Genau das war es! Hab schon an allem möglichen jetzt gezweifelt. War irgendwie der Ansicht, das im FB die Out´s übern IDB ein Gedächtniss haben. Muss wieder mehr S7 machen :) Danke!
 
Guten morgen,

da es sich um ein ähnliches Thema handelt, versuche ich es mal unter diesem beitrag.

Folgende Situation:
Ich möchte einen Tank mit Wasser aufheizen. Dieses aufheizen geschiet in einem ,,kleinen Kreislauf" mit wenig Rohrleitung, zwischen tank und heizung.
Wenn der Tank nun eine gewisse Temperatur erreicht hat, möchte ich umschalten auf einen ,,großen Kreislauf".

Ich wollte das so realisieren:

Variable aus dem HMI(Schieberegler der die Temperatur Simuliert)
"LAS_LBF_HMI_Communication"."Temperatur Simulation" : INT;


Var_STATIC
test_tanktemperatur_erreicht : BOOL;
END_VAR



If "LAS_LBF_HMI_Communication"."Temperatur Simulation" >= 60 THEN
test_tanktemperatur_erreicht = TRUE;
END_IF;


Nun meckert TIA. Kann ich in einer IF abfrage keinen INT wert abfragen, und das ergebnis in einer boolschen Variable schreiben, oder worin liegt mein Problem?

Ich hoffe mir kann jemand weiterhelfen.

Vielen dank.
 

Anhänge

  • Unbekannt1.PNG
    Unbekannt1.PNG
    5 KB · Aufrufe: 16
Zuletzt bearbeitet:
Zurück
Oben