FB Probleme beim rücksetzen einer Zeit

Ladwig

Level-2
Beiträge
11
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
ich habe folgenden FB zur Generierung eines Intervalls zusammengebastelt. Habe nun aber folgendes festgestellt. Wenn ich das RESETBIT setze ohne daß, das STARTBIT gesetzt ist geht die CPU mit folgender Fehlermeldung auf Stop. "BCD Wandlungsfehler"
Testweise habe ich dann den identischen Code mit direkter Adressierung in einen FC gepackt. Komischerweise kann ich im FC das RESETBIT setzen wann ich will die CPU geht nicht auf Stop. Im FC kann ich auch die Flankenauswertung des Resetbits weglassen. Weiß irgendjemand im Forum weshalb das so ist??

Code:
FUNCTION_BLOCK "Intervall"
TITLE =
VERSION : 0.1
VAR_INPUT
  Start : BOOL ; 
  Impulswert : S5TIME ; 
  Pausenwert : S5TIME ; 
  Impulszeit : TIMER ; 
  Pausenzeit : TIMER ; 
  Reset : BOOL ; 
END_VAR
VAR_OUTPUT
  Ausgabe : BOOL ; 
END_VAR
VAR
  Stat_Flanke : BOOL ; 
END_VAR
BEGIN
NETWORK
TITLE =
 
      U     #Start; 
      SPBN  a001; 
 
      UN    #Pausenzeit; 
      L     #Impulswert; 
      SI    #Impulszeit; 
 
      U     #Impulszeit; 
      S     #Ausgabe; 
 
      UN    #Impulszeit; 
      L     #Pausenwert; 
      SI    #Pausenzeit; 
 
      U     #Pausenzeit; 
      O     #Reset; 
      R     #Ausgabe; 
 
a001: NOP   0; 
 
      U     #Reset; 
      FP    #Stat_Flanke; 
      SPBN  aend; 
 
      R     #Impulszeit; 
      R     #Pausenzeit; 
 
      CLR   ; 
      SI    #Impulszeit; 
      SI    #Pausenzeit; 
 
aend: NOP   0; 
 
END_FUNCTION_BLOCK
 
Code:
      CLR   ; 
      SI    #Impulszeit; 
      SI    #Pausenzeit;

Das Problem dürfte das CLR sein.
CLR beeinflusst nur das VKE, aber nicht die Akkus, da du aber vorher (wenn Dein Startbit nicht anliegt) keinen Zeitwert geladen hast, wird einfach der Inhalt von Akku 1 als S5TIME genommen. Leider ist der in dem Moment beliebiog und hat offensichtlich das falsche Format.
Schreibe mal statt dem CLR "L 0"!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
an welcher stelle bekommst du den bcd-wandlungsfehler?
bausteinadresse aus diagnospuffer ablesen und im editor mit bearbeite->gehe zu...->bausteinadresse ablesen.

damit habe ich so meine probleme:
Code:
*
      CLR   ; 
      SI    #Impulszeit; 
      SI    #Pausenzeit;

denn SI lädt bei VKE = 1 den Wert als Impuls, CLR setzt das VKE aber zurück, so werden die zeiten nie gestartet ALLERDINGS muß in #Impulszeit und #Pausenzeit trotzdem ein gültiger BCD-Wert stehen, geht aber nicht, da sowohl Impulszeit als auch Pausenzeit vom Datentyp TIMER und nicht vom Typ S5TIME (BCD) sind.
 
Hallo M-Ott und Vierlagig,

tatsächlich geht die CPU bei

Code:
CLR
SI Impulszeit

auf Stop wie Ihr vermutet habt. Wieso geht sie aber nicht auf Stop wenn ich genau denselben Code in einem FC ausführe?

Habe auch die Lösung von M-Ott Versucht und anstelle des CLR, L 0 versucht. Dann werden die Zeiten nach dem ersten RESET aber nie wieder gestartet!
 
Wieso geht sie aber nicht auf Stop wenn ich genau denselben Code in einem FC ausführe?

Reines Glück, schätze ich.

Habe auch die Lösung von M-Ott Versucht und anstelle des CLR, L 0 versucht. Dann werden die Zeiten nach dem ersten RESET aber nie wieder gestartet!

War ein Tipp ins Blaue...
Bei genauerem Hinsehen, scheint es, als ob Du den Teil

Code:
      CLR   ; 
      SI    #Impulszeit; 
      SI    #Pausenzeit;

weglassen könntest.

Probiere doch mal aus, was passiert, wenn Du diese drei Zeilen auskommentierst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich habe jetzt die drei Zeilen

Code:
CLR
SI #Impulszeit
SI #Pausenzeit

auskommentiert. Und es funktioniert tatsächlich.
Diesen Codeteil habe ich eingefügt da ich in einem anderen Fall auch schon Probleme mit einer Zeit hatte. Und dies auch hier im Forum beantwortet bekam. Siehe folgenden Beitrag:

http://www.sps-forum.de/showthread.php?t=25140&goto=newpost
 
Hallo Ladwig,

wenn Du vor oder hinter dem CLR eine BCD-Codierte Zahl lädst, kannst Du die 3 Zeilen drin lassen:

Code:
L 1 // oder L S5T#1ms oder...
CLR
SI #Impulszeit
SI #Pausenzeit

Grüße
Gebs
 
Hallo Ladwig,

wenn Du vor oder hinter dem CLR eine BCD-Codierte Zahl lädst, kannst Du die 3 Zeilen drin lassen:

Code:
L 1 // oder L S5T#1ms oder...
CLR
SI #Impulszeit
SI #Pausenzeit

Grüße
Gebs

Wobei die 3 bzw. dann 4 Zeilen völig unsinnig sind.

SI + "F1" = SI <Zeit> startet die adressierte Zeit, wenn das VKE von "0" auf "1" wechselt. Die programmierte Zeitdauer läuft ab, solange das VKE = 1 ist. Wechselt das VKE auf "0", bevor die Zeit abgelaufen ist, wird die Zeit angehalten. Für diese Operation (Starten der Zeit) müssen der Zeitwert und die Zeitbasis im BCD-Format in AKKU1-L gespeichert sein.

Wenn du jetzt willst das bei Reset die Impulse stoppen solltest du den Befehl SI nicht nocheinmal aufrufen und davor ein CLR schreiben sondern einfach deinen Reset im oberen Teil als nicht einsetzen. Oder ganz weglassen denn du Rücksetzt ja schon beide Impulse ein paar Zeilen weiter oben.
 
Zurück
Oben