Step 7 IEC Timer in Multiinstanz läuft nicht

Zuviel Werbung?
-> Hier kostenlos registrieren
Versuchen wirs mal mit den AWL Quellen, bin gespannt. Sollten im Zip File im Anhang sein.

Und wie schon ganz am Anfang gesagt, das mit dem Timer funktioniert ja, nur nicht in der Steuerung.
Im PLCSIM funktioniert das alles tadellos.

Also gerade was die IEC-Timer angeht habe ich in einem Projekt vor ca. 5 Jahren mal große Schwierigkeiten mit PLCSIM gehabt.
Da bin ich mit der T#0ms Initialisierungs-Geschichte komplett auf die Fresse gefallen, weil nämlich in PLCSIM ein IEC-Timer mit T#0ms direkt beim Aufruf mit TRUE durchgeschaltet hat und in einer realen Steuerung nicht.
War halt blöd, wenn in meinem Fall ein Bediener eine Schrittzeit von 0 Sekunden in den Parametern eingetragen hat und damit eine Schrittkette quasi verriegelt hat.
Dadurch durfte ich dann auch das Programm anpassen.

Also verlasse dich nicht zu sehr auf PLCSIM.
 
So.....
Hab das ganze jetzt mal an der Steuerung getestet.
Das ganze mit dem T#0ms hat gar nichts gebracht.
Im aufrufenden Baustein müssen die Instanzen eventuell initalisiert werden.Also dort mal mit Pt=0ms einmal initialisieren?Komisch.
So stehts in der Anleitung.
Auch dieses mit dem wegnehmen der Festen 1 vorm Timer hat nichts geändert.

Hab dieses genze IEC Timerkram jetzt rausgenommen und es über die TIM_TCK (SFC64) Funktion gelöst.
Nur der Zeitwert macht mich etwas stutzig, der Wert bei Zeit_aktuell ist weit größer als Zeit_Ziel ist, funktioniert aber trotzdem. Die Funktion TIM_TCK gibt ja das Datum auch mit aus oder ?!?!
Hab jetzt nicht geschaut, vermute aber mal dass dem so ist....oder ?!?!

attachment.php
 

Anhänge

  • TIM_TCK.JPG
    TIM_TCK.JPG
    61,4 KB · Aufrufe: 83
Zuletzt bearbeitet:
Rechnerisch wäre das ca. alle 25 Tage....
Gut ist nun nicht so oft aber außer acht lassen sollte ich es nicht, da hast du vollkommen recht.
Habe keinen Bock, dass plötzlich jemand auf der Matte steht, weil es zu nem Überlauf gekommen ist. Da Programmier ich da lieber noch etwas Code rein ;)

Schon eine Idee, wie ?!?!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was willst du eigentlich überhaupt erreichen ?
Möchtest du ein Array_of_Timer bauen ?

In dem ganzen geht es darum, dass ein Ofen mit 45 Strahlern zu steuern ist. So weit nicht schlimm, Problem ist nur die entstehende Last wenn alle 45 Strahler angehen.
Da fliegt da schon mal die Sicherung.
Und um dies zu verhindern habe ich etwas eingebaut in dem ich festlege wieviel Strahler zeitgleich angehen dürfen und wie lang gewartet werden soll bis die nächsten angehen dürfen.
Also sperre ich ein Freigabebit, zähle parrallel je nach dem ob zu oder abgeschaltet wird einen Wert hoch und runter und gebe frei bzw. sperre die restlichen Strahler.

Hoffe das ganze war verständlich.
 
Auch dieses mit dem wegnehmen der Festen 1 vorm Timer hat nichts geändert.

Da wird sich auch nix ändern Festen 1 führt schon immer 1. Aber wenn der Baustein im ganzen nicht aufgerufen wird, wird auch der Timer keine eingangsänderung in der Zeit erkennen.

Hab dieses genze IEC Timerkram jetzt rausgenommen und es über die TIM_TCK (SFC64) Funktion gelöst.
Nur der Zeitwert macht mich etwas stutzig, der Wert bei Zeit_aktuell ist weit größer als Zeit_Ziel ist, funktioniert aber trotzdem. Die Funktion TIM_TCK gibt ja das Datum auch mit aus oder ?!?!

