CA2705404A1 - Motion control systems - Google Patents

Motion control systems Download PDF

Info

Publication number
CA2705404A1
CA2705404A1 CA2705404A CA2705404A CA2705404A1 CA 2705404 A1 CA2705404 A1 CA 2705404A1 CA 2705404 A CA2705404 A CA 2705404A CA 2705404 A CA2705404 A CA 2705404A CA 2705404 A1 CA2705404 A1 CA 2705404A1
Authority
CA
Canada
Prior art keywords
driver
motion control
interface
stream
hardware
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Abandoned
Application number
CA2705404A
Other languages
French (fr)
Inventor
David W. Brown
Jay S. Clark
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Roy G Biv Corp
Original Assignee
Roy-G-Biv Corporation
David W. Brown
Jay S. Clark
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Family has litigation
First worldwide family litigation filed litigation Critical https://patents.darts-ip.com/?family=23805862&utm_source=google_patent&utm_medium=platform_link&utm_campaign=public_patent_search&patent=CA2705404(A1) "Global patent litigation dataset” by Darts-ip is licensed under a Creative Commons Attribution 4.0 International License.
Application filed by Roy-G-Biv Corporation, David W. Brown, Jay S. Clark filed Critical Roy-G-Biv Corporation
Priority claimed from CA2586401A external-priority patent/CA2586401C/en
Publication of CA2705404A1 publication Critical patent/CA2705404A1/en
Abandoned legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B19/00Programme-control systems
    • G05B19/02Programme-control systems electric
    • G05B19/18Numerical control [NC], i.e. automatically operating machines, in particular machine tools, e.g. in a manufacturing environment, so as to execute positioning, movement or co-ordinated operations by means of programme data in numerical form
    • G05B19/19Numerical control [NC], i.e. automatically operating machines, in particular machine tools, e.g. in a manufacturing environment, so as to execute positioning, movement or co-ordinated operations by means of programme data in numerical form characterised by positioning or contouring control systems, e.g. to control position from one programmed point to another or to control movement along a programmed continuous path
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B19/00Programme-control systems
    • G05B19/02Programme-control systems electric
    • G05B19/18Numerical control [NC], i.e. automatically operating machines, in particular machine tools, e.g. in a manufacturing environment, so as to execute positioning, movement or co-ordinated operations by means of programme data in numerical form
    • G05B19/416Numerical control [NC], i.e. automatically operating machines, in particular machine tools, e.g. in a manufacturing environment, so as to execute positioning, movement or co-ordinated operations by means of programme data in numerical form characterised by control of velocity, acceleration or deceleration
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/20Pc systems
    • G05B2219/23Pc programming
    • G05B2219/23262DDE direct data exchange, DLL dynamic library linking
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/20Pc systems
    • G05B2219/23Pc programming
    • G05B2219/23265Select device driver for actuator, sensor
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/34Director, elements to supervisory
    • G05B2219/34208Motion controller
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/34Director, elements to supervisory
    • G05B2219/34216Programmable motion controller
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/34Director, elements to supervisory
    • G05B2219/34263OLE object linking and embedding, OPC ole for process control
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/34Director, elements to supervisory
    • G05B2219/34287Plc and motion controller combined
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/36Nc in input of data, input key till input tape
    • G05B2219/36035Special language, task programming, oop object oriented programming
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/36Nc in input of data, input key till input tape
    • G05B2219/36036Motion, graphical motion control language gmcl
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/36Nc in input of data, input key till input tape
    • G05B2219/36037Application programming interface associates component code with driver function
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/43Speed, acceleration, deceleration control ADC
    • G05B2219/43167Distributed motion control
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02PCLIMATE CHANGE MITIGATION TECHNOLOGIES IN THE PRODUCTION OR PROCESSING OF GOODS
    • Y02P90/00Enabling technologies with a potential contribution to greenhouse gas [GHG] emissions mitigation
    • Y02P90/02Total factory control, e.g. smart factories, flexible manufacturing systems [FMS] or integrated manufacturing systems [IMS]

Abstract

A system for communicating with a motion control device capable of executing at least one motion command, comprising: a set of motion commands, where the set of motion commands comprises primitive motion commands and non-primitive motion commands, wherein functionality of the non-primitive motion commands can be emulated by a combination of primitive motion commands, and functionality of the primitive motion commands cannot be emulated by a combination of primitive motion commands; a set of motion operations, where at least one motion operation is associated with at least one motion command; a set of selectable software modules, where at least one software module is associated with at least one motion control device, and at least two selectable software modules expose a common software interface; and a software system that commands at least one motion control device to perform at least one motion operation based on at least one motion command using the common software interface exposed by at least one selected software module associated with at least one motion control device.

Description

WO 96/38769 CA 02705404 2010-06-01 PCT1US9610814' MOTION CONTROL SYSTEMS

This application is a divisional application of Canadian Patent File No. 2,586,401 filed May 30, 1996, (which is a divisional of Canadian Patent File No. 2,222,235).
TECHNICAL FIELD
The present invention relates to motion control systems and, more particularly, to interface software that facilitates the creation of hardware independent motion control software.
BACKGROUND OF THE INVENTION
The purpose of a motion control device is to move an object in a desired manner. The basic components of a motion control device are a controller and a mechanical system. The mechanical system translates signals generated by the controller into movement of an object.
While the mechanical system commonly comprises a drive and an electrical motor, a number of other systems, such as hydraulic or vibrational systems, can be used to cause movement of an object based on a control signal. Additionally, it is possible for a motion control device to comprise a plurality of drives and motors to allow multi-axis control of the movement of the object.
The present invention is of particular importance in the context of a mechanical system including at least one drive and electrical motor having a rotating shaft connected. in some way to the object to be moved, and that application will be described in detail herein. But the principles of the present invention are generally applicable to any mechanical system that generates movement based on a control signal. The scope of the present invention should thus be determined based on the claims appended hereto and not the following detailed description.
In a mechanical system comprising a controller, a drive, and an electrical motor, the motor is physically connected to the object to be moved such that rotation of the motor shaft is translated into movement of the object. The drive is an electronic power amplifier adapted to provide power to a motor to rotate the motor shaft in a controlled manner.
Based on control commands, the controller controls the drive in a predictable manner such that the object is moved in the desired manner.
These basic components are normally placed into a larger system to accomplish a specific task. For example, one controller may operate in conjunction with several drives and motors in a multi-axis system for moving a tool along a predetermined path relative to a workpiece.
Additionally, the basic components described above are often used in conjunction with a host computer or programmable logic controller (PLC). The host computer or PLC
allows the use of a high-level programming language to generate control commands that are passed to the controller. Software running on the host computer is thus designed to simplify the task of programming the controller.
Companies that manufacture motion control devices are, traditionally, hardware oriented companies that manufacture software dedicated to the hardware that they manufacture These software products may be referred to as low level programs. Low level programs usually work directly with the motion control command language specific to a given motion control device.
While such low level programs offer the programmer substantially complete control over the hardware, these programs are highly hardware dependent.
In contrast to low-level programs, high-level software programs, referred to sometimes as factory automation applications, allow a factory system designer to develop application programs that combine large numbers of input/output (I/O) devices, including motion control devices, into a complex system used to automate a factory floor environment. These factory automation applications allow any number of I/O devices to be used in a given system, as long as these devices are supported by the high-level program. Custom applications, developed by other software developers, cannot be developed to take advantage of the simple motion control functionality offered by the factory automation program.
Additionally, these programs do not allow the programmer a great degree of control over the each motion control device in the system. Each program developed with a factory automation application must run within the context of that application.
PRIOR ART
In the following discussions, a number of documents are cited that are publicly available as of the filing date of the present invention. With many of these documents, the Applicant is not aware of exact publishing dates. The citation of these documents should thus not be considered an admission that they are prior art, the Applicant will take the steps necessary to establish whether these documents are prior art if necessary.
As mentioned above, a number of software programs currently exist for programming individual motion control devices or for aiding in the development of systems containing a number of motion control devices.
The following is a list of documents disclosing presently commercially available high-level software programs: (a) Software Products For Industrial Automation, iconics 1993; (b) The complete, computer-based automation tool (IGSS), Seven Technologies A/S: (c) OpenBatch Product Brief, PID, Inc.; (d) FIX Product Brochure, Intellution (1994); (e) Paragon TNT Product Brochure, Intec Controls Corp.; (f) WEB 3.0 Product Brochure, Trihedral Engineering Ltd. (1994);
and (g) AIMAX-WIN Product Brochure, TA Engineering Co., Inc. The following documents disclose simulation software: (a) ExperTune PID Tuning Software, Gerry Engineering Software:
and (b) XANALOG Model NL-SIM Product Brochure, XANALOG.
The following list identifies documents related to low-level programs: (a) Compumotor Digiplan 1993-94 catalog, pages 10-11; (b) Aerotech Motion Control Product Guide, pages 233-34; (c) PMAC Product Catalog, page 43; (d) PC/DSP-Series Motion Controller C
Programming Guide, pages 1-3; (e) Oregon Micro Systems Product Guide, page 17; (f) Precision Microcontrol Product Guide.
The Applicants are also aware of a software model referred to as WOSA that has been defined by Microsoft for sue in the Windows programming environment. The WOSA model is discussed in the book inside Windows 95, on pages 348-351. WOSA is also discussed in the paper entitled WOSA
Backgrounder: Delivering Enterprise Services to the Windows-based Desktop. The WOSA model isolates application programmers from the complexities of programming to different service providers by providing an API layer that is independent of an underlying hardware or service and an SPI layer that is hardware independent but service dependent. The WOSA model has no relation to motion control devices.
The Applicants are also aware of the common programming practice in which drivers are provided for hardware such as printers or the like; an application program such as a word processor allows a user to select a driver associated with a given printer to allow the application program to print on that given printer.
While this approach does isolate the application programmer from the complexities of programming to each hardware configuration in existence, this approach does not provide the application programmer with the ability to control the hardware in base incremental steps. In the printer example, an application programmer will not be able to control each stepper motor in the printer using the provided printer driver; instead, the printer driver will control a number of stepper motors in the printer in a predetermined sequence as necessary to implement a group of high level commands.
The software driver model currently used for printers and the like is thus not applicable to the development of a sequence of control commands for motion control devices.
SUMMARY OF THE INVENTION
From the foregoing, it should be clear that one primary aspect of the invention seeks to provide improved methods and devices for moving objects.
Another more specific aspect of the present invention seeks to obtain methods and apparatus for designing and deploying motion control devices in which these methods and apparatus exhibit favorable mix of the following characteristics:
(a) allow the creation of high-level motion control programs that are hardware independent, but offer programmability of base motion operations;
(b) hide the complexities of programming for multiple hardware configurations from the high-level programmer;
(c) can easily be extended to support additional hardware configurations; and (d) transparently supports industry standard high-level programming environments.
The present invention is, in one form, a method of moving an object comprising the steps of developing a high-level motion control application program comprising a sequence of component functions that describe a desired object path, correlating these component functions with driver functions, selecting a software driver for the specific hardware configuration being controlled, generating control commands from the driver functions and the software driver associated with the hardware configuration being controlled, and controlling a motion control device based on the control data to move the object along the desired object path.
In another form, the present invention is a method of generating a sequence of control commands for controlling a motion control devices to move an object along a desired path. An application program comprising a series of component functions defines a sequence of motion steps that must be performed by the motion control device to move the object along the desired path. The component functions contain code that relates the component functions to driver functions. The driver functions are associated with, or contain, software drivers containing driver code for implementing the motion steps on a given motion control device. The control commands are generated based on the application program and the driver code associated with a given motion control device.
The use of component functions that are separate from driver functions isolates the programmer from the complexities of programming to a specific motion control device. This arrangement also allows a given application program to be used without modification for any motion control device having a software driver associated therewith.
The driver functions are grouped into core driver functions and extended driver functions.
All software drivers must support the core driver functions; the software drivers may also support one or more of the extended driver functions, although this is not required.
Where the software drivers do not support the extended driver functions, the functionality associated with the extended driver functions can normally be simulated using some combination of core driver functions. In this case, the method of the present invention comprises the steps of determining which of the extended driver functions are not supported by the software driver and, where possible, substituting a combination of core driver functions. In some cases, the functionality of an extended driver function cannot be emulated using core driver functions, and this functionality is simply unavailable to the programmer.
The use of core driver functions to emulate extended driver functions provides functionality where n6ne would otherwise exist, but the preferred approach is to provide a software driver that supports each of the extended driver functions. When an extended driver function is supported and not emulated, the task being performed will normally be accomplished more quickly and accurately.
Additionally, to simplify the use of emulated extended driver functions, the method of the present invention further comprises the steps of determining which, if any, extended driver functions are not supported by the software driver for a given hardware configuration. developing a function pointer table of both unsupported extended driver functions and supported extended driver functions. and consulting the table each time an extended driver function is called to determine whether that extended driver function must be emulated. In this manner, the process of calling the sequence of core driver functions employed to emulate the unsupported extended driver functions is optimized.
As the control commands are generated as described above, they may be used to control a motion control device in real time or they may be stored in a file for later use.
Preferably, the method of the present invention comprises the step of providing a number of streams containing stream code. Each stream is associated with a destination of control commands, and the stream code of a given stream dictates how the control commands are to be transferred to the destination associated with that given stream. The user is thus provided the opportunity to select one or more streams that dictate the destination of the control commands.
To help isolate the programmer from hardware specific complexities, the method of the present invention may comprise the additional administrative steps such as selecting a driver associated with a particular motion control device and/or translating units required to define the motion control system into the particular system of units employed by a given motion control device.
The invention in one aspect to which this application is directed pertains to a method of debugging software used to communicate with a motion control system.
The method comprises the steps of:
providing a set of hardware motion control attributes used for motion control, where at least one hardware motion control attribute is a primitive hardware motion control attribute used for motion control that cannot be emulated using at least one other hardware motion control attribute, and at least one hardware motion control attribute is a non-primitive hardware motion control attribute that does not meet the definition of a primitive hardware motion control attribute;
providing a set of common motion control attributes;
providing a motion control device capable of storing at least one primitive hardware motion control attribute;

generating debug information containing diagnostic information associated with at least one hardware motion control attribute;
providing a set of software drivers, where at least one software driver is capable of sending the debug information to a debug target;
selecting at least one selected software driver, capable of sending the debug information to a debug target, from the set of software drivers;
providing a software application;
causing the software application to call at least one motion component function to exchange at least one common motion control attribute with the at least one selected software driver;
using at least one called motion component function to cause at least one motion component to exchange at least one common motion control attribute with the at least one selected software driver by calling at least one driver function; and using at least one called driver function to cause the selected software driver to convert at least one common motion control attribute to at least one hardware motion control attribute, exchange at least one hardware motion control attribute with the motion control device, and send debug information to the debug target.

BRIEF DESCRIPTION OF THE DRAWINGS

FIG. 1 is a system interaction map of a motion control system constructed in accordance with, and embodying, the principles of the present invention;
FIG. 2 is a module interaction map of a motion control component of the system shown in FIG. 1;
FIG. 3 is an object interaction map of the component shown in FIG. 2;
FIGS. 4 through 8 are scenario maps of the component shown in FIG. 2;

FIG. 9 is an interface map of the component shown in FIG. 2;
FIG. 10 is a data map showing one exemplary method of accessing the data necessary to emulate extended driver functions using core driver functions;
FIG. 11 is a module interaction map of the driver portion of the system shown in FIG. 1;
FIG. 12 is an object interaction map of the driver portion shown in FIG. 11;
FIGS. 13 through 20 are scenario maps related to the driver shown in FIG. 11;
FIG. 21 is an interface map for the driver shown in FIG. 11;
FIG. 22 is a module interaction map of the streams used by the system shown in FIG. 1;
FIG. 23 is an object interaction map of the streams shown in FIG. 22;
FIGS. 24 through 32 are scenario maps of the streams shown in FIG. 22;
FIG. 33 is an interface map of the objects comprising the stream shown in FIG.
22;
FIG. 34 is a module interaction map of the driver stub portion of the system shown in FIG. 1;
FIG. 35 is an object interaction map of the driver stub shown in FIG. 34;
FIGS. 36 through 38 are scenario maps of the driver stub shown in FIG. 34;
FIG. 39 is an interface map of the driver stub portion shown in FIG. 34;
FIG. 40 is a module interaction map of the driver administrator portion of the system shown in FIG. 1;
FIG. 41 is an object interaction map of the driver administrator shown in FIG.
40;
FIGS. 42 through 49 are scenario maps relating to the driver administrator shown in FIG. 40;
FIG. 50 is an interface map of the objects that comprise the driver administrator shown in FIG. 40;
FIG. 51 is a module interaction map of the driver administrator CPL applet portion. of the system shown in FIG. 1;
FIG. 52 is an object interaction map of the driver administrator CPL applet shown in FIG. 51;
FIGS. 53 through 57 are scenario maps related to the driver administrator CPL
applet shown in FIG. 51;
FIG. 58 depicts a Module Interaction-Map showing all binary modules that interact with the driver and how they interact with one another;

FIG. 59 depicts an Object Interaction-Map which corresponds to the module interaction map of FIG. 58 expanded to display the internal C++ objects making up the language driver 44, and how these objects interact with one another;

FIGS. 60-65 depict a number of Scenario Maps that display the interactions taking place between the C++ objects involved during certain processes;

FIG. 66 depicts an interface map that describes the interfaces exposed by the language driver component 44, all data structures used, and the definitions of each C++
class used; and FIG. 67 depicts a table illustrating how a typical database employed by the language driver 44 may be constructed.
DETAILED DESCRIPTION OF THE INVENTION

Referring now to the drawing, depicted therein at 10 in FIG. 1 is a motion control system constructed in accordance with, and embodying, the principles of the present invention. This system 10 comprises a personal computer portion 12 having a hardware bus 14, a plurality of motion control hardware controllers 16a, 16b, and 16c, and mechanical systems 18a, 18b, and 18c that interact with one or more objects (not shown) to be moved.
The personal computer portion 12 of the system 10 can be any system capable of being programmed as described herein, but, in the preferred embodiment, is a system capable of running the Microsoft Windows environment. Such a system will normally comprise a serial port in addition to the hardware bus 14 shown in FIG. 1.
The hardware bus 14 provides the physical connections necessary for the computer 12 to communicate with the hardware controllers 16. The hardware controllers 16 control the mechanical system 18 to move in a predictable manner. The mechanical system 18 comprises a motor or the like the output shaft of which is coupled to the object to be moved. The combination of the hardware controllers 16a, 16b, and 16c and the mechanical systems 18a, 18b, and 18c forms motion control devices 20a, 20b, and 20c, respectively.
The hardware bus 14, hardware controllers 16, and mechanical systems 18 are all well-known in the art and are discussed herein only to the extent necessary to provide a complete understanding of the present invention.
The personal computer portion 12 contains a software system 22 that allows an application user 24 to create software applications 26 that control the motion control devices 20 More particularly, based on data input by the user 24 and the contents of the application program 26, the software system 22 generates control commands that are transmitted by one or more streams such as those indicated at 28a, 28b, 28c, and 28d. The streams 28 transmit control commands incorporating the hardware specific command language necessary to control a given motion control device to perform in a desired manner. As will be discussed in more detail below, the streams 28 implement the communication protocol that allows the control commands to reach the appropriate motion control device 28 via an appropriate channel (i.e., PC
bus, serial port).
Using the system 22, the application program 26 is developed such that it contains no code that is specific to any one of the exemplary hardware controllers 16. In the normal case, the application program 26, and thus the user 24 that created the program 26, is completely isolated from the motion control devices 20. The user 24 thus need know nothing about the hardware specific command language or communication protocol associated with each of these devices 20;
it may even be possible that the command language of one or more of the hardware controllers 16 was not defined at the time the application program 26 was created.
The software system 22 comprises a combination of elements that allow the application program 26 to be completely isolated from the hardware controllers 16. In the following discussion, the framework of the software system 22 will be described in terms of a method of moving an object and/or a method of generating control commands. After this general discussion, each component of the system 22 will be described in detail in a specific operating environment.
1. Method of Generating Control Commands for Controlling a Motion Control Device to Move an Object Initially, it should be noted that, in most situations, the method described in this section will normally but not necessarily involve the labors of at least two and perhaps three separate software programmers: a software system designer; a hardware designer familiar with the intricacies of the motion control device: and a motion control system designer. The application user 24 discussed above will normally be the motion control system designer, and the roles of the software system designer and hardware designer will become apparent from the following discussion.
The software system designer develops the software system 22. The software system designer initially defines a set of motion control operations that are used to perform motion control. The motion control operations are not specifically related to any particular motion control device hardware configuration, but are instead abstract operations that all motion control device hardware configurations must perform in order to function.
Motion control operations may either be primitive operations or non-primitive operations.
Primitive operations are operations that are necessary for motion control and cannot be simulated using a combination of other motion control operations. Examples of primitive operations include GET POSITION and MOVE RELATIVE, which are necessary for motion control and cannot be emulated using other motion control operations. Non-primitive operations are motion control operations that do not meet the definition of a primitive operations. Examples of non-primitive operations include CONTOUR YIOVE, which may be emuieted using a combination of primitive motion control operations.
Given the set of motion control operations as defined above, the software system designer next defines-a service provider interface (SPI) comprising a number of driver functions.
Driver functions may be either core driver functions or extended driver functions. Core driver functions are associated with primitive operations, while extended driver functions are associated with non-primitive operations. As with motion control operations, driver functions are not related to a specific hardware configuration; basically, the driver functions define parameters necessary to implement motion control operations in a generic sense, but do not attach specific values or the like to these parameters. The SPI for the exemplary software system 22 is attached hereto as Appendix A.
The software system designer next defines an application programming interface (API) comprising a set of component functions. For these component functions, the software system designer writes component code that associates at least some of the component functions with at least some of the driver functions. The relationship between component functions and driver functions need not be one to one: for example, certain component functions are provided for administrative purposes and do not have a corresponding driver function.
However, most component functions will have an associated driver function. The API for the exemplary software system 22 is attached hereto as Appendix B.
The overall software model implemented by the software program 22 thus contains an API comprising component functions and an SPI comprising driver functions, with the API being related to the SPI by component code associated with the component functions.
In order for the system 22 to generate the control commands, at least two more components are needed: the application program 26 and at least one software driver such as the drivers indicated at 30a, 30b, and 30c in FIG. 1.
The software drivers 30 are normally developed by a hardware designer and are each associated with a single motion control device. The hardware designer writes driver code that dictates how to generate control commands for controlling the motion control device associated therewith to perform the motion control operations associated with at least some of the driver functions.
In the exemplary software system 22, the software drivers 30a, 30b, and 30c are associated with the motion control devices 20a, 20b, and 20c, respectively. As a software driver exists for each of the motion control devices 20a, 20b, and 20c, these devices 20a, 20b, and 20c form a group of supported motion control devices.
A careful review of the framework of the software system 22 as described above will illustrate that, of all the components of this system 22, only the software drivers 30 are hardware dependent.
i he motion control system designer, normally also the user 24, develops the application program 26. The application program 26 comprises a sequence of component functions arranged to define the motion control operations necessary to control a motion control device to move an object in a desired manner. The application program 26 is any application that uses the system 22 by programming the motion coritrol component 35. Applications may program the system 22 either through OLE Automation or by using any of the custom OLE interfaces making up the APi.
As mentioned above, the component code associates many of the component functions with the driver functions, and the driver functions define the parameters necessary to carry out the motion control operations. Thus, with appropriately ordered component functions, the application program 26 contains the logic necessary to move the object in the desired manner.
Once the application program 26 has been written and the software drivers 30 have been provided, the user 24 selects at least one motion control device from the group of supported WO 96138769' PCTIUS96108149 motion control devices 20a, 20b, and 20c. Using a driver administrator module 32, the user 24 then selects the software driver associated with the selected motion control device. This driver administrator module 32 is used to install, uninstall, register, and setup each stream.
As currently implemented, the driver administrator 32 allows only one software driver to be selected. In future versions of the software system 22, the driver administrator will allow the user to select one or more software drivers.
The software system 22 thus generates control commands based on the component functions contained in the application program 26, the component code associated with the component functions, and the driver code associated with the selected software driver 28.
As the control commands are being generated as described above, they may be directly transmitted to a motion control device to control this device in real time or stored in an output file for later use. The software system 22 employs the streams 28 to handle the transmission of the control commands to a desired destination thereof.
In the exemplary system 22, the destinations of the control commands may be one or more of an output file 34 and/or the controllers 16. Other possible destinations include a debug monitor or window or other custom output mechanism defined for a specific situation. The software system designer, or in some cases the hardware system designer, will write transmit stream code for each stream 28 that determines how the control commands are to be transferred to a given one of the control command destinations 16 and 34. Using the driver administrator 32, the user 24 selects one or more of the control command destinations 16 and 34, and, later when run, the system 22 transfers the control commands to the selected control command destination 16 and/or 34 based on the transmit stream code in the stream 28 associated with the selected control command destination 16 and/or 34.
Many control command destinations such as 16 and 34 are capable of transmitting data back to the system 22. Data transmitted from a control command destination back to the system 22 will be referred to as response data. The software system designer thus further writes data response stream code for each of the streams 28a, 28b, ar.d 28c that determines how response data is transmitted from the controllers 16 to the system 22. The system 22 thus processes the response data sent by the controllers 16 based on the data response stream code contained in the streams 28.
Referring again to FIG. 1, this Figure shows that the system 22 further comprises a motion control component 35 and a driver stub module 36. The motion control component module 35 is the portion of the software system 22 that relates the component functions to the driver functions. The motion control component module 35 thus contains the component code that makes the association between the component functions contained in the application program 26 and the driver functions.
The driver stub module 36 is not required to implement the basic software model implemented by the system 22, but provides the system 22 with significantly greater flexibility to accommodate diverse motion control hardware configurations with minimal effort.
More particularly, when the driver stub module 36 is employed, the hardware designer need not develop driver code to implement all of the driver functions; to the contrary, the hardware designer must write driver code for implementing the core driver functions but need not write driver code to implement the extended driver functions. The software system designer provides the motion control driver stub 36 with stub code that identifies the combinations of core driver functions that are employed to emulate the functionality of extended driver functions.
The motion control component 24 will determine for the selected software driver 30 which extended functions, if any, the selected driver 30 supports. For extended functions that are not supported, referred to herein as non-supported extended driver functions, the motion control component 35 refers to the driver stub module 36 to determine the appropriate combination of core driver functions to emulate the functionality of the non-supported extended driver functions.
The system 22 thus generates the control commands necessary to implement the non-supported extended driver functions using the appropriate combination of core driver functions.
The process of determining when extended driver functions need to be emulated can be optimized by providing the motion control component 35 with a function pointer table that contains a pointer to each of extended functions. When building the function pointer table, the motion control component 35 checks the selected driver module 30 to see if it supports each extended function. If the selected driver module 30 supports the extended function, the motion control component module 35 stores a pointer to the function, implemented by the selected driver module 30, in the table location corresponding to the extended function. In the event that the selected driver module 30 does not support the extended function, the motion control component module 35 stores a pointer to the extended function implementation located in the driver stub module 36. The driver stub module 36 implementation of the extended function contains calls to a plurality of core functions implemented by the selected diver module 30.
Therefore, the driver stub module 36 allows the motion control system designer to use, with minimal time and effort by the hardware designer, a working software driver 28 that contains driver code to implement only the core functions. The software driver 28 developed to implement the core driver functions can then be improved by developing driver code to implement extended driver functions as desired.
The use of driver code specifically designed to implement extended driver functions is, in general, preferable to relying on the driver stub module 36 to emulate the extended driver functions; driver code specifically written to implement an extended driver function will almost always obtain a more optimized implementation of the driver function than the emulation of that driver function with a combination of core driver functions.
Referring again for a moment to FIG. 1, this Figure illustrates that the system 22 additionally comprises a driver administrator CPL applet 38 and a DDE server 40. The driver administration CPL applet 38 generates the user interface through which the user 24 communicates with the driver administrator module 32. The DDE server 40 provides the software interface through which the application program 26 communicates with the motion control component module 35.

11. MOTION CONTROL COMPONENT

The motion control component 35 will now be described in further detail with reference to FIGS. 2-10. The motion control component 35 is used by every application programming the system 22 to perform motion control operations. The major set of the API is implemented by this component. When operating, the motion control component 35 interacts with the driver administrator 32, to get the current driver, and the driver 30 and driver stub 36, to carry out motion control operations. Applications, using system 22, only interact with the motion control component 35.
This section describes the design of the motion control component 35 in three main parts First, all binary modules that affect the component 35 are described along with their interactions with the component 35. Next, the module interaction-map is drawn in more detail to show the interactions between all C++ objects used to implement the motion control component 35. Next.
the object interaction-map is tested by displaying the specific interactions that take place during certain, key process that the component 35 is requested to perform.
The module interaction-map shown in FIG. 2 displays all binary modules and their interactions with the motion control component 35. As can be seen from the module interaction-map, applications only communicate with the motion control component 35. From this point, the component 35 coordinates all interactions between the driver administrator 32, driver 30, and driver stub 36 components.
Breaking the module interaction-map and adding the interactions taking place between all C++ objects used to implement the motion control component 35, produces the object interaction-map shown in FIG. 3.
Each object in the diagram is described as follows. The CCmpntDisp object is the dispatch object used to dispatch exposed interface methods. During the dispatch process, all raw data is converted into the appropriate C++ form. For example, collections of data passed between OLE components is usually packaged in a raw block of memory. The CCmpntDisp object takes care of packing outgoing data and unpacking incoming data. Data packing involves converting the data between a raw and native C++ format.
The CDriverAdmin object is used to communicate directly with the driver administrator component. All OLE related details are encapsulated within this class.

