# Schrittrelais mit Logo



## Taschenklemme (28 Januar 2012)

Hallo,

ich habe nach langer Abstinenz mal wieder etwas mit einer Logo probiert und wollte ein Schrittrelais programmieren.
Das hat auch geklappt, aber meine Lösung kommt mir sehr kompliziert vor.

Ist es richtig, dass ein Schrittrelais nur mit relativ viel Aufwand zu programmieren ist?


Im konkreten Fall wollte ich eine Rollladensteuerung mit Selbsthaltung mit zwei Tastern realisieren.
Beispiel:
Taster auf kurz gedrückt -> Rollos fahren 1 Minute lang auf
Taster ab innerhalb der Minute kurz gedrückt -> Rollos stoppen
Taster ab nochmal gedrückt -> Rollos fahren 1. Minute lang runter
Taster auf innerhalb der Minute gedrückt -> Rollos stoppen

Um das zu programmieren, habe ich 10 Bauteile benötigt. Das kommt mir recht viel vor und ich vermute, dass ich so keine 8 Rollläden programmiert bekäme und für Extras wäre auch kein Platz mehr.


----------



## 190B (28 Januar 2012)

Kommt ganz darauf an, welche LOGO Du hast. Ab der 4er Version hast Du mind. 130 Funktionsblöcke zur Verfügung, das müsste doch reichen.


----------



## 190B (28 Januar 2012)

Habe mal was gebastelt, brauche pro Rollo nur 6 Funktionsblöcke.


----------



## hucki (28 Januar 2012)

190B schrieb:


> Habe mal was gebastelt, brauche pro Rollo nur 6 Funktionsblöcke.





Taschenklemme schrieb:


> ...
> Im konkreten Fall wollte ich eine Rollladensteuerung mit Selbsthaltung mit zwei Tastern realisieren.
> Beispiel:
> Taster auf kurz gedrückt -> Rollos fahren 1 Minute lang auf
> ...


Ist 'ne Möglichkeit, aber die Vorgabe wird nicht ganz erfüllt (Stoptasten vertauscht)!


----------



## hucki (28 Januar 2012)

Hab's mal umgebaut:
[EDIT]
Noch etwas einfacher mit STOP bzw. ohne Anlauf bei Betätigung beider Tasten:





[EDIT2]
Variante ohne Nachtriggerung bei erneutem Druck auf die Taste:


----------



## 190B (28 Januar 2012)

hucki schrieb:


> Ist 'ne Möglichkeit, aber die Vorgabe wird nicht ganz erfüllt (Stoptasten vertauscht)!



Stimmt, hatte ich glatt überlesen.

@ Hucki:

Bei Deiner Schaltung ist es aber möglich, die laufende Zeit einer Richtung durch erneutes Tasten der gleichen Richtung Zeit nach zu starten, während sie noch läuft.

Darum mein Vorschlag:


----------



## hucki (28 Januar 2012)

War mir auch aufgefallen, deswegen die 2. (eigentlich 4.) Variante.

Und zum Resetten der Timer nicht die Flanke nehmen, sonst startet die andere Seite, wenn beide Taster gedrückt werden, aber nur einer kurz wieder losgelassen und neu gedrückt wird, obwohl die Gegenseite noch gedrückt ist. (Deswegen schon 4.Variante bei mir)
Und STOP sollte ja immer Vorrang haben.


----------



## Taschenklemme (28 Januar 2012)

Erstmal vielen Dank für die ganzen Lösungsvorschläge. Super!

Ich habe eine 0BA5. Ich war bisher davon ausgegangen, dass diese 50 Funktionsblöcke erlaubt.
Bei 130 sieht es schon besser aus.
Im Moment möchte ich erst mal die Grundfunktion realisieren, aber später möchte ich von jedem Taster aus über Tastcodes alle Rollläden rauf- und runterfahren können und ich möchte jeden Rollladen in eine bestimmte, gespeicherte, zeitgesteuerte Position fahren können. Also z.B. 1min nach unten und danach 10s nach oben, damit man die Dinger etwa 10cm offen stehen hat.

Ob das dann alles reinpasst, bezweifle ich noch. Bis heute Mittag hätte ich klar gesagt, dass es nicht geht 


Meine Lösung sah bisher so aus:






Da ist bisher nur der obere Taster so ausgestattet, dass er die andere Richtung stoppt und nicht mit der gleichen Flanke nach oben fährt.

