# Ablauf in CodeSys funktioniert nicht....



## Andy082 (7 April 2010)

Abend.

Bin gerade dabei in CodeSys mit AWL meine ersten größeren Schritte zu tun und würde mir gerne einen Ablauf zur Steuerung meiner Rollläden schnitzen.

Dazu gibt es die Bits E_up und E_down mit welchen der Ablauf entsprechend angesteuert wird und A_up und A_down, mit welchen ich die Ansteuerung der Jalousie übernehme.

Vorgestellt hätte ich mir den Ablauf so:

Taste <2Sek. drücken, Motor setzt sich kurz (für die Dauer des Tastendrucks) in Bewegung;
Taste >2Sek. drücken, Motor bewegt sich für 30Sek. jeweils nach oben oder unten; Ist diese Bewegung aktiv, so kann diese anhand einer neuerlichen Betätigung einer der beiden E_up oder E_down gestopt werden.
So weit so gut, bis hier her funktioniert das Ganze mal.
Nur ist der Motor in Bewegung und ich drücke die entgegengesetzte Ansteuerung, so setzt sich dieser nach 500ms sofort wieder in diese Richtung in Bewegung, was ja eigentlich erst bei einem neuerlichen Tastendruck passieren sollte.

Später kommt noch eine Gruppensteuerung hinzu (Taste binnen 1 Sek. 2x drücken und alle Rollläden der Gruppe schliessen oder öffnen sich), aber dies nehme ich erst in Angriff, wenn auch der restliche Ablauf 100%ig passt.

Muss leider zugeben, dass ich seitens S7 etwas zu sehr verwöhnt bin um meinen Fehler hier selbst zu entdecken.


```
VAR
 TON_E_up:TON;
 TON_E_down: TON;
 TON_A_up:TON;
 TON_A_down: TON;
 TOF_A_up: TOF;
 TOF_A_down: TOF;
 FP_TON_up: R_TRIG;
 FP_TON_down: R_TRIG;
 FP_E_up: R_TRIG;
 FP_E_down: R_TRIG;
 FN_E_up: F_TRIG;
 FN_E_down: F_TRIG;
 active: BOOL;
 enable_up:BOOL;
 enable_down:BOOL;
END_VAR
VAR_INPUT
 E_up:BOOL;
 E_down:BOOL;
 delay_signal: TIME;
 delay_move:TIME;
END_VAR
VAR_OUTPUT
 A_up:BOOL;
 A_down:BOOL;
END_VAR
 
 
 (*define inputs, create triggers*)
 CAL  FP_E_up(CLK:= E_up)
 CAL  FN_E_up(CLK:= E_up)
 CAL  FP_E_down(CLK:= E_down)
 CAL  FN_E_down(CLK:= E_down)
 
 (*handling input to move shutter upwards*)
 LD  E_up
 ST  enable_up
 CAL  TON_E_up(in:= enable_up, PT:= delay_signal)
 CAL  FP_TON_up(CLK:= TON_E_up.Q)
 LD  FP_TON_up.Q
 JMPCN no_delay_up
 LD  delay_move
 ST  TOF_A_up.PT
no_delay_up:
 CAL  TOF_A_up(in:= FP_TON_up.Q)
 
 (*handling input to move shutter downwards*)
 LD  E_down
 ST  enable_down
 CAL  TON_E_down(in:= enable_down, PT:= delay_signal)
 CAL  FP_TON_down(CLK:= TON_E_down.Q)
 LD  FP_TON_down.Q
 JMPCN no_delay_down
 LD  delay_move
 ST  TOF_A_down.PT
no_delay_down:
 CAL  TOF_A_down(in:= FP_TON_down.Q)
 
 (*stop shutters movement*)
 LD  FP_E_up.Q
 OR  FP_E_down.Q
 JMPCN no_stop
 LD  t#0s
 ST  TOF_A_up.PT
 ST  TOF_A_down.PT
no_stop:
 
 (*move shutter up/down*)
 CAL  TON_A_up(PT:=T#500ms)
 CAL  TON_A_down(PT:=T#500ms)
 LDN  A_down
 AND  ( enable_up
 OR  TOF_A_up.Q
 )
 ST  TON_A_up.IN
 LDN  A_up
 AND  ( enable_down
 OR  TOF_A_down.Q
 )
 ST  TON_A_down.IN
 LD  TON_A_up.Q
 ST  A_up
 LD  TON_A_down.Q
 ST  A_down
```
 

