Variabler Timer

wuerfelzinker

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

Also vor meinem Problem erstmal ein dickes Lob an die Leute hier! Die Beiträge sind hochinteressant, und haben mir schon einiges weitergeholfen.

Jetzt stehe ich aber vor einem Problem, mit dem ich nicht klar komme.

Ich brauche mehrere Timer deren Startzeiten ich über ein OP mittels +/- Tasten verändern kann. Die eingestellte Zeit will ich dann auf dem OP wieder ausgeben, genauso wie den aktuellen Zeitstand des Timers.

Meine Hardware ist erstmal ein Testaufbau:
CPU 315 2-DP mit einem OP25
Später ändert sich die Hardware auf:
1. CPU 314 IFM mit OP25
2. eine 315ner CPU (weiß grad nicht genau welche) mit einem OP170B

Meine Software: Step7 5.1 SP4 und ProTool


Meine Kenntnisse sind noch reichlich beschränkt. (Mechatroniker-Azubi kurz vor der Prüfung)
Alles an Datentypen über BOOL oder MB habe ich mir jetzt über dieses Forum und die Hilfedateien der beiden Programme nur ansatzweise angelesen, und mit DBs hantiere ich das erste mal (auch alles aus der Hilfedatei).
Also bitte nicht zuviel Wissen voraussetzen.

Ebenso gebe ich zu, leider bisher FUP-Nutzer zu sein. Auch wenn ich es jetzt mit AWL versuche, da mir da die Möglichkeiten um einiges größer erscheinen.

Auf anfrage kann ich Quellcode Posten, aber zuviel will ich nicht reinsetzen, da das ganze mit meiner Abschlussprüfung zu tun hat, und es nacher nicht heißen soll, ich hab mir das hier machen lassen.
Mit geht es nur um die Schnittstelle OP, CPU und OP-Programmiereung, und die ist nicht prüfungsrelevant. Das SPS-Programm hingegen schon.


Vielen Dank im voraus für die Hilfe

MfG.: Würfelzinker
 
was spricht gegen eine Eingabe

Hallo,
1. Warum willst du die Timer mit der +/- Taste beeinflussen, du kannst mit Pro Tool auch ein E/A Feld machen und den Timerwert dann eingeben.

2. Wichtig ist das die übergabe der Zeit nicht so ganz einfach ist sofern du z.B. Minuten und Sekunden einstellen willst. Suche hierzu mal im Forum

Ansosnsten einfach an die Zeit, die Adresse des DBWs dranschreiben z.B. db1.dbw0 datentyp s5time. Alternativ kannst du auch die iec timer nehmen.
 
Vielen Danke schonmal für eure Antworten.

@ Kai: Ja, den Beitrag habe ich schon ausgedruckt vorliegen, ist echt fein zu sehen wie die aufgebaut ist.

Aber genau dieser S5Time-Aufbau hat mir einen Strich durch die Rechnung gemacht. Ich hab die +/- Tasten mit "var + 1 = var", bzw "var - 1 = var" Funktionen belegt. Ging so lange gut, bis die dadurch das Bit für den Zeitfaktor umgeschrieben wurde. ^^

Deswegn wollte ich nun IEC Time verwenden.
Einem andren Beitrag habe ich entnommen, dass IEC Time vom Aufbau gleich INT ist. Doch funzt meine Übergabe nicht. Meistens bekomme ich ärger mit den Variablentypen.

Morgen in der Arbeit werde ich mal versuchen, ob ich das Problem auch bei mitchihs Variante mit der Direkteingabe habe.


Vielleicht hatte ich das Problem auch weil ich dr Time nur den DB angegeben hatte, und nicht die DBW-Adresse. (steht eh nichts anderes drinnen als diese eine Zeit bisher)
Die Adressierung innerhalb eines DBs habe ich allerdings noch nciht ganz verstanden. Aber vielleicht ergeben sich mir morgen noch ein paar Lösungen.

Über die Ergbnisse werde ich euch auf dem Laufenden halten.


Vielen Dank schonmal

Würfelzinker.
 
@ Kai: Ja, den Beitrag habe ich schon ausgedruckt vorliegen, ist echt fein zu sehen wie die aufgebaut ist.

Aber genau dieser S5Time-Aufbau hat mir einen Strich durch die Rechnung gemacht. Ich hab die +/- Tasten mit "var + 1 = var", bzw "var - 1 = var" Funktionen belegt. Ging so lange gut, bis die dadurch das Bit für den Zeitfaktor umgeschrieben wurde.

Bei dem Datentyp S5Time hat man für den Zeitfaktor leider nur einen Datenbereich von 0 bis 999. Bei einem Zeitfaktor größer 999 wird bei der Umrechnung die Zeitbasis überschrieben.

Code:
Zeitbasis 0 = 0.01 s  ->  Zeitfaktor 0 bis 999  ->  Zeitdauer 0 bis 9,99 s
 
Zeitbasis 1 = 0.1 s   ->  Zeitfaktor 0 bis 999  ->  Zeitdauer 0 bis 99,9 s
 
