FUNCTION "UnixTimeStamp" : String { S7_Optimized_Access := 'FALSE' } VERSION : 0.1 VAR_TEMP Leapyears : Int; Days_from_1970 : DInt; days_from_BeginOfYear : Array[1..12] of Int; l_unixtime : DInt; sfc1_ret_val : Int; CDT_systemtime : Date_And_Time; systemtime AT CDT_systemtime : Struct Year_CDT : Byte; Month_CDT : Byte; Day_CDT : Byte; Hour_CDT : Byte; Minute_CDT : Byte; Second_CDT : Byte; MSec : Word; END_STRUCT; Year : Int; Month : Int; Day : Int; Hour : Int; Minute : Int; Second : Int; Msecs : Int; END_VAR BEGIN // Convert system time to unix time // (seconds until 1970-01-01 00:00) #Leapyears := 0; #Days_from_1970 := 0; // days of current month without leap day #days_from_BeginOfYear[1] := 0; #days_from_BeginOfYear[2] := 31; #days_from_BeginOfYear[3] := 59; #days_from_BeginOfYear[4] := 90; #days_from_BeginOfYear[5] := 120; #days_from_BeginOfYear[6] := 151; #days_from_BeginOfYear[7] := 181; #days_from_BeginOfYear[8] := 212; #days_from_BeginOfYear[9] := 243; #days_from_BeginOfYear[10] := 273; #days_from_BeginOfYear[11] := 304; #days_from_BeginOfYear[12] := 334; // read system time #sfc1_ret_val := RD_SYS_T(#CDT_systemtime); #Year := BCD16_TO_INT(#systemtime.Year_CDT) + 2000; #Month := BCD16_TO_INT(#systemtime.Month_CDT); #Day := BCD16_TO_INT(#systemtime.Day_CDT); #Hour := BCD16_TO_INT(#systemtime.Hour_CDT); #Minute := BCD16_TO_INT(#systemtime.Minute_CDT); #Second := BCD16_TO_INT(#systemtime.Second_CDT); #Msecs := BCD16_TO_INT(SHR(IN := #systemtime.MSec, N := 4)); // sum of leap years since 1979 (without current leap year) #Leapyears := ((#Year - 1) - 1968) / 4 - ((#Year - 1) - 1900) / 100 + ((#Year - 1) - 1600) / 400; #Days_from_1970 := (#Year - 1970) * 365 + #Leapyears + #days_from_BeginOfYear[#Month] + #Day - 1; IF ((#Month > 2) AND ((#Year MOD 4 = 0) AND ((#Year MOD 100 <> 0) OR (#Year MOD 400 = 0)))) THEN #Days_from_1970 := #Days_from_1970 + 1; // + leap day, if year is leap year END_IF; // OUTPUT in s #l_unixtime := #Second + 60 * (#Minute + 60 * (#Hour + 24 * #Days_from_1970)); // if error return 0 IF #sfc1_ret_val <> 0 THEN #UnixTimeStamp := ''; ELSE CASE #Msecs OF 0..9: #UnixTimeStamp := CONCAT(IN1 := DELETE(IN := DINT_TO_STRING(#l_unixtime), L := 1, P := 1), IN2 := DELETE(IN := INT_TO_STRING(#Msecs), L := 1, P := 1), IN3 := '00000000'); 10..99: #UnixTimeStamp := CONCAT(IN1 := DELETE(IN := DINT_TO_STRING(#l_unixtime), L := 1, P := 1), IN2 := DELETE(IN := INT_TO_STRING(#Msecs), L := 1, P := 1), IN3 := '0000000'); 100..999: #UnixTimeStamp := CONCAT(IN1 := DELETE(IN := DINT_TO_STRING(#l_unixtime), L := 1, P := 1), IN2 := DELETE(IN := INT_TO_STRING(#Msecs), L := 1, P := 1), IN3 := '000000'); ELSE #UnixTimeStamp := ''; END_CASE; END_IF; END_FUNCTION