W r -V38769 PCT/US96/08149 The CDriverMgr object is used to control all unit mapping taking place before calling the appropriate Driver function. The CUnitMapper object is used to do the actual mapping between units.
The CUnitMapper object is used to map units between the Part Coordinate System (PCS) and the Machine Coordinate System (MCS). Both directions of unit mapping are done by this object.
The CDriver object is used to build the SPI table containing both core and extended Driver functions. Depending on the level of driver support, the extended functions in the SPI
table may point to functions implemented in either the driver stub 36 or the driver 30.
The following discussion of FIGS 4-8 describes all main scenarios, or operations, that occur on the motion control component 35. Each scenario-map displays all objects involved, and the interactions that take place between them in the sequence that they occur.
As shown in FIG. 4, before an application can use the motion control component 35, it must create an instance of the object, using the CoCreatelnstance OLE
function, and then initialize the instance calling the exposed Initialize custom interface method implemented by the component 35. FIG. 4 displays the sequence of events that take place when the Initialize method is called.
During initialization, the following steps occur. First the application must create an instance of the motion control component 35 by calling the standard OLE
function CoCreatelnstance. Once loaded, the application must call the component 35's exposed Initialize method. When first loaded, the component 35 loads any registration data previously stored.
Next, the component 35 directs the CCmpntDisp to initialize the system. The CCmpntDisp directs the CDriverAdmin to get the current driver(s) to use. The CDriverAdmin, first, loads the driver administrator 32 using the standard OLE CoCreatelnstance function.
Next, it initializes the driver administrator. Then, it queries the driver administrator for the driver(s) to use and their SPI
support information. Finally, the driver administrator returns the driver(s) and the support information to the component 35, and releases all interfaces used from the driver administrator component 32.
Once receiving the active driver(s) 30 and their support information, the motion control component 35 passes the driver(s) 30 to the CDriverMgr and directs it to initialize the system.
During its initialization, the CDriverMgr initializes the CUnitMapper. Also while initializing, the CDriverMgr initializes a CDriver for each driver used. After initializing each CDriver, the support information is used to build each SPI table inside each CDriver object. When building the SPI
table, all core and supported extended SPI interfaces are queried from the driver. Also, when building the SPI table, the CDriver queries all interfaces, not supported by the driver 30, from the driver stub 36.
Referring now to FIG. 5, once the motion control component 35 is initialized, the application 26 may perform operations on it. There are two types of operations that may take place on the component 35: Operations that use core Driver functions, and operations that use extended Driver functions. Even though the difference between the two is completely invisible to the application using the component 35, the internal interactions are different between the two.
The following discussion outline these differences.
The following interactions take place when the component 35 performs an operation that uses core Driver functions only. First the application must request the operation and pass all pertinent parameters to the component 35. Next, the component 35 directs the CCmpntDisp to carry out the operation. The CCmpntDisp then directs the CDriverMgr to perform the operation and passes all pertinent parameters to it. Before carrying out the operation, the CDriverMgr uses the CUnitMapper to convert all units to the Machine Coordinate System (MCS).
Next, the CDriverMgr directs the CDriver object to carry out the operation and passes the newly mapped parameters to it. The CDriver object uses its internal SPI table to communicate directly with the core Driver function implemented by the driver component.
FIG. 6 shows the sequence of events that occurs when the component 35 is directed to carry out an operation that happens to use extended SPI not supported by the driver 30. The following steps occur when the operation is requested.
First the application must request the operation and pass all pertinent parameters to the component 35. Next, the component 35 directs the CCmpntDisp to carry out the operation. The CCmpntDisp then directs the CDriverMgr to perform the operation and passes all pertinent parameters to it. Before carrying out the operation, the CDriverMgr uses the CUnitMapper to convert all units to the Machine Coordinate System (MCS). Next, the CDriverMgr directs the .CDriver object to carry out the operation and passes the newly mapped parameters to it. The CDriver object uses its internal SPI table to communicate directly with the core Driver function implemented by the driver component.
As briefly discussed above, when using the system 22, there are several types of units and two different coordinate systems used. The process of unit mapping involves converting measurements between the Part and Machine coordinate systems. FIG. 7 illustrates this process, and the following steps occur when the operation is requested.
First the application must request the operation and pass all parameters to the component 35. Noteõall parameters are in the PCS. Next, the component 35 directs the CCmpntDisp to carry out the operation. The CCmpntDisp directs the CDriverMgr to carry out the operation and passes the PCS parameters to it. The CDriverMgr takes all measurements and uses the CUnitMapper to convert them to the MCS. The newly mapped parameters are then passed to the Cdriver, The CDriver directs either the driver or the driver stub component to carry out the operation.
When the application is finished using the motion control component 35 it directs the component 35 to free all of its resources by calling its exposed Release method. This process is depicted in FIG. 8. During the clean-up process, the following steps occur.

WO 4 "':3769 PCTIUS96/08149 First the application must direct the component 35 to release all of its resources by calling its Release method. When invoked, the component 35 passes the call on to the CCmpntDisp object. The CCmpntDisp object directs the CDriverMgr to release any resources it is using. The CDriverMgr directs each CDriver object to release any of its resources, then deletes the CDriver objects. First, the CDriver object releases any interfaces it is using from the driver component.
Then, the CDriver object releases any interfaces it is using from the driver stub component.
FIG. 9 is an interface map related to the motion control component 35. FIG. 10 is a data map showing how data relating to the whether extended driver functions need to be emulated is stored. Attached hereto as Appendix C is a document that describes the actual OLE Interfaces Io exposed, the definitions of the data structures used when passing data around, and the definitions of each class used internally by the motion control component 35.

III. SOFTWARE DRIVERS

The driver 30 is used by both the driver administrator 32 and the component 35. Its main purpose is to implement functionality that generates motion control commands for the specific hardware supported. For example, the AT6400 driver, used to control the Compumotor AT6400 motion control hardware, generates AT6400 command codes. During the initialization phase of the system 22, the driver administrator 32 communicates with each driver 30, allowing the user to add, remove, or change the configuration of the driver. When an application, using the system 22, is run, the component 35 communicates with the driver 30 directing it to carry out the appropriate motion control operations.
This section describes the complete design of a generic driver 30. All drivers are designed from the base design described in this manual. This section is divided into three parts.
First, a module interaction-map that describes all binary modules that interact with the driver 30 is discussed. Next, the module interaction-map is drawn as an object interaction-map, where all the internals of the driver are exposed. In this map, all C++ ob. ects, making up the driver, and their interactions are shown. Next, several scenario-maps are drawn. Each scenario-map displays the interactions taking place between the C++ objects involved during a certain process. Finally, this section describes the interfaces exposed by the driver component, all data structures used, and the definitions of each C++ class used.
Referring now to FIG. 11, the module interaction-map displays all binary modules and their interactions with the driver 30. There are two modules that interact directly with the driver:
the motion control component 35, and the driver administrator 32. The driver administrator 32 queries and changes the driver settings and the component 35 directs the driver to carry out motion control operations, such as moving to a certain location in the system.
Shown at 42 in FIG. 11 is the standard Windows registration database, referred to herein as the registry.
Breaking the module interaction-map down into more detail by including the interactions taking place between all C++ objects used to implement the driver, produces the object interaction-map. The object interaction-map for the driver 30 is shown in FIG.
12.
Each object in the diagram is described as follows.
CDriverDisp is the dispatch object used to dispatch exposed interface methods.
During the dispatch process, all raw data is converted into the appropriate C++ form.
For example, collections of data passed between OLE components is usually packaged in a raw block of memory. The CDriverDisp object takes care of packing outgoing data and unpacking incoming data. Data packing involves converting the data between a raw and native C++
format.
The CStreamMgr object is responsible for managing the set of streams registered with the driver. Streams, may be added, removed, and enabled. Only enabled streams are sent data.
The CLSID and enabled status of each stream registered, is stored in the registration database.
When communicating to streams, the CStreamMgr is used to send the command string to all enabled streams.
The CCommandMgr object is used to build commands sent to the stream, and extracting responses received from the stream. The CCommandMgr is the controlling object that manages the CResponse, CCommandList, and CStream objects.
The CCommandList object stores the complete list of commands making up the motion control command language. Such commands may be stored as text resources or in a text file.
The CCommand object builds command strings that are then sent to the CStream.
Each command built is a complete motion control command string.
The CResponseList object builds CResponse objects that are initialized with the parsing format for the expected response.
The CResponse object converts raw response strings, returned by the CStream, and converts them into C++ data types. For example, a response string containing position data may be converted into a set of double values.
The CStream object is used to communicate directly with the underlying stream component Figures 14-20 contain scenario maps that describe all main scenarios, or operations, that occur on the driver 30. Each scenario-map displays all objects involved, and the interactions that take place between them in the sequence that they occur.
There are two types of operations that occur on the driver 30. First, the driver administrator 32 may initiate operations, such as adding streams or configuring the driver. Next, the motion control component 35 may initiate operations on the driver when an application is 3i actually running. The following discussion describes each perspective, starting with the operations directed by the Driver Administrator', all operations made on the driver by the driver administrator are discussed in the order that they may occur when using the driver.
Before a driver may be used, it must be registered in the OLE system. In order to register a driver the driver administrator first verifies that the module being registered is actually an driver 30, then it calls the DLLRegisterServer exported function to register the driver. Each module of the system 22 exports a function called DLLGetModuleType. This function is used to verify that the module is an driver 30 component. FIG. 13 displays the interactions that take place when registering a driver.
During the registration process shown in FIG. 13, the following steps occur.
First, the driver administrator must load the DLL, containing the stream component, verify that the module is an driver 30. To do so, the driver administrator calls the DLLGetModuleType function, exported by the driver. If the function returns a value that contains the value XMC_DRIVER_MT
in the high byte, then the driver administrator proceeds and registers the driver by calling its exported function. DLLRegisterServer. When called, the implementation of the DLLRegisterServer writes all OLE 2.0 registration information to the Windows registration database.
Referring now to Figure 14, after the driver is registered, the driver administrator can load the component 35 using the OLE CoCreatetnstance function. During the initialization process, the driver loads all registration data and initializes both the CDriverDisp and CStreamMgr C++
objects.
During initialization, the following steps occur.
Before loading the driver component, the driver administrator must query the driver module for its CLSID. Calling the driver's exported function, DLLGetCLSID, returns the CLSID.
Once it has the CLSID, the driver administrator may create an instance of the driver by calling the standard OLE function CoCreateinstance. When first loaded, the driver loads any registration data previously stored. Next, the driver directs the CDriverDisp object to initialize the system.
When notified. the CDriverDisp object initializes itself and then directs the CStreamMgr to initialize itself. During its initialization, the CStreamMgr loads all stream settings from the registration database. For example. the CLSID and enabled state of all streams previously registered with the driver, are loaded.
After initializing the driver, the driver administrator may perform operations on it. For example, the driver administrator may request the driver to add or remove a stream. FIG. 15 displays the sequence of events occurring when the driver is requested to add a new stream.
When adding a stream, the following steps occur.
First the driver administrator directs the stream to add a new stream and passes CLSID
of the stream, to be added, to the driver. The driver then passes the CLSID to the CDriverDisp 3~ object and directs it to add the stream. The CDriverDisp object passes the information on to the CStreamMgr and directs it to add the stream. In the final step, the CStreamMgr assumes that the module is a valid stream component 28 and adds the CLSID to the drivers set of information in the registration database.
Another operation requested of the driver, after initialization, is that of querying it for its current settings. Before displaying information about the driver, like the name of the hardware it supports, the driver administrator must query the driver for the information.
For example, FIG. 16 displays the process of querying the driver for an enumeration of the streams registered with it.
When querying the driver for information, the following steps occur.
First the driver administrator, calls the interface method used to query the driver's stream enumeration. Next, the driver directs the CDriverDisp to create the stream enumeration. The CDriverDisp object then directs the CStreamMgr to prepare the stream enumeration. The CStreamMgr checks the registration database and makes sure its internal state is in sync with the data stored in the registry. Next, it sets a lock that will cause all stream management operations, such as adding or removing streams, to fail. The CStreamMgr prepares the list of streams and loads them into memory using the CStream object. The CStream object loads the stream component using the OLE CoCreateinstance API.
After the driver administrator is done using the driver, it must release the driver by calling its exposed Release method. Calling this method, directs the driver to release all resources used.
FIG. 17 displays the process of releasing the driver component. During the clean-up process, the following steps occur.
First the driver administrator must direct the driver component to clean itself up by calling its Release method. When invoked, the driver component passes the call on to the CDriverDisp object. The CDriverDisp object then directs the CStreamMgr to save all data.
The CStreamMgr saves all data, including the state of each stream, in the registration database. Finally, the driver saves all internal data in the registration database.
After a driver is successfully installed into the system 22 and configured using the driver administrator, it is ready for use by the motion control component 35. The component 35 uses the driver 30 when performing motion control operations requested from the application using the component 35. The following discussion describes the component 35 directed operations that can take place on the driver.
Before using the driver, it must be initialized by the component 35. This operation is different from the driver initialization taking place on the driver when used by the driver administrator because the system must be prepared for sending and receiving commands. In order to prepare for the data communication, the stream must be initialized and then opened.
FIG. 18 describes the initialization process. The following steps occur during the initialization process.
First the component 35 must direct the driver to initialize itself. This is usually a two step 3S process. In the first step, the component 35 creates and instance of the driver using the standard OLE CoCreatelnstance function. Next, the Initialize method, exposed by the driver, is called to prepare the driver for data transmissions. When the Initialize method is called, the driver first loads any internal data stored in the registration database 42. Next, the driver directs the CDriverDisp to initialize the internal system. The CDriverDisp then directs the CStreamMgr to initialize the streams. Next, the CStreamMgr loads all data from the registration database, including the set of all CLSID's and enabled status' for all streams registered with the driver.
Then the CStreamMgr loads each enabled stream by creating a new CStream object for each enabled stream. When creating each CStream object, the CLSID for the underlying stream is passed to the CStream object. When each CStream object is created and attached to a stream component it loads the component 35 by calling the standard OLE
CoCreateinstance function.
Once the CStreamMgr is done, the CDriverDisp directs the CCommandMgr to initialize itself.
During its initialization process, the CCommandMgr initializes and loads the CCommandList.
Also, when the CCommandMgr is initializing, it loads the CResponseList corresponding to the CCommandList.
Once the system is initialized, the motion control component 35 can direct the driver to carry out certain command operations. Command operations are standard motion control operations such as moving to a specific location in the system, or querying the system for the current position. FIG. 19 describes the process of commanding the driver to carry out a certain operation. When commanding the driver to perform a certain operation the following steps occur.
First, the component 35 directs the driver to perform the operation, such as moving to a position or querying the system for the current position. Next, the driver directs the CDriverDisp object to perform the operation. The CDriverDisp object then directs the CCommandMgr to build the appropriate command. Any parameters related to the command are passed to the CCommandMgr. For example, when directing the driver to move to a certain position, the position information is passed to the CCommandMgr. Next, the CCommandMgr requests the CResponseList to create a CResponse object. The CResponseList looks up the response format and uses it to create a new CResponse object that is returned to the CCommandMgr. Then, the CCommandMgr directs the CCommandList to create the command. Any parameters related to the command are passed to the CCommandList. The CCommandList creates a new CCommand object. looks up the raw command string, and passes it and the command parameters to the CCommand object who then builds the command string.
The CCommandMgr, then passes the CCommand object, returned by the CCommandList, and the previously created CResponse object to the CStreamMgr object. The CStreamMgr object is directed to process the objects. The CStreamMgr passes the CCommand and CResponse objects to all enabled CStream objects. The CStream object queries the CCommand object for the full command string in raw text form. The raw text command is passed to the stream component. Next, the CStream object waits for the response, then reads the raw text response into a buffer. The raw text response is then passed to the CResponse object. Next the CRETONNE object is returned to the CStreamMgr, who returns it to the CCommandMgr, who returns it to the CDriverDisp object. Eventually the CResponse returns to the CDriverDisp object, who then directs the CResponse to convert the response into a generic C++
type. The generic type is returned to the motion control component 35.
Once the component 35 is finished using the driver, the driver must be released by calling its Release method. Releasing the driver frees all resources used by the driver. FIG. 20 describes the process of releasing the driver. The following steps occur when cleaning up and freeing all resources used by the driver.
First, the component 35 must call the driver's Release method. When called, the driver directs the CDriverDisp object to release any resources used. The CDriverDisp then directs the CStreamMgr to free any resources used. The CStreamMgr then frees all active CStream objects.
Each CStream object releases all stream component interfaces used. Next the CDriverDisp directs the CCommandMgr to free all of its resources. During its clean-up, the CCommandMgr frees the CCommandList object. To complete its clean-up, the CCommandMgr frees the CResponseList object.
Attached hereto as Appendix D is a document that describes the actual OLE
Interfaces exposed, the definitions of the data structures used when passing data around, and the definitions of each class used internally by the driver.
IV. STREAMS

This section describes the stream component 28 used as the data transport layer between the driver 30 component and the destination output location such as the motion control device 20 and/or the output file 34. For example, when using motion control hardware that is connected to the PC Bus, the driver 30 Component will communicate with the PC Bus stream component 28.
The design of a stream component 28 will be discussed in three parts. First, a Module Interaction-Map describes the modules that are involved, with respect to the stream, and how they interact with one another. Next, the Object Interaction-Map breaks the Module Interaction-Map down into a more detailed view that not only displays the interactions occurring between modules, but also the interactions taking place between the C++ objects within the stream component 28. Then, the Object Interaction-Map is "tested" by running it through several Scenario-Maps. Each Scenario-Map displays the object interactions taking place during a certain operation.
The Module Interaction-Map shown in FIG. 22 displays all modules that interact with the stream component 28. Interactions begin from two different perspectives.
First, the driver administrator 32 interacts with the stream component 28 when installing, removing, and configuring the stream. Next, when used, each driver 30 interacts with the stream while sending and retrieving data to and from the destination. For example, when a driver writes data to a text file stream, the stream takes care of writing the data out to the file. Or, if the driver reads data from a PC Bus stream, the stream does the actual read from the hardware and passes the data back to the driver.
Drivers only communicate with streams that have been specifically connected to the driver. Once connected, the stream is used to communicate with the destination object, like the PC Bus, serial I/O connection, text file, or debug monitor.
The stream component 28 shown in FIG. 22 is the object that operates as the data transport layer for each driver. Each stream has a differen! taroet that defines the type of the stream. The following are the current stream targets.
PC Bus/WinNT - This Windows NT stream uses a Windows NT SYS device driver to communicate directly with the motion control hardware connected to the PC
Bus.
PC Bus/Win95 - This Windows 95 stream uses a Windows 95 VxD to communicate directly with the motion control hardware connected to the PC Bus.
PC Bus/Win 3.1 - This Windows 3.1 stream communicates directly with the motion control hardware connected to the PC Bus.
Serial - This stream uses the COMM API to communicate with the motion control hardware connected to the serial port.
Text File - This stream is write-only and sends all data to a text file.
Debug Monitor - This stream is write only and sends all data to the debug monitor.
Custom - This is a custom stream that sends data to an unknown location.

Similar to the Module Interaction-Map, the Object Interaction-Map displays interactions between modules. In addition, this map, shows all interactions taking place between each C++
object within the stream component 28. FIG. 23 is the Object Interaction-Map for the stream component 28.
Each object in the diagram is described as follows. The CStreamDisp object is the dispatch object used to dispatch exposed interface methods. During the dispatch process, all raw data is converted into the appropriate C++ form. For example, collections of data passed between OLE components is usually packaged in a raw block of memory. The CStreamDisp object takes care of packing outgoing data and unpacking incoming data. Data packing involves converting the data between a raw and native C++ format.
The CRegistryMgr object takes care of managing all data stored in the registration database. Since many streams of the same type may exist at the same time, each stream is assigned a handle. The handle assigned, is used by the stream to look up the location it uses to load and store data in the registration database, much as an library index is used to locate a library book.
All input and output is funnelled through the CIOMgr manager. Management of input and output operations consists of buffering data and controlling primitives used to transport data to and from the target location.
The CIOHAL object is the input/output hardware abstraction layer. With in this object lay all hardware dependent code such as calls to inp and outp. Each different type of stream contains a different implementation of this object.
Scenario-Maps are specialized Object Interaction-Maps that display how each module and the objects inside the stream component interact with one another during the operation described by the map. The Scenario-Maps in FIGS. 24-32 are broken into two different categories; those that are initiated by the driver administrator 32, and those that are initiated by the driver 30.
Operations directed by the driver administrator are usually related to initializing, uninitializing, and configuring the stream. The following sections describe all operations, directed by the driver administrator, that take place on the stream.
Before a stream component can be used by anyone, it must be registered in the Windows registration database. Registration is a standard OLE 2.0 operation required in order to use any OLE 2.0 component, such as the stream component. FIG. 24 describes this process. During the registration process, the following steps occur.
First, the driver administrator must load the DLL, containing the stream component, verify that the module is an stream component 28. To do so, the driver administrator calls the DLLGetModuleType function, exported by the stream. If the high byte in the return value contains the value XMC_STREAM_MT, then the driver administrator proceeds and registers the stream by calling its exported function, DLLRegisterServer. When called, the implementation of the DLLRegisterServer writes all OLE 2.0 registration information to the Windows registration database.
After the stream component is successfully registered, it is ready for initialization. During initialization, the stream component not only initializes itself, but also initializes any device drivers used by registering the driver with the operating system. For example, the Windows NT stream component registers the Windows NT SYS driver with Windows NT and starts the service. FIG.
25 describes this process. During initialization, the following steps occur.
First the driver administrator must direct the stream to initialize itself.
When making this call, the name and location of the driver used, and the handle of the stream are passed into the is method as arguments. Once directed to initialize itself, the stream component calls the CStreamDisp and directs it to initialize the system. The CStreamDisp object then directs the CRegistryMgr to load all pertinent data for the stream using the handle passed to it. The CRegistryMgr loads all data from the registration database. After all information is loaded from the registry, the CStreamDisp directs the CIOMgr to register the appropriate driver with the operating system. The CIOMgr directs the CIOHAL to register the driver, if appropriate. If running in Windows NT, the CIOHAL registers the SYS driver with the Windows NT
operating system and starts the driver. If running in Windows 95, the VxD integrity is verified with a quick, dynamic, load and unload.
After initializing the stream component, it may be queried for its current settings or directed to set new settings. Since both operations are very similar, only changing settings will be described. Stream settings include data such as: port addresses, IRQ levels, file names, etc.
Any data needed to communicate with the output/input target are included in the stream sittings.
FIG. 26 describes the process of changing the streams settings. During the setup process, the following steps occur.
First the driver administrator directs the stream to use the data passed to change its internal data. Once directed, the stream component passes the interface method invocation to the CStreamDisp object. The CStreamDisp object then directs the CRegistryMgr to store the new settings. The CRegistryMgr stores the new values in the registration database.
When the driver administrator is done using a stream component, it must clean up the resources used. FIG. 27 describes this process. During the clean-up process, the following steps occur. First the driver administrator must direct the stream component to clean itself up by calling its Release method. When invoked, the stream component passes the call on to the CStreamDisp object. The CStreamDisp object then directs the CRegistryMgr to save all data. All persistent data is saved to the registration database by the CRegistryMgr.
Driver directed operations occur when each driver 30 uses the stream component connected to it. Remember, each stream component is used as the data transport layer. Each driver uses the stream to transfer the motion control command data, it generates, to the output target. Streams are also used to transfer data back to the driver when read operations occur.
Only certain streams are readable.
Before the driver can perform operations on the stream, the stream must be initialized.
initialization occurs in two steps. First the OLE stream component must be loaded, and then once it is, the stream must be explicitly initialized. FIG. 28 describes the second portion of the initialization process. The following steps occur during the initialization process.
First the driver must invoke the Initialize methods exported by one of the stream interfaces. When calling Initialize, the driver passes to the stream, the stream handle. Next. the stream passes the directive on to the CStreamDisp object for dispatching. The CStreamDisp object first directs the CRegistryMgr to load all settings stored in the location defined by the stream handle. The CRegistryMgr reads in the data stored in the registry at the handle. After the data is loaded, the CStreamDisp, directs the CIOMgr to initialize itself. As part of its initialization, the CIOMgr initializes the CIOHAL object that it is using.
Once a stream has been initialized, it must be opened. Opening a stream places the stream in a state where it can pass data between the driver and the target.
FIG. 29 describes the process of opening a stream. When opening a stream, the following steps occur.
First the driver directs the stream to open itself, by calling the Open exposed interface method. Once directed, the stream passes the call on to the CStreamDisp object. Next, the CStreamDisp object directs the CIOMgr to open the stream. At this time, the CIOMgr prepares any buffers that will later be used when transferring data through the stream.
After the buffers are ready, the CIOMgr directs the CIOHAL object to interact with the target and open it. CIOHAL
directly communicates with the 'target or with a device driver and opens the stream. When operating with hardware streams, the device driver, or Serial IO directly communicates with the hardware and prepares it for operation.
After opening a stream, it is ready to perform data transport operations.
There are two main data transport operations available: Reading data, and writing data. FIG.
30 describes the process of writing data to the stream. When writing to the stream, the following steps occur. First the driver directs the stream to write data to the target and passes the data to the stream. Next.
the stream passes the data to the CStreamDisp object. The CStreamDisp object passes the block of data to the CIOMgr and directs it to write it to the target. The CIOMgr object either passes the complete block of data to the CIOHAL object, or stores the block in an internal buffer and then passes pieces of the buffer to the CIOHAL object until the complete buffer is sent. The CIOHAL object takes the data passed to it and either sends it directly to the target, passes it to a device driver, or calls COMM API to send the data to the Serial IO port. The device driver or COMM API sends the data directly to the hardware controlled.
Certain streams, like the PC Bus and Serial 10 streams, return data after write operations occur on them. The data returned may be specific to a previous request for data, or status describing the success or failure of the previous write operation. FIG. 31 describes the process of reading data from the stream. It should be noted that not all streams are readable. Currently, the only readable streams are the PC Bus and Serial streams. During the operation of reading data from the target, the following steps occur.
First the driver directs the stream to read data from the target. The stream passes the call on to the CStreamDisp object. The CStreamDisp object directs the CIOMgr to perform the read. Depending on how the stream is implemented, the CIOMgr may either make one call or multiple calls to the CIOHAL object. If multiple calls are made, all data read is stored in CIOMgr internal buffers. The CIOHAL object either directly communicates to the hardware, uses the COMM API, or a device driver to read the data. If a device driver or the COMM
API are used, they directly communicate with the hardware to read the data.
Once the driver is done using the stream, it must direct the stream to clean-up all resources used. To do so, the driver calls the standard Release method. FIG.
32 displays the sequence of events taking place after the Release method is called. The following steps occur when cleaning up and freeing all resources used by the stream.
First the driver must call the stream's Release method. Next, the stream directs the CStreamDisp object to release all resources used. The CStreamDisp object then directs the CIOMgr to free any resources used in buffers, etc. Next, the CIOMgr directs the CIOHAL to free any resources used. During its clean-up and depending on the type of stream, the CIOHAL will delete text files used, close the debug monitor, shut-down the hardware, or direct any device drivers to shut-down the hardware. If device drivers or the COMM API are used, they direct the hardware to shut-down.
FIG. 33 depicts an interface map for the stream 28. Attached hereto in Appendix E is a document that describes the actual OLE Interfaces exposed, the definitions of the data structures used when passing data around, and the definitions of each class used internally by the stream.
V. DRIVER STUB MODULE

The driver stub module 36 is used to fill in the extended Driver functions that the driver 30 is unable to support or implement. By simulating the extended SPI, applications are able to use a larger set of motion control functionality than would be available if the application directly programmed the motion control hardware. In order to implement the extended SPI, the driver stub uses software algorithms that call core SPI interface methods implemented by the driver 30.
During the initialization of the driver stub, the driver 30 to use is registered with the driver stub.

This section describes all aspects of the driver stub 36 in three basic parts.. The first part' 10 of this section describes all binary modules affecting the driver stub. Next, a more detailed view, that includes all C++ objects used inside the driver stub, is described. Then several processes that take place on the driver stub are described.
The module interaction-map displays all binary modules and their interactions with the driver stub 36. As can be seen from FIG. 34, the driver stub is used by the component 35. More or less, the driver stub acts as a helper to the component 35 by filling in all extended Driver functionality possible.
By taking the module interaction-map in FIG. 34 and displaying all interactions taking place with all C++ objects implementing the driver stub, we produce what is called the object interaction-map. FIG. 35 is the object interaction-map for the driver stub 36 component.
Each object in the diagram is described as follows.
The CDriverStubDisp object is the dispatch object used to dispatch exposed interface methods. During the dispatch process, all raw data is converted into the appropriate C++ form. For example, collections of data passed between OLE
components is usually packaged in a raw block of memory. The CDriverStubDisp object takes care of packing outgoing data and unpacking incoming data. Data packing involves converting the data between a raw and native C++ format.
The CSPIMgr object is responsible for managing all SPI issues such as managing the CSimpleDriver by directing it to connect to the appropriate SPI core interfaces exposed by the driver.
TheeCSimpleDriver object is used to directly communicate with the driver implementing the SPI core interfaces. The CSimpleDriver only communicates with the core SPI interfaces implemented by the driver.