Dass man bei den UND-Bausteinen die Eingänge negieren kann, wusste ich nicht. So kann man natürlich wertvollen Platz sparen 



Bei den derzeit hier verbauten Tastern kann man nicht beide Tasten gleichzeitig drücken. Die Taster und die Kontakte sind mechanisch gegeneinander verriegelt.


----------



## 190B (29 Januar 2012)

Falls Dir der Funktionsumfang der 5er Version noch nicht bekannt ist:


```
Bekannte Blöcke:
Konstanten/Klemmen: Eingang,Cursortaste,Schieberegisterbit,Analogeingang,Ausgang,Analogausgang,Offene Klemme,Merker,Analoger Merker,Zustand 1 (high),Zustand 0 (low)
Grundfunktionen: AND,AND (Flanke),NAND,NAND (Flanke),OR,NOR,XOR,NOT
Sonderfunktionen: Einschaltverzögerung,Ausschaltverzögerung,Ein-/Ausschaltverzögerung,Analogverstärker,Analogwertüberwachung,Schieberegister,PI-Regler,Analog-MUX,Analogrampe,Speichernde Einschaltverzögerung,Selbsthalterelais,Stromstoßrelais,Wischrelais/Impulsausgabe,Wischrelais, flankengetriggert,Wochenschaltuhr,Jahresschaltuhr,Vor-/Rückwärtszähler,Betriebsstundenzähler,Impulsgeber,Zufallsgenerator,Schwellwertschalter,Analoger Schwellwertschalter,Analoger Differenz-Schwellwertschalter,Analogkomparator,Treppenlichtschalter,Komfortschalter,Meldetext,Softwareschalter
Maximale Resourcen:
Funktionsblöcke 130
REM 60
Digitaleingänge 24
Digitalausgänge 16
Merker 24
Analogeingänge 8
Textbox 10
Analogausgänge 2
Programmzeilenspeicher 2000
Blocknamen 64
Analoge Merker 6
Cursortasten 4
Schieberegister 1
Schieberegisterbits 8
Offene Klemme 16
```


----------



## Taschenklemme (29 Januar 2012)

Danke für die Info.
Diese Liste habe ich heute auch zufällig beim Spielen mit der Software gefunden.

Ich dachte, dass man schon im Programm irgendwo einstellen können sollte, welche Logo später verwendet wird.


----------



## 190B (29 Januar 2012)

Das kann man auch.


----------



## Taschenklemme (31 Januar 2012)

Sauber! Danke.


----------



## Taschenklemme (31 März 2012)

Hallo nochmal,

nachdem ich die Logo denn nun auch wirklich mal einsetzen wollte (bin bisher nicht dazu gekommen  ),
habe ich mich nochmal davor gesetzt und wollte das Programm auch richtig verstehen.
Huckis Lösung funktionierte ja soweit einwandfrei, aber mir gefällt es nicht, dass man zum Verständnis des Programms genau nachvollziehen muss, was in einem und dann im nächsten Zyklus genau passiert.

Ich habe mir deswegen eine Lösung mit einer definierten Zeitsperre gebaut. Diese Zeit muss gewartet werden, bevor man einen Motor erneut starten kann. Anhalten geht natürlich sofort. So ist sichergestellt, dass Motoren immer eine Mindestpause haben, bevor sie erneut anlaufen. Das dürfte sowohl den Motoren, als auch den Kontakten gut tun.

Insgesamt brauche ich nicht mehr Funktionsbausteine.

Das Ganze sieht dann für einen Rollladen so aus:




Statt des einfachen Rückfallverzögerungsrelais habe ich das flankengesteuerte Wischrelais genommen.

Die Schaltung lässt auch kein Nachtriggern zu, wobei mich das nicht gestört hätte.


----------



## hucki (31 März 2012)

Taschenklemme schrieb:


> ...
> Diese Zeit muss gewartet werden, bevor man einen Motor erneut starten kann. Anhalten geht natürlich sofort. So ist sichergestellt, dass Motoren immer eine Mindestpause haben, bevor sie erneut anlaufen. Das dürfte sowohl den Motoren, als auch den Kontakten gut tun.
> ...


