TIA CTD Rückwärtzähler gib keinen aktuellen Zählwert aus (CV)

SanjaDO

Level-1
Beiträge
177
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute

hier ist mein Code:

Code:
#IEC_Counter_0_Instance_1(CD:=#sm_counter[1],
                          LD:=#neuer_wert_CTD1,
                          PV:=#Spuelzyklen_panel);

#IEC_Counter_0_Instance_2(CD:=#sm_counter[4],
                        LD:=#neuer_wert_CTD2,
                        PV:=#Spuelzyklen_panel);

IF #sm_main[2] THEN
  #sm_counter[0]:=1;
END_IF;

IF #sm_counter[0] THEN
  IF #sm_main[6] THEN
    #sm_counter[0]:=0;
    #sm_counter[1]:=1;
  END_IF;
END_IF;

IF #sm_counter[1] THEN
  IF NOT #IEC_Counter_0_Instance_1.Q THEN
    #sm_counter[1]:=0;
    #sm_counter[2]:=1;
  ELSIF #IEC_Counter_0_Instance_1.Q THEN
    #sm_counter[1]:=0;
    #sm_counter[3]:=1;
  END_IF;
END_IF;

IF #sm_counter[2] THEN
  IF #sm_main[5] THEN
    #sm_counter[2]:=0;
    #sm_counter[1]:=1;
  END_IF;
END_IF;

IF #sm_counter[3] THEN
  IF #sm_main[6] THEN
    #sm_counter[3]:=0;
    #sm_counter[4]:=1;
  END_IF;
END_IF;

IF #sm_counter[4] THEN
  IF NOT #IEC_Counter_0_Instance_2.Q THEN
    #sm_counter[4]:=0;
    #sm_counter[5]:=1;
  ELSIF #IEC_Counter_0_Instance_2.Q THEN
    #sm_counter[4]:=0;
    #sm_counter[0]:=1;
  END_IF;
END_IF;

IF #sm_counter[5] THEN
  IF #sm_main[5] THEN
    #sm_counter[5]:=0;
    #sm_counter[4]:=1;
  END_IF;
END_IF;

IF #sm_counter[0] THEN
  #neuer_wert_CTD1:=1;
ELSE
  #neuer_wert_CTD1:=0;
END_IF;

IF #sm_counter[3] THEN
  #neuer_wert_CTD2:=1;
ELSE
  #neuer_wert_CTD2:=0;
END_IF;

//Hier wird die Integer-Variable Rest_Spuelzyklen mal mit "0" oder mit 256" beschrieben. Wenn ich mit aber die Instanz von dem IEC-Counter angucke, wird diese so zurückgezählt wie es sein muss.

#Rest_Spuelzyklen_F003:=#IEC_Counter_0_Instance_1.CV;
#Rest_Spuelzyklen_F004:=#IEC_Counter_0_Instance_2.CV;


Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wer soll sich das reinziehen, ohne weitere Infos, ohne Kommentare?
Mit gefällt der Code schon optisch nicht, er "sieht nicht schön aus" (natürlich ist das rein subjektiv!!!), man kann nicht erkennen, was genau er machen soll, es sind Variablen dabei, die aus dem "Nirgendwo" kommen.
Das ist einfach schwierig, hier zu sagen, warum das nicht funzt.
Die Erfahrung sagt, dann gibt es Schwierigkeiten und so ist es ja auch.
Man sieht ja auch nicht die Setzwerte, das sind Variablen (Inhalt unbekannt).
 
Kann mir denn keiner helfen???
Die Frage ist eher, wer sich diese m.M.n. grausame Programmierweise antuen will?!
Sorry, aber ich hoffe inständig, das ich sowas nie warten muss!


Das Du unter SCL wie in FUP/KOP programmierst, ist sicher Geschmackssache.
Aber sowas:
...
Code:
...
IF #sm_counter[0] THEN
  #neuer_wert_CTD1:=1;
ELSE
  #neuer_wert_CTD1:=0;