The following discussion describes all main scenarios, or operations, that occur on the driver stub 36. Each scenario-map displays all objects involved, and the interactions that take place between them in the sequence that they occur. All operations on the driver stub originate from the motion control component 35. In addition to the motion control component 35, the XMC
Setup Component interacts with the driver stub when installing the system 22.
It should be noted WO 96138769' PCTTUS96108149 that all scenarios below assume that the driver stub 36 has already been registered in the OLE
system. Registering this component is the responsibility of the setup application and setup component.
This discussion describes all operations made on the driver stub by the motion control component 35. Each section is discussed in the order that they may occur when using the driver.
As shown in FIG. 36, before using the driver stub 36, the motion control component 35 must initialize it by creating an instance of the driver stub, and then initializing the instance created. Calling the standard OLE function CoCreatelnstance completes the first step. After an instance is created, the component 35 must call the driver stub exposed Initialize interface method. During initialization, the following steps occur.
The component creates an instance of the driver stub by calling the standard OLE
function CoCreatelnstance. Once loaded, the CLSID of the driver to use is passed to the driver stub when calling its Initialize exposed interface method. When first loaded, the driver loads any registration data previously stored. Next, the component 35 passes the CLSID, of the driver to use, to the CDriverStubDisp object and directs it to initialize the system.
The CDriverStubDisp object then directs the CSPIMgr to initialize itself and passes the driver CLSID to it. The .CSPIMgr passes the CLSID to the CSimpleDriver and directs it to only query the core SPI
interfaces exposed by the driver. The CSimpleDriver loads an instance of the driver then queries all core interfaces exposed by the driver.
Once the driver stub is initialized, it is ready to perform operations such as performing extended Driver functions. FIG. 37 describes the steps that occur when the component 35 directs the driver stub to perform an extended SPI operation. The following steps occur when the operation is requested.
First the component 35 must request the operation and pass all pertinent parameters to the driver stub. Next, the driver stub directs the CDriverStubDisp to handle the operation. The CDriverStubDisp then directs the CSPIMgr to perform the SPI extended function and passes the appropriate XMC_EXT SPI identifier as a parameter. The CSPIMgr calls the appropriate function corresponding to the XMC_EXT_SPI identifier. The function simulates the extended Driver function and calls the CSimpleDriver for core operations. When directed, the CSimpleDriver performs SPI core functions by directly calling the exposed interfaces implemented by the driver.
When the motion control component 35 is finished using the driver stub 36, it must release it by calling the exposed Release method. Calling the Release method causes the driver stub to free all the resources it uses. FIG. 38 displays this sequence of events. During the clean-up process, the following steps occur.
First the component 35 must direct the driver stub to release all of its resources by calling its Release method. When invoked, the driver component passes the call on to the CDriverStubDisp object. The CDriverStubDisp object then directs the CSPIMgr to release any resources that it was using. The CSPIMgr releases all resources including the CSimpleDriver object used. When freed, the CSimpleDriver releases any interfaces used from the driver.
FIG. 39 is an interface map of the driver stub module 36. Attached hereto as Appendix F
is a document that describes the actual OLE Interfaces exposed, the definitions of the data structures used when passing data around, and the definitions of each class used internally by the driver.
VI. DRIVER ADMINISTRATOR MODULE

The driver administrator 32 is used from two different perspectives. When the driver administrator Control Panel Applet 38 is used to configure the system, the applet directs the driver administrator 32 to carry out the operations. The applet 38 simply provides the user-interface, and the component 35 does the real work of managing drivers and streams used with the system 22. Using the driver administrator component with the control panel applet is the first perspective on using the component 35.
In the second perspective, the motion control component 35 uses the driver administrator component to query for the current set of enabled the driver 30. It should be noted that, currently, only single driver operation is allowed. Clearly, the system 22 may support multiple drivers that are virtualized. For example, if two, four axis, drivers are installed, applications using the system could act as though they were using an eight axis system.
This section describes the driver administrator 32 in three main parts. First, all modules interacting with the driver administrator component are described along with their interactions.
Next, the module interaction-map is expanded to display all interactions taking place between the C++ objects used to implement the driver administrator 32 Component. This description is called the object interaction-map. Then, the object interaction-map is tested by running it through several scenarios, or scenario-maps. Each scenario-map displays the events and the order in which they occur in a certain process taking place on the driver administrator component.
The module interaction-map shown in FIG. 40 displays all binary modules and their interactions with the driver administrator 32 Component Both the driver administrator CPL 38 and the motion control component 35 are the main modules that interact with the driver administrator 32 Component.
The driver administrator CPL module 38 provides the user-interface that allows the user to add, configure, and remove drivers and streams in the system 22. The driver administrator 32 handles all driver and stream management. Even though the control panel applet provides the user-interface, this module 32 does the actual management work.
In addition, the driver administrator is used by the component 35 to access the current driver(s) to use when-carrying out motion control operations. For example, if the AT6400 driver is selected as the current driver when the component 35 queries the driver administrator, the driver administrator returns the CLSID of the AT6400 driver.
Taking the driver administrator 32, displayed in the module interaction-map, and displaying all interactions occurring between the C++ objects used to implement the administrator 34, produces the object interaction-map therefor. The object interaction-map for the driver administrator 32 is shown in FIG. 41.
Each object in the diagram is described as follows.

