# Timer funktioniert nicht mehr?



## amos (8 Oktober 2018)

Hallo Experten,
der folgende Code hat auf meiner Wago 750-811 jahrelang einwandfrei funktioniert.
Seit ich gestern ein Webvisu Trend Objekt implementiert habe, bleibt der I/O Ausgang Out0 dauerhaft auf "off".
Hat jemand eine Idee woran das liegen könnte?


```
Output_0 AT %QX0.0: BOOL;
IF Output_0
   THEN  Timer_temp_fuehler.PT:=t#30s; (*on*)
   ELSE  Timer_temp_fuehler.PT:=t#30s; (*off*)
   analog0_int:=WORD_TO_INT(analog0);
   analog1_int:=WORD_TO_INT(analog1);
   analog2_int:=WORD_TO_INT(analog2);
   analog3_int:=WORD_TO_INT(analog3);
END_IF;
Timer_temp_fuehler(IN:=NOT Timer_temp_fuehler.Q);
Output_0 := Output_0 XOR Timer_temp_fuehler.Q;
rtrigg_out0(CLK:= Output_0);
xDoit := rtrigg_out0.Q;
```


----------



## amos (8 Oktober 2018)

*Problem ist nun gelöst! (Siehe ganz unten)*

oder anders gefragt, wie kann man so ein Verhalten mit Codesys eingrenzen?
oder gibt es eine Debug Möglichkeit?



amos schrieb:


> Hallo Experten,
> der folgende Code hat auf meiner Wago 750-811 jahrelang einwandfrei funktioniert.
> Seit ich gestern ein Webvisu Trend Objekt implementiert habe, bleibt der I/O Ausgang Out0 dauerhaft auf "off".
> Hat jemand eine Idee woran das liegen könnte?
> ...


----------



## MasterOhh (8 Oktober 2018)

Wird Output_0 vielleicht irgendwo in deiner WebVisu beschrieben?


----------



## amos (9 Oktober 2018)

Nein es liegt offensichtlich an der Trend Library, denn wenn ich das Projekt  nur mit syslibcallback und Standard.lib teste funktioniert alles wieder.
Was ich nicht verstehe ist, warum das Programm fehlerfrei übersetzt wird?


----------



## Heinileini (9 Oktober 2018)

amos schrieb:


> Hallo Experten,
> ... bleibt der I/O Ausgang Out0 dauerhaft auf "off". ...
> 
> ```
> ...


Was in dem gezeigten Code entspricht denn dem "I/O Ausgang Out0"? Output_0?
Bleibt Output_0 auf True, wenn man ihn auf True setzt?

Die beiden Zeilen ...
Timer_temp_fuehler(IN:=NOT Timer_temp_fuehler.Q);
Output_0 := Output_0 XOR Timer_temp_fuehler.Q;
... würde ich tauschen.
Zuerst mit Timer_temp_fuehler.Q das Bit Output_0 umknippsen und dann erst mit /Timer_temp_fuehler.Q den Timer neu starten.

Was bewirkt die Zeile
rtrigg_out0(CLK:= Output_0);
?
Bzw. wo versteckt sich der FlankenMerker zur Erkennung der pos. Flanke von Output_0?
Bleibt sein Zustand bis zum nächsten Zyklus erhalten?

Wird Timer_temp_fuehler jemals gestartet?

PS:


> Was ich nicht verstehe ist, warum das Programm fehlerfrei übersetzt wird?


Sollte es nicht, wenn es fehlerfrei ist?
Was meinst Du mit "fehlerfrei"? Frei von SyntaxFehlern? Frei von logischen Fehlern? Frei von DoppelDefinitionen (Trend Library/eigenes Programm)?


----------



## mek_meik (10 Oktober 2018)

amos schrieb:


> Nein es liegt offensichtlich an der Trend Library, denn wenn ich das Projekt  nur mit syslibcallback und Standard.lib teste funktioniert alles wieder.
> Was ich nicht verstehe ist, warum das Programm fehlerfrei übersetzt wird?
> Anhang anzeigen 42884



Gibt es in der Trend Lib vielleicht eine System-Variable die Output_0 heißt?

PS

Bin ich eigentlich der einzige der nicht gerne (eher nie) wirkliche physikalische Ausgänge %QXx.x im Programm abfragt für IF Bedingungen? 

Dachte immer sowas macht man nicht, weiß aber gar nicht mehr genau wie ich drauf komme. :-?


----------



## Heinileini (10 Oktober 2018)

mek_meik schrieb:


> Bin ich eigentlich der einzige der nicht gerne (eher nie) wirkliche physikalische Ausgänge %QXx.x im Programm abfragt für IF Bedingungen?


Nein, Du bist der andere, der das auch nicht gerne tut.

​​


> Dachte immer sowas macht man nicht, weiß aber gar nicht mehr genau wie ich drauf komme.


Das wurde von ProgrammiererGeneration zu ProgrammiererGeneration so überliefert.


----------



## amos (10 Oktober 2018)

Es geht um den physikalischen Baustein %QX0.0
Hier das Vollständige Programm das mit den zwei genannten Libraries übersetzt wurde und gut funktioniert.
(Der Baustein ändert alle 30s seinen Zustand)


```
PROGRAM PLC_PRG
VAR
      analog0 AT %IW0: WORD;
      analog1 AT %IW1: WORD;
       Output_0 AT %QX0.0: BOOL;
       Timer_temp_fuehler:TON;
       rtrigg_out0 : R_TRIG;
