Moeller PS4 151 + S40 als Zeituhr

loonys

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich blicke einfach nicht durch. Ich versuche schon eine ganze Zeit vergebens meine Moeller PS4-151-MM1 in Verbindung mit Sucosoft S40 als Zeitschaltuhr zu programmiern.
Bisher bin ich soweit das ich vermute mit dem FB RealTimeClock weiter zu kommen. Es gibt in der Hilfe zwar ein Beispiel des Zeitvergleiches, jedoch in AWL oder ST. Leider scheitere ich schon daran die dort verwendeten Variablen in den Syntax Modus umzusetzen.
Könnte mir evtl. jemand ein Beispiel in FBS + Syntax-Modus der Variablendeklaration mailen ?

r.luerken@gmx.de

g

ralf
 
Zeitschaltuhr

Hallo Ralf,

im Anhang ein kleines Beispiel. Die Echtzeituhr wird ausgelesen, die Uhrzeit im TOD-Format wird gebildet, das Datum in DATE-Format, sowie Datum und Uhrzeit im DATE_AND_TIME-Format werden gebildet.

Der Ausgang_0 schaltet vom 23.04.09 12:00Uhr bis 25.04.09 18:00Uhr auf TRUE.

mfG Jan
 

Anhänge

  • Zeituhr.zip
    14,2 KB · Aufrufe: 46
Zuviel Werbung?
-> Hier kostenlos registrieren
Variableneditor>Syntaxmodus

Schalt doch mal den Variableneditor in den Sysntaxmodus. Ist finde ich leichter zum einfügen von neuen Variablen.
Dann teste mal auf leere Zeile gehen, rechtsklick auf Typ, dann einfügen Variablendekleration, Funktionsbaustein> Datum Uhrzeit und dann den entsprechenden Baustein auswählen.
In der Pos. 4 noch den Namen im SPS Programm genn und fertig.
Danach sollte er in der Variablenliste sein.

grtc.jpg
 
