Phoenix Contact Motorsteuerung

fabwil

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich arbeite an einem Projekt mit der SPS ILC150ETH von Phoenix Contact und komme mit der ansteuerung eines Motors nicht weiter.

Vorhaben:
Es soll über einen Schalter E1 ein Motor über den anlogen Ausgang angesteuert werden. Dabei soll der Motor kontinuierlich anlaufen und beim ausschalten von E1 auch wieder auslaufen.
Dabei soll aber darauf geachtet werden das der Motor auch während des Einschaltvorgangs wieder abgeschaltet werden kann und kontinuierlich an Spannung / Drehzahl verringert.

E1=0 => AQ=0
E1=1 => AQ= soll nun innerhalb Zeit (t) bis auf Wert(x) ansteigen z.B. (X= FFFF in Word)
wenn dann
E1=0 => AQ= soll nun wieder bis auf den Wert0 herunterzählen


Das große Problem ist dabei das wenn AQ nicht den Maximal Wert (x) erreicht und vorher schon wieder abgeschaltet wird!!!!!! Es sollte dann ab dem erreichten Wert heruntergezählt werden und nicht ab dem Maximal Wert!!!!!


Es wäre super wenn mir jemand helfen könnte! Wenn dieses Problem in FBS bewältigbar ist wäre dies am besten! Antworten in anderen Sprachen würden mir aber auch schon sehr helfen!
Vielen Dank!!!

Zeitverlauf.JPG
 
Zuletzt bearbeitet:
...
ich arbeite an einem Projekt mit der SPS ILC150ETH von Phoenix Contact...

Sag mal Bist Du ein Klassenkamerad von cthome? Der hat heute auch schon eine Aufgabe (die nach Hausaufgabe roch) zu dieser Steuerung hier ins Forum gestellt.

Wenn sich meine Vermutung bestätigt haben wir wohl bald euere ganze Klasse hier im Forum ;o)

Ich kenn die Steuerung ja nicht aber da die ja IEC-kompatibel sein soll, sollte folgendes auch da funktionieren.

Wenn die Rampenzeit nicht beliebig ist sollte man die aktuelle Zykluszeit des Tasks ermitteln (wie das geht? RTFM!) Wenn die Rampenzeit nur Phi*Daumen sein darf kannst Du im Aufruf des FBs für CycleTime einfach einen festen Wert angeben.

Variablen Deklaration:
Code:
FUNCTION_BLOCK FB_RAMP
VAR_INPUT
  IN          : BOOL;
  CycleTime   : TIME;
  PresetTime  : TIME;
  MaxValue    : REAL;
END_VAR
VAR_OUTPUT
  OUT         : REAL;
END_VAR
VAR
  RampTime    : TIME;
END_VAR
Code:
IF IN THEN
  IF RampTime + CycleTime < PresetTime THEN
    RampTime := RampTime + CycleTime;
  ELSE
    RampTime := PresetTime;
  END_IF;
ELSE
  IF RampTime > CycleTime THEN
    RampTime := RampTime - CycleTime;
  ELSE
    RampTime := t#0ms;
  END_IF;
END_IF;

OUT := TIME_TO_REAL(RampTime) / TIME_TO_REAL(PresetTime) * MaxValue;
Das Bild zeigt das Ergebnis der Funktion.

PS: Klar kann man sowas auch in FBS Programmieren aber ich finde ST hierfür besser.
 

Anhänge

  • RAMP.GIF
    RAMP.GIF
    28 KB · Aufrufe: 12
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zotos,

Erst mal vielen Dank für die mühevolle und gute Antwort!!!!

:) ja ich kenne den CThome :) Wir arbeiten gemeinsam an einem Projekt aber in unterschiedliche Richtungen!


Aber ich habe weiterhin noch ein Problem und zwar bekomme ich den Quelltext nicht so ausgerichtet das die Variablen MaxValue und OUT vom Typ WORD sein können!
Ich habe nun mehrere Stunden herum probiert, bin aber kläglich gescheitert!
Könntes du mir dabei nochmals helfen?


Achso, noch eine Frage ist diese Steuerung auch in FBS realisierbar mit der SPS von Phoenix? Ich würde dies ganz gerne in FBS schreiben, bin dabei aber immer wieder, auch mit unterschiedlichen Ansätzen auf das Problem gestoßen, dass beim abschalten des Motors immer der Maximalwert übernommen wurde und von diesem aus heruntergezählt!

VIELEN DANK!!!!!
 
Wenn Du die OUT Variable im WORD Format haben willst sind das nur zwei weitere Typecast.

Code:
FUNCTION_BLOCK FB_RAMP
VAR_INPUT
  IN          : BOOL;
  CycleTime   : TIME;
  PresetTime  : TIME;
  MaxValue    : WORD;
END_VAR
VAR_OUTPUT
  OUT         : WORD;
END_VAR
VAR
  RampTime    : TIME;
END_VAR

Code:
IF IN THEN
  IF RampTime + CycleTime < PresetTime THEN
    RampTime := RampTime + CycleTime;
  ELSE
    RampTime := PresetTime;
  END_IF;
ELSE
  IF RampTime > CycleTime THEN
    RampTime := RampTime - CycleTime;
  ELSE
    RampTime := t#0ms;
  END_IF;
END_IF;

OUT := REAL_TO_WORD(TIME_TO_REAL(RampTime) / TIME_TO_REAL(PresetTime) * WORD_TO_REAL(MaxValue));
 
Hallo,

genau das habe ich auch schon versucht und habe glaube ich jetzt herausgefunden warum dies nicht funktioniert:

die funktion TIME_TO_REAL gibt es bei Phoenix nicht!

Daher habe ich TIME_TO_DINT und dann von DINT_TO_WORD gemacht und das funktioniert nicht!!!
Wahrscheinlich ist der Fehler, das DINT keine komma Zahlen aufnehmen kann???!

Vielen Dank für die schnelle Antwort!!!!!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für das Programm habe ich CoDeSys verwendet. Da sich Phoenix angeblich an die IEC61131-3 hält hatte ich erwartet das so ziemlich alle Konvertierungen (Typecast) vorhanden sind die man so gebrauchen kann.

Am einfachsten kommst Du aus der Situation wohl wenn Du alle Time durch DINT ersetzt und da wo ich z.B. T#0ms stehen habe einfach eine 0 reinschreibst. Die ganzen Typcast musst Du dann auch noch anpacken. Bitte versuch es erstmal selbst zu lösen. Um meine Zeitrechnerrei zu rechtfertigen möchte ich anmerken das ich davon ausgegangen bin das man emen von Null aus Max eine Zeit angeben will.

Jetzt habe ich mir extra die Mühe gemacht und das ganze in FBS gemalt und erfahre nun das dies bei Phoenix nicht funktonieren wird ;o(

Am besten versuchst Du das folgende Bild auf Phoenix umszusetzten und dabei die Typanpassungen vorzunehmen.
 

Anhänge

  • CODE.GIF
    CODE.GIF
    14,8 KB · Aufrufe: 17
  • RAMP2.GIF
    RAMP2.GIF
    20,6 KB · Aufrufe: 6
Hallo

bei PCWORX gibt es die funktion time_to_dint, aber eine Rampenfunktion gibt es auch bei OSCAT und die wiederum gibt es auch für PCWORX.
Allerdings ebenfalls in ST geschrieben.

ine Rampe kann man ebenfalls in Stufe realsieren, einfach in jedem Zyklus eine den Ausgangswert um x addieren. Um bei Abschalten den Ausgangswert umx subtrahieren.
 
Zurück
Oben