Hast Du dran gedacht, was passiert, wenn versehentlich die falsche Richtung gedrückt wird oder der Rolladen weiter fährt als er soll, z.B. wenn Du wegen Sonne nur etwas abdunkeln willst. Dann musst Du 2min warten, bevor Du die Gegenrichtung ansteuern kannst!
Mich würde das stören.
Selbst wenn Du 10x hoch und runter fährst, dürfte der Motor hinterher wieder genug Ruhe bekommen, um sich zu erholen (ich glaub' auch nicht, daß die Motoren damit so riesig belastet wären, ansonsten sind diese viel zu klein gewählt).


PS: Wenn Deine Lösung so (ohne die Flanken) funktioniert, würdest Du ohne den Ruhetimer sogar mit 4 Bausteinen auskommen. Die beiden Ausgänge kannst Du auch ohne das ODER direkt auf die beiden UNDs geben, da sind ja noch Eingänge frei. Damit reichst Du dann nochmal 'ne ganze Ecke weiter.


----------



## Taschenklemme (31 März 2012)

Die Zeitsperre beträgt im Beispiel 2s, nicht 2mins.
Die 2s sind jetzt auch nur zum Ausprobieren eingegeben. In der Praxis soll das auf 1s oder 0,5s gesenkt werden. Der Hersteller gibt mindestens 0,2s vor.

Sinn der Sache ist, dass man die Rollladen nicht beliebig schnell hin und her schalten kann. Der Motor hat einen Kondensator, der sich erst entladen soll. Außerdem soll der Motor stehen, bevor er wieder Spannung bekommt, damit die Relaiskontakte nicht auch noch gegen die induzierte Spannung schalten müssen.

Laut Anleitung dürfen die Motoren nur 180s am Stück unter Spannung stehen und maximal 4mins laufen.
Was damit genau gemeint ist, weiß ich nicht, denn ich finde keine Angabe der vorgeschriebenen Ruhezeit.


Wenn ich die Ausgänge ohne die Zeitverzögerung auf die Oder-Glieder gebe, dann kann ich die Motoren nicht mehr anhalten und sie fahren sofort in die entgegengesetzte Richtung.
Es ist ja so gedacht, dass ich mit dem Druck auf die entgegengesetzte Richtung die Motoren anhalte und die erst mit erneutem Druck auf eine Taste wieder anfahren.


Die Sache mit der Logo wird aber vermutlich nur eine Übergangslösung sein. Ich finde die Programmierung ziemlich kompliziert. Ich komme damit zumindest nicht gut zurecht. 
Ich habe ein bisschen mit S7-200 gemacht und das fällt mir wesentlich leichter. Damit traue ich mir eher zu, auch etwas umfangreichere Sachen einzubauen, ohne dabei den Überblick zu verlieren.


----------



## hucki (31 März 2012)

Taschenklemme schrieb:


> Die Zeitsperre beträgt im Beispiel 2s, nicht 2mins.
> ...


Oh sorry, falsch gelesen. 




Taschenklemme schrieb:


> ...
> Die Sache mit der Logo wird aber vermutlich nur eine Übergangslösung sein. Ich finde die Programmierung ziemlich kompliziert. Ich komme damit zumindest nicht gut zurecht.
> Ich habe ein bisschen mit S7-200 gemacht und das fällt mir wesentlich leichter. Damit traue ich mir eher zu, auch etwas umfangreichere Sachen einzubauen, ohne dabei den Überblick zu verlieren.


Da kann ich Dich nur dazu ermutigen. Damit kannst Du sicher auch "einfacher" Deine gewünschten Tastencodes programmieren.
Außerdem kannst Du ein Unterprogramm (SBR) für einen Rollladen proggen und den dann für alle Rollläden wiederverwenden.


----------



## Taschenklemme (31 März 2012)

Unterprogramme in der S7-200 würde ich der Übersicht wegen sehr gerne verwenden. Allerdings habe ich damit noch nie etwas gemacht und habe auch noch keine Anleitung dazu gefunden.
Außerdem habe ich mehrfach gelesen, dass man bei Flankenauswertungen Probleme bekommen kann, und dass es nicht ganz trivial ist, wie die Variablen abgelegt werden.
Ich habe hier im Forum zwar ein Beispielprogramm gefunden, was sogar von dir sein könnte , aber da blick ich ohne Anleitung nicht durch.

Also im Zweifelsfall mache ich das ohne Unterprogramm. Dann bin ich mir sicher, dass ich es hinbekomme


----------



## hucki (31 März 2012)

Ja, Flanken mußt Du entweder außen an die SBR legen oder in der SBR selbst programmieren und über eine IN/OUT-Variable nach außen führen. Ist aber leichter als es im Moment gerade klingt.

Und ja, ich hatte hier mal sowas gemacht (ich nutze sowas gern zum Üben). Allerdings waren die Vorgaben etwas anders.
Aber das war 'ne gute Übung für mehrfach verwendete SBRs mit folgendem Prinzip: 
Jeder Rollladen hat zwei Richtungen, die aber von der grundlegenden Programmierung her gleich sind - also eine SBR, pro Rolladen 2x verwendet.
Alle Rolläden sind gleich -> also die SBR, in der die zwei Richtungs-SBRs stecken, immer wieder verwenden. nur jeweils die Außenbelegung der SBR ändern

Das Problem in solchen SBRs sind Timer, deshalb hab' ich von außen einen Takt angelegt und in den SBRs manuell gezählt.
In den "größeren" CPUen (z.B. S7-224XP)  gibt's aber auch noch andere Timer, die man auch in mehrfach verwendeten SBRs benutzen kann.
Eine noch andere Möglichkeit wäre die Systemzeit (die diese Timer verwenden) selbst auszulesen.


Aber auf jeden Fall wird Dir bei Problemen hier sicher geholfen.


PS: Falls es noch interessiert, das war der Thread, mit dem's begann: S7-200-Rolladensteuerung-mit-Tip-Automatik und hier wurde es fortgesetzt: S7-200-Zeiten-und-Timer-in-Unterprogrammen. Da kannte ich aber die Möglichkeiten mit den Timern BGN-ITIME und CAL-ITIME noch nicht. Heute würde ich das wahrscheinlich etwas anders lösen.


----------



## Taschenklemme (31 März 2012)

Dass das in einem anderen Thread weiter gegangen ist, hatte ich noch nicht gesehen. (EDIT: Hab ich mir gerade mal durchgelesen)

Mein Problem mit SBRs ist, dass ich überhaupt nicht weiß, worauf es da ankommt, wie man Parameter übergibt, wie die Syntax und die Bezeichnungen aussehen.
Das, was ich in deinem Rollo-Programm gesehen habe, reicht nicht, um das Prinzip zu verstehen.
Z.B. verwendest du da absolute Adresse für eine Richtung. Wenn man die Richtung nun mehrmals und zeitlich überlappend aufruft/benutzt, werden die Werte in diesen absoluten Speicheradressen dann nicht überschrieben?

Ich habe bisher nur etwas in Pascal, also keinem Echtzeit-, oder Multitaskingsystem, mit Unterprogrammen programmiert. Da war das alles eindimensional und leichter zu überblicken. 

Ich habe hier eine S7-226. Ob die solche besonderen Timer hat, weiß ich nicht. Ich würde sowas aber lieber nicht verwenden, denn wenn man mal Ersatz braucht, dann habe ich lieber ein Programm, was auf möglichst vielen CPUs laufen kann.



Die Rollosteuerung mit einer S7-200 für ein Rollo habe ich schon fertig. Ist ja auch nicht viel. Normalerweise würde ich das nun kopieren und für jedes Rollo kopieren und mit neuen Adressen versehen. Das wird dann natürlich umfangreich, aber es wäre für mich einfach und es wäre leichter, Ausnahmen einzufügen.
Aber ich würde auch sehr gerne deine Version verstehen. Vielleicht bietet die ja viel mehr Vorteile, als ich es mir im Moment vorstelle.


----------



## hucki (31 März 2012)

Taschenklemme schrieb:


> ...
> Die Rollosteuerung mit einer S7-200 für ein Rollo habe ich schon fertig. Ist ja auch nicht viel. Normalerweise würde ich das nun kopieren und für jedes Rollo kopieren und mit neuen Adressen versehen. Das wird dann natürlich umfangreich, aber es wäre für mich einfach und es wäre leichter, Ausnahmen einzufügen.
> Aber ich würde auch sehr gerne deine Version verstehen. Vielleicht bietet die ja viel mehr Vorteile, als ich es mir im Moment vorstelle.


So hab' ich auch angefangen und find' das auch gut, um erst mal die Grundlagen zu begreifen.

Das Problem dabei ist, wenn Dir mal was missfällt und Du das änderst, dann mußt Du es x-mal ändern. Und da ist schnell mal was übersehen.

Mit der SBR ist eigentlich relativ simpel:
Du hast jetzt einen Rolladen erstellt. Das alles verschiebst Du vom OB1 in eine SBR und rufst diese vom OB1 auf. Damit ist bis jetzt alles gleich, außer daß der Code in der SBR steht.
Was muß nun angepasst werden, damit man die SBR mehrfach verwenden kann - die absoluten Adressen.
Dafür gibt es oberhalb vom Code Ein-, Aus-, Ein-/Ausgänge und temporäre Variablen (die Schnittstelle der SBR; lokale Variablen; die Namen/symbolischen Bezeichnungen haben im Programm ein # am Anfang; die Adressen beginnen mit L...). Die Ein- und Ausgänge erscheinen dann (z.B. im OB1) beim Aufruf der SBR, wo Du sie wieder mit den vorher verwendeten absoluten Adressen belegst. Also z.B. beim ersten Aufruf ist in der SBR der Eingang #IN1 von außen mit E0.0 belegst, beim zweiten Aufruf aber mit E0.2. Damit sagst Du also der SBR extern welche Adressen sie in Wahrheit verwenden soll, ohne sie intern hineinzuschreiben.

Das Problem bei der kleinen S7-200 ist halt, das dieses Prinzip nicht mit Timern und Zählern funktioniert, da man einfach der SBR nicht sagen kann, benutze beim ersten Aufruf Timer T1 und beim zweiten Aufruf T2 (bei Zählern ist es analog). Die "großen" S7-300/400 können das. Deshalb muß man da etwas "tricksen" und das selber programmieren. Zähler sind dabei relativ einfach, denn die sind meist bloß 'ne Addition von +1. Bei Timern muß man halt auf die Systemzeit zurückgreifen und entsprechend vergleichen. Ich glaube die letzten S7-22x können das alle mit den oben genannten internen Funktionen. Du kannst ja mal in Microwin die einzelnen CPU-Typen einstellen und dann im Ordnerbaum unter Timern nachsehen, welche Timerarten dann noch verfügbar sind.
PS1: Wie gesagt, kannte ich damals die beiden xxx-ITIME-Funktionen noch nicht, deshalb sind in dem Programm im 2. verlinkten Thread die Timer für die Motorverriegelungen noch außerhalb der mehrfach verwendeten Rolladen-SBR. War halt auch 'ne Lösung.

Eine Alternative wäre vlt. die neuere S7-1200, die ist den "großen" S7-300/400 ähnlicher. Die "alte" S7-200 ist eh' nur noch als Ersatzteil die nächsten 8 Jahre lieferbar.


PS2: Wenn Du einen Rolladen nach Deinen Vorstellungen programmiert hast und das Ganze hier posten würdest, helfen wir Dir gern, das mehrfach verwendbar zu machen.


----------



## hucki (1 April 2012)

Hab' Dir mal eine SBR rausgesucht, die einen mehrfach verwendbaren Timer mit Einschaltverzögerung darstellt:

```
[FONT=courier new]SUBROUTINE_BLOCK SBR_TON:SBR61
TITLE=Mehrfach verwendbarer Timer mit Einschaltverzögerung (TON)

VAR_INPUT
Start:BOOL;    // L0.0
PT:INT;    // LW1, in ms
END_VAR

VAR_IN_OUT
Memory:DINT;    // LD3
END_VAR

VAR_OUTPUT
Ausgang:BOOL;    // L7.0
CV:INT;    // LW8
END_VAR

VAR
Diff:DINT;    // LD10
END_VAR


BEGIN

Network 1 // Start = Low
// Bei inaktivem Start-Eingang den Speicher mit 0 beschreiben
LDN    L0.0
UD<>   LD3, 0
MOVD   0, LD3

Network 2 // Start = High
// Bei Aktivierung des Start-Eingang den Speicher mit der aktuellen Systemzeit beschreiben.
LD     L0.0
UD=    LD3, 0
BITIM  LD3

Network 3 // Gespeicherte Zeit erkennbar machen
// Ist die so gespeicherte Systemzeit zufällig gerade = 0, dann im Speicher um 1 ms erhöhen, damit die Speicherung erkannt wird
LD     L0.0
UD=    LD3, 0
INCD   LD3

Network 4 // Timerwert
// Ist die gespeicherte Systemzeit <>0, dann mit der aktuellen Systemzeit vergleichen und die Differenz als Timerwert ausgeben
LDD<>  LD3, 0
CITIM  LD3, LD10
UENO
DTI    LD10, LW8

Network 5 // Ausgang
// Das Timerbit setzen, wenn der Timerwert >= dem Vorgabewert.
LD     L0.0
UW>    LW1, 0
UW>=   LW8, LW1
=      L7.0

END_SUBROUTINE_BLOCK[/FONT]
```
Die Funktion ist genauso, wie die systeminterne Funktion TON. Der Unterschied ist, das die Speicherung der Zwischendaten über den Ein-/Ausgang _Memory _in einer selbst gewählten Variable erfolgt (die Ausgänge natürlich auch), anstatt die Systemvariable Tx zu verwenden. Damit kann man die auch mit einer lokalen Variable belegen und so über die Schnittstelle der SBR nach außen weiter geben.

Wenn Du den Code in einer Textdatei mit der Endung .awl speicherst und diese Datei dann in Dein Projekt importierst, kannst Du ja ein bißchen damit herum experimentieren.
Ich hab' extra eine hohe SBR-Nummer gewählt, damit solltest Du keine Probleme mit vlt. schon vorhandenen SBRs bekommen.
Die Ansicht oben ist in AWL. Ich hab' die originalen Netzwerke so umgestaltet/aufgetrennt, dass Du über das Menü Ansicht diese auch auf KOP oder FUP umstellen kannst, je nachdem, was Du bevorzugst.


----------



## hucki (1 April 2012)

*Flanken selbst programmiert*

Hi Taschenklemme,

hier noch die selbstprogrammierten Flanken, die Du vlt. brauchen wirst:

```
[FONT=courier new]Network 1 // Flanke positiv (EU)
[/FONT][FONT=courier new]// Wenn der Eingang #IN HIGH ist und im vorigen Zyklus LOW war, dann Flanke = TRUE[/FONT]
[FONT=courier new]LD     #IN[/FONT]
[FONT=courier new]UN     #Memory[/FONT]
[FONT=courier new]=      #EU[/FONT]
[FONT=courier new]
Network 2 //Flanke negativ (ED)[/FONT]
[FONT=courier new]// Wenn der Eingang #IN LOW ist und im vorigen Zyklus HIGH war, dann Flanke = TRUE[/FONT]
[FONT=courier new]LDN    [/FONT][FONT=courier new]#IN[/FONT]
[FONT=courier new]U      [/FONT][FONT=courier new]#Memory[/FONT]
[FONT=courier new]=      #ED[/FONT]
[FONT=courier new]
Network 3 // Zustand speichern[/FONT]
[FONT=courier new]// Den Zustand von #IN [U]nach[/U] dem Vergleich auf #Memory übertragen[/FONT]
[FONT=courier new]LD     [/FONT][FONT=courier new]#IN[/FONT]
[FONT=courier new]=      [/FONT][FONT=courier new]#Memory[/FONT]
```
Genau wie bei den systeminternen Flanken wird immer der Zustand eines Bits mit dem Zustand des vorigen Zyklus verglichen. Nach dem Vergleich wird dann der Zustand des aktuellen Zyklus für den nächsten Zyklus wieder abgespeichert. Das muss über eine Variable außerhalb der SBR erfolgen, da temporäre lokale Variablen nach Ausführung der SBR (normalerweise) wieder gelöscht werden.
Bei mehrfach verwendeten SBRs macht man dies über IN-/OUT-Variablen außerhalb der SBR.

PS: Systeminterne Flanken sind meines Wissens nach auch auf 256 Stück im Programm begrenzt. Eigene natürlich nicht.


----------



## Taschenklemme (1 April 2012)

Vorweg erstmal vielen Dank für deine Mühe.

Ich habe deine Timer-SBR mal importiert, aber das ist schon schwere Kost 
Ich versuche gerade durch Vergleich und mit deinen Hinweise herauszufinden, was was ist. Mit meiner wenigen Erfahrung ist das nicht so leicht 

In der Hilfe habe ich mir gerade mal die Infos zu Unterprogrammen durchgelesen. 

Damit habe ich nun mal versucht deinen Timer zu verstehen. Bisher meine ich es so verstanden zu haben:

Mit "Start" (Bool) startet man den Timer. Wenn Start = 0, dann wird auch der Timer auf 0 gesetzt. Es ist also kein speichernder Timer.

Mit "PT" (Integer) gibt man den Schwellwert in ms an, ab dem der Ausgang auf 1 schaltet. Ich vermute, den Eingang könnte man auch mit einer Variablen füttern. Wenn ich dort z.B. "M5" angebe, dann bekommt die M5 mit einer grünen Schlange unterlegt. Wenn ich "MW5" angebe, dann gibt es keine Schlange.

In "Memory" (DINT) wird die Startzeit abgelegt, bei der "Start" zuletzt gesetzt worden ist. Ich muss dort also einen Speicherbereich angeben, in dem, dieser Wert global abgelegt wird. Z.B.: "MD3"

"Ausgang" (Bool) wird 1, wenn der Schwellwert erreicht worden ist, sonst 0.

"CV" (Int) ist die Differenz zwischen Systemzeit und Startzeit. Daran kann ich also ablesen, wie lange der Timer schon läuft.


Was mache ich mit "EN"? Ich schätze, das muss ich auf "1" setzen, damit das Unterprogramm aufgerufen wird. Was ist, wenn ich es nicht aufrufe? Die Werte gehen dadurch nicht verloren. Das ergibt wohl nur dann Sinn, wenn man umfangreichere Programme hat und dadurch Rechenzeit einsparen kann.


Insgesamt sieht das für mich nun so aus:
Du hast durch Vergleich mit der Systemzeit einen Timer in einem Unterprogramm gebaut, der die jeweiligen Startzeiten in einem globalen Speicherbereich "rettet", damit man das Unterprogramm mehrmals an unterschiedlichen Stellen aufrufen kann.
Sehe ich es richtig, dass das nur funktioniert, wenn man das Unterprogramm aus dem Hauptprogramm heraus aufruft? Wenn man deinen Timer aus einem Unterprogramm heraus aufruft, müsste dieses Unterprogramm wiederum die Timerwerte an das Hauptprogramm weitergeben, damit die nicht verloren gehen, richtig?


Wenn das wirklich so ist, dann baut man sich auf die Art ein paar Fallstricke ein, wenn man später noch mal etwas an dem Programm ändern möchte.

Wäre es eigentlich sinnvoll im Hauptprogramm Merkerbytes als Zwischenspeicher zu verwenden, oder kann man da auch etwas aus dem L-Bereich nehmen?


----------



## hucki (1 April 2012)

Fast alles richtig erkannt. 





Taschenklemme schrieb:


> ...
> Mit "Start" (Bool) startet man den Timer. Wenn Start = 0, dann wird auch der Timer auf 0 gesetzt. Es ist also kein speichernder Timer.
> ...


Speichernd schon, aber nicht im System, sondern dort wo Du es festlegst. Mit der 0 erkennt das Programm, dass bis dahin noch keine Start-Zeit gespeichert wurde.





Taschenklemme schrieb:


> ...
> Mit "PT" (Integer) gibt man den Schwellwert in ms an, ab dem der Ausgang auf 1 schaltet. Ich vermute, den Eingang könnte man auch mit einer Variablen füttern. Wenn ich dort z.B. "M5" angebe, dann bekommt die M5 mit einer grünen Schlange unterlegt. Wenn ich "MW5" angebe, dann gibt es keine Schlange.
> ...


Der Eingang muß eine Variable vom Typ INTeger sein, genau wie beim systeminternen Timer. Das kann ein fester Wert sein (z.B. 2000), der Wert in einer externen Variablen (z.B. MW.. oder VW...) oder aber wieder eine lokale Variable (#... / LW..).





Taschenklemme schrieb:


> ...
> In "Memory" (DINT) wird die Startzeit abgelegt, bei der "Start" zuletzt gesetzt worden ist. Ich muss dort also einen Speicherbereich angeben, in dem, dieser Wert global abgelegt wird. Z.B.: "MD3"
> ...


Richtig. Hier ist durch die verwendete Funktion BGN_ITIME der Typ auf DINT festgelegt, man braucht also ein Doppelwort.





Taschenklemme schrieb:


> ...
> "Ausgang" (Bool) wird 1, wenn der Schwellwert erreicht worden ist, sonst 0.
> 
> "CV" (Int) ist die Differenz zwischen Systemzeit und Startzeit. Daran kann ich also ablesen, wie lange der Timer schon läuft.
> ...


Wieder richtig!





Taschenklemme schrieb:


> ...
> Was mache ich mit "EN"? Ich schätze, das muss ich auf "1" setzen, damit das Unterprogramm aufgerufen wird. Was ist, wenn ich es nicht aufrufe? Die Werte gehen dadurch nicht verloren. Das ergibt wohl nur dann Sinn, wenn man umfangreichere Programme hat und dadurch Rechenzeit einsparen kann.
> ...


Ja, damit aktiviert/deaktiviert man eine SBR. Ich würde dazu raten, eine SBR in jedem Zyklus auszuführen und innerhalb der SBR zu bestimmen, was wie ausgeführt wird. Man kann die Ausführung auch überspringen, aber oft reagieren dann die Ausgänge nicht so, wie wann's eigentlich erwarten würde. Ich sag' jetzt mal: "Ist was für später, momentan immer Sondermerker SM0.0 (Immer_Ein) anlegen."





Taschenklemme schrieb:


> ...
> Insgesamt sieht das für mich nun so aus:
> Du hast durch Vergleich mit der Systemzeit einen Timer in einem Unterprogramm gebaut, der die jeweiligen Startzeiten in einem globalen Speicherbereich "rettet", damit man das Unterprogramm mehrmals an unterschiedlichen Stellen aufrufen kann.
> Sehe ich es richtig, dass das nur funktioniert, wenn man das Unterprogramm aus dem Hauptprogramm heraus aufruft? Wenn man deinen Timer aus einem Unterprogramm heraus aufruft, müsste dieses Unterprogramm wiederum die Timerwerte an das Hauptprogramm weitergeben, damit die nicht verloren gehen, richtig?
> ...


Jein. Wenn das aufrufende Unterprogramm nur einmal pro Zyklus verwendet wird, kann man natürlich auch absolute Adressen verwenden. So wie T1 eben auch eine absolute Adresse ist.
Der Vorteil ist, wie Du richtig erkannt hast, daß man aber auch lokale Variablen verwenden und die SBR damit mehrmals pro Zyklus benutzen kann, da damit die absolute Adresse wieder außerhalb angegeben wird.





Taschenklemme schrieb:


> ...
> Wenn das wirklich so ist, dann baut man sich auf die Art ein paar Fallstricke ein, wenn man später noch mal etwas an dem Programm ändern möchte.
> ...


Wieder jein. Wichtig ist, seine lokalen Variablen aussagekräftig zu bezeichnen.
Ein normales UND funktioniert im Prinzip genauso. Siemens weiß ja vorher auch nicht, welche Ein- und Ausgänge Du an dieses Gatter legst. Also steht innerhalb des Gatters (SBR) Eingang1 mit Eingang2 als UND zum Ausgang verknüpfen und Du schreibst dann draußen dran, welche Adressen das in Wirklichkeit sind.





Taschenklemme schrieb:


> ...
> Wäre es eigentlich sinnvoll im Hauptprogramm Merkerbytes als Zwischenspeicher zu verwenden, oder kann man da auch etwas aus dem L-Bereich nehmen?


Wie gesagt, für alles, was mehrfach mit verschiedenen Sachen im Zyklus benutzt werden soll, benutzt man lokale Variablen, z.B. die Eingänge für die Taster -> die unterscheiden sich ja von Rollladen zu Rolladen. Die Zeit soll vlt. immer gleich sein, also könnte man die auch über ein Merkerwort übergeben.
PS: In meinen Augen ist es aber eine gute Angewohnheit, innerhalb von SBR's möglichst immer lokale Variablen zu verwenden.


----------



## Taschenklemme (1 April 2012)

hucki schrieb:


> Hi Taschenklemme,
> 
> hier noch die selbstprogrammierten Flanken, die Du vlt. brauchen wirst:



Danke Hucki. Ich komm gar nicht hinterher 

Ich habe es gerade einfach versucht zu importieren, aber dabei bekomme ich einen Parserfehler. 
Ich muss wohl noch die Variablen definieren.

Memory muss wieder In/out werden.
"In" ist eine Eingangsvariable und EU und ED sind die Ausgangsvariablen, die anzeigen, ob eine Flanke aufgetreten ist.
Damit gibt es auch keine Parserfehler mehr 

Also die systeminternen Flanken funktionieren einfacher 
Aber ich steh ja noch ganz am Anfang.


Ist es eigentlich sinnvoll, so etwas Simples, wie die Flankenauswertung als SBR abzulegen? Da man eh für jede Flanke einen eigenen globalen Speicher braucht, könnte man das doch auch gleich komplett im Hauptprogramm programmieren.


----------



## hucki (1 April 2012)

Nein, sowas einfaches würde ich auch nicht als eigene SBR ablegen. Das sollte nur aufzeigen, wie man Flanken selbst programmiert. Ein UND von vorher und jetzt und dann jetzt wieder als vorher abspeichern. Genauso macht es auch das System.


----------