Zuletzt bearbeitet:
Danke für das Beispiel. Leider zeigt mir die susosoft s40 5.0 nur die Variabeln im freien Modus an. Vom eigentlichen Programm wird nichts angezeigt ;-(.
Könntest Du evtl. ein neues Beispiel in FBS und Sytaxmodus der Variabeln einstellen ?

g

ralf
 
S40 Programm

Hast du eigentlich schon überhaupt schon mal ein S40 Programm geschrieben??
Umschalten des Variableneditors über: Extras>Variableneditor>Syntax.

Gruß Joachim
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...und den entsprechenden Reiter (lokal, global, typ) auswählen. In meinem Programmbeispiel sind alle Variablen global deklariert.

hier nochmal der Programmcode:

Code:
CAL Uhr_lesen ( 
 |
 := Year ,
 := Month ,
 := Day ,
 := Weekday ,
 := Hour ,
 := Minute ,
 := Second )
 
Uhrzeit_erzeugen.Second:=USINT_TO_UINT(Uhr_lesen.Second);
Uhrzeit_erzeugen.Minute:=USINT_TO_UINT(Uhr_lesen.Minute);
Uhrzeit_erzeugen.Hour:=USINT_TO_UINT(Uhr_lesen.Hour);
 
CAL Uhrzeit_erzeugen( 
 MilliSecond := ,
 Second := ,
 Minute := ,
 Hour := 
 |
 td_aktuelle_Uhrzeit:= OutputTOD ,
 := Error )
 
Datum_erzeugen.Day:=USINT_TO_UINT(Uhr_lesen.Day);
Datum_erzeugen.Month:=USINT_TO_UINT(Uhr_lesen.Month);
Datum_erzeugen.Year:=USINT_TO_UINT(Uhr_lesen.Year);
 
CAL Datum_erzeugen ( 
 Day := ,
 Month := ,
 Year := 
 |
 da_aktuelles_Datum:= OutputDate ,
 := Error )
 
D_A_T_erzeugen.Second:=USINT_TO_UINT(Uhr_lesen.Second);
D_A_T_erzeugen.Minute:=USINT_TO_UINT(Uhr_lesen.Minute);
D_A_T_erzeugen.Hour:=USINT_TO_UINT(Uhr_lesen.Hour);
D_A_T_erzeugen.Day:=USINT_TO_UINT(Uhr_lesen.Day);
D_A_T_erzeugen.Month:=USINT_TO_UINT(Uhr_lesen.Month);
D_A_T_erzeugen.Year:=USINT_TO_UINT(Uhr_lesen.Year);
 
CAL D_A_T_erzeugen ( MilliSecond := ,
 Second := ,
 Minute := ,
 Hour := ,
 Day := ,
 Month := ,
 Year := 
 |
 dat_akutelles_Datum_Uhrzeit:= OutputDAT ,
 := Error )
 
 (***Ausgang 0 wird geschalten***)
 
IF (dat_akutelles_Datum_Uhrzeit > DT#2009-04-23-12:00:00) AND (dat_akutelles_Datum_Uhrzeit < DT#2009-04-25-18:00:00) Then
 x_D_Ausgang_0:=true;
END_IF;
mfG Jan
 
Hallo,

ja ich habe schon ein s40 programm geschrieben. Ich bin nur leider aus der Übung da ich dies zuletzt 2004 im Rahmen der Meisterausbildung tat.
Jetzt versuche ich im Selbststudium die Programmierung zu erlernen.

g

ralf
 
Danke für die Hilfe, ich hoffe ich komme jetzt in diesem Bereich weiter.
Eine anderes Problem is das ich den Analogausgang zur Dimmung der T5 LS nutzten möchte.
Gibt es dafür eine Möglichkeit ?

ralf

...und den entsprechenden Reiter (lokal, global, typ) auswählen. In meinem Programmbeispiel sind alle Variablen global deklariert.

hier nochmal der Programmcode:

Code:
CAL Uhr_lesen ( 
 |
 := Year ,
 := Month ,
 := Day ,
 := Weekday ,
 := Hour ,
 := Minute ,
 := Second )
 
Uhrzeit_erzeugen.Second:=USINT_TO_UINT(Uhr_lesen.Second);
Uhrzeit_erzeugen.Minute:=USINT_TO_UINT(Uhr_lesen.Minute);
Uhrzeit_erzeugen.Hour:=USINT_TO_UINT(Uhr_lesen.Hour);
 
CAL Uhrzeit_erzeugen( 
 MilliSecond := ,
 Second := ,
 Minute := ,
 Hour := 
 |
 td_aktuelle_Uhrzeit:= OutputTOD ,
 := Error )
 
Datum_erzeugen.Day:=USINT_TO_UINT(Uhr_lesen.Day);
Datum_erzeugen.Month:=USINT_TO_UINT(Uhr_lesen.Month);
Datum_erzeugen.Year:=USINT_TO_UINT(Uhr_lesen.Year);
 
CAL Datum_erzeugen ( 
 Day := ,
 Month := ,
 Year := 
 |
 da_aktuelles_Datum:= OutputDate ,
 := Error )
 
D_A_T_erzeugen.Second:=USINT_TO_UINT(Uhr_lesen.Second);
D_A_T_erzeugen.Minute:=USINT_TO_UINT(Uhr_lesen.Minute);
D_A_T_erzeugen.Hour:=USINT_TO_UINT(Uhr_lesen.Hour);
D_A_T_erzeugen.Day:=USINT_TO_UINT(Uhr_lesen.Day);
D_A_T_erzeugen.Month:=USINT_TO_UINT(Uhr_lesen.Month);
D_A_T_erzeugen.Year:=USINT_TO_UINT(Uhr_lesen.Year);
 
CAL D_A_T_erzeugen ( MilliSecond := ,
 Second := ,
 Minute := ,
 Hour := ,
 Day := ,
 Month := ,
 Year := 
 |
 dat_akutelles_Datum_Uhrzeit:= OutputDAT ,
 := Error )
 
 (***Ausgang 0 wird geschalten***)
 
IF (dat_akutelles_Datum_Uhrzeit > DT#2009-04-23-12:00:00) AND (dat_akutelles_Datum_Uhrzeit < DT#2009-04-25-18:00:00) Then
 x_D_Ausgang_0:=true;
END_IF;
mfG Jan
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich hatte Zeit mich mit deinem Programm ein wenig auseinanderzusetzen. Da mir die Programmierung in FBS leichter fällt habe ich versucht es in FBS umzusetzen.
Das ist mir auch teilweise gelungen. Ich stehe nur bei dieser Zeile vor einem Rätsel :

Uhr_erzeugen_hour :=USINT_TO_UINT(Uhr_lesen_hour);
Uhr_erzeugen_min :=USINT_TO_UINT(Uhr_lesen_min);
Uhr_erzeugen_sec :=USINT_TO_UINT(Uhr_lesen_sec);


Gibt es eine Möglichkeit diese auch in FBS zu konvertieren. Wenn ich es genauso in AWL eingebe funktioniert zwar das Programm aber ich komme nicht mehr in den FBS Modus zurück.

g

ralf
 
Hallo,

hier mal mein programm, es funktioniert soweit. Leider schalte der Zyklus aber nur einmal. D.h. wenn ich die Uhr der SPS per Test&Inbetriebnahme ändere schalten die Ausgänge nacheinander ein und wieder aus. Nach diesem einem Durchlauf / Abfolge schaltet nichts mehr, erst nach Neustart der SPS. Gibt es dafür eine Erklärung bzw. Korrektur an meinem Programm ?

(*** Uhrzeit lesen und generieren ***)
CAL Uhr_lesen(

|
:= Year,
:= Month,
:= Day,
:= Weekday,
Uhr_lesen_hour := Hour,
Uhr_lesen_min := Minute,
Uhr_lesen_sec := Second
)


Uhr_erzeugen_hour :=USINT_TO_UINT(Uhr_lesen_hour);
Uhr_erzeugen_min :=USINT_TO_UINT(Uhr_lesen_min);
Uhr_erzeugen_sec :=USINT_TO_UINT(Uhr_lesen_sec);


CAL Uhrzeit_erzeugen(
MilliSecond := Uhr_erzeugen_milisec,
Second := Uhr_erzeugen_sec,
Minute := Uhr_erzeugen_min,
Hour := Uhr_erzeugen_hour
|
td_aktuelle_Uhrzeit := OutputTOD,
:= Error
)



(*** Beleuchtungsgruppe 1 Auto ein- / ausschalten ***)

IF (td_aktuelle_Uhrzeit > TOD#09:00:00) AND (td_aktuelle_Uhrzeit < TOD#23:00:00) Then
Bel1auto:=true;
END_IF;

IF (td_aktuelle_Uhrzeit > TOD#23:00:00) Then
Bel1auto_off:=true;
END_IF;


(*** Beleuchtungsgruppe 2 Auto ein- / ausschalten ***)
IF (td_aktuelle_Uhrzeit > TOD#11:00:00) AND (td_aktuelle_Uhrzeit < TOD#22:00:00) Then
Bel2auto:=true;
END_IF;


IF (td_aktuelle_Uhrzeit > TOD#22:00:00) Then
Bel2auto_off:=true;
END_IF;


(*** Beleuchtungsgruppe 3 Auto ein- / ausschalten ***)
IF (td_aktuelle_Uhrzeit > TOD#14:00:00) AND (td_aktuelle_Uhrzeit < TOD#21:30:00) Then
Bel3auto:=true;
END_IF;


IF (td_aktuelle_Uhrzeit > TOD#21:30:00) Then
Bel3auto_off:=true;
END_IF;


(*** Beleuchtungsgruppe 1 ein- / ausschalten ***)
LD Bel1_Hdein
OR Bel1auto
S BelGr1


LD Bel_Hdaus
OR Bel1auto_off
R BelGr1

(*** Beleuchtungsgruppe 2 ein- / ausschalten ***)
LD Bel2_Hdein
OR Bel2auto
S BelGr2


LD Bel_Hdaus
OR Bel2auto_off
R BelGr2

(*** Beleuchtungsgruppe 3 ein- / ausschalten ***)
LD Bel3_Hdein
OR Bel3auto
S BelGr3


LD Bel_Hdaus
OR Bel3auto_off
R BelGr3
 
Hallo loonys,

die Zeile

Uhr_erzeugen_hour :=USINT_TO_UINT(Uhr_lesen_hour);

ist nur ein Typcast(umwandlung) der Datentypen damit die FB´s entsprechend beschalten werden können. Keine Ahnung wie das in FBS aussieht, in AWL jedenfalls dann so:

LD Uhr_lesen_hour
USINT_TO_UINT
ST Uhr_erzeugen_hour

und zu deinem zweiten Problem:

(*** Beleuchtungsgruppe 1 Auto ein- / ausschalten ***)
IF (td_aktuelle_Uhrzeit > TOD#09:00:00) AND (td_aktuelle_Uhrzeit < TOD#23:00:00) Then
Bel1auto:=true;
ELSE
Bel1auto:=false;
END_IF;

Hatte bei meinem kleinen Testprogramm vergessen das Licht auszuschalten;);).

mfG Jan
 
Hallo,

ich habe das programm wie folgt geändert :

(*** Beleuchtungsgruppe 1 Auto ein- / ausschalten ***)
IF (td_aktuelle_Uhrzeit > TOD#09:00:00) AND (td_aktuelle_Uhrzeit < TOD#23:00:00) Then
Bel1auto:=true;
Else
Bel1auto_off:=true;
END_IF;


Der Erfolg ist, das die Beleuchtung nacheinander ein- und ausschalten, aber nur in einem Ablauf. Wenn ich nachdem die letzte Gruppe aus geschaltet hat die SPS Uhr wieder auf die Sartzeit der ersten Gruppe setze steht bei den Variabeln Bel1auto:=true;
Bel1auto_off:=true;
im Online Zustandsanzeige Modus eine 1 an. Erst nach Neustart ist wieder ein Ablauf möglich.

Wo liegt der Fehler ?

g

Ralf
 
Hallo Jan,

die Steuerung der Beleuchtung mittels der Zeituhrfunktion funktionirt dank Deiner Hilfe mitlerweile optimal, inklusive Hand- / Automatikbetrieb.
Jetzt zu meinem 2. Problem. Ich habe vor den 1-10V Analogausgang zu Regelung der Pumpenleistung über eine Rampe zu realisieren.
Leider komme ich malwieder nicht weiter und bräuchte eine Unterstützung in Form eines Beispiels wie ich den Analogausgang an sich ansteuern kann ( Variabeln, Funktionsbaustein, etc.)
Trotz mehrmaligem studieren der Hilfefunktion komme ich nicht weiter.

g

ralf
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Analogausgang

Hallo Ralf,

die PS4 hat einen 12-Bit Analogausgang d.h. 0V entsprechen 0 und 10V entsprechen 4095. Kleines Beispiel für 5V am QA, wenn I0 true.

Code:
VAR
 
Eingang_0            AT %I0.0.0.0.0     :BOOL;
Analogausgang     AT %QAW0.0.0.0   :UINT;
 
END_VAR
 
 
IF Eingang_0 = true  Then
         Analogausgang:= 2047;
Else    Analogausgang:= 0;
END_IF;

mfG Jan
 
Hallo Jan,

vielen Dank für die schnelle Hilfe. Den Grundaufbau habe ich soweut verstanden. Jetzt möchte ich den Ausgang über einen definierten Zeitraum von 1V - 8V hochfahren, dann wieder im gleichen Zeitraum abfallen lassen bis auf 1V. Danach geht der Zyklus von vorne los.
Ich dachte das läßt sich über eine Rampe realisieren, aber leider finde ich diese Funktion in der S40 Hilfe nicht. Dort ist die Rampenzeit nur in Verbindung mit einem FU annährend beschrieben.
Ich bräuchte einen Tip. ;-)

g

ralf
 
Rampe

Hallo Ralf,

das könntest Du mittels eines Zählers und eines Taktgenerators lösen.
Der Takt bestimmt dann die Steilheit deiner Rampe. Ein Rampen-baustein
befindet sich auch in der Reglungstecknik-Toolbox, die man sich kostenlos bei Moeller downloaden kann.

mfG Jan.
 
Zurück
Oben