Zeitbasis 2 = 1 s     ->  Zeitfaktor 0 bis 999  ->  Zeitdauer 0 bis 999 s
 
Zeitbasis 3 = 10 s    ->  Zeitfaktor 0 bis 999  ->  Zeitdauer 0 bis 9990 s
Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Deswegn wollte ich nun IEC Time verwenden.
Einem andren Beitrag habe ich entnommen, dass IEC Time vom Aufbau gleich INT ist. Doch funzt meine Übergabe nicht. Meistens bekomme ich ärger mit den Variablentypen.

Hier mal ein kurzes Beispiel für die Verwendung des SFB4 TON.

Der SFB4 braucht für den Eingang PT (Zeitdauer) und den Ausgang ET (abgelaufene Zeit) jeweils den Datentyp TIME.

Code:
[B]TIME[/B]
 
TIME = T#1ms  ->  DEZ = L#1
 
TIME = T#12s  ->  DEZ = L#12000

Gruß Kai
 

Anhänge

  • SFB4 - FUP.jpg
    SFB4 - FUP.jpg
    79,4 KB · Aufrufe: 77
  • SFB4 - DB200.jpg
    SFB4 - DB200.jpg
    58,1 KB · Aufrufe: 62
  • SFB4 - VAT.jpg
    SFB4 - VAT.jpg
    164,5 KB · Aufrufe: 68
Zuletzt bearbeitet:
Genau das von Kai beschriebene Problem hatte ich bei S5Time.

Morgen versuche ich das mal in Direkteingaben von TIME Wertwn umzumodeln.

Bis dahin wünsche ich noch einen schönen Abend.


MfG.: Würfelzinker
 
So...

Ich habe den Timer wie beschrieben am Laufen! Vielen Dank nochmal.

