referring now to fig1 , an industrial control system 10 is illustrated . the industrial control system 10 utilizes programmable input / output ( i / o ) circuits that are described in greater detail below . it should be noted that the industrial control system 10 is merely one example of an industrial control system that could utilize the present invention , and that other systems are also possible . the industrial control system 10 comprises a programmable control system 12 that controls the output status of a plurality of output devices 14 based on the input status of a plurality of input devices 16 . to this end , the programmable control system 12 has a microprocessor - based processor module 17 that executes a stored control program which defines the manner in which the output devices 14 are controlled . the processor module 17 communicates with the i / o devices 14 and 16 by way of an i / o module 18 . in particular , the processor module 17 transmits a digital representation of the desired output status of the output devices 14 to the i / o module 18 . based on the digital representation of the desired output status of the output devices 14 , the i / o module 18 produces an output control signal that is capable of driving the output devices 14 in the desired manner . likewise , the processor module 17 receives a digital representation of the input status of the input devices 16 from the i / o module 18 . the i / o module 18 produces the digital representation of the input status of the input devices 16 based on input status signals received from the input devices 16 . in a present example , a controlled safety process 40 includes a light curtain 42 providing redundant light curtain signals 44 to the i / o module 18 and a press 46 that may be stopped via a halt signal 48 sent to the press 46 from the i / o module 18 . the safety process 40 is designed to stop the press 46 if the plane of the light curtain 42 is crossed . the speed of response , i . e ., the safety reaction time , of the i / o module 18 in halting the press 46 after an object cross the plane of the light curtain 42 is factored into the calculation to determine the required amount of separation between the light curtain 42 and the press 46 . referring now to fig2 , i / o module 18 includes primary processing unit 50 a communicating via a serial communication protocol known in the art to partner processing unit 50 b . primary processing unit 50 a includes a first , or controlling processor , or cpu , 52 a and a system clock 53 a , both of which are driven by a single clock source 54 a . the system clock 53 a in a preferred embodiment increments in one microsecond intervals . the cpu 52 a has an internal rom 56 a ( read only memory ) which holds an executive , or firmware , image 58 a of executables 60 a comprised of safety critical functions 61 a , diagnostic code 62 a , and non - safety functions 63 a . cpu 52 a further includes a flag 64 a and a timer interrupt function implemented with a compare register 66 a wherein the compare register 66 a is loaded with a preset time value . when the system clock 53 a reaches the value stored in the compare register 66 a , cpu 52 a will interrupt the execution of the executive image 58 a . partner processing unit 50 b includes mostly the same , though independent , components including a processor 52 b and system clock 53 b driven by a single clock source 54 b , rom 56 b , firmware image 58 b of slightly different executables 60 b comprised of safety critical functions 61 b , diagnostic code 62 b and non - safety functions 63 b , flag 64 b and compare register 66 b providing the same timer interrupt functionality . fig3 is a visual representation of the process wherein i / o module 18 performs the safety timer cross - check diagnostic 100 beginning at start blocks 104 , 108 representing a “ safety loop ” initialization process . the safety loop initialization process serves two functions ; it ensures that both cpus 52 a , 52 b have interrupts loaded prior to entry of the safety loop and it also synchs up the two cpus 52 a , 52 b to begin the safety loop at the same time . this synching is shown by a rendezvous message 106 and an acknowledgement message 110 between the two processing units 50 a , 50 b . as previously mentioned , timer compare registers 66 a , 66 b are used to generate the interrupts in cpus 52 a , 52 b . in a preferred embodiment , the first interrupt is scheduled in cpu 52 a , acting as controlling cpu , by loading compare register 66 a with a value representing the 6 ms from when the previous interrupt was scheduled to occur . the 6 ms time period represents the rated safety reaction time of the i / o module 18 . an interrupt is also scheduled in cpu 52 b , acting as monitoring cpu , to occur at a time slightly longer than the 6 ms time loaded into cpu 52 a . the extra time , e . g ., 0 . 1 ms , acts as a cushion or tolerance and is necessary due to the slight delay between cpu 52 a being interrupted and processing unit 50 a sending a rendezvous message to processing unit 50 b as well as to allow for slight time differences between the processing units 50 a , 50 b . after the interrupts have been scheduled , i . e ., after the timer compare registers 66 a , 66 b have been loaded , processing units 50 a , 50 b have essentially begun executing a first safety loop 127 . as previously discussed , in the first safety loop 127 , while running the diagnostic 100 , processing unit 50 a acts as the controlling unit while partner processing unit 50 b acts as the monitoring unit . as shown in blocks 112 and 114 , cpus 52 a , 52 b in each processing unit 50 a , 50 b process the executables 60 a , 60 b , including safety critical functions 61 a , 61 b and non - safety functions 63 a , 63 b . after completing the safety functions 61 a which in this example this typically occurs after 4 ms have elapsed , an internal flag 64 a is set . this flag indicates that the safety critical functions 61 a , have been completed by the controlling cpu 52 a within the rated safety reaction time . thereafter , cpu 52 a executes non - safety functions 63 a while waiting for the timer interrupt , shown as block 116 . meanwhile , cpu 52 b finishes executing safety critical functions 61 b , sets flag 64 b and begins executing non - safety functions 63 b while waiting for either rendezvous message 120 from processing unit 50 a or for its own timer interrupt , shown as block 122 . when the system clock 53 a matches the scheduled interrupt time loaded in the timer compare register 66 a , i . e ., after 6 ms have elapsed based on the input from clock source 54 a , cpu 52 a interrupts the processing of the executive image 58 a . alternatively , instead of loading the timer compare register 66 a to interrupt after the safety reaction time has elapsed , cpu 52 a could repeatedly poll a timer or counter to determine when the time has elapsed . however , this is not the preferred approach as it offers no watchdog function to protect against the case where cpu 52 a encounters unexpected delays . after the interrupt occurs , cpu 52 a immediately schedules a new interrupt to occur after another 6 ms plus the cushion have elapsed . the cushion is included because cpu 52 a becomes the monitoring unit during the next safety loop 128 . the interrupt is scheduled by loading the compare register 66 a with a value representing the next desired interrupt time and is scheduled immediately after the previous interrupt to ensure that processing system 50 a is always protected against any unexpected delays . cpu 52 a next checks whether or not flag 64 a is set . if flag 64 a is not set , i . e ., all the safety critical functions 61 a were not completed , a hard or critical fault occurs . processing unit 50 a goes into a safe state and then resets . if the flag 64 a is set , a rendezvous signal 120 is sent to processing unit 50 b from block 118 to indicate that the time value loaded into compare register 66 a , i . e ., the safety reaction time of 6 ms , has elapsed as perceived by processing unit 50 a . in block 122 , processing unit 50 b receives the rendezvous signal 120 and promptly replies with an acknowledgement signal 124 . in the event of an unexpected delay or inaccurate clock such that cpu 52 b is interrupted before receiving rendezvous signal 120 , a critical fault will occur wherein the processing unit 50 b will go into a safe state and then reset . otherwise , after receiving rendezvous message 120 , cpu 52 b checks whether or not flag 64 b is set , indicating that all safety functions 61 b have been completed . if flag 64 b is not set , a critical fault will also occur . if flag 64 b is set , processing unit 50 b determines whether or not the elapsed safety reaction time , as determined by cpu 52 a using clock source 54 a , is within the allowable range or cushion ( decision block 130 ). in essence , processing unit 50 b is checking the accuracy of clock source 54 a by comparing what processing unit 50 a determined 6 ms to be against what processing unit 50 b , using clock source 54 b , determined 6 ms ( plus the cushion ) to be . if the safety reaction time of processing unit 50 a is not within an acceptable range , the processing unit 50 b will fault , shown as block 132 . if the safety reaction time of processing unit 50 a is within the acceptable range , processing unit 50 b moves to block 134 and schedules the next interrupt . since cpu 52 b will act as the controlling cpu in the next safety loop 128 , the value loaded into timer compare register 66 b is the value of 6 ms from the current time . at this point , the roles of the primary processing unit 50 a and partner processing unit 50 b are reversed wherein the primary processing unit 50 a becomes the monitoring processing unit while partner processing unit 50 b becomes the controlling processing unit . this symmetry , i . e ., role - swapping , is useful because at this point in the diagnostic 100 , only the clock source 54 a of primary processing unit 50 a has been verified as being accurate . by swapping roles , the diagnostic 100 ensures that both cpus 52 a , 52 b have the ability to accurately measure time as well as the ability to interrupt to generate a fault . as shown in blocks 126 and 136 , cpus 52 a , 52 b of each processing unit 50 a , 50 b process the executables 60 a , 60 b , including safety critical functions 61 a , 61 b again . after completing the safety functions 61 a , 61 b , internal flags 64 a , 64 b are set . thereafter , cpu 52 b waits for its timer interrupt shown as block 138 while cpu 52 a waits for either rendezvous message 142 from processing unit 50 b or for its own timer interrupt . when the system clock 53 b matches the scheduled interrupt time value loaded in timer compare register 66 b , i . e ., after 6 ms have elapsed based on the input from clock source 54 b , cpu 52 b interrupts processing . after the interrupt , the cpu 52 b immediately schedules a new interrupt ( with cushion ) to prepare for monitoring , as previously discussed . next , cpu 52 b checks whether or not the flag 64 b is set . if flag 64 b is not set , a critical fault occurs in processing unit 50 b which goes to a safe state and then resets . if the flag 64 b is set ( block 140 ), a rendezvous signal 142 is sent to processing unit 50 a to indicate that the time loaded into compare register 66 b , i . e ., the safety reaction time of 6 ms , has elapsed as determined by processing unit 50 b using clock source 54 b . processing unit 50 a meanwhile receives signal 142 ( block 144 ) and promptly replies with acknowledgement signal 146 . processing unit 50 b enters a new safety loop and begins processing safety functions 61 a ( shown as return path 148 to safety loop 127 ). in the event that cpu 52 a is interrupted before receiving rendezvous signal 142 , ( as a result of an unexpected delay or inaccurate clock ), a critical fault occurs wherein the processing unit 50 a will go to a safe state and then reset . after receiving rendezvous signal 142 , cpu 52 a checks whether or not flag 64 a is set . if flag 64 a is not set , a critical fault would also occur . if flag 64 a is set , processing unit 50 a ( decision block 150 ) determines whether or not the elapsed safety reaction time , as calculated by cpu 52 b using clock source 54 b , is within the allowable range or cushion . if the safety reaction time , as determined using clock source 54 a , is not within the acceptable range , the processing unit 50 a will fault , shown as block 152 . if the safety reaction time is within the acceptable range , processing 50 a unit moves to block 154 where the next interrupt is scheduled . since 52 a will be the controlling cpu again , the value loaded into timer compare register 66 a would be 6 ms from the time the last interrupt was scheduled by cpu 52 a , in block 116 ( ensuring that the combined time of safety loops 127 and 128 is exactly two safety reaction times , i . e ., 12 ms ). processing unit 50 a then enters a new safety loop and begins processing safety functions 61 a ( shown as return path 156 to safety loop 127 ). the safety timer cross - check diagnostic 100 can be repeated at a pre - determined frequency while cpus 52 a , 52 b of processing units 50 a , 50 b continue to perform the executables 60 a , 60 b , within the safety loops . it is specifically intended that the present invention not be limited to the embodiments and illustrations contained herein , but include modified forms of those embodiments including portions of the embodiments and combinations of elements of different embodiments as come within the scope of the following claims .