Uhrzeit- und Pausensteuerung Beckhoff

MichiJa

Level-1
Beiträge
22
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
ich hänge gerade an einer Aufgabe fest. Ich möchte gerne mithilfe einer Beckhoff Steuerung (TwinCat 3) mehrere Uhren synchronisieren und an bestimmten Tagen zu bestimmten Uhrzeiten eine Pausensirene für eine bestimmte Zeit ertönen lassen.
- Die Uhren werden über einen Minutenimpuls angesteuert
- Mo. bis Fr. ertönt die Sirene jeweils 10 mal (Uhrzeiten sind für jeden Wochentag identisch) für 3 Sekunden.
- Sa. ertönt die Sirene 5 mal ebenfalls für 3 Sekunden
- So. ist Ruhetag
Bezüglich der Uhrzeitsynchronisation bin ich wie folgt vorgegangen: Mithilfe des FB NT_GetTime gekoppelt an einem TON lese ich die Systemzeit aus. Anschließend werden die aktuellen Minuten mit denen aus dem vorherigen Zyklus verglichen. Bei Ungleichheit wird der Output auf True gesetzt und der Minutenzeiger angesteuert. Ich hoffe/denke, dass das soweit in Ordnung ist.

Mein Problem ist nun die Programmierung der Sirenen. Ich habe mich bereits im Forum umgeschaut, finde aber nicht die richtigen Ansatz für mein Problem.
Prinzipiell würde ich die Zeiten in ein Array packen und über eine Schleife mit der Systemzeit vergleichen und im Anschluss mit einem TP für 3 Sekunden auf True setzen. Doch wie binde ich die Wochentage am Besten ein? Ein weiteres Array oder Struct?
Zusatz: Über die Struktur TIMESTRUCT des FB's NT_GetTime können unter anderem die Wochentage, das Datum ,die Uhrzeit usw. herausgefiltert werden.

Sind meine Gedankengänge einigermaßen plausibel? Über Anregungen und Hilfestellungen zur Umsetzung würde ich mich freuen :)

Vielen Dank

Gruß
Michi
 
Ich würde ein Struct erstelle, wo die Wochentage Mo - So enthalten ist.
Für jden Tag gibt es dann ein enable Feld ( bool) und weitere Felder für die Startzeit und Dauer.
Die Struktur brauchst du dann für jede Sirene.
Ob du die in Array packst oder einzeln pro Sirene anlegst, ist geschmackssache.

In etwa so. Die einstellungen müssten natürlich remanent sein.

Code:
stSireneZeiten :struct
    Startzeit  :#Startzeit;
    Dauer :#Dauer;
end_struct;

