Problem mit S5Time (Bitbelegung Zeitdauer)

Technikfreak

Level-1
Beiträge
19
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle SPSler.

Ich habe ein Verständnisproblem mit der Verwendung der Bits einer S5Time Variable.
Die Beschreibung hier im Forum über den Aufbau, Zeitbasis usw. habe ich mir durchgelesen, aber ich komme leider nicht weiter.

Code:
L     INTEGERVARIABLE //Diese Variable enthält die Zeit als Int 123 = 12,3 sekunden
ITB   //Wandlung BCD
UW    W#16#FFF // Begrenzung auf 3 Stellen
OW    W#16#1000 // Zeitbasis = 0,1 sekunden
SE    "Timer 1"
U     "Timer 1"
SPB   mach                        // wenn Einschaltverzögerung abgelaufen => Sprungaufruf zu mach

Dieser Teil funktioniert wunderbar. steht 222 in der Int Variable wird nach 22,2 sek genau das gemacht was ich will.

Nun zu meinem Problem. Wenn ich eine Zahl habe die größer als 999 ist, funktioniert dieser Teil nicht mehr. Ich kann also nur Zeiten von 0,1s (1) bis 99,9s (999) vorgeben.

Wie kann ich Zeiten >99,9 verwenden?


Ich dachte an einen Vergleich und eine Änderung der Zeitbasis z.B.:

Code:
L Integervariable
L 999
>I
SPB sek // falls >999 

L     INTEGERVARIABLE //Diese Variable enthält die Zeit als Int 123 = 12,3 sekunden
ITB   //Wandlung BCD
UW    W#16#FFF // Begrenzung auf 3 Stellen
OW    W#16#1000 // Zeitbasis = 0,1 sekunden
SE    "Timer 1"
U     "Timer 1"
SPB   mach                

spa end

sek: NOP 0 // Zeit > 99,9 sek
L     INTEGERVARIABLE //Diese Variable enthält die Zeit zb 1200 soll 120 sekunden sein
L 10 // eine stelle weniger
/I
 ITB   //Wandlung BCD
 UW    W#16#FFF // Begrenzung auf 3 Stellen
 OW    W#16#2000 // Zeitbasis = 1,0 sekunden
 SE    "Timer 1"
 U     "Timer 1"
 SPB   mach    // wenn Einschaltverzögerung abgelaufen => Sprungaufruf zu mach

Hier würde also bei einer Zahl > 999 die Zeitbasis geändert.
leider funktioniert nur der obere Teil der Einschaltverzögerung. Mit der Zeitbasis W#16#2000 stimmen die Zeiten nicht mehr.

Gibt es eine andere Möglichkeit die Zeitdauer von 0.1 Sekunde bis zu 99.9 Minuten variabel als Einschaltverzögerung zu programmieren?
An der Integervariable kann ich nichts ändern. Also 999 muss 99,9 sekundensein, 1234 muss 123,4 Sekunden sein, wobei die Nachkommastelle bei vierstelligen Zahlen wegfallen darf.


Vielen Dank schon Mal für jede Hilfe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nimm doch aus der Standard-Bibliothek unter den IEC-Funktionen den FC40 -> Time zu S5Time

dann musst du nur vor dem Aufruf deine Integervariable mit 100 multiplizieren damit du aus 0,1s Millisekunden erhältst

Fertig ist der Lack
 
ohne erst mal auf die programmierung einzugehen.
wo kommt denn die sollzeit her? eingabepanel oder so?
 
Die Sollzeit bekomme ich als festen Integerwert von der GUI über TCP/IP. Mit der Zeitbasis muss ich leben. Also 1000 = 100 sekunden. Bisher funktionierte alles weil nur Zeiten im Bereich bis 99,9 sekunden gefordert waren, und ich mit ITB ja bis 999 wandeln kann. Leider sind nun auch längere Zeiten erforderlich. Ich werde mal den FC40 ausprobieren ob ich damit besser zurechtkomme.


Trotzdem verstehe ich eins nicht:

L 100
ITB //Wandlung BCD
UW W#16#FFF // Begrenzung auf 3 Stellen
OW W#16#1000 // Zeitbasis = 0,1 sekunden

funktioniert (sind 10 sekunden)

L 100
ITB //Wandlung BCD
UW W#16#FFF // Begrenzung auf 3 Stellen
OW W#16#2000 // Zeitbasis = 1 sekunden

sind keine 100 sekunden. Warum?


@Verpolt: Die Hilfe habe ich schon vorher gelesen. Aber ich verstehe nicht warum es bei mir mit Zeitbasis 1 sekunden nicht funktioniert
 
Du kannst auch die IEC-Timer mit "TIME"-Wert nehmen.

Hast Du nen TIME-Wert ist ein DINT-Wert in ms. Du brauchst also nur Deinen Zahlenwert mit z.B. 1000 multiplizieren um eine Auflösung von 1s zu bekommen.

SFB4 - TON
SFB5 - TOFF
...
 
Gern geschehen. Und wenn ich mal Zeit hab - also die nächsten Tage - schaue ich mir an warum dein Vorschlag nicht funktioniert hat. Auf den ersten Blick konnte ich keinen Fehler erkennen.
 
Gern geschehen. Und wenn ich mal Zeit hab - also die nächsten Tage - schaue ich mir an warum dein Vorschlag nicht funktioniert hat. Auf den ersten Blick konnte ich keinen Fehler erkennen.