Danke!

Andreas


P.S.: wo gibt's Infos zu AWL in CodeSys (ausgenommen die Hilfedatei) um sich etwas besser einzuarbeiten?


----------



## RobiHerb (8 April 2010)

*St*

Wenn man ein neues System kennenlernt, sollte man sich auch überlegen, ob es nicht sinnvoll ist, jetzt von der veralteten AWL loszukommen.

Ich würde hier raten, das modernere ST zu verwenden. So wie angedeutet (Rolladen) besteht ja kein Risiko, mit einer neuen Umgebung grösseren Schaden anzurichten. Also Mut und mal was Neues wagen, es lohnt sich bestimmt. Die Sache wird mit ST übersichtlicher und, wenn man es erst einmal drauf hat, auch prinzipiell im Betrieb sicherer.

Als Einführung und Anleitung: SPS Programmierung nach IEC 61131-3 aus dem Franzis Verlag


----------



## ybbs (8 April 2010)

Andy082 schrieb:


> Nur ist der Motor in Bewegung und ich drücke die entgegengesetzte Ansteuerung, so setzt sich dieser nach 500ms sofort wieder in diese Richtung in Bewegung, was ja eigentlich erst bei einem neuerlichen Tastendruck passieren sollte.



Nachfolgend habe ich in deinem Code mal farbig gekennzeichnet warum das so ist.


```
(*handling input to move shutter downwards*)
[COLOR="Red"] LD  E_down      (* Hier speicherst Du den Eingang *)
 ST  enable_down[/COLOR]
 CAL  TON_E_down(in:= enable_down, PT:= delay_signal)
 CAL  FP_TON_down(CLK:= TON_E_down.Q)
 LD  FP_TON_down.Q
 JMPCN no_delay_down
 LD  delay_move
 ST  TOF_A_down.PT
no_delay_down:
 CAL  TOF_A_down(in:= FP_TON_down.Q)
 
 (*stop shutters movement*)
 LD  FP_E_up.Q
 OR  FP_E_down.Q
 JMPCN no_stop
 LD  t#0s
[COLOR="#ff0000"] ST  TOF_A_up.PT   (* Hier stoppst Du den Motor quasi *)[/COLOR]
 ST  TOF_A_down.PT
no_stop:
 
 (*move shutter up/down*)
 CAL  TON_A_up(PT:=T#500ms)
 CAL  TON_A_down(PT:=T#500ms)
[COLOR="#ff0000"] LDN  A_down     (* Da der TOF oben gelöscht wurde, wird unmittelbar darauf der Ausgang rückgesetzt *)[/COLOR]
[COLOR="#ff0000"] AND  ( enable_up     (* D.h. wenn der Eingang betätigt ist .... *)[/COLOR]
 OR  TOF_A_up.Q
 )
[COLOR="#ff0000"] ST  TON_A_up.IN     (* Startest Du den TON *)[/COLOR]
 LDN  A_up
 AND  ( enable_down
 OR  TOF_A_down.Q
 )
[COLOR="#ff0000"] ST  TON_A_down.IN
 LD  TON_A_up.Q
 ST  A_up      (* Wenn die 500ms abgelaufen sind fährt der Motor (wieder) wenn die Taste (z.B. zum Stoppen) länger als 500ms betätigt wurde *)[/COLOR] 
 LD  TON_A_down.Q
 ST  A_down
```

Ich hoffe es ist einigermaßen verständlich.


Allerdings würde ich Dir auch raten, Dir den Strukturierten Text anzusehen. Es ist nicht so schwierig zu lernen und wesentlich übersichtlicher als AWL.


----------

