CoDeSys Timerprobleme

MartinF.

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe folgendes Problem:
Ich bin noch relativ neu bei codesys aber habe davor schon mit Step7 gearbeitet. Ich hab ein kleines Programm geschrieben, das bei einkommenden Eingangssignal nacheinander 7 digitale Ausgänge (bzw die LEDs) aufleuchten lässt. Das ganze hab ich mit Impulstimern gemacht, die nach 500ms den nächsten DO setzen. Nachdem alle 8 Ausgänge gesetzt sind, werden alle Ausgänge zurückgesetzt und das Programm wartet erneut auf ein Eingangssignal. In der ersten Runde läuft das auch alles gut, aber ab der zweiten Runde werden die Timer irgendwie ignoriert und alle Ausgänge werden wie wild gesetzt/zurückgesetzt.
Muss ich irgendwie die Timer zurücksetzten damit sie wieder 500ms warten bevor weitergeschaltet wird?
 
Das würde jetzt, Glaskugelpassiert, darauf schließen lassen, das du die Timer überspringst, sei es in IF/THEN oder den entsprechenden Baustein nicht mehr aufrufst etc.
Was, bei Step7 wie auch bei Codesys zum gleichen ungewünschten Verhalten führt ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um das zu beantworten wäre es schön gut deinen Code zu kennen.
Es führen ja viele Wege nach Rom.
Aber generell gilt ja wenn dein Eingang True ist läuft die Zeit des Timers bis der "Sollwert" erreicht ist. Beim Baustein TON heißt das ET wird solange hochgezählt bis ET=PT.
Wird jetzt warum auch immer ET nicht zurückgesetzt, zB weil dein IN noch immer True ist, so ist dein Ausgang Q beim nächsten Aufruf sofort wieder True.
Aber genauer ist es natürlich wenn dein Code bekannt ist.
 
j9fIblile3FUQAAAABJRU5ErkJggg==

Hab das ganze mit einer Schrittkette gemacht. Könnte mir vorstellen, dass beim Timer der ET Ausgang am Ende auf 500ms bleibt und deswegen der Timer übersprungen wird. Die Frage ist nur wie setze ich die zurück? Hab anscheinend keine Zugriffsrechte
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo MartinF,
ich habe mir diese Aufgabe auch am Anfang mal gestellt als Lernaufgabe.
Ich hatte das dann mittels einer einfachen Bitverschiebung eines bytes gemacht.
Pro Takt des Timers ein Bit nach links schieben.
Wenn man bei 7 "Schiebereien" angekommen ist, Neustart / Warten auf Auslöser.
Ist eigentlich sehr klein das ganze, nur die Zuweisungen auf die Ausgänge sind halt "einzeln".

Nur ne Idee.
LG
Shrimps
 
Lass uns doch mal einen Blick auf deinen Code werfen. Aber richtig ist das du aussen nicht ET einfach auf Null setzten kannst.
Wie wäre ein Schritt bei der Initalisierung alle IN:=FALSE. Dann müsste der ET auch Null werden.
 
Mein Code

Timer.PNG
Hab das ganze halt als Schrittkette gemacht. Selbst wenn man das anderslösen könnte (Bitschupserei) würde ich gerne wissen warum es so nicht geht
 
Hab ich schon probiert. Selbst wenn im ersten Schritt der Eingang erst mal null bleibt, hab ich trotzdem das gleiche Problem wieder sobald der Eingang 1 wird.
 
Nicht alleine den Eingang auf null.
Wirklich den Timer, z.B Timer1(In:=False, PT:=T#500ms); aufrufen. Dann wird ja ET auf null gesetzt.
Oder was passiert in dem Fall ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Im Prinzip brauchst du nur einen Timer für die Schrittkette. Anders als bei FUP Schrittketten wird in AS immer nur der aktive Schritt abgearbeitet.

Mein Lösungsvorschlag:

Nutze die Eingangs- und Ausgangsaktionen der Schritte. Die Eingangsaktion wird nur einmal beim Einsprung in den Schritt ausgeführt und die Ausgangsaktion nur wenn der Schritt verlassen wird. Die Aktionen solltest du mit Rechtsklick auf einen Schritt hinzufügen können.

Im Init Schritt setzt du alle A0 - A7 auf false. Mit Eingang startest du in den ersten Schritt. In der "Haupt" - Aktion des Schritts läuft nur dein Timer. Den IN Eingang kannst du auf TRUE setzten. Die Transitionsbedingung zum nächsten Schritt ist Timer.Q. Also wenn der Timer abgelaufen ist.
Jetzt brauchst du noch eine Ausgangsaktion. In der rufst du den Timer mit IN := FALSE auf um ihn zurück zu setzten. (Kannst du auch in der Eingangsaktion des folgenden Schrittes machen) und du setzt A0 auf TRUE.
Im nächsten Schritt machst du genau das gleiche, ausser das du im Ausgang dann A1 auf TRUE setzt.

Nach dem letzten Schritt in der Kette (wo A7 gesetzt wird) brauchst du noch einen Dummy Schritt, der einfach nur die 500ms abwartet, bevor er nach INIT zurück springt, wo alle As resettet werden.


Ich hoffe das ist so halbwegs verständlich.
 
Zurück
Oben