Systemzeit S7

stricky

Level-2
Beiträge
254
Reaktionspunkte
15
Zuviel Werbung?
-> Hier kostenlos registrieren
Tach,

kennt einer ne Möglichkeit die Systemzeit einer S7 hochzusetzen ... bis kurz vorm Überlauf ... möchte das gerne Testen und nicht 20 Tage warten :)

gruß stricky

P.S. vielleicht im PLCSIM ... das würde schon reichen
 
Laut Step7 Hilfe wird der Wert der Systemzeit nur mit den Betriebszuständen beeinflusst.

Ich denke da hilft nur warten und hoffen dass niemand die Steuerung ausschaltet.:rolleyes:

Guenni
 
@guenni ... hab ich mir auch gedacht, aber alle 21 tage warten :-(

Ich denke das geht ( was ich programmiert habe ), falls nicht hab ich dann ein problem ....

So keiner eine Idee ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
da hatte ich dich falsch verstanden. ich dachte du wolltest die uhrzeit stellen. wie man die von dir gemeinte systemzeit beeinflussen könnte weiss ich nicht.

aber wo liegt der sinn? vielleicht kann man das ja auch anders lösen.
 
@volker,

halt nur um zu testen ob das funktioniert was ich gemacht habe ... fahre morgen nach ungarn ... bin denke ich in 14tagen da durch und kann es somit leider nicht sehen ob mein "taktgeber / zeitnehmer" dann noch genau geht ....
oder hängen bleibt


gruß stricky
 
Hallo stricky,

warum postest du nicht einfach den code? Sicherlich sind wir beide nicht die einzigen, die die Systemzeit zur Zeitsteuerung nutzen.


Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nix leichter als das ....
Code:
FUNCTION_BLOCK FB20  // Bewegung erkennen

VAR_INPUT
 Position:INT; // Daten 
END_VAR

VAR_OUTPUT
 Vor:BOOL; // Antrieb fährt vor
 Rueck:BOOL; // Antrieb fährt zurück
 Speed:REAL; // Geschwindigkeit in mm/s
END_VAR

VAR
 Sys_Time_akt:TIME; // Systemzeit
 Sys_Time_old:TIME; // Systemzeit
 Cycletime:TIME;
 Cycletime2:TIME;
 Daten:ARRAY [1..11] OF INT;
 Mittel:DINT;
END_VAR

VAR_TEMP
 i:INT;
 bie:BOOL;
END_VAR

LABEL

END_LABEL

BEGIN
 
  Sys_Time_akt:=sfc64();
     
  IF Sys_Time_akt < T#100ms AND Sys_Time_old > t#2147483000ms THEN
   Sys_time_Old:= Sys_time_Old - T#2147483647ms;
  END_IF;       
      
  Cycletime:= Sys_time_Akt - Sys_time_Old; // Zeit seit letztem negativen Flankenwechsel vom Signal
  Sys_time_Old:=Sys_time_Akt;
  
  Cycletime2:=Cycletime2 + Cycletime;

// Takt 100ms - Werte ins Array schreiben
  IF Cycletime2 >= t#100ms THEN
    
    IF Cycletime2 >= T#200ms THEN
      Cycletime2:=t#100ms;
    END_IF;

    Cycletime2:=Cycletime2 - T#100ms;
  
  // Daten wegspeichern
    FOR i:= 9 TO 1 BY - 1 DO
       Daten[i+1]:=daten[i];
    END_FOR;

    Daten[1]:=position - daten[11];
    daten[11]:=position;
    
    Mittel:=0;  
    FOR i:= 1 TO 10 DO
      Mittel:=Mittel + INT_TO_DINT(daten[i]);
    END_FOR;

    IF mittel = 0 THEN
      Speed:=0.0;
    ELSE
      Speed:=( Speed + DINT_TO_REAL(Mittel) ) / 2.0 ;   
    END_IF;    
  END_IF;

// Motion detection - vor/zurück  
  IF speed > 0.0 THEN
      vor:=true;
      rueck:=false;
      Bie:=true;
  ELSIF speed < 0.0 THEN
      vor:=false;
      rueck:=true;
      Bie:=true;
  ELSe 
      vor:=false;
      rueck:=false;
      Bie:=false;
  END_IF;
 
  OK:=bie;
   
END_FUNCTION_BLOCK


ist ne Bewegungserkennung einer Presse und Geschwindigkeitsanzeige ...

Gruß stricky
 
Hallo stricky,

Code:
  IF Sys_Time_akt < T#100ms AND Sys_Time_old > t#2147483000ms THEN
Diesen Vergleich verstehe ich (noch) nicht so ganz.
Jedenfalls erscheint es mir etwas unlogisch.


Bevor ich mich jetzt bei der Umsetzung nach SCL vertue, poste ich erst mal meine Variante in AWL.
Code:
//*** Zeit zählen
      L     "SYS_TIME"
      L     #TIMETICK_ALT
      -D    
      SPPZ  M001                        // Korrektur bei Überlauf
      L     L#2147483647                // der Systemzeit
      +D    
M001: L     #TIMER_SE_SA
      +D    
      T     #TIMER_SE_SA
 
//*** Zeit nachführen
      L     "SYS_TIME"
      T     #TIMETICK_ALT
"SYS_TIME" ist die aktuelle Systemzeit. Ist die Differenz zur "alten" Systemzeit negativ, wird dies durch Addition des Maximalwertes korrigiert. Das ist eigentlich alles, was man beachten muss. Ich hoffe, du kommst damit klar?


In SCL und mit deinen Variablen könnte es in etwa so aussehen.
Code:
  Sys_Time_akt:=sfc64();
  Cycletime:= Sys_time_Akt - Sys_time_Old; // Zeit seit letztem negativen Flankenwechsel vom Signal
  IF Cycletime < T#0ms THEN
     Cycletime := Cycletime + T#2147483647ms;
  END_IF;     
  Sys_time_Old:=Sys_time_Akt;
  Cycletime2:=Cycletime2 + Cycletime;


Bei älteren CPUs gab es angeblich mal einen Fehler in der Systemzeit. Du hast aber sicherlich eine neue CPU?


Gruß, Onkel
 
Zuletzt bearbeitet:
moin onkel,

ist ne 315-2ag10 -- sollte keine probs machen ..

der erste vergleich ist nur dazu da, wenn der überlauf war und halt die zeit < 100ms ist und die "alte zeit" kurz vorm überlauf steht ( halt im letzten Zyklus )
.... könnte das natürlich auch auf kleiner 0 abfragen ... werde mal schaun ... dank dir erstmal

Schöner ist natürlich die Zeit einfach zu setzen und schaun was passiert und nicht zu warten :) ... werde mal die hotline interviewen

Danke und gruß stricky
 
Zurück
Oben