Anfängerproblem: Kann Digital Output nicht togglen

Olle

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


ich habe eine Wago SPS (750-881) mit der ich zunächst nicht mehr machen möchte als digitale Ausgänge (750-530) zu togglen.
Dazu benutze ich Codesys und möchte das Programm in ST schreiben.


Der momentane Versuch sieht so aus (DO1_CH1 ist der Output):
Code:
IF help = TRUE
THEN
    TOFInst(IN:=NOT(help),PT:=T#2s);
    help := TOFInst.Q;
ELSE
    TONInst(IN:=NOT(help), PT:=T#3s);
    help := TONInst.Q;
END_IF;


DO1_CH1 := help;

Der Simulator bzw. die Überwachung sagt mir dabei, dass der Ausgang wohl toggled, jedoch nicht mit den gewünschten Verzögerungen. Wie kann ich ihn dazu zwingen, dass das Programm erst weiter ausgeführt wird, wenn der Timer ready ist?
Zunächst hatte ich das ganze ohne die "help" Variable, aber dann funktioniert es garnicht. Ist das eine Art Fehlerprävention, dass auf die Outputs nur einmal im Programm zugegriffen werden darf und wenn ja, kann man das umgehen?


Ein weiteres Problem ist, dass das Tracken der Variablen nach x Fehlversuchen nicht mehr funktioniert. Dann werden die Breakpoints, die ich im Programm setze auch nie erreicht. Erst durch einen Rechner Neustart konnte ich das beheben. Weder ein Codesys Neustart noch ein Reset der SPS haben da geholfen...
 
Hallo Olle,
man sollte niemals einen Timer in eine Bedingung setzen...

Baue dein Proggie doch mal einfach um:
Mit deinem Help setze eine Zeitvariable entweder auf 2 oder x sekunden.
Dann immer den ton mit den parametern aufrufen !!!
Anschl. den Ausgang einmal übernehmen.

Wird dann übersichtlicher und wird funktionieren...

LG
Shrimps

PS: Ich habe mir zum Lernen diverse Blinker aus dem I-Net gezogen und umgebaut (OSCAT etc)

Anbei ein kleines Beispiel:
Code:
PROGRAM MAIN
VAR
    Timer : TON;                (* Damit wir alles realisiert *)
    PTH : TIME := t#5s;            (* Arbeitstakt *)
    PTL : TIME := t#2s;            (* Pausentakt *)
    Q     : BOOL;                    (* Ist solange High wie PTH *)
END_VAR

Timer(in := NOT timer.Q);    (* Immer wieder starten *)

IF Q THEN            (* Ist TON abgelaufen ? *)
    timer.PT := pth;    (* Dann auf 1.Zeit setzen *)
ELSE
    timer.PT := ptl;        (* Ansonsten auf die 2.te Zeit setzen *)
END_IF

q := q XOR timer.Q;            (* Zustand nur bei Änderung wechseln *)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Braucht man das if -Gedöns?Ist jetzt SCL S7.

FUNCTION_BLOCK FB401

VAR_INPUT

#T1 : TIME; // Toggeln Timer 1
#T2 : TIME; // Toggeln Timer 2

END_VAR

VAR_OUTPUT
Toggle_Bit: BOOL; // Ausgang Toggeln
END_VAR

VAR_TEMP

END_VAR

VAR
sTIMER1 : TON; // Timer1 Bit Toggeln
sTIMER2 : TON; // Timer2 Bit Toggeln
END_VAR

BEGIN


sTIMER2(IN:=NOT sTIMER1.Q, PT:=#T2);
sTIMER1(IN:=sTIMER2.Q, PT:=#T1);


Toggle_Bit:=sTIMER2.Q;

END_FUNCTION_BLOCK
 
Das IF-Gedöns ist genauso wertvoll wie 2 TON Instanzen ...
Da der TE Augenscheinlich Anfänger und daher habe ich auf einen FB verzichtet, da unklar ist ob er überhaupt weiß wie man einen FB einsetzt!
LG Shrimps
Btw: Es gibt noch sehr viele Varianten des Blinkers, u.a. ganz ohne Ton
 
Hi,

geht alles ein Blinker kann auch mal schnell komplex werden die schon Shrimps schrieb. Z.b. mit der eingestellten Zykluszeit rechnen und nur reine Systemfunktionen verwenden die ADD etc... Dann bekommt man auch einen Blinker hin. Aber für den Anfang kann man auch mal die schrittkette benutzen ...

Aber Fallunterscheidunfen sind ein schönes Konstrukt denn man das elsif auch versteht in welcher Prioritäten man diese auswertet ...

MacToolz

Gesendet von meinem LG-D855 mit Tapatalk
 
Zurück
Oben