My favorite time format for time stamping events is to use Unix Time. The AB Logix 5000 controllers offer time in a format that is similar, but requires some conversion. Here is code for a RedLion device that does that conversion.
//convert timestamp from Allen Bradley Logix 5000 style to unixtime style timestamp
// Sparky Geek, LLC - March 2016
// rev 01 - July 2016 - added unsigned to float program call
// changed program to pass 2 numbers instead of PLC number
// moved initialization of constants to seperate program
//Allen Bradley time is in the format of:
// DINT[0] contains the lower 32 bits of the value. DINT[1] contains the upper 32 bits of the value.
// The value is in microseconds and is referenced from 0000 hours, January 1, 1972.
// both of these values are unsigned integers, but are commonly incorrectly displayed as signed integers
// newer AB PLCs reference from 1970, just like unixtime, but V11 uses 1972
//Unix time (also known as POSIX time or Epoch time) is a system for describing instants in time,
// defined as the number of seconds that have elapsed since 00:00:00 Coordinated Universal Time (UTC),
// Thursday, 1 January 1970, not counting leap seconds.
cstring working_str;
//convert unsigned integer to a float --lower value
working_str = UintToFloat(In_Low);
TextToR64(working_str,TimeStampConvert.lower[0]);
//convert unsigned integer to a float --upper value
working_str = UintToFloat(In_Hi);
TextToR64(working_str,TimeStampConvert.upper[0]);
//move upper value to upper register
MulR64(TimeStampConvert.upperMoved[0],TimeStampConvert.upper[0],TimeStampConvert._2E32[0]);
//microseconds since 1972
AddR64(TimeStampConvert.ab_time_us[0],TimeStampConvert.upperMoved[0],TimeStampConvert.lower[0]);
//seconds since 1972
DivR64(TimeStampConvert.ab_time_sec[0],TimeStampConvert.ab_time_us[0],TimeStampConvert._1Million[0]);
//seconds since 1970 = unixtime
AddR64(TimeStampConvert.unixtime[0],TimeStampConvert.ab_time_sec[0],TimeStampConvert.delta_sec[0]);
//convert to text
return AsTextR64WithFormat("12.2.0",TimeStampConvert.unixtime[0]);
The call to UintToFloat() is described at blog.briangallimore.com/2016/07/28/convert-unsigned-integer-to-float/
There is another program that runs once on startup that initializes the constants used in this program:
//initialize variables (constants) used in the 'timestampConvert' program // Sparky Geek, LLC - July 2016 cstring TwoE32 = "4294967296"; //the value of 2 raised to the 32nd power cstring TwoE31 = "2147483648"; //the value of 2 raised to the 31st power int OneMillion = 1000000; //difference between microseconds (used in AB time) and seconds (used in unix time) int DeltaSeconds = 63072000; //difference in time (seconds) between 1970 (unix time) and 1972 (old AB time) //initialize 64 bit registers to hold values used in other programs TextToR64(TwoE32,TimeStampConvert._2E32[0]); //2^32 TextToR64(TwoE31,TimeStampConvert._2E31[0]); //2^31 IntToR64(TimeStampConvert._1Million[0],OneMillion); //difference between seconds and microseconds IntToR64(TimeStampConvert.delta_sec[0],DeltaSeconds); //difference in seconds between 1970 to 1972


