The present invention relates to motion control systems and, in particular, to systems that allow the automation of motion tasks associated with Industrial and Consumer Automation processes.
A motion control application is software that defines a sequence of motion steps required to perform a motion task. A motion controller is hardware and software that, in combination with a motion control device, is capable of converting motion commands into physical movement of an object. The term motion controller will be used herein to include the motion control device.
Typically, the motion commands executed by a motion controller are proprietary. The combination of a motion control software application and one or more motion controllers will be referred to herein as a motion control system.
In many cases, motion control software applications are specifically written for one or more proprietary motion controller. Therefore, if one or more new motion controllers are to be used in place of one or more original motion controllers, a motion control software application written for the original motion controller(s) must be rewritten to accommodate the new motion controller(s). A motion control software application written for one or more proprietary controllers is referred to as hardware dependent.
In general, hardware dependence is undesirable because the owner of the motion control system must either commit to the vendors of the proprietary controllers or discard the motion control application when a new motion controller is used.
The need exists for systems and methods that may be used to facilitate the writing of motion control applications that are hardware independent.
The present invention may be embodied as a motion event system for transmitting events between a motion program and a motion device. The motion event system comprises a driver component, a motion component, and a motion event component. The driver component is associated with the motion device. The motion component allows communication between the motion program and the at least one driver component. The motion event component configures at least one of the driver component and the motion component to recognize events to be transmitted between the motion program and the motion device.
The present invention relates to systems for handling events generated in the context of a motion system. Such events will be referred to as motion events. In addition, a common source of events in a motion system is a change in data associated with a variable. The present invention also relates to a variable support system for accessing and mapping proprietary variables associated with motion controllers.
The following discussion will thus describe both a motion event system for handling motion events and a variable support system for accessing data values associated with motion variables. While a significant benefit can be obtained by combining the motion event system and variable support system as described herein, each of these systems can operate independently, and the Applicant reserves the right to pursue separate claims directed towards each of the motion event system and the variable support system.
Referring initially to
As shown in
The example motion event system 20 further comprises a motion component 40 and a driver component 42. The example motion component 40 implements a set of OLE interfaces designed for use in the context of motion control systems. The example driver component 42 implements the driver logic for a given motion platform and may be either custom or standard.
Optionally, the system 20 may further comprise a driver proxy component 44. The driver proxy component 44 acts as a proxy between a first set of driver original interface requirements and a second set of slim driver interfaces. When the driver component 42 is standard, the standard driver component 42 performs the functions both of the driver proxy component 44 and of a custom driver component 42.
Referring now to
Referring now to
As shown in
Optionally, the motion component 40 may implement the event subscription/monitoring functionality, which adds a higher degree of reusability because each of the driver components 42 would not be required to implement any subscription/monitoring logic. Also, because the automation layer 30 and C++ framework layer 32 are provided merely as programming conveniences, the client setting up the subscription may optionally communicate directly to the motion component 40, bypassing both the automation layer 30 and C++ framework layer 32.
Referring now to
As an alternate to the design above, the functionality of the motion event component 22 may be provided by the motion component 40, in which case a separate motion event component 22 would not be used. However, using a separate motion event component 22 allows a decoupling of the event source and the event receiver, which may be beneficial when the components of the system 20 are distributed across a network. For example with the motion event component 22, the motion component 40 may actually be located on a different computer connected via a network (Ethernet, wireless, or other network system).
Optionally a motion stream (not shown) residing below the driver component 42 may fire events. For example, data transmission events may be fired by the stream when data is received from or sent to the stream target system. In this case, the event source would be the motion stream instead of the motion driver 42. In addition, as generally discussed above, the motion component 40 may actually implement the event subscription/monitoring/trigger functionality, which would add a higher degree of reusability because each driver would not be required to implement any subscription/monitoring logic. Further, because the automation layer 30 and C++ framework layer 32 are provided merely as programming conveniences, the motion event component 22 may communicate directly with the client application thus bypassing the automation layer 30 and C++ framework layer 32.
Referring now to
Optionally, because the automation layer 30 and C++ framework layer 32 are provided merely as programming conveniences, the client setting up the subscription may also talk directly to the motion component 40, thus bypassing both the automation layer 30 and C++ framework layer 32.
Referring now to
Optionally, because the automation layer 30 and C++ framework layer 32 are used as programming conveniences, the motion event component 22 may bypass the automation layer 30 and C++ framework layer 32 and communicate directly with the client application.
Any number of conditions may trigger an event. The following section lists several example event triggers.
Low Level Data Transmission is one example of an event that may be monitored using the motion event monitoring system 20. Very low level events may be used in the motion stream to notify other components when raw data is sent or received to and from the target motion device or machine.
Another example of an event that may be monitored using the event monitoring system 20 is a Motion Action. Certain motion actions may trigger events. For example the completion of a move, hitting a limit switch, or accelerating up to a given velocity may all trigger events that notify the client of the event condition.
The event monitoring system 20 may be used to monitor events triggered by changing data values. More specifically, a controller may define variables that are associated with or contain data values; as the data values associated with these variables change, one or more events may be triggered. For example, the motion driver 42 may poll for variables having data values and, upon seeing a change in value or state of a data value, the driver 42 may fire an event to other components notifying them of the change. This model implemented by the motion event monitoring system 20 follows a publish/subscribe model where the driver 42 “publishes” data changes to “subscribing” components such as the automation layer 30 or any client software using the system 20.
A. Example C++ Functions
The following discussion describes C++ functions that may be used by the motion event system 20 to support event notifications on data and API changes. The example system 20 uses an object, referred to as CSystemMonitorObj, to implement an internal thread to monitor variables and other API's. Using this example object, once each API changes, registered call back functions are called, thereby notifying the target of the data changes.
The CSystemMonitorObj object uses the following functions to support event notifications: Subscribe, Unsubscribe, Initialize, and CleanUp. The Subscribe function adds a new function call-back to be called on data changes. The Unsubscribe function removes a function from the call-back set. The Initialize function creates a connection to the motion event component 22. The CleanUp function shuts-down any connections to the motion event component 22. Each of these functions will be discussed separately below.
The “Subscribe” function is used to add a new variable or API to the subscription list and employs the following syntax, parameters, and return value:
The Unsubscribe function Removes a variable or API from the subscription list and employs the following syntax, parameters, and return value:
The “Initialize” function creates a connection to the motion event component 22 and employs the following syntax, parameters, and return value:
The “CleanUp” function releases the connection to the motion event component 22 and employs the following syntax and return value:
The following C++ functions are examples of functions that may be used by the motion event system 20 to support event notifications that may be implemented in the automation layer 30. The functions described below apply to direct events supported using standard connection points as well as “lazy events”, which are loosely coupled events implemented using COM+ events.
B. Internal SystemAPI Definitions
The event functionality described above is implemented internally to the event management system 20 using a set of SystemAPI or SystemSPI functions. The term “SystemAPI” refers to an application programming interface exposed by the system 20. The term “SystemSPI” refers to a service provider interface defined by the system 20.
When event functionality is implemented at the level of the motion component 40, the SystemAPI definitions are used. When event functionality is implemented at the level of the driver component 42, the events are passed down to the driver component 42 and handled by the SystemSPI definitions.
All data passed to the SystemAPI is passed in the form of a function index called the SystemAPI index and an array of parameters (RgData) that use a Standard Motion Parameter Data Type that will be described in further detail below.
In the following discussion, portions of the SystemAPI and SystemSPI provided to handle event management will be defined.
The MOTION_CNC_EVENT_SUBSCRIBE API is a SystemAPI that is used to subscribe to a given event condition. In the present example, only variables are supported by the event notification. The present invention may be implemented using events that include motion conditions, raw data transmission conditions, or other state change information occurring either in the motion event system 20 or on the target device or machine. The following Index Value and RgData Values are used to implement this API:
The MOTION_CNC_EVENT_UNSUBSCRIBE API is a SystemAPI that is used to unsubscribe to a given event condition, thus removing the condition from the monitoring list for the specific client making the unsubscribe request. The event condition will still be monitored if other clients are currently subscribed to the condition. The following Index Value and RgData Values are used to implement this API:
The MOTION_CNC_EVENT_PAUSE API allows monitoring of the given event condition to be paused for the given client but does not remove it from the subscription list. The following Index Value and RgData Values are used to implement this API:
The Standard Motion Parameter Data Type discussed briefly above will now be discussed in further detail. The structure of the Standard Motion Parameter Data Type is referred to as MOTION_PARAM_DATA. Many methods on the Motion C++ classes use the standard Motion parameters set to describe data used to control, query or set each axis. The standard parameters are in the following format:
pObj->method(LPMOTION_PARAM_DATA rgParamData,DWORDdwCount);
Each element in the rgParamData array corresponds to an axis in the system, with the first element in the array corresponding to the first axis of motion. For example, if the first axis of motion is the ‘X’ axis, then ‘X’ axis would correspond to the first element in the array.
The MOTION_PARAM_DATA structure can contain either a numerical or a string value and is defined as follows:
The ‘adt’ member of the MOTION_PARAM_DATA structure describes the data contained within the MOTION_PARAM_DATA structure. The values are described below:
The system 20 handles Boolean types in the following manner. When querying and setting boolean TRUE/FALSE values, any non-zero value is considered TRUE and any zero value is considered FALSE. For example, if the df field of an MOTION_PARAM_DATA array element is non zero and it is sent to CSystemMotionObj::LimEnableSW, the software limits for the specified axis will be enabled.
Typically, the variables associated with a motion system change as the motion system changes state. Events generated by motion systems are often associated with these changing variables. Referring now to
Referring now to
The objects forming the variable support system 120 will be described in further detail below after a discussion of an object model associated with the variable support system 120.
A. Example Object Model
Referring now to
The MotionaVariableObj object 132, MotionaVariableMappingObj object 134, MotionaVariableMappingEnum object 136, and MotionaVariableMappingItem object 138 each expose methods, and the methods exposed by each of the objects 132 and 134 will be described separately below.
The MotionaVariableObj 132 supports or exposes the following methods: ReadItem, Read, WriteItem, Write, GetNames, and GetAttributes. The ReadItem method reads a single variable (or array element) and returns the data read. The Read method reads a set of items. The WriteItem methods writes a set of items. The GetNames method returns the list of variable names currently mapped either by the motion component 40 or by the user 124. The GetAttributes method returns the attributes for a given variable. Each of these methods will be separately described in further detail below.
The MotionVariableObj.ReadItem method employs the following syntax, parameters, and return value to read a variable item and return the data read:
The MotionaVariableObj.Read method employs the following syntax and parameters to read a variable item or array and return the data read in the parameter passed:
The MotionaVariableObj.WriteItem method employs the following syntax and parameters to write a variable item to the controller of a given motion device:
The MotionaVariableObj.Write method employs the following syntax and parameters to write a variable item or array to the controller of a given motion device:
The MotionaVariableObj.GetNames method employs the following syntax and parameters to get the variable names for a given domain (this method supports both variables mapped in the motion component 40 and variables mapped by the user 124 using a variable mapping API):
The MotionaVariableObj.GetAttributes method uses the following syntax and parameters to get the attributes for a given variable:
The MotionaVariableMappingObj object 134 supports or exposes the following methods: AddMapping, RemoveMapping, RemoveAll, GetMappingList, LoadMappings, and SaveMappings. The AddMapping method adds a new mapping to the list. The RemoveMapping method removes a mapping from the list. The RemoveAll method removes all mappings from the list. The GetMappingList method retrieves the mapping enumerator. The LoadMappings method loads a persisted mapping set. The SaveMappings method saves a mapping set to persisted storage. Each of these methods will be separately described in further detail below.
The MotionaVariableMappingObj.AddMapping method employs the following syntax and parameters to add a new mapping to the mapping list:
The mapping format for a variable is as follows:
DOMAIN:VARNAME:VARPATH:VARWRITEFMT
where “DOMAIN” refers to the domain name on the controller, “VARNAME” the variable name on the controller to be read, “VARPATH” is the variable path (for arrays and structures) of the variable, and “VARWRITEFMT” is the variable write format used when writing data to the variable. A semicolon ‘:’ separates each of the items in the mapping. If the item is empty, the semicolons must still appear. Several example mappings are as follows:
“FOO”→“APC1 MULTI_SETUP:(0):(0){14}”
“BOO”→“:PI_TOOL_DATA_TABLE:(0)(1).tool_length:(1)(1)[{14}]”
The MotionaVariableMappingObj.RemoveMapping method employs the following syntax and parameters to remove a mapping from the mapping list:
The MotionaVariableMappingObj.RemoveAll method employs the following syntax to remove all mappings from the mapping list:
The MotionaVariableMappingObj.LoadMappings method employs the following syntax and parameters to load a set of mappings from a file:
When using the MotionaVariableMappingObj.LoadMappings method to load mappings from a file, all existing mappings are deleted.
The MotionaVariableMappingObj.SaveMappings method employs the following syntax and parameters to save a set of mappings to file.
The MotionVariableMappingObj.GetMappingList method employs the following syntax, parameters, and return value to Retrieve a variable mapping enumerator.
The function index and parameter signature for each function used by the variable support objects 130 will now be described in further detail. In particular, the parameter signature and function indices used by the various driver component 42 functions to implement the new variable support will now be discussed.
The MOTION_CNC_VARIABLE_READ function employs the following Index value and RgData values to read a mapped variable:
The MOTION_CNC_VARIABLE_READ function employs the following Index value and RgData values to write a mapped variable:
The MOTION_CNC_VARIABLE_LIST_GET function employs the following Index value and RgData values to get the list of mapped values:
The MOTION_CNC_VARIABLE_ATTRIB_GET function employs the following Index value and RgData values to get the attributes describing a given mapped variable:
The MOTION_CNC_VARIABLE_ADDMAPPING function employs the following Index value and RgData values to add a user 124 defined variable mapping.
The MOTION_CNC_VARIABLE_REMOVEMAPPING function employs the following Index value and RgData values to remove a specific variable mapping:
The MOTION_CNC_VARIABLE_REMOVEALLMAPPINGS function employs the following Index value and RgData values to remove all variable mappings:
The MOTION_CNC_VARIABLE_MAPPINGCOUNT_GET function employs the following Index value and RgData values to get the number of variable mappings:
The MOTION_CNC_VARIABLE_MAPPING_GETAT function employs the following Index value and RgData values to get the variable mapping settings:
The MOTION_CNC_VARIABLE_MAPPING_SETAT function employs the following Index value and RgData values to change the settings of a variable mapping:
The MOTION_CNC_VARIABLE_LOAD_MAPPINGS function employs the following Index value and RgData values to load a set of variable mappings:
The MOTION_CNC_VARIABLE_SAVE_MAPPINGS function employs the following Index value and RgData values to save all variable mappings:
The MOTION_CNC_VARIABLE_VALIDATE_MAPPINGS function employs the following Index value to validate all variable mappings:
The MOTION_CNC_SYSTEM_CONNECT function employs the following Index value and RgData values to connect to the controller:
The MOTION_CNC_SYSTEM_DISCONNECT function employs the following Index value and RgData values to disconnect from the controller:
The MOTION_CNC_DIRECT_VARIABLE_READ function employs the following Index value and RgData values to directly read from a variable on the controller:
The MOTION_CNC_DIRECT_VARIABLE_WRITE function employs the following Index value and RgData values to directly write to a variable on the controller:
The MOTION_CNC_DIRECT_VARIABLE_LIST_GET function employs the following Index value and RgData values to get the list of all variables directly from the controller:
The MOTION_CNC_DIRECT_VARIABLE_ATTRIB_GET function employs the following Index value and RgData values to get the attributes of a variable directly from the controller:
B. Controller Independent Variables
Currently, various methods of implementing variables are used within control technologies. Typically each vendor has a proprietary manner of specifying each variable and how it is accessed. The variable support system 120 may use what will be referred to herein as Independent Variables to facilitate access to any variable no matter how the variable is actually implemented by the control vendor. The Independent Variables may be independent of the particular hardware or software system used. The following discussion will describe an example design for controller neutral variables, including a description of all software modules involved.
Referring for a moment back to
The client software 122 is any software that uses the services of the motion component 40 to setup or use controller independent variable mappings. The client may access the motion component 40 via the automation layer 30, the framework layer 32, or directly where the client software 122 communicated directly with the motion component 40.
The example automation layer 30 is provided for programming environments that support Microsoft OLE Automation. Several examples of such programming environments are Microsoft Visual Basic, applications that are VBA (Visual Basic for Applications) aware, the Visual Basic Scripting environment typically used in Internet/Web based HTML pages, and the new Microsoft .NET environment.
The framework layer 32 is provided for programming environments that use the C++ programming language. Microsoft's Visual Studio 6.0 is an example of such an environment.
The motion component 40 services all client requests for mapped variable configuration and usage. The motion component 40 may be accessed directly, such as by the framework layer 32, or indirectly, such as through the automation layer 30. When requested, the motion component 40 routes the request to the active driver component 42 and may be used with a plurality of driver components 42 in a multi control environment.
The driver component 42 implements the specific variable mapping for a specific controller technology. Each variable mapping is setup either programmatically or via the driver administrator component 128.
The driver administrator component 128 is a user 124 application that allows the user 124 to visually configure each variable mapping for each controller dependent driver component 42. All configurations made in the driver administrator component 128 can be done without any new software programming.
The user 124 is the a person who configured the variable mappings and/or a person who runs or otherwise uses client software that internally uses mapped variables.
Several examples of use cases will now be described to illustrate how the variable mapping model implemented by the system 120 may be used. In the examples discussed below, each driver component 42 is responsible for storing and performing any variable transformations between controller neutral and controller specific data.
Each variable mapping for each controller dependent driver component 42 may be mapped and/or otherwise configured in any one of several ways. The examples depicted in
Referring initially to
Referring now to
As an alternative, the motion component 40 may store the mapping information for each driver component 42 in a mapping database, thus relieving each driver component 42 from having to perform any mapping logic. When a variable is then requested, the motion component 40 would look-up the variable mapping and send the mapped controller dependent information associated with the variable to the target driver component 42. The driver component 42 would then operate on the controller dependent information in a conventional manner.
Referring now to
Referring now to
Like the system 120, the variable mapping/configuration model implemented by the system 220 may be implemented in several ways.
When using the variable mappings, the client software 122 may use the controller independent variable name, type, and structure to allow for controller independent use. As will be described below with reference to
The controller neutral model of supporting variables may be applied to a number of different technologies in a number of different environments. Several example environments will be described below.
Industrial Automation, which refers to the automation of factory or workplace processes, uses variable based information extensively. In the following discussion, the application of the variable support systems will be briefly described in the context of the following Industrial Automation technologies: General Motion Control, CNC Motion Control, Robotic Control, Cell Control, and PLC Control.
General Motion Controllers (both software and hardware) are used for various motion based applications in a wide range of industries. For example, in the semiconductor industries, General Motion Controllers drive many of the pick-n-place and vision inspection machines. Each of the General Motion Control technologies is implemented with proprietary vendor specific technologies and most expose variables in some proprietary format. The control neutral model would allow for variables from any General Motion Control technology, regardless of vendor or implementation. The client software 122 thus is provided with a consistent system for accessing variable information from each target controller platform.
Computer Numeric Controls (CNC) are used by a wide range of machines in the metal fabrication industries. Each CNC controller supports a variant of the RS274 (G&M Code) language that usually makes the language supported a proprietary version of the original standard. Because the RS274 standard does not address variables, variables are typically handled as a proprietary extension to the RS274 standard, which the extension only works on the control technology for which it is implemented. The control neutral variable model of the present invention greatly improves upon the proprietary technologies by normalizing all variables across the various proprietary control technologies. A variable support system constructed in accordance with the present invention allow improved integration and information flow in enterprise wide systems such as data collection, analysis, and resource planning systems.
Robotic Controllers are similar to general motion controllers in that each Robotic Controller typically employs a proprietary technologies defined by the vendor of the particular Controller. A controller neutral variable support system implemented using the principles of the present invention improves upon proprietary systems by defining a generic system for accessing, manipulating, and configuring variable based information on Robotic Controllers.
A Cell Controller is a system (typically a Personal Computer) that directs the functionality of several controlled machines. The controlled machines, whether from the same vendor or from various vendors, each can implement a different manner of accessing, configuring, and using variables. A controller neutral variable support system of the present invention can simplify the process of implementing a Cell Controller that encompasses a variety of controlled machines using different control technologies.
PLC Controllers typically use variables (or tags) to access virtually all portions of their address space. A controller neutral variable support system of the present invention yields an advantage when applied to PLC Controllers because each PLC vendor typically implements their tags and variables in different proprietary ways.
In addition to Industrial Automation, the principles of the present invention may be used in what is referred to as Consumer Automation. Although the Consumer Automation industry is not yet mature, it is anticipated that the Consumer Automation industry will, like the Industrial Automation industry, face problems with proprietary controllers. A controller neutral variable support system of the present invention will in the future provide many of the same benefits in the Consumer Automation industry as are currently provided in the Industrial Automation industry.
This application claims priority of U.S. Provisional Patent Application Ser. Nos. 60/466,588 filed Apr. 29, 2003, and 60/467,667 filed May 2, 2003, the contents of which are incorporated herein by reference.
| Number | Name | Date | Kind |
|---|---|---|---|
| 4159417 | Rubincam | Jun 1979 | A |
| 4199814 | Rapp et al. | Apr 1980 | A |
| 4418381 | Molusis et al. | Nov 1983 | A |
| 4531182 | Hyatt | Jul 1985 | A |
| 4688195 | Thompson et al. | Aug 1987 | A |
| 4713808 | Gaskill et al. | Dec 1987 | A |
| 4767334 | Thorne et al. | Aug 1988 | A |
| 4769771 | Lippmann et al. | Sep 1988 | A |
| 4782444 | Munshi et al. | Nov 1988 | A |
| 4800521 | Carter et al. | Jan 1989 | A |
| 4809335 | Rumsey | Feb 1989 | A |
| 4815011 | Mizuno et al. | Mar 1989 | A |
| 4829419 | Hyatt | May 1989 | A |
| 4840602 | Rose | Jun 1989 | A |
| 4846693 | Baer | Jul 1989 | A |
| 4855725 | Fernandez | Aug 1989 | A |
| 4857030 | Rose | Aug 1989 | A |
| 4887966 | Gellerman | Dec 1989 | A |
| 4897835 | Gaskill et al. | Jan 1990 | A |
| 4912650 | Tanaka et al. | Mar 1990 | A |
| 4923428 | Curran | May 1990 | A |
| 4937737 | Schwane et al. | Jun 1990 | A |
| 4987537 | Kawata | Jan 1991 | A |
| 5005134 | Nakashima et al. | Apr 1991 | A |
| 5005135 | Morser et al. | Apr 1991 | A |
| 5020021 | Kaji et al. | May 1991 | A |
| 5095445 | Sekiguchi | Mar 1992 | A |
| 5120065 | Driscoll et al. | Jun 1992 | A |
| 5126932 | Wolfson et al. | Jun 1992 | A |
| 5168441 | Onarheim et al. | Dec 1992 | A |
| 5175684 | Chong | Dec 1992 | A |
| 5175817 | Adams et al. | Dec 1992 | A |
| 5175856 | Van Dyke et al. | Dec 1992 | A |
| 5230049 | Chang et al. | Jul 1993 | A |
| 5245703 | Hubert | Sep 1993 | A |
| 5247650 | Judd et al. | Sep 1993 | A |
| 5291416 | Hutchins | Mar 1994 | A |
| 5368484 | Copperman | Nov 1994 | A |
| 5377258 | Bro | Dec 1994 | A |
| 5382026 | Harvard et al. | Jan 1995 | A |
| 5390304 | Leach et al. | Feb 1995 | A |
| 5390330 | Talati | Feb 1995 | A |
| 5392207 | Wilson et al. | Feb 1995 | A |
| 5400345 | Ryan, Jr. | Mar 1995 | A |
| 5402518 | Lowery | Mar 1995 | A |
| 5405152 | Katanics et al. | Apr 1995 | A |
| 5412757 | Endo | May 1995 | A |
| 5413355 | Gonzalez | May 1995 | A |
| 5438529 | Rosenberg et al. | Aug 1995 | A |
| 5450079 | Dunaway | Sep 1995 | A |
| 5453933 | Wright et al. | Sep 1995 | A |
| 5465215 | Strickland et al. | Nov 1995 | A |
| 5491813 | Bondy et al. | Feb 1996 | A |
| 5493281 | Owens | Feb 1996 | A |
| 5511147 | Abdel-Malek | Apr 1996 | A |
| 5541838 | Koyama et al. | Jul 1996 | A |
| 5576727 | Rosenberg et al. | Nov 1996 | A |
| 5577253 | Blickstein | Nov 1996 | A |
| 5596994 | Bro | Jan 1997 | A |
| 5600373 | Chui et al. | Feb 1997 | A |
| 5604843 | Shaw et al. | Feb 1997 | A |
| 5607336 | Lebensfeld et al. | Mar 1997 | A |
| 5608894 | Kawakami et al. | Mar 1997 | A |
| 5613117 | Davidson et al. | Mar 1997 | A |
| 5617528 | Stechmann et al. | Apr 1997 | A |
| 5618179 | Copperman et al. | Apr 1997 | A |
| 5623582 | Rosenberg | Apr 1997 | A |
| 5625820 | Hermsmeier et al. | Apr 1997 | A |
| 5625821 | Record et al. | Apr 1997 | A |
| 5636994 | Tong | Jun 1997 | A |
| 5652866 | Aldred et al. | Jul 1997 | A |
| 5655945 | Jani | Aug 1997 | A |
| 5659753 | Murphy et al. | Aug 1997 | A |
| 5666161 | Kohiyama et al. | Sep 1997 | A |
| 5670992 | Yasuhara et al. | Sep 1997 | A |
| 5691897 | Brown et al. | Nov 1997 | A |
| 5691898 | Rosenberg et al. | Nov 1997 | A |
| 5701140 | Rosenberg et al. | Dec 1997 | A |
| 5704837 | Iwasaki et al. | Jan 1998 | A |
| 5707289 | Watanabe et al. | Jan 1998 | A |
| 5724074 | Chainani et al. | Mar 1998 | A |
| 5733131 | Park | Mar 1998 | A |
| 5734373 | Rosenberg et al. | Mar 1998 | A |
| 5737523 | Callaghan et al. | Apr 1998 | A |
| 5739811 | Rosenberg et al. | Apr 1998 | A |
| 5746602 | Kikinis | May 1998 | A |
| 5752880 | Gabai et al. | May 1998 | A |
| 5754855 | Miller et al. | May 1998 | A |
| 5764155 | Kertesz et al. | Jun 1998 | A |
| 5766077 | Hongo | Jun 1998 | A |
| 5772504 | Machiguchi | Jun 1998 | A |
| 5790178 | Shibata et al. | Aug 1998 | A |
| 5800268 | Molnick | Sep 1998 | A |
| 5801946 | Nissen et al. | Sep 1998 | A |
| 5802365 | Kathail et al. | Sep 1998 | A |
| 5805785 | Dias et al. | Sep 1998 | A |
| 5818537 | Enokida et al. | Oct 1998 | A |
| 5821920 | Rosenberg et al. | Oct 1998 | A |
| 5821987 | Larson | Oct 1998 | A |
| 5822207 | Hazama et al. | Oct 1998 | A |
| 5825308 | Rosenberg | Oct 1998 | A |
| 5828575 | Sakai | Oct 1998 | A |
| 5836014 | Faiman, Jr. | Nov 1998 | A |
| 5846132 | Junkin | Dec 1998 | A |
| 5848415 | Guck | Dec 1998 | A |
| 5852441 | Nakajima et al. | Dec 1998 | A |
| 5855483 | Collins et al. | Jan 1999 | A |
| 5867385 | Brown et al. | Feb 1999 | A |
| 5873765 | Rifkin et al. | Feb 1999 | A |
| 5889670 | Schuler et al. | Mar 1999 | A |
| 5889672 | Schuler et al. | Mar 1999 | A |
| 5890963 | Yen | Apr 1999 | A |
| 5907704 | Gudmundson et al. | May 1999 | A |
| 5907831 | Lotvin et al. | May 1999 | A |
| 5914876 | Hirai | Jun 1999 | A |
| 5920476 | Hennessey et al. | Jul 1999 | A |
| 5921780 | Myers | Jul 1999 | A |
| 5924013 | Guido et al. | Jul 1999 | A |
| 5956484 | Rosenberg et al. | Sep 1999 | A |
| 5959613 | Rosenberg et al. | Sep 1999 | A |
| 5960085 | De La Huerga | Sep 1999 | A |
| 5977951 | Danieli et al. | Nov 1999 | A |
| 5984499 | Nourse et al. | Nov 1999 | A |
| 6012961 | Sharpe et al. | Jan 2000 | A |
| 6020876 | Rosenberg et al. | Feb 2000 | A |
| 6028593 | Rosenberg et al. | Feb 2000 | A |
| 6031973 | Gomi et al. | Feb 2000 | A |
| 6038603 | Joseph | Mar 2000 | A |
| 6046727 | Rosenberg et al. | Apr 2000 | A |
| 6057828 | Rosenberg et al. | May 2000 | A |
| 6061004 | Rosenberg | May 2000 | A |
| 6065365 | Ostler et al. | May 2000 | A |
| 6070010 | Keenleyside et al. | May 2000 | A |
| 6078308 | Rosenberg et al. | Jun 2000 | A |
| 6078968 | Lo et al. | Jun 2000 | A |
| 6080063 | Khosla | Jun 2000 | A |
| 6083104 | Choi | Jul 2000 | A |
| 6090156 | MacLeod | Jul 2000 | A |
| 6100874 | Schena et al. | Aug 2000 | A |
| 6101425 | Govindaraj et al. | Aug 2000 | A |
| 6101530 | Rosenberg et al. | Aug 2000 | A |
| 6104158 | Jacobus et al. | Aug 2000 | A |
| 6125385 | Wies et al. | Sep 2000 | A |
| 6128006 | Rosenberg et al. | Oct 2000 | A |
| 6131097 | Peurach et al. | Oct 2000 | A |
| 6133867 | Eberwine et al. | Oct 2000 | A |
| 6139177 | Venkatraman et al. | Oct 2000 | A |
| 6144895 | Govindaraj et al. | Nov 2000 | A |
| 6147647 | Tassoudji et al. | Nov 2000 | A |
| 6161126 | Wies et al. | Dec 2000 | A |
| 6166723 | Schena et al. | Dec 2000 | A |
| 6169540 | Rosenberg et al. | Jan 2001 | B1 |
| 6173316 | De Boor et al. | Jan 2001 | B1 |
| 6191774 | Schena et al. | Feb 2001 | B1 |
| 6195592 | Schuler et al. | Feb 2001 | B1 |
| 6201996 | Crater et al. | Mar 2001 | B1 |
| 6209037 | Brown et al. | Mar 2001 | B1 |
| 6216173 | Jones et al. | Apr 2001 | B1 |
| 6219032 | Rosenberg et al. | Apr 2001 | B1 |
| 6219033 | Rosenberg et al. | Apr 2001 | B1 |
| 6232891 | Rosenberg | May 2001 | B1 |
| 6233545 | Datig | May 2001 | B1 |
| 6243078 | Rosenberg | Jun 2001 | B1 |
| 6246390 | Rosenberg | Jun 2001 | B1 |
| 6247994 | DeAngelis et al. | Jun 2001 | B1 |
| 6252579 | Rosenberg et al. | Jun 2001 | B1 |
| 6252853 | Ohno | Jun 2001 | B1 |
| 6259382 | Rosenberg | Jul 2001 | B1 |
| 6271833 | Rosenberg et al. | Aug 2001 | B1 |
| 6278439 | Rosenberg et al. | Aug 2001 | B1 |
| 6285351 | Chang et al. | Sep 2001 | B1 |
| 6286133 | Hopkins | Sep 2001 | B1 |
| 6288705 | Rosenberg et al. | Sep 2001 | B1 |
| 6288716 | Humpleman | Sep 2001 | B1 |
| 6290565 | Galyean, III et al. | Sep 2001 | B1 |
| 6292170 | Chang et al. | Sep 2001 | B1 |
| 6292174 | Mallett et al. | Sep 2001 | B1 |
| 6292712 | Bullen | Sep 2001 | B1 |
| 6292714 | Okabayashi | Sep 2001 | B1 |
| 6295530 | Ritchie et al. | Sep 2001 | B1 |
| 6300936 | Braun et al. | Oct 2001 | B1 |
| 6300937 | Rosenberg | Oct 2001 | B1 |
| 6301634 | Gomi et al. | Oct 2001 | B1 |
| 6304091 | Shahoian et al. | Oct 2001 | B1 |
| 6305011 | Safonov | Oct 2001 | B1 |
| 6309275 | Fong et al. | Oct 2001 | B1 |
| 6310605 | Rosenberg | Oct 2001 | B1 |
| 6317116 | Rosenberg et al. | Nov 2001 | B1 |
| 6317871 | Andrews et al. | Nov 2001 | B1 |
| 6343349 | Braun et al. | Jan 2002 | B1 |
| 6345212 | Nourse | Feb 2002 | B1 |
| 6353850 | Wies et al. | Mar 2002 | B1 |
| 6366272 | Rosenberg et al. | Apr 2002 | B1 |
| 6366273 | Rosenberg et al. | Apr 2002 | B1 |
| 6366293 | Hamilton et al. | Apr 2002 | B1 |
| 6374195 | Li et al. | Apr 2002 | B1 |
| 6374255 | Peurach et al. | Apr 2002 | B1 |
| 6400996 | Hoffberg et al. | Jun 2002 | B1 |
| 6401005 | Schwarz et al. | Jun 2002 | B1 |
| 6425118 | Molloy et al. | Jul 2002 | B1 |
| 6439956 | Ho | Aug 2002 | B1 |
| 6442451 | Lapham | Aug 2002 | B1 |
| 6463404 | Appleby | Oct 2002 | B1 |
| 6470377 | Sevcik et al. | Oct 2002 | B1 |
| 6473824 | Kreissig et al. | Oct 2002 | B1 |
| 6480896 | Brown et al. | Nov 2002 | B1 |
| 6497606 | Fong et al. | Dec 2002 | B1 |
| 6513058 | Brown et al. | Jan 2003 | B1 |
| 6516236 | Brown et al. | Feb 2003 | B1 |
| 6518980 | DeMotte et al. | Feb 2003 | B1 |
| 6519594 | Li | Feb 2003 | B1 |
| 6519646 | Gupta et al. | Feb 2003 | B1 |
| 6523171 | Dupuy et al. | Feb 2003 | B1 |
| 6528963 | Hong | Mar 2003 | B1 |
| 6542925 | Brown et al. | Apr 2003 | B1 |
| 6546436 | Fainmesser et al. | Apr 2003 | B1 |
| 6559860 | Hamilton et al. | May 2003 | B1 |
| 6571141 | Brown | May 2003 | B1 |
| 6606665 | Govindaraj et al. | Aug 2003 | B1 |
| 6615091 | Birchenough et al. | Sep 2003 | B1 |
| 6652378 | Cannon et al. | Nov 2003 | B1 |
| 6658627 | Gallup et al. | Dec 2003 | B1 |
| 6662361 | Jackson | Dec 2003 | B1 |
| 6665688 | Callahan et al. | Dec 2003 | B1 |
| 6678713 | Mason et al. | Jan 2004 | B1 |
| 7024666 | Brown | Apr 2006 | B1 |
| 7031798 | Brown et al. | Apr 2006 | B1 |
| 20010020944 | Brown et al. | Sep 2001 | A1 |
| 20010029443 | Miyahira | Oct 2001 | A1 |
| 20010032268 | Brown et al. | Oct 2001 | A1 |
| 20010037492 | Holzmann | Nov 2001 | A1 |
| 20020044297 | Tanaka | Apr 2002 | A1 |
| 20020052939 | Lee et al. | May 2002 | A1 |
| 20020129333 | Chandhoke et al. | Sep 2002 | A1 |
| 20020165627 | Brown et al. | Nov 2002 | A1 |
| 20020165708 | Kumhyr | Nov 2002 | A1 |
| 20020177453 | Chen et al. | Nov 2002 | A1 |
| 20030033150 | Balan et al. | Feb 2003 | A1 |
| 20030037117 | Tabuchi | Feb 2003 | A1 |
| 20030061023 | Menezes et al. | Mar 2003 | A1 |
| 20030069998 | Brown et al. | Apr 2003 | A1 |
| 20030230998 | Miyaji et al. | Dec 2003 | A1 |
| 20040019683 | Lee et al. | Jan 2004 | A1 |
| 20040025150 | Heishi et al. | Feb 2004 | A1 |
| 20040044794 | Srinivasan | Mar 2004 | A1 |
| Number | Date | Country |
|---|---|---|
| 0442676 | Aug 1991 | EP |
| 0 281 427 | Aug 1992 | EP |
| 0508912 | Oct 1992 | EP |
| 0 583 908 | Feb 1994 | EP |
| 821522 | Jan 1998 | EP |
| 0275826 | Jul 1998 | EP |
| 2 244 896 | Dec 1991 | GB |
| 59 228473 | Jun 1983 | JP |
| 8161335 | Jun 1996 | JP |
| 2000020114 | Jan 2000 | JP |
| WO 9211731 | Jul 1992 | WO |
| WO 9308654 | Apr 1993 | WO |
| WO 9507504 | Mar 1995 | WO |
| Number | Date | Country | |
|---|---|---|---|
| 60467667 | May 2003 | US | |
| 60466588 | Apr 2003 | US |