stSireneTag :struct
   Enable :bool;
   Zeiten :array[#n] of stSireneZeiten;
end_struct;

stSirene :struct
    Mo,Die,Mi,Do,Fr,Sa,So :stSireneTag;
end_struct

Sirene01 :stSirene;
 
Blöde Frage. Die Uhren werden über einen Minutenimpuls angesteuert.
Das heißt bei jedem Impuls tickern sie eine Minute weiter?
Was machst Du dann wenn mal eine (warum auch immer) davon läuft.
(z.B. Stromausfall in dem Bereich)

Grüße

Marcel
 
Ist ja im Prinzip nichts anderes als eine Nebenuhr-Steuerung. Wenn man herkömmliche Nebenuhren eine Stunde vor oder zurück stellen will, gibt man 60 Impulse an die Nebenuhr. Theoretisch müsste man die Anzahl der fehlenden Impulse für ermitteln und an die Nebenuhr schicken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Blöde Frage. Die Uhren werden über einen Minutenimpuls angesteuert.
Das heißt bei jedem Impuls tickern sie eine Minute weiter?
Was machst Du dann wenn mal eine (warum auch immer) davon läuft.
(z.B. Stromausfall in dem Bereich)

Grüße

Marcel
Genau, bei jedem Impuls tickern sie eine Minute weiter.

Mrtain hats im Prinzip schon erklärt - das ganze ähnelt einer Nebenuhr-Steuerung.
Die Frage kam intern aber auch schon bezüglich des Wechsel von der Sommer- zur Winterzeit und umgekehrt auf. Die optimale Lösung für dieses Problem steht noch aus.

Gruß
Michi
 
Was machst Du dann wenn mal eine (warum auch immer) davon läuft.
Normalerweise werden die Impulse von der Mutteruhr gesendet. Die "Slave" Uhren brauchen keine Spannung oder sonstiges.
Zur Umstellung Winter -> Sommer kommen einfach 60 Impulse in schneller Folge. Bei Sommer -> Winter passiert 60 Minuten lang nichts.
 
Ich würde ein Struct erstelle, wo die Wochentage Mo - So enthalten ist.
Für jden Tag gibt es dann ein enable Feld ( bool) und weitere Felder für die Startzeit und Dauer.
Die Struktur brauchst du dann für jede Sirene.
Ob du die in Array packst oder einzeln pro Sirene anlegst, ist geschmackssache.

In etwa so. Die einstellungen müssten natürlich remanent sein.

Code:
stSireneZeiten :struct
    Startzeit  :#Startzeit;
    Dauer :#Dauer;
end_struct;

stSireneTag :struct
   Enable :bool;
   Zeiten :array[#n] of stSireneZeiten;
end_struct;

stSirene :struct
    Mo,Die,Mi,Do,Fr,Sa,So :stSireneTag;
end_struct

Sirene01 :stSirene;
Ist ja im Prinzip nichts anderes als eine Nebenuhr-Steuerung. Wenn man herkömmliche Nebenuhren eine Stunde vor oder zurück stellen will, gibt man 60 Impulse an die Nebenuhr. Theoretisch müsste man die Anzahl der fehlenden Impulse für ermitteln und an die Nebenuhr schicken.
Hallo,
ich habe die Sirenensteuerung jetzt etwas anders gelöst, beziehungsweise auf "eigenes" Programmieren verzichtet. Die Beckhoff Bib bietet einen Funktionsbaustein namens FB_WeeklyTimeSwitch an, mit dem man das Signal für eine bestimmte Zeit an ausgewählten Wochentagen erzeugen kann. Ich versuche nun die Sommer- & Winterzeit in mein Programm einzubeziehen. Kannst du mir/ Könnt ihr mir bitte weitere Denkanstöße geben wie ich dies umgesetzt bekomme? Muss ich mir das Datum und die Uhrzeit für die Uhrumstellungen holen und im Anschluss eine Schleife mit 60 Impulsen (Winter -> Sommer) ausgeben oder denke ich zu einfach?

Gruß
Michi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Muss ich mir das Datum und die Uhrzeit für die Uhrumstellungen holen und im Anschluss eine Schleife mit 60 Impulsen (Winter -> Sommer) ausgeben oder denke ich zu einfach?
Ich hätte da noch einen einfacheren Gedanken: Die EU schafft die Uhrzeitumstellung einfach mal ab - das wird so langsam mal Zeit.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest auch aus der TC2_Utillities den FB_LocalSystemTime benutzen.
Vielen Dank. Also den hatte ich auch schon im Visier und würde ihn auch gerne verwenden, jedoch weiß ich nicht, wie ich nach der Zeitumstellung meine 60 Impulse an die Uhren bringen kann. Kann mir da bitte jemand auf die Sprünge helfen? Aktuell verfolge ich noch den Ansatz mir die Tage der Umstellungen selbst zu errechnen und diese mit dem aktuellen Datum zu vergleichen.

Ach, eine Frage hätte ich auch noch in Bezug auf die Zeitumstellung von Winter zu Sommer: Was ergibt mehr Sinn? Die Uhren eine Stunde "warten" lassen oder den Zeiger um elf Stunden verschieben, wodurch man zumindest sieht, dass die Uhren "arbeiten"?

Gruß
Michi
 
Du brauchst ja nur die Minutenzeiger/-Anzeige laufen lassen, lass die Stunden aussen vor und aktualisiere die einfach alle 60 Minuten.
 
Was ergibt mehr Sinn? Die Uhren eine Stunde "warten" lassen oder den Zeiger um elf Stunden verschieben, wodurch man zumindest sieht, dass die Uhren "arbeiten"?
Das ist ja ein ganz neuer Aspekt. Bisher hiess es ...
- Die Uhren werden über einen Minutenimpuls angesteuert
Keine Rede davon, dass Du den StundenZeiger separat ansteuern kannst bzw. musst?
Oder meinst Du mit "arbeiten", dass Du dies durch 660 Minuten-Impulse bewerkstelligen müsstest? Wie lange benötigst Du für einen solchen MarathonLauf, ohne dass die Uhren anfangen, einzelne MinutenImpulse zu schlabbern?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist ja ein ganz neuer Aspekt. Bisher hiess es ...

Keine Rede davon, dass Du den StundenZeiger separat ansteuern kannst bzw. musst?
Oder meinst Du mit "arbeiten", dass Du dies durch 660 Minuten-Impulse bewerkstelligen müsstest? Wie lange benötigst Du für einen solchen MarathonLauf, ohne dass die Uhren anfangen, einzelne MinutenImpulse zu schlabbern?
Die Stundenzeiger muss ich nicht separat ansteuern, mit denen habe ich im Grunde nichts am Hut.
Genau, mit "arbeiten" meine ich die 660 Minuten-Impulse. Dieser Marathon-Lauf wird vermutlich länger als eine Minute dauern, wodurch sich denke ich die Antwort von alleine ergibt. Danke.
 
Dieser Marathon-Lauf wird vermutlich länger als eine Minute dauern, wodurch sich denke ich die Antwort von alleine ergibt.
Länger als 1 Minute. Das habe ich befürchtet.
Zum Trost: eine (Zeiger-)Uhr, die steht, zeigt zweimal am Tag die richtige Zeit an. Und an dem Tag, an dem sie 1 Stunde zurück gestellt werden muss, sogar dreimal!
Aber dieses "Argument" soll bitte nicht als Rechtfertigung missverstanden werden, die Uhrzeitumstellung nicht abzuschaffen! ;)
Die Zeitumstellung als "ArbeitsBeschaffungsMaßnahme" zu rechtfertigen, finde ich auch nicht wirklich überzeugend.
Ist doch eher eine ProgrammiererKopfschmerzenBeschaffungsMaßnahme.
Also ...
Die EU schafft die Uhrzeitumstellung einfach mal ab - das wird so langsam mal Zeit.
Häwenaissuiikend!
 
Wenn die Uhrzeitumstellung abgeschafft wird, dann muß an vielen vielen Altanlagen die vom jeweiligen Programmierer oft irgendwie mehr schlecht als recht realisierte Uhrzeitumstellung entfernt werden - das wird auch eine Arbeitsbeschaffungsmaßnahme. ;)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und das Schlimmste daran: man kann sich nicht darauf verlassen, dass dieser alte Zopf dann auch abgeschnitten bleibt.
Sooo überwältigend sind die MehrheitsVerhältnisse pro und contra wohl doch nicht, sonst wär's längst passiert ... ;)
 
