TIA Modulo mit TIA 15 mit VB Script

Wenn ich dazu komme dann schreib' ich nach dem Mittag mal meinen AWL-Baustein in SCL um.
Der Siemens-Baustein ist ja eine Katastrophe, den ich echt in keiner produktiven Steuerung einsetzen würde.

Harald

Harald was hältst davon? Hab ihn mal schnell in MOD umgeschrieben:

Code:
FUNCTION_BLOCK "SecToTime"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      dwSeconds : DWord;
   END_VAR


   VAR_OUTPUT 
      years : DInt;
      days : DInt;
      hours : DInt;
      minutes : DInt;
      seconds : DInt;
   END_VAR


   VAR 
      statValue : DInt;
   END_VAR


   VAR_TEMP 
      tempSec : DInt;
   END_VAR




BEGIN
    //Dieses Programm enthält einen Zeitwandler, der einen Sekundenwert in Jahre, Tage, Stunden, Minuten und Sekunden umwandelt.
    //This program consists a time converter, that converts a value of seconds into years, days, hours, minutes and seconds.
    //
    //Der Eingabewert (in Sekunden) wird in die statische Variable statValue übertragen.
    //The input value (in seconds) will transfer in the static variable statValue.
    #statValue := DWORD_TO_DINT(#dwSeconds);
    
    //Initialisierung / Initialization
    #years := 0;
    #days := 0;
    #hours := 0;
    #minutes := 0;
    #seconds := 0;
    
    //Berechne die Jahre, 1 Jahr = 31536000s
    //Calculate the Years, 1 Year  = 31536000s.
    #years := #statValue / 31536000;
    IF #years > 0 THEN
        #statValue := #statValue MOD (31536000 * #years);
    END_IF;
    
    //Berechne die Tage, 1 Tag = 86400s
    //Calculate the days, 1 day  = 86400s.
    
    #days := #statValue / 86400;
    IF #days > 0 THEN
        #statValue := #statValue MOD (86400 * #days);
    END_IF;
    
    //Berechne die Stunden, 1 Stunde = 3600s.
    //Calculate the hours, 1 hour  = 3600s.
    #hours := #statValue / 3600;
    IF #hours > 0 THEN
        #statValue := #statValue MOD (3600* #hours);
    END_IF;
    
    //Berechne die Minuten, 1 Minute = 60s.
    //Calculate the minutes, 1 minute  = 60s.
    #minutes := #statValue / 60;
    IF #minutes > 0 THEN
        #statValue := #statValue MOD (60* #minutes);
    END_IF;
    
    //Berechne die Sekunden, 1 Sekunde = 1s.
    //Calculate the seconds, 1 second  = 1s.
    
    IF #statValue < 60 THEN
        #seconds := #statValue;
    END_IF;
    
END_FUNCTION_BLOCK

Baustein habe ich gerade online getestet. Funktioniert
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ohne Worte... :ROFLMAO: *ROFL*
Nanu, kein Kommentar zu ...
Code:
// ...
    //Speichere Sekunden / Save the seconds
    #tempSec := #statValue;
END_FUNCTION_BLOCK
... ?
Finde ich auch nicht schlecht. Der Praktikant wurde nach Anzahl CodeZeilen und insbesondere Anzahl Kommentaren bezahlt - zumindest war er überzeugt davon.;)

Naja, wenigstens ist der Scheixx sehr schön zweisprachig kommentiert...
It seems, the author will transfer his own "input value" to the static memory for future generations. :ROFLMAO:

Edit:
Hab ihn mal schnell in MOD umgeschrieben:
Da es Dir auf die verschenkten 68 Jahre anscheinend nicht ankommt, sollte es - "quick & dirty" zusammengestrichen - auch tun:
Code:
[COLOR=#222222][FONT=Verdana]    #statValue := DWORD_TO_DINT(#dwSeconds);[/FONT][/COLOR]

[COLOR=#222222][FONT=Verdana]    #years := #statValue / 31536000 ;[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]    #statValue := #statValue MOD 31536000 ;[/FONT][/COLOR]

[COLOR=#222222][FONT=Verdana]    #days := #statValue / 86400;[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]    #statValue := #statValue MOD 86400 ;[/FONT][/COLOR]

[COLOR=#222222][FONT=Verdana]    #hours := #statValue / 3600;[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]    #statValue := #statValue MOD 3600 ;[/FONT][/COLOR]

[COLOR=#222222][FONT=Verdana]    #minutes := #statValue / 60;[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]    #seconds := #statValue MOD 60 ;[/FONT][/COLOR]
 
Zuletzt bearbeitet:
Hier ein Baustein in AWL (Step7 classic):
Code:
FUNCTION "Seconds2Struct" : VOID
TITLE =UDINT Sekunden in Time-Struktur zerlegen
(...)
und hier in TIA-SCL (mit Ausgabe der Zeitteile einzeln anstatt Struct):
Code:
FUNCTION "Seconds2TimePart" : Void
TITLE = UDINT Sekunden in Time-Parts zerlegen (S7-300/400)
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : 'PN/DP'
VERSION : 0.1
   VAR_INPUT 
      udSeconds : DWord;   [COLOR="#008000"]// UDINT 0 .. 4.294.967.295 Sekunden[/COLOR]
   END_VAR

   VAR_OUTPUT 
      Years   : Int;   [COLOR="#008000"]// 0..136[/COLOR]
      Days    : Int;   [COLOR="#008000"]// 0..364[/COLOR]
      Hours   : Int;   [COLOR="#008000"]// 0..23[/COLOR]
      Minutes : Int;   [COLOR="#008000"]// 0..59[/COLOR]
      Seconds : Int;   [COLOR="#008000"]// 0..59[/COLOR]
   END_VAR

   VAR_TEMP 
      tmpdwWork : DWord;
      tmpdiBit0 : DInt;
      tmpdiSeconds : DInt;
   END_VAR
BEGIN
[COLOR="#008000"]   // UDINT Sekunden in Time-Parts zerlegen (S7-300/400)
   // max 4.294.967.295 Sekunden = 136Y:70D:6H:28M:15S
   // SekundenProJahr = 365 * 24 * 60 * 60 = 31.536.000[/COLOR]

   #tmpdwWork := #udSeconds;  [COLOR="#008000"]// Input nach TEMP kopieren falls Übergabe byRef[/COLOR]
   #tmpdiBit0 := DWORD_TO_DINT(#tmpdwWork AND 1);             [COLOR="#008000"]// #udSeconds.X0[/COLOR]
   #tmpdiSeconds := DWORD_TO_DINT(SHR(IN:=#tmpdwWork, N:=1)); [COLOR="#008000"]// UDINT(#udSeconds)/2[/COLOR]

   #Years   := DINT_TO_INT(#tmpdiSeconds / 15768000); [COLOR="#008000"]// #udSeconds/2 / SekundenProJahr/2[/COLOR]

   #tmpdiSeconds := (#tmpdiSeconds MOD 15768000) * 2 + #tmpdiBit0; [COLOR="#008000"]// RestSekunden des Jahres[/COLOR]
   #Seconds := DINT_TO_INT( #tmpdiSeconds MOD 60);
   #Minutes := DINT_TO_INT((#tmpdiSeconds / 60) MOD 60);
   #Hours   := DINT_TO_INT((#tmpdiSeconds / (60*60)) MOD 24);
   #Days    := DINT_TO_INT( #tmpdiSeconds / (24*60*60) );

END_FUNCTION
Harald
 
Da es Dir auf die verschenkten 68 Jahre anscheinend nicht ankommt, sollte es - "quick & dirty" zusammengestrichen - auch tun:

Ok, hab Fehler gesehen. Man sollte im Eifer des Gefechts nachmal drüber nachdenken was man runter schreibt. Aber mal kurz ne Frage, da es mein erster SCL Code war, warum muss ich den Null nicht abfangen? Deswegen habe ich die If rein gemacht.
 
Zurück
Oben