(57)【要約】【課題】システムを実施するのに使用する実際のモーションコントロールハードウェアとは独立したアプリケーションが開発されるモーションコントロールのためのシステムが提供される。【解決手段】このシステムは、コンポーネントファンクションを含むアプリケーションプログラムインターフェイスと、ドライバファンクションを含むサービスプロバイダーインターフェイスとを使用するソフトウェアシステムを備えている。システムプログラマーは、コンポーネントファンクションをコールするアプリケーションを書き込む。コンポーネントファンクションに関連するコードは、これらのファンクションをドライバファンクションに関連付ける。ハードウェアデザイナーは、所与のモーションコントロールハードウェア製品においてドライバファンクションを実施するドライバコードを書き込む。【選択図】図２
2008159046.tif 000002
【特許請求の範囲】
【請求項１】
モーションコントローラと、
複数の基礎的モーションコントロールデータ属性からなる一組のモーションコントロールデータ属性と、
ここで、基礎的モーションコントロールデータ属性少なくとも一つの他のモーションコントロールデータ属性を用いてエミュレートすることはできず、そして、前記モーションコントローラは少なくとも一つの基礎的モーションコントロールデータ属性を記憶することができ、
モーションコントローラを用いてコントロールされることが可能なモーションコントロールデバイスと、
診断情報を含んだデバッグ情報と、
前記デバッグ情報が送られるデバッグターゲットと、
一組のソフトウェアドライバと、
ここで、ソフトウェアドライバはその少なくとも一つが前記デバッグ情報を前記デバッグターゲットへ送るよう設定可能とされており、そして、ソフトウェアドライバの少なくとも一つは、少なくとも一つのモーションコントロールデバイスから少なくとも一つの基礎的モーションコントロールデータ属性にアクセスすることができる少なくとも一つのドライバ機能をエクスポーズし、
前記一組のソフトウェアドライバから選択される選択ソフトウェアドライバと、
少なくとも一つの基礎的モーションコントロールデータ属性にアクセスするために前記選択ソフトウェアドライバから少なくとも一つのドライバ機能をコールすることができるソフトウェアアプリケーションと、
備えることを特徴とする、モーションコントロールソフトウェアをデバッグするためのハードウェアデバッグシステム。
【請求項２】
前記少なくとも一つの基礎的モーションコントロールデータ属性は、モーションコントロールデバイスから読み出され、デバッグターゲット送られるものである、請求項１に記載のシステム。
【請求項３】
前記少なくとも一つの基礎的モーションコントロールデータ属性は、モーションコントロールデバイスに書き込まれ、デバッグターゲット送られるものである、請求項１に記載のシステム。
【請求項４】
前記少なくとも一つの基礎的モーションコントロールデータ属性は、
モーションコントロールデバイスに書き込まれ、
モーションコントロールデバイスにオブジェクトを移動させることができ、そして
デバッグターゲット送られるものである、
請求項１に記載のシステム。
【請求項５】
モーションコントロールデバイスに書き込まれた少なくとも一つの基礎的モーションコントロールデータ属性は、
モーションコントロールデバイスに移動させることができ、そして
デバッグターゲット送られるものである、
請求項１に記載のシステム。
【請求項６】
選択ソフトウェアドライバが、少なくとも一つのモーションコントロールデバイスから受け取った少なくとも一つの基礎的モーションコントロールデータ属性にアクセスするのに使われることが可能な少なくとも一つのドライバ機能を含むドライバインターフェースをエクスポーズする、請求項１に記載のシステム。
【請求項７】
前記ソフトウェアアプリケーションは、ドライバインターフェースに問い合わせし、そしてこれを使うことが可能である、請求項６に記載のシステム。
【請求項８】
前記デバッグターゲットはファイルである、請求項１に記載のシステム。
【請求項９】
前記デバッグターゲットは、少なくともいくつかのデバッグ情報を表示するユーザインターフェースである、請求項１に記載のシステム。
【請求項１０】
少なくともいくつかのデバッグ情報をファイルに書き込むことが可能なデバッグストリームをさらに含んでいる、請求項１に記載のシステム。
【請求項１１】
少なくともいくつかのデバッグ情報をユーザインターフェースに送ることが可能なデバッグストリームをさらに含んでいる、請求項１に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、モーションコントロールシステムに係り、より詳細には、ハードウェア独立のモーションコントロールソフトウェアの形成を容易にするインターフェイスソフトウェアに係る。
【背景技術】
【０００２】
モーションコントロールデバイスの目的は、物体を所望の仕方で運動することである。モーションコントロールデバイスの基本的コンポーネントは、コントローラと、機械的システムである。この機械的システムは、コントローラにより発生された信号を物体の運動へと変換する。
【０００３】
機械的システムは、一般に、ドライブ及び電気モータを含むが、液圧システムや振動システムのような多数の他のシステムを使用し、コントロール信号に基づき物体を運動させることができる。更に、モーションコントロールデバイスは、物体の運動の多軸制御を行えるように、複数のドライブ及びモータを含むこともできる。
【０００４】
本発明は、少なくとも１つのドライブ及び電気モータを備え、その回転シャフトが運動されるべき物体にある形態で接続されるような機械的システムにおいて特に重要であり、この用途について以下に詳細に述べる。しかし、本発明の原理は、一般に、コントロール信号に基づいて運動を発生するいかなる機械的システムにも適用できる。従って、本発明の範囲は、以下の詳細な説明ではなく、請求の範囲に基づいて決定すべきである。
【０００５】
コントローラ、ドライブ及び電気モータより成る機械的システムにおいては、運動されるべき物体にモータが物理的に接続され、モータシャフトの回転が物体の運動へと変換される。ドライブは、制御された仕方でモータシャフトを回転するための電力をモータに与えるための電子的な電力増幅器である。コントロールコマンドに基づき、コントローラは、物体が所望の仕方で運動されるようにドライブを予想可能な仕方で制御する。
【０００６】
これら基本的なコンポーネントは、通常、特定の作業を遂行するために大型のシステムに配置される。例えば、あるコントローラは、多軸システムでは多数のドライブ及びモータに関連して動作し、被加工片に対し所定の経路に沿ってツールを移動させる。
【０００７】
更に、上記の基本的コンポーネントは、しばしば、ホストコンピュータ又はプログラム可能なロジックコントローラ（ＰＬＣ）に関連して使用される。ホストコンピュータ又はＰＬＣは、高レベルのプログラム言語を使用して、コントローラへ送られるコントロールコマンドを発生することができる。従って、ホストコンピュータで実行されるソフトウェアは、コントローラをプログラミングするタスクを簡単化するように設計される。
【０００８】
モーションコントロールデバイスを製造する会社は、慣習的に、その会社が製造するハードウェアに専用のソフトウェアを製造するというハードウェア指向の会社である。これらのソフトウェア製品は、低レベルプログラムと称される。この低レベルプログラムは、通常、所与のモーションコントロールデバイスに特有なモーションコントロールコマンド言語と直接作用する。このような低レベルプログラムは、ハードウェアに対して実質的に完全な制御をプログラマーに与えるが、これらプログラムは、ハードウェアに大きく依存している。
【０００９】
低レベルプログラムとは対照的に、ファクトリオートメーションアプリケーションとも称される高レベルソフトウェアプログラムは、モーションコントロールデバイスを含む多数の入力／出力（Ｉ／Ｏ）デバイスを、ファクトリフロア環境を自動化するのに使用される複雑なシステムへと合成するアプリケーションプログラムをファクトリシステムデザイナーが開発できるようにする。これらのファクトリオートメーションアプリケーションは、Ｉ／Ｏデバイスが高レベルプログラムによりサポートされる限り、いかなる数のＩ／Ｏデバイスを所与のシステムに使用することもできる。他のソフトウェア開発者により開発されるカスタムアプリケーションは、ファクトリオートメーションプログラムによって与えられる簡単なモーションコントロール機能の利点を取り入れるように開発することができない。
【００１０】
更に、これらのプログラムでは、プログラマーがシステムの各モーションコントロールデバイスに対して高度に制御を行うことができない。ファクトリオートメーションアプリケーションで開発された各プログラムは、そのアプリケーションのコンテクスト内で実行されねばならない。
【００１１】
以下の説明においては、本発明の出願日現在で一般に入手できる多数の文書を引用する。これら多数の文書について、本出願人は、厳密な出版日を知らない。
【００１２】
従って、これら文書の引用は、それらが公知技術であると自認するものと考えてはならず、本出願人は、必要に応じてこれら文書が公知技術であるかどうか設定するに必要な手続きを取るものとする。
【００１３】
上記したように、個々のモーションコントロールデバイスをプログラミングするか、又は多数のモーションコントロールデバイスを含むシステムの開発を助けるために、多数のソフトウェアプログラムが現存する。
【００１４】
以下は、現在商業的に入手できる高レベルソフトウェアプログラムを開示する文書のリストである。（ａ）Software Products For Industrial Automation，iconics 1993；（ｂ）The complete，computer-based automation tool(IGSS)，Seven Technologies A/S；（ｃ）OpenBatch Product Brief，PID，Inc.；（ｄ）FIX Product Brochure，Intellution（1994）；（ｅ）Paragon TNT Product Brochure，Intec Controls Corp.；（ｆ）WEB 3.0 Product Brochure，Trihedral Engineering Ltd．（1994）；及び（ｇ）AIMAX-WIN Product Brochure，TA Engineering Co.，Inc．。次の文書はシュミレーションソフトウェアを開示する。（ａ）ExperTune PID Tuning Software，Gerry Engineering Software；及び（ｂ）XANALOG Model NL-SIM Product Brochure，XANALOG。
【００１５】
以下のリストは、低レベルプログラムに関連した文書を示す。（ａ）Compumotor Digiplan 1993-94 catalog，page 10-11；（ｂ）Aerotech Motion Control Product Guide，page 233-34；（ｃ）PMAC Product Catalog，page 43；（ｄ）PC/DSP-Series Motion Controller C Programming Guide，page 1-3；（ｅ）Oregon Micro System Product Guide，page 17；（ｆ）Precision Microcontrol Product Guide。
【００１６】
又、本出願人は、ウインドウズプログラミング環境に使用するためにマイクロソフトにより定義されたＷＯＳＡと称するソフトウェアモデルも知っている。ＷＯＳＡモデルは、ウインドウズ９５内の本の第３４８−３５１ページに説明されている。又、ＷＯＳＡは、「WOSA Backgrounder: Delivering Enterprise Services to the Windows-based Desltop」と題する論文にも説明されている。ＷＯＳＡモデルは、基礎的なハードウェア又はサービスとは独立したＡＰＩレイヤと、ハードウェア独立であるがサービス従属であるＳＰＩレイヤとを設けることにより、異なるサービスプロバイダーへのプログラミングの複雑さからアプリケーションプログラマーを隔離する。ＷＯＳＡモデルは、モーションコントロールデバイスとは何ら関係をもたない。
【００１７】
又、本出願人は、プリンタ等のハードウェアに対しドライバが設けられ、ワードプロセッサのようなアプリケーションプログラムにより、ユーザが所与のプリンタに関連したドライバを選択して、その所与のプリンタにおいてアプリケーションプログラムで印刷を行えるようにする一般的なプログラミング習慣も知っている。
【００１８】
この解決策は、既存の各ハードウェア構成に対するプログラミングの複雑さからアプリケーションプログラマーを隔離するが、この解決策は、基本的な増分的ステップでハードウェアを制御する能力をアプリケーションプログラマーに与えるものではない。プリンタの例においては、アプリケーションプログラマーは、設けられたプリンタドライバを用いてプリンタの各ステップモータを制御することができず、むしろ、プリンタドライバは、高レベルコマンドのグループを実施するに必要な所定のシーケンスでプリンタの多数のステップモータを制御する。
【００１９】
従って、プリンタ等に現在使用されているソフトウェアドライバモデルは、モーションコントロールデバイスのための一連のコントロールコマンドを開発するのに適用できない。
【発明の開示】
【課題を解決するための手段】
【００２０】
以上の説明から明らかなように、本発明の１つの主たる目的は、物体を運動するための改良された方法及び装置を提供することである。
【００２１】
本発明の更に別の特定の目的は、モーションコントロールデバイスを設計し、展開する方法及び装置であって、次の特徴の有利な組合せを示す方法及び装置を得ることである。
【００２２】
（ａ）ハードウェア独立であるが、基本的運動オペレーションをプログラムすることのできる高レベルモーションコントロールプログラムを形成できる；
（ｂ）多数のハードウェア構成に対するプログラミングの複雑さを高レベルプログラマーから隠す；
（ｃ）付加的なハードウェア構成をサポートするように容易に拡張できる；そして
（ｄ）工業標準の高レベルプログラム環境を透過的にサポートする。
【００２３】
本発明は、その１つの形態において、所望の物体経路を示す一連のコンポーネントファンクションより成る高レベルモーションコントロールアプリケーションプログラムを開発し、これらコンポーネントファンクションをドライバファンクションと相関し、制御されている特定のハードウェア構成に対してソフトウェアドライバを選択し、制御されているハードウェア構成に関連したソフトウェアドライバ及びドライバファンクションからコントロールコマンドを発生し、そして所望の物体経路に沿って物体を移動するようにコントロールデータに基づいてモーションコントロールデバイスを制御するという段階を備えた物体移動方法に係る。
【００２４】
本発明は、別の形態においては、所望の経路に沿って物体を移動するようにモーションコントロールデバイスを制御するための一連のコントロールコマンドを発生する方法に係る。一連のコンポーネントファンクションより成るアプリケーションプログラムは、所望の経路に沿って物体を移動するためにモーションコントロールデバイスにより実行されねばならない一連のモーションステップを定義する。コンポーネントファンクションは、該コンポーネントファンクションをドライバファンクションに関連付けるコードを含む。ドライバファンクションは、所与のモーションコントロールデバイスにおいてモーションステップを実行するためのドライバコードを含むソフトウェアドライバに関連されるか又はそれを含む。コントロールコマンドは、所与のモーションコントロールデバイスに関連したドライバコード及びアプリケーションプログラムに基づいて発生される。
【００２５】
ドライバファンクションとは個別のコンポーネントファンクションを使用することにより、特定のモーションコントロールデバイスに対してプログラミングする複雑さからプログラマーを隔離する。又、この構成は、関連するソフトウェアドライバを有するモーションコントロールデバイスに対し変更を伴わずに所与のアプリケーションプログラムを使用できるようにする。
【００２６】
ドライバファンクションは、コアドライバファンクションと拡張ドライバファンクションにグループ分けされる。全てのソフトウェアドライバは、コアドライバファンクションをサポートしなければならず、又、ソフトウェアドライバは、１つ以上の拡張ドライバファンクションをサポートしてもよいが、これは必要ではない。
【００２７】
ソフトウェアドライバが拡張ドライバファンクションをサポートしない場合には、拡張ドライバファンクションに関連した機能は、通常は、コアドライバファンクションのある組合せを用いてシュミレーションすることができる。この場合に、本発明の方法は、拡張ドライバファンクションのどれがソフトウェアドライバによりサポートされないかを決定し、そして可能であれば、コアドライバファンクションの組合せを置き換えるという段階を含む。ある場合には、拡張ドライバファンクションの機能は、コアドライバファンクションを用いてエミュレートすることができず、そしてこの機能は、プログラマーには単に使用できないものである。
【００２８】
拡張ドライバファンクションをエミュレートするためのコアドライバファンクションの使用は、何も存在しないという機能を与えるが、好ましい解決策は、各拡張ドライバファンクションをサポートするソフトウェアドライバを設けることである。拡張ドライバファンクションがサポートされ、エミュレートされないときには、実行されるタスクは、通常は、迅速且つ正確に遂行される。
【００２９】
更に、エミューレートされる拡張ドライバファンクションの使用を簡単化するために、本発明の方法は、更に、所与のハードウェア構成に対するソフトウェアドライバによりどの拡張ドライバファンクションがサポートされないか決定し、サポートされない拡張ドライバファンクション及びサポートされる拡張ドライバファンクションの両方のファンクションポインタテーブルを開発し、そして拡張ドライバファンクションがコールされるたびにテーブルを調べて、拡張ドライバファンクションをエミューレートしなければならないかどうか決定するという段階を備えている。このように、サポートされない拡張ドライバファンクションをエミュレートするのに使用されるコアドライバファンクションのシーケンスをコールするプロセスが最適化される。
【００３０】
コントロールコマンドが上記のように発生されるときには、それらを使用してモーションコントロールデバイスをリアルタイムで制御することもできるし、後で使用するようにそれらをファイルに記憶することもできる。好ましくは、本発明の方法は、ストリームコードを含む多数のストリームを与える段階を備えている。各ストリームは、コントロールコマンドの行先に関連し、そして所与のストリームのストリームコードは、その所与のストリームに関連した行先へコントロールコマンドをいかに転送すべきかを指示する。従って、ユーザには、コントロールコマンドの行先を指示する１つ以上のストリームを選択する機会が与えられる。
【００３１】
ハードウェア特有の複雑さからプログラマーを隔離する助けとして、本発明の方法は、特定のモーションコントロールデバイスに関連したドライバを選択し、及び／又はモーションコントロールシステムを定義するのに必要な単位を、所与のモーションコントロールデバイスに使用される単位の特定のシステムへと変換するといった付加的な管理的段階を含む。
【発明を実施するための最良の形態】
【００３２】
添付図面を参照すれば、図１には、本発明に原理に基づいて構成されそしてそれを実施するモーションコントロールシステムが番号１０で示されている。このシステム１０は、パーソナルコンピュータ部分１２を備え、該部分は、ハードウェアバス１４と、複数のモーションコントロールハードウェアコントローラ１６ａ、１６ｂ及び１６ｃと、運動されるべき１つ以上の物体（図示せず）と対話する機械的なシステム１８ａ、１８ｂ及び１８ｃとを有する。
【００３３】
システム１０のパーソナルコンピュータ部分１２は、ここに述べるようにプログラムすることのできるいかなるシステムでもよいが、好ましい実施形態では、マイクロソフトウインドウズ環境で実行することのできるシステムである。このようなシステムは、通常、図１に示すハードウェアバス１４に加えて、シリアルポートを備えている。
【００３４】
ハードウェアバス１４は、コンピュータ１２がハードウェアコントローラ１６と通信するのに必要な物理的な接続を与える。ハードウェアコントローラ１６は機械的システム１８を予想可能な仕方で動かすように制御する。機械的システム１８は、モータ等を備え、その出力シャフトは、運動されるべき物体に接続される。ハードウェアコントローラ１６ａ、１６ｂ及び１６ｃと、機械的システム１８ａ、１８ｂ及び１８ｃの組合せは、各々、モーションコントロールデバイス２０ａ、２０ｂ及び２０ｃを形成する。
【００３５】
ハードウェアバス１４、ハードウェアコントローラ１６、及び機械的システム１８は、この技術で良く知られたものであり、ここでは、本発明を完全に理解するのに必要な程度にのみ説明する。
【００３６】
パーソナルコンピュータ部分１２は、アプリケーションユーザ２４が、モーションコントロールデバイス２０を制御するソフトウェアアプリケーション２６を形成できるようにするソフトウェアシステム２２を備えている。
【００３７】
より詳細には、ユーザ２４により入力されたデータ及びアプリケーションプログラム２６の内容に基づいて、ソフトウェアシステム２２は、コントロールコマンドを発生し、これらのコマンドは、２８ａ、２８ｂ、２８ｃ及び２８ｄで示すような１つ以上のストリームによって送信される。ストリーム２８は、所与のモーションコントロールデバイスを所望の仕方で実行するように制御するのに必要なハードウェア特有のコマンド言語を組み込んだコントロールコマンドを送信する。以下に詳細に述べるように、ストリーム２８は、コントロールコマンドが適当なチャンネル（即ち、ＰＣバス、シリアルポート）を経て適当なモーションコントロールデバイス２８に到達できるようにする通信プロトコルを実施する。
【００３８】
システム２２を使用し、アプリケーションプログラム２８は、例示的なハードウェアコントローラ１６のいずれに特有のコードも含まないように開発される。
【００３９】
通常の場合には、アプリケーションプログラム２６、ひいては、プログラム２６を形成したユーザ２４は、モーションコントロールデバイス２０から完全に分離される。従って、ユーザ２４は、ハードウェア特有のコマンド言語、又はこれらデバイス２０の各々に関連した通信プロトコルに関して何も知る必要がなく、アプリケーションプログラム２６が形成されたときに１つ以上のハードウェアコントローラ１６のコマンド言語が定義されないことも考えられる。
【００４０】
ソフトウェアシステム２２は、アプリケーションプログラム２６をハードウェアコントローラ１６から完全に分離できるエレメントの組合せを含む。以下の説明において、ソフトウェアシステム２２のフレームワークは、物体を運動させる方法、及び／又はコントロールコマンド発生する方法に関して説明する。この一般的な説明の後に、システム２２の各コンポーネントを特定の動作環境において詳細に説明する。
【００４１】
Ｉ．物体を運動するようにモーションコントロールデバイスを制御するためのコントロールコマンドを発生する方法
最初に、ほとんどの状態において、このセクションに述べる方法は、通常は、少なくとも２人のそしておそらくは３人の別々のソフトウェアプログラマーである労働者、即ちソフトウェアシステムデザイナー、モーションコントロールデバイスの複雑な問題に精通しているハードウェアデザイナー、及びモーションコントロールシステムデザイナーを伴うが、必ずしもそうでなくてもよいことに注意されたい。上記のアプリケーションユーザ２４は、通常は、モーションコントロールシステムデザイナーであり、そしてソフトウェアシステムデザイナー及びハードウェアデザイナーの役割は、以下の説明から明らかとなろう。
【００４２】
ソフトウェアシステムデザイナーは、ソフトウェアシステム２２を開発する。
【００４３】
ソフトウェアシステムデザイナーは、最初に、モーションコントロールを実行するのに用いられる１組のモーションコントロールオペレーションを定義する。モーションコントロールオペレーションは、特定のモーションコントロールデバイスハードウェア構成体に特に関連したものではなく、全てのモーションコントロールデバイスハードウェア構成体が機能するために実行しなければならない抽象的なオペレーションである。
【００４４】
モーションコントロールオペレーションは、基礎的なオペレーション或いは非基礎的なオペレーションのいずれかである。基礎的なオペレーションとは、モーションコントロールにとって必要なオペレーションで、他のモーションコントロールオペレーションの組合せを用いてシュミレーションできないオペレーションである。基礎的なオペレーションは、例えば、ＧＥＴ ＰＯＳＩＴＩＯＮ（位置を得る）及びＭＯＶＥ ＲＥＬＡＴＩＶＥ（相対的移動）を含み、これらは、モーションコントロールにとって必要なもので、他のモーションコントロールオペレーションを用いてシュミレーションすることができない。非基礎的なオペレーションとは、基礎的なオペレーションの定義を満たさないモーションコントロールオペレーションである。非基礎的なオペレーションは、例えば、ＣＯＮＴＯＵＲＭＯＶＥ（輪郭移動）を含み、これは、基礎的なモーションコントロールオペレーションの組合せを用いてエミュレートできるものである。
【００４５】
上記のような１組のモーションコントロールオペレーションが与えられると、ソフトウェアシステムデザイナーは、次いで、多数のドライバファンクションより成るサービスプロバイダーインターフェイス（ＳＰＩ）を定義する。基礎的なオペレーションにはコアドライバファンクションが組み合わされ、一方、非基礎的なオペレーションには拡張ドライバファンクションが組み合わされる。モーションコントロールオペレーションと同様に、ドライバファンクションは、特定のハードウェア構成体に関連したものではなく、基本的に、ドライバファンクションは、一般的な意味でモーションコントロールオペレーションを実施するのに必要なパラメータを定義するが、特定の値等をこれらパラメータに付随させるものではない。
【００４６】
ソフトウェアシステムデザイナーは、次いで、１組のコンポーネントファンクションより成るアプリケーションプログラミングインターフェイス（ＡＰＩ）を定義する。これらのコンポーネントファンクションについては、ソフトウェアシステムデザイナーは、コンポーネントファンクションの少なくとも幾つかをドライバファンクションの少なくとも幾つかに関連させるコンポーネントコードを書き込む。コンポーネントファンクションとドライバファンクションとの関係は、１対１である必要はなく、例えば、あるコンポーネントファンクションは、管理的な目的で設けられ、それに対応するドライバファンクションをもたない。しかしながら、ほとんどのコンポーネントファンクションは、それに関連したドライバファンクションを有する。
【００４７】
従って、ソフトウェアプログラム２２により実施される全体的なソフトウェアモデルは、コンポーネントファンクションより成るＡＰＩと、ドライバファンクションより成るＳＰＩとを含み、ＡＰＩは、コンポーネントファンクションに関連したコンポーネントコードによりＳＰＩに関連される。
【００４８】
システム２２がコントロールコマンドを発生するためには、少なくとも更に２つのコンポーネントが必要となる。即ち、それらは、アプリケーションプログラム２６と、図１に３０ａ、３０ｂ及び３０ｃで示されたドライバのような少なくとも１つのソフトウェアドライバである。
【００４９】
ソフトウェアドライバ３０は、通常は、ハードウェアデザイナーにより開発され、その各々は、単一のモーションコントロールデバイスに関連付けされる。ハードウェアデザイナーは、ドライバファンクションの少なくとも幾つかに関連したモーションコントロールオペレーションを実行するために関連するモーションコントロールデバイスを制御するコントロールコマンドをいかに発生するか指示するドライバコードを書き込む。
【００５０】
例示的ソフトウェアシステム２２においては、ソフトウェアドライバ３０ａ、３０ｂ及び３０ｃが、各々、モーションコントロールデバイス２０ａ、２０ｂ及び２０ｃに関連付けされる。モーションコントロールデバイス２０ａ、２０ｂ及び２０ｃの各々に対してソフトウェアドライバが存在するので、これらデバイス２０ａ、２０ｂ及び２０ｃは、サポートされるモーションコントロールデバイスのグループを形成する。
【００５１】
上記のソフトウェアシステム２２のフレームワークを入念に検討すると、このシステム２２の全てのコンポーネントの中で、ソフトウェアドライバ３０のみがハードウェアに依存することが示される。
【００５２】
モーションコントロールシステムのデザイナー、通常は、ユーザ２４は、アプリケーションプログラム２６を開発する。アプリケーションプログラム２６は、物体を所望の仕方で運動するようにモーションコントロールデバイスを制御するのに必要なモーションコントロールオペレーションを定義するよう構成された一連のコンポーネントファンクションを備えている。アプリケーションプログラム２６は、モーションコントロールコンポーネント３５をプログラミングすることによりシステム２２を使用する何らかのアプリケーションである。アプリケーションは、ＯＬＥオートメーションによるか、又はＡＰＩを形成するカスタムＯＬＥインターフェイスのいずれかを使用することにより、システム２２をプログラムすることができる。
【００５３】
上記したように、コンポーネントコードは、多数のコンポーネントファンクションをドライバファンクションに関連させ、そしてドライバファンクションは、モーションコントロールオペレーションを実行するのに必要なパラメータを定義する。従って、適切に順序付けされたコンポーネントファンクションでは、アプリケーションプログラム２６は、物体を所望の仕方で移動するに必要なロジックを含む。
【００５４】
アプリケーションプログラム２６が書き込まれそしてソフトウェアドライバ３０が設けられると、ユーザ２４は、サポートされるモーションコントロールデバイス２０ａ、２０ｂ及び２０ｃのグループから少なくとも１つのモーションコントロールデバイスを選択する。次いで、ドライバアドミニストレータモジュール３２を用いて、ユーザ２４は、その選択されたモーションコントロールデバイスに関連したソフトウェアドライバを選択する。このドライバアドミニストレータモジュール３２は、各ストリームをインストールし、取り出し、登録しそして設定するのに使用される。
【００５５】
現在実施されているように、ドライバアドミニストレータ３２は、１つのソフトウェアドライバしか選択できないようにする。ソフトウェアシステム２２の将来のバージョンでは、ドライバアドミニストレータは、ユーザが１つ以上のソフトウェアドライバを選択できるようにする。
【００５６】
従って、ソフトウェアシステム２２は、アプリケーションプログラム２６に含まれたコンポーネントファンクション、コンポーネントファンクションに関連したコンポーネントコード、及び選択されたソフトウェアドライバ２８に関連したドライバコードに基づいて、コントロールコマンドを発生する。
【００５７】
上記のように、コントロールコマンドが発生されるときに、それらは、モーションコントロールデバイスへ直接送信され、このデバイスをリアルタイムでコントロールするか、或いは後で使用するために出力ファイルに記憶される。ソフトウェアシステム２２は、ストリーム２８を用いて、コントロールコマンドの所望の行先への送信を処理する。
【００５８】
例示的なシステム２２において、コントロールコマンドの行先は、出力ファイル３４及び／又はコントローラ１６の１つ以上である。他の考えられる行先は、デバッグモニタ又はウインドウ、或いは特定の状態に対して定義された他のカスタム出力メカニズムを含む。ソフトウェアシステムデザイナー、又はある場合には、ハードウェアシステムデザイナーは、コントロールコマンド行先１６及び３４の所与の１つにコントロールコマンドをいかに転送するかを決定する各ストリーム２８のストリームコードを送信する。ドライバアドミニストレータ３２を用いて、ユーザ２４は、コントロールコマンド行先１６及び３４の１つ以上を選択し、そしてその後の実行時に、システム２２は、選択されたコントロールコマンド行先１６及び／又は３４に関連したストリーム２８の送信ストリームコードに基づき選択されたコントロールコマンド行先１６及び／又は３４へコントロールコマンドを転送する。
【００５９】
１６及び３４のような多数のコントロールコマンド行先は、データをシステム２２へ返送することができる。コントロールコマンド行先からシステム２２へ返送されるデータは、応答データと称する。従って、ソフトウェアシステムデザイナーは、更に、応答データをコントローラ１６からシステム２２へいかに転送するか決定するデータ応答ストリームコードをストリーム２８ａ、２８ｂ及び２８ｃの各々に対して書き込む。従って、システム２２は、ストリーム２８に含まれたデータ応答ストリームコードに基づいてコントローラ１６により送られる応答データを処理する。
【００６０】
再び図１を参照すれば、図示されたように、システム２２は、モーションコントロールコンポーネント３５及びドライバスタブモジュール３６を更に備えている。モーションコントロールコンポーネントモジュール３５は、コンポーネントファンクションをドライバファンクションに関連付けるソフトウェアシステム２２の部分である。従って、モーションコントロールコンポーネントモジュール３５は、アプリケーションプログラム２６に含まれたコンポーネントファンクションとドライバファンクションとを関連させるコンポーネントコードを含む。
【００６１】
ドライバスタブモジュール３６は、システム２２により実施される基本的ソフトウェアモデルを実施する必要はなく、最小の努力で種々のモーションコントロールハードウェア構成を受け入れるための著しく大きい融通性をシステム２２に与える。
【００６２】
より詳細には、ドライバスタブモジュール３６が使用されるときには、ハードウェアデザイナーは、全てのドライバファンクションを実施するためのドライバコードを開発する必要がなく、逆に、ハードウェアデザイナーは、コアドライバファンクションを実施するためのドライバコードを書き込まねばならないが、拡張ドライバファンクションを実施するためのドライバコードを書き込む必要はない。ソフトウェアシステムデザイナーは、拡張ドライバファンクションの機能をエミュレートするのに使用されるコアドライバファンクションの組合せを識別するスタブコアをモーションコントロールドライバスタブ３６に与える。
【００６３】
モーションコントロールコンポーネント２４は、選択されたソフトウェアドライバ３０に対し、その選択されたドライバ３０がどの拡張ファンクションをサポートするか決定する。ここでは、非サポートの拡張ドライバファンクションと称されるサポートされない拡張ファンクションに対し、モーションコントロールコンポーネント３５は、ドライバスタブモジュール３６を参照して、非サポートの拡張ドライバファンクションの機能をエミュレートするためのコアドライバファンクションの適切な組合せを決定する。従って、システム２２は、コアドライバファンクションの適切な組合せを用いて、非サポートの拡張ドライバファンクションを実施するのに必要なコントロールコマンドを発生する。
【００６４】
拡張ドライバファンクションをいつエミュレートする必要があるかを決定するプロセスは、各々の拡張ファンクションのポインタを含むファンクションポインタテーブルをモーションコントロールコンポーネント３５に与えることによって最適化することができる。ファンクションポインタテーブルを形成するときは、モーションコントロールコンポーネント３５は、選択されたドライバモジュール３０をチェックして、それが各拡張ファンクションをサポートするかどうか調べる。選択されたドライバモジュール３０が拡張ファンクションをサポートする場合には、モーションコントロールコンポーネントモジュール３５は、選択されたドライバモジュール３０により実施されるファンクションのポインタを、拡張ファンクションに対応する位置に記憶する。選択されたドライバモジュール３０が拡張ファンクションをサポートしない場合には、モーションコントロールコンポーネントモジュール３５は、ドライバスタブモジュール３６に配置された拡張ファンクション実施に対するポインタを記憶する。拡張ファンクションのドライバスタブモジュール３６実施は、選択されたドライバモジュール３０により実施される複数のコアファンクションへのコールを含む。
【００６５】
それ故、ドライバスタブモジュール３６は、モーションコントロールシステムデザイナーが、ハードウェアデザイナーによる最小の時間及び努力で、コアファンクションのみを実施するためのドライバコードを含むワーキングソフトウェアドライバ２８を使用できるようにする。従って、コアドライバファンクションを実施するために開発されたソフトウェアドライバ２８は、拡張ドライバファンクションを所望の通りに実施するためのドライバコードを開発することにより改良することができる。
【００６６】
拡張ドライバファンクションを実施するように特に設計されたドライバコードの使用は、一般に、拡張ドライバファンクションをエミュレートするためのドライバスタブモジュール３６に依存するのが好ましく、即ち拡張ドライバファンクションを実施するために特に書き込まれたドライバコードは、コアドライバファンクションの組合せでのドライバファンクションのエミュレーションよりもそのドライバファンクションのより最適な実施をほとんど常時に得ることになる。
【００６７】
再び図１を参照すれば、図示されたように、システム２２は、更に、ドライバアドミニストレータＣＰＬアプレット３８及びＤＤＥサーバ４０を備えている。
【００６８】
ドライバアドミニストレータＣＰＬアプレット３８は、ユーザ２４がドライバアドミニストレータモジュール３２と通信するところのユーザインターフェイスを形成する。ＤＤＥサーバ４０は、アプリケーションプログラム２６がモーションコントロールコンポーネントモジュール３５と通信するところのソフトウェアインターフェイスを与える。
【００６９】
II．モーションコントロールコンポーネント
図２ないし１０を参照して、モーションコントロールコンポーネント３５について以下に説明する。モーションコントロールコンポーネント３５は、モーションコントロールオペレーションを実行するようにシステム２２をプログラミングする各アプリケーションにより使用される。ＡＰＩの主要セットは、このコンポーネントにより実施される。動作時に、モーションコントロールコンポーネント３５は、ドライバアドミニストレータ３２と対話して、現在ドライバを得ると共に、ドライバ３０及びドライバスタブ３６と対話して、モーションコントロールオペレーションを実行する。システム２２を使用するアプリケーションのみがモーションコントロールコンポーネント３５と対話する。
【００７０】
このセクションは、モーションコントロールコンポーネント３５の設計を３つの主たる部分において説明する。先ず、コンポーネント３５に作用する全ての２進モジュールをコンポーネント３５とのインターアクションに沿って説明する。
【００７１】
次いで、モーションコントロールコンポーネント３５を実施するのに使用される全てのＣ＋＋オブジェクト間のインターアクションを示すためにモジュールインターアクションマップを詳細に描く。次いで、コンポーネント３５が実行することを要求されるある重要なプロセスの間に行われる特定のインターアクションを表示することによりオブジェクトインターアクションマップがテストされる。
【００７２】
図２に示すモジュールインターアクションマップは、全ての２進モジュール、及びそれらとモーションコントロールコンポーネント３５とのインターアクションを表示する。モジュールインターアクションマップから明らかなように、アプリケーションのみがモーションコントロールコンポーネント３５と通信する。この点から、コンポーネント３５は、ドライブアドミニストレータ３２、ドライバ３０、及びドライバスタブ３６のコンポーネント間の全てのインターアクションを整合する。
【００７３】
モジュールインターアクションマップを分断し、そしてモーションコントロールコンポーネント３５を実施するのに使用される全てのＣ＋＋オブジェクト間で行われるインターアクションを追加することにより、図３に示すオブジェクトインターアクションマップが形成される。
【００７４】
この図の各オブジェクトを以下に説明する。ＣＣｍｐｎｔＤｉｓｐオブジェクトは、エクスポーズされたインターフェイス方法をディスパッチするのに使用されるディスパッチオブジェクトである。ディスパッチプロセス中に、全ての生のデータが適当なＣ＋＋形態に変換される。例えば、ＯＬＥコンポーネント間を通過したデータの集合は、通常、生のメモリブロックにパッケージされる。
【００７５】
ＣＣｍｐｎｔＤｉｓｐオブジェクトは、出て行くデータをパッキングし、そして到来するデータをアンパッキングするように注意を払う。データパッキングは、生及びネーティブなＣ＋＋フォーマットの間でデータを変換することを含む。
【００７６】
ＣＤｒｉｖｅｒＡｄｍｉｎオブジェクトは、ドライバアドミニストレータコンポーネントと直接通信するのに使用される。ＯＬＥに関連した全ての細部は、このクラスにカプセル化される。
【００７７】
ＣＤｒｉｖｅｒＭｇｒオブジェクトは、適当なドライバファンクションをコールする前に行われる全てのユニットマッピングをコントロールするのに使用される。ＣＵｎｉｔＭａｐｐｅｒオブジェクトは、ユニット間で実際のマッピングを行うのに使用される。
【００７８】
ＣＵｎｉｔＭａｐｐｅｒオブジェクトは、部分座標システム（ＰＣＳ）とマシン座標システム（ＭＣＳ）との間にユニットをマップするのに使用される。このオブジェクトにより両方向のユニットマッピングが行われる。
【００７９】
Ｃｄｒｉｖｅｒオブジェクトは、コア及び拡張の両ドライバファンクションを含むＳＰＩテーブルを形成するのに使用される。ドライバサポートのレベルに基づき、ＳＰＩテーブルの拡張ファンクションは、ドライバスタブ３６又はドライバ３０のいずれかで実施されるファンクションを指す。
【００８０】
図４ないし８の以下の説明は、モーションコントロールコンポーネント３５において生じる全ての主たるシナリオ又はオペレーションについて述べる。各シナリオマップは、含まれる全てのオブジェクト、及びそれらが生じるシーケンスにおいてそれらの間で行われるインターアクションを表示する。
【００８１】
図４に示すように、アプリケーションがモーションコントロールコンポーネント３５を使用できる前に、ＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅ ＯＬＥファンクションを用いてオブジェクトのインスタンスを形成し、そしてコンポーネント３５により実施されるエクスポーズされた初期化カスタムインターフェイス方法をコールするインスタンスを初期化しなければならない。図４は、初期化方法がコールされるときに行われる事象のシーケンスを示す。
【００８２】
初期化の間に、次のステップが生じる。先ず、アプリケーションは、標準的なＯＬＥファンクションＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅをコールすることによりモーションコントロールコンポーネント３５のインスタンスを形成しなければならない。アプリケーションは、ロードされると、コンポーネント３５のエクスポーズされた初期化方法をコールしなければならない。最初にロードされたときに、コンポーネント３５は、既に記憶された登録データをロードする。次いで、コンポーネント３５は、システムを初期化するためのＣＣｍｐｎｔＤｉｓｐを指令する。このＣＣｍｐｎｔＤｉｓｐは、使用すべき現在ドライバを得るようにＣＤｒｉｖｅｒＡｄｍｉｎに指令する。ＣＤｒｉｖｅｒＡｄｍｉｎは、先ず、標準的なＯＬＥ ＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅファンクションを用いてドライバアドミニストレータ３２にロードする。次いで、ドライバアドミニストレータを初期化する。次いで、使用すべきドライバ及びそれらのＳＰＩサポート情報についてドライバアドミニストレータに問い合わせする。最後に、ドライバアドミニストレータはドライバ及びサポート情報をコンポーネント３５に返送し、そして使用した全てのインターフェイスをドライバアドミニストレータコンポーネント３２から解除する。
【００８３】
アクティブなドライバ３０及びそれらのサポート情報を受け取ると、モーションコントロールコンポーネント３５は、ドライバ３０をＣＤｒｉｖｅｒＭｇｒへ通し、そしてシステムを初期化するように指令する。この初期化中に、ＣＤｒｉｖｅｒＭｇｒは、ＣＵｎｉｔＭａｐｐｅｒを初期化する。又、初期化の間に、ＣＤｒｉｖｅｒＭｇｒは、使用される各ドライバに対してＣＤｒｉｖｅｒを初期化する。各ＣＤｒｉｖｅｒを初期化した後に、サポート情報を使用して、各ＣＤｒｉｖｅｒオブジェクト内に各ＳＰＩテーブルが作られる。ＳＰＩテーブルを作るときには、全てのコア及びサポートされた拡張ＳＰＩインターフェイスがドライバから問い合わせされる。又、ＳＰＩテーブルを作るときには、ＣＤｒｉｖｅｒは、ドライバ３０によりサポートされない全てのインターフェイスにドライババス３６から問い合わせする。
【００８４】
図５を参照すると、モーションコントローラコンポーネント３５が初期化されると、アプリケーション２６は、それに対してオペレーションを実行する。コンポーネント３５において実行できるオペレーションには２つの形式があり、即ちコアドライブファンクションを使用するオペレーションと、拡張ドライブファンクションを使用するオペレーションである。その２つの間の相違が、コンポーネント３５を使用するアプリケーションに完全に見えなくても、内部のインターアクションは２つの間で相違する。これらの相違について、以下に述べる。
【００８５】
次のインターアクションは、コアドライバファンクションのみを使用するオペレーションをコンポーネント３５が実行するときに行われる。先ず、アプリケーションは、オペレーションを要求し、そして全ての関連パラメータをコンポーネント３５へ通さねばならない。次いで、コンポーネント３５は、オペレーションを実行するためのＣＣｍｐｎｔＤｉｓｐを指令する。次いで、ＣＣｍｐｎｔＤｉｓｐは、オペレーションを実行するようにＣＤｒｉｖｅｒＭｇｒに指令し、全ての関連パラメータをそこに通す。オペレーションを実行する前に、ＣＤｒｉｖｅｒＭｇｒは、ＣＵｎｉｔＭａｐｐｅｒを使用して、全てのユニットをマシン座標システム（ＭＳＣ）へ変換する。次いで、ＣＤｒｉｖｅｒＭｇｒは、オペレーションを実行するようにＣＤｒｉｖｅｒオブジェクトに指令し、そして新たにマップされたパラメータをそこに通す。ＣＤｒｉｖｅｒオブジェクトは、その内部ＳＰＩテーブルを使用して、ドライバコンポーネントにより実施されるコアドライブファンクションと直接通信する。
【００８６】
図６は、ドライバ３０によりサポートされない拡張ＳＰＩを使用することになるオペレーションを実行するようコンポーネント３５が指令されたときに生じる事象のシーケンスを示す。次のステップは、オペレーションが要求されたときに生じる。
【００８７】
先ず、アプリケーションは、オペレーションを要求し、全ての関連パラメータをコンポーネント３５に通さねばならない。次いで、コンポーネント３５は、オペレーションを実行するようにＣＣｍｐｎｔＤｉｓｐに指令する。ＣＣｍｐｎｔＤｉｓｐは、次いで、オペレーションを実行するようにＣＤｒｉｖｅｒＭｇｒに指令し、そして全ての関連パラメータをそこに通す。オペレーションを実行する前に、ＣＤｒｉｖｅｒＭｇｒは、ＣＵｎｉｔＭａｐｐｅｒを使用して、全てのユニットをマシン座標システム（ＭＣＳ）に変換する。次いで、ＣＤｒｉｖｅｒＭｇｒは、オペレーションを実行するようにＣＤｒｉｖｅｒオブジェクトに指令しそして新たにマップされたパラメータをそこに通す。ＣＤｒｉｖｅｒオブジェクトは、その内部ＳＰＩテーブルを使用して、ドライバコンポーネントにより実施されるコアドライバファンクションと直接通信する。
【００８８】
上記で簡単に述べたように、システム２２を使用するときには、多数の形式のユニット及び２つの異なる座標システムが使用される。ユニットマッピングのプロセスは、測定値を部分座標システムとマシン座標システムとの間で変換することを含む。図７は、このプロセスを示し、次のステップは、オペレーションが要求されたときに生じる。
【００８９】
先ず、アプリケーションは、オペレーションを要求し、全てのパラメータをコンポーネント３５に通さねばならない。全てのパラメータは、ＰＣＳにあることに注意されたい。次いで、コンポーネント３５は、オペレーションを実行するようにＣＣｍｐｎｔＤｉｓｐに指令する。ＣＣｍｐｎｔＤｉｓｐは、次いで、オペレーションを実行するようにＣＤｒｉｖｅｒＭｇｒに指令し、そしてＰＣＳパラメータをそこに通す。ＣＤｒｉｖｅｒＭｇｒは、全ての測定を行い、ＣＵｎｉｔＭａｐｐｅｒを用いて、それらをＭＣＳに変換する。新たにマップされたパラメータは、次いで、Ｃｄｒｉｖｅｒへ通される。Ｃｄｒｉｖｅｒは、オペレーションを実行するようにドライバ又はドライバスタブコンポーネントに指令する。モーションコントロールコンポーネント３５を用いてアプリケーションが終了すると、エクスポーズされた解除方法をコールすることにより全てのリソースを解放するようにコンポーネント３５に指令する。このプロセスは、図８に示されている。クリーンアッププロセス中に、次のステップが生じる。
【００９０】
先ず、アプリケーションは、その解除方法をコールすることによりその全てのリソースを解除するようにコンポーネント３５に指令しなければならない。呼び出し時に、コンポーネント３５は、ＣＣｍｐｎｔＤｉｓｐオブジェクトへコールを通す。ＣＣｍｐｎｔＤｉｓｐオブジェクトは、ＣＤｒｉｖｅｒＭｇｒにそれが使用するリソースを解除するように指令する。ＣＤｒｉｖｅｒＭｇｒは、各ＣＤｒｉｖｅｒオブジェクトにそのいずれかのリソースを解除し、次いで、ＣＤｉｖｅｒオブジェクトを削除するように指令する。先ず、ＣＤｒｉｖｅｒオブジェクトは、それが使用するいずれかのインターフェイスをドライバコンポーネントから解除する。次いで、ＣＤｒｉｖｅｒオブジェクトは、それが使用するいずれかのインターフェイスをドライバスタブコンポーネントから解除する。
【００９１】
図９は、モーションコントロールコンポーネント３５に関連したインターフェイスマップである。図１０は、拡張ドライバファンクションをエミュレートする必要があるかどうかに関連したデータをいかに記憶するかを示すデータマップである。
【００９２】
III．ソフトウェアドライバ
ドライバ３０は、ドライバアドミニストレータ３２及びコンポーネント３５の両方により使用される。その主たる目的は、サポートされる特定のハードウェアに対しモーションコントロールコマンドを発生する機能を実施することである。
【００９３】
例えば、ＣｏｍｐｕｍｏｔｏｒＡＴ６４００モーションコントロールハードウェアを制御するのに使用されるＡＴ６４００ドライバは、ＡＴ６４００コマンドコードを発生する。システム２２の初期化段階中に、ドライブアドミニストレータ３２は各ドライバ３０と通信し、ユーザがドライバの構成を追加、除去又は変更できるようにする。システム２２を使用するアプリケーションが実行されるときには、コンポーネント３５は、ドライバ３０と通信し、適当なモーションコントロールオペレーションを実行するように指令する。
【００９４】
このセクションは、一般的なドライバ３０の完全な設計について説明する。全てのドライバは、ここに述べる基本的設計から設計される。このセクションは、３つの部分に分けられる。先ず、ドライバ３０と対話する全ての２進モジュールを記述するモジュールインターアクションマップについて述べる。次いで、モジュールインターアクションマップは、ドライバの全ての内部がエクスポーズされるオブジェクトインターアクションマップとして描かれる。このマップには、ドライバを構成する全てのＣ＋＋オブジェクト及びそれらのインターアクションとが示される。次いで、多数のシナリオマップが描かれる。各シナリオマップは、あるプロセス中に含まれるＣ＋＋オブジェクト間で行われるインターアクションを表示する。最後に、このセクションは、ドライバコンポーネント、使用する全てのデータ構造体、及び使用する各Ｃ＋＋クラスの定義によりエクスポーズされるインターフェイスを説明する。
【００９５】
図１１を参照すれば、モジュールインターアクションマップは、全ての２進モジュール、及びそれとドライバ３０とのインターアクションを表示する。ドライバと直接対話する２つのモジュール、即ちモーションコントロールコンポーネント３５及びドライバアドミニストレータ３２がある。ドライバアドミニストレータ３２は、ドライバの設定を問合せ、それを変更し、そしてコンポーネント３５は、システムのある位置へ移動するようなモーションコントロールオペレーションを実行するようにドライバに指令する。図１１には、ここで「レジストリ」と称する標準的なウインドウズ登録データベースが４２で示されている。
【００９６】
ドライバを実施するのに使用される全てのＣ＋＋オブジェクト間で行われるインターアクションを含ませることによりモジュールインターアクションマップを細部へと分断すると、オブジェクトインターアクションマップが形成される。ドライバ３０のオブジェクトインターアクションマップが図１２に示されている。
【００９７】
この図の各オブジェクトについて、以下に説明する。
ＣＤｒｉｖｅｒＤｉｓｐは、エクスポーズされたインターフェイス方法をディスパッチするのに使用されるディスパッチオブジェクトである。ディスパッチプロセス中に、全ての生のデータが適当なＣ＋＋形態に変換される。例えば、ＯＬＥコンポーネント間に通過したデータの集合が通常は生のメモリブロックにパッケージされる。ＣＤｒｉｖｅｒＤｉｓｐオブジェクトは、出て行くデータをパッキングしそして到来するデータをアンパッキングするように注意を払う。データノパッキングは、生とネーティブのＣ＋＋形態の間でデータを変換することを含む。
【００９８】
ＣＳｔｒｅａｍＭｇｒオブジェクトは、ドライバに登録された１組のストリームを管理する役割を果たす。ストリームは、追加、除去及びイネーブルすることができる。イネーブルされたストリームのみが、送られるデータとなる。登録された各ストリームのＣＬＳＩＤ及びイネーブル状態は、登録データベースに記憶される。ストリームと通信するときには、ＣＳｔｒｅａｍＭｇｒを用いて、コマンドストリングが全てのイネーブルされたストリームへ送られる。
【００９９】
ＣＣｏｍａｎｄＭｇｒオブジェクトは、ストリームに送られるコマンドを構成しそしてストリームから受け取った応答を抽出するのに使用される。ＣＣｏｍａｎｄＭｇｒは、ＣＲｅｓｐｏｎｓｅ、ＣＣｏｍｍａｎｄＬｉｓｔ及びＣＳｔｒｅａｍオブジェクトを管理するコントロールオブジェクトである。
【０１００】
ＣＣｏｍｍａｎｄＬｉｓｔオブジェクトは、モーションコントロールコマンド言語を形成するコマンドの完全なリストを記憶する。このようなコマンドは、テキストリソースとして記憶されるか、又はテキストファイルに記憶される。
【０１０１】
ＣＣｏｍｍａｎｄオブジェクトは、コマンドストリングを形成し、これらは、ＣＳｔｒｅａｍへ送られる。構成された各コマンドは、完全なモーションコントロールコマンドストリングである。
【０１０２】
ＣＲｅｓｐｏｎｓｅＬｉｓｔオブジェクトは、予想される応答のパージングフォーマットで初期化されるＣＲｅｓｐｏｎｓｅオブジェクトを構成する。
【０１０３】
ＣＲｅｓｐｏｎｓｅオブジェクトは、ＣＳｔｒｅａｍによって返送される生の応答ストリングを変換し、そしてそれらをＣ＋＋データ形式へと変換する。例えば、位置データを含む応答ストリングが１組の二重の値に変換される。
【０１０４】
ＣＳｔｒｅａｍオブジェクトは、基本的なストリームコンポーネントと直接通信するのに使用される。
【０１０５】
図１４ないし２０は、ドライバ３０に生じる全ての主たるシナリオ即ちオペレーションを記述するシナリオマップを含む。各シナリオマップは、含まれる全てのオブジェクトと、それらが発生するシーケンスでそれらの間に生じるインターアクションとを表示する。
【０１０６】
ドライバ３０には２つの形式のオペレーションが生じる。先ず、ドライバアドミニストレータ３２は、ストリームを追加し又はドライバを構成するといったオペレーションを開始する。次いで、モーションコントロールコンポーネント３５は、アプリケーションが実際に実行されるときにドライバにおいてオペレーションを開始する。以下の説明は、ドライバアドミニストレータにより指令されたオペレーションで始めて、各見地について述べる。ドライバアドミニストレータによりドライバにおいて行われる全てのオペレーションは、ドライバを使用するときにそれらが発生する順序で説明する。
【０１０７】
ドライバが使用される前にそれをＯＬＥシステムに登録しなければならない。
【０１０８】
ドライバを登録するために、ドライバアドミニストレータは、先ず、登録されるモジュールが実際にドライバ３０であるかどうかを照合し、次いで、ドライバを登録するためにＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒエクスポートファンクションをコールする。システム２２の各モジュールは、ＤＬＬＧｅｔＭｏｄｕｌｅＴｙｐｅと称するファンクションをエクスポートする。このファンクションは、モジュールがドライバ３０コンポーネントであることを照合するのに用いられる。
【０１０９】
図１３は、ドライバを登録するときに行われるインターアクションを示す。
図１３に示す登録プロセス中に、次のステップが生じる。先ず、ドライバアドミニストレータは、ストリームコンポーネントを含むＤＬＬをロードし、モジュールがドライバ３０であることを照合しなければならない。これを行うために、ドライバアドミニストレータは、ドライバによりエクスポートされたＤＬＬＧｅｔＭｏｄｕｌｅＴｙｐｅファンクションをコールする。ファンクションが、上位バイトに値ＸＭＣ＿ＤＲＩＶＥＲ＿ＭＴを含む値を返送する場合には、ドライバアドミニストレータは、そのエクスポートされたファンクションＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒをコールするように進んでドライバを登録する。コールされたときに、ＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒを実施すると、全てのＯＬＥ２．０登録情報がウインドウズ登録データベースに書き込まれる。
【０１１０】
図１４を参照すれば、ドライバが登録された後に、ドライバアドミニストレータは、ＯＬＥ ＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅファンクションを用いてコンポーネント３５をロードすることができる。初期化プロセス中に、ドライバは、全ての登録データをロードし、ＣＤｒｉｖｅｒＤｉｓｐ及びＣＳｔｒｅａｍＭｇｒ Ｃ＋＋オブジェクトの両方を初期化する。
【０１１１】
初期化の間に、次のステップが生じる。
ドライバコンポーネントをロードする前に、ドライバアドミニストレータは、ＣＬＳＩＤについてドライバモジュールに問い合わせしなければならない。ドライバのエクスポートファンクションＤＬＬＧｅｔＣＬＳＩＤをコールし、ＣＬＳＩＤを返送する。ドライバアドミニストレータは、ＣＬＳＩＤを得ると、標準的なＯＬＥファンクションＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅをコールすることによりドライバのインスタンスを形成することができる。最初にロードされるときに、ドライバは、既に記憶された登録データをロードする。次いで、ドライバはシステムを初期化するようにＣＤｒｉｖｅｒＤｉｓｐオブジェクトに指令する。それが通知されるときに、ＣＤｒｉｖｅｒＤｉｓｐオブジェクトは、それ自身を初期化し、そしてＣＳｔｒｅａｍＭｇｒにそれ自身を初期化するよう指令する。その初期化中に、ＣＳｔｒｅａｍＭｇｒは、全てのストリーム設定を登録データベースからロードする。例えば、ＣＬＳＩＤ及びドライバに既に登録された全てのストリームのイネーブル状態がロードされる。
【０１１２】
ドライバの初期化の後に、ドライバアドミニストレータは、それにおいてオペレーションを実行する。例えば、ドライバアドミニストレータは、ストリームを追加又は除去するようにドライバに要求する。図１５は、ドライバが新たなストリームを追加するよう要求されたときに発生する事象のシーケンスを示す。ストリームを追加するときに、次のステップが生じる。
【０１１３】
先ず、ドライバアドミニストレータは、新たなストリームを追加するようにストリームに指令し、追加されるべきストリームのＣＬＳＩＤをドライバへ通す。
【０１１４】
次いで、ドライバは、ＣＬＳＩＤをＣＤｒｉｖｅｒＤｉｓｐオブジェクトへ通しそしてそれをストリームに加えるように指令する。ＣＤｒｉｖｅｒＤｉｓｐオブジェクトは、この情報をＣＳｔｒｅａｍＭｇｒへ通し、そしてそれをストリームに加えるように指令する。最終ステップにおいて、ＣＳｔｒｅａｍＭｇｒは、モジュールが有効なストリームコンポーネント２８であると仮定し、そしてＣＬＳＩＤを登録データベースの情報のドライバセットに追加する。
【０１１５】
初期化の後に、ドライバに要求される別のオペレーションは、現在の設定についてそれに問い合わせすることである。サポートするハードウェアの名前のようなドライバに関する情報を表示する前に、ドライバアドミニストレータは、その情報についてドライバに問合せしなければならない。例えば、図１６は、ドライバに登録されたストリームのエミュレーションに対しドライバに問い合わせするプロセスを示す。情報についてドライバに問い合わせするときには、次のステップが生じる。
【０１１６】
先ず、ドライバアドミニストレータは、ドライバのストリームのエミュレーションを問い合わせるのに使用するインターフェイス方法をコールする。次いで、ドライバは、ＣＤｉｖｅｒＤｉｓｐにストリームエミュレーションを形成するよう指令する。ＣＤｉｖｅｒＤｉｓｐオブジェクトは、次いで、ＣＳｔｒｅａｍＭｇｒにストリームエミュレーションを準備するよう指令する。ＣＳｔｒｅａｍＭｇｒは、登録データベースをチェックし、その内部状態がレジストリに記憶されたデータと同期するように確保する。次いで、ストリームを追加又は除去するような全てのストリームマネージメントオペレーションをフェイルさせるロックをセットする。ＣＳｔｒｅａｍＭｇｒは、ストリームのリストを準備し、ＣＳｔｒｅａｍオブジェクトを用いてそれらをメモリにロードする。ＣＳｔｒｅａｍオブジェクトは、ＯＬＥ ＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅ ＡＰＩを用いてストリームコンポーネントをロードする。
【０１１７】
ドライバアドミニストレータは、ドライバを用いて実行した後に、そのエクスポーズされた解除方法をコールすることによってドライバを解除しなければならない。この方法をコールすると、使用される全てのリソースを解除するようにドライバに指令する。図１７は、ドライバコンポーネントを解除するプロセスを示す。クリーンアッププロセスの間に、次のステップが生じる。
【０１１８】
先ず、ドライバアドミニストレータは、ドライバコンポーネントに、その解除方法をコールすることによりそれ自身をクリーンアップするように指令する。これが呼び出されると、ドライバコンポーネントは、コールをＣＤｒｉｖｅｒＤｉｓｐオブジェクトへ通す。ＣＤｒｉｖｅｒＤｉｓｐオブジェクトは、次いで、ＣＳｔｒｅａｍＭｇｒに全てのデータをセーブするように指令する。ＣＳｔｒｅａｍＭｇｒは、各ストリームの状態を含む全てのデータを登録データベースにセーブする。最後に、ドライバは、全ての内部データを登録データベースにセーブする。
【０１１９】
ドライバがシステム２２に首尾良くインストールされそしてドライバアドミニストレータを用いて構成された後に、モーションコントロールコンポーネント３５により使用する準備ができる。コンポーネント３５は、コンポーネント３５を用いるアプリケーションから要求されたモーションコントロールオペレーションを実行するときにドライバ３０を使用する。以下の説明は、コンポーネント３５が指令したオペレーションであって、ドライバにおいて実行することのできるオペレーションについて述べる。
【０１２０】
ドライバを使用する前に、それをコンポーネント３５により初期化しなければならない。このオペレーションは、システムがコマンドを送信及び受信するよう準備されねばならないので、ドライバアドミニストレータにより使用されるときにドライバにおいて行われるドライバ初期化とは異なる。データ通信の準備をするために、ストリームを初期化しそしてオープンしなければならない。図１８は初期化プロセスを示す。次のステップは、初期化プロセス中に生じる。
【０１２１】
先ず、コンポーネント３５は、ドライバにそれ自身を初期化するように指令する。これは、通常は、２ステップのプロセスである。第１ステップにおいて、コンポーネント３５は、標準的なＯＬＥ ＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅファンクションを用いてドライバのインスタンスを形成する。次いで、ドライバによりエクスポーズされた初期化方法がコールされ、データ送信に対してドライバが準備される。初期化方法がコールされたときには、ドライバは、先ず、登録データベース４２に記憶された内部データをロードする。次いで、ドライバは、内部システムを初期化するようにＣＤｒｉｖｅｒＤｉｓｐに指令する。ＣＤｒｉｖｅｒＤｉｓｐは、次いで、ストリームを初期化するようＣＳｔｒｅａｍＭｇｒに指令する。次いで、ＣＳｔｒｅａｍＭｇｒは、全てのＣＬＳＩＤのセット、及びドライバに登録された全てのストリームに対するイネーブル状態を含む全てのデータを登録データベースからロードする。次いで、ＣＳｔｒｅａｍＭｇｒは、各イネーブルストリームに対して新たなＣＳｔｒｅａｍオブジェクトを形成することにより、各イネーブルストリームをロードする。各ＣＳｔｒｅａｍオブジェクトを形成するときには、基本的なストリームに対するＣＬＳＩＤがＣＳｔｒｅａｍオブジェクトに通される。各ＣＳｔｒｅａｍオブジェクトが形成されそしてストリームコンポーネントに付随されるときには、標準的なＯＬＥ ＣｏＣｒｅａｔｅｌｎｓｔａｎｃｅファンクションをコールすることによりコンポーネント３５をロードする。ＣＳｔｒｅａｍＭｇｒが実行されると、ＣＤｒｉｖｅｒＤｉｓｐは、ＣＣｏｍｍａｎｄＭｇｒにそれ自身を初期化するよう指令する。その初期化プロセス中に、ＣＣｏｍｍａｎｄＭｇｒは、ＣＣｏｍｍａｎｄＬｉｓｔを初期化し、そしてロードする。更に、ＣＣｏｍｍａｎｄＭｇｒは、初期化を行うときには、ＣＣｏｍｍａｎｄＬｉｓｔに対応するＣＲｅｓｐｏｎｓｅＬｉｓｔをロードする。
【０１２２】
システムが初期化されると、モーションコントロールコンポーネント３５は、幾つかのコマンドオペレーションを実行するようにドライバに指令することができる。コマンドオペレーションは、システムの特定の位置へ移動したり現在位置についてシステムに問い合わせするといった標準的なモーションコントロールオペレーションである。図１９は、あるオペレーションを実行するようにドライバに指令するプロセスを示す。あるオペレーションを実行するようにドライバに指令するときには、次のステップが生じる。
【０１２３】
先ず、コンポーネント３５は、ある位置へ移動したり、又は現在位置についてシステムに問い合わせするといったオペレーションを実行するようにドライバに指令する。次いで、ドライバは、オペレーションを実行するようにＣＤｒｉｖｅｒＤｉｓｐオブジェクトに指令する。ＣＤｒｉｖｅｒＤｉｓｐオブジェクトは、適当なコマンドを構成するようにＣＣｏｍｍａｎｄＭｇｒに指令する。コマンドに関連したパラメータは、ＣＣｏｍｍａｎｄＭｇｒに通される。例えば、ある位置へ移動するようドライバに指令するときには、位置情報がＣＣｏｍｍａｎｄＭｇｒに通される。次いで、ＣＣｏｍｍａｎｄＭｇｒは、ＣＲｅｓｐｏｎｓｅＬｉｓｔにＣＲｅｓｐｏｎｓｅオブジェクトを形成するように要求する。ＣＲｅｓｐｏｎｓｅＬｉｓｔは、応答フォーマットを探し、そしてそれを使用して、ＣＣｏｍｍａｎｄＭｇｒに返送される新たなＣＲｅｓｐｏｎｓｅオブジェクトを形成する。次いで、ＣＣｏｍｍａｎｄＭｇｒは、ＣＣｏｍｍａｎｄＬｉｓｔにコマンドを形成するよう指令する。コマンドに関連したパラメータは、ＣＣｏｍｍａｎｄＬｉｓｔに通される。ＣＣｏｍｍａｎｄＬｉｓｔは、新たなＣＣｏｍｍａｎｄオブジェクトを形成し、生のコマンドストリングを探し、これとコマンドパラメータを、そのコマンドストリングを構成するＣＣｏｍｍａｎｄへ通す。
【０１２４】
ＣＣｏｍｍａｎｄＭｇｒは、次いで、ＣＣｏｍｍａｎｄＬｉｓｔにより返送されたＣＣｏｍｍａｎｄオブジェクトと、既に形成されているＣＲｅｓｐｏｎｓｅオブジェクトをＣＳｔｒｅａｍＭｇｒオブジェクトへ通す。ＣＳｔｒｅａｍＭｇｒオブジェクトは、オブジェクトを処理するように指令される。ＣＳｔｒｅａｍＭｇｒは、ＣＣｏｍｍａｎｄ及びＣＲｅｓｐｏｎｓｅオブジェクトを全てのイネーブルＣＳｔｒｅａｍオブジェクトに通す。ＣＳｔｒｅａｍオブジェクトは、生のテキスト形態の全コマンドストリングに対しＣＣｏｍｍａｎｄオブジェクトに問い合わせする。生のテキストコマンドは、ストリームコンポーネントに通される。次いで、ＣＳｔｒｅａｍオブジェクトは、応答を待機し、生のテキストコマンドをバッファへ読み込む。次いで、生のテキスト応答がＣＲｅｓｐｏｎｓｅオブジェクトへ通される。次いで、ＣＲＥＴＯＮＮＥオブジェクトがＣＳｔｒｅａｍＭｇｒへ返送され、これをそのオブジェクトをＣＣｏｍｍａｎｄＭｇｒへ返送し、そしてこれはそのオブジェクトをＣＤｒｉｖｅｒＤｉｓｐオブジェクトへ返送する。最終的に、ＣＲｅｓｐｏｎｓｅは、ＣＤｒｉｖｅｒＤｉｓｐオブジェクトへ返送され、これは、次いで、ＣＲｅｓｐｏｎｓｅに応答を一般的なＣ＋＋形式に変換するように指令する。この一般的な形式は、モーションコントロールコンポーネント３５へ返送される。
【０１２５】
コンポーネント３５がドライバを用いて終了されると、ドライバは、その解除方法をコールすることにより解除されねばならない。ドライバを解除すると、ドライバにより使用された全てのリソースが解放される。図２０は、ドライバを解除するプロセスを示す。次のステップは、ドライバにより使用される全てのリソースをクリーンアップしそして解放するときに生じる。
【０１２６】
先ず、コンポーネント３５は、ドライバの解除方法をコールしなければならない。これがコールされると、ドライバは、使用されたリソースを解除するようにＣＤｒｉｖｅｒＤｉｓｐオブジェクトに指令する。次いで、ＣＤｒｉｖｅｒＤｉｓｐは、使用されたリソースを解放するようＣＳｔｒｅａｍＭｇｒに指令する。
【０１２７】
次いで、ＣＳｔｒｅａｍＭｇｒは、全てのアクティブなＣＳｔｒｅａｍオブジェクトを解放する。各ＣＳｔｒｅａｍオブジェクトは、使用された全てのストリームコンポーネントインターフェイスを解除する。次いで、ＣＤｒｉｖｅｒＤｉｓｐは、ＣＣｏｍｍａｎｄＭｇｒにその全てのリソースを解放するよう指令する。
【０１２８】
クリーンアップの間に、ＣＣｏｍｍａｎｄＭｇｒは、ＣＣｏｍｍａｎｄＬｉｓｔオブジェクトを解放する。そのクリーンアップを完了するために、ＣＣｏｍｍａｎｄＭｇｒは、ＣＲｅｓｐｏｎｓｅＬｉｓｔオブジェクトを解放する。
【０１２９】
IV．ストリーム
このセクションは、ドライバ３０のコンポーネントと、モーションコントロールデバイス２０及び／又は出力ファイル３４のような行先出力位置との間のデータ搬送レイヤとして使用されるストリームコンポーネント２８について述べる。
【０１３０】
例えば、ＰＣバスに接続されたモーションコントロールハードウェアを使用するときには、ドライバ３０のコンポーネントは、ＰＣバスストリームコンポーネント２８と通信する。
【０１３１】
ストリームコンポーネント２８の設計は、３つの部分において説明する。先ず始めに、モジュールインターアクションマップは、含まれるモジュールをストリームに関して説明すると共に、それらが互いにいかに対話するかについて説明する。次いで、オブジェクトインターアクションマップは、モジュールインターアクションマップを更に詳細な図に分割し、これは、モジュール間に生じるインターアクションを示すだけでなく、ストリームコンポーネント２８内でＣ＋＋オブジェクト間で行われるインターアクションも示す。次いで、オブジェクトインターフェイスマップは、多数のシナリオマップを通して実行することにより「テスト」される。各シナリオマップは、あるオペレーション中に生じる他のインターアクションを示す。
【０１３２】
図２２に示すモジュールインターアクションマップは、ストリームコンポーネント２８と対話する全てのモジュールを示す。インターアクションは、２つの異なる観点から始まる。先ず、ドライバアドミニストレータ３２は、ストリームをインストールし、除去し及び構成するときにストリームコンポーネント２８と対話する。次いで、その使用時に、各ドライバ３０は、行先へデータを送信し及び行先からデータを検索する間にストリームと対話する。例えば、ドライバがテキストファイルストリームにデータを書き込むときには、ストリームは、データをファイルに書き込むように注意を払う。又は、ドライバがＰＣバスストリームからデータを読み取る場合には、ストリームは、ハードウェアから実際に読み取りそしてデータをドライバへ戻す。
【０１３３】
ドライバは、ドライバに特に接続されたストリームのみと通信する。接続されると、ストリームは、ＰＣバス、シリアルＩ／Ｏ接続、テキストファイル又はデバッグモニタと同様に、行先オブジェクトと通信するのに使用される。
【０１３４】
図２２に示すストリームコンポーネント２８は、各ドライバに対しデータ搬送レイヤとして動作するオブジェクトである。各ストリームは、ストリームの形式を定義する異なるターゲットを有する。現在ストリームターゲットは、次の通りである。
【０１３５】
ＰＣ Ｂｕｓ／ＷｉｎＮＴ  −  このウインドウズＮＴストリームは、ウインドウズＮＴ．ＳＹＳデバイスドライバを使用して、ＰＣバスに接続されたモーションコントロールハードウェアと直接通信する。
ＰＣ Ｂｕｓ／Ｗｉｎ９５  −  このウインドウズ９５ストリームは、ウインドウズ９５ ＶｘＤを使用して、ＰＣバスに接続されたモーションコントロールハードウェアと直接通信する。
ＰＣ Ｂｕｓ／Ｗｉｎ３．１  −  このウインドウズ３．１ストリームは、ＰＣバスに接続されたモーションコントロールハードウェアと直接通信する。
Ｓｅｒｉａｌ  −  このストリームは、ＣＯＭＭ ＡＰＩを使用して、シリアルポートに接続されたモーションコントロールハードウェアと通信する。
Ｔｅｘｔ Ｆｉｌｅ  −  このストリームは、書き込みのみであり、全てのデータをテキストファイルに送信する。
Ｄｅｂｕｇ Ｍｏｎｉｔｏｒ  −  このストリームは、書き込みのみであり、全てのデータをデバッグモニタに送信する。
Ｃｕｓｔｏｍ  −  これは、データを未知の位置に送信するカスタムストリームである。
【０１３６】
モジュールインターアクションマップと同様に、オブジェクトインターアクションマップは、モジュール間のインターアクションを表示する。更に、このマップは、ストリームコンポーネント２８内の各Ｃ＋＋オブジェクト間に生じる全てのインターアクションを示す。図２３は、ストリームコンポーネント２８に対するオブジェクトインターアクションマップである。
【０１３７】
図の各オブジェクトは、次のように説明される。ＣＳｔｒｅａｍＤｉｓｐオブジェクトは、エクスポーズされたインターフェイス方法をディスパッチするのに使用されるディスパッチオブジェクトである。ディスパッチプロセスの間に、全ての生のデータは、適当なＣ＋＋形態に変換される。例えば、ＯＬＥコンポーネント間に通されたデータの集合は、通常は、生のメモリブロックにパッケージされる。ＣＳｔｒｅａｍＤｉｓｐオブジェクトは、出て行くデータをパッキングしそして到来するデータをアンパッキングすることに注意を払う。データのパッキングは、生及びネーティブのＣ＋＋フォーマット間でデータを変換することを含む。
【０１３８】
ＣＲｅｇｉｓｔｒｙＭｇｒオブジェクトは、登録データベースに記憶された全てのデータをマネージするように注意を払う。同じ形式の多数のストリームが同時に存在するので、各ストリームにはハンドルが指定される。指定されたハンドルは、図書室の本を探すのに図書室の索引が使用されるのと同様に、ストリームが使用する位置を探して登録データベースにデータをロード及び記憶するようにストリームにより使用される。
【０１３９】
全ての入力及び出力は、ＣＩＯＭｇｒマネージャーを介してファネルに通される。入力及び出力オペレーションのマネージメントは、データをバッファしそしてターゲット位置へ及びそこからデータを搬送するのに使用されるプリミティブを制御することより成る。
【０１４０】
ＣＩＯＨＡＬオブジェクトは、入力／出力ハードウェア抽象レイヤである。このオブジェクト内には、ｉｎｐ及びｏｕｔｐへのコールのような全てのハードウェア従属コードが存在する。各異なる形式のストリームは、このオブジェクトの異なる実施を含む。
【０１４１】
シナリオマップは、マップにより指示されたオペレーション中に各モジュール及びストリームコンポーネント内のオブジェクトが互いにいかに対話するかを示す特殊なオブジェクトインターアクションマップである。図２４−３２のシナリオマップは、２つの異なるカテゴリー、即ちドライバアドミニストレータ３２により開始されるものと、ドライバ３０により開始されるものとに分割される。
【０１４２】
ドライバアドミニストレータにより指令されるオペレーションは、通常は、ストリームの初期化、非初期化、及び構成に関連している。次のセクションは、ドライバアドミニストレータにより指令されてストリームにおいて行われる全てのオペレーションを示す。
【０１４３】
ストリームコンポーネントが誰かに使用される前に、それをウインドウズ登録データベースに登録しなければならない。登録は、ストリームコンポーネントのようなＯＬＥ２．０コンポーネントを使用するために必要な標準的なＯＬＥ２．０オペレーションである。図２４は、このプロセスを示す。登録プロセス中に、次のステップが生じる。
【０１４４】
先ず、ドライバアドミニストレータは、ストリームコンポーネントを含むＤＬＬをロードし、モジュールがストリームコンポーネント２８であることを照合しなければならない。これを行うために、ドライバアドミニストレータは、ストリームによりエクスポートされたＤＬＬＧｅｔＭｏｄｕｌｅＴｙｐｅファンクションをコールする。戻り値の上位バイトが値ＸＭＣ＿ＳＴＲＥＡＭ＿ＭＴを含む場合には、ドライバアドミニストレータは、エクスポートされたファンクションＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒをコールするように進んでストリームを登録する。それがコールされたときは、ＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒを実施すると、全てのＯＬＥ２．０登録情報がウインドウズ登録データベースに書き込まれる。
【０１４５】
ストリームコンポーネントが首尾良く登録された後に、初期化の準備が整う。
初期化中に、ストリームコンポーネントは、それ自体を初期化するだけでなく、ドライバをオペレーティングシステムに登録することにより使用されるデバイスドライバも初期化する。例えば、ウインドウズＮＴストリームコンポーネントはウインドウズＮＴ．ＳＹＳドライバをウインドウズＮＴに登録し、そしてサービスをスタートする。図２５は、このプロセスを示す。初期化の間に、次のステップが生じる。
【０１４６】
先ず、ドライバアドミニストレータは、ストリームにそれ自体を初期化するよう指令しなければならない。このコールを行うときに、使用するドライバの名前及び位置と、ストリームのハンドルがアーギュメントとして方法に通される。ストリームコンポーネントは、それ自体を初期化するよう指令されると、ＣＳｔｒｅａｍＤｉｓｐをコールし、そしてそれにシステムを初期化するよう指令する。
【０１４７】
ＣＳｔｒｅａｍＤｉｓｐオブジェクトは、次いで、ＣＲｅｇｉｓｔｒｙＭｇｒにそれに通されたハンドルを使用してストリームの全ての当該データをロードするように指令する。ＣＲｅｇｉｓｔｒｙＭｇｒは、登録データベースから全てのデータをロードする。全ての情報がレジストリからロードされると、ＣＳｔｒｅａｍＤｉｓｐは、ＣＩＯＭｇｒに適当なドライバをオペレーティングシステムに登録するよう指令する。ＣＩＯＭｇｒは、ＣＩＯＨＡＬにドライバを適宜登録するよう指令する。ウインドウズＮＴで動作する場合には、ＣＩＯＨＡＬは、．ＳＹＳドライバをウインドウズＮＴオペレーティングシステムに登録し、そしてドライバをスタートさせる。ウインドウズ９５で動作する場合には、ＶｘＤ完全性が迅速なダイナミックなロード及びアンロードで照合される。
【０１４８】
ストリームコンポーネントを初期化した後に、現在設定について問い合わせされるか又は新たな設定をセットするよう指令される。両オペレーションは非常に類似しているので、設定の変更のみを説明する。ストリーム設定は、ポートアドレス、ＩＲＱレベル、ファイルネーム等のデータを含む。出力／入力ターゲットと通信する必要のあるデータは、ストリーム設定に含まれる。図２６は、ストリーム設定を変更するプロセスを示す。設定プロセス中に、次のようなステップが生じる。
【０１４９】
先ず、ドライバアドミニストレータは、ストリームに、その内部データを変更するために通したデータを使用するように指令する。指令を受けると、ストリームコンポーネントは、インターフェイス方法の呼び出しをＣＳｔｒｅａｍＤｉｓｐオブジェクトへ通す。ＣＳｔｒｅａｍＤｉｓｐオブジェクトは、次いで、ＣＲｅｇｉｓｔｒｙＭｇｒに、新たな設定を記憶するように指令する。ＣＲｅｇｉｓｔｒｙＭｇｒは、新たな値を登録データベースに記憶する。
【０１５０】
ドライバアドミニストレータは、ストリームコンポーネントを用いてこれを行うときに、使用するリソースをクリーンアップしなければならない。図２７は、このプロセスを示す。クリーンアッププロセス中に、次のステップが生じる。先ず、ドライバアドミニストレータは、ストリームコンポーネントに、その解除方法をコールすることによりそれ自身をクリーンアップするよう指令する。これが呼び出されると、ストリームコンポーネントは、ＣＳｔｒｅａｍＤｉｓｐオブジェクトにコールを通す。ＣＳｔｒｅａｍＤｉｓｐオブジェクトは、次いで、ＣＲｅｇｉｓｔｒｙＭｇｒに全てのデータをセーブするよう指令する。全ての永続的データがＣＲｅｇｉｓｔｒｙＭｇｒにより登録データベースにセーブされる。
【０１５１】
各ドライバ３０がそれに接続されたストリームコンポーネント２８を使用するときにドライバ指令オペレーションが発生する。各ストリームコンポーネントはデータ搬送レイヤとして使用されることを想起されたい。各ドライバは、ストリームを使用して、それが発生するモーションコントロールコマンドデータを出力ターゲットに転送する。又、ストリームは、読み取りオペレーションが生じるときにデータをドライバへ返送するのにも使用される。幾つかのストリームしか読み取ることができない。
【０１５２】
ドライバがストリームにおいてオペレーションを実行する前に、ストリームが初期化されねばならない。初期化は、２つのステップで生じる。先ず、ＯＬＥストリームコンポーネントがロードされねばならず、次いで、それが行われると、ストリームが明確に初期化されねばならない。図２８は、初期化プロセスの第２部分を示す。初期化プロセス中に次のステップが生じる。
【０１５３】
先ず、ドライバは、ストリームインターフェイスの１つによりエクスポートされた初期化方法を呼び出す。初期化を呼び出すときには、ドライバは、ストリームハンドルをストリームに通す。次いで、ストリームは、ディスパッチのための指令をＣＳｔｒｅａｍＤｉｓｐオブジェクトへ通す。ＣＳｔｒｅａｍＤｉｓｐオブジェクトは、先ず、ＣＲｅｇｉｓｔｒｙＭｇｒに、ストリームハンドルにより定義された位置に記憶された全ての設定をロードするように指令する。ＣＲｅｇｉｓｔｒｙＭｇｒは、ハンドルにおいてレジストリに記憶されたデータを読み込む。データがロードされた後に、ＣＳｔｒｅａｍＤｉｓｐはＣＩＯＭｇｒにそれ自身を初期化するよう指令する。初期化の一部分として、ＣＩＯＭｇｒは、それが使用しているＣＩＯＨＡＬオブジェクトを初期化する。
【０１５４】
ストリームが初期化されると、それがオープンされねばならない。ストリームをオープンすると、ストリームは、ドライバとターゲットとの間にデータを通せる状態に入れられる。図２９は、ストリームをオープンするプロセスを示す。ストリームをオープンするときに、次のステップが生じる。
【０１５５】
先ず、ドライバは、オープンエクスポーズドインターフェイス方法をコールすることによりストリームにそれ自体オープンするよう指令する。指令されると、ストリームは、コールをＣＳｔｒｅａｍＤｉｓｐオブジェクトへ通す。次いで、ＣＳｔｒｅａｍＤｉｓｐオブジェクトは、ＣＩＯＭｇｒにストリームをオープンするように指令する。このとき、ＣＩＯＭｇｒは、ストリームを通してデータを転送するときに後で使用されるバッファを準備する。バッファが準備された後、ＣＩＯＭｇｒは、ＣＩＯＨＡＬオブジェクトにターゲットと対話するように指令し、それをオープンする。ＣＩＯＨＡＬは、ターゲット又はデバイスドライバと直接通信し、ストリームをオープンする。ハードウェアストリームでオープンするときには、デバイスドライバ又はシリアルＩＯがハードウェアと直接通信し、そして動作の準備をする。
【０１５６】
ストリームをオープンした後に、データ搬送オペレーションを実行する準備ができる。２つの主たるデータ搬送オペレーション、即ちデータ読み取り及びデータ書き込みが使用できる。図３０は、ストリームにデータを書き込むプロセスを示す。ストリームに書き込むときには、次のステップが生じる。先ず、ドライバは、ターゲットにデータを書き込むようにストリームに指令し、そしてデータをストリームへ通す。次いで、ストリームは、データをＣＳｔｒｅａｍＤｉｓｐオブジェクトへ通す。ＣＳｔｒｅａｍＤｉｓｐオブジェクトは、データのブロックをＣＩＯＭｇｒへ通し、それをターゲットに書き込むように指令する。ＣＩＯＭｇｒオブジェクトは、データの完全なブロックをＣＩＯＨＡＬオブジェクトへ通すか又はブロックを内部バッファに記憶し、次いで、完全なバッファが送られるまでＣＩＯＨＡＬオブジェクトへバッファの断片を通す。ＣＩＯＨＡＬオブジェクトは、これに通されたデータを取り上げ、それをターゲットに直接通すか、デバイスドライバへ通すか、又はＣＯＭＭ ＡＰＩをコールし、データをシリアルＩＯポートへ送信する。デバイスドライバ又はＣＯＭＭ ＡＰＩは、コントロールされるハードウェアにデータを直接通す。
【０１５７】
ＰＣバス及びシリアルＩＯストリームのようなあるストリームは、それらに対して書き込み動作が生じた後にデータを返送する。返送されたデータは、データの以前の要求、或いは以前の書き込み動作の成功又は不成功を記述する状態に対して特有のものである。図３１は、ストリームからデータを読み取るプロセスを示す。全てのストリームを読み取りできるのではないことに注意されたい。現在のところ、読み取り可能なストリームは、ＰＣバス及びシリアルストリームだけである。ターゲットからのデータを読み取る動作中に、次のステップが生じる。
【０１５８】
先ず、ドライバは、ストリームにターゲットからデータを読み取るように指令する。ストリームは、ＣＳｔｒｅａｍＤｉｓｐオブジェクトへコールを通す。ＣＳｔｒｅａｍＤｉｓｐオブジェクトは、ＣＩＯＭｇｒに読み取りを実行するよう指令する。ストリームをいかに実行するかに基づいて、ＣＩＯＭｇｒは、ＣＩＯＨＡＬオブジェクトへの１つのコール又は多数のコールを行うことができる。多数のコールが行われる場合には、読み取られた全てのデータがＣＩＯＭｇｒ内部バッファに記憶される。ＣＩＯＨＡＬオブジェクトは、ハードウェアと直接通信するか、ＣＯＭＭ ＡＰＩ又はデバイスドライバを用いてデータを読み取る。デバイスドライバ又はＣＯＭＭ ＡＰＩが使用される場合には、それらがハードウェアと直接通信して、データを読み取る。
【０１５９】
ストリームを用いてドライバが実行されると、使用された全てのリソースをクリーンアップするようにストリームに指令しなければならない。これを行うために、ドライバは、標準的な解除方法をコールする。図３２は、解除方法がコールされた後に行われる事象シーケンスを示す。ストリームにより使用された全てのリソースをクリーンアップしそして解放するときには、次のステップが生じる。
【０１６０】
先ず、ドライバは、ストリームの解除方法をコールしなければならない。次いで、ストリームは、使用された全てのリソースを解除するようにＣＳｔｒｅａｍＤｉｓｐオブジェクトに指令する。次いで、ＣＳｔｒｅａｍＤｉｓｐオブジェクトは、バッファ等に使用されたいかなるリソースも解放するようにＣＩＯＭｇｒに指令する。次いで、ＣＩＯＭｇｒは、使用されたいかなるリソースも解放するようにＣＩＯＨＡＬに指令する。そのクリーンアップ中に、ストリームの形式に基づいて、ＣＩＯＨＡＬは、使用されたテキストファイルを削除し、デバッグモニタをクローズし、ハードウェアを遮断し、又はデバイスドライバにハードウェアを遮断するように指令する。デバイスドライバ又はＣＯＭＭ ＡＰＩが使用される場合には、それらがハードウェアに遮断するよう指令する。
【０１６１】
図３３は、ストリーム２８のインターフェイスマップを示す。
【０１６２】
Ｖ．ドライバスタブモジュール
ドライバスタブモジュール３６は、ドライバ３０がサポート又は実施できない拡張ドライバファンクションを満足するために使用される。拡張ＳＰＩをシュミレーションすることにより、アプリケーションは、それがモーションコントロールハードウェアに直接プログラムされた場合に使用できる以上の大きな１組のモーションコントロール機能を使用することができる。拡張ＳＰＩを実施するために、ドライバスタブは、ドライバ３０により実施されるコアＳＰＩインターフェイス方法をコールするソフトウェアアルゴリズムを使用する。ドライバスタブの初期化中に、使用すべきドライバ３０がドライバスタブに登録される。
【０１６３】
このセクションは、ドライバスタブ３６の全ての観点を３つの基本的な部分において説明する。このセクションの第１の部分は、ドライバスタブに作用する全ての２進モジュールについて述べる。次いで、ドライバスタブの内部に使用される全てのＣ＋＋オブジェクトを含む詳細な図について説明する。次いで、ドライバスタブにおいて行われる多数のプロセスについて説明する。
【０１６４】
モジュールインターアクションマップは、全ての２進モジュール、及びそれらとドライバスタブ３６とのインターアクションを示す。図３４から明らかなように、ドライバスタブは、コンポーネント３５により使用される。ドライバスタブは、考えられる全ての拡張ドライバ機能を満たすことによりコンポーネント３５のヘルパーとしての作用も若干果たす。
【０１６５】
図３４のモジュールインターアクションマップを取り上げ、そしてドライバスタブを実施する全てのＣ＋＋オブジェクトで行われる全てのインターアクションを表示することにより、オブジェクトインターアクションマップと称するものが形成される。図３５は、ドライバスタブ３６のコンポーネントに対するオブジェクトインターフェイスマップである。
【０１６６】
図の各オブジェクトについて以下に説明する。
ＣＤｒｉｖｅｒＳｔｕｂＤｉｓｐオブジェクトは、エクスポーズされたインターフェイス方法をディスパッチするのに使用されるディスパッチオブジェクトである。ディスパッチプロセスの間に、全ての生のデータが適当なＣ＋＋形態に変換される。例えば、ＯＬＥコンポーネント間に通されるデータの集合は、通常、生のメモリブロックにパッケージされる。ＣＤｒｉｖｅｒＳｔｕｂＤｉｓｐオブジェクトは、出て行くデータをパッキングしそして到来するデータをアンパッキングするよう注意を払う。データのパッキングは、生及びネーティブなＣ＋＋フォーマット間でデータを変換することを含む。
【０１６７】
ＣＳＰＭｇｒオブジェクトは、全てのＳＰＩイッシューをマネージする役目を果たし、例えば、ドライバによりエクスポーズされる適当なＳＰＩコアインターフェイスへ接続するよう指令することによりＣＳｉｍｐｌｅＤｒｉｖｅｒをマネージする。
【０１６８】
ＣＳｉｍｐｌｅＤｒｉｖｅｒオブジェクトは、ＳＰＩコアインターフェイスを実施するドライバと直接通信するのに使用される。ＣＳｉｍｐｌｅＤｒｉｖｅｒは、ドライバにより実施されるコアＳＰＩインターフェイスのみと通信する。以下の説明は、ドライバスタブ３６に生じる全ての主たるシナリオ又はオペレーションについて述べる。各シナリオマップは、含まれる全てのオブジェクトを示すと共に、それらが発生するシーケンスでそれらの間に生じるインターアクションを示す。ドライバスタブにおける全てにオペレーションは、モーションコントロールコンポーネント３５から発生する。モーションコントロールコンポーネント３５に加えて、ＸＭＣセットアップコンポーネントは、システム２２をインストールするときにドライバスタブと対話する。以下の全てのシナリオは、ドライバスタブ３６がＯＬＥシステムに既に登録されていると仮定することに注意されたい。このコンポーネントの登録は、セットアップアプリケーション及びセットアップコンポーネントの役割である。
【０１６９】
この説明は、モーションコントロールコンポーネント３５によりドライバスタブにおいて行われる全てのオペレーションについて述べる。各セクションは、ドライバを使用するときにそれらが生じる順序で説明される。
【０１７０】
図３６に示すように、ドライバスタブ３６を使用する前に、モーションコントロールコンポーネント３５は、ドライバスタブのインスタンスを形成し、そしてその形成されたインスタンスを初期化することにより、ドライバスタブを初期化しなければならない。標準的なＯＬＥファンクションＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅをコールすると、第１ステップが完了する。インスタンスが形成された後に、コンポーネント３５は、ドライバスタブエクスポーズド初期化インターフェイス方法をコールしなければならない。初期化中に、次のステップが生じる。
【０１７１】
コンポーネントは、標準的なＯＬＥファンクションＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅをコールすることによりドライバスタブのインスタンスを形成する。ロードされると、使用すべきドライバのＣＬＳＩＤは、初期化エクスポーズドインターフェイス方法をコールするときにドライバスタブへ通される。最初にロードされるときに、ドライバは、既に記憶された登録データをロードする。次いで、コンポーネント３５は、使用すべきドライバのＣＬＳＩＤをＣＤｒｉｖｅｒＳｔｕｂＤｉｓｐオブジェクトへ通し、そしてシステムを初期化するようそれに指令する。ＣＤｒｉｖｅｒＳｔｕｂＤｉｓｐオブジェクトは、次いで、ＣＳＰＩＭｇｒにそれ自身を初期化するように指令し、そしてドライバＣＬＳＩＤをそこに通す。ＣＳＰＩＭｇｒは、ＣＬＳＩＤをＣＳｉｍｐｌｅＤｒｉｖｅｒへ通し、そしてドライバによりエクスポーズされたコアＳＰＩインターフェイスのみに問い合わせするようそれに指令する。ＣＳｉｍｐｌｅＤｒｉｖｅｒは、ドライバのインスタンスをロードし、次いで、ドライバによりエクスポーズされた全てのコアインターフェイスに問い合わせする。
【０１７２】
ドライバスタブが初期化されると、拡張ドライバファンクションを実行するようなオペレーションを実行する準備ができる。図３７は、コンポーネント３５がドライバスタブに拡張ＳＰＩオペレーションを実行するよう指令するときに生じるステップを示す。オペレーションが要求されたときには、次のステップが生じる。
【０１７３】
先ず、コンポーネント３５は、オペレーションを要求し、全ての関連パラメータをドライバスタブへ通す。次いで、ドライバスタブは、ＣＤｒｉｖｅｒＳｔｕｂＤｉｓｐにオペレーションを処理するように指令する。ＣＤｒｉｖｅｒＳｔｕｂＤｉｓｐは、次いで、ＣＳＰＩＭｇｒにＳＰＩ拡張ファンクションを実行するよう指令し、そして適当なＸＭＣ＿ＥＸＴ＿ＳＰＩ識別子をパラメータとして通す。ＣＳＰＩＭｇｒは、ＸＭＣ＿ＥＸＴ＿ＳＰＩ識別子に対応する適当なファンクションをコールする。このファンクションは、拡張ドライバファンクションをシュミレーションし、そしてコアオペレーションに対してＣＳｉｍｐｌｅＤｒｉｖｅｒをコールする。指令されたときに、ＣＳｉｍｐｌｅＤｒｉｖｅｒは、ドライバにより実施されるエクスポーズドファンクションを直接コールすることによりＳＰＩコアファンクションを実行する。
【０１７４】
モーションコントロールコンポーネント３５は、ドライバスタブ３６を用いて終了されたときに、エクスポーズド解除方法をコールすることによりそれを解除しなければならない。解除方法をコールすると、ドライバスタブは、それが使用する全てのリソースを解放する。図３８は、この事象シーケンスを示す。クリーンアッププロセス中に、次のステップが生じる。
【０１７５】
先ず、コンポーネント３５は、その解除方法をコールすることにより全てのリソースを解除するようにドライバスタブに指令しなければならない。呼び出し時に、ドライバコンポーネントは、ＣＤｒｉｖｅｒＳｔｕｂＤｉｓｐオブジェクトへコールを通す。次いで、ＣＤｒｉｖｅｒＳｔｕｂＤｉｓｐオブジェクトは、ＣＳＰＩＭｇｒに、それが使用したいかなるリソースも解除するように指令する。
【０１７６】
ＣＳＰＩＭｇｒは、使用されたＣＳｉｍｐｌｅｒＤｒｉｖｅｒオブジェクトを含む全てのリソースを解除する。解放されると、ＣＳｉｍｐｌｅｒＤｒｉｖｅｒは使用されたいかなるインターフェイスもドライバから解除する。
【０１７７】
図３９は、ドライバスタブモジュール３６のインターフェイスマップを示す。
【０１７８】
VI．ドライバアドミニストレータモジュール
ドライバアドミニストレータ３２は、２つの異なる観点から使用される。ドライバアドミニストレータコントロールパネルアプレット３８を用いてシステムを構成するときには、アプレットがドライバアドミニストレータ３２にオペレーションを実行するように指令する。アプレット３８は、単にユーザインターフェイスを与え、そしてコンポーネント３５は、システム２２と共に使用されるドライバ及びストリームをマネージするという実際の動作を行う。ドライバアドミニストレータコンポーネントをコントロールパネルアプレットと共に使用することはコンポーネント３５を使用する第１の観点である。
【０１７９】
第２の観点において、モニタコントロールコンポーネント３５は、ドライバアドミニストレータコンポーネントを使用して、現在の１組のイネーブルされたドライバ３０に問合せを行う。現在のところ、単一のドライバ動作しか許されないことに注意されたい。明らかに、システム２２は、仮想化された多数のドライバをサポートすることができる。例えば、２つの４軸ドライバがインストールされる場合に、システムを使用するアプリケーションは、あたかもそれらが８軸システムを使用するかのように動作することができる。
【０１８０】
このセクションは、ドライバアドミニストレータ３２を３つの主たる部分において説明する。先ず、ドライバアドミニストレータコンポーネントと対話する全てのモジュールは、それらのインターアクションと共に説明する。次いで、モジュールインターアクションマップは、ドライバアドミニストレータ３２のコンポーネントを実施するのに使用されるＣ＋＋オブジェクト間で行われる全てのインターアクションを表示するように拡張される。この説明は、オブジェクトインターアクションマップと称する。次いで、オブジェクトインターアクションマップは、多数のシナリオ又はシナリオマップを通して実行することによりテストされる。各シナリオマップは、事象と、ドライバアドミニストレータコンポーネントにおいて行われるあるプロセスにおいてそれらが生じる順序とを表示する。
【０１８１】
図４０に示すモジュールインターアクションマップは、全ての２進モジュールと、それらとドライバアドミニストレータ３２のコンポーネントとのインターアクションを表示する。ドライバアドミニストレータＣＰＬ３８及びモーションコントロールコンポーネント３５の両方は、ドライバアドミニストレータ３２のコンポーネントと対話する主モジュールである。
【０１８２】
ドライバアドミニストレータＣＰＬモジュール３８は、ユーザがドライバ及びストリームをシステム２２に追加、構成及び除去できるようにするユーザインターフェイスを与える。ドライバアドミニストレータ３２は、全てのドライバ及びストリームのマネージメントを処理する。たとえコントロールパネルアプレットがユーザインターフェイスを与えても、このモジュール３２は、実際のマネージメント動作を行う。
【０１８３】
更に、ドライバアドミニストレータは、モーションコントロールオペレーションを実行するときに使用すべき現在ドライバをアクセスするようにコンポーネント３５により使用される。例えば、コンポーネント３５がドライバアドミニストレータに問い合わせするときにＡＴ６４００ドライバが現在ドライバとして選択された場合には、ドライバアドミニストレータは、ＡＴ６４００ドライバのＣＬＳＩＤを返送する。
【０１８４】
モジュールインターアクションマップに表示されるドライバアドミニストレータ３２を取り上げ、そしてアドミニストレータ３４を実施するために使用されるＣ＋＋オブジェクト間に生じる全てのインターアクションを表示すると、そのオブジェクトインターアクションマップが形成される。ドライバアドミニストレータ３２のオブジェクトインターアクションマップが図４１に示されている。
【０１８５】
図の各オブジェクトを以下に説明する。
ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐオブジェクトは、エクスポーズされたインターフェイス方法をディスパッチするのに使用されるディスパッチオブジェクトである。ディスパッチプロセス中に、全ての生データが適当なＣ＋＋形態に変換される。例えば、ＯＬＥコンポーネント間に通されるデータの集合は、通常は、生のメモリブロックにパッケージされる。ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐオブジェクトは、出て行くデータをパッキングし、そして到来するデータをアンパッキングするように注意を払う。データのパッキングは、生及びネーティブなＣ＋＋フォーマット間でデータを変換することを含む。
【０１８６】
ＣｄｒｉｖｅｒＩｎｆｏＭａｐオブジェクトは、各ドライバ又はストリームに関する情報を表示するときにドライバアドミニストレータＣＰＬ３８により使用される情報を構成するのに使用される。
ＣＭｏｄｕｌｅＭｇｒオブジェクトは、システムの全てのストリーム及びドライバモジュールをマネージする役目を果たす。登録された全てのドライバのリストは、ＣＭｏｄｕｌｅＭｇｒにより登録データベースに永続的に記憶される。ドライバ又はストリームがアクセスされるたびに、ＣＭｏｄｕｌｅＭｇｒを用いてモジュールが得られる。
ＣＳｉｍｐｌｅＤｒｉｖｅｒオブジェクトは、ドライバコンポーネントと直接通信するのに使用される。全てのＯＬＥ特有の細部は、このオブジェクト内にカプセル化される。
ＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトは、ストリームコンポーネントと直接通信するのに使用される。全てのＯＬＥ特有の細部は、このオブジェクト内にカプセル化される。
【０１８７】
図４２−４９は、ドライバアドミニストレータ３２に生じる全ての主たるシナリオ又はオペレーションを示す。各シナリオマップは、含まれる全てのオブジェクト、及びそれらが生じるシーケンスでそれらの間に行われるインターアクションを表示する。
【０１８８】
図４２を参照すれば、ドライバアドミニストレータコンポーネントを使用する前に、それを初期化しなければならない。図４２は、ドライバアドミニストレータコントロールパネルアプレット又はモーションコントロールコンポーネントのいずれかからドライバアドミニストレータコンポーネントを初期化するプロセスを示す。初期化の間に、次のステップが生じる。
【０１８９】
先ず、コントロールパネルアプレット又はモーションコントロールコンポーネントは、標準的なＯＬＥファンクションＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅをコールすることによりドライバアドミニストレータコンポーネントのインスタンスを形成しなければならない。次いで、エクスポーズされた初期化インターフェイス方法をコールしなければならない。初期化方法がコールされると、ドライバアドミニストレータコンポーネントは、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐにシステムを初期化するように指令する。次いで、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐは、ＣＭｏｄｕｌｅＭｇｒに、それ自身と、それがマネージするモジュールとを初期化するように指令する。ＣＭｏｄｕｌｅＭｇｒは、先ず、登録データベースから全ての情報をロードする。登録された各ドライバに対し、ＣＭｏｄｕｌｅＭｇｒは、標準的なＯＬＥファンクションＣｏＣｒｅａｔｅＩｎｓｔａｎｃをコールすることによりドライバのインスタンスを形成する。次いで、ＣＭｏｄｕｌｅＭｇｒは、各ドライバ初期化方法をコールし、取り付けるべきドライバコンポーネントのＣＬＳＩＤをその方法に通す。ＣＳｉｍｐｌｅＤｒｉｖｅｒは、標準的なＯＬＥファンクションＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅをコールすることによりドライバコンポーネントに取り付ける。
【０１９０】
ドライバアドミニストレータ３２は、ドライバ及びストリームの両方を登録することができる。ドライバの登録は非常に直接的である。というのは、ドライバアドミニストレータは、システムに登録されたドライバをマネージするからである。一方、ストリームの登録は、もっと複雑である。というのは、各ストリームはドライバに登録されねばならず、そしてドライバアドミニストレータではなくドライバがそれに登録されたストリームをマネージしなければならないからである。以下の説明は、ドライバ及びストリームの両方を登録するプロセスを示す。
【０１９１】
ドライバの登録は、モジュールが実際にはドライバであることを照合し、ドライバをロードできることを照合し、そしてドライバ情報を永続的な位置に記憶することを伴う。図４３は、このプロセスを示す。ドライバを登録するときには、次のステップが生じる。
【０１９２】
先ず、ドライバアドミニストレータＣＰＬは、ドライバの名前を通し、ドライバアドミニストレータコンポーネントにそれを登録するよう指令する。次いで、ドライバアドミニストレータコンポーネントは、ドライバ名をＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐへ通し、そしてモジュールを登録するようそれに指令する。ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐは、ＣＭｏｄｕｌｅＭｇｒに新たなドライバを登録するよう指令する。ＣＭｏｄｕｌｅＭｇｒは、新たなＣＳｉｍｐｌｅＤｒｉｖｅｒを形成し、そしてドライバを登録するようそれに要求する。先ず、ＣＳｉｍｐｌｅＤｒｉｖｅｒは、そのＤＬＬＧｅｔＭｏｄｕｌｅＴｙｐｅエクスポーテッドファンクションをコールすることによりドライバが有効であるかどうか照合する。ファンクションがＸＭＣ＿ＤＲＩＶＥＲ＿ＭＴを返送する場合には、ＣＳｉｍｐｌｅＤｒｉｖｅｒは、次いで、ドライバのエクスポーテッドファンクションＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒをコールし、モジュールをＯＬＥシステムに登録する。次いで、エクスポーテッドＤＬＬＧｅｔＣＬＳＩＤファンクションをコールすることによりＣＬＳＩＤがモジュールから問い合わされる。返送されたＣＬＳＩＤは、次いで、標準的なＯＬＥファンクションＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅをコールすることによりドライバをロードするのに使用される。ＣＳｉｍｐｌｅＤｒｉｖｅｒが成功した場合には、ＣＭｏｄｕｌｅＭｇｒは、ドライバＣＬＳＩＤを登録データベースに記憶する。
【０１９３】
ストリームの登録は、ドライバの登録と類似しているが、各ストリームが特定のドライバに登録されねばならないので、若干複雑である。図４４は、ストリームを登録するプロセスを示す。ストリームを登録するときには、次のステップが生じる。
【０１９４】
先ず、ドライバアドミニストレータＣＰＬは、ドライバのＣＬＳＩＤ及びドライバに登録するためのストリームのファイル名をドライバアドミニストレータコンポーネントへ通す。ドライバアドミニストレータコンポーネントは、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐにシステムを登録するよう指令する。ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐオブジェクトは、ＣＭｏｄｕｌｅＭｇｒにストリームを登録するよう指令し、そしてドライバのＣＬＳＩＤ及びストリームの名称をそれに通す。先ず、ＣＭｏｄｕｌｅＭｇｒは、ドライバのＣＬＳＩＤが登録されたドライバの１つであることを照合する。もしそうでなければ、ドライバは、上記のように登録される。
【０１９５】
次いで、ＣＭｏｄｕｌｅＭｇｒは、新たなＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトを形成し、そしてそれにストリームコンポーネントを照合しロードするよう指令する。ＣＳｉｍｐｌｅＳｔｒｅａｍは、先ず、エクスポートされたＤＬＬＧｅｔＭｏｄｕｌｅＴｙｐｅファンクションをコールすることによりモジュールが実際にはストリームコンポーネント２８であることを照合する。ファンクションがＸＭＣ＿ＳＴＲＥＡＭ＿ＭＴを返送する場合には、ＣＳｉｍｐｌｅＳｔｒｅａｍが続き、そのエクスポートされたファンクションＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒをコールすることによりストリームコンポーネントを登録する。最後に、ＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトは、モジュールのエクスポートされたファンクションＤＬＬＧｅｔＣＬＳＩＤをコールすることによりＣＬＳＩＤに対して新たなモジュールに問い合わせる。新たなＣＬＳＩＤは、ＣＳｉｍｐｌｅＳｔｒｅａｍにより、標準的なＯＬＥファンクションＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅを用いてストリームコンポーネントをロードするように使用される。
【０１９６】
ＣＳｉｍｐｌｅＳｔｒｅａｍが成功すると、ストリームのＣＬＳＩＤは、ＣＳｉｍｐｌｅＤｒｉｖｅｒへ通され、これは、ストリームを登録するように指令される。ＣＳｉｍｐｌｅＤｒｉｖｅｒは、ＣＬＳＩＤをドライバコンポーネントへ通し、そしてシステムを登録するようそれに指令する。
【０１９７】
以下の説明は、ドライバ又はストリームのいずれかにおける設定情報について述べる。ユーザがドライバアドミニストレータコントロールパネルアプレット３８において情報を編集するときには、アプレット３８が、編集されるストリーム又はドライバに対して設定を編集するようにドライバアドミニストレータ３２に指令する。次の説明は、この構成プロセスがいかに機能するかを示す。
【０１９８】
ドライバの設定の編集は、ドライブアドミニストレータＣＰＬに表示されたドライバの設定をユーザが変更するときに行われる。これらの設定を変更すると、図４５に示すプロセスがドライバアドミニストレータコンポーネント内に生じるようにされる。次のステップは、ドライバ構成を設定するときに生じる。
【０１９９】
ＣＰＬ３８においてドライバ設定が変更されるときには、ドライバアドミニストレータＣＰＬは、ドライバハンドルに対応するドライバへの適当な変更を行うようにドライバアドミニストレータコンポーネントに指令する。ドライバの新たな値を示すＸＭＣ＿ＤＲＩＶＥＲ＿ＩＮＦＯ構造体がコンポーネント３５へ通される。ドライバアドミニストレータコンポーネントは、ＸＭＣ＿ＤＲＩＶＥＲ＿ＩＮＦＯ構造体及びドライバへのハンドルを取り上げ、ドライバの設定を変更するよう指示する情報をＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐオブジェクトへ通す。
【０２００】
ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐオブジェクトは、ドライバハンドルに対応するドライバを編集するようにＣＭｏｄｕｌｅＭｇｒに指令する。ＣＭｏｄｕｌｅＭｇｒは、ハンドルでＣＳｉｍｐｌｅＤｒｉｖｅｒを位置決めし、そしてその設定をＸＭＣ＿ＤＲＩＶＥＲ＿ＩＮＦＯ構造体に記憶されたものへと変更するようそれに指令する。ＣＳｉｍｐｌｅＤｒｉｖｅｒは、ＸＭＣ＿ＤＲＩＶＥＲ＿ＩＮＦＯ構造体をドライバコンポーネントへ通し、そしてその設定を変更するように指令する。
【０２０１】
図４６に示すように、ユーザがドライバアドミニストレータＣＰＬ３８のストリーム設定を編集するときには、次のステップが生じる。
【０２０２】
ユーザがＣＰＬのストリームの設定を変更した後に、ドライバアドミニストレータＣＰＬは、ドライバアドミニストレータコンポーネントに、ストリームの設定を変更し、そしてストリームを含むドライバへのハンドル、ストリームへのハンドル、及び新たな値を示すＸＭＣ＿ＳＴＲＥＡＭ＿ＩＮＦＯ構造体を通すように指令する。ドライバアドミニストレータコンポーネントは、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐオブジェクトにストリームの設定を変更するように指令する。
【０２０３】
ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐオブジェクトは、ＣＭｏｄｕｌｅＭｇｒにハンドルに対応するストリームの設定を変更するように指令する。
【０２０４】
先ず、ＣＭｏｄｕｌｅＭｇｒは、ドライバハンドルに対応するドライバを探索する。次いで、ストリームハンドルに対応するストリームの設定を変更するようにＣＳｉｍｐｌｅＤｒｉｖｅｒに要求する。ＣＳｉｍｐｌｅＤｒｉｖｅｒは、ストリームハンドルに対応するストリームをサーチし、そしてその設定を、ＸＭＣ＿ＳＴＲＥＡＭ＿ＩＮＦＯ構造体に記憶されたものへと変更するよう指令する。
【０２０５】
ＣＳｉｍｐｌｅＳｔｒｅａｍは、ストリームコンポーネントと直接通信し、そしてその設定を、ＸＭＣ＿ＳＴＲＥＡＭ＿ＩＮＦＯ構造体に記憶されたものへと変更するよう指令する。
【０２０６】
ドライバアドミニストレータ３２から問い合わせることのできる２つの異なる形式の情報、即ち登録された全てのドライバの列挙、及びドライバ情報マップがある。モーションコントロールコンポーネント３５は、モーションコントロールオペレーション中に使用及び制御すべきドライバのセットを選択するときにドライバ列挙を使用する。一方、ドライバ情報マップは、ドライバアドミニストレータＣＰＬ３８により、システムに登録された全てのドライバ及びストリームを示すユーザインターフェイス表示を更新するのに使用される。次の説明は、ドライバ列挙及びドライバ情報マップの両方を問い合わせるプロセスを示す。ドライバ列挙の問合せは、モーションコントロールコンポーネントの初期化中に生じる。
【０２０７】
初期化時に、コンポーネント３５は、モーションコントロールオペレーションを実行するときにどんなドライバを使用すべきか知らねばならない。ドライバアドミニストレータ３２のコンポーネントは、その目的に使用される。ドライバ列挙を問い合わせる、ドライバアドミニストレータ３２のコンポーネントによりエクスポーズされたＩＸＭＣ＿ＥｎｕｍＤｒｉｖｅｒインターフェイスのポインタが返送されるだけである。図４７は、列挙における各ドライバを得るためにインターフェイスを使用するときに発生する事象を示す。インターフェイスを使用すると、次のステップが生じる。
【０２０８】
先ず、モーションコントロールコンポーネント３５は、次のドライバに対してドライバアドミニストレータ３２のコンポーネントに問い合わせする。次いで、ドライバアドミニストレータ３２のコンポーネントは、サポートされた次のドライバを得るようにＣＤｉｖｅｒＡｄｍｉｎＤｉｓｐに指令する。ＣＤｉｖｅｒＡｄｍｉｎＤｉｓｐは、次のドライバを得るようにＣＭｏｄｕｌｅＭｇｒに指令する。次いで、ＣＭｏｄｕｌｅＭｇｒは、列挙のパラメータに基づいて、ＣＬＳＩＤ、又はドライバのＩＵｎｋｎｏｗｎインターフェイスのポインタを返送するようにＣＳｉｍｐｌｅＤｒｉｖｅｒに指令する。ＣＳｉｍｐｌｅＤｒｉｖｅｒがＩＵｎｋｎｏｗｎインターフェイスのポインタを返送するように要求された場合には、インターフェイスがドライバコンポーネントから問い合わされる。
【０２０９】
ドライバアドミニストレータ３２から問い合わされる別の組の情報は、ドライな情報マップより成る。このデータは、システムに登録されたドライバ及びストリームを示す情報を表示するときにドライバアドミニストレータＣＰＬ３８により使用される。図４８に示すように、ドライバインターフェイスマップについてシステムに問い合わせするときは、次のステップが生じる。
【０２１０】
先ず、ドライバアドミニストレータＣＰＬ３８は、現在ドライバ情報マップについてドライバアドミニストレータ３２に問い合わせる。問い合わせ時に、ドライバアドミニストレータコンポーネントは、ＣＤｒｉｖｅｒＩｎｆｏＭａｐクラスを形成してロードするようにＣｄｒｉｖｅｒＡｄｍｉｎＤｉｓｐに指令する。
【０２１１】
ＣｄｒｉｖｅｒＡｄｍｉｎＤｉｓｐは、ＣＤｒｉｖｅｒＩｎｆｏＭａｐを形成する。次いで、ＣｄｒｉｖｅｒＡｄｍｉｎＤｉｓｐは、ＣＤｒｉｖｅｒＩｎｆｏＭａｐをＣＭｏｄｕｌｅＭｇｒへ通し、そして情報マップをロードするようそれに指令する。ＣＭｏｄｕｌｅＭｇｒは、その内部情報に対して登録された各ドライバに問い合わせする。各ＣＳｉｍｐｌｅＤｒｉｖｅｒは、ドライバコンポーネントと直接通信し、全ての関連ドライバ情報についてそれに問い合わせする。次いで、ＣＭｏｄｕｌｅＭｇｒは、ドライバに登録された全てのストリームのリストに対して各ドライバに問い合わせする。ストリーム列挙を使用し、各ＣＳｉｍｐｌｅＤｒｉｖｅｒは、ＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトのアレーを形成し、そしてそのアレーをＣＭｏｄｕｌｅＭｇｒへ返送する。各アレーの各ＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトに対し、ＣＭｏｄｕｌｅＭｇｒは、全ての関連ストリーム情報について問い合わせする。各ＣＳｉｍｐｌｅＳｔｒｅａｍは、ストリームコンポーネントと直接通信し、そしてそのストリームを記述する全ての情報に対しそれに問い合わせする。
【０２１２】
ドライバアドミニストレータＣＰＬ３８又はモーションコントロールコンポーネント３５がドライバアドミニストレータ３２を用いて終了されると、使用したリソースを解放するためにコンポーネント３５を解除しなければならない。図４９は、このプロセスを示す。解除方法をコールした後にクリーンアップするときに、次のステップが生じる。
【０２１３】
先ず、ドライバアドミニストレータＣＰＬ３８又はモーションコントロールコンポーネント３５は、ドライバアドミニストレータ３２のコンポーネントに、その解除方法をコールすることによりそれ自身を解除するよう指令しなければならない。次いで、ドライバアドミニストレータコンポーネントは、システムに使用された全てのリソースを解放するようにＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐオブジェクトに指令する。ＣＤｒｉｖｅｒＡｄｍｉｎＤｉｓｐは、次いで、ＣＭｏｄｕｌｅＭｇｒに、それが使用するリソースを解放するように指令する。先ず、ＣＭｏｄｕｌｅＭｇｒは、ＣＬＳＩＤ及びイネーブル状態について各々問い合わせする全てのＣＳｉｍｐｌｅＤｒｉｖｅｒオブジェクトを通してトレースする。次いで、各ＣＳｉｍｐｌｅＤｒｉｖｅｒが解放される。解放された各ＣＳｉｍｐｌｅＤｒｉｖｅｒオブジェクトは、それに登録されたＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトの全てのアレーを解放する。解放されると、各ＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトは、それが使用した全てのオブジェクトをストリームコンポーネントから解除する。その最終的なクリーンアップにおいて、各ＣＳｉｍｐｌｅＤｒｉｖｅｒは、それが使用する全てのインターフェイスをドライバコンポーネントから解除する。全てのＣＬＳＩＤ及びイネーブル状態情報は、登録データベースに永続的に記憶される。
【０２１４】
図５０は、ドライバアドミニストレータ３２のためのインターフェイスマップを示す。
【０２１５】
VII．ドライバアドミニストレータＣＰＬアプレット
このセクションは、モーションコントロールオペレーションを実行するように指令されたときにコンポーネント３５により後で使用されるドライバ３０及びストリームコンポーネント２８の両方を追加、構成及び除去するようにユーザによって使用されるドライバアドミニストレータコントロールパネルアプレット３８（ＣＰＬ）の設計について説明する。設計については、コントロールパネルアプレットがいかに機能するかを見るために使用される３つの主たる形式の「図」がある。
【０２１６】
先ず、図５１に示されたモジュールインターアクションマップは、ＣＰＬが使用しそして対話する全ての主たる実行可能な且つユーザ対話可能なアイテム即ちモジュールを示す。例えば、ＣＰＬ実行可能によりダイアログが表示されるときには、ダイアログ及びＣＰＬモジュールの両方が互いに対話すると考えられる。技術的には、ダイアログは、スクリーン上に表示される架空のものであるから、モジュールではないが、それでも、モジュールインターアクションマップは、それらがユーザ入力のための重要な行先点であるから、それらをこのように分類する。
【０２１７】
第２に、図５２に示すオブジェクトインターアクションマップは、モジュールインターアクションマップに示されるモジュールを作り上げる全ての主たるオブジェクトを示す。これらオブジェクトは、各オブジェクトを定義するＣ＋＋クラスの実際のインスタンスより成る。オブジェクト間の全てのインターアクションは、このインターアクションマップに描かれる。
【０２１８】
更に、図５３−５７は、オブジェクトインターアクションマップを基礎として用いて描かれた１組のシナリオマップを示す。シナリオインターアクションマップは、特定のオペレーション中に行われるインターアクションを示す。初期化、システムへのドライバの追加、及びドライバによって与えられるサポートの調査は、全て、シナリオインターアクションマップの例である。
【０２１９】
ドライバアドミニストレータ３２の設計目標は、次の通りである。
１．ユーザインターフェイスの分離  −  ドライバアドミニストレータ３２のコンポーネントをコントロールするのに使用される全てのユーザインターフェイスエレメントを実施する。
２．ＯＣＸクライエントへアップグレードできる  −  最終的に、各ドライバ及びストリームは、全ての入力をそれに対応するドライバ又はストリームへ通すＯＣＸを伴う全てのＵＩエレメントを実施することができる。ドライバアドミニストレータＣＰＬ３８は、ＯＣＸクライエントになるように容易にアップグレードできる方法で設計されねばならない。
３．ストリームの独立性を与える  −  ドライバ３０は、動作するためにストリーム２８の使用を要求されてはならない。ドライバアドミニストレータ３２の設計は、動作のためにストリームコンポーネント２８に依存しないよう確保するように変更しなければならない。
４．ウインドウズ９５ＵＩの使用  −  可能であれば、ウインドウズ９５ＵＩエレメントを使用しなければならない。例えば、ウインドウズ９５のルック・アンド・フィール（look-and-feel）を確保するために、ＴｒｅｅＶｉｅｗｓ、ＩｍａｇｅＬｉｓｔｓ、ボタンバー、タブダイアログ及び他のＵＩエレメントを使用しなければならない。
【０２２０】
以下の説明は、コントロールパネルアプレット３８のためのモジュールインターアクションマップを示す。モジュールは、実行可能な２進、外部データファイル、又はユーザと対話するときに使用される主ユーザインターフェイスエレメントのいずれかとして定義される。図５１は、ドライバアドミニストレータコントロールパネルアプレットを実行するときに互いに対話する全てのモジュールを示す図である。
【０２２１】
ドライバアドミニストレータＣＰＬ３８は、コントロールパネルアプレットである。コントロールパネルアプレットは、ウインドウズコントロールパネルがアプレットと通信できるようにする多数のファンクションをエクスポートする特殊なＤＬＬである。
【０２２２】
ドライバアドミニストレータダイアログは、ウインドウズコントロールパネルからコントロールパネルアプレットアイコンを選択するときに現れる主ダイアログである。
【０２２３】
ファイル名に対しユーザに問い合わせするためにブラウズダイアログが使用される。例えば、新たなストリーム又はドライバを追加するときには、ドライバアドミニストレータは、このダイアログを用いて、追加すべき新たなドライバ又はストリームの位置をユーザに尋ねる。
【０２２４】
ビューサポートダイアログは、選択されたドライバ３０により与えられるサポートを表示する。各ドライバは、異なる組の拡張機能をサポートすることができる。このダイアログは、各ドライバによりいかに大きなサポートが与えられるかをユーザに厳密に示し、ドライバを使用するときにアプリケーション内のどのファンクションが働かないか決定できるようにする。
【０２２５】
上記のモジュールインターアクションマップとは異なり、図５２に示すオブジェクトインターアクションマップは、Ｃ＋＋オブジェクトの実際のインターフェイスが各モジュール内で互いにいかに対話するかを示す。
【０２２６】
ダイアログに名前が表示されるオブジェクトにより各ダイアログがマネージされることを示す以外、モジュールＩＡマップとの主たる相違は、ＣＣｏｍＣＰＬ及びＣＤｒｉｖｅｒＡｄｍｉｎ Ｃ＋＋オブジェクトの両方である。これら両方のオブジェクトは、以下に説明する。
【０２２７】
各ダイアログクラスの説明は非常に簡単でありそして上記のダイアログの説明に非常に類似しているので、ここでは説明しない。このセクションは、他の全てのＣ＋＋オブジェクトについて述べる。
【０２２８】
ＣＣｏｍＣＰＬは、テンプレートからのＣＯＭＢｕｉｌｄｅｒアプリケーションにより発生されるＣ＋＋オブジェクトである。これは、コントロールパネルアプリケーションから送られる全てのウインドウズメッセージを処理するのに使用される。
ＣＤｒｉｖｅｒＡｄｍｉｎオブジェクトは、ドライバアドミニストレータ３２のコンポーネントのユーザをドライブ、コントロール及びマネージするのに使用される。例えば、全てのＯＬＥ ２．０インターフェイスマネージメント及びデータ変換は、このオブジェクトにより取り扱われる。データ変換は、標準的なＣ＋＋フォーマットから、ＯＬＥ ２．０データ転送メカニズムで容易に取り扱われる生のフォーマットへデータを変換することを含む。
【０２２９】
シナリオインターアクションマップは、オブジェクトインターアクションマップとほぼ同一であるが、特定オペレーションの一部を占めるオブジェクト及びインターアクションのみを表示する。又、各インターアクションは、オペレーションの実行中にそれらが生じる順序で番号付けされる。以下の説明は、ドライバアドミニストレータＣＰＬ３８アプレットを実行する間に生じる多数のキーオペレーションを示す。
【０２３０】
ユーザが最初にＣＰＬアプレットを実行するときに初期化が生じる。このプロセス中に、他の全てのオブジェクトが初期化され、そして多数のモードがロードされる。初期化プロセス中に２つのステップが行われる。第１に、アプリケーションが初期化され、そして第２に、ドライバアドミニストレータ３２のコンポーネントから問い合わされた値でダイアログが初期化される。次のセクションでその各々を説明する。
【０２３１】
図５３に示すアプリケーションの初期化は、アプリケーションが最初に実行されそして主ダイアログがまだ表示されないときに生じる。アプリケーションを初期化するときには、次のステップが生じる。
【０２３２】
ウインドウズメッセージにより、ウインドウズは、コントロールパネルアプレットが丁度ロードされたことをＣＣｏｍＣＰＬオブジェクトに通知する。ＣＣｏｍＣＰＬは、次いで、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇをロードし、そしてそれに、モードに入る前にダイアログ準備を行うように告げる。次いで、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇは、登録データベースに記憶された設定をロードする。例えば、現在ウインドウ位置及びアクティブなタブがデータベースに記憶される。ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇは、次いで、ＣＤｒｉｖｅｒＡｄｍｉｎクラスをロードし、そしてそれにそれ自身を初期化するよう指令する。初期化中に、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇは、ドライバアドミニストレータ３２のインスタンスを形成し、使用される全てのインターフェイスに問い合わせる。
【０２３３】
アプリケーションが初期化されると、ダイアログに表示されるべきデフォールト設定をセットしなければならない。これらの値は、ダイアログが初期化されるとき、それを表示する直前にセットされる。図５４は、このプロセスを示す。ダイアログを初期化するプロセス中に、次のステップが生じる。
【０２３４】
ＤｏＭｏｄａｌコールの前に生じるダイアログ準備中に、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇは、ダイアログボックスに表示されるべき初期値を設定するときに使用されるべきドライバ列挙についてＣＤｒｉｖｅｒＡｄｍｉｎオブジェクトに問い合わせる。ＣＤｒｉｖｅｒＡｄｍｉｎは、ドライバアドミニストレータ３２コンポーネントを使用してドライバ情報マップについて問合せ、これは、次いで、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇへ返送される。ドライバ情報マップを受け取ると、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇは、この情報を用いて、ドライバ又はストリームのいずれかに関連した全てのユーザインターフェイスアイテムを更新する。
【０２３５】
システム２２にドライバを追加することは、２つのステップに分割することができる。第１に、モジュール名をシステムに追加しなければならない。次いで、ドライバアドミニストレータ３２の主ダイアログは、丁度追加された新たなドライバを反映するようにそれ自身を更新しなければならない。
【０２３６】
ユーザがドライバアドミニストレータ３２の主ダイアログの「追加．．．」ボタンを押すと、ドライバの追加が行われる。図５５は、このプロセスを示す。新たなドライバを追加するときには、次のステップが生じる。
【０２３７】
ドライバを追加するときには、先ず、ユーザは、「追加．．．」ボタンを押さねばならない。このボタンを押した後に、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇは、共通のオープンファイルダイアログをオープンする。ユーザは、追加すべきドライバのファイル名に入り、そしてダイアログをクローズしなければならない。ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇは、次いで、ファイル名をＣＤｒｉｖｅｒＡｄｍｉｎオブジェクトへ通し、そしてモジュールの名前をドライバとしてレジスタに通すＲｅｇｉｓｔｅｒＤｒｉｖｅｒ方法をコールする。ＣＤｒｉｖｅｒＡｄｍｉｎは、次いで、ドライバファイル名をドライバアドミニストレータ３２コンポーネントへ通し、そしてドライバをシステム２２に登録するようそれに指令する。
【０２３８】
主ダイアログを更新するプロセスは、上記ダイアログを初期化するプロセスと同一である。
【０２３９】
新たなドライバを追加するプロセスと同様に、ドライバの除去は、ドライバをシステムから除去しそして主ダイアログを更新することを含む。「除去」ボタンを押すと、ドライバがＸＭＣソフトウェアシステムから除去される。図５６は、このプロセスを示す。ドライバを除去するときには、次のステップが生じる。
【０２４０】
ドライバを除去するために、ユーザは、先ず、「除去」ボタンを選択しなければならない。このボタンを押した後に、選択されたストリームに対する選択されたドライバ又は関連ドライバが除去される。ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇは、ドライバのＸＭＣ＿ＨＤＲＩＶＥＲをＣＤｒｉｖｅｒＡｄｍｉｎへ通しそしてそれに、ＵｎＲｅｇｉｓｔｅｒ方法をコールすることによりドライバを除去するよう指令する。ＣＤｒｉｖｅｒＡｄｍｉｎは、ＸＭＣ＿ＨＤＲＩＶＥＲをドライバアドミニストレータ３２コンポーネントへ通し、そしてそれにドライバを登録解除するよう指令する。
【０２４１】
主ダイアログを更新するプロセスは、上記のダイアログを初期化するプロセスと同一である。
【０２４２】
ビューイングサポートは、選択されたドライバにより実施されるサポートのレベルを調査することを含む。図５７は、ビューサポートダイアログを経てユーザにこの情報を与えるプロセスを示す。以下のステップは、ドライバにより与えられるサポートを調査するときに生じる。
【０２４３】
先ず、ユーザは、ドライバアドミニストレータの主ダイアログの「ビューサポート」ボタンを選択しなければならない。選択されると、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇは、ドライバサポート情報についてＣＤｒｉｖｅｒＡｄｍｉｎに問い合わせる。ＣＤｒｉｖｅｒＡｄｍｉｎは、情報を実際に満たすドライバアドミニストレータ３２コンポーネントへ問合せを通す。問合せ情報が返送されると、ＣＤｒｉｖｅｒＡｄｍｉｎＤｉａｌｏｇは、それをＣＶｉｅｗＳｕｐｐｏｒｔＤｉａｌｏｇへ通す。ＣＶｉｅｗＳｕｐｐｏｒｔＤｉａｌｏｇは、ドライバサポート情報を用いてそれ自身を初期化する。
【０２４４】
VIII．ドライバアドミニストレータＣＰＬアプレット
このセクションは、ドライバアドミニストレータコントロールパネルアプレット３８について説明する。ドライバアドミニストレータ３２を用いてモーションコントロールシステムを構成するときには、ユーザと共に機能する２つの主たるアイテム、即ちドライバ及びストリームが存在する。各ドライバ３０は、ハードウェア特有のコントロールコードを発生し、これは、次いで、選択されたストリームコンポーネント２８へ送られる。ストリームは、ドライバとコントロールコード行先との間のデータ搬送レイヤを容易にする。
【０２４５】
現在のハードウェア設定に基づき、異なるストリームを使用できる。例えば、ハードウェアがＰＣバスに接続された場合には、ＰＣバスストリームを用いて、それと通信される。一方、ハードウェアがシリアルケーブルを経てシリアルＩ／Ｏポートに接続された場合には、シリアルストリームが使用される。最後に、全てのハードウェア構成は、ファイルストリームを使用できる。ファイルストリームを使用するときには、全てのコントロールコードが指定のファイルに送られ、このファイルを後でハードウェアにダウンロードすることができる。
【０２４６】
このセクションは、ドライバ及びストリームの両方と、その各々がいかに構成されるかを示す。このセクションは、ドライバアイテムと、それらを編集するのに使用される全ての特性ページについて最初に説明する。又、このセクションはストリーム及びそれらの特性ページの説明も含む。最後に、このセクションは、ソフトウェアの細部を含むアバウトボックスについても説明する。
【０２４７】
各ドライバの主たる目的は、特定のモーションコントロールアクションを実行するようにハードウェアに指令するハードウェア特有のコントロールコードを発生することである。例えば、このようなアクションは、現在の位置についてハードウェアに問い合わせし、又はシステムの所定の位置へ移動するようにハードウェアに指令することを含む。以下の説明は、各ドライバを構成するのに使用される特性ページについて述べる。
【０２４８】
各ドライバに作用する特性には２つの形式がある。先ず、モーションコントロールコンポーネント３５により推奨値として使用される１組のデフォールトがセットされる。使用されるスケール及び単位は、多数の例示的デフォールト値である。デフォールト値の設定に加えて、ドライバがそれより高等の構成をサポートする場合には、「高等．．．」ボタンを押すと、ドライバ構成をセットするのに使用されるダイヤログボックスが表示される。例えば、ドライバがストリームをサポートしない場合には、ドライバにより与えられる高等な構成のダイアログによりユーザはＩ／Ｏポート及びＩＲＱ設定をセットすることができる。
【０２４９】
ドライバ３０に作用する特性は、次の通りである。
スケーリング  −  スケーリング特性の設定は、モーションコントロールシステム内の全ての軸に使用されるデフォールトスケーリングに作用する。スケーリング値の範囲は、（０．０、１．０）である。デフォールト設定は、ＩＸＭＣ＿ＳｔａｔｉｃＳｔａｔｅインターフェイスを用いてＸＭＣをプログラムするときにオーバーライドすることができる。
単位  −  単位特性の設定は、システム２２をプログラムするときに使用される全ての座標に作用する。
【０２５０】
単位の説明は、次の通りである。
ＭＭ＿ＥＮＧＬＩＳＨ  −  全ての座標の基本単位としてインチを使用する。
ＭＭ＿ＭＥＴＲＩＣ  −  全ての座標の基本単位としてｍｍを使用する。
ＭＭ＿ＮＡＴＩＶＥ  −  ハードウェアシステムにより定義されたネーティブな座標を使用する。ＸＭＣをプログラムするのに使用される座標は、ハードウェア座標に対して１：１でマップされる。
高等．．．  −  このボタンを押すと、ユーザにより編集できるドライバのための高等特性を編集するのに使用されるダイアログが表示される。
【０２５１】
ユーザが特性をセットできるのに加えて、各ドライバ特性ページは、サポートされたハードウェアと、ハードウェアを形成するハードウェアベンダーの両方の完全な名前を表示する。
【０２５２】
ウインドウズの底部に沿ったボタンは、選択されたドライバ又はストリームと共に機能する。以下の説明は、各ボタンと、それが何を行うかについて述べる。
【０２５３】
メークデフォールトボタンを押すと、デフォールトとなるべき現在ドライバが選択される。ストリームが選択された場合には、その親ドライバがデフォールトドライバとなる。デフォールトドライバは、モーションコントロールコンポーネント３５により後で使用される。
【０２５４】
追加．．．ボタンを選択すると、追加モジュールダイアログが表示される。このダイアログは、新たなドライバ及びストリームをシステム２２に追加するのに使用される。選択されると、新たなドライバ又はストリームは、ドライバツリービューに表示される。ストリームを追加するときには、現在選択されたドライバーのもとでストリームが追加される。ストリームをイネーブルするために、ストリーム特性ページに配置されたイネーブルチェックボックスを選択しなければならない。
【０２５５】
除去ボタンを選択すると、選択された現在ドライバ又はストリームが除去される。ドライバが除去された場合には、全てのストリームも除去される。
【０２５６】
ビューサポート．．．ボタンを選択すると、ドライバにより実施されたＸＭＣサポートのレベルを調査するのに使用されるダイアログが表示される。例えば、全てのＡＰＩインターフェイス及びその後の方法が表示される。ドライバ内の実施が欠落して、ＡＰＩインターフェイスが動作するのを防止する場合には、ドライバスタブ３６が使用される。ドライバ３０内の実施の欠落が、ドライバスタブ３６内のオペレーションと置き換えできない場合には、インターフェイス又は方法がディスエイブルされる。
【０２５７】
ＸＭＣサポートビューダイアログに見られる各グラフィックについて、以下に説明する。
Ｄ  −  このグラフィックは、インターフェイス又は方法がドライバ３０により実施されることを意味する。
Ｓ  −  このグラフィックは、インターフェイス又は方法がドライバスタブ３６により実施されることを意味する。
Ｘ  −  このグラフィックは、インターフェイス又は方法がドライバ３０内の実施の欠如によりディスエイブルされることを意味する。
【０２５８】
特性ページと同様に、ドライバの全てのデバッグ設定をセットするためにデバッグページも設けられる。各ドライバは、ドライバをコントロールするのに使用される全てのＡＰＩコールがロギングされることを指定できる。ロギングの設定は、選択される現在ドライバのみに影響する。出力フィールドは、全てのデバッグ情報が送られる出力ストリームを選択できるようにする。ストリームがイネーブルされるときには、デバッグ情報が指定のテキストファイルに送られる。デバッグモニタがイネーブルされたときには、デバッグモニタがもし動作していればそこにデバッグ情報が送られる。ストリームをイネーブルするためのイネーブル動作を使用すると、ストリームがオンになって、発生された全てのデバッグ情報がストリームへと送られる。一度に２つ以上のストリームをイネーブルすることができる。
【０２５９】
サポートされる各デバッグストリームごとにストリームの設定を使用できる。
【０２６０】
テキストファイルは、テキストファイルの名前をセットできるようにする。デバッグモニタのみをイネーブル及びディスエイブルすることができる。
【０２６１】
ストリームは、行先位置へデータを通すためにドライバにより使用される搬送レイヤである。行先位置は、実際のモーションコントロールハードウェアであってもよいし、又はテキストファイルであってもよい。通常、ハードウェアベンダーにより使用されるコントロール言語は、それらのモーションコントロールハードウェアの多数の異なるフレイバ(flavor)によりサポートされる。例えば、あるベンダーは、同じコントロール言語を理解するＰＣバスをベースとする及びシリアルＩ／Ｏをベースとするモーションコントロールハードウェアを有する。このような場合に、各ハードウェアの設定に同じドライバが使用されるが、特定のハードウェア設定に基づき異なるストリームと通信する。グラフ的に、各ストリームは、そのストリームを使用する各ドライバの下にリストする。
【０２６２】
このセクションは、システム２２によりサポートされるストリームと、それらがいかに構成されるかについて説明する。
【０２６３】
ＰＣバスストリームは、ハードウェアで定義された指定のＩ／Ｏポート及びＩＲＱへ書き込むことにより、ＰＣバスをベースとするモーションコントロールハードウェアシステムへ全てのデータを直接送信する。このセクションは、ＰＣバスシステムに使用できる特性及びデバッグ設定の両方について述べる。
【０２６４】
ストリーム特性は、現在選択されたストリームのみに影響する。ユーザは、Ｉ／Ｏポート及びＩＲＱのようなある設定を選択することが要求される。これらの値を設定しないと、ＰＣバスストリームは、ハードウェアと通信することができない。ＰＣバスストリームに影響する特性は、以下に説明する。
【０２６５】
Ｉ／Ｏポートは、ストリームがデータを送信すべきモーションコントロールハードウェアと通信するのに使用される基本的ポートである。
ＩＲＱは、ハードウェアにより使用される割り込み要求レベルである。
【０２６６】
「高等．．．」ボタンを押すと、ユーザが更に高等なストリームオプションを編集できるようにするダイアログが表示される。例えば、ストリームがユーザが編集できるポートＩ／Ｏマップをサポートする場合には、ポートマップがこのダイアログに表示される。このボタンは、ユーザが編集できる高等な特徴をサポートするストリームに対してのみイネーブルされる。
【０２６７】
アプリケーションプログラムをデバッブするときには、どんなコードが実際にハードウェアに送られるか調べることが有用である。ストリームのためのデバッグ設定ページは、ユーザがＣｍｄ及びビットストリームの両方をイネーブル及びディスエイブルできるようにする。Ｃｍｄストリームは、ハードウェアに送られる全てのコマンドコードをロギングするのに使用される。このレベルの細部が充分な情報を与えない場合には、ビットストリームを使用することができる。イネーブルされると、ビットストリームは、各ハードウェアポートを経て送られた全ての値をロギングする。ハードウェアにより使用される各ポートから読み取られ及びそこに書き込まれる全ての値がロギングされる。イネーブルされたときに、両ストリームは、モーションコントロールシステムをプログラムするアプリケーションを著しく低速化することに注意されたい。
【０２６８】
シリアルＲＤ−２３２ストリームは、シリアルＩ／Ｏポートを経てコンピュータに接続されたモーションコントロールハードウェアへドライバからデータを送信するのに使用される。特性及びデバッグの両設定は、選択されたシリアルＲＳ−２３２ストリームのみに影響する。次の説明は、使用できる設定を各々詳細に述べる。
【０２６９】
全てのシリアルＲＥ−２３２特性設定は、ハードウェアと通信するときにどんなＩ／Ｏポート及び通信プロトコルを使用すべきかストリームに知らせるためにユーザによりセットされねばならない。シリアルＲＳ−２３２ストリームに影響する特性を以下に説明する。
【０２７０】
ポートは、ハードウェアが接続されるシリアルポートである。ＣＯＭ１−ＣＯＭ４は、使用することのできる有効なポートである。
【０２７１】
ボーレートは、ハードウェアによりサポートされるデータ送信速度である。
【０２７２】
ハードウェアが選択されたときには、より効率的であるが互換性の低い通信プロトコルを用いてハードウェアへの通信が行われる。このプロトコルが選択されたときにエラーが生じる場合には、ＸＯＮ／ＸＯＦＦ通信プロトコルが使用される。
【０２７３】
ＸＯＮ／ＸＯＦＦ通信プロトコルが選択されたときには、簡単で且つ互換性の高い通信プロトコルが使用される。
【０２７４】
シリアルＲＳ−２３２ストリームのデバッグ設定は、ＰＣバスストリームによりサポートされるものと非常に類似している。シリアルＲＳ−２３２ストリームは、Ｃｍｄストリームによるコマンドロギングのみをサポートし、ビットロギングはサポートしない。
【０２７５】
テキストファイルストリームは、後で使用するためのコントロールコードプログラムを構成するのに使用される。このストリームを使用すると、ＸＭＣソフトウェアがコード発生モードで容易に実行される。このモードで実行するときにはモーションコントロールアクションは行われない。むしろ、コントロールコードプログラムが形成されてファイルに記憶される。その後、プログラムが形成されてセーブされた後に、それらはモーションコントロールハードウェアへダウンロードされ、そして実行される。以下の説明は、テキストファイルストリームに対する特性及びデバッグ設定について述べる。
【０２７６】
テキストファイルストリームを構成するときに設定される主たる特性は、使用すべきファイルの実際の名前及び位置である。設定されると、ストリームを使用する準備ができる。
【０２７７】
以下の特性は、テキストファイルストリームに対して構成される。
ファイル名は、選択されたドライバ３０により発生された全てのコントロールコードを記憶するのに使用されるファイルのファイル名及び位置である。「ブラウズ．．．」ボタンを押すと、使用すべきファイル名及び位置をグラフ的に選択できるようにするダイアログが表示される。
テキストファイルストリームに対して使用できるデバッグ設定はない。
【０２７８】
IX．言語ドライバ
図５８は、言語ドライバ４４を示すと共に、この言語ドライバ４４がストリーム２８、ドライバアドミニストレータ３２、モーションコントロールコンポーネント３５及びレジストリ４２といかに対話するかを示すモジュールインターアクションマップを含む。
【０２７９】
上記のソフトウェアドライバ３０の場合と同様に、サポートされるモーションコントロールデバイスのグループの各モーションコントロールデバイス２０に対して１つの言語ドライバ４４が使用される。言語ドライバ４４は、図１及び図１２−２１を参照して上記したソフトウェアドライバ３０と同じ基本的ファンクションを実行する。ソフトウェアシステム２２に対して、言語ドライバ４４は、ソフトウェアドライバ３０と同様にアクセスされそして応答するが、言語ドライバ４４とソフトウェアドライバ３０との相違は、完全に内部にある。
【０２８０】
これらドライバ３０と４４との間の主たる相違は、言語ドライバ４４が、インデックスフィールド、コマンドフォーマットフィールド及び応答フォーマットフィールドを重要なフィールドとするデータベースを使用することである。データベースの各記録又は行は、所与のドライバファンクションに対応する。
【０２８１】
コマンド及び応答フォーマットテンプレートの目的は、モーションコントロールデバイス２０へ送信されるべきコマンド及びパラメータを含むコマンドデータストリング及びフォーマットデータストリングを構成するプロセスを公式化及び簡単化することである。フォーマットテンプレートは、所与のＳＰＩコマンドに対し、ソフトウェアシステム２２が、所与の言語ドライバ４４に関連した所与のモーションコントロールデバイス２０に関連したベンダー特有のハードウェアコマンド言語といかに通信するかを定義する。従って、コマンドフォーマットテンプレート及び応答フォーマットテンプレートを含む１つのデータベースがこのような各言語に対して形成される。
【０２８２】
コマンドフォーマットフィールドは、コマンドフォーマットテンプレートを含み、そして応答フォーマットフィールドは、応答フォーマットテンプレートを含む。これらテンプレートの各々は、一連のデータ形式識別子、マクロ識別子、シンタックスキャラクタ、及び／又はＡＳＣＩＩキャラクタを含む。
【０２８３】
インデックスフィールドは、各ドライバファンクションに対して独特の値を含み、所与のドライバファンクションに関連したコマンド及び応答フォーマットテンプレートをルックアップするプロセスを容易にする。
【０２８４】
ソフトウェアシステムデザイナーは、上記のデータ形式識別子、マクロ識別子及びシンタックスキャラクタを定義する。一般に、データ形式識別子及びシンタックスキャラクタは、コマンドフォーマットテンプレート及び応答フォーマットテンプレートの両方に共通である。
【０２８５】
マクロ識別子は、通常、コマンドフォーマットテンプレート又は応答フォーマットテンプレートのいずれかに関連したマクロに対応する。ＡＳＣＩＩキャラクタは、所与の言語ドライバ４４に関連したドライバファンクション及び特定のモーションコントロールデバイス２０により定義される。
【０２８６】
言語ドライバ４４により使用されるデータベースの形成を容易にする組織的なツールとしてエクセル(Excel)スプレッドシートが使用される。この目的で使用できるエクセルスプレッドシートの例が図６７に示されている。図６７に示されたスプレッドシートは、タブ区画ファイルとしてセーブされ、次いで、図５９に示すＳＰＩデータベースへとコピーされる。
【０２８７】
図６７に示すスプレッドシートは、単なる組織的ツールであり、ここでは詳細に説明しない。しかし、図６７に例示するスプレッドシートは、記述を伴う典型的なコマンド及び応答データ形式識別子のリストと、コマンド及び応答マクロのリストとを示すことに注意されたい。これらは、他の基礎的なデータ形式を所与のテンプレートに対して必要に応じて組み合わせるデータ形式をプログラマーが定義できるようにする付加的なＳＴＲＵＣＴデータ形式で補足される。
【０２８８】
従って、言語ドライバは、一般的に次のように動作する。上記のように、モーションコンポーネント３５は、言語ドライバ４４により実施されるドライバファンクションをコールし、そして多くの場合に、そのファンクションを実行するのに必要なパラメータを通す。言語ドライバ４４は、そのドライバファンクションのインデックスを使用して、適当なドライバファンクションに関連したコマンドフォーマットテンプレート及び応答フォーマットテンプレートを探す。
【０２８９】
コマンドフォーマットテンプレートを使用し、言語ドライバ４４は、ＡＳＣＩＩキャラクタを含むコマンドデータストリングを構成する。コマンドデータストリングは、言語ドライバ４４に関連したモーションコントロールデバイス２０において所与のドライバファンクションを所望の仕方で実施するのに必要なコマンド及びパラメータを保持する。
【０２９０】
同様に、言語ドライバ４４は、応答フォーマットテンプレートを使用し、コマンドデータストリングに応答して特定のモーションコントロールデバイス２０により送られた応答データストリングをパーズする。従って、応答フォーマットテンプレートは、コントロールアプリケーション２６を意図されたように機能できるようにするに必要なコマンド及び／又はパラメータをモーションコントロールデバイス２０からモーションコントロールコンポーネント３５へ言語ドライバ４４が通せるようにする。
【０２９１】
単一のＳＰＩに関連した１組のコマンド及び応答フォーマットテンプレートが与えられた場合に、コマンドデータストリングを発生しそして応答データストリングをパーズするプロセスを以下に例示する。
【０２９２】
例１
第１の例は、言語ドライバ４４がドライバファンクションIXMC＿DrvExt＿Test::Moveをいかに取り扱うかを示す。
Ｃｍｄフォーマット：D%d,+@[snd]GO%b+:@[snd]
Ｒｓｐフォーマット：@[crIf]>@[rcv]@[crIf]>@[rcv]
ドライバファンクションコール：pXMCDrvExtTest->Move(20.0，30.0)
このファンクションコールは、ｘ方向の２０単位そしてｙ方向に３０単位移動するようにモーションコントロールデバイスに指令する。
【０２９３】
ドライバは、次のようにストリームと通信する。
ステップ１．最初の＠記号までコマンドフォーマットテンプレートにおいてオペレーションを実行する。これは、生のコマンドストリング「Ｄ２０．０、３０．０」を形成する。
ステップ２．最初の＠記号の後に、送信コマンドがあり、ステップ２で形成されたストリングを送信する。言語ドライバは、ここで、コマンドフォーマットテンプレートにおいてＧに達する。
ステップ３．送信コマンドの後に、言語ドライバは、ストリームから応答を読み取り、コマンドストリングが正しく受け取られて処理されたことを確認する。
ストリームから受け取った応答ストリングは、「＼ｒ＼ｎ＞」である。
ステップ４．言語ドライバは、次いで、応答フォーマットテンプレートを使用し、生の応答ストリングをパーズして、オペレーションを照合し、データを抽出する。次いで、言語ドライバは、コマンドフォーマットテンプレートにおいてＧでピックアップし、次の生のコマンドストリング「ＧＯ１１」を構成し、最後のマクロで止める。
【０２９４】
ステップ５．言語ドライバは、コマンドフォーマットテンプレートにおいて最後のマクロでピックアップし、ステップ４で形成された生のコマンドストリングをストリームへ送り、コマンドフォーマットテンプレートを完了する。
ステップ６．再び、送信コマンドの後に、言語ドライバは、ストリームから応答データストリング「＼ｒ＼ｎ＞」を受け取る。
ステップ７．次いで、言語ドライバは、ステップ６で受け取られた応答データストリングをパーズする。
【０２９５】
例２
第２の例は、言語ドライバ４４がドライバファンクションIXMC＿DrvExt＿Test::SetVelocityをいかに取り扱うかを示す。
Ｃｍｄフォーマット：V%If，+@[snd]
Ｒｓｐフォーマット：@[crIf]>@[rcv]
ドライバファンクションコール：pXMCDrvExtTest->SetVelocity(NOP，22.0)
説明：ｙ軸の速度を２２．０にセットする。
生のコマンドストリング：「Ｖ、２２．０：」
生の応答ストリング：「＼ｒ＼ｎ＞」（予想）
【０２９６】
例３
第３の例は、言語ドライバ４４がドライバファンクションIXMC＿DrvExt＿Test::GetVelocityをいかに取り扱うかを示す。
Ｃｍｄフォーマット：GV%b+:@[snd]
Ｒｓｐフォーマット：%d,+@[crIf]>@[rcv]
ドライバファンクションコール：pXMCDrvExtTest->GetVelocity (NOP,&dfY＿Vel)
説明：ｙ軸に対してセットされた速度を得る。
生のコマンドストリング：「ＧＶ０１：」
生の応答ストリング：「，４４．０＼ｒ＼ｎ＞」（予想）
ｄｆＹ＿Ｖｅｌ＝４４．０
【０２９７】
例４
第４の例は、言語ドライバ４４がドライバファンクションIXMC＿DrvExt＿Test::Resetをいかに取り扱うかを示す。
Ｃｍｄフォーマット：!RESET:@[snd]MAO:MCO:LHO:@[snd]
Ｒｓｐフォーマット：@[crIf]VENDOR NAME = MODEL@[rcv]@[crIf]>@[rcv]
ドライバファンクションコール：pXMCDrvExtTest->Reset()
説明：ハードウェアをリセットする。
生のコマンドストリング１：「！ＲＥＳＥＴ：」
生の応答ストリング１：「＼ｒ＼ｎ＊ＶＥＮＤＯＲ ＮＡＭＥ−ＭＯＤＥＬ」（予想）  生のコマンドストリング２：「ＭＡＯ：ＭＣＯ：ＬＨＯ：」
生の応答ストリング２：「＼ｒ＼ｎ＞」（予想）
【０２９８】
言語ドライバ４４は、上記のソフトウェアシステム２２のコンテクストにおいて特に重要なものであるが、この技術は、ＡＳＣＩＩストリングを使用してハードウェアへコマンドを送信しそしてそこから応答を受信するようなハードウェアに広く利用できる。
【０２９９】
言語ドライバ４４を以下に詳細に説明する。言語ドライバ４４は、ドライバアドミニストレータ３２及びモーションコントロールコンポーネント３５の両方により使用される。その主たる目的は、サポートされる特定のハードウェアに対しモーションコントロールコマンドを発生する機能を実施することである。
【０３００】
例えば、Ｃｏｍｐｕｍｏｔｏｒ ＡＴ６４００モーションコントロールハードウェアをコントロールするのに使用されるＡＴ６４００ドライバは、ＡＴ６４００コマンドコードを発生する。システム２２の初期化段階中に、ドライバアドミニストレータ３２は、各言語ドライバ４４と通信し、ユーザがドライバ４４の構成を追加、除去又は変更できるようにする。システム２２を使用するアプリケーションが実行するときに、コンポーネント３５は、言語ドライバ３５と通信し、適当なモーションコントロールオペレーションを実行するように指令する。
【０３０１】
２進コードを直接送信することによりモーションコントロールデバイス２０と通信する上記のドライバ３０とは異なり、言語ドライバ４４は、ＡＳＣＩＩテキストをストリーム２８に送信し、これは、次いで、情報をモーションコントロールデバイス２０へ送信する。
【０３０２】
このセクションは、言語ドライバ４４において実施される特徴、即ち（ａ）ドライバと対話する全ての２進みモジュールを示すと共に、それらが互いにいかに対話するかを示す図５８のモジュールインターアクションマップ；（ｂ）言語ドライバ４４を形成する内部のＣ＋＋オブジェクトを示すと共にこれらオブジェクトが互いにいかに対話するかを示すように拡張されたモジュールインターアクションマップに対応する図５９のオブジェクトインターアクションマップ；（ｃ）あるプロセス中に含まれるＣ＋＋オブジェクト間で行われるインターアクションを示す図６０−６５の多数のシナリオマップ；（ｄ）言語ドライバコンポーネント４４によってエクスポーズされるインターフェイス、使用される全てのデータ構造体、及び使用される各Ｃ＋＋クラスの定義を示すインターフェイスマップ；及び（ｅ）言語ドライバ４４によって使用される典型的なデータベースがいかに構成されるかを示す図６７のテーブルを説明するために多数の図面を参照する。
【０３０３】
図５８のモジュールインターアクションマップは、全ての２進モジュールと、それらと言語ドライバ４４とのインターアクションを示す。ドライバ４４と直接対話する２つのモジュール即ちモーションコントロールコンポーネント３５及びドライバアドミニストレータ３２がある。ドライバアドミニストレータ３２は、ドライバ設定を問合せそして変更し、コンポーネント３５は、システム内のある位置へ移動するようなモーションコントロールオペレーションを実行するようにドライバ４４に指令する。
【０３０４】
より詳細には、図５８のモジュールインターアクションマップは、次のモジュールを含む。
【０３０５】
ドライバアドミニストレータモジュール３２は、各ドライバ及びストリームモジュールをインストール、取り外し、登録及び設定するのに使用される。
【０３０６】
モーションコンポーネントは、アプリケーション２６により使用されるモーションコントロールコンポーネント３５である。このコンポーネント３５は、ドライバアドミニストレータ３２によりそこに通された現在ドライバ４４と通信し、アプリケーション２６により要求されるモーションコントロールオペレーションを実行する。
【０３０７】
言語ドライバ４４は、ハードウェアコマンド言語を形成するＡＳＣＩＩコードを発生する。所与の言語ドライバ４４は、そのドライバ４４に特に接続されたストリーム２８のみと通信する。いったん接続されると、ストリーム２８は、ＰＣバス、シリアルＩ／Ｏ接続、テキストファイル又はデバッグモニタのような行先オブジェクトと通信するのに使用される。
【０３０８】
ストリーム２８は、各ドライバ４４に対してデータ搬送レイヤとして動作する実際のオブジェクトである。各ストリーム２８は、ストリームの形式を定義する異なるターゲットを有する。
【０３０９】
レジストリ４２は、標準的なウインドウズ登録データベースである。
【０３１０】
図５９のオブジェクトインターアクションマップは、ドライバ４４を実施するのに使用される全てのＣ＋＋オブジェクト間で行われるインターアクションを含ませることにより、図５８のモジュールインターアクションマップを更に詳細に分割する。
【０３１１】
図の各オブジェクトを次に説明する。
ＣＤｒｉｖｅｒＯｂｊｅｃｔ：これは、オブジェクトによりエクスポーズされる全てのＯＬＥインターフェイスのためのファンクションシェルを含む全てのＯＬＥ特有の機能を実施する主たるＣ＋＋オブジェクトである。
ＣＤｒｖＣｏｒｅＤｉｓｐ：これは、全てのコアＳＰＩ ＯＬＥインターフェイスファンクションをそれらの各内部実施体へとディスパッチするのに使用されるＣ＋＋オブジェクトである。ＣＬａｎｇＤｒｖＣｏｒｅＤｉｓｐオブジェクトから引き継がれる方法に加えて、このオブジェクトは、コアＸＭＣＳＰＩ ＯＬＥインターフェイス方法のようなドライバ特有のＳＰＩをディスパッチする。ＣＬａｎｇＤｒｖＣｏｒｅＤｉｓｐ：全ての言語ドライバコア機能は、このオブジェクトを経てその内部実施体へとディスパッチされる。例えば、初期化のための一般的な言語ドライバ実施体は、このオブジェクトを経て、ＬＡＮＧ ＤＲＶベースコードライブラリーに存在するその実施体へとディスパッチされる。
【０３１２】
ＣＤｒｖＥｘｔＤｉｓｐ：これは、全ての意図されたＳＰＩ ＯＬＥインターフェイスファンクションをそれらの各内部実施体へとディスパッチするのに使用されるＣ＋＋オブジェクトである。ＣＬａｎｇＤｒｖＥｘｔＤｉｓｐオブジェクトから引き継がれる方法に加えて、このオブジェクトは、拡張ＸＭＣＳＰＩ ＯＬＥインターフェイス方法のようなドライバ特有のＳＰＩをディスパッチする。
【０３１３】
ＣＬａｎｇＤｒｖＥｘｔＤｉｓｐ：全ての言語ドライバ拡張機能は、このオブジェクトを経てその内部実施体へとディスパッチされる。例えば、全てのストリーム処理は、このオブジェクトを経て、ＬＡＮＧ＿ＤＲＶベースコードライブラリーに存在するその実施体へとディスパッチされる。
【０３１４】
ＣＣｏｍｍａｎｄＭｇｒ：このオブジェクトは、ストリームに送られるコマンドを形成しそしてストリームから受け取られる応答を抽出するのに使用される。
ＣＣｏｍｍａｎｄＭｇｒは、ＣＣｏｍｍａｎｄ、ＣＲｅｓｐｏｎｓｅ及びＣＣｏｍｍａｎｄＤａｔａｂａｓｅオブジェクトをマネージするコントロールオブジェクトである。
ＣＣｏｍｍａｎｄ：このオブジェクトは、ＣＳｉｍｐｌｅＳｔｒｅａｍへ送られるコマンドストリングを形成する。形成された各コマンドは、完全なモーションコントロールコマンドストリングである。
【０３１５】
ＣＲｅｓｐｏｎｓｅ：このオブジェクトは、ＣＳｉｍｐｌｅＳｔｒｅａｍにより返送された生の応答ストリングを変換し、そしてそれらをＣ＋＋データ形式に変換する。例えば、位置データを含む応答ストリングを、１組のダブル値に変換することができる。
【０３１６】
ＣＣｏｍｍａｎｄＤａｔａｂａｓｅ：このオブジェクトは、モーションコントロールコマンド言語を形成するコマンドの完全なデータベースを記憶する。このデータベースは、実際の外部データベース（ＳＱＬデータベースのような）又はテキストファイルとして表されるか、或いはカスタムリソースとしてドライバ内に記憶される。現在、言語ドライバは、ドライバモジュール内にカスタムリソースとして記憶されたデータベースのみをサポートする。
【０３１７】
ＣＳＰＩＩｎｆｏ：このオブジェクトは、ＣＣｏｍｍａｎｄＤａｔａｂａｓｅオブジェクト内に記憶された１つのデータベースエントリーを形成する。
ＣＳｔｒｅａｍＭｇｒ：このオブジェクトは、ドライバ内に登録された１組のストリームをマネージする役目を果たす。ストリームを追加、除去及びイネーブルすることができる。イネーブルされたストリームのみが実際にそれらのターゲットへの送信データである。例えば、イネーブルされたＰＣバスストリームのみが、ＰＣバスにプラグインされるモーションコントロールカードへの送信データとなる。
【０３１８】
ＣＳｉｍｐｌｅＳｔｒｅａｍ：このオブジェクトは、その基本的なストリームコンポーネントを初期化し、形成しそして直接通信するのに使用される。
ＣＤｒｉｖｅｒＩｎｆｏＭｇｒ：このオブジェクトは、ＣＤｒｉｖｅｒＩｎｆｏオブジェクトを形成する役目を果たす。
【０３１９】
ＣＤｒｉｖｅｒＩｎｆｏ：このオブジェクトは、言語ドライバ４４を形成する完全な１組の状態データを含む。全てのドライバ設定と、使用される全てのＸＭＣストリームのリストがこのオブジェクト内に記憶される。基本的な問合せは、このオブジェクトに直接送られる。このオブジェクトに接続する種々のマネージャーオブジェクトの１つにより更に複雑なオペレーションが取り扱われて、オペレーションが実行され、そしてそこから切断される。
【０３２０】
ＣＲｅｇｉｓｔｒｙＭｇｒ：このオブジェクトは、ＣＤｒｉｖｅｒＩｎｆｏオブジェクト内に記憶された情報を登録データベースへ及びそこからセーブ及びロードするのに使用される。特に、ＩＣＯＭ＿ＰｅｒｓｉｓｔＲｅｇＤＢインターフェイスが呼び出されたときにコールされるコードを含む。
【０３２１】
ＣＲｅｇｉｓｔｒｙ：このオブジェクトは、キーを形成し、値をセーブしそして値を問い合わせるような全ての登録データベースオペレーションを実行する。
【０３２２】
言語ドライバ４４に生じる全ての主たるシナリオ又はオペレーションは、図６０−６６を参照して以下に説明する。これらの図に含まれた各々のシナリオマップは、含まれた全てのオブジェクトと、それらの間に生じるインターアクションをそれらが発生する順序で示す。
【０３２３】
言語ドライバ４４には２つの形式のオペレーションが生じる。先ず、ドライバアドミニストレータ３２は、ストリームを追加し又はドライバを構成するといったオペレーションを開始する。第２に、モーションコントロールコンポーネント３５は、アプリケーションが実際に実行されるときにドライバにおいてオペレーションを開始する。
【０３２４】
図６０−６４を参照し、ドライバアドミニストレータ３２によりドライバ４４において行われる全てのオペレーションについて説明する。各図は、ドライバ４４を使用するときにそれが生じる順序で説明する。
【０３２５】
ドライバは、ＸＭＣモーションコンポーネントにより使用される前に、ＯＬＥシステムに登録されねばならない。図６０に示すように、ドライバを登録するために、ドライバアドミニストレータは、先ず、登録されているモジュールが実際に適切な言語ドライバであることを照合し、次いで、ドライバを登録するためのエクスポートされたファンクションＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒをコールする。システム２２の各モジュールは、ＤＬＬＧｅｔＭｏｄｕｌｅＴｙｐｅと称するファンクションをエクスポートする。このファンクションは、モジュールが適切なドライバコンポーネントであることを照合するのに使用される。
【０３２６】
次に、ドライバアドミニストレータは、ＯＬＥ ＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅファンクションを用いてコンポーネントをロードすることができる。初期化プロセス中に、ドライバは、全ての登録データをロードし、そしてＣＤｒｉｖｅｒＩｎｆｏ及び全てのＣ＋＋マネージャーオブジェクトを初期化する。
【０３２７】
図６０に示す各ステップについて以下に詳細に説明する。
１．初期化の間に、ドライバアドミニストレータは、ストリームコンポーネントを含むＤＬＬをロードし、モジュールがＸＭＣドライバであることを照合しなければならない。これを行うために、ドライバアドミニストレータは、ドライバによりエクスポートされたＤＬＬＧｅｔＭｏｄｕｌｅＴｙｐｅファンクションをコールする。このファンクションが、値ＸＭＣ＿ＤＲＩＶＥＲ＿ＭＴを上位バイトに含む値を返送する場合には、ドライバアドミニストレータは、そのエクスポートされたファンクションＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒをコールするように進んで、それにより、ドライバを登録する。コールされると、ＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒの実施体は、ＯＬＥコンポーネントを登録するに必要な全てのＯＬＥ ２．０登録情報をウインドウズ登録データベースに書き込む。
２．次いで、ドライバアドミニストレータは、ドライバモジュールにそのＣＬＳＩＤについて問い合わせしなければならない。ドライバのエクスポートされたファンクションＤＬＬＧｅｔＣＬＳＩＤをコールすると、ＣＬＳＩＤが返送される。ドライバアドミニストレータは、ＣＬＳＩＤを得ると、標準的なＯＬＥファンクションＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅをコールすることによりドライバのインスタンスを形成することができる。
３．ＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅは、ＣＤｒｉｖｅｒＯｂｊｅｃｔにより実施されるＩＣＯＭ＿Ｂａｓｅ：：Ｉｎｉｔｉａｌｉｚｅ方法をコールすることによりコンポーネントを自動的に初期化する。
４．ＩＣＯＭ＿Ｂａｓｅ：：Ｉｎｉｔｉａｌｉｚｅの実施は、ＣＤｒｉｖｅｒＣｏｒｅＤｉｓｐにそれ自身を初期化するように指令する。
５．その初期化内で、ＣＤｒｉｖｅｒＣｏｒｅＤｉｓｐオブジェクトは、ＣＣｏｍｍａｎｄＭｇｒでスタートして、そのマネージャーオブジェクトの各々を初期化する。
【０３２８】
６．その初期化中に、ＣＣｏｍｍａｎｄＭｇｒは、ＣＣｏｍｍａｎｄＤａｔａｂａｓｅにそれ自身をロードするように指令する。
７．データベースをロードするために、ＣＣｏｍｍａｎｄＤａｔａｂａｓｅオブジェクトは、データベースを読み取り、そしてデータベースエレメントのＣＳＰＩＩｎｆｏリストを形成する。
８．ＣＣｏｍｍａｎｄＭｇｒを初期化した後に、ＣＤｒｉｖｅｒＣｏｒｅＤｉｓｐオブジェクトは、ＣＤｒｉｖｅｒＩｎｆｏＭｇｒオブジェクトにＣＤｒｉｖｅｒＩｎｆｏオブジェクトを形成するように指令し、これは、後で、言語ドライバ４４コンポーネントの内部状態を記憶する。
９．ＣＤｒｉｖｅｒＩｎｆｏＭｇｒオブジェクトは、ＣＤｒｉｖｅｒＩｎｆｏオブジェクトを形成形成しそしてそれをディスパッチオブジェクトに返送する。このオブジェクトのポインタは、後で、ＣＤｒｉｖｅｒＯｂｊｅｃｔがＩＣＯＭ＿Ｂａｓｅ２：：ＳｅｔＳｔａｔｅＨａｎｄｌｅをコールするときに、コンポーネント状態ハンドルに記憶される。
１０．次いで、ＣＤｒｖＣｏｒｅＤｉｓｐオブジェクトは、全てのストリームオペレーションを実行するのに使用されるＣＳｔｒｅａｍＭｇｒを初期化する。
１１．次いで、ＣＤｒｖＣｏｒｅＤｉｓｐオブジェクトは、全ての登録データベースオペレーションを実行するのに使用されるＣＲｅｇｉｓｔｒｙＭｇｒを初期化する。
１２．最後に、ＣＤｒｉｖｅｒＯｂｊｅｃｔは、ＣＤｒｖＥｘｔＤｉｓｐオブジェクトを初期化する。
【０３２９】
全ての初期化は、ＣＯＭ Ａｕｔｏ−Ｉｎｉｔメカニズムを介して開始されることに注意されたい。Ａｕｔｏ−Ｉｎｉｔは、オブジェクトを形成するときに生じる。ＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅをコールするか又はＩＣｌａｓｓＦａｃｔｏｒｙ：：ＣｒｅａｔｅＩｎｓｔａｎｃｅ方法をコールするときに、内部のＣＯＭ実施体は、ＩＣＯＭ＿Ｂａｓｅ：：Ｉｎｉｔｉａｌｉｚｅ方法をコールする。この方法は、このセクションに述べる完全な初期化プロセスを開始する。
【０３３０】
ドライバを初期化した後に、ドライバアドミニストレータは、それに対してオペレーションを実行する。例えば、ドライバアドミニストレータは、ドライバにストリームを追加又は除去するように要求する。図６１は、ドライバが新たなストリームを追加するように要求されたときに生じる事象のシーケンスを示す。
【０３３１】
ストリームを追加するときには、次のステップが生じる。
１．ドライバアドミニストレータは、ドライバに新たなストリームを追加するよう指令し、そして追加されるべきストリームのファイル名及びＣＬＳＩＤをドライバへ通す。
２．次いで、ドライバは、ファイル名及びＣＬＳＩＤをＣＤｒｉｖｅｒＯｂｊｅｃｔオブジェクトへ通し、そしてそのＣＬＮＧＳｔｒｅａｍＭｇｍｔ：：ＡｄｄＳｔｒｅａｍに埋め込まれたＣ＋＋クラス方法をコールすることによりストリームを追加するようにそれに指令する。
３．ＯＬＥインターフェイスを実施する埋め込まれたＣ＋＋オブジェクトは、ＣＤｒｖＥｘｔＤｉｓｐオブジェクトにストリームを追加するよう指令し、それにコンポーネント状態データのハンドルを通す。
４．ＣＤｒｖＥｘｔＤｉｓｐオブジェクトは、先ず、コンポーネント状態データをＣＤｒｉｖｅｒＩｎｆｏオブジェクトのポインタへ挿入する。
５．次いで、ＣＳｔｒｅａｍＭｇｒは、ＣＤｒｉｖｅｒＩｎｆｏオブジェクトポインタに接続され、そして新たなストリームを追加するように指令される。
６．新たなストリームを追加するために、ＣＳｔｒｅａｍＭｇｒは、ＣＳｉｍｐｌｅＳｔｒｅａｍを用いて、ストリームコンポーネントをロードしそして形成する。
７．ＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトは、先ず、ファンクションポインタを、コンポーネントによりエクスポーズされたＤｌｌＧｅｔＣＬＳＩＤ、ＤｌｌＧｅｔＭｏｄｕｌｅＴｙｐｅ及びＤｌｌＲｅｇｉｓｔｅｒＳｅｒｖｅｒファンクションにセットする。モジュールをロードする前に、ＣＳｉｍｐｌｅＳｔｒｅａｍは、先ず、モジュール形式をＸＭＣ＿ＳＴＲＥＡＭ＿ＭＴモジュール形式と比較することによりモジュールが実際にＸＭＣストリームであることを確保する。もしそうであれば、コンポーネントは、ＯＬＥコンポーネントとして登録データベースに登録される。
８．手前のステップで問い合わせされたＤｌｌＧｅｔＣＬＳＩＤを用いて、ＣＳｉｍｐｌｅＳｔｒｅａｍは、コンポーネントＣＬＳＩＤを得、そしてＯＬＥオブジェクトのインスタンスをロードするためにＣｏＣｒｅａｔｅｌｎｓｔａｎｃｅをコールする。
９．ＣＳｉｍｐｌｅＳｔｒｅａｍが完了した後に、ＣＳｔｒｅａｍＭｇｒは、ストリームをＣＤｒｉｖｅｒＩｎｆｏのストリームアレーに追加する。
【０３３２】
初期化の後に、ドライバから要求される別のオペレーションは、現在設定についてそれに問い合わせすることである。サポートするハードウェアの名前のようなドライバに関する情報を表示した後に、ドライバアドミニストレータは、その情報についてドライバに問い合わせする。図６２は、ドライバの設定についてドライバに問い合わせするプロセスを例示する。
【０３３３】
情報についてドライバに問い合わせるときには、次のステップが行われる。
１．ドライバアドミニストレータは、ドライバの情報を問い合わせるのに使用されるインターフェイス方法をコールし、そしてそのコールをＸＭＣ＿ＤＲＩＶＥＲ＿ＩＮＦＯ構造体のポインタへ通す。
２．そのコールは、ＣＤｒｉｖｅｒＯｂｊｅｃｔの埋め込まれたＣ＋＋クラスにより実施されるＯＬＥインターフェイス方法の実施により取り扱われる。
３．インターフェイスを取り扱うのに使用される埋め込まれたＣ＋＋オブジェクトは、ＣＤｒｖＣｏｒｅＤｉｓｐ又はＣＤｒｖＥｘｔＤｉｓｐオブジェクトにオペレーションを実行するよう指令し、そしてオブジェクトハンドルをコンポーネント状態データへ通す。
４．ディスパッチオブジェクトは、状態ハンドルをＣＤｒｉｖｅｒＩｎｆｏオブジェクトポインタへ挿入する。いったん変換されると、ＣＤｒｉｖｅｒＩｎｆｏオブジェクトは、適当なデータについて問い合わされる。
【０３３４】
要求があったときに、ドライバは、その全構成を登録データベースへ又はそこからセーブ又はロードすることができる。このオペレーションは、ＸＭＣドライバアドミニストレータコンポーネントにより使用され、該コンポーネントは、全てのＸＭＣ構成データを登録データベースに記憶する。図６３は、ＸＭＣドライバアドミニストレータコンポーネントがドライバにその情報をレジストリからロードするよう指令するときに行われる事象のシーケンスを示す。
【０３３５】
登録プロセス中に、次のステップが生じる。
１．先ず、ドライバによりエクスポーズされるＩＣＯＭ＿ＰｅｒｓｉｓｔＲｅｇＤＢ ＯＬＥインターフェイスを使用して、ドライバアドミニストレータは、コンポーネントにその構成データをロードするよう指令する。
２．全てのＩＣＯＭ＿ＰｅｒｓｉｓｔＲｅｇＤＢコールを取り扱うのに使用されるＣＤｒｉｖｅｒＯｂｊｅｃｔの埋め込まれたオブジェクトが呼び出され、オペレーションを実行する。
３．呼び出されると、埋め込まれたオブジェクトは、ＣＤｒｖＣｏｒｅＤｉｓｐオブジェクトにロードを実行するよう指令し、それにコンポーネント状態データへのハンドルを通す。
４．ＣＤｒｖＣｏｒｅＤｉｓｐオブジェクトは、先ず、状態ハンドルをＣＤｒｉｖｅｒＩｎｆｏオブジェクトポインタへ挿入する。
５．次いで、ＣＲｅｇｉｓｔｒｙＭｇｒがＣＤｒｉｖｅｒＩｎｆｏポインタへ接続され、そしてその内容を登録データベースへ又はそこからロードするように指令される。
６．ＣＲｅｇｉｓｔｒｙＭｇｒは、全ての一般的なドライバ情報をロードし、そしてＣＤｒｉｖｅｒＩｎｆｏオブジェクトに記憶されるドライバのＸＭＣ ＤＲＩＶＥＲ＿ＩＮＦＯデータ構造体を満たす。
【０３３６】
７．ドライバがストリーム情報を記憶した場合には、ＣＲｅｇｉｓｔｒｙＭｇｒは、ストリーム情報をロードし、そしてＸＭＣ＿ＳＴＲＥＡＭ＿ＩＮＦＯデータ構造体を満たす。次いで、この構造体を用いて、新たなＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトが形成される。
８．ストリームを形成するときには、ＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトは、先ず、エクスポーズされたファンクションＤｌｌＧｅｔＭｏｄｕｌｅＴｙｐｅを問合せ及びコールし、そしてモジュールが実際にストリームコンポーネントであることを照合する。モジュールがそうである場合には、ＣＳｉｍｐｌｅＳｔｒｅａｍは、次いで、コンポーネントを登録するためにコンポーネントによりエクスポーズされたＤＬＬＲｅｇｉｓｔｅｒＳｅｒｖｅｒファンクションを問合せ及びコールする。
９．コンポーネントを登録した後に、ＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトは、エクスポートされたファンクションＤｌｌＧｅｔＣＬＳＩＤを問合せ及びコールし、コンポーネントＣＬＳＩＤを得る。ＣＬＳＩＤを用いて、ＣｏＣｒｅａｔｅＩｎｓｔａｎｃｅがコールされ、ＯＬＥオブジェクトのインスタンスが形成される。
１０．ＣＳｉｍｐｌｅＳｔｒｅａｍが完了すると、ＣＲｅｇｉｓｔｒｙＭｇｒは、ＣＳｔｒｅａｍＭｇｒの一時的インスタンスをＣＤｒｉｖｅｒＩｎｆｏオブジェクトポインタに接続し、そして新たなストリームを追加するようそれに指令する。
１１．ＣＳｔｒｅａｍＭｇｒは、ＣＤｒｉｖｅｒＩｎｆｏのストリームアレーを直接操作して新たなストリームを追加する。追加されると、ＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトの新たなインスタンスが形成され、そしてＣＳｔｒｅａｍＭｇｒへ通されたＣＳｉｍｐｌｅＳｔｒｅａｍに付加される。
１２．新たなＣＳｉｍｐｌｅＳｔｒｅａｍは、それ自身がストリームに付加されると、それに通されたＩＸＭＣ＿ＳｔｒｅａｍＩｎｉｔインターフェイスに、コンポーネントの参照カウントをバンプアップするのに用いた全てのインターフェイスについて問い合わせる。
【０３３７】
ドライバアドミニストレータは、ドライバを用いて実行した後に、そのエクスポーズされた解除方法をコールすることによりドライバを解除しなければならない。この方法をコールすると、ドライバは、使用した全てのリソースを解除するように指令される。図６４は、ドライバコンポーネントを解除するプロセスを示す。
【０３３８】
クリーンアッププロセス中に、次のステップが生じる。
１．先ず、ＸＭＣドライバアドミニストレータ又はＸＭＣモーションコンポーネントは、最後のＩＵｎｋｎｏｗｎ：：Ｒｅｌｅａｓｅをコールする。
２．その呼び出し時に、ＣＤｒｉｖｅｒＯｂｊｅｃｔにより実施されるＩＵｎｋｎｏｗｎ：：Ｒｅｌｅａｓｅ方法がコールされる。この方法のコールにより、内部のＯＬＥ参照カウントがゼロにされた後に、ドライバは、使用した全てのリソースをクリーンアッブするためにＩＣＯＭ＿Ｂａｓｅ：：Ｕｎｉｎｉｔｉａｌｉｚｅの実施体をコールする。
３．先ず、ＩＣＯＭ＿Ｂａｓｅ：：Ｕｎｉｎｉｔｉａｌｉｚｅは、ＣＤｒｖＥｘｔＤｉｓｐに、それが使用したリソースをクリーンアップするよう指令する。
４．次いで、ＩＣＯＭ＿Ｂａｓｅ：：Ｕｎｉｎｉｔｉａｌｉｚｅは、ＣＤｒｖＣｏｒｅＤｉｓｐオブジェクトに、それが使用したリソースをクリーンアップするよう指令する。
【０３３９】
５．ＣＤｒｖＣｏｒｅＤｉｓｐオブジェクトは、全てのマネージャーオブジェクトのインスタンスを含むので、最初にＣＣｏｍｍａｎｄＭｇｒにそれが使用したリソースをデストロイ(destroy)するよう指令することにより、それらをクリーンアップし始める。内部的に、ＣＣｏｍｍａｎｄＭｇｒは、ＣＣｏｍｍａｎｄＤａｔａｂａｓｅ及びその全ての内容をデストロイする。
６．次いで、ＣＤｒｖＣｏｒｅＤｉｓｐオブジェクトは、それらのデストラクタをコールすることにより、他の全てのマネージャーオブジェクトをデストロイする。
７．最後のステップとして、ＩＣＯＭ＿Ｂａｓｅ：：Ｕｎｉｎｉｔｉａｌｉｚｅ方法は、ＣＤｒｉｖｅｒＩｎｆｏオブジェクトのポインタを含む状態ハンドルを削除する。デストロイされたときには、ＣＤｒｉｖｅｒＩｎｆｏオブジェクトは、各ＣＳｉｍｐｌｅＳｔｒｅａｍオブジェクトを削除し、これは、次いで、ＸＭＣストリームコンポーネントのインスタンスを解除する。ＸＭＣストリームコンポーネントの最後のインスタンスが解除されると、コンポーネントｄ１１がメモリから解放される。
【０３４０】
ドライバがＸＭＣシステムに首尾良くインストールされそしてドライバアドミニストレータを用いて構成された後に、ＸＭＣモーションコントロールコンポーネントにより使用するための準備ができる。コンポーネントは、コンポーネントを用いてアプリケーションから要求されたモーションコントロールオペレーションを実行するときにドライバを使用する。図６５は、コンポーネントから指令されたオペレーションであって、ドライバにおいて実行することのできるオペレーションを示す。
【０３４１】
オペレーションの前に、ＸＭＣモーションコンポーネントは、そのドライバ列挙についてドライバアドミニストレータ３２コンポーネントに問い合わせしなければならない。返送される列挙は、ＸＭＣモーションコンポーネントによりＸＭＣ ＳＰＩオペレーションを実行するよう指令された全てのイネーブルされたドライバをアクセスするのに使用される。
【０３４２】
ドライバ列挙を収集すると、モーションコントロールコンポーネント３５は、イネーブルされたドライバに、あるコマンドオペレーションを実行するよう指令することができる。コマンドオペレーションは、システム内の特定の位置へ移動したり又は現在位置についてシステムに問い合わせするといった標準的なモーションコントロールオペレーションである。図６５は、あるオペレーションを実行するようにドライバに指令するプロセスを示す。
【０３４３】
あるオペレーションを実行するようにドライバに指令するときには、次のステップが生じる。
１．先ず、モーションコンポーネントは、ある位置へ移動したり現在位置についてシステムに問い合わせしたりといったオペレーションを実行するようにドライバに指令する。
２．ＸＭＣＳＰＩの呼び出しは、コンポーネントによりエクスポーズされた全てのＯＬＥインターフェイスを実施するＣＤｒｉｖｅｒＯｂｊｅｃｔにより取り扱われる。
３．ＣＤｒｉｖｅｒＯｂｊｅｃｔは、オペレーションがコアＸＭＣＳＰＩであるか拡張ＸＭＣＳＰＩであるかに基づいて、ＣＤｒｖＣｏｒｅＤｉｓｐ又はＣＤｒｖＥｘｔＤｉｓｐのいずれかにオペレーションを実行するよう指令する。コンポーネントの状態ハンドルは、コール時に、ディスパッチオブジェクトへ通される。
４．ディスパッチオブジェクトは、次いで、状態ハンドルをＣＤｒｉｖｅｒＩｎｆｏオブジェクトポインタへ挿入する。
【０３４４】
５．次いで、ディスパッチオブジェクトは、ＣＣｏｍｍａｎｄＭｇｒをＣＤｒｉｖｅｒＩｎｆｏオブジェクトポインタに接続し、そして送られたデータベースインデックスに対応するオペレーションを実行するようにそれに指令する。データベースインデックスは、コールされたＸＭＣＳＰＩに対応し、そのＳＰＩコールの言語データベースエントリーを探索するのに使用される。
６．ＣＣｏｍｍａｎｄＭｇｒは、インデックスに対してＣＣｏｍｍａｎｄＤａｔａｂａｓｅをサーチし、そしてＸＭＣＳＰＩオペレーションに対応するＣＣｏｍｍａｎｄオブジェクトを形成する。
７．次いで、ＣＣｏｍｍａｎｄＭｇｒは、ＣＤｒｉｖｅｒＩｎｆｏを直接アクセスし、そしてＣＣｏｍｍａｎｄオブジェクトにより形成されたコマンドストリングを全てのイネーブルされたストリームへ通す。
８．各イネーブルされたストリームは、ＡＳＣＩＩテキストをそのターゲットに送信する。例えば、ＰＣバスストリームは、そのデータを、ＰＣバスに配置されたモーションコントロールカードへ送る。一方、テキストファイルストリームは、そのデータを、その関連テキストファイルに送信する。
９．もし所望ならば、ＣＣｏｍｍａｎｄＭｇｒは、それに送られたコマンドの結果について第１の読み取り可能なストリームに問い合わせする。
【０３４５】
１０．ＣＳｉｍｐｌｅＳｔｒｅａｍは、ターゲットから生の応答を読み取り、そしてそれをＣＣｏｍｍａｎｄＭｇｒへ返送する。
１１．生の応答を受け取ると、ＣＣｏｍｍａｎｄＭｇｒは、ＣＲｅｓｐｏｎｓｅオブジェクトを使用し、ＸＭＣＳＰＩデータベースエントリーに対応する応答フォーマットに基づき生の応答をパーズする。全ての応答パラメータは、コールチェーンを返送され、そして最終的に、オリジナルの発呼者、即ちＸＭＣモーションコンポーネントの手で終わる。
【０３４６】
ＸＭＣドライバコンポーネントを解除することによりＸＭＣモーションコンポーネントによって開始されるクリーンアップは、ドライバアドミニストレータ３２のオブジェクトがコンポーネントを解除するときに生じるものと同じである。
【０３４７】
以下の説明は、エクスポーズされる実際のＯＬＥインターフェイスと、データを通すときに使用されるデータ構造体の定義と、ドライバにより内部に使用される各クラスの定義とについて述べる。
【０３４８】
以下のダイヤグラムは、ドライバ・コンポーネントの解釈度に対して特定にドライバによりエクスポーズされる全てのインターフェイスについて示す。図６６は、コンポーネントによりエクスポーズされるインターフェイスをグラフ的に示す。
【０３４９】
エクスポーズされる２つの標準的なインターフェイス、例えば、ＩＵｎｋｎｏｗｎ及びＩＣｌａｓｓＦａｃｔｏｒｙ以外は、コンポーネントによりエクスポーズされるインターフェイスには３つのカテゴリーがある。これら３つのカテゴリーは、次の通りである。
【０３５０】
ＣＯＭ：ＣＯＭ＿ｐｒｅｆｉｘを伴う全てのインターフェイス名で、一般的なＣＯＭ機能を実施する。例えば、ＩＣＯＭ＿Ｂａｓｅ、ＩＣＯＭ＿Ｂａｓｅ２、ＩＣＯＭ＿Ｐｅｒｓｉｓｔ２及びＩＣＯＭ＿ＰｅｒｓｉｓｔＲｅｇＤＢインターフェイスは、全て、このカテゴリーに入る。
【０３５１】
ＬＮＧ：ＬＮＧ＿ｐｒｅｆｉｘを伴う全てのインターフェイス名で、一般的な言語ドライバ機能を実施する。例えば、ＩＬＮＧ＿ＤｒｖＣｏｒｅ＿Ｉｎｉｔ、及びＩＬＮＧ＿ＤｒｖＥｘｔ＿ＳｔｒｅａｍＭｇｍｔインターフェイスは、このカテゴリーに入る。
【０３５２】
ＸＭＣ：ＸＭＣ＿ｐｒｅｆｉｘを伴う全てのインターフェイス名で、ＸＭＣＳＰＩ（ドライバ）機能を実施する。
【０３５３】
以下のセクションは、ＣＯＭ及びＬＮＧの両方のカテゴリーに入るインターフェイスについて説明する。他の全てのインターフェイスは、ＸＭＣＳＰＩに特有のもので、モーションコントロールオペレーションを実行するという唯一の目的に使用される。
【０３５４】
ＩＣＯＭ＿Ｂａｓｅインターフェイスにおける次のエクスポーズされた方法はコンポーネントを初期化及び非初期化するのに使用される。これらの方法の各々は、全てのコンポーネントインターフェイスにより実施される隠れた初期化及び非初期化方法をコールする。
【０３５５】
2008159046.tif 000003
【０３５６】
ＩＣＯＭ＿Ｂａｓｅ２インターフェイスは、ＩＣＯＭ＿Ｂａｓｅインターフェイスから引き継ぎ、そして内部コンポーネント状態ハンドルをマネージするのに使用される多数の方法を付加する。更に、ある方法は、ユーザが、コンポーネントにより返送されるＨＲＥＳＵＬＴを人間が読めるテキストストリングに変換できるようにする。次は、ＩＣＯＭ＿Ｂａｓｅ２インターフェイスの説明である。
【０３５７】
2008159046.tif 000004
【０３５８】
ＩＣＯＭ＿Ｐｅｒｓｉｓｔ２インターフェイスは、ＩＰｅｒｓｉｓｔ標準ＯＬＥインターフェイスから引き継ぎ、そしてＣＬＳＩＤ及びモジュール形式に問い合わせるのに使用される多数の方法を追加する。次は、ＩＣＯＭ＿Ｐｅｒｓｉｓｔ２インターフェイスの説明である。
【０３５９】
2008159046.tif 000005
【０３６０】
ＩＣＯＭ＿ＰｅｒｓｉｓｔＲｅｇＤＢインターフェイスは、ＩＰｓｅｓｉｓｔＦｉｌｅ標準ＯＬＥインターフェイスにより与えられるものと同様の機能を実施する。ファイルへ及びファイルからデータをセーブ及びロードするのではなく、ＩＣＯＭ＿ＰｅｒｓｉｓｔＲｅｇＤＢは、登録データベースに対して動作する。次は、ＩＣＯＭ＿ＰｅｒｓｉｓｔＲｅｇＤＢインターフェイスの説明である。
【０３６１】
2008159046.tif 000006
【０３６２】
ＩＬＮＧ＿ＤｒｖＣｏｒｅ＿Ｉｎｉｔインターフェイスは、言語ドライバコンポーネントを初期化するのに使用される。次は、ＩＬＮＧ＿ＤｒｖＣｏｒｅ Ｉｎｉｔインターフェイスの説明である。
【０３６３】
2008159046.tif 000007
【０３６４】
ＩＬＮＧ＿ＤｒｖＥｘｔ＿ＳｔｒｅａｍＭｇｍｔインターフェイスは、全てのストリームオペレーションを実行するのに使用される。次は、ＩＬＮＧ＿ＤｒｖＥｘｔ＿ＳｔｒｅａｍＭｇｍｔインターフェイスの説明である。
【０３６５】
2008159046.tif 000008
【０３６６】
次は、ドライバＤＬＬによりエクスポートされるファンクションである。
【０３６７】
2008159046.tif 000009
【０３６８】
次の説明は、ドライバにより使用される全ての構造、列挙及び定義を示す。
【０３６９】
XMC＿DRIVER＿MODULETYPE列挙は、使用可能なドライバの形式を定義する。各ドライバは、ユーザがエクスポートされたファンクションDLLGetModuleTypeファンクションをコールするときにその形式を返送しなければならない。
【０３７０】
2008159046.tif 000010
【０３７１】
XMC＿DRVCORE＿CMD列挙は、ＸＭＣドライバに知られる各コマンドの識別子を定義する。例えば、各コアドライバファンクションは、それに対応するXMC＿DRVCORE＿CMD識別子を有する。このインデックスは、コマンドに対するストリングブロックをルックアップするのに使用される。この列挙の定義は、次の通りである。
【０３７２】
2008159046.tif 000011
【０３７３】
XMC＿DRVEXT＿CMD列挙は、ＸＭＣドライバに知られる各拡張コマンドの識別子を定義する。たとえ識別子が存在しても、ドライバは、１組のコマンドを実施してもよいししなくてもよい。例えば、各拡張ドライバファンクションは、それに対応するXMC＿DRVEXT＿CMD識別子を有する。このインデックスは、コマンドに対するストリングブロックをルックアップするのに使用される（ドライバがコマンドを実施する場合）。この列挙の定義は、次の通りである。
【０３７４】
2008159046.tif 000012
【０３７５】
LNG＿PARAM＿DATATYPE 列挙は、ストリームターゲットにより返送される応答ストリングからパーズされる全ての形式のデータブロックを定義する。
【０３７６】
2008159046.tif 000013
【０３７７】
LNG＿PARAM＿DATA構造体は、コマンドへ組み込まれるか又は応答からパーズされるパラメータを示す全ての形式のデータを記憶する。
【０３７８】
2008159046.tif 000014
【０３７９】
LNG＿DRIVER＿INFO構造体は、ドライバの状態を設定し及び問い合わせするときに使用される。
【０３８０】
2008159046.tif 000015
【０３８１】
各ＸＭＣドライバは、使用される全てのストリームをマネージするという役目を果たす。各ストリームを永続的な仕方で時間と共にマネージするために、各ドライバ及びストリームモジュールは、ICOM＿PersistRegDBインターフェイスを経てエクスポーズされる永続的なファンクションを実施する。ICOM＿PersistRegDB::Saveのドライバ実施がコールされるときに、データは、次の順序でレジストリにセーブされる。
【０３８２】
2008159046.tif 000016
【０３８３】
以上の説明から、本発明は、その本質的な特徴から逸脱せずに他の特定の形態で実施できることも明らかであろう。それ故、上記の実施形態は、全ての観点において単に本発明を例示するもので、これに限定されるものではない。本発明の範囲は、上記の説明ではなく請求の範囲により指摘され、従って、その範囲内に入る全ての変更や修正は、本発明に包含されるものとする。
【図面の簡単な説明】
【０３８４】
【図１Ａ】本発明の原理に基づいて構成されそしてそれを実施するモーションコントロールシステムのシステムインターアクションマップである。
【図１Ｂ】本発明の原理に基づいて構成されそしてそれを実施するモーションコントロールシステムのシステムインターアクションマップである。
【図１Ｃ】本発明の原理に基づいて構成されそしてそれを実施するモーションコントロールシステムのシステムインターアクションマップである。
【図１Ｄ】本発明の原理に基づいて構成されそしてそれを実施するモーションコントロールシステムのシステムインターアクションマップである。
【図１Ｅ】本発明の原理に基づいて構成されそしてそれを実施するモーションコントロールシステムのシステムインターアクションマップである。
【図１Ｆ】本発明の原理に基づいて構成されそしてそれを実施するモーションコントロールシステムのシステムインターアクションマップである。
【図２】図１に示すシステムのモーションコントロールコンポーネントのモジュールインターアクションマップである。
【図３】図２に示すコンポーネントのオブジェクトインターアクションマップである。
【図４】図２に示すコンポーネントのシナリオマップである。
【図５】図２に示すコンポーネントのシナリオマップである。
【図６】図２に示すコンポーネントのシナリオマップである。
【図７】図２に示すコンポーネントのシナリオマップである。
【図８】図２に示すコンポーネントのシナリオマップである。
【図９】図２に示すコンポーネントのインターフェイスマップである。
【図１０】コアドライバファンクションを用いて拡張ドライバファンクションをエミュレートするのに必要なデータをアクセスする１つの例示的方法を示すデータマップである。
【図１１】図１に示すシステムのドライバ部分のモジュールインターアクションマップである。
【図１２】図１１に示すドライバ部分のオブジェクトインターフェイスマップである。
【図１３】図１１のドライバに関連したシナリオマップである。
【図１４】図１１のドライバに関連したシナリオマップである。
【図１５】図１１のドライバに関連したシナリオマップである。
【図１６】図１１のドライバに関連したシナリオマップである。
【図１７】図１１のドライバに関連したシナリオマップである。
【図１８】図１１のドライバに関連したシナリオマップである。
【図１９】図１１のドライバに関連したシナリオマップである。
【図２０】図１１のドライバに関連したシナリオマップである。
【図２１】図１１に示すドライバのインターフェイスマップである。
【図２２】図１に示すシステムにより使用されるストリームのモジュールインターアクションマップである。
【図２３】図２２に示すストリームのオブジェクトインターフェイスマップである。
【図２４】図２２に示すストリームのシナリオマップである。
【図２５】図２２に示すストリームのシナリオマップである。
【図２６】図２２に示すストリームのシナリオマップである。
【図２７】図２２に示すストリームのシナリオマップである。
【図２８】図２２に示すストリームのシナリオマップである。
【図２９】図２２に示すストリームのシナリオマップである。
【図３０】図２２に示すストリームのシナリオマップである。
【図３１】図２２に示すストリームのシナリオマップである。
【図３２】図２２に示すストリームのシナリオマップである。
【図３３】図２２に示すストリームより成るオブジェクトのインターフェイスマップである。
【図３４】図１に示すシステムのドライバスタブ部分のモジュールインターアクションマップである。
【図３５】図３４に示すドライバスタブのオブジェクトインターアクションマップである。
【図３６】図３４に示すドライバスタブのシナリオマップである。
【図３７】図３４に示すドライバスタブのシナリオマップである。
【図３８】図３４に示すドライバスタブのシナリオマップである。
【図３９】図３４のドライバスタブ部分のインターフェイスマップである。
【図４０】図１に示すシステムのドライバアドミニストレータ部分のモジュールインターアクションマップである。
【図４１】図４０に示すドライバアドミニストレータのオブジェクトインターアクションマップである。
【図４２】図４０に示すドライバアドミニストレータに関連したシナリオマップである。
【図４３】図４０に示すドライバアドミニストレータに関連したシナリオマップである。
【図４４】図４０に示すドライバアドミニストレータに関連したシナリオマップである。
【図４５】図４０に示すドライバアドミニストレータに関連したシナリオマップである。
【図４６】図４０に示すドライバアドミニストレータに関連したシナリオマップである。
【図４７】図４０に示すドライバアドミニストレータに関連したシナリオマップである。
【図４８】図４０に示すドライバアドミニストレータに関連したシナリオマップである。
【図４９】図４０に示すドライバアドミニストレータに関連したシナリオマップである。
【図５０】図４０に示すドライバアドミニストレータを含むオブジェクトのインターフェイスマップである。
【図５１】図１に示すシステムのドライバアドミニストレータＣＰＬアプレット部分のモジュールインターアクションマップである。
【図５２】図５１に示すドライバアドミニストレータＣＰＬアプレットのオブジェクトインターアクションマップである。
【図５３】図５１に示すドライバアドミニストレータＣＰＬアプレットに関連したシナリオマップである。
【図５４】図５１に示すドライバアドミニストレータＣＰＬアプレットに関連したシナリオマップである。
【図５５】図５１に示すドライバアドミニストレータＣＰＬアプレットに関連したシナリオマップである。
【図５６】図５１に示すドライバアドミニストレータＣＰＬアプレットに関連したシナリオマップである。
【図５７】図５１に示すドライバアドミニストレータＣＰＬアプレットに関連したシナリオマップである。
【図５８】ドライバと対話する全ての２進モジュールを示すと共に、それらが互いにいかに対話するかを示すモジュールインターアクションマップである。
【図５９】言語ドライバ４４を形成する内部Ｃ＋＋オブジェクトを表示し、そしてこれらのオブジェクトが互いにいかに対話するか表示するように拡張された図５８のモジュールインターアクションマップに対応するオブジェクトインターアクションマップである。
【図６０】あるプロセス中に含まれるＣ＋＋オブジェクト間で行われるインターアクションを表示する多数のシナリオマップを示す図である。
【図６１】あるプロセス中に含まれるＣ＋＋オブジェクト間で行われるインターアクションを表示する多数のシナリオマップを示す図である。
【図６２】あるプロセス中に含まれるＣ＋＋オブジェクト間で行われるインターアクションを表示する多数のシナリオマップを示す図である。
【図６３】あるプロセス中に含まれるＣ＋＋オブジェクト間で行われるインターアクションを表示する多数のシナリオマップを示す図である。
【図６４】あるプロセス中に含まれるＣ＋＋オブジェクト間で行われるインターアクションを表示する多数のシナリオマップを示す図である。
【図６５】あるプロセス中に含まれるＣ＋＋オブジェクト間で行われるインターアクションを表示する多数のシナリオマップを示す図である。
【図６６】言語ドライバコンポーネント４４によりエクスポーズされるインターフェイス、使用される全てのデータ構造、及び使用される各Ｃ＋＋クラスの定義を記述するインターフェイスマップである。
【図６７】言語ドライバ４４に使用される典型的なデータベースがいかに構成されるかを示すテーブルである。
【図１Ａ】
2008159046.tif 000017
【図１Ｂ】
2008159046.tif 000018
【図１Ｃ】
2008159046.tif 000019
【図１Ｄ】
2008159046.tif 000020
【図１Ｅ】
2008159046.tif 000021
【図１Ｆ】
2008159046.tif 000022
【図２】
2008159046.tif 000023
【図３】
2008159046.tif 000024
【図４】
2008159046.tif 000025
【図５】
2008159046.tif 000026
【図６】
2008159046.tif 000027
【図７】
2008159046.tif 000028
【図８】
2008159046.tif 000029
【図９】
2008159046.tif 000030
【図１０】
2008159046.tif 000031
【図１１】
2008159046.tif 000032
【図１２】
2008159046.tif 000033
【図１３】
2008159046.tif 000034
【図１４】
2008159046.tif 000035
【図１５】
2008159046.tif 000036
【図１６】
2008159046.tif 000037
【図１７】
2008159046.tif 000038
【図１８】
2008159046.tif 000039
【図１９】
2008159046.tif 000040
【図２０】
2008159046.tif 000041
【図２１】
2008159046.tif 000042
【図２２】
2008159046.tif 000043
【図２３】
2008159046.tif 000044
【図２４】
2008159046.tif 000045
【図２５】
2008159046.tif 000046
【図２６】
2008159046.tif 000047
【図２７】
2008159046.tif 000048
【図２８】
2008159046.tif 000049
【図２９】
2008159046.tif 000050
【図３０】
2008159046.tif 000051
【図３１】
2008159046.tif 000052
【図３２】
2008159046.tif 000053
【図３３】
2008159046.tif 000054
【図３４】
2008159046.tif 000055
【図３５】
2008159046.tif 000056
【図３６】
2008159046.tif 000057
【図３７】
2008159046.tif 000058
【図３８】
2008159046.tif 000059
【図３９】
2008159046.tif 000060
【図４０】
2008159046.tif 000061
【図４１】
2008159046.tif 000062
【図４２】
2008159046.tif 000063
【図４３】
2008159046.tif 000064
【図４４】
2008159046.tif 000065
【図４５】
2008159046.tif 000066
【図４６】
2008159046.tif 000067
【図４７】
2008159046.tif 000068
【図４８】
2008159046.tif 000069
【図４９】
2008159046.tif 000070
【図５０】
2008159046.tif 000071
【図５１】
2008159046.tif 000072
【図５２】
2008159046.tif 000073
【図５３】
2008159046.tif 000074
【図５４】
2008159046.tif 000075
【図５５】
2008159046.tif 000076
【図５６】
2008159046.tif 000077
【図５７】
2008159046.tif 000078
【図５８】
2008159046.tif 000079
【図５９】
2008159046.tif 000080
【図６０】
2008159046.tif 000081
【図６１】
2008159046.tif 000082
【図６２】
2008159046.tif 000083
【図６３】
2008159046.tif 000084
【図６４】
2008159046.tif 000085
【図６５】
2008159046.tif 000086
【図６６】
2008159046.tif 000087
【図６７】
2008159046.tif 000088