END_VAR
IF Output_0
   THEN  Timer_temp_fuehler.PT:=t#30s; (*on*)
   ELSE  Timer_temp_fuehler.PT:=t#30s; (*off*)
END_IF;
Timer_temp_fuehler(IN:=NOT Timer_temp_fuehler.Q);
Output_0 := Output_0 XOR Timer_temp_fuehler.Q;
rtrigg_out0(CLK:= Output_0);
```


Wenn ich nun das ganze mit Webvisu für den Baustein analog0 AT %IW0 übersetze, wechselt der Zustand von %QX0.0 leider nicht mehr, obwohl das Programm bei der Übersetzung keinen Fehler bringt.
Mir fällt nur auf, dass wesentlich mehr Codesys Bibliotheken notwendig sind. (Siehe Screenshot weiter oben.)





Heinileini schrieb:


> Was in dem gezeigten Code entspricht denn dem "I/O Ausgang Out0"? Output_0?
> Bleibt Output_0 auf True, wenn man ihn auf True setzt?
> 
> Die beiden Zeilen ...
> ...


----------



## Heinileini (10 Oktober 2018)

Hast Du schonmal versucht,
Die beiden Zeilen ...
Timer_temp_fuehler(IN:=NOT Timer_temp_fuehler.Q);
Output_0 := Output_0 XOR Timer_temp_fuehler.Q;
... zu tauschen?

Zum Testen, ob die Timerei überhaupt in Gang kommt, könntest Du statt
Timer_temp_fuehler(IN:=NOT Timer_temp_fuehler.Q);
einmal
BoolscheHilfsVariable := Timer_temp_fuehler.Q) Xor IrgendeinEingangMitTaster;
Timer_temp_fuehler(IN:=NOT BoolscheHilfsVariable);
programmieren und probieren, ob sich der Timer manuell per TastenDruck anwerfen lässt.

PS:
Ich verstehe nicht, was Du mit ...


amos schrieb:


> Wenn ich nun das ganze mit Webvisu für den *Baustein analog0 AT %IW0* übersetze, wechselt der Zustand von %QX0.0 leider nicht mehr, ...


… meinst ;o(

PPS:
Überschneiden sich etwa %IW0 und %IW1, %IW1 und %IW2, %IW2 und %IW3 ?
Sind die Ziffern ByteAdresssen, WortAdressen, … ?
Anders gefragt: müsste es nicht %IW0, %IW2, %IW4, %IW6 heissen?
​​​​
​


----------



## amos (10 Oktober 2018)

*fehlerhafte Bibliothek?*

Jetzt komme ich der Sache näher, wenn ich das Programm direkt aus der Steuerung lade bekomme ich diese Fehlermeldung, obwohl es ja eigentlich zuvor fehlerfrei in die Steuerung übersetzt wurde.
Ich weiss aber nicht in welcher Bibliothek und welcher Version dieser fehlerhafte Baustein von der Firma Codesys definiert wurde:


----------



## StructuredTrash (10 Oktober 2018)

Vorweg: Ich komme aus der TwinCat- und Target-Visu-Ecke und habe keine Erfahrung mit Wago, der Web Visu und dem Trendobjekt.
Ich vermute, dass der in der Fehlermeldung genannte Baustein ein Codesys-Visu-FB ist, den Du niemals zu Gesicht bekommen wirst. Möglicherweise wird der FB vom Trendobjekt verwendet und Du hast einen Platzhalter des Trendobjektes nicht ausgefüllt oder etwas reingeschrieben, was der Compiler nicht übersetzen kann. Es könnte aber auch sein, dass das Trendobjekt von der Web Visu gar nicht unterstützt wird.


----------



## amos (11 Oktober 2018)

OK, Vielen Dank, ich werde das jetzt mal testen. Ich konfiguriere nur eine einzige Trend Visu auf den Eingang analog0 um zu sehen, ob das fehlerfrei funktioniert.


----------



## amos (11 Oktober 2018)

Für alle die es interessiert, ich habe den Fehler nun gefunden.
Durch die Trend Visualisierung wurde automatisch ein Task angelegt, ohne dass ich es mitbekommen habe.
Wenn ich diesen Task lösche funktioniert der Timer wieder einwandfrei.
Kann mir jemand sagen, was ich machen muss, damit mein ursprüngliches Hauptprogramm ebenfalls diesen Trend Task benutzt, oder ist es sinnvoller, wenn ich für das Hauptprogamm einen eigenen Task anlege?


----------



## amos (11 Oktober 2018)

PLC_PRG und Taskkonfiguration unter CoDeSys 2.3


----------



## Thruser (11 Oktober 2018)

Hallo,

wahrscheinlich ist es besser das Hauptprogramm über einen höher priorisierten Task laufen zu lassen. Einfach neuen Task einfügen über rechte Maustaste. Dann bei diesem Task noch einmal rechte Maustaste und Programmaufruf einhängen. Dort dann PLC_PRG wählen.

Gruß


----------