So, ich habe mein Glück versucht. In der Simulation klappt es recht gut, obwohl der Code mit Sicherheit noch Luft nach oben hat. Falls jemandem mögliche Problematiken, Fehler oder auch Verbesserungen einfallen, bitte ich diese einmal zu äußern. Vielen Dank und beste Grüße :)


//-------------Minutenimpuls an die Uhr--------------


wMin_akt := GVL.stSystemTime.wMinute;

IF (wMin_alt <> wMin_akt) AND (NOT bWinter AND NOT bSummer)
THEN
bClock1 := TRUE;
END_IF

wMin_alt := wMin_akt;

tpDurationSignal(IN := bClock1, PT := T#2S);
IF NOT tpDurationSignal.Q
THEN
bClock1 := FALSE;
END_IF


//-------------Zeitumstellung--------------


// Berechnung des Tages für die Zeitumstellung der Sommerzeit
// Die Berechnung des Datums für die Zeitumstellung des aktuellen Jahres ist Abhängig vom Vorjahr -> "GVL.stSystemTime.wYear -1"

tsTimeChangeSum.wYear := GVL.stSystemTime.wYear;
wDaySum := 31 - (((GVL.stSystemTime.wYear - 1) + 5 +( (GVL.stSystemTime.wYear - 1) / 4 )) MOD 7);
tsTimeChangeSum.wDay := wDaySum;
dtTimeChangeSum := SYSTEMTIME_TO_DT(tsTimeChangeSum);


//Vergleich des Tages der Zeitumstellung mit der Systemzeit
rTSummer(CLK := ((GVL.dtSystemTime >= dtTimeChangeSum) AND (GVL.dtSystemTime < dtTimeChangeSum + T#1S))

IF rTSummer.Q THEN
bSummer := TRUE;
END_IF

// Taktgeber
IF bSummer = TRUE THEN
tonTest1 (IN := NOT tonTest2.Q, PT := T#500MS);
tonTest2 (IN := tonTest1.Q, PT := T#2S);
IF tonTest1.Q = TRUE THEN
bClock2:= TRUE;
ELSE
bClock2 := FALSE;
END_IF
ELSE
bClock2 := FALSE;
END_IF


// Impulse werden im Zeitraum von 157,5 Sekunden (63 Impulse) gesendet // 60 Impulse für das Vorstellen der Uhr + 3 weitere für die Minutenimpulse
tpSummer2min(IN := bSummer, PT := T#157.5S);
IF NOT tpSummer2min.Q
THEN
bSummer := FALSE;
END_IF


// Berechnung des Tages für die Zeitumstellung der Winterzeit
// Die Berechnung des Datums für die Zeitumstellung des aktuellen Jahres ist Abhängig vom Vorjahr -> "GVL.stSystemTime.wYear -1"

tsTimeChangeWin.wYear := GVL.stSystemTime.wYear;
wDayWin := 31 - (((GVL.stSystemTime.wYear - 1) + 2 +( (GVL.stSystemTime.wYear - 1) / 4 )) MOD 7);
tsTimeChangeWin.wDay := wDayWin;
dtTimeChangeWin := SYSTEMTIME_TO_DT(tsTimeChangeWin);


// Vergleich des Tages der Zeitumstellung mit der Systemzeit
rTWinter(CLK := ((GVL.dtSystemTime >= dtTimeChangeWin) AND (GVL.dtSystemTime < dtTimeChangeWin + T#1S))
IF rTWinter.Q THEN
bWinter := TRUE;
END_IF

// Der Impuls "bClock" wird für eine Stunde unterdrückt -> siehe oben: "AND NOT bWinter"
tpWinter1h(IN := bWinter, PT := T#61M);
IF NOT tpWinter1h.Q
THEN
bWinter := FALSE;
END_IF

bClock := bClock1 OR bClock2;
 
Zurück
Oben