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