Aber es bleiben noch Probleme. :(
Kann ich den Timer während des Zählens mit einem Signal rücksetzen? Ich bräuchte das für meine Notausfunktion.

(warum sind die fertigen Timer auch so starrsinnig und nehmen nur S5Time... *grummel*)
 
Zuletzt bearbeitet:
Laut Signaldiagramm läuft der doch, wenn einmal gestartet, unbeirrt durch, bis die Zeit abgelaufen ist, dann geht er wieder auf null wenn IN=0.
Ich müsste den zum erreichen eines sicheren Zustandes aber auch im Laufen auf 0 setzen können.

Wenn ich den Not Aus haue, wird die Lastspannung meiner Ventilinsel getrennt. Aber ich muss ja auch das Programm zurücksetzen, damit beim Quittieren nicht noch irgendwelche Signale anstehen.

Oder hab ich da einen Denkfehler?
 
Laut Signaldiagramm läuft der doch, wenn einmal gestartet, unbeirrt durch, bis die Zeit abgelaufen ist, dann geht er wieder auf null wenn IN=0.
...

Wenn bei TON das Signal an IN (Start Eingang) False wird wird ET (Die bereits abgelaufene Zeit direkt t#0ms) und somit wird nie ET >= PT und der Ausgang Q wird nicht auf True wechseln.

Kurz um wenn IN = TRUE beginnt die Zeit ET sich aufzuaddieren wenn ET >= PT wird Q auf TRUE gesetzt. Egal wann ET < PT wird, wird Q = FALSE.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Laut Signaldiagramm läuft der doch, wenn einmal gestartet, unbeirrt durch, bis die Zeit abgelaufen ist, dann geht er wieder auf null wenn IN=0.
Ich müsste den zum erreichen eines sicheren Zustandes aber auch im Laufen auf 0 setzen können.

Wenn ich den Not Aus haue, wird die Lastspannung meiner Ventilinsel getrennt. Aber ich muss ja auch das Programm zurücksetzen, damit beim Quittieren nicht noch irgendwelche Signale anstehen.

Siehe dazu in STEP 7 die Onlinehilfe zum SFB4 TON:

Erzeugen einer Einschaltverzögerung mit dem SFB 4 "TON"

Der SFB 4 "TON" verzögert eine steigende Flanke um die Zeit PT. Die Zeit läuft nur in den Betriebszuständen ANLAUF und RUN.

Eine steigende Flanke am Eingang IN hat nach Ablauf der Zeitdauer PT eine steigende Flanke am Ausgang Q zur Folge. Q bleibt dann so lange gesetzt, bis der Eingang IN nach 0 wechselt. Falls der Eingang IN nach 0 wechselt, bevor die Zeit PT abgelaufen ist, bleibt der Ausgang Q auf 0.

Der Ausgang ET liefert die Zeit, die seit der letzten steigenden Flanke am Eingang IN vergangen ist, jedoch höchstens bis zum Wert des Eingangs PT. ET wird zurückgesetzt, wenn der Eingang IN nach 0 wechselt.

Gruß Kai
 
Ah! Mist.... Ich muss mehrmals um entschuldigung bitten.
Man sollte dran denken, dass Forenuser NICHT meine Gedanken lesen können...

Ich hatte das ganze nämlich an meine Applikation angepasst, und den TON gegen einen TP ausgetauscht.

Der war von SFB3 bis 4 am sinnvollsten.... hm... ich muss dass aber nochmal überprüfen...

Sorry, aber ich mach gerade Elektroverdrahtung und das Programm parallel. da läuft manchmal was Quer, gerade wenn man gleichzeitig noch überlegt was nach der AUsbildung kommen soll.


Soweit schon mal vielen Dank

Wuerfelzinker
 
Wenn einem der SFB3 nicht die Funktion liefert die man gerne hätte baut man sich das teil eben selbst.

Also zum dritten mal innerhalb von weniger als 24h liefere ich fast den Selben Trick:

Bau Dir doch Deinen Timer selbst in dem Du aus dem OB1 den OB1_Prev_Cycle aufaddierst.

Hier in SCL:
Code:
FUNCTION_BLOCK FB20
VAR_INPUT
  IN          :BOOL;
  PT          :TIME;
  Reset       :BOOL;
  OB1PreCycle :INT;
END_VAR

VAR_IN_OUT
  ET          :TIME;
END_VAR

VAR_OUTPUT  
  Q           :BOOL;
END_VAR

VAR
  INold       :BOOL;
  myRun       :BOOL;
END_VAR
  // Anweisungsteil
  IF IN AND NOT INold THEN
    myRun := TRUE;
    ET := t#0s;
  END_IF;
  
  IF myRun AND (ET < PT) THEN
    ET := ET + DINT_TO_TIME(OB1PreCycle);
    Q := TRUE;

  ELSE
    Q := FALSE;    
  END_IF;
  
  IF Reset THEN
    myRun := FALSE;
    ET    := t#0s;
    Q     := FALSE;
  END_IF;
  
  INold := IN;
END_FUNCTION_BLOCK
Hier noch der generierte AWL Code:
Code:
FUNCTION_BLOCK FB21
FUNCTION_BLOCK FB20
VAR_INPUT
  IN          :BOOL;
  PT          :TIME;
  Reset       :BOOL;
  OB1PreCycle :INT;
END_VAR

VAR_IN_OUT
  ET          :TIME;
END_VAR

VAR_OUTPUT  
  Q           :BOOL;
END_VAR

VAR
  INold       :BOOL;
  myRun       :BOOL;
END_VAR

BEGIN
NETWORK

      SET   
      SAVE  
      =     L      0.1
      U     #INold
      NOT   
      U     #IN
      SPBN  A7d0
      SET   
      =     #myRun
      L     T#0MS
      T     #ET
A7d0: L     #ET
      L     #PT
      <D    
      U     #myRun
      SPBN  A7d1
      L     #OB1PreCycle
      ITD   
      L     #ET
      +D    
      T     #ET
      SET   
      =     #Q
      SPA   A7d2
A7d1: CLR   
      =     #Q
A7d2: CLR   
      U     #Reset
      SPBN  A7d3
      CLR   
      =     #myRun
      L     T#0MS
      T     #ET
      =     #Q
A7d3: CLR   
      U     #IN
      =     #INold
      U     L      0.1
      SAVE  
      BE    
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
O ha.. hammer! Vielen Dank!

Aber durch diesen Code werde ich mich erstmal durcharbeiten müssen.. da sind ein Paar sachen drinnen, die mir beim Überfliegen mal gar nichts sagen...
Dafür sind meine AWL und Programmierkenntnisse noch zu oberflächlich.

Aber Montag muss ich mir erstmal ein MPI-Kabel zusammenbasteln.. einer unserer Programmierer hat mir meines geklaut...
 
Du kannst ja auch einfach eine variable nehmen (INT) und dann legst du fest 0 als Minimum und 999 als Maximum.
Die Auflösung bestimmst du mit dem Komma (also 9,99 Sek, 99,9 Sek, 999 Sek)... Wobei dein wert immer im Bereich 0-999 an die Variable geschrieben wird. Dann kannst du mit einem kleinen FC oder so deine Zeiten bauen.... Ich habe den FC hier schon mal gepostet. Wenn Interesse dann sag bescheid ....
So arbeite ich seit Jahren und bin dadurch insofern flexibel, das ich das auch für Proface Pannels etc. nehmen kann ohne zu denken....
 
Du kannst ja auch einfach eine variable nehmen (INT) und dann legst du fest 0 als Minimum und 999 als Maximum.
Die Auflösung bestimmst du mit dem Komma (also 9,99 Sek, 99,9 Sek, 999 Sek)... Wobei dein wert immer im Bereich 0-999 an die Variable geschrieben wird. Dann kannst du mit einem kleinen FC oder so deine Zeiten bauen.... Ich habe den FC hier schon mal gepostet. Wenn Interesse dann sag bescheid ....

Hier mal der FC von Lazarus:

http://www.sps-forum.de/showpost.php?p=31179&postcount=5

Gruß Kai
 
Zurück
Oben