OSCAT Forum

oscat.lib => oscat.lib fuer Step 7 => Thema gestartet von: mg in 16. Dezember 2025, 06:36:59

Titel: S7-1200 Reglerbausteine (SYSTEM_TIME)
Beitrag von: mg in 16. Dezember 2025, 06:36:59
Da geisterte ca. 2020 eine KORREKT übersetzte Oscat für die S7-1200 rum.
Ich habe sie verwendet. Die ist aber dermaßen falsch, dass ich mich zu diesem Kommentar gezwungen sehe.
Ich veröffentliche hier die Reglerbausteine im Klartext. (anders geht es nicht mehr, UND BITTE TESTEN vor dem Verwenden)
(Für meine Anwendungsfall ging es perfekt)

Verwendet wurde eine S7-1212 (FW 3.1 ist schon ziemlich alt sollte für alle neueren funktionieren)
Die Reglerbausteine (siehe folgende Blogs) wurden im meinem Fall nicht unter dem MAIN-Task verwendet sondern unter CYL (333ms).
Wenns jemand für MAIN verwenden will bitte auch vorher testen.

Dazu wurde erst mal die System_Time aus der besagten nicht funktionierende LIB verändert (im Orig.Oscat gib es dafür die T_PLC_us und die T_PLC_ms)
Systembdingt gibt es T_PLC_us, T_PLC_ms immer noch ABER VERÄNDERT siehe weitere BLOGs
Die SYSTEM_TIME sollte unter dem MAIN Task eingebunden werden


System_Time
Input                               
                                   
Output                               
                                   
InOut                               
                                   
Static                               
    Systemzeit_    DTL    DTL#1970-01-01-00:00:00    True    True    True    True       
    Systemzeit_Err_i    Int    0    True    True    True    False       
    old_systemzeit_    DTL    DTL#1970-01-01-00:00:00    True    True    True    False       
    fast_time_t    Time    T#0ms    True    True    True    False       
    ms_dw    DWord    16#0    True    True    True    False       
    us_dw    DWord    16#0    True    True    True    False       
    old_Systemzeit_MINUTE    UDInt    0    False    False    False    False       
    Minutes_    UDInt    0    False    False    False    False       
    check1_    DTL    DTL#1970-01-01-00:00:00    True    True    True    False       
    check2_    DTL    DTL#1970-01-01-00:00:00    True    True    True    False       
    check3_    Time    T#0ms    True    True    True    False       
    check4_    DWord    16#0    True    True    True    False       
    check5_    Int    0    True    True    True    False       
Temp                               
    T_DIFF_ENO_x    Bool                           
Constant                               
                                   

#Systemzeit_Err_i:=RD_SYS_T(OUT=>#"Systemzeit_");
// ************* MILLISEKUNDEN *****************
IF #"old_systemzeit_"=DTL#1970-01-01-00:00:00 THEN
    #"old_systemzeit_":=#"Systemzeit_";
END_IF;
#fast_time_t:=T_DIFF(IN1:=#"Systemzeit_", IN2:=#"old_systemzeit_", ENO=>#T_DIFF_ENO_x);
IF NOT #T_DIFF_ENO_x THEN
    #"old_systemzeit_":=T_SUB(IN1:=#"old_systemzeit_", IN2:=T#-24d_20h_31m_23s_648ms);
    #"check1_":=#"old_systemzeit_";
    #"old_systemzeit_":=T_ADD(IN1:=#"old_systemzeit_", IN2:=T#24d_20h_31m_23s_647ms);
    #"check2_":=#"old_systemzeit_";
    #"check3_":=T_DIFF(IN1:=#"Systemzeit_", IN2:=#"old_systemzeit_");
    #"check4_":=TIME_TO_DWORD(#fast_time_t);
    #"check5_":=#"check5_"+1;
    #T_DIFF_ENO_x:=TRUE;
END_IF;
#ms_dw:=TIME_TO_DWORD(#fast_time_t);
#us_dw:=SHL(IN:=#ms_dw,N:=10);      // entspricht einer DIV durch 1000, stimmt nicht ganz genau weil das ist [ms]*1024 sollte aber ausreichend sein