END_IF;
...
...
:roll:
Es wurde Dir im anderen Thread doch schon mehrfach gesagt, das boolsche Variablen nicht mit 0 oder 1 sondern mit TRUE oder FALSE zugewiesen werden.
Und dann sieht man auch, das dieses ganze IF-THEN-Rumgewurschtel teilweise durch eine einfache Zuweisung ersetzt werden kann:
Code:
#neuer_wert_CTD1:= #sm_counter[0];


An der Zuweisung des CV-Werts an die INT-Variable sieht für mich alles OK aus.
Wo kommt denn die 256 her? Und wie sieht denn die Deklaration der Variablen aus?


PS:
Warum benennst Du die Zählerinstanzen nicht aussagekräftig?
Warum kommentierst Du Deine Zeilen nicht?
 
Zuletzt bearbeitet:
Auch so 'ne Sache:
...
Code:
...
IF #sm_counter[1] THEN
  IF NOT #IEC_Counter_0_Instance_1.Q THEN
    [COLOR=#ff8c00]#sm_counter[1]:=0;[/COLOR]
    #sm_counter[2]:=1;
  [COLOR=#ff0000]ELSIF #IEC_Counter_0_Instance_1.Q THEN[/COLOR]
    [COLOR=#ff8c00]#sm_counter[1]:=0;[/COLOR]
    #sm_counter[3]:=1;
  END_IF;
END_IF;
...
...
#IEC_Counter_0_Instance_1.Q kann nur TRUE oder FALSE sein. Eine weitere Möglichkeit gibt es nicht.
Warum also mit ELSIF und 'ner weiteren Abfrage der gleichen Variable arbeiten? Ein einfaches ELSE reicht hier doch auch.
#sm_counter[1] wird so oder so auf FALSE gesetzt. Warum steht das dann 2x in der IF-THEN Bedingung der Counterabfrage, statt nur 1x außerhalb?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das war ein Textcode und auch noch nicht optimiert gewesen... Ich wollte erstmal die IEC Zähler ausprobieren. Naja ich habe jetzt den Fehler nach 5 stunden suchen gefunden und der heißt PLCSIM!!!! Es hat alles funktioniert bis auf den OUTPUT CV! Also aufpassen und nie wieder PLCSIM nutzen!!! Danke
 
Ich glaube es nicht, jetzt ist der Fehler wieder aufgetaucht... Jetzt ist es auch auf der Hardware CPU (314er)...

Ich habe um den Fehler einzugrenzen nur den Counter dringelassen:

Code:
FUNCTION_BLOCK "FIlterüberwachung"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      sm_main : Array [0..50] of Bool;
      Spuelzyklen_panel : Int;
   END_VAR


   VAR 
      IEC_Counter_1 {OriginalPartName := 'CTD'; VersionGUID := '2f9cc075-5e30-4b29-86bb-fa9266e3605b'} : CTD;
      IEC_Counter_2 {OriginalPartName := 'CTD'; VersionGUID := '2f9cc075-5e30-4b29-86bb-fa9266e3605b'} : CTD;
      Restspuelzyklen_F003 : Int;
      Restspuelzyklen_F004 : Int;
   END_VAR




BEGIN
	
	
	#IEC_Counter_1(CD:=#sm_main[6],LD:="Wiederanlauf",PV:=#Spuelzyklen_panel);
	#Restspuelzyklen_F003:=#IEC_Counter_1.CV;
	
	
	
END_FUNCTION_BLOCK

In der Instanz wird CV rückwärts gezählt:

Instanz.JPG

Im FB selbst nicht:

Online.JPG

Wenn der Zähler läuft wird CV auf "0" gesetzt, wenn der abgelaufen ist auf "256":

abgelaufen.JPG

Nun werdet ihr fragen was den sm_main[6] macht...sm_main[6] toggelt im 15 Sekundentakt - mehr nicht!
 
Ich hab das mal bei mir reingeladen, das funktioniert mit PLCSIM.
Allerdings läuft bei mir nur ein 15-Sekunden Timer mit einem Merker als Takt und dann dein FB.
Da wird CV richtig angezeigt.
Kann es sein, dass du irgendwo in deinem weiteren Programm noch einen Bock hast?
 
Zurück
Oben