Nein Tim_TCK gibt einfach nur Milisekunden hoch bis 2147483647ms aus. Diese werden durch die Systemuhr gezählt unabhängig von Zyklus etc und beginnen bei überlauf wieder bei 0. Ist also nicht einfach so als Timer zu gebrauchen (überlauf erkennen und berechnen).

mfg René
 
Eine Staffelung könnte man z.B. so machen Bausteinintern ohne den ganzen Baustein zu überspringen.
Code:
      U(
      L     #staffelung          // inout wird extern zurückgezählt
      L     #maxgleichzeitig     // wieiviele dürfen maximal zuschalten
      <=I
      )
      =     #einschaltenerlauben


// hier programm welches mit einschaltenerlauben einschaltet

xxxxx

// nach dem Programme
      U(
      L     #out_stufen          // stufe hat sich erhöht
      L     #out_stufen_save
      >I
      )
      =     #Trigger


      L     #out_stufen          // neue stufe sichern
      T     #out_stufen_save




      U     #Trigger             // da gerade zuschaltet staffelung erhöhen. Somit nächster baustein ggf nicht dazuschaltet
      SPBN  staffelungplus
      L     #staffelung
      L     1
      +I
      T     #staffelung
staffelungplus : NOP 0

#staffelung zählst du dann am ende der Bausteinaufrufe im entsprechenden Takt zurück. z.B. wenn Staffelung 2 enthält wartest du 5 Sekunden und subtrahierst dann 1 oder halt auch 3 wenn immer drei gleichzeitig einschalten dürften.

Dann sind die Bausteine an und fürsich gekapselt aber trotzdem im Zyklus und werden durch einen verbindungsmerker (#staffelung) in Synchronität gebracht.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In dem ganzen geht es darum, dass ein Ofen mit 45 Strahlern zu steuern ist. So weit nicht schlimm, Problem ist nur die entstehende Last wenn alle 45 Strahler angehen.
Da fliegt da schon mal die Sicherung...
Zu diesem Thema gibt es unter "Programmierwettbewerb, 4. Aufgabe" eine wirkungsvolle Lösung. Diese würde ich sicherheitshalber am Ende des OB1 mit einbauen, zusätzlich und unabhängig von deinen Freigaben im Programm.

Falls Bedarf besteht und du kein SCL zur Verfügung hast, könnte ich auch einen entsprechenden Baustein für dich hochladen.
 
Zuletzt bearbeitet:
Einen schönen Tag auch.

Hatte in meinem Ablauf noch ein Abfangen des Überlaufs mit eingebaut, hat auch funktioniert....also in der Simulation und theoretisch.
War mir dann am Ende doch zu kompliziert.
Da das ganze ja nicht zeitkritisch ist und letztlich noch einfach und nachvollziehbar sein soll, bin ich von dieser TIM_TCK auch weggegangen.
Aktuell schleife ich mir ein 1s Taktsignal durch und zähle dann einfach einen Wert hoch bzw. runter der dann den Sekunden entspricht.
Funktion ist gegeben und Timer sind keine mehr drin.

Am Ende frag ich mich trotzdem bzw. hab ich nicht verstanden warum es im PLCSIM funktioniert hat und in der CPU nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Am Ende frag ich mich trotzdem bzw. hab ich nicht verstanden warum es im PLCSIM funktioniert hat und in der CPU nicht.

Darum die Frage. Hast du in der PLCSIM das komplette Programm simuliert (wirklich komplett) wie es auch auf der realen CPU geladen ist?

mfg René
 
Am interessantesten wäre wenn du dein Projekt, das auf der SIM lief aber auf der CPU nicht, nimmst, es auf das absolute Minimum zusammenkürzt, nochmal probierst ob es auf der CPU tatsächlich nicht läuft und es dann als komplettes hier rein stellst.

Dann könnte man versuchen den Fall nachzustellen. Alles andere ist Fischen im Trüben.

Das ein IEC-Timer in der SIM läuft und in einer CPU (aktueller Version) nicht, kann ich mir schwer vorstellen. Wenn doch dann gibts wahrscheinlich auch eine Erklärung dafür.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da das ganze modular programmiert ist, kann ich die betreffenden Teile einfach rauslösen und einzeln testen.
Werde das ganze also mal im absoluten Minimum testen.
 
Zurück
Oben