Ich schätze, dass es daran liegt, dass nicht nur die Besimmung des Zeitwertes in der bedingten Bearbeitung stattfindet sondern der Aufruf des imers auch. Überspringen von Timer-Aufrufen ist immer so eine Sache 8)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm gut zu wissen. Ich arbeite relativ häufig mit Sprungbefehlen und hab da bisher nicht besonders drauf geachtet. Vieleicht liegt es auch am PLC Sim? Habe den Programmcode nur simuliert und nicht auf echter Hardware ausprobiert. Hatte mal irgendwo gelesen, dass PLC Sim Zeiten wohl nicht 100% korrekt simuliert.
 
Hm gut zu wissen. Ich arbeite relativ häufig mit Sprungbefehlen und hab da bisher nicht besonders drauf geachtet. Vieleicht liegt es auch am PLC Sim? Habe den Programmcode nur simuliert und nicht auf echter Hardware ausprobiert. Hatte mal irgendwo gelesen, dass PLC Sim Zeiten wohl nicht 100% korrekt simuliert.

Ist abhängig von deiner Version und bezog sich glaube ich nur auf die TON/TOF-Zeiten
 
Hallo an alle SPSler.

Ich habe ein Verständnisproblem mit der Verwendung der Bits einer S5Time Variable.
Die Beschreibung hier im Forum über den Aufbau, Zeitbasis usw. habe ich mir durchgelesen, aber ich komme leider nicht weiter.

Code:
L     INTEGERVARIABLE //Diese Variable enthält die Zeit als Int 123 = 12,3 sekunden
ITB   //Wandlung BCD
UW    W#16#FFF // Begrenzung auf 3 Stellen
OW    W#16#1000 // Zeitbasis = 0,1 sekunden
SE    "Timer 1"
U     "Timer 1"
SPB   mach                        // wenn Einschaltverzögerung abgelaufen => Sprungaufruf zu mach

Dieser Teil funktioniert wunderbar. steht 222 in der Int Variable wird nach 22,2 sek genau das gemacht was ich will.

Nun zu meinem Problem. Wenn ich eine Zahl habe die größer als 999 ist, funktioniert dieser Teil nicht mehr. Ich kann also nur Zeiten von 0,1s (1) bis 99,9s (999) vorgeben.

Wie kann ich Zeiten >99,9 verwenden?


Ich dachte an einen Vergleich und eine Änderung der Zeitbasis z.B.:

Code:
L Integervariable
L 999
>I
SPB sek // falls >999 

L     INTEGERVARIABLE //Diese Variable enthält die Zeit als Int 123 = 12,3 sekunden
ITB   //Wandlung BCD
UW    W#16#FFF // Begrenzung auf 3 Stellen
OW    W#16#1000 // Zeitbasis = 0,1 sekunden
SE    "Timer 1"
U     "Timer 1"
SPB   mach                

spa end

sek: NOP 0 // Zeit > 99,9 sek
L     INTEGERVARIABLE //Diese Variable enthält die Zeit zb 1200 soll 120 sekunden sein
L 10 // eine stelle weniger
/I
 ITB   //Wandlung BCD
 UW    W#16#FFF // Begrenzung auf 3 Stellen
 OW    W#16#2000 // Zeitbasis = 1,0 sekunden
 SE    "Timer 1"
 U     "Timer 1"
 SPB   mach    // wenn Einschaltverzögerung abgelaufen => Sprungaufruf zu mach

Hier würde also bei einer Zahl > 999 die Zeitbasis geändert.
leider funktioniert nur der obere Teil der Einschaltverzögerung. Mit der Zeitbasis W#16#2000 stimmen die Zeiten nicht mehr.

Gibt es eine andere Möglichkeit die Zeitdauer von 0.1 Sekunde bis zu 99.9 Minuten variabel als Einschaltverzögerung zu programmieren?
An der Integervariable kann ich nichts ändern. Also 999 muss 99,9 sekundensein, 1234 muss 123,4 Sekunden sein, wobei die Nachkommastelle bei vierstelligen Zahlen wegfallen darf.


Vielen Dank schon Mal für jede Hilfe.

Mir fehlt da das VKE, das den Timer starten soll... vielleicht ist das Dein Problem bei dem "2000" - Problem.
In dem Teil ab "sek:" wird das VKE immer "1" sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das VKE habe ich weggelassen. Der Timer wird über "UN E0.0" gestartet, wobei das Signal kurzzeitig 1 wird und der bedingte Sprungaufruf nur ausgeführt wird wenn kein 1 Signal innerhalb der Zeit der Integervariable ankommt.
 
Borromeus hat recht. Hab ich übersehen...

Du musst dann aber auch den Timer mit "UN E0.0" Starten. Momentan hängt das Starten vom Timer ausschließlich davon ab, ob deine Integervariable größer ist als 999 oder eben nicht. Da wird das letzte mal vor dem Starten des Timers das VKE verändert... so kanns nicht klappen.
 
Das VKE habe ich weggelassen. Der Timer wird über "UN E0.0" gestartet, wobei das Signal kurzzeitig 1 wird und der bedingte Sprungaufruf nur ausgeführt wird wenn kein 1 Signal innerhalb der Zeit der Integervariable ankommt.
Ist "SPB" erfüllt springt die SPS und das VKE ist "1".
Da nützt Dir die davorliegende Abfrage nichts.
Ab "SPB sek:" und Sprung auf "sek:" ist das VKE "1".

Gruß
Karl
 
Zurück
Oben