The CDriverAdminDisp object is the dispatch object used to dispatch exposed interface methods. During the dispatch process, all raw data is converted into the appropriate C++ form.
For example, collections of data passed between OLE components is usually packaged in a raw block of memory. The CDriverAdminDisp object takes care of packing outgoing data and unpacking incoming data. Data packing involves converting the data between a raw and native C++ format.
The CDriverinfoMap object is used to build the information used by the driver administrator CPL 38 when displaying information about each driver or stream.
The CModuleMgr object is responsible for managing all stream and driver modules in the system. A list of all drivers registered are stored persistently in the registration database by the CModuleMgr. Each time a driver or stream is accessed the CModuleMgr is used to get the module.
The CSimpleDriver object is used to directly communicate with the driver component. All OLE specific details are encapsulated within this object.
The CSimpleStream object is used to directly communicate with the stream component All OLE specific details are encapsulated within this object.
FIGS. 42-49 describe all main scenarios, or operations, that occur on the driver administrator 32. Each scenario-map displays all objects involved, and the interactions that take place between them in the sequence that they occur.
Referring now to FIG. 42, before using the driver administrator component, it must be initialized. FIG. 42 describes the process of initializing the driver administrator component from either the driver administrator control panel applet or the motion control component. During initialization, the following steps occur.
First, either the control panel applet or the motion control component must create an instance of the driver administrator component by calling the standard OLE
function CoCreatelnstance. Next, the exposed Initialize interface method must be called. When the Initialize method it alley 4 river administrator t direc, CDri eiAdmiunDis .:aeia::Z ... .-U Ca.~ _' .he driver o1J i uauawi component ui~ iS the i'LJ i U~ii Dip to initialize the system. Next, the CDriverAdminDisp directs the CModuleMgr to initialize itself and any modules that it is managing. The CModuleMgr, first, loads all information from the registration database. Then for each driver registered, the CModuleMgr creates an instance of the driver by calling the standard OLE function CoCreatelnstance. Next, the CModuleMgr calls each drivers Initialize method, passing to the method the CLSID of the driver component to attach. The CSimpleDriver attaches to the driver component by calling the standard OLE
function CoCreatelnstance.
The driver administrator 32 can register both drivers and streams. Registering drivers is very direct, since the driver administrator manages the drivers registered in the system.
Registering streams, on the other hand, is more complex, since each stream must be registered with a driver and the driver manages the streams registered with it, not the driver administrator, The following discussion describes the process of registering both drivers and streams.
Registering a driver entails verifying that the module is actually a driver, verifying that the driver can be loaded, and storing the driver information in a persistent location. FIG. 43 describes this process. When registering a driver, the following steps occur.
First, the driver administrator CPL passes the name of the driver and directs the driver administrator component to register it. Next, the driver administrator component passes the driver name to the CDriverAdminDisp and directs it to register the module. The CDriverAdminDisp directs the CModuleMgr to register the new driver. The CModuleMgr creates a new CSimpleDriver and requests it to register the driver. First the CSimpleDriver verifies that the driver is valid by calling its DLLGetModuleType exported function. If the function returns XMC_DRIVER_MT the CSimpleDriver then calls the driver's exported function DLLRegisterServer to register the module in the OLE system. Next the CLSID is queried from the module by calling its exported DLLGetCLSID function. The CLSID returned is then used to load the driver by calling the standard OLE function CoCreateinstance. If the CSimpleDriver is successful, the CModuleMgr stores the driver CLSID in the registration database.
Registering a stream is similar to registering a driver, but a little more complex, since each stream must be registered with a specific driver. FIG. 44 displays the process of registering a stream. When registering a stream, the following steps occur.
First, the driver administrator CPL passes the CLSID of the driver and the filename of the stream to register with the driver, to the driver administrator component. The driver administrator component directs the CDriverAdminDisp to register the stream. The CDriverAdminDisp object directs the CModuleMgr to register the stream and passes the CLSID of the driver and the name of the stream along to it. First, the CModuleMgr verifies that the CLSID of the driver one of the registered drivers. If it is not, the driver is registered as discussed above.
Next, the CModuleMgr creates a new CSimpleStream object and directs it to verify and load the stream component. The CSimpleStream first verifies that the module is actually an stream component 28 by calling its exported DLLGetModuleType function. If the function returns XMC_STREAM_MT, the CSimpleStream continues and registers the stream component by calling its DLLRegisterServer exported function. Finally, the CSimpleStream object queries the new module for its CLSID by calling the module's exported DLLGetCLSID
function. The new CLSID is used, by the CSimpleStream, to load the stream component using the standard OLE
function CoCreatelnstance. If the CSimpleStream succeeds, the CLSID of the stream is passed along to the CSimpleDriver who is directed to register the stream. The CSimpleDriver passes the CLSID to the driver component and directs it to register the stream.
The following discussion describes setting information in either a driver or stream. When the user edits information in the driver administrator control panel applet 38, the applet 38 directs the driver administrator 32 to edit the settings for the stream or driver being edited. The following discussion describes how this configuration process works.
Editing the settings of a driver takes place when the user changes the driver settings displayed in the driver administrator CPL. Changing these settings causes the process described in FIG. 45 to occur within the driver administrator component. The following steps occur when setting the driver configuration.
When driver settings are changed in the CPL 38, the driver administrator CPL
directs the driver administrator component to make the appropriate changes to the driver corresponding to the driver handle. A XMC-DRIVER-INFO structure is passed to the component 35, describing the new values for the driver. The driver administrator component takes the XMC-DRIVER-INFO structure and the handle to the driver and passes the information to the CDriverAdminDisp object, directing it to change the settings in the driver.
The CDriverAdminDisp object directs the CModuleMgr to edit the driver corresponding to the driver handle. The CModuleMgr locates the CSimpleDriver with the handle and directs it to change its settings to those stored in the XMC-DRIVER-INFO structure. The CSimpleDriver passes the XMC DRIVER INFO structure to the driver component and directs it to change its settings.
As shown in FIG. 46, when the user edits stream settings in the driver administrator CPL
38, the following steps occur.
After the user changes settings for the stream in the CPL, the driver administrator CPL
directs the driver administrator component to change the stream's settings and passes a handle to the driver containing the stream, a handle to the stream, and a XMC_STREAM_INFO structure describing the new values. The driver administrator component directs the CDriverAdminDisp object to change the streams settings. The CDriverAdminDisp object directs the CModuleMgr to change the settings of the stream corresponding to the handle.
First, the CModuleMgr locates the driver corresponding to the driver handle.
Next, it requests the CSimpleDriver to change the settings for the stream corresponding to the stream handle. The CSimpleDriver searches for the stream corresponding to the stream handle a- .4 directs it to change its settings to those stored in the XMC_STREAM_INFO
structure. The CSimpleStream directly communicates with the stream component and directs it to change its settings to those in the XMC_STREAM_INFO structure.
There are two different types of information that may be queried from the driver administrator 32: the enumeration of all drivers registered, and the driver information map, The motion control component 35 uses the driver enumeration when selecting the set of drivers to use and control during motion control operations. The driver information map, on the other hand, is used by the driver administrator CPL 38 to update the user-interface display describing all drivers and streams registered in the system. The following discussion describes the process of querying for both the driver enumeration and the driver information map. Querying for the driver enumeration occurs during the initialization of the motion control component 35. When initializing, the component 35 must know what drivers to use when performing motion control operations. The driver administrator 32 Component is used for that very purpose. Querying the driver enumeration just returns a pointer to the lXMCEnumDriver interface exposed by the driver administrator 32 Component. FIG. 47 displays the events that occur when using the interface to get each driver in the enumeration. Using the interface causes, the following steps occur.
First, the motion control component 35 queries the driver administrator 32 Component for the next driver. Next, the driver administrator 32 Component directs the CDriverAdminDisp to get the next driver supported. The CDriverAdminDisp directs the CModuleMgr to get the next driver.
The CModuleMgr then directs the CSimpleDriver to either return the CLSID or a pointer to the (Unknown interface for the driver, depending on the parameters of the enumeration. If the CSimpleDriver is requested to return a pointer to the (Unknown interface, the interface is queried from the driver component.
Another set of information that may be queried from the driver administrator 32 consists of the driver information map. This data is used by the driver administrator CPL 38 when displaying information describing the drivers and streams registered in the system. As shown in FIG. 48, when querying the system for the driver interface map, the following steps occur.
First, the driver administrator CPL 38 queries the driver administrator 32 Component for the current driver information map. When queried, the driver administrator component directs the CDriverAdminDisp to create and load a CDriverlnfoMap class. The CDriverAdminDisp creates the CDriverlnfoMap. Next, the CDriverAdminDisp passes the CDriverlnfoMap to the CModuleMgr and directs it to load the information map. The CModuleMgr queries each driver registered for its internal information. Each CSimpleDriver communicates directly with the driver component and queries it for all pertinent driver information. Next, the CModuleMgr queries each driver for a list of all streams registered with the driver. Using the stream enumeration, each CSimpleDriver creates an array of CSimpleStream objects and returns the array to the CModuleMgr. For each CSimpleStream object in each array, the CModuleMgr queries for all pertinent stream information. Each CSimpleStream communicates directly with the stream component and queries it for all information describing the stream.
After the driver administrator CPL 38 or the motion control component 35 are finished using the driver administrator 32, they must release the component 35 to free any resources it was using. FIG. 49 describes this process. When cleaning up after a call to the Release method, the following steps occur.
First, either the driver administrator CPL 38 or the motion control component 35 must direct the driver administrator 32. Component to release itself by calling its Release method.
Next, the driver administrator component directs the CDriverAdminDisp object to free all resources used in the system. The CDriverAdminDisp then directs the CModuleMgr to free any resources that it is using. First, the CModuleMgr traces through all CSimpleDriver objects, querying each for their CLSID and enabled state: Next, each CSimpleDriver is freed. Each CSimpleDriver object freed, frees all arrays of CSimpleStream objects registered with it. When freed, each CSimpleStream object releases all interfaces that it was using from the stream component. In its final clean-up, each CSimpleDriver releases all interfaces that it was using from the driver component. All CLSID and enabled state information is stored persistently in the registration database.
FIG. 50 depicts an interface map for the driver administrator 32. Also, attached hereto as Appendix G is a document that describes the actual OLE Interfaces exposed, the definitions of the data structures used when passing data around, and the definitions of each class used internally by the driver administrator 32 component.

VII. DRIVER ADMINISTRATOR CPL APPLET

This document describes the design of the driver administrator control panel applet 38 (CPL) that is used by the user to add, configure, and remove both drivers 30 and stream components 28 later used by the component 35 when directed to carry out motion control operations. With regard to design, there are three main types of "views" used to look at how the control panel applet works.
First, a module interaction map shown in FIG. displays all main executable and user-interactable items, or modules, that the CPL uses and interacts with. For example, when a dialog is displayed by the CPL executable, both the dialog and the CPL modules are considered to interact with one another. Technically, the dialog is not a module since it is a figment displayed on the screen, but none the less, module interaction maps classify them as such since they are key destination points for user-input.
Second, an object interaction map shown in FIG. 52 displays all main objects making up the modules described in the module interaction map. Objects consist of the actual instances of C++ classes defining each object. All interactions between the objects are drawn out in this interaction map.
Finally, FIGS. 53-57 display a set of scenario maps are drawn out using the object interaction map as a basis. Scenario interaction-maps describe the interactions taking place during a specific operation. Initialization, Adding a driver to the system, and Viewing the support offered by a driver, are all examples of a scenario interaction-map.
The design goals for the driver administrator 32 are the following:
1. User-Interface separation - Implement all user-interface elements used to control the driver administrator 32 Component.
2. Upgradable to OCX Client - Eventually each driver and stream may implement all UI elements with an OCX that then passes all input to the corresponding driver or stream. The driver administrator CPL 38 must be designed in a way that is easy to upgrade to become an OCX client.
3. Provide Stream Independence - drivers 30 should not be required to use streams 28 in order to operate. The design of the driver administrator 32 must make amends to ensure that it is not dependent on stream component 28 operations to operate.
4. Use Windows 95 UI - When ever possible, Windows 95 UI elements should be used. For example, TreeViews, ImageLists, Button Bars, Tab Dialogs and any other UI
elements should be put to use to ensure a Windows 95 look-and-feel.
The following discussion describes the module interaction map for the control panel applet 38. A module is defined as either an executable binary, an external data file, or a main user-interface element used when interacting with the user. FIG. 51 is a drawing of all modules that interact with each other when running the driver administrator control panel applet.
The driver administrator CPL 38 is a control panel applet. And, a control panel applet is a special DLL that exports several functions allowing the Windows Control Panel to communicate with the applet.
The Driver Administrator Dialog is the main dialog that appears when selecting the control panel applet icon from the Windows Control Panel.
The Browse Dialog is used to query the user for a filename. For example when adding a new stream or driver, the driver administrator uses this dialog to ask the user for the location of the new driver or stream to add.
The View Support Dialog displays the support provided by the selected driver 30. Each driver may support a different set of extended functionality. This dialog shows the user exactly how much support is provided by each driver allowing them to determine which functions within their application may not operate when using the driver.
Unlike the Module Interaction-Map described above, the Object Interaction-Map shown in FIG. 52 describes how the actual instances of C++ objects interact with one another within each module.
Other than showing that each dialog is managed by the object, whose name is displayed in the dialog, the main difference from the module IA-map are both the CComCPL
and CDriverAdmin C++ objects. Both objects are described below.
As the description of each dialog class is fairly straight forward and very similar to the dialog description above they will not be described in this section. This section will describe all other C++ objects.
The CComCPL is a C++ object that is generated by the COMBuilder application from a template. It is used to handle all Windows messages sent from the Control Panel Application.
The CDriverAdmin object is used to drive, control, and manage the use of the driver administrator 32 Cor^rnOnsnt. For ` example, alil C_ OLLE 2.0 . teiirfa6ca,n and mr~..0 iiii~, iiiani3 gc~men"t anU data translation is handled by this object. Data translation involves translating data from a standard C++ format to a raw format that is handled easily with the OLE 2.0 data transfer mechanisms.
Scenario Interaction-Maps are almost identical to object interaction-maps but they only display the objects and interactions taking part in a specific operation.
Also, each interaction is numbered by the sequence in which they occur while the operation is running.
The following discussion describes several key operations that occur while running the driver administrator CPL
38 Applet.
Initialization occurs when the user first runs the CPL Applet. During this process all other objects are initialized and several modules are loaded. There are two steps that take place during the initialization process: First the application is initialized, and second the dialog is initialized with values queried from the driver administrator 32 Component. The following sections describe each.
Initializing the application, which is shown in FIG. 53, occurs when the application is first run and the main dialog has not yet been displayed. When initializing the application, the following steps occur.
Through a Windows message, Windows notifies the CComCPL object that the Control Panel Applet has just been loaded. CComCPL then loads the CDriverAdminDialog and tells it to do any dialog prepping before going modal. Next, CDriverAdminDialog loads any settings stored in the Registration Database. For example, the current window position and active tab may be stored in the database. CDriverAdminDialog then Loads the CDriverAdmin class and directs it to initialize itself. During initialization, CDriverAdminDialog creates an instance of the driver administrator 32 and queries all interfaces that will be used.
Once the application is initialized, the default settings to be displayed in the dialog must be set. These values are set when the dialog is initialized, just before displaying it. FIG. 54 describes this process. During the process of initializing the dialog, the following steps occur.
During the dialog preparation that occurs before the DoModal call, CDriverAdminDialog queries the CDriverAdmin object for the driver enumeration to be used when setting initial values to be displayed in the dialog box. CDriverAdmin uses the driver administrator 32 Component to query for the driver information map, which is then passed back to the CDriverAdminDialog.
Once receiving the driver information map, the CDriverAdminDialog uses the information to update all user-interf ace items related to either drivers or streams.
Adding a driver to the system 22 can be broken down into two steps. First, the module name must be added to the system. Next, the driver administrator 32 main dialog must update itself to reflect the new driver just added.
Adding a driver occurs when the user presses the "Add..." button on the driver administrator 32's main dialog. FIG. 55 describes this process. When adding a new driver, the following steps occur.
When adding a driver, first the user must press the "Add..." button. After pressing the button, CDriverAdminDialog opens up the common open file dialog. The user must enter in the filename of the driver to add and close the dialog. CDriverAdminDialog then passes the filename to the CDriverAdmin object and calls the RegisterDriver method passing in the name of the module to register as a driver. CDriverAdmin then passes the driver filename to the driver administrator 32 Component and directs it to register the driver in the system 22.
The process of updating the main dialog is identical to the process of initializing the dialog discussed above.
Similar to the process of adding a new driver, removing a driver involves both removing the driver from the system and then updating the main dialog. Pressing the "Remove" button removes a driver from the XMC software system. FIG. 56 describes this process.
The following steps occur when removing a driver.
To remove a driver, the user must first select the "Remove" button. After pressing the button, the selected driver or parent driver to the selected stream will be removed.
CDriverAdminDialog passes the XMC_HDRIVER of the driver to the CDriverAdmin and directs it to remove the driver by calling its UnRegister method. CDriverAdmin passes the XMC_HDRIVER to the driver administrator 32 Component and directs it to UnRegister the driver.
The process of updating the main dialog is identical to the process of initializing the dialog discussed above.
Viewing Support involves viewing the level of support implemented by the selected driver. FIG. 57 describes the process of providing this information to the user via the View Support Dialog. The following steps occur when viewing the support provided by the driver.
First the user must select the "View Support" button on the driver administrator main dialog. When selected, CDriverAdminDialog queries CDriverAdmin for the driver support information. CDriverAdmin passes the query on to the driver administrator 32 component who actually fills out the information. Once the queried information is returned, the CDriverAdminDialog passes it on to CViewSupportDialog. CViewSupportDialog initializes itself using the driver support information.
Attached hereto as Appendix H is a document that describes the actual OLE
Interfaces exposed, the definitions of the data structures used when passing data around, and the definitions of each class used internally by the driver administrator 32.

VIII_ DRIVER ADMINISTRATOR CPL APPLET

This section contains a description of the driver administrator control panel applet 38.
When using the driver administrator 32 to configure the motion control system, there are two main items that the user will work with: drivers and streams. Each driver 30 generates the hardware specific, control codes that are then sent to the selected stream component 28.
Streams facilitate the data transport layer between the driver and the control-code destination.
Depending on the current hardware setup, different streams may be used. For example, if the hardware is connected to the PC Bus, a PC Bus stream will be used to communicate to it.
On the other hand, if the hardware is connected through a serial cable to a serial I/O Port, the serial stream will be used. Finally, all hardware configurations may use the file stream. When using the file stream, all control-codes are sent to the specified file that can be downloaded to the hardware at a later time.
This section describes both drivers and streams, and how each is configured.
This section initially describes the driver items and all property pages used to edit them. This section also contains a description of the streams and their property pages. Finally, this section describes the about box containing details on the Software.
The main purpose of each driver is to generate the hardware-specific control-codes directing the hardware to carry out specific motion control actions. For example, such actions may include querying the hardware for the current position or directing the hardware to move to a predetermined location in the system. The following discussion describes the property pages used to configure each driver.
There are two types of properties affecting each driver. First, a set of defaults may be set that are used by the motion control component 35 as recommended values. The scaling and units used are several example default values. In addition to setting default values, if the driver supports more advanced configuration, pressing the Advanced... button will display a dialog box used to set the driver configuration. For example, if a driver does not suupport streams, the advanced configuration dialog, provided by the driver, will allow the user to set the I/O Port and IRO settings.
The properties affecting drivers 30 are as follows.
Scaling - Setting the scaling property affects the default scaling used on all axes within the motion control system. The range for scaling values is (0.0, 1.0).
Default setting may be overridden when programming XMC by using the IXMC_StaticState interface.
Units - Setting the units property affects all coordinates used when programming the system 22.

The unit descriptions are as follows:
MM ENGLISH - Inches are used as the base unit for all coordinates .MM METRIC - Millimeters are used as the base unit for all coordinates.
MM_NATIVE - The native coordinates defined by the hardware system are used.
Coordinates used to program XMC are mapped 1:1 to the hardware coordinates.
Advanced... - Pressing this button will display a dialog used to edit any advanced properties for the driver that may be edited by the user.
In addition to allowing the user to set properties, each driver property page displays the full names of both the hardware supported and the hardware vendor who makes the hardware.
The buttons along the bottom of the windows work with the selected driver or stream.
The following discussion describes each button and what it does.
Pressing the Make Default button selects the current driver to be the default.
If a stream is selected, its parent driver becomes the default driver. The default driver is later used by the motion control component 35 Selecting the Add... button, displays the Add Module dialog. This dialog is used to add new drivers and streams to the system 22. Once selected, the new driver or stream will be displayed in the Driver tree view. When adding a stream, the stream is added under the currently selected driver. To enable the stream, you must select the enable check box located in the streams property page.
Selecting the Remove button, removes the current driver or stream selected. If a driver is removed all of its streams are also removed.
Selecting the View Support... button displays a dialog used to view the level of XMC
support implemented by the driver. For example, all API interfaces and subsequent methods are displayed. If a lack of implementation within the driver prohibits an API
interface from operating.
the driver stub 36 is used. If the lack of implementation within the driver 30 cannot be replaced by operations within the driver stub 36, the interface or method is disabled.

The following descriptions s of each . founumd t Thy ~y are dc3iripit each graphic wd I0 the AXIVIC Support view Dialog.
D - This graphic means that the interface or method is implemented by the driver 30.
S - This graphic means that the interface or method is implemented within the driver stub 36.
X - This graphic means that the interface or method is disabled because of a lack of implementation within the driver 30.

Like the properties page, a debug page is also provided to set all debugging settings for the driver. Each driver may specify that all API calls used to control the driver are logged. The logging settings only affect the current driver selected. The Output field allows you to select the output stream where all debug information is sent. When Streams is enabled, debug information is sent to the specified text file. When Debug Monitor is enabled, debug information is sent to the debug monitor if it is running. Using Enable to enable a stream turns it on causing all debug information generated to be sent to the stream. More than one stream may be enabled at one time.
Stream Settings are available for each debug stream supported. Text File allows the name of the text file may be set. The Debug Monitor can only be enabled and disabled.
A stream is the transport layer used by the driver to pass data to the destination location.
The destination location may be the actual motion control hardware or even a text file. Usually the control language used by a hardware vendor is supported by several different flavors of their motion control hardware. For example, some vendors have both PC Bus based and Serial I/O
based motion control hardware that understand the same control language. In such a case, the same driver would be used for each hardware setup but it would communicate with different streams depending on the specific hardware setup. Graphically, each stream is listed below each driver that uses the stream.
This section describes the streams supported by the system 22 and how they are configured.
The PC Bus stream sends all data directly to a PC Bus based motion control hardware system by writing to the specified I/O Ports and IRQ's defined by the hardware. This section describes both the properties and debug settings available for the PC Bus Stream.
Stream properties only affect the currently selected stream. The user is required to select certain settings, such as the I/O Port and IRQ. Without setting these values, the PC Bus Stream will not be able to communicate with the hardware. The properties affecting PC
Bus Streams are described below.
The I/O Port is the base port used to communicate with the motion control hardware that the stream is to send data to.
The IRQ is the interrupt request level used by the hardware.
Pressing the Advanced_ button will display a dialog allowing the user to edit more Saco 7. vp;;vu'. i vi CAC, ipie, it 111 e stream supports a Port 1l0 map that the user can advanced edit, the port map would be displayed in this dialog. This button is only enabled for streams supporting advanced features that the user may edit.
When debugging an application program it may be useful to see what codes are actually sent to the hardware. The Debug Settings page for streams allows the user to enable and disable both the Cmd and Bit Streams. The Cmd Stream is used to log all command-codes sent to the hardware. If this level of detail does not provide you with enough information, the Bit Stream may be used. When enabled, the Bit Stream logs all values sent through each hardware port. All values read from and written to each port used by the hardware are logged.
Note, when enabled, both streams may significantly slow down the application programming the motion control system.
Serial RS-232 Streams are used to send data from the driver to motion control hardware connected to the computer through the serial I/O port. Both property and debug settings only affect the selected Serial RS-232 Stream. The following discussion describes the available settings in each in detail.
All Serial RS-232 property settings must be set by the user for they let the stream know what I/O port and communication protocol to use when communicating with the hardware. The properties affecting Serial RS-232 Streams are as described below.
The Port is the serial port that the hardware is connected to. COM1 - COM4 are valid ports that can be used.
The Baud Rate is the speed of data transmission supported by the hardware.
When Hardware is selected a more efficient, but less compatible, communication I(~ protocol is used to communicate to the hardware. If errors occur when this protocol is selected, use the XON/XOFF communication protocol.
When the XON/XOFF communication protocol is selected a simple and more compatible communication protocol is used.
Debug settings for the Serial RS-232 Stream are very similar to those supported by the PC Bus Stream. Serial RS-232 Streams only support command logging through the Cmd Stream and do not support bit logging.
The Text File Stream is used to build control-code programs for later use.
Using this stream facilitates running the XMC software in code-generation-mode. No motion control actions take place when running in this mode. Instead, control-code programs may be built and stored to file. Later, after programs are built and saved, they may be downloaded to the motion control hardware and run. The following discussion describes the property and debug settings for the Text File Stream.
The main property set, when configuring a Text File Stream, is the actual name and location of the file to use. Once set, the stream is ready for use.
The following properties may be configured for the Text File Stream:
Filename is the filename and location of the file used to store all control-codes generated by the driver 30 selected. Pressing the Browse... button displays a dialog allowing you to graphically select the location and filename to use.
No debug settings are available for the Text File Stream.
IX. LANGUAGE DRIVER

FIG. 58 contains a module interaction map depicting a language driver 44 and illustrating how that language driver 44 interacts with the streams 28, the driver administrator 32, the motion control component 35, and the registry 42.

As with the software drivers 30 described above, one language driver 44 is used for each of the motion control devices 20 of the group of supported motion control devices. The language drivers 44 perform the same basic function as the software drivers 30 described above with reference to FIGS. 1 and 12-21. To the software system 22, the language drivers 44 are accessed and respond in the same manner as the software drivers 30; the differences between the language drivers 44 and the software drivers 30 are entirely internal.

The primary difference between these drivers 30 and 44 is that the language drivers 44 use a database the key fields of which are an index field, a command format field, and a response format field. Each record or row in the database corresponds to a given Driver function.

The purpose of the command and response format templates is to formalize and simplify.
the process of constructing command data strings and format data strings which contain commands and parameters to be transmitted to the motion control devices 20.
The format templates define how, for a given SPI command, the software system 22 communicates with a vendor specific hardware command language associated with a given motion control device 20 associated with a given language driver 44. Accordingly, one database containing command format templates and response format templates will be created for each such language.

The command format field contains a command format template, and the response format field contains a response format template. Each of these templates comprises a sequence of data type identifiers, macro identifiers, syntax characters, and/or ASCII characters.

The index field contains a value unique to each Driver function that facilitates the process of looking up the command and response format templates associated with a given Driver function.

The software system designer defines the data type identifiers, macro identifiers, and syntax characters discussed above. In general, the data type identifiers and syntax characters are common to both the command format template and the response format template.

The macro identifiers will normally correspond to macros that are associated with either the command format templates or the response format templates. The ASCII
characters are defined by the Driver function and the particular motion control device 20 with which a given language driver 44 is associated.

An Excel spreadsheet may be used as an organizational tool that facilitates creation of the database used by the language driver 44. An example of a Excel spreadsheet that may be used for this purpose is shown in FIG. 67. The spreadsheet shown in FIG. 67 is saved as a tab-delimited file and then copied into the SPI database shown in FIG. 59.

The spreadsheet shown in FIG. 67 is simply an organizational tool and will not be described herein in detail. But it should be noted that the exemplary spreadsheet shown in FIG.
67 sets forth a list of typical command and response data type identifiers.
along with descriptions thereof, and lists of command and response macros. These will be supplemented by an additional STRUCT data type that allows the programmer to define a data type that combines the other primitive data types as necessary for a given template.

The language drivers thus operate generally as follows. As described above, the motion component 35 will call the driver function implemented by the language driver 44 and, in many cases, will pass parameters necessary to carry out that function. The language driver 44 will use the index for that driver function to look up the command format template and the response format template associated with the appropriate driver function.

Using the command format template, the language driver 44 will construct a command data string containing ASCII characters. The command data string carries the commands and parameters necessary to implement the given driver function in a desired manner on the motion control device 20 associated with the language driver 44.

Similarly, the language driver 44 uses the response format template to parse a response data string sent by the particular motion control device 20 in response to the command data string. The response format template thus allows the language driver 44 to pass from the motion control device 20 to the motion control component 35 any commands and/or parameters necessary to enable the controlling application 26 to function as intended.

The following sets forth examples of the process of generating a command data string and parsing a response data string given a set of command and response format templates associated with a single SPI_ The first example illustrates how the language driver 44 might deal with the Driver function IXMC DrvExt Test::Move.

Cmd Format: D%d,+:([snd)GO%b+:@[snd) Rsp Format: @[crlf)>@[rcv)@[crll>@[rcv) Driver function Call: pXMCDrvExtTest->Move( 20.0, 30.0 ) This function tall directs the motion control device to move 20 units in the x direction and units in the y direction.

The driver communicates with the stream as follows:

Step 1. Perform the operation in the command format template up to the first symbol.
30 This builds a raw command string of "D20Ø30.0:"

Step 2. After the first @ symbol is the send command, which sends the string that was built in step 1. The language driver has now reached the G in the command format template.

Step 3. After the send command, the language driver reads a response from the stream to confirm that the command string was received and processed correctly. The response string received from the stream is as follows: "V\n>".

Step 4. The language driver next uses the response format template to parse the raw response string to verify operation and extract data. The language driver then picks up at the G
in the command format template and constructs the next raw command string of "GO11", leaving off at the last macro.

Step 5. The language driver, picking up at last macro in the command format template, then sends the raw command string created in step 4 to the stream, completing the command format template.

Step 6. Again, after the send command the language driver receives a response data string from the stream as follows: "\r\n>".

Step 7. The language driver next parses the response data string received in step 6.

The second example illustrates how the language driver 44 might deal with the Driver function IXMC_DrvExt_Test::SetVelocity.

Cmd Format: V%lf,+: d@[snd]
Rsp Format: @Icrlf]>@[rcv]

Driver function Call: pXMCDrvExtTest->SetVelocity(NOP, 22.0) Explanation Set the velocity of the y axis to 22Ø

Raw Command String: "V,22.0:"

Raw Response String: "\r\n>" (expected) The third example illustrates how the language driver 44 might deal with the Driver function IXMC DrvExt Test::GetVelocity.

Cmd Format: GV%b+:@[snd) Rsp Format: %d,+@[crlf]>@[rcv]

Driver function Call: pXMCDrvExtTest->GetVelocity( NOP, &dfY_Vel ) Explanation Get the velocity set for the y axis.

Raw Command String: "GV01:"

WO 96138769 PCT[US96108149 Raw Response String: ",44.0\r\n>" (expected) dfY Vel = 44.0 The fourth example illustrates how the language driver 44 might deal with the Driver function IXMC_DrvExt_Test::Reset.

Cmd Format: !RESET: [snd]MA0:MC0:LH0:@[snd]

Rsp Format: @[crlf]"VENDOR NAME - MODEL@[rcv]@[crlf]>@m[rcv]
Driver function Call: pXMCDrvExtTest->Reset 0 Explanation Reset the hardware.
Raw Command String 1: "!RESET:"

Raw Response Stringl : "\r\n"VENDOR NAME - MODEL" (expected) Raw Command String2:"MA0:MC0:LH0:"

Raw Response String2: "\r\n>" (expected) While the language driver 44 is of particular importance in the context of the software system 22 described above, this technology may have broader application to any hardware in which ASCII strings are employed to transmit commands to and receive responses from hardware.

The language driver 44 will now be described in more detail. The language driver 44 is used by both the driver administration 32 and the motion control component 35.
Its main purpose is to implement functionality that generates motion control commands for the specific hardware supported.

For example, the AT6400 driver used to control the Compumotor AT6400 motion control hardware, generates AT6400 command codes. During the initialization phase of the system 22, the driver administrator 32 communicates with each language driver 44, allowing the user to add, remove, or change the configuration of the driver 44. When an application using the system 22 is run, the component 35 communicates with the language driver 35 directing it to carry out the appropriate motion control operations.

Unlike the driver 30 described above, which communicates with motion control devices 20 by directly sending binary codes, the language driver 44 sends ASCII text to the stream 28, which then sends the information on to the motion control device 20.

This section makes reference to a number of drawings to describe the features implemented in the language driver 44: (a) the Module Interaction-Map in FIG.
58 that displays all binary modules that interact with the driver and how they interact with one another: (b) an Object WO 96138769 PCT(US96108149 Interaction-Map (FIG. 59), which corresponds to the module interaction map expanded to display the internal C++ objects making up the language driver 44, and how these objects interact with one another; (c)a number of Scenario Maps (FIGS. 60-65) that display the interactions taking place between the C++ objects involved during a certain process; (d) an interface map that describes the interfaces exposed by the language driver component 44, all data structures used, and the definitions of each C++ class used; and (b) a table illustrating how a typical database employed by the language driver 44 is constructed (FIG. 67).

The module interaction-map in FIG. 58 displays all binary modules and their interactions' with the Language Driver 44. There are two modules that interact directly with the driver 44: the Motion Control Component 35, and the Driver Administrator 32. The driver administrator 32 queries and changes the drivers settings and the component 35 directs the driver 44 to carry out motion control operations, such as moving to a certain location in the system.

Mores specifically, the module interaction-map shown in FIG. 58 contains the following modules:

The Driver Administrator module 32 is used to install, uninstall, register, and setup each driver and stream module.

The Motion Component is the motion control component 35 used by applications 26. The component 35 communicates with the current driver 44 passed to it by the driver administrator 32 to carry out motion control operations requested by the application 26.

The Language Driver 44 generates the ASCII codes making up the hardware command language. A given language driver 44 only communicates with a stream 28 that has been specifically connected to that driver 44. Once connected, the stream 28 is used to communicate with the destination object, such as the PC Bus, serial I/O
connection, text file, or debug monitor.

The Streams 28 are the actual objects that operate as the data transport layer for each driver 44. Each stream 28 has a different target that defines the type of the stream.

The Registry 42 is the standard Windows registration database.
The object interaction-map in FIG. 59 breaks the module interaction-map shown in FIG.
58 down into more detail by including the interactions taking place between all C++ objects used to implement the driver 44.

Each object in the diagram is described as follows.

CDriverObject This is the main C++ object that implements all OLE specific functionality including the function shells for all OLE interfaces exposed by the object.

CDrvCoreDisp This is the C++ object used to dispatch all core SPI OLE
interface functions to their respective internal implementations. In addition to the methods inherited from the CLangDrvCoreDisp object, this object dispatches driver specific SPI, such as the core XMCSPI OLE interface methods.

CLangDrvCoreDisp All language driver core functionality is dispatched through this object to its internal implementation. For example, the generic language driver implementation for initialization is dispatched through this object to its implementation residing in the LANG_DRV basecode library.

CDrvExtDisp This is the C++ object used to dispatch all extended SPI OLE
interface functions to their respective internal implementations. In addition to the methods inherited from the CLangDrvExtDisp object, this object dispatches driver specific SPI, such as the extended XMCSPI OLE interface methods.

CLangDrvExtDisp All language driver extended functionality is dispatched through this object to its internal implementation. For example, all stream handling is dispatched through this object to its implementation residing in the LANG_DRV basecode library.

CCommandMgrThis object is used to build commands sent to the stream, and extracting responses received from the stream. The CCommandMgr is the controlling object that manages the CCommand, CResponse, and CCommandDatabase objects.

CCommand The CCommand object builds command strings that are then sent to the CSimpleStream. Each command built is a complete motion control command string.
CResponse This object converts raw response strings, returned by the CSimpleStream, and converts them into C++ data types. For example, a response string containing position data may be converted into a set of double values.

CCommandDatabase This object stores the complete database of commands making up the motion control command language. The database may be represented as an actual external database (such as a SQL database), a text file, or stored inside the driver as a custom resource. Currently, the language driver only supports databases stored as a custom resource within the driver module.

CSPllnfo This object makes up one database entry stored within the CCommandDatabase object.

CStreamMgr This object is responsible for managing the set of streams registered with the driver. Streams, may be added, removed, and enabled. Only enabled streams actually send data to their targets. For example, only an enabled PCBus stream will send data to the motion control card plugged into the PCBus.

WO 96138769 PCT!US96!08149 CSimpleStream This object is used to initialize, create, and communicate directly with the underlying stream component.

CDriverlnfoMgr This object is responsible for creating the CDriverlnfo object.
CDriverlnfo This object contains the complete set of state data making up the Language driver 44. All driver settings and a list of all XMC Streams used are stored within this object. Basic queries are routed directly to this object. More complex operations are handled by one of the various manager objects, who connect to this object, perform the operation, and then disconnect from it.

CRegistryMgr This object is used to save and load the information, stored within the CDriverlnfo object, to and from the registration database. In specific, contains the code called when the ICOM_PersistRegDB interface is invoked.

CRegistry This object performs all registration database operations such as creating keys, saving values, and querying values.
All main scenarios, or operations, that occur on the Language Driver 44 will now be described with reference to FIGS. 60-66. Each scenario-map contained in these figures displays all objects involved and the interactions that take place between them in the sequence that they occur.
There are two types of operations that occur on the Language driver 44. First, the Driver administrator 32 may initiate operations, such as adding streams or configuring the driver. And second, the Motion control component 35 may initiate operations on the driver when an application is actually running.
Referring now to FIGS. 60-64, all operations made on the driver 44 by the driver administrator 32 will be described. Each figure is discussed in the order that it may occur when using the driver 44.
Before a driver may be used by the XMC Motion Component, it must be registered in the OLE system. As shown in FIG. 60, in order to register a driver the driver administrator, first verifies that the module being registered is actually an appropriate language driver, then it calls the DLLRegisterSenier exported function to register the driver. Each module of the system 22 exports a function called DLLGetModuleType. This function is used to verify that the module is an appropriate driver component.

Next, the driver administrator can load the component using the OLE
CoCreatelnstance function. During the initialization process, the driver loads all registration data and initializes the CDriverlnfo and all C++ manager objects.

The following describes in detail each of the steps set forth in FIG. 60.

1 During initialization, the driver administrator must load the DLL.
containing the stream component, verify that the module is an XMC Driver. To do so, the driver administrator calls the DLLGetModuleType function, exported by the driver. If the function returns a value that contains the value XMC_DRIVER_MT in the high byte, then the driver administrator proceeds and registers the driver by calling its exported function, DLLRegisterServer.
When called, the implementation of the DLLRegisterServer writes all OLE 2.0 registration information, needed to register the OLE component, to the Windows registration database.

2. Next, the driver administrator must query the driver module for its CLSID.
Calling the driver's exported function, DLLGetCLSID, returns the CLSID. Once it has the CLSID, the driver administrator may create an instance of the driver by calling the standard OLE function' CoCreatetnstance.

3. CoCreatetnstance automatically initializes the component by calling the ICOM_Base::Initialize method implemented by the CDriverObject.

4. The implementation of ICOM_Base::Initialize directs both the CDrvCoreDisp to initialize itself.

5. Within its initialization, the CDrvCoreDisp object initializes each of its manager objects, starting with the CcommandMgr.

6. During its initialization, the CCommandMgr directs the CCommandDatabase to load itself.

7. To load the database, the CCommandDatabase object reads in the database and builds the CSPIInfo list of database elements.

8. After initializing the CCommandMgr, the CDrvCoreDisp object directs the CDriverlnfoMgr object to create the CDriverlnfo object, that will later store the internal state of the Language driver 44 component.

9. The CDriverlnfoMgr object creates the CDriverlnfo object and passes it back to the dispatch object. The pointer to this object is later stored in the components state handle.
when the CDriverObject calls ICOM_Base2::SetStateHandle.

10_ Next, the CDrvCoreDisp object initializes the CStreamMgr, that is used to perform all stream operations.

11. Next, the CDrvCoreDisp object initializes the CRegistryMgr, that is used to perform all registration database operations.

12. Finally, the CDriverObject initializes the CDrvExtDisp object.

It should be noted that all initialization is initiated through the COM Auto-Init mechanism.
Auto-init occurs when creating an object. When calling either CoCreatetnstance, or calling the IClassFactory::Createlnstance method, the internal COM implementation calls the ICOM_Base::Initialize method. This method triggers the complete initialization process described in this section.
After initializing the driver, the driver administrator may perform operations on it. For example, the driver administrator may request the driver to add or remove a stream. Figure 61 displays the sequence of events occurring when the driver is requested to add a new stream.

When adding a stream, the following steps occur:

1. The driver administrator directs the driver to add a new stream and passes the filename and CLSID of the stream, to be added, to the driver.

2. The driver then passes the filename and CLSID to the CDriverObject object and directs it to add the stream by calling its CLNGStreamMgmt::AddStream embedded C++ class method.

3. The embedded C++ object, that implements the OLE interface, directs the CDrvExtDisp object to add the stream, passing it a handle of the component state data.

4. The CDrvExtDisp object first typecasts the component state data into a pointer to the CDriverlnfo object.

5. Next, the CStreamMgr, is connected to the CDriverlnfo object pointer, and directed to add a new stream.

6. In order to add the new stream, the CStreamMgr, uses a CSimpleStream to load and create the stream component.

7. The CSimpleStream object first sets function pointers to the DIIGetCLSID, DIIGetModuleType and DIIRegisterServer functions exported by the component.
Before loading the module, the CSimpleStream, first makes sure that the module is actually an XMC Stream by comparing its module type with the XMC__STREAM_MT module type. If it is, the component is registered in the registration database as a n OLE component.

8. Using the DIIGetCLSID queried in the previous step, the CSimpleStream gets the components CLSID and calls CoCreatelnstance to load an instance of the OLE
object.

9. After the CSimpleStream completes, the CStreamMgr adds the stream to the CDriverlnfo's stream array.

Another operation requested from the driver, after initialization, is that of querying it for its current settings. Before displaying information about the driver, like the name of the hardware it supports, the driver administrator must query the driver for the information.
FIG. 62 displays an exemplary process of querying the driver for its driver settings.

When querying the driver for information, the following steps are performed.

1. The driver administrator, calls the interface method used to query the drivers information and passes the call a pointer to the XMC_DRIVER_INFO structure.

2. The call is handled by the implementation of the OLE interface method, implemented by on of the CDriverObject's embedded C++ classes.

3. The embedded C++ object, used to handle the interface, directs either the CDrvCoreDisp or CDrvExtDisp object to carry out the operation, and passes the object th handle to the component state data.

4. The dispatch object type casts the state handle to a CDriverlnfo object pointer.
Once converted, the CDriverlnfo object is queried for the appropriate data.

Upon request, the driver may either save or load its entire configuration to or from the registration database. This operation is used by the XMC Driver Administration component who stores all XMC configuration data in the registration database. FIG. 63 displays the sequence of events that take place when the XMC Driver Administration component directs the driver to load its information from the registry.

During the registration process, the following steps occur.

1. First, using the ICOM_PersistRegDB OLE interface, exposed by the driver, the driver administrator directs the component to load its configuration data.

2. The CDriverObject's embedded object, used to handle all ICOM_PersistRegDB
calls, is invoked and performs the operation.

3. Once invoked, the embedded object directs the CDrvCoreDisp object to perform the load, and passes it a handle to the components state data.

4. The CDrvCoreDisp object, first typecasts the state handle to a CDriverlnfo object pointer.

5. Next, the CRegistryMgr is connected to the CDriverlnfo pointer, and directed to load its contents to or from the registration database.

6. The CRegistryMgr loads all general driver information and fills out the drivers XMC DRIVER INFO data structure, stored in the CDriverlnfo object.

7. If the driver has any streams information stored, the CRegistryMgr loads the stream information and fills out an XMC_STREAM_INFO structure. The structure is then used to create a new CSimpleStream object.

6. When creating the stream, the CSimpleStream object first queries and calls the DIIGetModuleType exported function and verifies that the module is in fact a stream component.
If the module is, the CSimpleStream then queries and calls the DLLRegisterServer function exported by the component to register the component.

f 9. After registering the component, the CSimpleStream object queries and calls the DIIGetCLSID exported function to get the components CLSID. Using the CLSID, CoCreatelnstance is called to create an instance of the OLE object.

10. Once the CSimpleStream completes, the CRegistryMgr connects a temporary instance of the CStreamMgr to the CDriverlnfo object pointer, and directs it to add the new stream.

11. The CStreamMgr directly manipulates the CDriverlnfo's stream array to add the new stream. When added, a new instance of the CSimpleStream object is created and attached to the CSimpleStream passed to the CStreamMgr.

12. When attaching itself to the stream, the new CSimpleStream queries the IXMC_Streaminit interface, passed to it, for all interfaces used it bump up the reference counts for the component.

After the driver administrator is done using the driver, it must release the driver by calling its exposed Release method. Calling this method, directs the driver to release all resources used FIG. 64 displays the process of releasing the driver component.

During the clean-up process, the following steps occur.

1. First, either the XMC Driver Administrator, or the XMC Motion Component call the final lUnknown::Release.

2. When invoked, the IUnknown::Release method implemented by the CDriverObject is called. After calling this method causes the internal OLE
reference count to go to zero, driver calls its implementation of ICOM_Base::Uninitialize to clean up all resources used 3. First, ICOM_Base::Uninitialize directs the CDrvExtDisp to clean up any resources that it was using.

4. Next, ICOM_Base::Uninitialize directs the CDrvCoreDisp object to clean up any resources that it was using.

5. Since the CDrvCoreDisp object contains instances of all manager objects, it begins cleaning them up by first directing the CCommandMgr to destroy any resources that it was using. Internally, the CcommandMgr destroys the CCommandDatabase and all of its contents.

6. Next, the CDrvCoreDisp object implicitly destroys all other manager objects by calling their destructors.

7. And as a final step, the ICOM_Base::Uninitialize method deletes the state handle containing a pointer to the CDriverlnfo object. When destroyed, the CDriverlnfo object deletes each CSimpleStream object, which in turn release their instance of the XMC
Stream component.

Upon releasing the final instance of the XMC Stream component, the component dll is freed from memory.

After a driver is successfully installed into the XMC system and configured using the driver administrator, it is ready for use by the XMC Motion Control Component.
The component uses the driver when performing motion control operations requested from the application using the component. FIG. 65 describes the component directed operations that can take place on the driver.
Before operating, the XMC Motion Component must query the Driver administrator 32' component for its driver enumeration. The enumeration returned is used to access all enabled drivers that are directed to perform XMC SPI operations by the XMC Motion Component.

Once the driver enumeration is acquired, the Motion control component 35 can direct the enabled driver, or drivers, to carry out certain command operations. Command operations are standard motion control operations such as moving tO a specific location in the system, or querying the system for the current position. FIG 65 describes the process of commanding the driver to carry out a certain operation.

When commanding the driver to perform a certain operation, the following steps occur.
1. First, the motion component directs the driver to perform the operation, such as moving to a position or querying the system for the current position.

2. The XMCSPI invocation is handled by the CDriverObject who implements all OLE interfaces exposed by the component.

3. The CDriverObject directs either the CDrvCoreDisp, or CDrvExtDisp object to perform the operation, depending on whether the operation is a core or extended XMCSPI. The component state handle is passed to the dispatch object when called.

A The dispatch object then typecasts the a =_ handle into a CDriverlnlo object +3r:acv: then pointer.

5. Next, the dispatch object connects the CCommandMgr to the CDriverlnfo object pointer and directs it to carry out the operation corresponding to the database index sent. The database index corresponds to the XMCSPI called and is used to locate the language database entry for that SPI call.

6. The CCommandMgr searches the CCommandDatabase for the index and builds a CCommand object corresponding to the XMCSPI operation.

7. Next, the CCommandMgr directly accesses the CDriverlnfo and passes the command string, built by the CCommand object, to all enabled streams.

8. Each enabled stream sends the ASCII text to its target. For example, the PCBus steam sends its data to the motion control card located on the PCBus. The text file stream, on the other hand, sends its data to its associated text file.

9. If directed, the CCommandMgr then queries the first readable stream for the results of the commands sent to it'.

10. The CSimpleStream reads the raw response from the target and returns it to the CCommandMgr.

11. Once receiving the raw response, the CCommandMgr uses the CResponse object to parse the raw response based on the response format corresponding to the XMCSPI
database entry. All response parameters are returned back up the calling chain, and eventually end up in the hands of the original caller, the XMC Motion Component.

The clean-up initiated by the XMC Motion Component by releasing the XMC Driver component is the same as that which occurs when the Driver administrator 32 object releases the component.

The following discussion describes the actual OLE Interfaces exposed, the definitions of the data structures used when passing data around, and the definitions of each class used internally by the driver.

The following diagram describes all interfaces exposed by the driver specific to driver-component interpretability. FIG. 66 graphically displays the interfaces exposed by the component.
Other than the two standard interfaces exposed, such as (Unknown and IClassFactory, there are three categories of interfaces exposed by the component. The three categories are as follows.
COM: All interface names with the COM_ prefix, implement general COM
functionality. For example, the ICOM_Base, ICOM_Base2, ICOM_Persist2, and ICOM_PersistRegDB interfaces all fall into this category.
LNG: All interface names with the LNG_ prefix, implement general language driver functionality. For example, the ILNG_DrvCore_Init, and the ILNG_DrvExt_StreamMgmt interfaces fall into this category.
XMC: All interfaces name with the XMC_ prefix, implement XMCSPI (driver) functionality.

The following sections describe the interfaces falling into both the COM and LNG
categories. All other interfaces are XMCSPI specific and are used for the sole purpose of performing motion control operations.
The following exposed methods in the ICOM_Base interface are used when intializing and uninitializing the component. Each of these methods call the hidden initialize and uninitialize interface methods implemented by all of the component's interfaces.

DECLARE_INTERFACE_( ICOM_Base, (Unknown) STDMETHOD (Initialize )(THIS_ LPVOID plnitlnfo) PURE;
STDMETHOD (Uninitialize )(THIS) PURE;

The ICOM Base2 interface inherits from the ICOM Base interface and adds several methods used to manage the internal component state handle. In addition, a method allows the user to translate any HRESULT returned by the component into a human readable text string.
The following is a description of the ICOM_Base2 interface.
DECLARE_INTERFACE_( ICOM_Base2, ICOM_Base ) {
STDMETHOD (SetStateData )(THIS- COM_STATEHANDLE hState) PURE;
STDMETHOD (GetStateData )(THIS- LPCOM_STATEHANDLE phState) PURE;
STDMETHOD (GetErrorString )(THIS_ HRESULT hr, LPSTR pszErr, DWORD dwMax) PURE;
The ICOM Persist2 interface inherits from the IPersist standard OLE interface and adds several methods used to query the CLSID and module type. The following is a description of the ICOM Persist2 interface.

DECLARE_INTERFACE_(1COM_Persist2, IPersist) {
STDMETHOD (GetID )( THIS_ LPDWORD pdwlD) PURE;
STDMETHOD (GetModuleType )(THIS_ LPDWORD pdwMT) PURE;
);
The ICOM_PersistRegDB interface implements similar functionality to that provided by the IPersistFile standard OLE interface. Instead of saving and loading data to and from a file, the ICOM_PersistRegDB operates on the registration database. The following is a description of the ICOM_PersistRegDB interface.
DECLARE_INTERFACE_( ICOM_PersistRegDB, (Unknown) STDMETHOD (IsDirty )( THIS) PURE;

STDMETHOD (Load)( THIS_ HKEY hKey) PURE;
STDMETHOD (Save )( THIS_ HKEY hKey) PURE;
STDMETHOD (Clear)( THIS_ HKEY hKey) PURE;

The ILNG_DrvCore_Init interface is used to initialize the language driver component.
The following is a description of the ILNG_DrvCore_init interface.
DECLARE_INTERFACE_( ILNG_DrvCore_Init, lUnknown) {
STDMETHOD (Create)( THIS_ LPLNG_DRIVER_INFO pDl) PURE;
STDMETHOD (Destroy)(THIS) PURE;
STDMETHOD (Setup)( THIS_ LPLNG_DRIVER_INFO pDI) PURE;
STDMETHOD (Stat)(THIS_ LPLNG_DRIVER_INFO pDl) PURE;
STDMETHOD (Register)( THIS) PURE;
STDMETHOD (UnRegister)(THIS) PURE;
STDMETHOD (IsRegistered)( THIS_ LPBOOL pbRegistered ) PURE;
STDMETHOD (Enable)( THIS_ BOOL fEnable ) PURE;
STDMETHOD (IsEnabled)( THIS_ LPBOOL pbEnabled) PURE;

The ILNG_DrvExt_StreamMgmt interface is used to perform all stream operations.
The following is a description of the LNG_DrvExt_StreamMgmt interface, DECLARE_INTERFACE_( ILNG_DrvExt_StreamMgmt, lUnknown) {
STDMETHOD (GetStreamEnumeration)( THIS_ LPENUMUNKNOWN FAR *ppEnumStream) PURE;
STDMETHOD (GetStreamCount)( THIS_ LPDWORD pdwCount ) PURE;
STDMETHOD (GetStreaminit)( THIS_ XMC_STREAMID idStream, ! PXMCSTREAMINIT FAR `ppStreaimlriit) PURE;
STDMETHOD (GetStreaminitAt)(THIS_ DWORD dwldx, LPXMCSTREAMINIT FAR *ppStreamlnit) PURE;
STDMETHOD (AddStream)( THIS_ LPXMCSTREAMINIT pStreamlnit) PURE;
STDMETHOD (RemoveStream)(THIS_ LPXMCSTREAMINIT pStreaminit, BOOL bDestroy) PURE:
STDMETHOD (RemoveStream)(THIS_ XMC_STREAMID idStream, BOOL bDestroy) PURE;
STDMETHOD (RemoveAllStreams)( THIS_ BOOL bDestroy) PURE;
STDMETHOD (EnabledStreamsOnly)( THIS_ BOOL bEnabledOnly, LPBOOL pbOldEnabledOnly) PURE;

WO 96(38769 PCTIUS96/08149 The following are the functions exported by the driver DLL.

XMC_DRIVER_MODULETYPE DLLGetModuleType( void);
LPCLSID DLLGetCLSID( void):
BOOL DLLRegisterServer( void );
BOOL DLLUnRegisterServer( void );

The following discusion defines all structures, enumerations, and defines used by the driver.
The XMC_DRIVER_MODULETYPE enumeration defines the type of drivers available.
Each driver must return its type when the user calls the exported DLLGetModuleType function.
enum XMC DRIVER MODULETYPE
{
XMC DRIVER MT = 0x4000, XMC DRIVER MT AT6400 = 0x4001, XMC_DRIVER_MT_DMC1000 = 0x4002, XMC DRIVER MT DT2000 = 0x4003, XMC DRIVER MTCUSTOM = 0x4004 The XMC_DRVCORE_CMD enumeration defines an identifier for every command known to the XMC Driver. For example, every core Driver function has a corresponding XMC DRVCORE CMD identifier. This index is used to took up the string block for the command The definition of the enumeration is as follows.

enum XMC DRVCORE CMD
{
XMG DCC MOTION MOVEABS, XMC_DCC_MOTION_KILL, The XMC_DRVEXT_CMD enumeration defines an identifier for every extended command known to the XMC Driver. Even though the identifiers exist, the driver may or may not implement the set of commands. For example, every extended Driver function has a corresponding XMC_DRVEXT_CMD identifier. This index is used to look up the string block for the command (if the driver implements the command). The definition of the enumeration is as follows.

enum XMC DRVEXT CMD
{

XMC DCEMOTION MOVEREL, The LNG_PARAM_DATATYPE enumeration defines all types of data blocks that may be parsed from response strings returned by stream targets.

typedef enum _LNG_PARAM_DATATYPE
{
LNG_ADT_NOP, LNG ADT NOTYPE, LNG_ADT_NUMBER, LNG ADT STAT STRING, LNG ADT MEM STRING
} LNG_PARAM_DATATYPE;
The LNG_PARAM_DATA structure stores all types of data that describe a parameter either built into a command, or parsed from a response.

struct LNG PARAM DATA
{
11---- Constructor & Destructor LNG_PARAM_ DATA( void );
--LNG_PARAM_DATA( void);

11---- Data ---LNG PARAM DATATYPE adt;
union {
double df;
LPTSTR psz;

The LNG-DRIVER-INFO structure is used when setting up and querying the state of the driver.
typedef struct -LNG-DRIVER-INFO
{
DWORD m_mt;
LNG_DRIVERID m_ID;
TCHAR m_szName[ LNG_DRIVER_NAME_LEN+1 J;
TCHAR m_szDescnptionj LNG_DRIVER_DESC_LEN+1 J;
TCHAR m_szHWVendor[ LNG_DRIVER_NAME_LEN+1 j;
} LNG_DRIVER_INFO;
Each XMC Driver is responsible for managing all streams used. In order to manage each stream over time in a persistent manner each driver and stream module implement the persistent functionality exposed through the ICOM_PersistRegDB interface. When the driver's implementation of ICOM_PersistRegDB::Save is called, the data is saved to the registry in the following order.

XMCDriverAdminObject.100 (-- Drivers (-- dwCount = <# of drivers>
(--- XMCDrv_0 { (--- CLSID = {cisid}
( (--- dwFlags = <driver flags>
(---- dwID = <driver ID>
( (--- dwModuleType = XMC_DRIVER_MT_xxx { {--- szDescription = <user desc of the driver>
{ {--- Streams I-- Count = <# of streams>
I I-- XMCStrm_0 ( { (--- CLSID = {cisid}
( { (-- dwlD = <strm id>
{---- dwModuleType = XMC STREAM_MT_xxx (---- <stream specific values>
I I
I (---- XMCStrm_<n>
I I---- _ I
XMCDrv_<n>

It should be clear from the foregoing that the present invention may be embodied in other specific forms without departing from the essential characteristics thereof.
The present embodiments are therefore to be considered in all respects as illustrative and not restrictive, the scope of the invention being indicated by the appended claims rather than by the foregoing description; all changes which come within the meaning and range of equivalency of the claims are therefore intended to be embraced therein.

APPENDIX A

1.0 Overview The XMCSPI is the Service Provider Interface (SPI) implemented by every XMC
Driver. This layer of software, used by the XMC Motion Component, controls the specific motion control hardware corresponding to the current XMC Driver. Four categories of custom OLE 2.0 interfaces make up the complete XMCSPI layer. Out of the four categories, all XMC Drivers are required to implement one category of interfaces called core interfaces.
Implementing the other three interface categories, called extended interfaces, is recommended, but not required to participate in the XMC software model. Implementing all extended interfaces is recommended for it makes the current driver-hardware interaction more precise and more efficient. Since not all hardware will support all extended interfaces, implementing them is not required.

This manual describes all core and extended interfaces making up the complete set of XMCSPI
custom OLE interfaces. Chapter 2.0 XMCSPI Interface Categories discusses the purpose of each category and lists the interfaces that fall in each. Chapter 3.0 extends this discussion by describing each interface and the methods they contain.
2.0 XMCSPI Interface Categories This section describes the categorical grouping of the OLE interfaces found in the XMCSPI. Both standard and custom OLE interfaces are used in the XMCSPI. OLE 2.0 requires the implementation of all interfaces listed in Section 2.1 Standard OLE
Interfaces. XMC requires the implementation of all interfaces listed in section 2.1 Core Interfaces.

2.1 Standard OLE Interfaces The following standard OLE interfaces must be supported by each Motion Control Driver. For more information on each interface, see section 2.0 Standard OLE Interfaces in the XMCAPI
Reference manual.

Standard Interfaces i .AassFactoty (Unknown 2.2 Core Interfaces (Core) Any absolutely essential functions to motion control problems are in the core set of functions. All motion control XMCSPI drivers must implement these core functions. None of these functions are not allowed to use user-interface objects.

The following custom OLE 2.0 interfaces are in the core set of XMCSPI
functions:

Custom Core Interfaces IXMC_DrvCore_AnalogIO
IXMC_DrvCore_DigitallO
IXMC_DrvCore_DynamicState IXMC_DrvCore_Encoder IXMC_DrvCore_EnuminterfaceSupport IXMC_DrvCore_IO (Abstract) IXMC DrvCore Limits IXMC_DrvCore_Motion (Dependent) IXMC_DrvCore_Servo IXMC DrvCore StaticState IXMC_DrvCore_Stepper NOTE: The IXMC_DrvCore_Servo interface is only required if the motion control hardware controlled by the driver has servo motor support. The same follows for the IXMC_DrvCore_Stepper interface with stepper motors.

Abstract interfaces are only used by other interfaces as an inheritance base.
For example, since the IXMC_DrvCore_DigitallO interface inherits from the IXMC_DrvCore_1O
interface, its implementation contains all methods in both interfaces. See section 2.7.1 Inheritance Relationships for more information on inheritance relationships between interfaces.

Dependent interfaces are only used after the interfaces they are dependent on have performed certain operations. For example, the IXMC_DrvCore_Motion interface is dependent on either the IXMC_DrvCore_Servo or the IXMC_DrvCore_Stepper interfaces initializing the motion system. See section 2.7.2 Dependency Relationships for more information on dependency relationships between interfaces.

2.3 Extended interface Categories All non-core interfaces in the XMCSPI fall into one of the three extended interface categories.
XMC Drivers are not required to implement any of the extended XMCSPI
functions. A stub driver, called the XMC Driver Stub, implements all extended interfaces, not supported by the current driver, that can be emulated using a software algorithm which calls core functions. For more information on how the XMC Driver Stub is used, see Section 7.0 Driver Administrator, Component, Driver Relationship in the XMC User Guide manual. Implementing extended interfaces directly in the driver can improve the precision and efficiency of the operation, for the driver implementation has more direct control over the motion control hardware than the XMC
Motion Control Component. Even greater precision and performance improvements occur when the driver can direct the motion control hardware to directly perform a procedure defined in one of the extended interfaces.

2.3.1 Extended Interfaces (Ext) This set of functions consists of all non core functions that do not use user-interface objects such as dialog boxes or message boxes. The following custom OLE 2.0 interfaces are in the set of extended XMCSPI functions:

Custom Ext Interfaces IXMC_DrvExt_Counter IXMC_DrvExt_Debug (Private) IXMC_DrvExt_DynamicState IXMC_DrvExt_Encoder IXMC_DrvExt_lnterrupt IXMC_DrvExt_IO (Abstract) IXMC_DrvExt_Joystick IXMC DrvExt Limits IXMC_DrvExt_Motion (Dependent) IXMC DrvExt StaticState IXMC_DrvExt_Timer 2.3.2 Extended UI Interfaces (ExtUl) This XMCSPI set consists of all extended XMCSPI functions that require user-interface objects such as dialog boxes or message boxes. For example, when an application requests to tune the servo motors, special input may be needed from the user to complete the process. Because tuning the servo motors is not a required motion control function and may need input from the user, it is in the Extended UI XMCSPI set of functions.

The following custom -11 c: 2.0 interfaces are in the extended user-interface set of XMCSPI
functions:

Custom ExtUl Interfaces IXMC_DrvExtUl_AnaloglO
IXMC_DrvExtUl_Base IXMC_DrvExtUl_DigitallO
IXMC_DrvExtUl_DynamicState IXMC DrvExtUl Servo IXMC DrvExtUl StaticState 2.3.3 Extended Code Generation Interfaces (ExtCG) These XMCSPI functions consist of all methods used for code generation only.
Most core and extended methods generate code also generate code when the XMC software is run in code-generation mode. But, where core and extended functions may also be used in real-time and mixed modes, code-generation functions cannot. Code-generation functions are only used when running in code-generation mode.
The following custom OLE 2.0 interfaces are in the set of code-generation XMCSPI functions:
Custom ExtCG Interfaces IXMC_DrvExtCG_ProgramFlow IXMC_DrvExtCG_Operator IXMC_DrvExtCG_Program IXMC_DrvExtCG_ProgramMgmt IXMC DrvExtCG Subroutine IXMC DrvExtCG Variable 2.4 Vendor Specific Interfaces (ExtVS) These functions are not part of the set of XMCSPI interfaces. No XMCAPI
interface methods call these functions for they are provided by each vendor as a pass-through method giving vendors access to new hardware features not yet supported by the X MC software model.
Each implementation of vendor specific custom OLE Interfaces depend on the needs of the hardware vendor. Applications may communicate directly with these interfaces, but in doing so, they automatically become dependent on the specific Motion Control Driver and therefore become hardware-dependent. But, allowing vendor-specific functions to exist gives the software model a flexible way to evolve. For example, if one hardware vendor adds a new feature to their motion control hardware, not provided by any other vendors, they may gain access to the new feature by adding a vendor specific SPI interface to their driver and then directly programming to the SPI
interface from within the application. Of course, other drivers will not work with applications that call the hardware dependent SPI interface, for they will not implement the interface. As the feature becomes more useful over time, other hardware vendors will probably add the feature to their hardware. After the feature gains a critical mass of support within the companies supporting the XMC software model, the feature will be added to the XMC software model by becoming a part of both the XMCSPI and XMCAPI. For more information on vendor specific interfaces, see the appropriate XMC Motion Control Extension manual describing the specific XMC Driver which includes a reference for each hardware-dependent driver interface.

2.5 Interface Map The following table displays all Motion Control Driver, XMCSPI interfaces and the categories they fall in:

Core Ext ExtUl ExtCG
"IXMCDrvCore " "IXMCDrvExt " "IXMCDrvExtUI " "IXMCDrvExtCG "
AnaloglO AnaloglO AnaloglO*
Base Counter Counter*
Debug (Private) DigitallO DigitallO DigitallO DigitallO*
DynamicState DynamicState DynamicState Encoder Encoder Encoder*
Enuminterface Interrupt Interrupt*
IO (Abstract) 10 (Abstract) 10*
Joystick Joystick*
Limits Limits Limits*
Motion (Abstract) Motion (Abstract) Motion*
Servo Servo Servo Servo*
StaticState StaticState StaticState Stepper Stepper*
Timer Timer*
Operator Program ProgramFlow ProgramMgmt Subroutine Variable These interfaces generate code implicitly. Calling methods, that immediately cause an action on the hardware when run in real-time mode, generate code when run in code-generation mode.
2.6 Interface Relationships This section describes how closely coupled XMCSPI interfaces relate to one another. There are two ways interfaces relate to one another. Interfaces can inherit from each other and can be dependent on one another. The following sections describe these relationships and the interfaces using them.

2.6.1 Inheritance Relationships C++ inheritance is used to combine two interfaces in such a way that the derived interface "inherits" all method definitions in the base interface. Only the method definitions within the base interface are inherited. The resulting interface contains implementations of all methods in both the derived and the base interface. The following are the inheritance relationships found in the XMCSPI:

Inheritance Tree IXMC_DrvCore_l0 I--- IXMC_DrvCore_DigitallO
--- IXMC_DrvCore_AnaloglO
IXMC_DrvExtUl_Base I--- IXMC_DrvExtUl_AnaioglO
--- IXMC_DrvExtUI_DigitallO
--- IXMC_DrvExtUI_DynamicState i--- IXMC_DrvExtUl_Servo ,___ I.X.MC D; iExt~ l StaticState 2.6.2 Dependency Relationships Unlike inheritance relationships, dependency relationships are between two interface implementations. When an interface is dependent on another interface, it needs the interface to perform an operation before it can continue one of its own operations. For example, the IXMC_DrvCore_Motion interface is dependent on the IXMC_DrvCore_Stepper interface initialization routine. Before using the IXMC_DrvCore_Motion interface, the IXMC_DrvCore_Stepper interface must be used to initialize the stepper system.
The following are the dependency relationships found in the XMCSPI:

Dependency Tree IXMC_DrvCore_Motion -------- J (dependent on) IXMC_DrvExt Motion ---------- I 1 ( V
--- IXMC_DrvCore_Stepper --- IXMC_DrvCore_Servo 3.0 XMCSPI Reference 3.1 XMC Core Interfaces (Core) Core functions are the lowest level primitive motion control functions implemented by all hardware vendors that software cannot duplicate in an algorithm that uses other methods, such as those in the Motion Control Driver Stub. This section describes each custom OLE 2.0 interface within the set of core interfaces.

3.1.1 IXMC_DrvCore_AnaloglO Interface The IXMC_DrvCore_AnalogIO interface inherits from the IXMC_DrvCore_IO
interface and implements all of its methods. This interface take care of initializing the analog I/O system used.
All I/O work is carried out by the IXMC_DrvCore_IO interface.

Inheritance IXMC_DrvCore_IO

1------ lXMC_DrvCore_AnaloglO
Configuration (*pDrvCore_Analog10)->InitializeO
3.1.2 IXMC_DrvCore_DigitallO Interface Similar to the IXMC DrvCore_AnaloglO interface, the IXMC_DrvCore_DigitallO
interface is also inherits from the IXMC_DrvCore_IO interface. The IXMC_DrvCore_DigitallO
interface takes care of initializing the digital I/O system, and the IXMC_DrvCore_IO
interface takes care of all other operations.

Inheritance IXMC_DrvCore_1O
I
------ IXMC_DrvCore_DigitallO
Configuration (*pDrvCore_DigitallO)->InitiaiizeO
3.1.3 IXMC_DrvCore_DynamicState Interface The IXMC_DrvCore_DynamicState interface manages the overall state of the motion control system. Included in its management tasks are initializing and shutting down the system. The current state information may be queried or changed at any time after the system is initialized.
State Information typedef struct -XMC-DYNAM IC STATE INFO
{
XMC_STATICSTATE *pXMCDC;
double dfActu a I Position;
double dfCommandedPosition;
double dfActualVelocity;
double dfCommandedVelocity;
double dfPositionError;
double dfAcceleration;
double dfDeceleration;
HRESULT hErrorStatus;
XMC_OP_MODE operatingMode;
XMC_AXIS_DATA *pLeftLimitData;
XMC_AXIS_DATA *pRightLimitData;
XMC_DYNAMICSTATEINFO;
Configuration (*pDrvCore_DynSt)->ResetO
(*pDrvCore_DynSt)->InitializeO
(*pDrvCore_DynSt)->ShutDownO
Querying Attributes (*pDrvCore_DynSt)->GetErrorStatus0 (*pDrvCore_DynSt)->GetStateQ

Setting Attributes (*pDrvCore_DynSt)->ClearErrorsO
(*pDrvCore_Dyn St)-> S etSt ateO
3.1.4 IXMC DrvCore Encoder Interface The IXMC_ DrvCore_ Encoder interface implements several optimized functions used to query positions. Calling the IXMC_DrvCore_DynamicState::GetStateo method will also collect the position information, but at the expense of collecting all other current state data. The methods specified by this interface only collect the data requested.
Querying Attributes (*pDrvCore-Motion)->GetPositionActualO
(*pDrvCore-Motion)->GetPositionErrorO
NOTE: Currently, this interface is classified as a core set of XMCSPI, but it may be changed to an extended set of XMCSPI instead.

3.1.5 IXMC_DrvCore_EnuminterfaceSupport Interface The IXMC_DrvCore_EnuminterfaceSupport interface is used to query a list of interfaces meeting the specific search criteria set with the IXMC_DrvCore_EnumI nterfaceSupport::SetSearchCriteriaO method.
Inheritance lEnumX
I
I--- IXMC_DrvCore_EnuminterfaceSupport Setting Air ibutes (*pDCore_EnumIFace)->SetSearchCriteriao 3.1.6 IXMC DrvCore IO Interface This interface consists of all digital input and output related functions. The following methods are available from each Motion Control Driver in the IXMC_DrvCore_DigitaIlO
interface:

Configuration (*pDrvCore_IO)->InitializeO

Actions (*pDrvCore_IO)->Read O
(*pDrvCore_IO)->WriteO
3.1.7 IXMC DrvCore Limits Interface The IXMC DrvCore Limits interface is used to set software limits for a set of axes. When setting limit values, two arrays containing AXIS DATA elements are used to transfer the settings to the method.
Setting Attributes (*pDrvCore-Li mits)-> SetLimitPositionsO

NOTE: Currently, this interface is classified as a core set of XMCSPI, but it may be changed to an extended set of XMCSPI instead.

3.1.8 IXMC DrvCore Motion Interface This IXMC_DrvCore_Motion interface is a dependant interface in that it may only be used after either the IXMC_DrvCore_Stepper or IXMC_DrvCore_Servo interfaces are used to initialize the system. All primitive motion control functions that are absolutely necessary to solve motion control software problems are placed in this interface. Also, each function in this set should be a primitive that can not be duplicated through a software algorithm built on top of other primitive functions. The following methods are available from each Motion Control Driver in the IXMC DrvCore MotionControl interface:
Querying Attributes (*pDrvCore-Motion)->GetCommandedPositionO
(*pDrvCore-Motion)->GetActualPositionO
(*pDrvCore-Motion)->GetCommandedVelocityO
(*pDrvCore-Motion)->GetActualVelocityO
Setting Attributes (*pDrvCore_Motion)->SetVelocity0 (*pDrvCore_Motion)->SetPositionO

Actions (*pDrvCore_Motion)->Kill0 (*pDrvCore_Motion)->MoveAbsO
(*pDrvCore-Motion)->MoveContinousO
(*pDrvCore_Motion)->StopO
3.1.9 IXMC DrvCore Servo Interface The IXMC_DrvCore_Servo interface handles all operations specific to servo motors. All motion operations are performed by the IXMC_DrvCore_Motion interface. The following methods are in the IXMC_DrvCore_Servo interface:

Dependency IXMC DrvCore Motion 1----- IXMC_DrvCore_Servo Configuration (*pDrvCore_Servo)-> I nitializeO
(*pDrvCore_Servo)->TuneO
3.1.10 IXMC DrvCore StaticState Interface The IXMC_DrvCore_StaticState interface manages all static state information defining the system. Like the current state information, the device context information may be queried at any time after the system is initialized. But, unlike the current state information, the device context information is only set during the initial setup of the system.
State Information typedef struct _XMC_STATICSTATEINFO
{
double dfEncoderCountsPerRevolution;
double dfMMPerRevolution;
int cbAxisCount;
int cbAxisMax;
XMCMOTORTYPE motorType;
} XMC_STATICSTATEINFO;

Querying Attributes (`pDrvCore_StatSt)->GetStateo Setting Attributes (*pDrvCore_StatSt)->SetStateo 3.1.11 IXMC_DrvCore_Stepper Interface The IXMC_DrvCore_Stepper interface handles all operations specific to stepper motors. All motion operations are performed by the IXMC_DrvCore_Motion interface. The following methods are in the IXMC_DrvCore_Stepper interface:
Dependency IXMC DrvCore Motion ~- -- IXMC_DrvCore_Stepper Configuration (*pDrvCore_Stepper)->InitializeO
3.2 XMC Extended Interfaces (Ext) Extended interfaces contain methods that are not required. These interfaces are either duplicated by the Motion Control Driver Stub or contain functionality not essential in most motion control problems. However, implementing these interfaces will optimize the performance of the motion control system for a particular set of hardware. This section describes all extended interfaces within XMCSPI.

3.2.1 IXMC_DrvExt_Counter Interface The IXMC_DrvExt_Counter interface is used to operate a counter implemented by the motion control hardware.
Querying Attributes (*p D rv Ext_C o u me r) -> G etC o u me ro Actions (*pDrvExt-Counter)->Enable InterruptO
(*pDrvExt_Counter)->ResetO
(*pDrvExt_Counter)->StartO
(*pDrvExt_Counter)->StopO
3.2.2 IXMC_DrvExt_Debug Interface (Private) The IXMC_DrvExt_Debug interface is a private interface used by the Motion Control Component, if available. When implemented, the interface is used when debugging the Motion Control Driver.

Setting Attributes (*pDrvExt_Debug)->SetRawDatalnDumpFileO
(*pDrvE)ct-Debug)->SetRawDataOutDumpFileO
(*pDrvExt-Debug)->SetXMCSPILogFileO
Actions (*pDrvExt-Debug)->EnableRawDataDumpO
(*pDrvExt-Debug)->EnableXMCSPILogging0 3.2.3 IXMC_DrvExt DynamicState Interface The IXMC_DrvExt_DynamicState interface manages the extended, dynamic state of the motion control system. The extended current state information may be queried or changed at any time after the system is initialized.
State Information typedef struct _XMC_EXTDYNAMICSTATEINFO
( DWORD dwSupportedPoperties;
XMC_EXTSTATICSTATEINFO *pExtXMCDC;
double dfLimitDeceleration;
double dfJogVelocityHigh;
double dfJogVelocityLow;
double dfJoystickVelocityHigh;
double dfJoystickVelocityLow;
double dfFeedRate;
POS_DATA *pHomePosition;
POS_DATA *pZeroPosition;

POS_DATA *pLimitSWFwdPosition;
POS_DATA *pLimitSWBwdPosition;
double dfLimitDeceleration;
BOOL bJoystick;
BOOL bAxisScaling;
BOOL bPathScaiing;
BOOL bDataCapture;
BOOL bFeedRate;
BOOL binterpolation;
BOOL bLimitSW;
BOOL bLimitHW;
BOOL blODataCapture;
} XMC_EXTDYNAMICSTATEINFO;
Querying Attributes (*pDrvCore_DynSt)->GetStateO
Setting Attributes (*pDrvCore_DynSt)->SetStateO
3.2.4 IXMC_DrvExt_DigitalLO Interface The IXMC_DrvExt_DigitallO interface handles all extended IO functionaly.
Actions (*pDrvExt_DigitalIO)->EnablelnputFunctionsO
(*pDrvExt_DigitallO)->EnableoutputFunctionsO
Setting Attributes (*pD--tigiLail! o)- 2tinputFunctionO
(*pDrvExt_DigitallO)->SetinputDebounceTimeO
(*pDrvExt_DigitallO)->SetlnputActiveLevelO
*pDrvExt_Digitall O)->SetOutputFunctionO
(*pDrvExt_Digitai)O)->SetOutputActiveLevelO
(*pDrvExt_Digital lO)->SetOutputStates0 3.2.5 IXMC DrvExt Encoder Interface The IXMC_DrvExt_Encoder interface is used to manipulate encoders in the motion control system.

Setting Attributes (*pDrvExt_Encoder)->SetOutputAbsPosition0 (*pDrvExt_Encoder)->SetOutputRelPosition 0 3.2.6 IXMC_DrvExt_Interrupt Interface The IXMC_DrvExt_Interrupt interface is used to set, get, and enable interrupt handlers Querying Attributes (*pDrvExt_lnt)->GetHandlerO
Setting Attributes (*pDrvExt_Int)->SetHandlerO
Actions (*pDrvExt_lnt)->EnableO
3.2.7 IXMCDrvExt IO Interface This interface consists of all digital input and output related functions. The following methods are available from each Motion Control Driver in the IXMC_DrvExt_DigitallO
interface:

Actions (*pDrvExt_10)->EnableDataCaptureO;
3.2.8 IXMC_DrvExt_Joystick Interface The IXMC_DrvExt_Joystick interface is used to enable and disable a hardware joystick. When enabled, all other motion operations are disabled. The following methods are in this interface:
Setting Attributes (*pDrvExt-Joystick)->SetVelocityHighO
(*pDrvExt-Joystick)->SetVelocityLowO
(*pDrvExt-Joystick)->SetupElectronicsO
Actions (*pDrvExt_Joystick)->EnableO

3.2.9 IXMC DrvExt Limits Interface The IXMC_DrvExt_Limits interface is used to manipulate both hardware and software limits.
The following methods are in this interface:

Querying Attributes (*pDrvExt_Limits) ->GetSoftwareLimitPositions0 Setting Attributes (*pDrvExt_Limits)->SetSoftwareLimitPositions0 (*pDrvExt-Limits)->SetDecelerationO
Actions (*pDrvExt-Limits)->EnableHardwareLimitsO
(*pDrvExt-Limits)->EnableSoftwareLimitsO
3.2.10 IXMC DrvExt Motion Interface This interface consists of extra motion control functions that may or may not be implemented by the motion control hardware. If a hardware implementation is unavailable for a particular function, the Motion Component calls the Motion Control Driver Stub, which implements the functionality in software. The following methods are available from either the Motion Control Driver or the Motion Control Driver Stub in the IXMC_DrvExt_MotionControl interface:
Querying Attributes (*pDrvExt_Motion)->GetFeedRateO
(*pDrvExt_Motion)->GetAxisScaling0 (*pDrvExt-Motion)->GetPathScaling0 (*pDrvExt-Motion)->GetMaxAcceleration0 (*pDrvExt-Motion)->GetMaxDeceleration0 (*pDrvExl_Wiotion)->GetMaxVeiocityo (*pDrvExt-Motion)->GetHomePosition 0 (*pDrvExt-Motion)->IsDataCaptureOnO
(*pDrvExt_Motion)->IsFeedRateOn0 (*pDrvExt-Motion)->IsAxisScalingOno (*pDrvExt-Motion)->IsPathScalingOn( (*pDrvExt-Motion)->lslnterpolationOnO

Setting Attributes (*pDrvExt-Motion)->SetJogVelocityHighO
(*pDrvExt-Motion)->SetJogVelocityLow0 (*pDrvExt_Motion)->SetFeedRateO
(*pD rvExt-Moti o n)- > S etAxisSca ling 0 (*pDrvExt-Motion)->SetPathScaling 0 (*pDrvExt-Motion)->SetMaxAccelerationO
(*pDrvExt_Motion)->SetMaxDecelerationo (*pDrvExt-Motion)->SetMaxVelocityO
(*pDrvExt-Motion)->SetZeroPositionO
(*pDrvExt_Motion)->SetHomePosition0 Action (*pDrvExt_Motion)->EnableFeedRateO
(*pDrvExt.Motion)->Enable Interpolation 0 (*pDrvExt-Motion)->EnableAxisScalingO
(*pDrvExt-Motion)->EnablePathScalingO
(*pDrvExt_Motion)->GoHomeO
(*pDrvExt_Motion)->GoZeroO
(*pDrvExt_Motion)->MoveReIO
Geometric Moves (*pDrvExt_Motion)->Arco (*pDrvExt_Motion)->Path O
3.2.11 IXMC DrvExt StaticState Interface The IXMC_DrvExt_StaticState interface manages all extended static state information defining the system. Like the current state information, the device context information may be queried at any time after the system is initialized. But, unlike the current state information, the device context information is only set during the initial setup of the system.

State Information typedef struct _XMC_EXTSTATICSTATEINFO
{
DWORD dwSupportedProperties;
double dfAxisScalingFactor;
double dfPathScalingFactor;
double dfMaxAcceleration;
double dfMaxDeceleration;
double dfMaxVelocity;
} XMC_EXTSTATICSTATEINFO;
Querying Attributes (*pDrvCore_DC)->GetStateO

Setting Attributes (*pDrvCore_DC)->SetStateO
3.2.12 IXMC DrvExt Timer Interface The IXMC_DrvExt_Timer interface is used to manipulate a timer on the motion control hardware.
Querying Attributes (*pDrvExt_Timer)->GetTimeO
(*pDrvExt_Timer)->GetDelayO
(*pDrvExt_Timer)->GetResolutionO
Setting Attributes (*pDrvExt_Timer)->SetDelayO
A_ctionis (*pDrvExt_Timer)->DoDelavO
(*pDrvExt_Timer)->EnablelnterruptO
*pDrvExt_Timer)->ResetO
(*pDrvExt_Timer)->StartO
(*pDrvExt_Timer)-> StopO
(*pDrvExt-Timer)->Triggerlnterrupt0 3.3 XMC Extended UI Interfaces (ExtUl) All extended UI custom OLE 2.0 interfaces use user-interface resources such as dialog boxes or windows to interact with the user. Some interfaces may gather information from the user, where others may just display information.
3.3.1 IXMCDrvExtUt_AnaloglO Interface The IXMC_DrvExtUI_AnaIogtO interface allows the user to interactively view and set the parameters used when initializing the analog 10 system.

Inheritance IXMC_DrvCore_IO
I
I------ IXMC_DrvCore_DigitallO
3.3.2 IXMC_DrvExtUI_Analogl0 Interface The IXMC_DrvExtUI_AnalogIO interface allows the user to interactively view and set the parameters used when initializing the analog 10 system.

Inheritance IXMC_DrvExtUl_Base I
I------ IXMC_DrvExtUl AnaloglO

3.3.3 IXMC DrvExtUt Base Interface The IXMC_DrvExtUI_Base interface is an abstract base derived off by all other Extened UI
interfaces. The two methods defined in this interface, implemented by the deriving interface, are used to initialize and view data.

Configuration (*pDrvExtUl_Base)->Initialize0 (*pDrvExtUl_Base)->Viewo 3.3.4 IXMC_DrvExtUl_DynamicState Interface The IXMC_DrvExtUI_DynamicState interface allows the user to interactively view and set all dynamic parameters used in the motion control system.

Inheritance IXMC_DrvExtUl_Base (------ IXMC_DrvExtUL_DynamicState 3.3.5 IXMC DrvExtUl StaticState Interface The IXMC_DrvExtUl_StaticState interface allows the user to interactively view and set all static system parameters used when initializing the motion control system-Inheritance IXMC_DrvExtUl_Base I------ IXMC_DrvExtUl_StaticState 3.3.6 IXMC_DrvExtUl_DigitallO Interface The IXMC_DrvExtUl_DigitallO interface allows the user to interactively view and set the parameters used when initializing the digital 10 system.

Inheritance IXMC_DrvExtUl_Base I------ IXMC_DrvExtUl_DigitallO

3.3.7 IXMC_DrvExtUI_Servo Interface The IXMC_DrvExtUL_Servo interface allows the user to interactively view and set the servo system parameters. Also, the interface allows the user to interactively tune the PID settings used.
Inheritance IXMC_DrvExtUl_Base I
------ IXMC_DrvExtUl-Servo Configuration (*pDrvExt_Motion)->TuneO

3.4 XMC Extended Code Generation Interfaces (ExtCG) Code generation interfaces are used by the Motion Control Component to generate the appropriate vendor-specific control-codes used to create a motion control program. Unlike other interface supported by each Motion Control Driver, the code-generation interfaces are never used in real-time mode.

NOTE: Currently, the implementations of all code generation interfaces are a direct mapping of the Motion Control Component code generation interfaces and are under investigation.

3.4.1 IXMC_DrvExtCG_Operator Interface The IXMC_DrvExtCG_Operator interface is used to generate general program code such as boolean, logical, simple conditional, and mathematical operators. The following methods are in the interface:

Bitwise (*pDrvExtCG_Op)->BitAndO
(*pDrvExtCG_Op)-> BitNotO
(*pDrvExtCG_Op)->BitOrO
(*pDrvExtCG_Op)->BitShiftLO
(*pDrvExtCG_Op)->BitShiftRO
(*pDrvExtCG_Op)->BitXOrO
Logical (*pDrvExtCG_Op)->AndO
(*pDrvExtCG_Op)->NotO
(*pDrvExtCG_Op)->OrO
Mathematical (*pDrvExtCG_Op)->AddO
(*pDrvExtCG_Op)->BitO
(*pDrvExtCG_Op)->DivO
(*pDrvExtCG_Op)->LeftPare n O
(*pDrvExtCG_Op)->Multo (*pDrvExtCG_Op)->RightPareno (*pDrvExtCG_Op)->SgrtO
(*pDrvExtCG_Op)->SubO

Trigonometric (*pDrvE)ctCG_Op)->ACosO
(*pDrvExtCG_Op)->ASinO
(*pDfvExtCG_Op)->ATanO
(*pDrvExtCG_Op)->CosO
(*pDrvExtCG_Op)->SinO
(*pDrvExtCG_Op)->TanO
Labels/Strings/Comments (*pDrvExtCG_Op)->ASCIICharO
(*pDrvExtCG_Op)->CommentO
(*pDrvExtCG_Op)->DeclarLabelO
(*pD rvExtC G_O p)-> String 0 Conditional (*pDrvExtCG_Op)->EqualO
(*pDrvExtCG_Op)->GreaterThanO
(*pDrvExtCG_Op)->GreaterThanEqualO
(*pDrvExtCG_Op)->LessThanO
(*pDrvExtCG_Op)->LessThanEqualO
(*pDrvExtCG_Op)->NotEqualO
3.4.2 IXMC_DrvExtCG_Program Interface The IXMC_DrvExtCG_Program interface is used to generate a program shell using the appropriate vendor-specific control-codes. The following methods are in the interface:
Programmming (*pDrvExtCG_Prog)->DefineO

= Cii (*pDrvExtCG_Prog)->ExitO
(*pDrvExtCG_Prog)->SleepO
3.4.3 IXMC_DrvExtCG_ProgramFlow Interface The IXMC_DrvExtCG_ProgramFlow interface is used to generate program flow code.
Loops and if/then statements are several examples of contitional code generated. The following methods are in the interface:

If/Else (*pDrvExtCG_ProgFlow)->IfOpenO
(*pDrvExtCG_ProgFlow)->IfClose0 (*pDrv ExtCG_P rog Flow)-> Else 0 (*pDrvExtCG_ProgFlow)->Endlf0 While (*pDrvExtCG_ProgFlow)->WhileOpenO
(*pDrvExtCG_ProgFlow)->WhileCloseO
(*pDrvExtCG_ProgFIow)->EndWhileO
Repeat (*pDrvExtCG_ProgFlow)->Repeato (*pDrvExtCG_ProgFlow)->UntilOpenO
(*pDrvExtC G_Prog Flow)->U ntil Close 0 Loops (*pDrvExtCG_ProgFlow)->LoopO
(*pDrvExtCG_ProgFlow)->EndLoopo Misc.
(*PDrvExtCG_Prog Flow)->BreakO
(*PDrvExtCG_ProgFlow)->GoToO
3.4.4 IXMC_DrvExtCG_ProgramMgmt Interface The IXMC_DrvExtCG_ProgramFlow interface is used to generate program flow code.
Loops and if/then statements are several examples of conditional code generated. The following methods are in the interface:

Programming (*pDrvExtCG_ProgMgmt)->RunO
(*pDrvExtCG_ProgMgmt)->StopO
Output (*pDrvExtCG_ProgMgmt)->EnableoutputO
(*pDrvExtCG_ProgMgmt)->SetOutput0 3.4.5 IXMC DrvExtCG Subroutine Interface The IXMC_DrvExtCG_Subroutine interface is used to generate subroutines and calls to subroutines. The following methods are in the IXMC_DrvExtCG_Subroutine interface:
General (*pDrvExtCG_Sub)->DefineO
(*pDrvExtCGSub)->CallO
(*pDrvExtCG-Sub)-> Endo 3.4.6 IXMC_DrvExtCG_Variable Interface The IXMC_DrvExtCG_Variable interface is used to define and assign values to variables. The following methods are included in the interface:

Definition (*pDrvExtCG_Var)->DefineO
Assignment (*pDrvExtCG_Var)->AssignNumerico (*pDrvExtCG_Var)->AssignBinaryo (*pDrvExtCG_Var)->AssignStringo Appendix A - Vendor Specific Interfaces (ExtVS) This section includes the definitions of all non-XMCSPI interfaces. All interfaces defined in this section are hardware dependent. Directly programming to any interfaces in this section automatically makes those programs dependent on the XMC Driver used.
A.1 XMC Compumotor AT6400 Driver Interfaces defined in this section only work with the Compumotor AT6400 Driver.
A.1.1 1AT6400_Drv ExtVS_Drive Interface The IAT6400_DrvExtVS_Drive interface is used to configure and control drives within a motion control system. The following are the methods in this interface:

Setting Attributes (*pDrvExtVS-Drive)->SetResolutionO
(*pDrvExtVS_Drive)->SetFaultLevelO
(*pDrvExtVS-Drive)->SetPulseWidthO

Actions (*pDrvExt_Timer)->EnableO
(*pDrvExt_Timer)->DisableOnKillO
A.1.2 IAT6400_DrvExtVS_Encoder Interface The IXMC_DrvExtVS_Encoder interface is used to manipulate encoders in a motion control system using the Compumotor AT6400 motion control hardware.

Setting Attributes (*pDrvExt_Encoder)->SetEncoderMotorStepModeO
(*pDrvExt_Encoder)->SetPositionMaintenance 0 (*pDrvExt-Encoder)->SetStallDetectionO
Actions (*pDrvExt_Encoder)->EnablePositionMaintenanceO
(*pDrvExt_Encoder)->EnableStallDetectionO
Appendix B
13.1 Reviewer Feedback All feedback is important in order to evolve the specification into a standard software model for motion control hardware. Please, at a minimum, respond to the following issues:

1. Which areas, ideas, or concepts within the specification seem confusing to you?
2. Are there any main features missing from the specification that you would find useful?
3. Are there any specific scenario-maps you would like to see in the next revision?
4. Are there any specific C or C++ code examples you would like to see?
5. Are there any specific Visual Basic code examples you would like to see?

B.1.1 Correspondence If possible, please send all feedback over email to the following address:
Dave Brown ROY-G-BIV Corporation Compuserve: 72103,2235 Internet: 72103.2235@compuserve.com Otherwise, if you do not have access to email, please mail all correspondence to the following address:

Dave Brown ROY-G-BIV Corporation P.O. Box 1278 White Salmon, WA. 98672 APPENDIX B

1.0 Overview To use XMC, applications call the methods defined by the XMCAPI OLE interfaces to perform the motion control services needed. The full XMCAPI comprises a set of OLE
interfaces corresponding with common objects found in a motion control system. For example, a motion control system may contain servo and stepper motors, encoders, limit switches, and a joystick.
Within the XMCAPI are interfaces corresponding to each of these objects. The full XMCAPI
contains implementations of both standard OLE 2.0 interfaces and a rich set of custom OLE
interfaces designed specifically for motion control.

This reference manual describes all OLE interfaces in the XMCAPI. Each section discussing an interfaces starts with a description of the interface and how it is used.
Next, all functions in the interface are listed by category.

Chapter 2.0 Standard OLE Interfaces, describes all standard interfaces exposed in the XMCAPI.
Next, Chapter 3.0 XMC Driver Administrator, discusses both the standard and custom interfaces exposed by the Driver Administrator that make up a small portion of the XMCAPI. Finally, Chapter 4.0 XMC Motion Control Component, discusses the standard and custom interfaces exposed by the Motion Control Component. The Motion Control Component implements and exposes the majority of the XMCAPI. Together, the Motion Control Component and the Driver Administrator implement and expose the full set of interfaces defined by the XMCAPI.

2.0 Standard OLE Interfaces Several standard OLE interfaces must be supported when following the OLE
software model.
Both the (Unknown and lClassFactory interfaces are examples of required interfaces. The IDataObject interface is used when transferring or caching data. The lDispatch is provided to support OLE Automation between processes. This section describes all standard OLE interfaces used by the Driver Administrator, Motion Control Component, and Motion Control Drivers.

2.1 ICIassFactory Interface The lClassFactory interface is used to create an instance of an object and return to the caller a pointer to an interface.

General (*pCF)->Createlnstanceb (*pCF)->LockServerO

2.2 IDispatch Interface The IDispatch interface is used to support OLE Automation. Normally, this interface is used by the OLE Automation engine, not the C/C++ application developer.

General (*pDisp)->GetlDsOfNamesO
(*pDisp)->GetTypelnfo0 (*pDisp)->GetTypelnfoCountO
(*pDisp)->InvokeO
2.3 IEnumX Interface The IEnumX interface is a generic OLE interface that other enumeration interfaces always inherit from. This interface is used to create and move through an enumeration of data. The IXMC_EnumInterface interface inherits from lEnumX to implement the interface support querying functionality.
General (*pEnum)->NextO
(*pEnum)->SkipO
(*pEnum)->Reseto (*pEnum)->CloneO
2.4 (Unknown Interface The (Unknown interface is a standard OLE interface exposed by all OLE objects.
In a way it is a common base interface.

General (*pUnk)->Querylnterfaceo (*punk)->AddRefO
(*pUnk)->Release 0 3.0 XMC Driver Administrator The Driver Administrator, which implements a small subset of the XMCAPI set of functions, is used by both the user and the Motion Control Component. It is used by the user to add new Motion Control Drivers, configure existing drivers, and remove old ones. Later when an application uses the Motion Control Component, the component queries the Driver Administrator for the current driver to use.

NOTE: OLE 2.0 interfaces are used to implement all functions in the XMCAPI.

The following OLE 2.0 interfaces are custom OLE interfaces in the XMCAPI
supported by the Driver Administrator.

IXMC DriverAdmin 3.1 Standard OLE Interfaces The following standard OLE interfaces are supported by the Driver Administrator. For more information on each interface, see section 6.0 Standard OLE Interfaces.

lClassFactory IDispatch (Unknown 3.2 Custom OLE Interfaces The following custom interface is a part of the XMCAPI and an extension to the OLE 2.0 software model.
3.2.1 IXMC DriverAdmin This interface is used to manipulate and query the Driver Administrator settings. The Driver Administrator application, run by the user, manipulates the administrator's settings. And, the Motion Control Component queries the administrator for a pointer to the current driver to use.
Querying Attributes (*pXMCDrvAdmin)->GetSelectedDrive rsO
(*pXMCDrvAdmin)->IsDiagnosticTestingOnO
(*pX1,r~~, YAdmi<<)->fsA~ILaggingvnQ
(*pXMCDrvAdmin)->IsCmdLogging0n0 (*pXMCDrvAdmin)->IsBitLoggingOnO
Setting Attributes (*pXMCDrvAdmin)->SetAPIStreamO
(*pXMCDrvAdmin)->SetCmdStreamO
(*pXMCDrvAdmin)->SetBitStreamO

Actions (*pXMCDrvAdmin)->EnableAPlLogging 0 (*pXMCDrvAdmin)->EnabieCmdLoggingo (*pXMCDrvAdmin)->EnableBitLoggingo (*pXMCDrvAdmin)->EnableDiagnosticso (*pXMCDrvAdmin)->ViewinterfaceSupportO
3.2.1 IXMC EnumDriver The IXMC_EnumDriver interface is used by the XMC Motion Control Component when building the interface enumeration describing the level of XMC support provided by each driver. This interface inherits from the standard lEnumX OLE interface.

4.0 XMC Motion Control Component The Motion Control Component, which implements the majority of the XMCAPI set of functions, is used by applications. As a complete set, the OLE interfaces in the XMCAPI are separated into the four categories below.

1. Standard - Standard OLE interfaces.
2. Motion Control - Custom OLE interfaces used for motion control and code generation.
3. Code Generation - Custom OLE interfaces used for code generation only.
4. Diagnostic - Custom OLE interfaces used for debugging the system.

XMCAPI interfaces follow the standard OLE 2.0 COM Object software model. The following OLE
2.0 interfaces make up the XMCAPI set of functions implemented by the Motion Control Component:
Standard lClassFactory IDataObject (Dispatch lEnumX
(Unknown Motion Control IXMC_Counter IXMC_Display IXMC_DynamicState IXMC Encoder IXMC_Enuminterface IXMC_IO
IXMC_Joystick IXMC Limits IXMC_Motion IXMC StaticState IXMC Timer Code Generation IXMC_Operator IXMC_Program IXMC_ProgramFlow IXMC_ProgramMgmt IXMC Subroutine IXMC_Variable Diagnostic IXMC_Error IXMC_Debug 4.1 Standard OLE Interfaces The following standard OLE interfaces are supported by the Motion Control Component. For more information on each interface, see section 6.0 Standard OLE Interfaces.

IClassFactory IDataObject IDispatch ;IEnumX
(Unknown 4.2 Custom OLE Interfaces - Motion Control The general set of interfaces is made up from all main motion control interfaces. Most interfaces resemble objects found within the motion control system.

4.2.1 IXMC_Counter Interface The IXMC_Counter interface allows the programmer to manipulate a hardware counter.
Actions (*pCounter)->Advise0 (*pCounter)->AttachEncoderO
(*pCounter)->Detach EncoderO
(*pCounter)->EnableO
(*pCounter)->ResetO
(*pCounter)->UnAdviseO
Querying Attributes (*pCounter)->GetCountO
4.2.2 IXMC_DynamicState Interface The IXMC_DynamicState interface manages high level system tasks, such as initialization, and allows the user to get all state information describing the motion control system. When queried, other interfaces use an internal pointer to the IXMC_DynamicState interface to retrieve state values, which are returned to the caller. The following methods make up the IXMC_DynamicState interface:

Configuration (*pDynSt)->lnitializeExO
(*pDynSt)->lntializeO
(*pDynSt)->Reset 0 (*pDynSt)->ShutDownO

Querying Attributes (*pDynSt)->AreHardwareLimitsOnO
(*pDynSt)->AreSoftwareLimitsOnO
(*pDynSt)->GetAccelerationO
(*pDynSt)->GetActuaIPosition 0 (*pDynSt)->GetActualVelocityO
(*pDynSt)->GetCommandedPosition 0 (*pDynSt)->GetCommandedVelocityO
(*pDynSt)->GetCountO
(*pDynSt)->GetDeceleration 0 (*pDynSt)->GetErrorStatusO
(*pDynSt)->GetHomePositionO
(*pDynSt)->GetEncoderResolutionO
(*pDynSt)->GetJogVelocityHighO
(*pDynSt)->GetJogVelocityLowo (*pDynSt)->GetJoystickVelocityHighO
(*pDynSt)->GetJoystickVelocityLowO
(*pDynSt)->GetJoysticlcAccelerationO
(*pDynSt)->GetJoystickDecelerationO
(*pDynSt)->GetLimitDecelerationO
(*pDynSt)->GetSoftwareLimitPositionsO
(*pDynSt)->GetMapModeO
(*pDynSt)->GetPositionO
(*pDynSt)->GetTimerTickO
(*pDynSt)->GetUnitsO
(*pDynSt)->GetVelocityO
(*pDynSt)->GetZeroPosition0 (*pDynSt)-> IsCounterOnO
(*pDy%St) = isinMctionO
(*pDynSt)->IsInterpoIation0n0 (*pDynSt)-> I sJoystickOn O
'(*pDynSt)->IsMotion0n0 (*pDynSt)->IsPositionErrorCorrection0n0 (*pDynSt)->IsTimerOnO
(*pDynSt)->IsIOOutputOnO
(*pDynSt)->IslOlnputOn0 Setting Attributes (*pDynSt)->ClearErrors0 Actions (*pDynSt)->GetCSO
(*pDynSt)->ReleaseCSO
4.2.3 IXMC Encoder Interface The IXMC_Encoder interface is used when working with encoder hardware. Once initialized, a pointer to an IXMC_Encoder interface may be attached to an IXMC_Motion interface which allows them to work together. Once attached, the IXMC_Motion interface uses the IXMC_Encoder interface position related functions, like setting the home position or querying the current position.

Querying Attributes (*pEncoder)->GetErrorStatus0 (*pEncoder)->GetHomePosition0 (*pEncoder)->GetPosition0 (*pEncoder)->GetZeroPosition0 (*pEncoder)->GetResolution0 Setting Attributes (*pEncoder)->SetHomePosition0 (*pEncoder)->SetHomePositionExO
(*pEncoder)->SetZeroPosition0 (*pEncoder)->SetZeroPositionEx0 (*pEncoder)->SetResolution0 4.2.4 IXMC Enuminterface Interface The IXMC Enuminterface interface is used to access the list of the XMCAPI
interface names and a description of their implementations. For example, if the motion control hardware or software driver controlling the hardware do not support code generation, all code generation interfaces in the enumeration would be listed as "NOT IMPLEMENTED". Knowing what interfaces are and are not supported allow particular programs to decide what drivers are actually capable of running with the application. This interface inherits from the standard lEnumX OLE
interface.

Inheritance IEnumX
I
--- IXMC_Enuminterface 4.2.5 IXMC-10 Interface This interface is used by applications to manipulate both digital and analog I/O support located on the motion control hardware. The following methods are available from the Motion Component in the IXMC IO interface:
Configuration (*pIO)->InitializeO
(*plO)->InitializeExO
Querying Attrributes (*pl O)->GetErrorStatuso (*pl O)-> IslntputEnabledO
(*plO)->IsOutputEnabledO
Actions (*plO)->AdviseO
(*plO)->AttachMotionO
(*plO)->DetachMotion0 (*plO)->EnablelnputO
(*plO)->EnableOutputO
(*pIO)->ReadO
(*pIO)->UnAdviseO
(*plO)->WriteO

4.2.6 IXMC_Joystick Interface The IXMC_Joystick interface is used to manipulate a hardware joystick. When the joystick is enabled, all instances of the IXMC_Motion interface will be disabled.

Querying Attributes (*pJS)->GetAcceleration0 (*pJS)->GetDeceleration0 (*pJS)->GetErrorStatus0 (*pJS)->GetVelocityHighO
(*pJS)->GetVelocityLowO
(*pJS)->lsEnabled0 Setting Attributes (*pJS)->SetAcceleration0 (*pJS)->SetDecelerationO
(*pJS)->SetVelocityHighO
(*pJS)->SetVelocityLowO
(*pJS)->SetZeroO
Actions (*pJS)->AttachAnaloglOO
(*pJS)->AttachLimits0 (*pJS)->DetachAnaloglOO
(*pJS)->Detach Limits0 (*pJS)->Enable0 4.2.7 IXMC Limits Interface The IXMC_Limits interface is used to set software limit positions. The IXMC_Limits, 1XMC_Joystick, and IXMC_Motion interfaces work together to implement the software limits.
Querying Attributes (*PLim)->GetErrorStatus0 (*pLirn)->GetLimitPositionsO
(*pLim)->GetDeceleration0 (*pLim)->AreSoftwareLimitsonO
(*pLim)->AreHardwareLimitsOn0 Setting Attributes (*pLim)->SetLimitPositions0 (*pLim)->SetDeceleration0 Actions (*pLim)->EnableSoftwareLimitsO
(*pLim)->EnableHardwareLimitsO
4.2.8 IXMC_Motion Interface The tXMC_Motion interface is used to perform movement operations. Most functions are passed an array of AXIS_DATA specifying the appropriate axis data.

Configuration (*pMotion)->InitializeO
(" pMotion)->TuneO
(*pMotion)->TuneExO

Querying Attributes (*pMotion)->GetAccelerationO
(*pMotion)->GetDecelerationO
(*pMotion)->GetErrorStatusO
(*pMotion)->GetVelocityO
(*pMotion)->GetPositionO
(*pMotion)->GetUnitsO
(*pMotion)->IsMotionon0 (*pMotion)->IslnterpolationOnO

Setting Attributes (*pMotion)->AttachEncoder0 (*pMotion)->AttachLimitsO
(*pMotion)->DetachEncoder0 (*pMotion)->Detach LimitsO
(*pMotion)->SetAccelerationO
(*pMotion)->SetDecelerationO
(*pMotion)->SetPositionO
(*pMotion)->SetVelocity0 (*pMotion)->SetJogVetocityHighO
(*pMotion)->SetJogVelocityLowO

Actions (*pMotion)->Advise 0 (*pMotion)->CreatePathO
(*pMotion)->En ablelnterpolation0 (*pMotion)->EnableMotionO
(*pMotion)->EnablePositionErrorCorrectionO
(*pMotion)->GoHomeO
(*pMotion)->GoZeroO
(*pMotion)->JogO
(*pMotion)->Kill 0 (*pMotion)->MoveAbsO
(*pMotion)->MoveContinousO
(*pMotion)->MoveResO
(*pMotion)->StopO
(*pMotion)->TraceArcO
(*pMotion)->TracePath 0 (*pMotion)->UnAdviseO
4.2.9 IXMC StaticState Interface The IXMC_StaticState interface manages all static data in the motion control system, such as scaling factors, maximum velocities and maximum accelerations. The following methods make up the IXMC_StaticState interface:

Configuration (*pStatSt)->lnitializeExO
(*pStatSt)->IntiafizeO

Querying Attributes (*pstatst)->G et 4xisScaiingO
(*pStatSt)->GetMaxAcceleration 0 (*pStatSt)->GetMaxDeceleration 0 (*pStatSt)->GetMaxVelocityO
(*pStatSt)->GetPathScalingO
(*pStatSt)->GetOperatingModeO

Setting Attributes (*pStatSt)->SetAxisScalingO
(*pStatSt)-> S etM axAcce l e rati o n Q
(*pStatSt)-> SetMaxDecelerationO
("pStatSt)->SetMaxVelocityo (*pStatSt)->SetPathScalingQ
(*pStatSt)-> S etOperati ng Mode 0 Actions (*pStatSt)->CommitStateO
(*pStatSt)->Enable Scaling Factors 0 (*pStatSt)->GetStateO
(*pStatSt)->ReleaseStateO

4.2.10 IXMC Timer Interface The IXMC_Timer interface allows the programmer to manipulate a hardware timer.
Querying Attributes (*pTmmer)->GetDefayO
(*pTimer)->GetErrorStatusO
(*pTimer)->GetElapsedTimeO
(*pTimer)->GetResolutionO
(*pTimer)->lslnDelayO

Setting Attributes (*pTimer)->SetDelayO
Actions (*p1imer)->AdviseO
(*pTimer)->DoDelayO
(*pTimer)->EnableO
(*pTmmer)->ResetO
(*pTimer)->StartO
(*pTimer)->StopO
(*plimer)->UnAdviseO

4.3 Custom OLE Interfaces - Code Generation Unlike the set of general interfaces, that may either run in either real-time or generating code modes, the code generation interfaces are only used when generating code. When used in conjunction with other general interfaces, complete motion control programs may be generated.
This section discusses each of the code generation interfaces.
4.3.1 IXMC_Operator Interface The IXMC_Operator interface contains general program statement generating functions including bitwise operations, mathematical operations, logical operations, and general conditional operations. The following functions are in the IXMC_Operator interface:
Constants CE PI
Bitwise (*pOper)->BitAndO
(*pOper)->BitNotO
(*pOper)->BitOrO
(*pOper)->BitShiftLO
(*pOper)->BitShiftRO
(*pOper)->BitXOrO
Logical (*pOper)->AndO
(*pOper)->NotO
(*pOper)->OrO
Mathematical (*pOper)->Add0 (*pOper)->BitO
(*pOper)->DivO
(*pOper)->LeftPareno (*pOper)->MultO
(*pOper)->RightParenO
(*pOpeC)->Sgrto (*pOper)->SubO

Trigonometric (*pOper)->ACos0 (*pOper)->ASinO
(*pOper)->ATanO
(*pOper)->Cos0 (*pOper)->Sin0 (*pOper)->TanO

Labels/Strings/Comments (*pOper)->ASCIICharO
(*pOper)->Comment0 (*pOper)->DecdLabelO
(*pOper)-> String 0 Conditional (*pOper)->EqualO
(*pOper)->GreaterThanO
(*pOper)->GreaterThanEqualO
(*pOper)->LessThanO
(*pOper)->LessThanEqualO
(*pOper)->NotEqualO
4.3.2 IXMC_Program Interface The IXMC_Program interface is used to generate the general program shell.
Several other program flow functions like causing the program to sleep for a specified amount of time are also included. The following methods make up the interface:

Program Flow (*pProg)->CombineO
(*pProg)->DefineO
(*pProg)->Download 0 (*pProg)->EndO
(*pProg)->ExitO
(*pProg)->RenderAsTextO
(*pProg)->RunO
(*pProg)->SleepO
(*pProg)->StopO

4.3.3 IXMC_ProgramFlow Interface The IXMC_ProgramFlow interface is used to generate code used to control the flow of a program. Methods are available to generate if-else and general looping statements. The following methods are in the IXMC_ProgramFiow interface:

If/Else (*pProgFlow)->lfOpenO
(*pProgFlow)-> IfCloseO
(*pProgFlow)->Else O
(*pProgFlow)->EndlfO
While (*pProgFlow)-> WhileOpenO
(*pProgFlow)->WhileCloseO
(*pProgFlow)->EndWhileO
Repeat (*pProgFlow)->RepeatO
(*pProgFlow)->UntiIOpenO
(*pProgFlow)->UntilClose0 Loops (*pProgFlow)->LoopO
(*pProgFlow)->EndLoopO
Misc.
(*PProgFlow)->BreakO
(*pProgFlow)->GoToO
4.3.4 IXMC_ProgramMgmt Interface The IXMC_ProgramMgmt interface is used when working with programs on a high level.
Running and saving programs are a few operations included in this interface.
The following methods make up the interface:

Program Management (*pProgMgmt)->Download 0 (*pProgMgmt)->Upload0 (*pProgMgmt)->SetOutputO
(*pProgMgmt)->0penoutput0 (*pProgMgmt)->CloseOutput0 (*pProg Mgmt)-> FlushOutput0 4.3.5 IXMC Subroutine Interface The IXMC_Subroutine interface is used to generate and subroutines and calls to subroutines generated. The following methods are in the IXMC_ Subroutine interface:

General (*pSub)->DefineO
(*pSub)->EndO
(*pSub)->CallO

4.3.6 IXMC Variable Interface The IXMC_Variable interface is used to define and assign values to variables.
The following methods are included in the interface:

Definition (*pVar)->Define0 Assignment (*pVar)->AssignNumeric0 (*pVar)->AssignBinaryO
(*pVar)->AssignString 0 4.4 Custom OLE Interfaces - Diagnostic Diagnostic interfaces may be used by the application developer when debugging the system. The methods in the interface provide the user with logs of information generated when running the XMC software model. Logs may be created for XMCAPI calls, and all information flowing in and out of specified ports.

4.4.1 IXMC_Error Interface The IXMC_Error interface is provided to give the application developer a consistent method of displaying and logging all XMC errors based on the HRESULT value returned by functions that fail. The following methods are in the interface:
Setting Attributes (*pError)->SetOutputQ
Actions (*pError)->DisplayO
(*pError)->LogQ
(*pError)->String From HRESULTQ

4.4.2 IXMC_Debug Interface The IXMC_Debug interface gives the application developer control over several log files that may be generated to help debug an application using the XMC software model.
The following methods are in the interface:

Setting Attributes (*pDebug)->SetXMCAPILogFile() (*pDebug)->SetXMCAPIStreamQ
Actions (*pDebug)->EnableXMCAPILogging 0 (*pDebug)->EnableDiagnosticsO
Appendix A

A.1 Reviewer Feedback All feedback is important in order to evolve the specification into a standard software model for motion control hardware. Please, at a minimum, respond to the following issues:
I

1. Which areas, ideas, or concepts within the specification seem confusing to you?
2. Are there any main features missing from the specification that you would find useful?
3. Are there any specific scenario-maps you would like to see in the next revision?

4. Are there any specific C or C++ code examples you would like to see?
5. Are there any specific Visual Basic code examples you would like to see?
A1.1 Correspondence If possible, please send all feedback over email to the following address:
Dave Brown ROY-G-BIV Corporation Compuserve: 72103,2235 Internet: 72103.2235@compuserve.com Otherwise, if you do not have access to email, please mail all correspondence to the following address:

Dave Brown ROY-G-BIV Corporation P.O. Box 1278 White Salmon, WA. 98672

Claims (25)

1. A method of debugging software used to communicate with a motion control system, comprising the steps of:
providing a set of hardware motion control attributes used for motion control, where at least one hardware motion control attribute is a primitive hardware motion control attribute used for motion control that cannot be emulated using at least one other hardware motion control attribute, and at least one hardware motion control attribute is a non-primitive hardware motion control attribute that does not meet the definition of a primitive hardware motion control attribute;
providing a set of common motion control attributes;
providing a motion control device capable of storing at least one primitive hardware motion control attribute;
generating debug information containing diagnostic information associated with at least one hardware motion control attribute;
providing a set of software drivers, where at least one software driver is capable of sending the debug information to a debug target;
selecting at least one selected software driver, capable of sending the debug information to a debug target, from the set of software drivers;
providing a software application;
causing the software application to call at least one motion component function to exchange at least one common motion control attribute with the at least one selected software driver;
using at least one called motion component function to cause at least one motion component to exchange at least one common motion control attribute with the at least one selected software driver by calling at least one driver function; and using at least one called driver function to cause the selected software driver to convert at least one common motion control attribute to at least one hardware motion control attribute, exchange at least one hardware motion control attribute with the motion control device, and send debug information to the debug target.
2. A method as recited in claim 1, wherein at least one primitive hardware motion control attribute sent to the debug target contains data read from the motion control device.
3 A method as recited in claim 1, further comprising the step of providing a set of command codes, wherein.

at least one command code is capable of causing the motion control device to perform at least one primitive motion operation, and at least one software driver is capable of causing at least one command code to be sent to the debug target.
4. A method as recited in claim 1, further comprising the steps of:
reading at least one primitive hardware motion control attribute; and causing the debug information to be sent to the debug target.
5. A method as recited in claim 1, wherein the step of exchanging at least one common motion control attribute causes the debug information to be sent to the debug target.
6. A method as recited in claim 1, wherein the step of exchanging at least one common motion control attribute causes:

the motion control device to move an object; and the debug information to be sent to the debug target.
7. A method as recited in claim 1, wherein the debug target is a file.
8. A method as recited in claim 1, wherein further comprising the steps of:
providing a user interface; and causing the debug target to display at least some of the debug information in the user interface.
9. A method as recited in claim 1, further comprising the step of providing a debug stream, wherein the debug stream is capable of writing at least some of the debug information to a file.
10. A method as recited in claim 1, further comprising the step of providing a debug stream, wherein the debug stream is capable of sending at least some of the debug information to a user interface.
11. A method as recited in claim 1, in which the selected software driver exposes a driver software interface, where the driver software interface comprises at least one driver function used to access at least one primitive hardware motion control attribute received from the motion control device.
12. A method as recited in claim 11, wherein the motion component is capable of querying and using the driver software interface
13. A method as recited in claim 1, further comprising the step of exposing a motion software interface, where the motion software interface contains at least one motion component function.
14. A method as recited in claim 13, wherein the software application is capable of querying and using the motion software interface.
15. A method of debugging motion control software, comprising the steps of:
providing a set of hardware motion control attributes comprising primitive hardware motion control attributes, where the primitive hardware motion control attributes cannot be emulated using at least one other primitive hardware motion control attribute, and non-primitive hardware motion control attributes that do not meet the definition of primitive hardware motion control attribute;
providing a set of common motion control attributes;
providing a motion controller capable of storing at least one primitive hardware motion control attribute;
providing a motion control device capable of being controlled using the motion controller;
generating debug information containing diagnostic information associated with at least one hardware motion control attribute;
sending the debug information to a debug target;
providing a set of software drivers, where at least one software driver is capable of being configured to send the debug information to the debug target, and at least one software driver exposes at least one driver function that converts at least one common motion control attribute to at least one hardware motion control attribute;
selecting a selected software driver from the set of software drivers;
providing a software application;
causing the software application to exchange at least one common motion control attribute with the selected software driver by calling the at least one software driver function, and in response to the at least one called software driver function, causing the selected software driver to exchange at least one hardware motion control attribute with the motion control device, and send the hardware motion control attribute to the debug target.
16. A method as recited in claim 15, further comprising the steps of:
reading at least one primitive hardware motion control attribute from the motion control device; and sending to the debug target the at least one primitive motion control attribute read from the motion control device.
17. A method as recited in claim 15, further comprising the steps of:
writing at least one primitive hardware motion control attribute to the motion control device; and sending to the debug target the at least one primitive hardware motion control attribute written to the motion control device.
18. A method as recited in claim 15 further comprising the steps of:
writing at least one primitive hardware motion control attribute to the motion control device, where the at least one primitive hardware motion control attribute written to the motion control device is capable of causing the motion control device to move an object, and sending to the debug target the at least one primitive hardware motion control attribute written to the motion control device.
19. A method as recited in claim 15, wherein at least one primitive hardware motion control attribute written to the motion control device is:
capable of causing the motion control device to move, and is sent to the debug target.
20. A method as recited in claim 15, wherein the selected software driver exposes a driver interface that contains at least one driver function capable of being used to access at least one primitive hardware motion control attribute received from at least one motion control device.
21. A method as recited in claim 20, wherein the software application is capable of querying and using the driver interface.
22. A method as recited in claim 15, wherein the debug target is a file_
23. A method as recited in claim 15, wherein the debug target is a user interface that displays at least some of the debug information.
24. A method as recited in claim 15, further comprising the step of providing a debug stream, where the debug stream is capable of writing at least some debug information to a file.
25. A method as recited in claim 15, further comprising the step of providing a debug stream, where the debug stream is capable of sending at least some of the debug information to a user interface.
CA2705404A 1995-05-30 1996-05-30 Motion control systems Abandoned CA2705404A1 (en)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US08/454,736 US5691897A (en) 1995-05-30 1995-05-30 Motion control systems
US08/454,736 1995-05-30
CA2586401A CA2586401C (en) 1995-05-30 1996-05-30 Motion control systems

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
CA2586401A Division CA2586401C (en) 1995-05-30 1996-05-30 Motion control systems

Publications (1)

Publication Number Publication Date
CA2705404A1 true CA2705404A1 (en) 1996-12-05

Family

ID=23805862

Family Applications (2)

Application Number Title Priority Date Filing Date
CA002222235A Expired - Lifetime CA2222235C (en) 1995-05-30 1996-05-30 Motion control systems
CA2705404A Abandoned CA2705404A1 (en) 1995-05-30 1996-05-30 Motion control systems

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CA002222235A Expired - Lifetime CA2222235C (en) 1995-05-30 1996-05-30 Motion control systems

Country Status (9)

Country Link
US (8) US5691897A (en)
EP (5) EP1560093B1 (en)
JP (4) JPH11506234A (en)
AT (3) ATE302437T1 (en)
AU (1) AU6027696A (en)
CA (2) CA2222235C (en)
DE (3) DE69635094T2 (en)
HK (3) HK1009531A1 (en)
WO (1) WO1996038769A1 (en)

Families Citing this family (114)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6941543B1 (en) * 1995-05-30 2005-09-06 Roy-G-Biv Corporation Motion control system and method
US6571141B1 (en) 1995-05-30 2003-05-27 Roy-G-Biv Corporation Application programs for motion control devices including access limitations
US6859671B1 (en) 1995-05-30 2005-02-22 Roy-G-Biv Corporation Application programs for motion control devices including access limitations
US7024666B1 (en) 2002-01-28 2006-04-04 Roy-G-Biv Corporation Motion control systems and methods
US7035697B1 (en) * 1995-05-30 2006-04-25 Roy-G-Biv Corporation Access control systems and methods for motion control
US5691897A (en) * 1995-05-30 1997-11-25 Roy-G-Biv Corporation Motion control systems
US20100131081A1 (en) * 1995-05-30 2010-05-27 Brown David W Systems and methods for motion control
US7137107B1 (en) * 2003-04-29 2006-11-14 Roy-G-Biv Corporation Motion control systems and methods
US6209037B1 (en) * 1995-05-30 2001-03-27 Roy-G-Biv Corporation Motion control systems using communication map to facilitating communication with motion control hardware
US6542925B2 (en) 1995-05-30 2003-04-01 Roy-G-Biv Corporation Generation and distribution of motion commands over a distributed network
US7139843B1 (en) * 1995-05-30 2006-11-21 Roy-G-Biv Corporation System and methods for generating and communicating motion data through a distributed network
US20060206219A1 (en) 1995-05-30 2006-09-14 Brown David W Motion control systems and methods
US5887169A (en) * 1996-03-15 1999-03-23 Compaq Computer Corporation Method and apparatus for providing dynamic entry points into a software layer
US5822525A (en) * 1996-05-22 1998-10-13 Microsoft Corporation Method and system for presentation conferencing
EP0825506B1 (en) 1996-08-20 2013-03-06 Invensys Systems, Inc. Methods and apparatus for remote process control
JPH1165968A (en) * 1997-08-13 1999-03-09 Nippon Telegr & Teleph Corp <Ntt> Method and system for managing network
US20010032278A1 (en) * 1997-10-07 2001-10-18 Brown Stephen J. Remote generation and distribution of command programs for programmable devices
GB2319100B (en) * 1997-11-15 1998-09-16 Ibm Hardware simulator for a transaction processing system
US6144895A (en) * 1997-11-26 2000-11-07 Allen-Bradley Company, Llc System and method for networking a computer numerical control with a workstation
US6101425A (en) * 1997-11-26 2000-08-08 Allen-Bradley Company, Llc Multiple connection networked man-machine interfaces for computer numerical controls
US6470377B1 (en) 1997-12-19 2002-10-22 Rockwell Automation Technologies, Inc. Networked file operations for computer numerical controls
FR2789781B1 (en) * 1999-02-12 2001-04-27 Alstom SYSTEM FOR DEVELOPING AND EXECUTING A DRIVING ASSISTANCE APPLICATION FOR INDUSTRIAL INSTALLATION CONTROL ASSEMBLY
US6944584B1 (en) 1999-04-16 2005-09-13 Brooks Automation, Inc. System and method for control and simulation
US6850806B2 (en) * 1999-04-16 2005-02-01 Siemens Energy & Automation, Inc. Method and apparatus for determining calibration options in a motion control system
WO2000067081A1 (en) * 1999-05-04 2000-11-09 Roy-G-Biv Corporation Motion control devices including access limitations
US7013284B2 (en) * 1999-05-04 2006-03-14 Accenture Llp Component based interface to handle tasks during claim processing
US7617240B2 (en) 1999-05-04 2009-11-10 Accenture Llp Component based task handling during claim processing
US7979382B2 (en) 1999-05-04 2011-07-12 Accenture Global Services Limited Component based information linking during claim processing
WO2000070531A2 (en) 1999-05-17 2000-11-23 The Foxboro Company Methods and apparatus for control configuration
US7089530B1 (en) 1999-05-17 2006-08-08 Invensys Systems, Inc. Process control configuration system with connection validation and configuration
US6788980B1 (en) 1999-06-11 2004-09-07 Invensys Systems, Inc. Methods and apparatus for control using control devices that provide a virtual machine environment and that communicate via an IP network
US6374195B1 (en) * 1999-06-29 2002-04-16 Daimlerchrysler Corporation System for monitoring and tracking tool and tool performance
US6401005B1 (en) 1999-09-27 2002-06-04 Rockwell Automation Technologies, Inc. Programmable synchronous and asynchronous block execution for a computer numerical control
US6606665B2 (en) 1999-09-27 2003-08-12 Rockwell Automation Technologies, Inc. Multiple connection architecture for communication with a computer numerical control resident in a workstation and other networked computer numerical controls
US8032605B2 (en) 1999-10-27 2011-10-04 Roy-G-Biv Corporation Generation and distribution of motion commands over a distributed network
CA2389183C (en) * 1999-10-27 2008-05-20 Roy-G-Biv Corporation Systems and methods for generating and communicating motion data through a distributed network
US6885898B1 (en) 2001-05-18 2005-04-26 Roy-G-Biv Corporation Event driven motion systems
US20100131078A1 (en) * 1999-10-27 2010-05-27 Brown David W Event driven motion systems
US6879862B2 (en) * 2000-02-28 2005-04-12 Roy-G-Biv Corporation Selection and control of motion data
EP1096448A3 (en) 1999-11-01 2004-01-28 Citicorp Development Center, Inc. Method and system for obtaining device services on a self-service transaction terminal
DK176631B1 (en) * 1999-12-20 2008-12-08 Danfoss Drives As Programming an engine control
AU2001239818A1 (en) * 2000-02-22 2001-09-03 Roy-G-Biv Corporation Generation and distribution of motion commands over a distributed network
US7365860B2 (en) * 2000-12-21 2008-04-29 Sensory Analytics System capable of determining applied and anodized coating thickness of a coated-anodized product
US6674533B2 (en) * 2000-12-21 2004-01-06 Joseph K. Price Anodizing system with a coating thickness monitor and an anodized product
US7274463B2 (en) * 2003-12-30 2007-09-25 Sensory Analytics Anodizing system with a coating thickness monitor and an anodized product
AU2002251731A1 (en) 2001-01-04 2002-07-16 Roy-G-Biv Corporation Systems and methods for transmitting motion control data
US7904194B2 (en) * 2001-02-09 2011-03-08 Roy-G-Biv Corporation Event management systems and methods for motion control systems
WO2002071241A1 (en) * 2001-02-09 2002-09-12 Roy-G-Biv Corporation Event management systems and methods for the distribution of motion control commands
US6865499B2 (en) * 2001-04-26 2005-03-08 Siemens Energy & Automation, Inc. Method and apparatus for tuning compensation parameters in a motion control system associated with a mechanical member
US6859747B2 (en) * 2001-04-26 2005-02-22 Siemens Energy & Automation, Inc. Method and apparatus for self-calibrating a motion control system
US6819960B1 (en) 2001-08-13 2004-11-16 Rockwell Software Inc. Industrial controller automation interface
GB0120748D0 (en) 2001-08-25 2001-10-17 Lucas Aerospace Power Equip Generator
US20030045947A1 (en) * 2001-08-30 2003-03-06 The Boeing Company System, method and computer program product for controlling the operation of motion devices by directly implementing electronic simulation information
WO2003019397A1 (en) * 2001-08-31 2003-03-06 Roy-G-Biv Corporation Motion services protocol accessible through uniform resource locator (url)
US7474698B2 (en) * 2001-10-19 2009-01-06 Sharp Laboratories Of America, Inc. Identification of replay segments
AU2002357040A1 (en) * 2001-11-28 2003-06-10 Evolution Robotics, Inc. Sensor and actuator abstraction and aggregation in a hardware abstraction layer for a robot
WO2003073580A2 (en) * 2002-02-25 2003-09-04 General Electric Company Processing system for a power distribution system
US7532955B2 (en) * 2002-02-25 2009-05-12 General Electric Company Distributed protection system for power distribution systems
US7111195B2 (en) * 2002-02-25 2006-09-19 General Electric Company Method and system for external clock to obtain multiple synchronized redundant computers
US7747356B2 (en) 2002-02-25 2010-06-29 General Electric Company Integrated protection, monitoring, and control system
DE10221772A1 (en) * 2002-05-15 2003-11-27 Flowtec Ag Field bus unit is used to provide input from a range of sensors and has a built in digital signal processing capacity with a facility for being programmable
US7137861B2 (en) * 2002-11-22 2006-11-21 Carr Sandra L Interactive three-dimensional multimedia I/O device for a computer
US7636616B2 (en) * 2003-02-25 2009-12-22 General Electric Company Protection system for power distribution systems
US7039822B2 (en) * 2003-02-27 2006-05-02 Promos Technologies Inc. Integrated circuit memory architecture with selectively offset data and address delays to minimize skew and provide synchronization of signals at the input/output section
US8126742B2 (en) 2003-05-09 2012-02-28 Accenture Global Services Limited Automated assignment of insurable events
GB2401467B (en) * 2003-05-09 2006-01-25 Autoliv Dev Improvements in or relating to a movable or removable unit for a motor vehicle
US20070022194A1 (en) * 2003-09-25 2007-01-25 Brown David W Database event driven motion systems
US20060064503A1 (en) * 2003-09-25 2006-03-23 Brown David W Data routing systems and methods
US8027349B2 (en) 2003-09-25 2011-09-27 Roy-G-Biv Corporation Database event driven motion systems
US20070269297A1 (en) 2003-11-10 2007-11-22 Meulen Peter V D Semiconductor wafer handling and transport
US20060250401A1 (en) * 2005-05-06 2006-11-09 Patrick Pannese Systems and methods for generating 3D simulations
US7458763B2 (en) 2003-11-10 2008-12-02 Blueshift Technologies, Inc. Mid-entry load lock for semiconductor handling system
US10086511B2 (en) 2003-11-10 2018-10-02 Brooks Automation, Inc. Semiconductor manufacturing systems
WO2005048086A2 (en) * 2003-11-17 2005-05-26 Roy-G-Biv Corporation Command processing systems and methods
US7266425B2 (en) * 2004-09-30 2007-09-04 Rockwell Automation Technologies, Inc. Systems and methods that facilitate motion control through coordinate system transformations
US8187883B2 (en) * 2005-10-21 2012-05-29 Wisconsin Alumni Research Foundation Method and system for delivering nucleic acid into a target cell
US8015236B2 (en) * 2005-10-25 2011-09-06 Waratek Pty. Ltd. Replication of objects having non-primitive fields, especially addresses
US7933786B2 (en) * 2005-11-01 2011-04-26 Accenture Global Services Limited Collaborative intelligent task processor for insurance claims
US20070247430A1 (en) * 2006-04-21 2007-10-25 Aten International Co., Ltd. Keyboard and mouse operation data recording/reproducing system and method thereof
US7584020B2 (en) * 2006-07-05 2009-09-01 Battelle Energy Alliance, Llc Occupancy change detection system and method
US7668621B2 (en) * 2006-07-05 2010-02-23 The United States Of America As Represented By The United States Department Of Energy Robotic guarded motion system and method
US7587260B2 (en) * 2006-07-05 2009-09-08 Battelle Energy Alliance, Llc Autonomous navigation system and method
US7620477B2 (en) * 2006-07-05 2009-11-17 Battelle Energy Alliance, Llc Robotic intelligence kernel
US7211980B1 (en) 2006-07-05 2007-05-01 Battelle Energy Alliance, Llc Robotic follow system and method
US8355818B2 (en) * 2009-09-03 2013-01-15 Battelle Energy Alliance, Llc Robots, systems, and methods for hazard evaluation and visualization
US8965578B2 (en) 2006-07-05 2015-02-24 Battelle Energy Alliance, Llc Real time explosive hazard information sensing, processing, and communication for autonomous operation
US7974738B2 (en) * 2006-07-05 2011-07-05 Battelle Energy Alliance, Llc Robotics virtual rail system and method
US8073564B2 (en) * 2006-07-05 2011-12-06 Battelle Energy Alliance, Llc Multi-robot control interface
US8271132B2 (en) 2008-03-13 2012-09-18 Battelle Energy Alliance, Llc System and method for seamless task-directed autonomy for robots
US7801644B2 (en) * 2006-07-05 2010-09-21 Battelle Energy Alliance, Llc Generic robot architecture
US20080058993A1 (en) * 2006-09-05 2008-03-06 Okuma America Corporation System, Methods, Apparatuses and Computer Program Products for Use on a Machine Tool Controller
US8782547B2 (en) * 2007-08-20 2014-07-15 Honeywell International Inc. Configurable building control system display
US8209673B1 (en) * 2007-09-25 2012-06-26 Nvidia Corporation SLI approval policy database
US20090210476A1 (en) * 2008-02-19 2009-08-20 Joseph Arie Levy System and method for providing tangible feedback according to a context and personality state
US8478769B2 (en) * 2008-02-22 2013-07-02 Accenture Global Services Limited Conversational question generation system adapted for an insurance claim processing system
US20090217146A1 (en) * 2008-02-22 2009-08-27 Eugene Goldfarb Page navigation generation system for a customizable application
US8515786B2 (en) * 2008-02-22 2013-08-20 Accenture Global Services Gmbh Rule generation system adapted for an insurance claim processing system
CN102124432B (en) 2008-06-20 2014-11-26 因文西斯系统公司 Systems and methods for immersive interaction with actual and/or simulated facilities for process, environmental and industrial control
US8688258B2 (en) * 2008-09-11 2014-04-01 Rockwell Automation Technologies, Inc. Method of controlling a machine tool
JP2010072804A (en) * 2008-09-17 2010-04-02 Ricoh Co Ltd Drive control device and program
US8127060B2 (en) 2009-05-29 2012-02-28 Invensys Systems, Inc Methods and apparatus for control configuration with control objects that are fieldbus protocol-aware
US8463964B2 (en) 2009-05-29 2013-06-11 Invensys Systems, Inc. Methods and apparatus for control configuration with enhanced change-tracking
US20110169832A1 (en) * 2010-01-11 2011-07-14 Roy-G-Biv Corporation 3D Motion Interface Systems and Methods
JP5062499B2 (en) * 2010-05-07 2012-10-31 横河電機株式会社 Field device management device
CN102339036A (en) * 2010-07-16 2012-02-01 深圳富泰宏精密工业有限公司 Machine station motion control system
US9063535B2 (en) * 2011-12-22 2015-06-23 Fanuc Robotics America Corporation Numerical control program execution by robot
WO2013099031A1 (en) * 2011-12-28 2013-07-04 株式会社安川電機 Engineering tool
CN102880153B (en) * 2012-10-15 2015-06-24 中达光电工业(吴江)有限公司 Running method and system of PCB (Printed Circuit Board) drilling and milling equipment adopting different movement control products
CN103197597B (en) * 2013-04-09 2015-11-04 上海维宏电子科技股份有限公司 The method that the upgrading of the kinetic control system be separated with human-computer interaction interface controls
CN103605363B (en) * 2013-09-16 2016-08-17 江苏若博机器人科技有限公司 Four-wheel micro computer Mus sprint controller based on ARM9
US9614371B1 (en) 2014-08-06 2017-04-04 Tsuga Engineering Llc Interface systems and methods for portable structures
CN104765321B (en) * 2015-01-22 2018-09-28 镇江同舟螺旋桨有限公司 A kind of motion controller of compatible multiple fieldbus agreement
WO2018158956A1 (en) * 2017-03-03 2018-09-07 三菱電機株式会社 Data processing device, data processing method, setting management device, and data processing system
CN107807880B (en) * 2017-09-28 2021-03-19 中国科学院长春光学精密机械与物理研究所 Debugging method of multi-degree-of-freedom motion control system

Family Cites Families (242)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4531182A (en) * 1969-11-24 1985-07-23 Hyatt Gilbert P Machine control system operating from remote commands
US4829419A (en) * 1970-12-28 1989-05-09 Hyatt Gilbert P Microcomputer control of machines
US3673455A (en) * 1970-11-18 1972-06-27 Gen Electric High speed sensor for initiating circuit breaker tripping
US4078195A (en) * 1976-01-13 1978-03-07 Macotech Corporation Adaptive control system for numerically controlled machine tools
US4092532A (en) * 1976-11-10 1978-05-30 The United Sates Of America As Represented By The Secretary Of The Navy Binary apparatus for motion control
US4199814A (en) * 1977-10-12 1980-04-22 Digitcom, Inc. Computer numerical control machine tool
US4159417A (en) 1977-10-28 1979-06-26 Rubincam David P Electronic book
US4422150A (en) * 1980-05-23 1983-12-20 The Boeing Company Machine tool controller and part inspection monitor
US4418381A (en) 1981-01-23 1983-11-29 Bristol Babcock Inc. Single loop control system
US4444061A (en) * 1982-03-26 1984-04-24 Camtech Inc. Force and torque sensor for machine tools
JPS58175003A (en) * 1982-04-07 1983-10-14 Fanuc Ltd Command system of numerical control
US4800521A (en) * 1982-09-21 1989-01-24 Xerox Corporation Task control manager
US4688195A (en) * 1983-01-28 1987-08-18 Texas Instruments Incorporated Natural-language interface generating system
US4494060A (en) * 1983-03-02 1985-01-15 Anorad Corporation Axis controller for robotic actuator
US4709339A (en) * 1983-04-13 1987-11-24 Fernandes Roosevelt A Electrical power line parameter measurement apparatus and systems, including compact, line-mounted modules
JPS59228473A (en) 1983-06-09 1984-12-21 Canon Inc Controller for universal head system
US4799171A (en) * 1983-06-20 1989-01-17 Kenner Parker Toys Inc. Talk back doll
US4589074A (en) * 1983-08-31 1986-05-13 The Boeing Company Multiple channel power line monitor
US4607256A (en) * 1983-10-07 1986-08-19 Honeywell, Inc. Plant management system
US4563906A (en) * 1983-11-23 1986-01-14 Camtech, Inc. Load measurement apparatus including miniature instrumented hydrostatic cell
FR2556866B1 (en) * 1983-12-15 1987-08-21 Giravions Dorand METHOD AND DEVICE FOR DRIVING DRIVING MOBILE MACHINES.
NL8400186A (en) * 1984-01-20 1985-08-16 Philips Nv PROCESSOR SYSTEM CONTAINING A NUMBER OF STATIONS CONNECTED BY A COMMUNICATION NETWORK AND STATION FOR USE IN SUCH A PROCESSOR SYSTEM.
US4672555A (en) * 1984-10-18 1987-06-09 Massachusetts Institute Of Technology Digital ac monitor
US4713808A (en) 1985-11-27 1987-12-15 A T & E Corporation Watch pager system and communication protocol
JPH0782498B2 (en) * 1985-01-14 1995-09-06 株式会社日立製作所 Machine translation system
US4837719A (en) * 1985-02-19 1989-06-06 Kenneth B. McIntosh Medication clock
CA1244555A (en) * 1985-06-17 1988-11-08 Walter H. Schwane Process transparent multi storage mode data transfer and buffer control
US4809335A (en) 1985-10-24 1989-02-28 Rumsey Daniel S Speech unit for dolls and other toys
US4767334A (en) 1985-11-19 1988-08-30 Thorne Hugh C Educational and recreational toy vehicle
US4897835A (en) 1985-11-27 1990-01-30 At&E Corporation High capacity protocol with multistation capability
US4695792A (en) * 1985-12-16 1987-09-22 Ecole Polytechnique Method and system for measuring the amplitude and phase angle of harmonics in a periodic signal
US4782444A (en) * 1985-12-17 1988-11-01 International Business Machine Corporation Compilation using two-colored pebbling register allocation method such that spill code amount is invariant with basic block's textual ordering
JP2525358B2 (en) * 1986-01-25 1996-08-21 フアナツク株式会社 Robot controller
US4937759A (en) 1986-02-18 1990-06-26 Robotics Research Corporation Industrial robot with controller
US4843566A (en) * 1986-03-07 1989-06-27 Hewlett-Packard Company Robot motion control system
US4853877A (en) * 1986-04-21 1989-08-01 Hewlett-Packard Company Apparatus and method for efficient plotting
JPS6318403A (en) * 1986-07-10 1988-01-26 Fanuc Ltd Off-line control executing method
FR2602560B1 (en) * 1986-08-06 1990-11-02 Valeo CLUTCH UNIT, AND APPLICATIONS IN PARTICULAR A CLUTCH FRICTION, A CLUTCH AND A HYDRAULIC COUPLING MEMBER COMPRISING SUCH A UNIT, PARTICULARLY FOR A MOTOR VEHICLE
US5029214A (en) * 1986-08-11 1991-07-02 Hollander James F Electronic speech control apparatus and methods
US4908746A (en) * 1986-10-15 1990-03-13 United States Data Corporation Industrial control system
US4868474A (en) * 1986-11-20 1989-09-19 Westinghouse Electric Corp. Multiprocessor position/velocity servo control for multiaxis digital robot control system
US4829219A (en) * 1986-11-20 1989-05-09 Unimation Inc. Multiaxis robot having improved motion control through variable acceleration/deceleration profiling
EP0275826A1 (en) * 1986-12-16 1988-07-27 Ciba-Geigy Ag Control system for a sample preparation system
US4846693A (en) 1987-01-08 1989-07-11 Smith Engineering Video based instructional and entertainment system using animated figure
US4840602A (en) 1987-02-06 1989-06-20 Coleco Industries, Inc. Talking doll responsive to external signal
US4857030A (en) 1987-02-06 1989-08-15 Coleco Industries, Inc. Conversing dolls
CA1338909C (en) 1987-03-05 1997-02-11 Curtis M. Brubaker Radio control toy
US4716458A (en) * 1987-03-06 1987-12-29 Heitzman Edward F Driver-vehicle behavior display apparatus
EP0283295B1 (en) * 1987-03-20 1993-09-08 Canon Kabushiki Kaisha Data communication system
US4852047A (en) * 1987-04-14 1989-07-25 Universal Automation Inc. Continuous flow chart, improved data format and debugging system for programming and operation of machines
JPS63273105A (en) * 1987-04-30 1988-11-10 Fanuc Ltd Numerical controller
JPH0679290B2 (en) * 1987-05-31 1994-10-05 日本電気株式会社 Computer device
US4901218A (en) * 1987-08-12 1990-02-13 Renishaw Controls Limited Communications adaptor for automated factory system
US4855725A (en) 1987-11-24 1989-08-08 Fernandez Emilio A Microprocessor based simulated book
US5025385A (en) 1988-04-15 1991-06-18 Froyd Stanley G Multiple axis motion control system
US4923428A (en) * 1988-05-05 1990-05-08 Cal R & D, Inc. Interactive talking toy
JPH0239262A (en) * 1988-06-17 1990-02-08 Siemens Ag Method and apparatus for executing program within hetero multiple computer system
FR2633414B1 (en) * 1988-06-27 1993-07-09 Bull Sa COMPUTER SYSTEM WITH CENTRAL INTERCONNECTION
US4887966A (en) 1988-06-30 1989-12-19 Gellerman Floyd R Flight simulation control apparatus
US4962491A (en) * 1988-10-13 1990-10-09 Schaeffer Theodore S Medicament dispenser and medical information storage apparatus
BR8805485A (en) 1988-10-17 1990-06-05 Brasil Compressores Sa ELECTRONIC CONTROL CIRCUIT FOR CURRENT MOTOR CONTINUES WITHOUT BRUSHES
US5309351A (en) * 1988-10-27 1994-05-03 Texas Instruments Incorporated Communications, information, maintenance diagnostic and training system
US4983955A (en) * 1988-11-28 1991-01-08 Hendry Mechanical Works Electric power supply circuit monitoring systems
US5230049A (en) * 1988-11-29 1993-07-20 International Business Machines Corporation Program source code translator
US5014208A (en) * 1989-01-23 1991-05-07 Siemens Corporate Research, Inc. Workcell controller employing entity-server model for physical objects and logical abstractions
US5005135A (en) * 1989-03-22 1991-04-02 Cincinnati Milacron, Inc. Dynamic correction of servo following errors in a computer-numerically controlled system and fixed cycle utilizing same
US5119318A (en) * 1989-04-17 1992-06-02 Del Partners L.P. Expert control system for real time management of automated factory equipment
JP2982010B2 (en) * 1989-06-23 1999-11-22 三菱電機株式会社 Numerical control method and device
JP2784811B2 (en) 1989-08-25 1998-08-06 ソニー株式会社 Image creation device
US5247650A (en) * 1989-08-30 1993-09-21 Industrial Technology Institute System for combining originally software incompatible control, kinematic, and discrete event simulation systems into a single integrated simulation system
US5146401A (en) * 1989-09-05 1992-09-08 Honeywell Inc. Apparatus for providing a universal interface in a process control system
US5148944A (en) * 1989-09-29 1992-09-22 Health Tech Services Corporation Interactive medication delivery system for individual pills and caplets
US5175817A (en) * 1989-11-20 1992-12-29 Digital Equipment Corporation Data representation protocol for communications between different networks
JPH0727505B2 (en) * 1990-02-12 1995-03-29 インターナショナル・ビジネス・マシーンズ・コーポレイション Interface method and interface system
US5233538A (en) * 1990-04-02 1993-08-03 Square D Company Waveform capturing arrangement in a distributed power network
US5224054A (en) * 1990-04-02 1993-06-29 Square D Company Waveform capturing arrangement in distributed power network
GB9007661D0 (en) 1990-04-04 1990-05-30 Ace Coin Equip Amusement apparatus
US5168441A (en) * 1990-05-30 1992-12-01 Allen-Bradley Company, Inc. Methods for set up and programming of machine and process controllers
US5175856A (en) 1990-06-11 1992-12-29 Supercomputer Systems Limited Partnership Computer with integrated hierarchical representation (ihr) of program wherein ihr file is available for debugging and optimizing during target execution
US5390304A (en) * 1990-09-28 1995-02-14 Texas Instruments, Incorporated Method and apparatus for processing block instructions in a data processor
US5162986A (en) 1990-10-19 1992-11-10 Allen-Bradley Company, Inc. Remote downloading and uploading of motion control program information to and from a motion control I/O module in a programmable controller
GB2252426B (en) * 1990-11-28 1994-10-12 Toshiba Kk Fuzzy control system
EP0522132A1 (en) 1990-12-24 1993-01-13 Eastman Kodak Company Memoryless electronic camera with direct hard copy output
US5175684A (en) 1990-12-31 1992-12-29 Trans-Link International Corp. Automatic text translation and routing system
US5182547A (en) * 1991-01-16 1993-01-26 High Voltage Maintenance Neutral wire current monitoring for three-phase four-wire power distribution system
EP0495147A1 (en) * 1991-01-18 1992-07-22 Siemens Aktiengesellschaft Method for path correction in numerical controlled machines
US5120065A (en) 1991-02-08 1992-06-09 Hasbro, Incorporated Electronic talking board game
WO1992015068A1 (en) 1991-02-15 1992-09-03 Incontrol, Inc. Computer control system for generating geometric designs
IL100987A (en) 1991-02-27 1995-10-31 Digital Equipment Corp Method and apparatus for compiling code
US5659753A (en) * 1991-02-27 1997-08-19 Digital Equipment Corporation Interface for symbol table construction in a multilanguage optimizing compiler
IL100989A (en) 1991-02-27 1995-10-31 Digital Equipment Corp Analyzing inductive expressions in a multilanguage optimizing compiler
IL100990A (en) * 1991-02-27 1995-10-31 Digital Equipment Corp Multilanguage optimizing compiler using templates in multiple pass code generation
US5291416A (en) * 1991-03-08 1994-03-01 Software Algoritms Incorporated Event feedback for numerically controlled machine tool and network implementation thereof
JP2636534B2 (en) * 1991-03-22 1997-07-30 三菱電機株式会社 Communications system
FR2675282B1 (en) 1991-04-12 1995-01-20 Info Telecom METHOD AND DEVICE FOR MATERIALIZING A VIRTUAL INTERACTION BETWEEN AN OBJECT AND AN INFORMATION MEDIUM.
US5231693A (en) * 1991-05-09 1993-07-27 The United States Of America As Represented By The Administrator, National Aeronautics And Space Administration Telerobot control system
US5417210A (en) * 1992-05-27 1995-05-23 International Business Machines Corporation System and method for augmentation of endoscopic surgery
US5485545A (en) * 1991-06-20 1996-01-16 Mitsubishi Denki Kabushiki Kaisha Control method using neural networks and a voltage/reactive-power controller for a power system using the control method
DE69230298T2 (en) 1991-07-15 2000-07-20 Hitachi Ltd Teleconferencing device
US5625821A (en) * 1991-08-12 1997-04-29 International Business Machines Corporation Asynchronous or synchronous operation of event signaller by event management services in a computer system
CA2075122A1 (en) * 1991-09-23 1993-03-24 He Holdings, Inc. Multiple participant moving vehicle shooting gallery
US5224006A (en) * 1991-09-26 1993-06-29 Westinghouse Electric Corp. Electronic circuit breaker with protection against sputtering arc faults and ground faults
AU2792392A (en) 1991-10-18 1993-05-21 Forte Communications, Inc. Wireless transmitting and receiving device with selectable channel settings
US5889670A (en) * 1991-10-24 1999-03-30 Immersion Corporation Method and apparatus for tactilely responsive user interface
US5414635A (en) * 1991-11-08 1995-05-09 Matsushita Electric Industrial Co., Ltd. Oscilloscope with dynamic triggering determination
EP0546682A3 (en) * 1991-12-12 1993-12-08 Ibm Parent class shadowing
US6400996B1 (en) * 1999-02-01 2002-06-04 Steven M. Hoffberg Adaptive pattern recognition based control system and method
US5329381A (en) * 1992-02-20 1994-07-12 Payne John H Automatic engraving method and apparatus
US5287199A (en) 1992-02-27 1994-02-15 At&T Bell Laboratories Facsimile message processing and routing system
US5400345A (en) * 1992-03-06 1995-03-21 Pitney Bowes Inc. Communications system to boundary-scan logic interface
US5490086A (en) * 1992-03-06 1996-02-06 Siemens Energy & Automation, Inc. Plug-in ground fault monitor for a circuit breaker
US5917840A (en) * 1992-03-13 1999-06-29 Foxboro Company Protection against communications crosstalk in a factory process control system
CA2087503A1 (en) 1992-04-13 1993-10-14 Lester Wayne Dunaway Multimodal remote control device having electrically alterable keypad designations
US5315642A (en) * 1992-04-16 1994-05-24 Canamex Corporation Concurrent creation and transmission of text messages to multiple paging services
US5366376A (en) * 1992-05-22 1994-11-22 Atari Games Corporation Driver training system and method with performance data feedback
US5368484A (en) 1992-05-22 1994-11-29 Atari Games Corp. Vehicle simulator with realistic operating feedback
JP2862441B2 (en) * 1992-07-09 1999-03-03 キヤノン株式会社 Output control device and method
DE59308529D1 (en) * 1992-07-17 1998-06-18 Rxs Schrumpftech Garnituren Arrangement for storing splice cassettes for optical fibers within a cable sleeve
US5402518A (en) 1992-07-22 1995-03-28 Pcvoice, Inc. Sound storage and sound retrieval system having peripheral with hand operable switches
JP2597802B2 (en) 1992-08-04 1997-04-09 インターナショナル・ビジネス・マシーンズ・コーポレイション Method for controlling an image capture device, image capture device and user interface
JPH06133367A (en) 1992-09-23 1994-05-13 Walt Disney Co:The Method and apparatus for remote synchronization of audio, illumination, animation and special effect
AU5363494A (en) 1992-10-19 1994-05-09 Jeffrey Scott Jani Video and radio controlled moving and talking device
US5541838A (en) * 1992-10-26 1996-07-30 Sharp Kabushiki Kaisha Translation machine having capability of registering idioms
WO1994010645A1 (en) 1992-10-28 1994-05-11 Intellution, Inc. A dynamic graphical system configuration utility
US5343404A (en) * 1992-11-12 1994-08-30 Maritec Corp. Precision digital multimeter and waveform synthesizer for multi-signals with distorted waveforms embedded in noise
US5392382A (en) * 1992-12-01 1995-02-21 Schoppers; Marcel J. Automated plan synthesizer and plan execution method
US5389865A (en) 1992-12-02 1995-02-14 Cybernet Systems Corporation Method and system for providing a tactile virtual reality and manipulator defining an interface device therefor
EP0606790B1 (en) 1992-12-08 2000-03-22 Steven Lebensfeld Toy having subject specific,word/phrase selectable, message delivering doll or action figure
US5604843A (en) * 1992-12-23 1997-02-18 Microsoft Corporation Method and system for interfacing with a computer output device
US5390330A (en) * 1993-02-11 1995-02-14 Talati; Kirit K. Control system and method for direct execution of software application information models without code generation
JP2799126B2 (en) * 1993-03-26 1998-09-17 株式会社ナムコ Video game device and game input device
US5666161A (en) 1993-04-26 1997-09-09 Hitachi, Ltd. Method and apparatus for creating less amount of compressd image data from compressed still image data and system for transmitting compressed image data through transmission line
US5429140A (en) * 1993-06-04 1995-07-04 Greenleaf Medical Systems, Inc. Integrated virtual reality rehabilitation system
JPH06344279A (en) * 1993-06-07 1994-12-20 Hitachi Ltd Remote operation device and method
US5405152A (en) * 1993-06-08 1995-04-11 The Walt Disney Company Method and apparatus for an interactive video game with physical feedback
US6057828A (en) * 1993-07-16 2000-05-02 Immersion Corporation Method and apparatus for providing force sensations in virtual environments in accordance with host software
US5734373A (en) * 1993-07-16 1998-03-31 Immersion Human Interface Corporation Method and apparatus for controlling force feedback interface systems utilizing a host computer
US5701140A (en) * 1993-07-16 1997-12-23 Immersion Human Interface Corp. Method and apparatus for providing a cursor control interface with force feedback
US5739811A (en) * 1993-07-16 1998-04-14 Immersion Human Interface Corporation Method and apparatus for controlling human-computer interface systems providing force feedback
US5731804A (en) * 1995-01-18 1998-03-24 Immersion Human Interface Corp. Method and apparatus for providing high bandwidth, low noise mechanical I/O for computer systems
US5392207A (en) * 1993-08-20 1995-02-21 Allen-Bradley Company, Inc. Programmable motion controller with graphical programming aid
US5566278A (en) 1993-08-24 1996-10-15 Taligent, Inc. Object oriented printing system
US5377258A (en) 1993-08-30 1994-12-27 National Medical Research Council Method and apparatus for an automated and interactive behavioral guidance system
US5453933A (en) * 1993-09-08 1995-09-26 Hurco Companies, Inc. CNC control system
US5413355A (en) * 1993-12-17 1995-05-09 Gonzalez; Carlos Electronic educational game with responsive animation
US5566346A (en) 1993-12-21 1996-10-15 Taligent, Inc. System for constructing hardware device interface software systems independent of operating systems including capability of installing and removing interrupt handlers
US5511147A (en) * 1994-01-12 1996-04-23 Uti Corporation Graphical interface for robot
US5612869A (en) * 1994-01-21 1997-03-18 Innovative Enterprises International Corporation Electronic health care compliance assistance
US5438529A (en) * 1994-01-26 1995-08-01 Immersion Human Interface Corporation Percussion input device for personal computer systems
WO1995022135A2 (en) 1994-02-04 1995-08-17 Datacard Corporation Card creation system and method
US5485620A (en) * 1994-02-25 1996-01-16 Automation System And Products, Inc. Integrated control system for industrial automation applications
JPH07262025A (en) * 1994-03-18 1995-10-13 Fujitsu Ltd Execution control system
GB2289186A (en) 1994-04-05 1995-11-08 Ibm Collaborative working method and system
US5754855A (en) * 1994-04-21 1998-05-19 International Business Machines Corporation System and method for managing control flow of computer programs executing in a computer system
US5465215A (en) * 1994-07-07 1995-11-07 Cincinnati Milacron Inc. Numerical control method and apparatus
US5623582A (en) * 1994-07-14 1997-04-22 Immersion Human Interface Corporation Computer interface or control input device for laparoscopic surgical instrument and other elongated mechanical objects
US5733131A (en) 1994-07-29 1998-03-31 Seiko Communications Holding N.V. Education and entertainment device with dynamic configuration and operation
US5692195A (en) 1994-08-31 1997-11-25 International Business Machines Corporation Parent class shadowing
US5587917A (en) * 1994-10-17 1996-12-24 Eaton Corporation Data collection and processing for digital AC power system monitor/analyzer
JP3325134B2 (en) 1994-10-21 2002-09-17 パイオニア株式会社 Video game system
US5487016A (en) * 1994-11-04 1996-01-23 Eaton Corporation Apparatus for generating a signal representative of total harmonic distortion in waveforms of an A/C electrical system
US5724074A (en) * 1995-02-06 1998-03-03 Microsoft Corporation Method and system for graphically programming mobile toys
US5553609A (en) * 1995-02-09 1996-09-10 Visiting Nurse Service, Inc. Intelligent remote visual monitoring system for home health care service
JP3254994B2 (en) * 1995-03-01 2002-02-12 セイコーエプソン株式会社 Speech recognition dialogue apparatus and speech recognition dialogue processing method
US5680619A (en) * 1995-04-03 1997-10-21 Mfactory, Inc. Hierarchical encapsulation of instantiated objects in a multimedia authoring system
US5748468A (en) * 1995-05-04 1998-05-05 Microsoft Corporation Prioritized co-processor resource manager and method
US5802365A (en) 1995-05-05 1998-09-01 Apple Computer, Inc. Dynamic device matching using driver candidate lists
GB2300991B (en) 1995-05-15 1997-11-05 Andrew Macgregor Ritchie Serving signals to browsing clients
JP3091135B2 (en) * 1995-05-26 2000-09-25 株式会社バンダイ Game equipment
US7139843B1 (en) * 1995-05-30 2006-11-21 Roy-G-Biv Corporation System and methods for generating and communicating motion data through a distributed network
US7035697B1 (en) * 1995-05-30 2006-04-25 Roy-G-Biv Corporation Access control systems and methods for motion control
US6941543B1 (en) * 1995-05-30 2005-09-06 Roy-G-Biv Corporation Motion control system and method
US6859671B1 (en) * 1995-05-30 2005-02-22 Roy-G-Biv Corporation Application programs for motion control devices including access limitations
US20060206219A1 (en) * 1995-05-30 2006-09-14 Brown David W Motion control systems and methods
US6209037B1 (en) * 1995-05-30 2001-03-27 Roy-G-Biv Corporation Motion control systems using communication map to facilitating communication with motion control hardware
US7024666B1 (en) * 2002-01-28 2006-04-04 Roy-G-Biv Corporation Motion control systems and methods
US6571141B1 (en) * 1995-05-30 2003-05-27 Roy-G-Biv Corporation Application programs for motion control devices including access limitations
US6542925B2 (en) * 1995-05-30 2003-04-01 Roy-G-Biv Corporation Generation and distribution of motion commands over a distributed network
US5691897A (en) 1995-05-30 1997-11-25 Roy-G-Biv Corporation Motion control systems
US7137107B1 (en) * 2003-04-29 2006-11-14 Roy-G-Biv Corporation Motion control systems and methods
CA2586401C (en) 1995-05-30 2010-07-13 Roy-G-Biv Corporation Motion control systems
US5691898A (en) 1995-09-27 1997-11-25 Immersion Human Interface Corp. Safe and low cost computer peripherals with force feedback for consumer applications
US5761669A (en) * 1995-06-06 1998-06-02 Microsoft Corporation Controlling access to objects on multiple operating systems
JP3968133B2 (en) * 1995-06-22 2007-08-29 セイコーエプソン株式会社 Speech recognition dialogue processing method and speech recognition dialogue apparatus
US5752976A (en) * 1995-06-23 1998-05-19 Medtronic, Inc. World wide patient location and data telemetry system for implantable medical devices
US5801946A (en) 1995-10-19 1998-09-01 Kawasaki Motors Mfg. Co. Assembly prompting system
US5800268A (en) 1995-10-20 1998-09-01 Molnick; Melvin Method of participating in a live casino game from a remote location
US5898588A (en) * 1995-10-27 1999-04-27 Dainippon Screen Mfg. Co. Method and apparatus for controlling substrate processing apparatus
US5636994A (en) 1995-11-09 1997-06-10 Tong; Vincent M. K. Interactive computer controlled doll
US6100874A (en) * 1995-11-17 2000-08-08 Immersion Corporation Force feedback mouse interface
US5825308A (en) * 1996-11-26 1998-10-20 Immersion Human Interface Corporation Force feedback interface having isotonic and isometric functionality
US5752880A (en) 1995-11-20 1998-05-19 Creator Ltd. Interactive doll
US6061004A (en) * 1995-11-26 2000-05-09 Immersion Corporation Providing force feedback using an interface device including an indexing function
US6169540B1 (en) * 1995-12-01 2001-01-02 Immersion Corporation Method and apparatus for designing force sensations in force feedback applications
US6028593A (en) * 1995-12-01 2000-02-22 Immersion Corporation Method and apparatus for providing simulated physical interactions within computer generated environments
US5956484A (en) * 1995-12-13 1999-09-21 Immersion Corporation Method and apparatus for providing force feedback over a computer network
US6219032B1 (en) * 1995-12-01 2001-04-17 Immersion Corporation Method for providing force feedback to a user of an interface device based on interactions of a controlled cursor with graphical elements in a graphical user interface
US6078308A (en) * 1995-12-13 2000-06-20 Immersion Corporation Graphical click surfaces for force feedback applications to provide user selection using cursor interaction with a trigger position within a boundary of a graphical object
US6161126A (en) * 1995-12-13 2000-12-12 Immersion Corporation Implementing force feedback over the World Wide Web and other computer networks
US6305011B1 (en) 1996-01-16 2001-10-16 Sun Microsystems, Inc. Tip technology and its application to sparcompiler pascal
US5646912A (en) * 1996-01-25 1997-07-08 Cousin; Damon S. Medication compliance, co-ordination and dispensing system
JPH09209800A (en) * 1996-02-05 1997-08-12 Honda Motor Co Ltd Intake air quantity control device for internal combustion engine
US5805785A (en) 1996-02-27 1998-09-08 International Business Machines Corporation Method for monitoring and recovery of subsystems in a distributed/clustered system
US5746602A (en) 1996-02-27 1998-05-05 Kikinis; Dan PC peripheral interactive doll
US5737523A (en) 1996-03-04 1998-04-07 Sun Microsystems, Inc. Methods and apparatus for providing dynamic network file system client authentication
US5764155A (en) 1996-04-03 1998-06-09 General Electric Company Dynamic data exchange server
US5846132A (en) 1996-04-10 1998-12-08 William W. Junkin Trust Interactive system allowing simulated or real time participation in a league
US5666264A (en) 1996-05-13 1997-09-09 Nematron Corporation Industrial computer workstation
US6374255B1 (en) * 1996-05-21 2002-04-16 Immersion Corporation Haptic authoring
US5805442A (en) 1996-05-30 1998-09-08 Control Technology Corporation Distributed interface architecture for programmable industrial control systems
JP3832517B2 (en) * 1996-07-05 2006-10-11 セイコーエプソン株式会社 Robot controller and control method thereof
US6038603A (en) * 1997-03-25 2000-03-14 Oracle Corporation Processing customized uniform resource locators
US6020876A (en) * 1997-04-14 2000-02-01 Immersion Corporation Force feedback interface with selective disturbance filter
US6233545B1 (en) * 1997-05-01 2001-05-15 William E. Datig Universal machine translator of arbitrary languages utilizing epistemic moments
US6012961A (en) * 1997-05-14 2000-01-11 Design Lab, Llc Electronic toy including a reprogrammable data storage device
CA2205797C (en) * 1997-05-22 2001-04-24 Andrew Wilfred Macleod A system for local context spilling for graph colouring register allocators
US6425118B1 (en) * 1997-07-18 2002-07-23 Compaq Computer Corporation System for automatically generating tests to ensure binary compatibility between software components produced by a source-to-source computer language translator
JP3352611B2 (en) * 1997-07-24 2002-12-03 株式会社日立製作所 Switching router
CA2211515C (en) * 1997-07-25 2001-12-11 Kevin Alexander Stoodley System and method of local data alignment for stack memory
US6252579B1 (en) * 1997-08-23 2001-06-26 Immersion Corporation Interface device and method for providing enhanced cursor control with force feedback
US20010032278A1 (en) * 1997-10-07 2001-10-18 Brown Stephen J. Remote generation and distribution of command programs for programmable devices
US6243078B1 (en) * 1998-06-23 2001-06-05 Immersion Corporation Pointing device with forced feedback button
US6252583B1 (en) * 1997-11-14 2001-06-26 Immersion Corporation Memory and force output management for a force feedback system
US6083104A (en) * 1998-01-16 2000-07-04 Silverlit Toys (U.S.A.), Inc. Programmable toy with an independent game cartridge
US6173316B1 (en) * 1998-04-08 2001-01-09 Geoworks Corporation Wireless communication device with markup language based man-machine interface
US6678713B1 (en) * 1998-04-29 2004-01-13 Xerox Corporation Machine control using a schedulerlock construct
US6519594B1 (en) * 1998-11-14 2003-02-11 Sony Electronics, Inc. Computer-implemented sharing of java classes for increased memory efficiency and communication method
US6546436B1 (en) * 1999-03-30 2003-04-08 Moshe Fainmesser System and interface for controlling programmable toys
US6791531B1 (en) * 1999-06-07 2004-09-14 Dot On, Inc. Device and method for cursor motion control calibration and object selection
US6401005B1 (en) * 1999-09-27 2002-06-04 Rockwell Automation Technologies, Inc. Programmable synchronous and asynchronous block execution for a computer numerical control
CA2389183C (en) 1999-10-27 2008-05-20 Roy-G-Biv Corporation Systems and methods for generating and communicating motion data through a distributed network
US6885898B1 (en) * 2001-05-18 2005-04-26 Roy-G-Biv Corporation Event driven motion systems
US6879862B2 (en) * 2000-02-28 2005-04-12 Roy-G-Biv Corporation Selection and control of motion data
US6442451B1 (en) * 2000-12-28 2002-08-27 Robotic Workspace Technologies, Inc. Versatile robot control system
AU2002251731A1 (en) * 2001-01-04 2002-07-16 Roy-G-Biv Corporation Systems and methods for transmitting motion control data
WO2002071241A1 (en) * 2001-02-09 2002-09-12 Roy-G-Biv Corporation Event management systems and methods for the distribution of motion control commands
US7904194B2 (en) * 2001-02-09 2011-03-08 Roy-G-Biv Corporation Event management systems and methods for motion control systems
WO2003019397A1 (en) * 2001-08-31 2003-03-06 Roy-G-Biv Corporation Motion services protocol accessible through uniform resource locator (url)
US20070022194A1 (en) * 2003-09-25 2007-01-25 Brown David W Database event driven motion systems
US20060064503A1 (en) 2003-09-25 2006-03-23 Brown David W Data routing systems and methods
US8027349B2 (en) 2003-09-25 2011-09-27 Roy-G-Biv Corporation Database event driven motion systems
WO2005048086A2 (en) 2003-11-17 2005-05-26 Roy-G-Biv Corporation Command processing systems and methods

Also Published As

Publication number Publication date
EP1560093B1 (en) 2008-08-06
EP2081094A2 (en) 2009-07-22
ATE302437T1 (en) 2005-09-15
DE69635094D1 (en) 2005-09-22
EP1260891A1 (en) 2002-11-27
HK1009531A1 (en) 1999-06-04
ATE403896T1 (en) 2008-08-15
US6516236B1 (en) 2003-02-04
EP1560093A1 (en) 2005-08-03
WO1996038769A1 (en) 1996-12-05
US5691897A (en) 1997-11-25
HK1080157A1 (en) 2006-04-21
DE69624237D1 (en) 2002-11-14
JP2007102796A (en) 2007-04-19
EP2302475A2 (en) 2011-03-30
US20080275577A1 (en) 2008-11-06
EP2302475A3 (en) 2013-12-04
EP0829039A4 (en) 1998-06-17
EP0829039A1 (en) 1998-03-18
US20090271007A1 (en) 2009-10-29
EP1260891B1 (en) 2005-08-17
HK1051581A1 (en) 2003-08-08
EP2081094A3 (en) 2011-04-13
US5867385A (en) 1999-02-02
AU6027696A (en) 1996-12-18
CA2222235C (en) 2007-08-07
DE69635094T2 (en) 2006-04-20
JPH11506234A (en) 1999-06-02
DE69624237T2 (en) 2003-06-12
JP2008159046A (en) 2008-07-10
DE69637633D1 (en) 2008-09-18
US8073557B2 (en) 2011-12-06
EP0829039B1 (en) 2002-10-09
US20120179275A1 (en) 2012-07-12
US20080275576A1 (en) 2008-11-06
CA2222235A1 (en) 1996-12-05
US20090157199A1 (en) 2009-06-18
ATE225952T1 (en) 2002-10-15
JP2004078904A (en) 2004-03-11

Similar Documents

Publication Publication Date Title
CA2222235C (en) Motion control systems
US6513058B2 (en) Distribution of motion control commands over a network
US6941543B1 (en) Motion control system and method
US8271105B2 (en) Motion control systems
US7024666B1 (en) Motion control systems and methods
CA2169916C (en) Cnc control system
Pritschow et al. Open controller architecture–past, present and future
US5801942A (en) Process control system user interface including selection of multiple control languages
US5909368A (en) Process control system using a process control strategy distributed among multiple control elements
US5862052A (en) Process control system using a control strategy implemented in a layered hierarchy of control modules
CA2586401C (en) Motion control systems
Yang et al. An open CNC controller based on LabVIEW software
Carrott et al. The UMC software environment for machine control system integration, configuration, and programming
Specification et al. FDT Field Device Tool
Michaloski et al. The team api open architecture methodology
Suzuki et al. Recent trends and issues of device integration standardization

Legal Events

Date Code Title Description
EEER Examination request
FZDE Discontinued

Effective date: 20130204