(57)【要約】【課題】エンターテインメントロボットのソフトウェア開発に必要なシステム層とアプリケーション層との間のインターフェイス仕様を規定する。【解決手段】ソフトウェアをオブジェクト指向に基づいて部品化（モジュール化）し、様々な機能を持つ複数のオブジェクトを並行動作させ、オブジェクトが相互に通信（オブジェクト間通信）を行ないながら処理を進める形態で実現する。このとき、オブジェクト間の接続関係がシステムが管理するファイルに記述され、起動時にシステムにおいて通信路を確保設定されるようにする。また、オブジェクト間通信の接続口をサービス名によって識別する。これにより部品（モジュール）としての独立性が高く差し替えが容易になる。【選択図】　図１
2004001148.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアに基づいて外部情報や外部からの働きかけに応じた動作及び／又は内部状態に基づく自律的動作を実行するロボット装置のシステム層とアプリケーション層との間のインターフェイスであって、
上記ソフトウェアがオブジェクト指向に基づいて部品化され、上記部品化されたソフトウェアの各部品としてのオブジェクトがそれぞれ並行動作することを特徴とするロボット装置のインターフェイス。
【請求項２】
上記オブジェクトは、互いに通信を行いながら並行動作されることを特徴とする請求項１記載のロボット装置のインターフェイス。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ロボット装置のインターフェイスに関し、特に、ソフトウェアを階層化し最適化したロボット装置のインターフェイスに関する。
【０００２】
【従来の技術】
最近では、人間のパートナーとして生活を支援する、すなわち住環境その他の日常生活上の様々な場面における人的活動を支援する実用ロボットの開発が進められている。このような実用ロボットは、産業用ロボットとは異なり、人間の生活環境の様々な局面において、個々に個性の相違した人間、又は様々な環境への適応方法を自ら学習する能力を備えている。例えば、犬、猫のように４足歩行の動物の身体メカニズムやその動作を模した「ペット型」ロボット、あるいは、２足直立歩行を行う動物の身体メカニズムや動作をモデルにしてデザインされた人間型ロボット（Ｈｕｍａｎｏｉｄ　Ｒｏｂｏｔ）等の脚式移動ロボットは、既に実用化されつつある。
【０００３】
これらの脚式移動ロボットは、産業用ロボットと比較してエンターテインメント性を重視した様々な動作を行うことができるため、エンターテインメントロボットと呼称される場合もある。
【０００４】
【発明が解決しようとする課題】
ところが、上述したようなエンターテインメントロボットは、必要な機能を付与して設計しても所定の用途にしか用いることができず、適用範囲が限定されてしまう。そのため、エンターテインメント性や社会適合性を必要に応じて進化させていく必要があり、ロボットのハードウェアやソフトウェアの開発が効率良く行なえるように、これらを階層化し最適化する必要があった。
【０００５】
そこで本発明は、このような従来の実情に鑑みて提案されたものであり、エンターテインメントロボットのソフトウェア開発に必要なシステム層とアプリケーション層との間のインターフェイス仕様を規定することを目的とする。
【０００６】
【課題を解決するための手段】
上述した目的を達成するために、本発明に係るロボット装置のインターフェイスは、ソフトウェアに基づいて外部情報や外部からの働きかけに応じた動作及び／又は内部状態に基づく自律的動作を実行するロボット装置のシステム層とアプリケーション層との間のインターフェイスであって、ソフトウェアがオブジェクト指向に基づいて部品化され、部品化されたソフトウェアの各部品としてのオブジェクトがそれぞれ並行動作することを特徴とする。
【０００７】
また、ここでオブジェクトは、互いに通信を行いながら並行動作される。
【０００８】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を参照して詳細に説明する。本明細書に記述されるＯＰＥＮ−Ｒは、ソニー株式会社の商標または登録商標である。また、メモリスティック（Ｍｅｍｏｒｙ　Ｓｔｉｃｋ）、ＡＩＢＯ等は、ソニー株式会社の商標である。なお、本文中では’ＴＭ’は、明記しない。その他、本書で登場するシステム名、製品名、サービス名、会社名は、一般に各メーカーの商標または登録商標である。本明細書では、本発明の具体例であるエンターテインメントロボットシステムのインターフェイスであるＯＰＥＮ−Ｒ　ＳＤＫについて、＜プログラマーズガイド＞、＜レファレンスガイド＞、＜インターネットプロトコル＞、＜インストールガイド＞、＜ＥＲＳ−２１０＞、＜ＥＲＳ−２２０＞に分けて説明する。
【０００９】
＜プログラマーズガイド＞
第１章　基礎知識
１．１　ＯＰＥＮ−Ｒ
ＯＰＥＮ−Ｒ　は、エンターテインメントロボットの世界を広げるために、ソニーが提唱するエンターテインメントロボット・システムのインターフェイスです。これらのインターフェイスは、ロボットのハードウェアやソフトウェアの開発が効率良く行なえるように、階層化・最適化されています。ＯＰＥＮ−Ｒ　ＳＤＫでは、エンターテインメントロボットのソフトウェア開発に必要なシステム層とアプリケーション層との間のインターフェイス仕様を公開するものである。ＯＰＥＮ−Ｒソフトウェアには、以下の特徴があります。
【００１０】
・ソフトウェアの部品化とオブジェクト間通信
ＯＰＥＮ−Ｒソフトウェアは、オブジェクト指向に基づいて部品化（モジュール化）されています。各モジュールをオブジェクト（ＯＰＥＮ−Ｒオブジェクト）と呼びます。ＯＰＥＮ−Ｒでは、ロボットを動作させるソフトウェアは、様々な機能を持つ複数のオブジェクトを並行動作させ、オブジェクトが相互に通信（オブジェクト間通信）を行ないながら処理を進める形態で実現します。オブジェクト間の接続関係は、システムが管理するファイルに記述し、起動時にシステムが通信路を確保・設定します。オブジェクト間通信の接続口は、サービス名によって識別するため、部品としての独立性が高く、差し替えが容易になっています。
【００１１】
ソフトウェアの階層構造とシステム層提供サービス：ＯＰＥＮ−Ｒのシステム層は、サウンドデータ入力、サウンドデータ出力、画像データ入力、関節制御出力、各種センサーデータ入力などのサービスを、アプリケーション層に対するインターフェイスとして提供します。このインターフェイスもオブジェクト間通信によって実現されています。これらのサービスを利用すれば、アプリケーション層のオブジェクトは、ロボットを構成するハードウェアデバイスの詳細な知識を持たなくても、ロボットの機能を利用できます。また、システム層は、ＴＣＰ／ＩＰプロトコルスタックのインターフェイスも提供します。これにより、無線ＬＡＮを利用したネットワーク通信アプリケーションが作成できます。
【００１２】
１．２　オブジェクト
図１は、ＯＰＥＮ−Ｒのアプリケーションソフトウェアの構成を示す図である。ＯＰＥＮ−Ｒのアプリケーションソフトウェア１は、複数のＯＰＥＮ−Ｒオブジェクト２〜４より構成されている。以降の説明では「ＯＰＥＮ−Ｒオブジェクト」のことを単に「オブジェクト」と表記する。オブジェクトの概念は、以下の点でＵｎｉｘ（登録商標）やＷｉｎｄｏｗｓ（登録商標）のオペレーティングシステムのプロセスに似ています。１つのオブジェクトには、１つの実行ファイルが対応します。オブジェクトは実行時にのみ存在する概念です。各オブジェクトは、コンパイル時に生成される実行ファイルに対応します。実行ファイルは、ソースコードをコンパイル、リンクすることによって作られ、ＡＩＢＯプログラミングメモリスティック上に置かれます。ロボットの起動時、システムソフトウェアは、実行ファイルをロードし、オブジェクトとして実行を開始します。各オブジェクトは他のオブジェクトと並行して動作します。各オブジェクトは専用の実行スレッドを１つ持ち、他のオブジェクトと並行に動作します。
【００１３】
以下は、プロセスとは異なるオブジェクト特有の機能です。オブジェクトはメッセージ通信によって情報を交換します。オブジェクトは他のオブジェクトにメッセージを送信することができます。メッセージはデータとセレクタから成ります。セレクタは、メッセージの受信側のオブジェクトで実行される処理を特定するためのＩＤです。オブジェクトがメッセージを受信すると、セレクタに対応した関数が呼ばれ、メッセージの中のデータが引数として渡されます。セレクタに対応した関数をメソッドと呼びます。オブジェクトの重要な特徴はシングルスレッドであるということです。これにより、ある瞬間においては、オブジェクトは１個のメッセージのみを処理します。オブジェクトが１個のメッセージを処理中に別のメッセージを受信した場合は、後に受信した方のメッセージはキューに保持され、後で実行されます。
【００１４】
以下は、オブジェクトの処理のサイクルです。
１．システムによってロードされる。
２．メッセージの受信を待つ。
３．メッセージを受信したら、そのメッセージに書かれたセレクタに対応するメソッドを実行する。実行中、場合によっては、他のオブジェクトにメッセージを送信する。
４．メソッドの実行後は２に戻る。
このサイクルは無限ループです。一旦ロードされたオブジェクトは、終了することなく、永続的に存在します。
【００１５】
オブジェクトは、複数のエントリポイントを持ちます。通常のプログラム環境では、プログラムはｍａｉｎ（）の１個のエントリポイントを保持しますが、ＯＰＥＮ−Ｒのオブジェクトは複数のエントリポイントを保持できます。各エントリポイントは上述のセレクタに対応付けられます。エントリポイントの一部はシステムによって決められた目的、例えば初期化や終了などの目的に使われます。他のエントリポイントは、オブジェクトに固有の目的に使われます。また、オブジェクトは、Ｐｒｏｌｏｇｕｅ（）と呼ばれる特別なエントリポイントを持ちます。これはオブジェクトがシステムによってロードされときに１度だけ実行されます。Ｐｒｏｌｏｇｕｅ（）は初期化と、Ｃ＋＋の大域変数のコンストラクタ呼び出しを行います。
【００１６】
１．３　オブジェクト間通信
エンターテインメントロボットを動作させるソフトウェアは、画像認識・音声認識・行動制御・モーション生成などのさまざまな機能を持つ複数のオブジェクトが相互に通信を行いながら処理を進めます。オブジェクト間の通信を　ＯＰＥＮ−Ｒ　ではオブジェクト間通信と呼びます。
【００１７】
サブジェクト、オブザーバ間の通信
オブジェクト間通信を使用することにより、各オブジェクトを独立して作成して接続することができ、効率的に開発をすることが可能です。オブジェクト間通信ではデータの送信側はサブジェクト、データの受信側はオブザーバと呼びます。サブジェクトからオブザーバへは、ＮｏｔｉｆｙＥｖｅｎｔ　を送信します。ＮｏｔｉｆｙＥｖｅｎｔ　には通信するデータが含まれています。オブザーバからサブジェクトへは　ＲｅａｄｙＥｖｅｎｔ　を送信します。ＲｅａｄｙＥｖｅｎｔ　にはオブザーバが受信可能であるかどうかの情報が含まれています。オブザーバが受信可能でないとサブジェクトからオブザーバへデータが送信されません。
【００１８】
図２は、オブジェクトＡのサブジェクトとオブジェクトＢのオブザーバが通信する状態を示します。オブザーバがデータを受信するためには、前処理としてオブザーバの状態をサブジェクトに通知する必要があります。オブザーバがデータを受信できる状態にあるときは、オブザーバは、サブジェクトにＡＳＳＥＲＴ−ＲＥＡＤＹのメッセージを送信します。一方、オブザーバがデータを受信できない状態にあるときは、オブザーバは、サブジェクトにＤＥＡＳＳＥＲＴ−ＲＥＡＤＹのメッセージを送信します。サブジェクトはオブザーバからＡＳＳＥＲＴ−ＲＥＡＤＹを受信すると、オブザーバに対してデータを送信します。オブザーバーがデータを受信した後で次のデータを受信可能になったときは、サブジェクトに再度、ＡＳＳＥＲＲＴ−ＲＥＡＤＹを送信します。
【００１９】
第２章　ＯＰＥＮ−Ｒプログラミング
２．１　開発の流れ
ＯＰＥＮ−Ｒ　ＳＤＫを用いた開発は、以下の手順で進められます。
（１）　オブジェクトの設計：新規に作成するオブジェクトの機能と、オブジェクト間のデータの流れを設計します。例えば「ピンクボールをトラッキングするオブジェクトを設計する」場合は、画像データを受け取ってピンクボールの位置を検出して、その方向に頭を動かすコマンドデータを送ります。
（２）　オブジェクト間通信のデータ型の設計：他のオブジェクトと通信するためのデータ型を設計します。例えば「入力データとしてＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａを受信し、出力データとしてＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａを送信する」などです。
（３）　ｓｔｕｂ．ｃｆｇの記述：オブジェクトが外部からメッセージを受け取るためのエントリポントと、オブジェクト内に実装されたコアクラスのメンバー関数との接続を、フォーマットに従ってｓｔｕｂ．ｃｆｇ（Ｓｔｕｂ　Ｃｏｎｆｉｇｕｒａｔｉｏｎ）ファイルに記述します。ｓｔｕｂ．ｃｆｇには、他のオブジェクトとデータを送受信するためのサービスも記述します。ｓｔｕｂｇｅｎ２コマンドを実行することで、ｓｔｕｂ．ｃｆｇからコンパイル時に必要な中間ファイルが生成されます。
（４）　コアクラスの実装：オブジェクトのコアクラスを実装します。ｓｔｕｂ．ｃｆｇで指定したメンバー関数や、コアクラスに必ず実装する４個のＤｏｘｘｘ（）メンバー関数や、その他のメンバー関数も実装します。
（５）　．ｏｃｆのコンフィグレーションの設定：オブジェクトの実行時のコンフィグレーションを設定します。
（６）　ビルド：必要なライブラリをリンクしてビルドします。
（７）　設定ファイルの編集：実行時に必要な設定ファイルを編集します。例えば、以下のものがあります。
ＯＢＪＥＣＴ．ＣＦＧは、実行するオブジェクトを列挙します。
ＣＯＮＮＥＣＴ．ＣＦＧは、オブジェクト間の接続を記述します。
ＤＥＳＩＧＮＤＢ．ＣＦＧは、オブジェクトが実行時にアクセスするファイルをパス付きで記述します。
（８）　ＡＩＢＯでの実行：ＡＩＢＯプログラミングメモリースティックの所定の場所に、以下のファイルをコピーします。
・システムファイル等が置かれているＯＰＥＮ−Ｒディレクトリー
・実行ファイル（．ＢＩＮ）
・編集した設定ファイル
・モーションやサウンドなどのデータファイル
無線ＬＡＮ環境を構築してＡＩＢＯとＰＣを接続し、ＡＩＢＯプログラミングメモリースティックをＡＩＢＯに挿入して、ＡＩＢＯを起動します。
（９）　デバッグ：無線ＬＡＮコンソールに表示されるメッセージの中から、ソースコードに記述したＯＳＹＳＰＲＩＮＴやＯＳＹＳＬＯＧ１などのデバッグ文や、その他のエラー情報を参考にして、バグの原因を調査してデバッグします。
【００２０】
２．２　コアクラス
図３は、コアクラスを示す図です。コアクラスとはオブジェクトを表現するＣ＋＋のクラスです。１つのオブジェクトにつき、１個のコアクラスだけを定義できます。オブジェクトは、メッセージの受信用に複数のエントリポイントを保持します。図３のように、各エントリポイントはオブジェクトのメソッドに対応し、メソッドはコアクラスのメンバー関数に対応しています。
【００２１】
コアクラスには、以下の特徴があります。コアクラスはＯＯｂｊｅｃｔを継承します。コアクラスは、ＤｏＩｎｉｔ（），　ＤｏＳｔａｒｔ（），　ＤｏＳｔｏｐ（），　ＤｏＤｅｓｔｒｏｙ（）を実装します。コアクラスは、ＯＳｕｂｊｅｃｔとＯＯｂｓｅｒｖｅｒを必要数だけ保持します。
2004001148.tif 000003
【００２２】
コアクラスのメンバー関数は、特定のメソッドと対応するものがあります。メソッドには以下のものがあります。
（１）起動時またはシャットダウン時に呼ばれるメソッド
Ｉｎｉｔメソッド：起動時に呼ばれます。インスタンスや変数の初期化を行います。
Ｓｔａｒｔメソッド：起動時にＤｏＩｎｉｔ（）がすべてのオブジェクトで実行された後で呼ばれます。
Ｓｔｏｐメソッド：シャットダウン時に呼ばれます。
Ｄｅｓｔｒｏｙメソッド：シャットダウン時にＤｏＳｔｏｐ（）がすべてのオブジェクトで実行された後で呼ばれます。サブジェクトとオブザーバのインスタンスを消滅します。
Ｉｎｉｔメソッド、Ｓｔａｒｔメソッド、Ｓｔｏｐメソッド、Ｄｅｓｔｒｏｙメソッドは、それぞれコアクラスのＤｏＩｎｉｔ（），　ＤｏＳｔａｒｔ（），　ＤｏＳｔｏｐ（），　ＤｏＤｅｓｔｒｏｙ（）に対応付けられます。
（２）他のオブジェクトからメッセージを受信するときに使用されるメソッド・サブジェクトに使用されるメソッド
Ｃｏｎｔｒｏｌメソッド：サブジェクトと、他のオブジェクトのオブザーバの接続結果を受信します。
Ｒｅａｄｙメソッド：サブジェクトが、他のオブジェクトのオブザーバからＡＳＳＥＲＴ−ＲＥＡＤＹまたはＤＥＡＳＳＥＲＴ−ＲＥＡＤＹを受信します。
・オブザーバに使用されるメソッド
Ｃｏｎｎｅｃｔメソッド：オブザーバと、他のオブジェクトのサブジェクトの接続結果を受信します。
Ｎｏｔｉｆｙメソッド：オブザーバが、他のオブジェクトのサブジェクトからデータを受信します。
【００２３】
これらのメソッドには、以下の特徴があります。
（ａ）Ｃｏｎｔｒｏｌメソッド、Ｒｅａｄｙメソッド、Ｃｏｎｎｅｃｔメソッド、Ｎｏｔｉｆｙメソッドに対応するメンバー関数はｓｔｕｂ．ｃｆｇに記述します。
（ｂ）メッセージを受信するメンバー関数はｓｔｕｂ．ｃｆｇに記述しますが、メッセージを送信するメンバー関数はｓｔｕｂ．ｃｆｇに記述する必要がありません。例として、コアクラスとしてＳａｍｐｌｅＣｌａｓｓ１を定義します、ＳａｍｐｌｅＣｌａｓｓ１はＯＯｂｊｅｃｔを継承し、ＯＰＥＮ−Ｒ用の４個のメンバー関数を定義します。以下は、ＳａｍｐｌｅＣｌａｓｓ１の定義です。
2004001148.tif 000004
ＳａｍｐｌｅＣｌａｓｓ２が他のオブジェクトと通信する例です。ＯＳｕｂｊｅｃｔとＯＯｂｓｅｒｖｅｒを必要数だけ定義します。必要数は、ｓｔｕｂ．ｃｆｇに記述します。以下は、オブジェクト間通信を行う場合のＯＳｕｂｊｅｃｔとＯＯｂｓｅｒｖｅｒを使った定義例です。
2004001148.tif 000005
【００２４】
２．３　スタブ
オブジェクトのエントリポイントとコアクラスのメンバー関数を接続するためにスタブが使用されます。スタブはｘｘｘＳｔｕｂ．ｃｃの中で定義されます。ｘｘｘＳｔｕｂ．ｃｃは、スタブジェネレータ（ｓｔｕｂｇｅｎ２コマンド）によってｓｔｕｂ．ｃｆｇから自動生成されます。また、ｘｘｘＳｔｕｂ．ｃｃの中では、大域変数としてコアクラスのインスタンスが１つだけ生成されます。
ｓｔｕｂ．ｃｆｇには以下の項目を記述します。
・サブジェクト数とオブザーバー数
・オブジェクト間通信で使用するサービス
サブジェクトとオブザーバはオブジェクト間通信用のサービスを提供をします。サービスは、他のサービスと区別できる固有のサービス名を持ちます。あるオブジェクトのサブジェクトのサービスと、他のオブジェクトのオブザーバのサービスを接続するには、互いのサービス名をＣＯＮＮＥＣＴ．ＣＦＧに記述します。
【００２５】
以下にｓｔｕｂ．ｃｆｇの記述例を挙げます。
ＯｂｊｅｃｔＮａｍｅ：　ＳａｍｐｌｅＣｌａｓｓ
ＮｕｍＯｆＯＳｕｂｊｅｃｔ　　　：　１
ＮｕｍＯｆＯＯｂｓｅｒｖｅｒ　　：　２
Ｓｅｒｖｉｃｅ　：　’ＳａｍｐｌｅＣｌａｓｓ．Ｆｕｎｃ１．Ｄａｔａ１．Ｓ’，　Ｃｏｎｔｒｏｌ（），　Ｒｅａｄｙ（）
Ｓｅｒｖｉｃｅ　：　’ＳａｍｐｌｅＣｌａｓｓ．Ｆｕｎｃ２．Ｄａｔａ２．Ｏ’，　Ｃｏｎｎｅｃｔ（），　Ｎｏｔｉｆｙ１（）
Ｓｅｒｖｉｃｅ　：　’ＳａｍｐｌｅＣｌａｓｓ．Ｆｕｎｃ３．Ｄａｔａ２．Ｏ’，　ｎｕｌｌ，　Ｎｏｔｉｆｙ２（）
Ｅｘｔｒａ　：　ＵｐｄａｔｅＰｏｗｅｒＳｔａｔｕｓ（）
各項目は、以下のような意味を持ちます。
ＯｂｊｅｃｔＮａｍｅ
コアクラス名です。
ＮｕｍＯｆＯＳｕｂｊｅｃｔ
サブジェクト数です。１以上の数を指定します。サブジェクトを必要としないときは、１個のダミーサブジェクトを登録します。
ＮｕｍＯｆＯＯｂｓｅｒｖｅｒ
オブザーバ数です。１以上の数を指定します。オブザーバを必要としないときは１個のダミーオブザーバを登録します。
Ｓｅｒｖｉｃｅ
オブジェクト用の通信サービスを記述します。各サブジェクトおよびオブザーバにつき、１つのサービスを記述します。
以下はサービスの構成項目です。’（接続名）’，　（メンバー関数１），　（メンバー関数２）
・接続名
接続名は、オブジェクト名、サブ名、データ名、サービス型から構成されている。各接続名は、以下の通りである。
オブジェクト名：任意の名前を指定できますが、通常はコアクラスの名前です。
サブ名：サービスの名前で、固有の名前を使用します。複数のサービスに同じ名前を付けてはいけません。
データ名：オブジェクト間通信で使用するデータ型に対応する名前です。
サービス型：Ｓ（サブジェクト）またはＯ（オブザーバ）の一方を指定します。
【００２６】
また、メンバー関数は以下である。
・メンバー関数１
接続の結果を受信する時に呼ばれるメンバー関数です。メンバー関数１の名前は自由に命名することができます。メンバー関数１は、コアクラス内で実装されます。メンバー関数１が不要のときはｎｕｌｌを記述してください。
・メンバー関数２
オブザーバ用のサービスの場合に、サブジェクトからメッセージを受信したときに呼ばれるメンバー関数です。または、サブジェクト用のサービスの場合に、オブザーバからＡＳＳＥＲＴ−ＲＥＡＤＹまたはＤＥＡＳＳＥＲＴ−ＲＥＡＤＹを受信したときに呼ばれるメンバー関数です。メンバー関数２の名前は、自由に命名することができます。メンバー関数２は、コアクラス内で実装されます。メンバー関数２が不要のときはｎｕｌｌを記述してください。
【００２７】
以下は、ダミーサブジェクトが存在する場合のサンプルコードです。
Ｓｅｒｖｉｃｅ　：　’ＳａｍｐｌｅＣｌａｓｓ．ＤｕｍｍｙＳｕｂｊｅｃｔ．ＤｏｎｔＣｏｎｎｅｃｔ．Ｓ’，　ｎｕｌｌ，　ｎｕｌｌ
複数のサービスが存在する場合は、同じメンバー関数を共有することもできます。以下はサンプルコードです。
Ｓｅｒｖｉｃｅ　：　’ＳａｍｐｌｅＣｌａｓｓ．Ｏｕｔ１．Ｄａｔａ１．Ｓ’，　Ｃｏｎｔｒｏｌ（），　Ｒｅａｄｙ（）
Ｓｅｒｖｉｃｅ　：　’ＳａｍｐｌｅＣｌａｓｓ．Ｏｕｔ２．Ｄａｔａ１．Ｓ’，　Ｃｏｎｔｒｏｌ（），　Ｒｅａｄｙ（）
Ｃｏｎｔｒｏｌ（）　と　Ｒｅａｄｙ（）　は２個のサービスに共通のメンバー関数です。
【００２８】
Ｅｘｔｒａ　ｅｎｔｒｙ
Ｉｎｉｔ，　Ｓｔａｒｔ，　Ｓｔｏｐ，　Ｄｅｓｔｒｏｙ，　Ｃｏｎｔｒｏｌ，　Ｒｅａｄｙ，　Ｃｏｎｎｅｃｔ，　Ｎｏｔｉｆｙメソッド以外のエントリポイントを必要とする場合は、Ｅｘｔｒａ　ｅｎｔｒｙにエントリポイントを追加します。以下はサンプルコードです。例えばネットワーク通信時に使用するコールバック関数がこれにあたります。
Ｅｘｔｒａ　：　ＮｅｗＥｘｔｒａ１（）
Ｅｘｔｒａ　：　ＮｅｗＥｘｔｒａ２（）
ｓｔｕｂ．ｃｆｇの記述例をもとに、Ｆｉｇ１−４を用いてオブジェクトＡのサブジェクトａと、オブジェクトＢのオブザーバｂの間でのメッセージの送受信について説明します。
【００２９】
以下はオブジェクトＡのｓｔｕｂ．ｃｆｇです。
ＯｂｊｅｃｔＮａｍｅ　：　ＯｂｊｅｃｔＡ
ＮｕｍＯｆＯＳｕｂｊｅｃｔ　　　：　１
ＮｕｍＯｆＯＯｂｓｅｒｖｅｒ　　：　１
Ｓｅｒｖｉｃｅ　：　’ＯｂｊｅｃｔＡ．ＳｅｎｄＳｔｒｉｎｇ．ｃｈａｒ．Ｓ’，　ｎｕｌｌ，　ｓｕｂｊｅｃｔ＿ａ（）
Ｓｅｒｖｉｃｅ　：　’ＯｂｊｅｃｔＡ．ＤｕｍｍｙＯｂｓｅｒｖｅｒ．ＤｏｎｔＣｏｎｎｅｃｔ．Ｏ’，　ｎｕｌｌ，　ｎｕｌｌ
以下はオブジェクトＢのｓｔｕｂ．ｃｆｇです。
ＯｂｊｅｃｔＮａｍｅ　：　ＯｂｊｅｃｔＢ
ＮｕｍＯｆＯＳｕｂｊｅｃｔ　　　：　１
ＮｕｍＯｆＯＯｂｓｅｒｖｅｒ　　：　１
Ｓｅｒｖｉｃｅ　：　’ＯｂｊｅｃｔＢ．ＤｕｍｍｙＳｕｂｊｅｃｔ．ＤｏｎｔＣｏｎｎｅｃｔ．Ｓ’，　ｎｕｌｌ，　ｎｕｌｌ
Ｓｅｒｖｉｃｅ　：　’ＯｂｊｅｃｔＢ．ＲｅｃｅｉｖｅＳｔｒｉｎｇ．ｃｈａｒ．Ｏ’，　ｎｕｌｌ，　ｏｂｓｅｒｖｅｒ＿ｂ（）
サブジェクトａとオブザーバｂのサービスの接続がＣＯＮＮＥＣＴ．ＣＦＧで以下のように記述されているとします。
ＯｂｊｅｃｔＡ．ＳｅｎｄＳｔｒｉｎｇ．ｃｈａｒ．Ｓ　　　　　ＯｂｊｅｃｔＢ．ＲｅｃｅｉｖｅＳｔｒｉｎｇ．ｃｈａｒ．Ｏ
このとき、メッセージの送受信の手順は以下になります。
【００３０】
メッセージの送受信の手順を図４に記述します。
（１）オブジェクトＢのＤｏＳｔａｒｔ（）より、オブジェクトＡのサブジェクトへＡＳＳＥＲＴ−ＲＥＡＤＹを送信します。この通知はオブジェクトＡのコアクラスのｓｕｂｊｅｃｔ＿ａ（）に届きます。
（２）ｓｕｂｊｅｃｔ＿ａ（）はサブジェクトにメッセージを送信します。この通知はオブジェクトＢのコアクラスのｏｂｓｅｒｖｅｒ＿ｂ（）に届きます。
（３）オブザーバｂがサブジェクトＡから次のメッセージを送信してほしいときは、サブジェクトへＡＳＳＥＲＴ−ＲＥＡＤＹを送信します。
【００３１】
２．４　ＤｏＩｎｉｔ（），　ＤｏＳｔａｒｔ（），　ＤｏＳｔｏｐ（），　ＤｏＤｅｓｔｒｏｙ（）
コアクラスでＤｏＩｎｉｔ（）、ＤｏＳｔａｒｔ（）、ＤｏＳｔｏｐ（）、ＤｏＤｅｓｔｒｏｙ（）をオーバーライドして、各コアクラスに固有の処理を記述します。
ＤｏＩｎｉｔ（）
ＤｏＩｎｉｔ（）は起動時に呼ばれます。ＤｏＩｎｉｔ（）は通信サービスの登録を行います。以下は記述を簡略化するためのマクロです。
ＮＥＷ＿ＡＬＬ＿ＳＵＢＪＥＣＴ＿ＡＮＤ＿ＯＢＳＥＲＶＥＲ
サブジェクトとオブザーバを必要数だけ登録します。
ＲＥＧＩＳＴＥＲ＿ＡＬＬ＿ＥＮＴＲＹ
他のオブジェクトのサービスとの接続を登録します。
ＳＥＴ＿ＡＬＬ＿ＲＥＡＤＹ＿ＡＮＤ＿ＮＯＴＩＦＹ＿ＥＮＴＲＹ
メッセージを受信するエントリを設定します。
以下はマクロを使用したサンプルコードです。
2004001148.tif 000006
【００３２】
ＤｏＳｔａｒｔ（）
ＤｏＩｎｉｔ（）がすべてのオブジェクトで実行された後で呼ばれます。通常、各オブザーバは接続先のサブジェクトへＡＳＳＥＲＴ−ＲＥＡＤＹを送信します。ＤｏＳｔａｒｔ（）はＤｏＩｎｉｔ（）の後に１回だけ呼ばれます。特定のオブザーバへＡＳＳＥＲＴ−ＲＥＡＤＹを送信するタイミングを遅らせたいときは、ＤｏＳｔａｒｔ（）の代わりに、別のメンバー関数の中でサブジェクトへ送信することができます。以下は記述を簡略化するためのマクロです。
ＥＮＡＢＬＥ＿ＡＬＬ＿ＳＵＢＪＥＣＴ
コアクラスが持つサブジェクトを有効にします。
ＡＳＳＥＲＴ＿ＲＥＡＤＹ＿ＴＯ＿ＡＬＬ＿ＯＢＳＥＲＶＥＲ
接続されているすべてのサブジェクトにＡＳＳＥＲＴ＿ＲＥＡＤＹを送信します。
以下はマクロを使用したサンプルコードです。
2004001148.tif 000007
【００３３】
ＤｏＳｔｏｐ（）
シャットダウン時に呼ばれます。各オブザーバは通常、接続先のサブジェクトにＤＥＡＳＳＥＲＴ−ＲＥＡＤＹを送信します。以下は記述を簡略化するためのマクロです。
ＤＩＳＡＢＬＥ＿ＡＬＬ＿ＳＵＢＪＥＣＴ
コアクラスが持つサブジェクトを無効にします。
ＤＥＡＳＳＥＲＴ＿ＲＥＡＤＹ＿ＴＯ＿ＡＬＬ＿ＯＢＳＥＲＶＥＲ
接続されているすべてのサブジェクトにＤＥＡＳＳＥＲＴ＿ＲＥＡＤＹを送信します。
以下はマクロを使用したサンプルコードです。
2004001148.tif 000008
【００３４】
ＤｏＤｅｓｔｒｏｙ（）
シャットダウン時に、全てのオブジェクトに対するＤｏＳｔｏｐ（）の呼び出しの後に呼ばれます。以下は記述を簡略化するためのマクロです。
ＤＥＬＥＴＥ＿ＡＬＬ＿ＳＵＢＪＥＣＴ＿ＡＮＤ＿ＯＢＳＥＲＶＥＲ
すべてのサブジェクトとオブザーバを消去します。
以下はマクロを使用したサンプルコードです。
2004001148.tif 000009
【００３５】
２．５　データの送受信
オブザーバがデータを受信できるときは、サブジェクトへＡＳＳＥＲＴ−ＲＥＡＤＹのメッセージを送信します。
2004001148.tif 000010
オブザーバーからＡＳＳＥＲＴ−ＲＥＡＤＹのメッセージを受信すると、サブジェクトはオブザーバへデータを送信します。
2004001148.tif 000011
オブザーバは、サブジェクトからデータを受信した後に再びデータを受信できるときは、サブジェクトへＡＳＳＥＲＴ−ＲＥＡＤＹを送信します。
2004001148.tif 000012
ここでｏｂｊＦｕｎｃ１やｓｂｊＦｕｎｃ２はオブザーバやサブジェクトを特定するためのＩＤで、ｓｔｕｂｇｅｎ２コマンドを実行してｓｔｕｂ．ｃｆｇから自動生成されるｄｅｆ．ｈで定義されます。
【００３６】
第３章　ビルド
図５はオブジェクトをビルドし、実行ファイルを作成する手順を示す図です。
３．１　．ｏｃｆ
．ｏｃｆの拡張子を持つファイルは、オブジェクトの設定を記述するために使用します。以下は．ｏｃｆファイルのフォーマットです。
ｏｂｊｅｃｔ　ＯＢＪＥＣＴ＿ＮＡＭＥ　ＳＴＡＣＫ＿ＳＩＺＥ　ＨＥＡＰ＿ＳＩＺＥ　ＳＣＨＥＤ＿ＰＲＩＯＲＩＴＹ　ＣＡＣＨＥ　ＴＬＢ　ＭＯＤＥ
以下は．ｏｃｆのサンプルコードです。
ｏｂｊｅｃｔ　ｈｅｌｌｏＷｏｒｌｄ　３０７２　１６３８４　１２８　ｃａｃｈｅ　ｔｌｂ　ｕｓｅｒ
以下は．ｏｃｆのパラメーターです。
ＯＢＪＥＣＴ＿ＮＡＭＥ
オブジェクトの名前です。
ＳＴＡＣＫ＿ＳＩＺＥ
スタックのサイズ（単位はバイト）です。スタックは実行時には拡張されません。オブジェクトが指定したサイズ以上のスタックを使用した場合（例えば、多くのａｕｔｏ変数を宣言した場合や、深くネストされた関数呼び出しを行った場合）の結果は不定です。
【００３７】
ＨＥＡＰ＿ＳＩＺＥ
オブジェクトがヒープ領域を使い切ったときに、ヒープがここで指定したサイズ（単位はバイト）だけ拡張されます。ヒープはｍａｌｌｏｃ（）やｎｅｗ演算子で要求されるメモリーを確保するための領域です。ＨＥＡＰ＿ＳＩＺＥの指定が小さいと、オブジェクトはヒープの拡張を頻繁に行うようになり、実行速度の低下につながります。
【００３８】
ＳＣＨＥＤ＿ＰＲＩＯＲＩＴＹ
オブジェクトのスケジューリング優先度を８ビットの符号無し正数によって指定します。上位４ビットがスケジューリングクラスを表します。スケジューリングクラスの低いオブジェクトは、スケジューリングクラスの高いオブジェクトの実行中には実行されません。通常のアプリケーションのスケジューリングクラスの推奨値は１２８以下です。下位４ビットは同じスケジューリングクラスのオブジェクト間での実行率を制御します。この値が高いほど、オブジェクトはより多くの実行時間を確保できます。
【００３９】
ＣＡＣＨＥ
ｃａｃｈｅまたはｎｏｃａｃｈｅを指定します。ｎｏｃａｃｈｅを指定したときは、オブジェクトの実行中にプロセッサーのキャッシュメモリーが無効になります。通常はｃａｃｈｅを指定してください。
【００４０】
ＴＬＢ
ｔｌｂまたはｎｏｔｌｂを指定します。ｔｌｂの指定を推奨します。ＭＯＤＥにｕｓｅｒを指定したときはｔｌｂを指定します。ｔｌｂを指定したときは、オブジェクト用のメモリー領域が仮想アドレス空間に確保されます。ｎｏｔｌｂを指定したときは、オブジェクト用のメモリー領域が物理アドレス空間（ＫＳＥＧ０または１）に確保されます。この値は後述するｎｏｍｅｍｐｒｏｔのコンフィグレーションが使用されたときは無視されます。
【００４１】
ＭＯＤＥ
ｋｅｒｎｅｌまたはｕｓｅｒを指定します。ｕｓｅｒを指定したときは、オブジェクトの実行時にプロセッサーの実行モードがユーザーモードに設定されます。ｋｅｒｎｅｌを指定したときは、カーネルモードでオブジェクトが実行されます。この値はｎｏｍｅｍｐｒｏｔのコンフィグレーションが使用されたときは無視され、オブジェクトは常にカーネルモードで実行されます。
【００４２】
３．２　スタブジェネレータ
ｓｔｕｎｇｅｎ２コマンドによって、オブジェクトのメソッドとコアクラスのメンバー関数を接続するための中間ファイルが、ｓｔｕｂ．ｃｆｇから生成されます。中間ファイルの中にｄｅｆ．ｈがあります。以下はｄｅｆ．ｈのサンプルコードです。
ｃｏｎｓｔ　ｉｎｔ　ｓｂｊＦｕｎｃ１　＝　０；
ｃｏｎｓｔ　ｉｎｔ　ｏｂｓＦｕｎｃ２　＝　０；
ｓｂｊやｏｂｓはｓｔｕｂ．ｃｆｇに記述されるサブ名の先頭に追加されます。
以下はＳａｍｐｌｅＣｌａｓｓ．ｈでの定義です。
ＯＳｕｂｊｅｃｔ＊　　　　　　ｓｕｂｊｅｃｔ［ｎｕｍＯｆＳｕｂｊｅｃｔ］；
ＯＯｂｓｅｒｖｅｒ＊　　　ｏｂｓｅｒｖｅｒ［ｎｕｍＯｆＯｂｓｅｒｖｅｒ］；
ｓｂｊＦｕｎｃ１とｏｂｓＦｕｎｃ２はサブジェクトとオブザーバを指定するためのＩＤの記述です（例　：ｓｕｂｊｅｃｔ［ｓｂｊＦｕｎｃ１］　　ｏｂｓｅｒｖｅｒ［ｏｂｓＦｕｎｃ２］）。
【００４３】
３．３　コンパイルとアセンブル
以下のコマンドを使用してコンパイルもしくはアセンブルを行います。コマンドは、Ｃ＋＋ソースファイル（．ｃｃ）とアセンブリ言語ソースファイル（．ｓ）で共通です。
／ｕｓｒ／ｌｏｃａｌ／ＯＰＥＮ＿Ｒ＿ＳＤＫ／ｂｉｎ／ｍｉｐｓｅｌ−ｌｉｎｕｘ−ｇｃｃ　−ｃ　［ｏｔｈｅｒ　ｏｐｔｉｏｎｓ］　ＦＩＬＥ
これはオブジェクトファイルを作成します。オブジェクトファイルの名前は、ソースファイルの拡張子を．ｏに変えたものになります。−ｃオプションを必ず指定してください。−ｃなしの場合、ｇｃｃはリンクフェーズに進んで失敗します。ＯＰＥＮ−Ｒ　ＳＤＫでは、ｇｃｃコマンドを使ってリンクを行なうことはできません。代わりにｍｋｂｉｎコマンドを使用してください。他のオプションの詳細は、ｇｃｃのマニュアルを参照してください。必要に応じて−Ｉオプションを使用し、ヘッダーファイルの置かれているディレクトリーを指定してください。以下のオプションを使用すると、ＯＰＥＮ−Ｒヘッダーファイルを使用することができます。
−Ｉ／ｕｓｒ／ｌｏｃａｌ／ＯＰＥＮ＿Ｒ＿ＳＤＫ／ＯＰＥＮ＿Ｒ／ｉｎｃｌｕｄｅ／Ｒ４０００
−Ｉ／ｕｓｒ／ｌｏｃａｌ／ＯＰＥＮ＿Ｒ＿ＳＤＫ／ＯＰＥＮ＿Ｒ／ｉｎｃｌｕｄｅ
【００４４】
３．４　リンク
オブジェクトファイルのリンクには、以下のコマンドを使用してください。
／ｕｓｒ／ｌｏｃａｌ／ＯＰＥＮ＿Ｒ＿ＳＤＫ／ＯＰＥＮ＿Ｒ／ｂｉｎ／ｍｋｂｉｎ　−ｏ　ＸＸＸ．ｂｉｎ　ＸＸＸ．ｏｃｆ
［ｏｔｈｅｒ　ｏｐｔｉｏｎｓ］　ＡＡＡ．ｏ　ＢＢＢ．ｏ　ＣＣＣ．ｏ
これはオブジェクトファイルＡＡＡ．ｏ，　ＢＢＢ．ｏ，　ＣＣＣ．ｏ　．．．をリンクし、実行ファイルＸＸＸ．ｂｉｎを作成します。拡張子．ｏｃｆを持つファイルは、オブジェクトの設定を記述するためのファイルです。ｍｋｂｉｎの他のオプションは、下記のリスト挙げたものを除いて、ｍｋｂｉｎが内部的に呼び出すリンカーに渡されます。リンカーに渡すことのできるオプションについては、ＧＮＵ　ｌｄのマニュアルを参照してください。コマンドラインで指定したオプションに加えて、ｍｋｂｉｎは、デフォルトのライブラリをリンクするためのオプションをリンカーに渡します。−ｖフラグを指定してｍｋｂｉｎを実行することにより、リンカーに渡されるオプションを確認することができます。ｍｋｂｉｎはいくつかの中間ファイルを作成しますが、それらは自動的には削除されません。中間ファイルの名前は、作成する実行ファイルの名前をもとに、以下のようにして決められます。
１．　拡張子が．ｂｉｎの場合、それを取り除く。
２．　次に、以下の文字列の１つを末尾に追加する。
．ｓｎａｐ．ｃｃ，　．ｓｎａｐ．ｏ，　．ｎｏｓｎａｐ．ｅｌｆ，　．ｓｎａｐ．ｅｌｆ，　．ｒｅｌ．ｅｌｆ
以下はｍｋｂｉｎで処理されるオプションのリストです。
−ｏ　ＰＡＴＨ
作成する実行ファイルのパスを指定します。デフォルト値はａ．ｂｉｎです。
−ｍ　ＰＡＴＨ
．ｏｃｆのパスを指定します。ＰＡＴＨが．ｏｃｆで終わる場合。　−ｍは省略できます。
−ｐ　ＰＡＴＨ
ＯＰＥＮ−　Ｒ　ＳＤＫがインストールされたディレクトリーを指定します。デフォルト値は／ｕｓｒ／ｌｏｃａｌ／ＯＰＥＮ＿Ｒ＿ＳＤＫです。
−−ｎｏｄｅｆａｕｌｔｌｉｂ
デフォルトライブラリーのリンクを禁止します。
−−ｎｏｃｒｔ
起動定型処理のリンクを禁止します。このオプションを指定しないときは、以下のファイルが自動的にリンクされます。
ｃｒｔｂｅｇｉｎ．ｏ
ｃｒｔｅｎｄ．ｏ
−−ｎｏｖｍ
作成する実行ファイルはｎｏｍｅｍｐｒｏｔのコンフィギュレーションで使用することを指定します。その効果は、．ｏｃｆファイルでＴＬＢに対してｎｏｔｌｂを、ＭＯＤＥに対してｋｅｒｎｅｌを指定したのと同じです。
−ｖ
冗長なメッセージを出力します。
【００４５】
第４章　実行
４．１　ＯＰＥＮ−Ｒコンフィグレーションの選択
ＯＰＥＮ−Ｒコンフィグレーションには下記の種類があります。／ｕｓｒ／ｌｏｃａｌ／ＯＰＥＮ＿Ｒ＿ＳＤＫ／ＯＰＥＮ＿Ｒ／ＭＳ／ディレクトリーに、各コンフィギュレーションに対応したＯＰＥＮ−Ｒディレクトリーが置かれています。ロボットでオブジェクトを実行させるためには、ＯＰＥＮ−Ｒディレクトリーの１つとユーザが作ったオブジェクトを合わせて、ＡＩＢＯプログラミングメモリースティックにコピーして使用します。
ＢＡＳＩＣ／ｍｅｍｐｒｏｔ／ＯＰＥＮ−Ｒ／
ＢＡＳＩＣ／ｎｏｍｅｍｐｒｏｔ／ＯＰＥＮ−Ｒ／
ＷＬＡＮ／ｍｅｍｐｒｏｔ／ＯＰＥＮ−Ｒ／
ＷＬＡＮ／ｎｏｍｅｍｐｒｏｔ／ＯＰＥＮ−Ｒ／
ＷＣＯＮＳＯＬＥ／ｍｅｍｐｒｏｔ／ＯＰＥＮ−Ｒ／
ＷＣＯＮＳＯＬＥ／ｎｏｍｅｍｐｒｏｔ／ＯＰＥＮ−Ｒ／
【００４６】
４．１．１　ＢＡＳＩＣ／ＷＬＡＮ／ＷＣＯＮＳＯＬＥの違い
以下の中から目的に応じて選択します。
ＢＡＳＩＣ
無線ＬＡＮ環境を使用しないとき
ＷＬＡＮ
無線ＬＡＮ環境を使用して、無線コンソールを使用しないとき
ＷＣＯＮＳＯＬＥ
無線ＬＡＮ環境と無線コンソールを使用するとき
【００４７】
４．１．２　ｍｅｍｐｒｏｔ　／　ｎｏｍｅｍｐｒｏｔ
以下の中から目的に応じて選択します。
ｍｅｍｐｒｏｔは、メモリー保護を有効にします。オブジェクトをｕｓｅｒ／ｔｌｂモードで動作させることができます。ｕｓｅｒ／ｔｌｂモードについては「３．１　．ｏｃｆ」を参照してください。ｕｓｅｒ／ｔｌｂモードのオブジェクトが使用するメモリーは、ＴＬＢ（ｔｒａｎｓｌａｔｉｏｎ　ｌｏｏｋａｓｉｄｅ　ｂｕｆｆｅｒ）を使用する仮想アドレス空間に配置されます。以下の長所と短所があります。
長所：ｕｓｅｒモードで実行されるオブジェクトは他のオブジェクトのメモリー空間にアクセスできません。そのため、誤った値のポインターの使用によるバグを見つけやすくなります。仮想アドレス空間では、物理的に連続していない複数のメモリー領域を、連続したメモリー領域として使用することができます。そのため、メモリーの利用効率が向上します。
短所：共有メモリの確保の単位が４０９６バイト単位になります。従って、小さな共有メモリを大量に確保した場合、メモリの利用効率が悪くなります。以下の点で、プログラムの実行速度に多少のオーバヘッドがかかります。（ａ）ＴＬＢミス発生時の、仮想アドレスから物理アドレスへの変換、（ｂ）共有メモリの確保、解放、他オブジェクトへのアタッチ
ｎｏｍｅｍｐｒｏｔは、メモリー保護を無効にします。すべてのオブジェクトはｋｅｒｎｅｌ／ｎｏｔｌｂモードで動作します。ｍｅｍｐｒｏｔとの反対の長所、短所を持ちます。ｎｏｍｅｍｐｒｏｔ環境下では、共有メモリを使用せずに、あるオブジェクトから他のオブジェクトのメモリ領域にアクセスできます。しかし、ｎｏｍｅｍｐｒｏｔ環境でも共有メモリ用のＡＰＩを使用することで、ソースコードをｍｅｍｐｒｏｔ　環境と共通にすることができます。ｎｏｍｅｍｐｒｏｔ環境下では、共有メモリ用のＡＰＩはほとんど何もしないダミー関数として実装されていて、高速に動作します。
【００４８】
４．２　設定ファイル
ＡＩＢＯ上でオブジェクトを実行するためには、複数の設定ファイルを編集します。以下にＯＢＪＥＣＴ．ＣＦＧ、ＣＯＮＮＥＣＴ．ＣＦＧ、ＤＥＳＩＧＮＤＢ．ＣＦＧの記述方法を示します。これらのファイルはＡＩＢＯプログラミングメモリースティックの　／ＯＰＥＮ−Ｒ／ＭＷ／ＣＯＮＦ　ディレクトリーに置かれます。
【００４９】
４．２．１　ＯＢＪＥＣＴ．ＣＦＧ
実行したいオブジェクトに対応する実行ファイル名を列挙します。
／ＭＳ／ＯＰＥＮ−Ｒ／ＭＷ／ＯＢＪＳ／ＸＸＸ．ＢＩＮ
／ＭＳ／ＯＰＥＮ−Ｒ／ＭＷ／ＯＢＪＳ／ＹＹＹ．ＢＩＮ
／ＭＳ／は、ＡＩＢＯプログラミングメモリースティックのルートディレクトリーを表します。
【００５０】
４．２．２　ＣＯＮＮＥＣＴ．ＣＦＧ
サブジェクトとオブザーバの接続を記述します。
Ｃｌａｓｓ１．Ｆｕｎｃ１．Ｄａｔａ１．Ｓ　Ｃｌａｓｓ２．Ｆｕｎｃ２．Ｄａｔａ１．Ｏ
Ｃｌａｓｓ１．Ｆｕｎｃ３．Ｄａｔａ２．Ｓ　Ｃｌａｓｓ３．Ｆｕｎｃ４．Ｄａｔａ２．Ｏ
各行は以下の様に記述します。
’サブジェクトサービス（．Ｓ）’，’スペース’，’オブザーバサービス（．Ｏ）’
サブジェクトサービスとオブザーバサービスのデータ名は同一でなければなりません。
【００５１】
４．２．３　ＤＥＳＩＧＮＤＢ．ＣＦＧ
ロボットの機種によってプログラムの中で参照するファイルを切り替えることができます。ファイルを探すためのキーワードを記述します。
＃
＃　ＤＥＳＩＧＮＤＢ．ＣＦＧ
＃
［ＥＲＳ−２１０］
ＫＥＹＷＯＲＤ１　　　／ＭＳ／ＯＰＥＮ−Ｒ／ＭＷ／ＣＯＮＦ／ＥＲＳ−２１０．ＴＸＴ
ＫＥＹＷＯＲＤ２　　　／ＭＳ／ＯＰＥＮ−Ｒ／ＭＷ／ＤＡＴＡ／Ｐ／２１０．ＷＡＶ
［ＥＲＳ−２２０］
ＫＥＹＷＯＲＤ１　　　／ＭＳ／ＯＰＥＮ−Ｒ／ＭＷ／ＣＯＮＦ／ＥＲＳ−２２０．ＴＸＴ
ＫＥＹＷＯＲＤ２　　　／ＭＳ／ＯＰＥＮ−Ｒ／ＭＷ／ＤＡＴＡ／Ｐ／２２０．ＷＡＶ
／ＭＳ／は、ＡＩＢＯプログラミングメモリースティックのルートディレクトリーを表します。
ＫＥＹＷＯＲＤ１　はファイルの識別用のタグです。ＫＥＹＷＯＲＤ１　はＯＰＥＮ−Ｒ　ＡＰＩを使用してデータファイルを読み込むときに使用します。
ＯＰＥＮＲ：：ＦｉｎｄＤｅｓｉｇｎＤａｔａ（’ＫＥＹＷＯＲＤ１’，
（ＯＤｅｓｉｇｎＤａｔａＩＤ＊）＆ｍｅｍＩＤ，　＆ａｄｄｒ，　＆ｓｉｚｅ）；
【００５２】
４．３　ＡＩＢＯ上での実行
４．３．１　ＡＩＢＯプログラミングメモリースティックの作成
最初にＯＰＥＮ−ＲディレクトリーをＡＩＢＯプログラミングメモリースティックのルートディレクトリーにコピーします。次に実行ファイル（ｘｘｘ．ｂｉｎ）をＡＩＢＯプログラミングメモリースティックにコピーします。実行ファイルは以下のディレクトリーにコピーします。
／ＯＰＥＮ−Ｒ／ＭＷ／ＯＢＪＳ／
ＬＥＤ、モーション、サウンドのコンテンツデータは、ＡＩＢＯプログラミングメモリースティックの以下のディレクトリにコピーします。
／ＯＰＥＮ−Ｒ／ＭＷ／ＤＡＴＡ／Ｐ／
図６にＯＰＥＮ−Ｒのディレクトリ構成を示します。
【００５３】
４．３．１　ＡＩＢＯプログラミングメモリースティックの実行
ＯＰＥＮ−Ｒディレクトリーと設定ファイルを置いたＡＩＢＯプログラミングメモリースティックをＡＩＢＯに挿入して、ポーズボタンを押します。
【００５４】
第５章　デバッグ
５．１　エラーログ出力
デバッグのために文字列を出力する際に、Ｃ／Ｃ＋＋のｐｒｉｎｔｆやｃｏｕｔを使うことも出来ますが、複数オブジェクトが並行動作するＯＰＥＮ−Ｒの環境では表示される文字列が混在して表示されます。この問題をさけるためにＯＳＹＳＰＲＩＮＴ、ＯＳＹＳＤＥＢＵＧ、ＯＳＹＳＬＯＧ１マクロの使用を推奨します。
ＯＳＹＳＰＲＩＮＴ（），　ＯＳＹＳＤＥＢＵＧ（）　は　ｐｒｉｎｔｆ（）　と同じ引数を指定できます。ＯＳＹＳＤＥＢＵＧ（）　は　ＯＰＥＮＲ＿ＤＥＢＵＧ　が定義されていないときには空文字列に展開されます。ＯＰＥＮＲ＿ＤＥＢＵＧ　は、以下に示すようにコンパイラフラグＤＯＰＥＮＲ＿ＤＥＢＵＧ　で定義します。
ＯＳＹＳＰＲＩＮＴ（（’ｔｅｓｔ：　％ｄ￥ｎ’，　ｘ，　ｙ））；
ＯＳＹＳＤＥＢＵＧ（（’Ｈｅｌｌｏ￥ｎ’））；
ＯＳＹＳＰＲＩＮＴとＯＳＹＳＤＥＢＵＧの表示文字列の最大長は、終端に付加されるヌル文字を含めて２４３文字です。
【００５５】
ＯＳＹＳＬＯＧ１は、エラー表示用のマクロです。第１引数にはエラーレベルを定義します。ＯＳＹＳＬＯＧ１では文字列の後ろに改行コードが自動的に付加されます。
ＯＳＹＳＬＯＧ１（（ｏｓｙｓｌｏｇＥＲＲＯＲ，　’Ｔｈｉｓ　ｉｓ　ｅｒｒｏｒ！’））；
ＯＳＹＳＬＯＧ１の結果は次のような文字列が表示されます。
［ｏｉｄ：８０００００４３，ｐｒｉｏ：１］　Ｔｈｉｓ　ｉｓ　ｅｒｒｏｒ！
「ｐｒｉｏ：」に続く数値は第１引数で指定したエラーレベルです。ＯＳＹＳＬＯＧ１の第１引数には以下のエラーレベルが指定できます。
ｐｒｉｏ　　　　　　　ｏｉｄ，ｐｒｉｏの表示　　　ｐｒｉｏ値
ｏｓｙｓｌｏｇＥＲＲＯＲ　　　　表示　　　　　　１
ｏｓｙｓｌｏｇＷＡＲＮＩＮＧ　　　表示　　　　　　２
ｏｓｙｓｌｏｇＩＮＦＯ　　　　　表示　　　　　　３
【００５６】
５．２　ＣＰＵ例外の調査
プログラムが誤まった動作（不正なアドレスの参照や不正な命令の実行など）　を行なうと、ＣＰＵ例外が発生し、プログラムの実行が強制終了する場合があります。強制終了時には、特定のブザー音が鳴り、ＣＰＵ例外の原因の解析に必要な情報がメモリースティックに書き込まれます。ここでは、その情報を元にＣＰＵ　例外の原因を解析する方法を説明します。ＡＩＢＯで使っているＣＰＵはＭＩＰＳプロセッサです。ＣＰＵ例外の原因の解析には、ＭＩＰＳ　アーキテクチャに関する知識が必要です。
【００５７】
５．２．１　解析に必要な基礎知識
・ＯＰＥＮ−Ｒの動作モード
ＣＰＵ　は　３２　ビットモード、リトルエンディアンで動作。
・システムが強制終了となるＣＰＵ例外
ＴＬＢ　例外
アドレスエラー例外
予約命令例外
浮動小数点演算例外
コプロセッサ使用不可例外
バスエラー例外
【００５８】
・コンパイラのレジスター使用方法
ＭＩＰＳ　　ＣＰＵの汎用レジスターは３２個あります。かっこの中の名前は　ｃｏｎｖｅｎｔｉｏｎａｌ　ｎａｍｅ　です。
ｒ０　（ｚｅｒｏ）
値が常に０のレジスターです。
【００５９】
ｒ２，　ｒ３　（ｖ０，　ｖ１）
サブルーチンの戻り値を保持するために使用します。ｖ１　は６４ｂｉｔ　の値を返す場合に使われます。
【００６０】
ｒ４−ｒ７　（ａ０−ａ３）
サブルーチン呼出し時の引数を保持するために使用します。引数が５以上の場合はスタックに積まれます。Ｃ＋＋　のメンバー関数呼出し時には　ａ０　が　ｔｈｉｓ　ポインタになります。
【００６１】
ｒ８−ｒ１５，　ｒ２４，　ｒ２５　（ｔ０−ｔ７，　ｔ８，　ｔ９）
サブルーチンの中で値を保存せずに使います。そのため別のサブルーチンを呼び出して戻ってきた時の値は保証されません。例えば　ｔ０　の値を１にセットし、別のサブルーチンを呼出して戻ってきた時に　　ｔ０　の値が　１　である保証はありません。
【００６２】
ｒ１６−ｒ２３，　ｒ３０　（ｓ０−ｓ７，　ｓ８）
サブルーチンの中で一時的に使いますが、使う前に値を保存します。そのため別のサブルーチンを呼び出して戻ってきた時の値が保証されます。例えば　ｓ０　の値を１にセットし、別のサブルーチンを呼出して戻ってきた時も　ｓ０　の値は　１です。
【００６３】
ｒ２８　（ｇｐ）
サブルーチンの先頭で、シンボル＿ｇｐの実行時のアドレスを指すようにセットします。他のシンボルの実行時のアドレスを決定する際に使用します。
【００６４】
ｒ２９　（ｓｐ）
スタックポインターです。スタックを使用するサブルーチンは、サブルーチンの先頭で使用するサイズ分、スタックポインターの値を減らし、サブルーチンから戻る前にスタックポインターを元の位置まで増やします。
３ｃ８：　　　　２７ｂｄｆｆｃ８　　　　　ａｄｄｉｕ　　ｓｐ，ｓｐ，−５６
４４０：　　　　０３ｅ００００８　　　　ｊｒ　　　　ｒａ
４４４：　　　　２７ｂｄ００３８　　　　ａｄｄｉｕ　　ｓｐ，ｓｐ，５６
【００６５】
ｒ３１　（ｒａ）
サブルーチンの戻りアドレスを保持するために使用します。リンクを伴うジャンプ命令（ｊａｌ，　ｊａｌｒ）を使ってサブルーチンを呼び出した場合、戻りアドレスはこの命令の２つ先です。そしてサブルーチンの最後の命令は概して　ｊａ　ｒａ　です。サブルーチンの中で別のサブルーチンを呼び出す場合は、　ｒａ　をスタックに保存します。
【００６６】
システム制御コプロセッサーのレジスタの中には次のものがあります。
Ｓｔａｔｕｓ
オペレーティングモードや割り込みマスクなどの状態を保持します。
Ｃａｕｓｅ
ＣＰＵ　例外の原因情報を保持します。
ＢａｄＶＡｄｄｒ
仮想アドレスの参照によって発生する　ＣＰＵ　例外（ＴＬＢ例外、アドレスエラー例外）の発生時に、原因になった仮想アドレスを保持します。
ＥＰＣ
ＣＰＵ　例外の発生時に、実行していた命令のアドレスを保持します。
【００６７】
コンパイラのスタック使用方法
サブルーチン呼出しやレジスタ　ｓ０−ｓ８　を使うサブルーチンは使用するレジスタの元の値を保存するためにスタックを使います。スタックは　ａｕｔｏ　変数の記憶領域として使われることも有ります。サブルーチン呼出しをする場合、ＯＰＥＮ−Ｒ　ＳＤＫのコンパイラー　ｇｃｃ，　ｇ＋＋　は、今の　ｒａ　をスタックの最上位ワードアドレスに保存します。
以下に例を示します。
2004001148.tif 000013
図７は関数　ｅｎｔｒｙ＿ｐｏｉｎｔ０　から順に　ｆｕｎｃ１，　ｆｕｎｃ２　と呼び出され、　ｆｕｎｃ２　のアドレス（ａ）を実行中のスタックの状態を示します。
【００６８】
ＭＩＰＳ　アーキテクチャに関しての詳しい内容は、以下の文献を参照してください。　Ｓｅｅ　ＭＩＰＳ　Ｒｕｎ（著者：　Ｄｏｍｉｎｉｃ　Ｓｗｅｅｔｍａｎ、出版社：　Ｍｏｒｇａｎ　Ｋａｕｆｍａｎｎ　Ｐｕｂｌｉｓｈｅｒｓ、ＩＳＢＮ：　１５５８６０４１０３）、ＭＩＰＳ　ＲＩＳＣ　Ａｒｃｈｉｔｅｃｔｕｒｅ（著者：　Ｇｅｒｒｙ　Ｋａｎｅ，Ｊｏｅ　Ｈｅｉｎｒｉｃｈ、出版社：　Ｐｒｅｎｔｉｃｅ　Ｈａｌｌ、ＩＳＢＮ：　０１３５９０４７２２）、ｍｉｐｓ　ＲＩＳＣ　アーキテクチャ　−　Ｒ２０００／Ｒ３０００　−（著者：　Ｇｅｒｒｙ　Ｋａｎｅ、監訳：　前川　守、出版社：　共立出版、ＩＳＢＮ：　４３２００２５９８９）
【００６９】
５．２．２　ＣＰＵ例外発生時のシステムの動作
システムが強制終了する　ＣＰＵ　例外が発生した場合、システムはすべてのオブジェクトの動作を止めた状態で　Ｅｘｃｅｐｔｉｏｎ　Ｍｏｎｉｔｏｒ　を起動します。この時には無線コンソールの動作も停止します。Ｅｘｃｅｐｔｉｏｎ　Ｍｏｎｉｔｏｒ　はＡＩＢＯプログラミングメモリースティックの／ＯＰＥＮ−Ｒ／ＳＹＳＴＥＭ／ＣＯＮＦ／ＥＭＯＮ．ＣＦＧ　に書かれているコマンドを実行した後、ＡＩＢＯ　の電源を切ります。
【００７０】
５．２．２．１　デフォルトの　ＥＭＯＮ．ＣＦＧ
ＥＭＯＮ．ＣＦＧのファイルは、以下のディレクトリーにあります。
／ＯＰＥＮ−Ｒ／ＳＹＳＴＥＭ／ＣＯＮＦ／
ＥＭＯＮ．ＣＦＧの内容
ｐｌａｙ　ｅｘｃｅｐｔｉｏｎ
ｐｌａｙ　ｗａｒｎｉｎｇ
ｅｘｃｅｐｔｉｏｎ　＞　／ＭＳ／ＯＰＥＮ−Ｒ／ＥＭＯＮ．ＬＯＧ
ｃｐ０　＞＞　／ＭＳ／ＯＰＥＮ−Ｒ／ＥＭＯＮ．ＬＯＧ
ｃｐ１　＞＞　／ＭＳ／ＯＰＥＮ−Ｒ／ＥＭＯＮ．ＬＯＧ
ｏｂｊｓ　＞＞　／ＭＳ／ＯＰＥＮ−Ｒ／ＥＭＯＮ．ＬＯＧ
ｄｓｔａｃｋ　−ｍａｘ　０ｘ４０００　−ｒ　０ｘ４０　＞＞　／ＭＳ／ＯＰＥＮ−Ｒ／ＥＭＯＮ．ＬＯＧ
ｐｌａｙ　ｆｉｎｉｓｈ
【００７１】
／ＭＳ／は、ＡＩＢＯプログラミングメモリースティックのルートディレクトリーを表します。５つのコマンド　ｅｘｃｅｐｔｉｏｎ，　ｃｐ０，　ｃｐ１，　ｏｂｊｓ，ｄｓｔａｃｋ　の出力が、ＡＩＢＯプログラミングメモリースティックの／ＯＰＥＮ−Ｒ／ＥＭＯＮ．ＬＯＧに書かれます。Ｅｘｃｅｐｔｉｏｎ　Ｍｏｎｉｔｏｒ　の起動からシステム終了まで、　ｐｌａｙ　コマンドによって音を鳴らしています。音が鳴っている間は、メモリースティックへの書き込み中です。
【００７２】
５．２．３　ＣＰＵ例外の種類とオブジェクトの特定
ＣＰＵ例外の種類は　ＥＭＯＮ．ＬＯＧ　を調べて　ｅｘｃｅｐｔｉｏｎ　コマンドが最後に出力する　ｅｘｃｅｐｔｉｏｎ　ｃｏｄｅ　の表示を探します。オブジェクトを特定するには　［ｏｂｊｅｃｔ　ｉｎｆｏ］ｃｏｎｔｅｘｔ　の値と　［ｏｂｊｅｃｔ　ｌｉｓｔ］　の情報を使います。例えば　ＥＭＯＮ．ＬＯＧに図８のように書かれていたら、オブジェクトｃｒａｓｈ　がＣＰＵ例外発生の原因です。
【００７３】
５．２．４　アセンブリ命令の特定
ＴＬＢ　例外やアドレスエラー例外が起きた場合は、まず　ＢａｄＶＡｄｄｒ　の値を調べます。アドレスエラー例外の場合、ＢａｄＶＡｄｄｒ　にはアラインのとれていないアドレスなどメモリー参照に失敗したアドレスが保持されています。
【００７４】
ＴＬＢ　例外の場合、ＢａｄＶＡｄｄｒ　にはアドレス変換に失敗した仮想アドレスが保持されています。そして　ＥＰＣ　の値を調べます。ＥＰＣ　の値が　ＢａｄＶＡｄｄｒ　の値と同じ場合は、不正なアドレスにジャンプしてＣＰＵ例外になっていると考えられます。もし　ｒａ　の値が有効なアドレスなら、次に示す手順でそのアドレスのアセンブリ命令を調べます。ＥＰＣ　の値がＢａｄＶＡｄｄｒの値と違う場合は　、ＥＰＣ　の値のアドレスのアセンブリ命令を調べます。そこがデータ領域であったりスタック領域であることもあります。どこかで誤ってデータ領域やスタック領域にジャンプし、偶然にＣＰＵ例外になったという状態です。その時はそこにジャンプする前の付近のアドレスがわかる　ｒａ　の値でアセンブリ命令を調べます。
【００７５】
アセンブリ命令の調べ方
Ｅｘｃｅｐｔｉｏｎ　Ｍｏｎｉｔｏｒ　でわかるアドレスは実行時に決まるアドレスなので、アセンブリ命令を調べるには、それに対応するリンク時のアドレスを計算します。次の計算をします。
＜リンク時のアドレス＞　＝
＜実行時のアドレス＞　−　＜ｇｐ　レジスターの値＞　＋　＜シンボル　＿ｇｐ　のアドレス＞
ｇｐ　レジスターの値は　ＥＭＯＮ．ＬＯＧ　の　［ｇｅｒｅｎａｌ　ｒｅｇｉｓｔｅｒ］　ｇｐ：ｒ２８：　の値を調べます。
シンボル　＿ｇｐ　のリンク時のアドレスは、ＣＰＵ例外を起こしたオブジェクトの　．ｂｉｎ　ファイルを作成したディレクトリーで、次のコマンドを実行して調べます。
2004001148.tif 000014
２番目に表示される値、この例では　０ｘ００４６６４９０です。
【００７６】
この計算でリンク時のアドレスがわかったら、次のコマンドを実行します。
％　ｍｉｐｓｅｌ−ｌｉｎｕｘ−ｏｂｊｄｕｍｐ　−ｄ　−Ｃ　＜オブジェクト名＞．ｎｏｓｎａｐ．ｅｌｆ
このオブジェクトの逆アセンブル結果が表示されるので、リンク時のアドレス周辺のアセンブリ命令と関数名を確認します。例えば次の例で、知りたいアドレスが　４００３ｄ８　の場合、上記のコマンドを実行すると、図９に示すような実行結果が出力されます。
【００７７】
ここでは、その場所が関数　ａｃｃｅｓｓ＿ｎｕｌｌ＿ｄａｔａ＿ｐｏｉｎｔｅｒ（）　内であることがわかります。関数名までわかったらソースコードを探し、逆アセンブル結果とソースコードを突き合わせて問題の箇所を特定します。仮に逆アセンブル結果に知りたいアドレスがなかった場合は、次のコマンドの実行結果から、そのアドレスがテキスト領域かどうかを確認します。
％　ｍｉｐｓｅｌ−ｌｉｎｕｘ−ｎｍ　−ｎ　−Ｃ　＜オブジェクト名＞．ｎｏｓｎａｐ．ｅｌｆ
また次のコマンドの実行結果から、データ領域の内容を確認します。
％　ｍｉｐｓｅｌ−ｌｉｎｕｘ−ｏｂｊｄｕｍｐ　−ｓｔ　−Ｃ　＜オブジェクト名＞．ｎｏｓｎａｐ．ｅｌｆ
ＥＭＯＮ．ＬＯＧ　の　［ｓｔａｃｋ　ｉｎｆｏ］，　［ｓｔａｃｋ　ｄｕｍｐ］　から、スタックの内容も確認します。
【００７８】
５．２．５　ＥＭＯＮ．ＣＦＧ　で使えるコマンド
ｅｘｃｅｐｔｉｏｎ
このコマンドはＣＰＵ例外を起こしたオブジェクトの情報や例外発生時の汎用レジスターの内容を出力します。
書式：ｅｘｃｅｐｔｉｏｎ
実行例：ｅｘｃｅｐｔｉｏｎの実行例は、図１０に示す。
【００７９】
ｃｐ０
このコマンドはコプロセッサ　０　（ｓｙｓｔｅｍ　ｃｏｎｔｒｏｌ　ｃｏｐｒｏｃｅｓｓｏｒ）　のレジスターの内容を表示します。
書式：　ｃｐ０
実行例：　ｃｐ０の実行例は、図１１に示す。
【００８０】
ｃｐ１
このコマンドはコプロセッサ　１　（浮動小数点ユニット）のレジスターの内容を表示します。
書式：　ｃｐ１
実行例：　ｃｐ１の実行例は、図１２に示す。
【００８１】
ｏｂｊｓ
このコマンドはＣＰＵ例外発生時に存在したオブジェクトのリストを表示します。
このコマンドの出力からオブジェクト名と　ｃｏｎｔｅｘｔ　ＩＤ　との対応を調べることができます。
書式：　ｏｂｊｓ
実行例：　ｏｂｉｓの実行例は、図１３に示す。
【００８２】
ｓｔａｃｋ，　ｄｓｔａｃｋ
ｓｔａｃｋ　コマンドはＣＰＵ例外を起こしたオブジェクトのスタック情報、ｄｓｔａｃｋ　コマンドはさらにスタックの内容を表示します。引数なしで実行した場合、　ｄｓｔａｃｋ　コマンドはスタックを　ｓｐ　の指すアドレスからダンプします。オプション　−ｍａｘ　でダンプする最大サイズを指定することができます。またオプション　−ｒ　を付けた場合、指定サイズ分　ｓｐ　よりも下位のアドレスからダンプします。また両コマンドともにオブジェクトの　ｃｏｎｔｅｘｔ　ＩＤ　を引数に指定して別のオブジェクトのスタック情報を表示することができます。
2004001148.tif 000015
【００８３】
ｔｌｂ
ｔｌｂ　コマンドは　ＴＬＢ　の内容を表示します。
書式：　ｔｌｂ
実行例：　ｔｌｂの実行例は、図１５に示す。
【００８４】
ｄｕｍｐ
ｄｕｍｐ　コマンドはメモリー内容を１６進数で表示します。引数にはアドレスを指定します。サイズを指定しなかった場合は、サイズを　０ｘ１００　として表示します。オプション　−ｗ　を指定した場合は２バイトごとの表示、−ｌ　を指定した場合は４バイトごとの表示です。１６進表示の右側にはバイトごとにＡＳＣＩＩ文字を表示します。表示できない文字の場合は、代わりにピリオド　’．’　を表示します。この文字表示はオプション　−ｌ，　−ｗ　によって変わりません。
書式：　ｄｕｍｐ　［−ｗ｜−ｌ］　ａｄｄｒ　［ｓｉｚｅ］
実行例　（ｄｕｍｐ　０ｘ８０４６０２３８　０ｘ４０）：　ｄｕｍｐの実行例は、図１６に示す。
【００８５】
ｐｌａｙ
このコマンドは音を鳴らすために使用します。引数で鳴らすメロディを選択します。
書式：　ｐｌａｙ　ｍｅｌｏｄｙ　　引数　ｍｅｌｏｄｙ　の説明
ｅｘｃｅｐｔｉｏｎ：　Ｅｘｃｅｐｔｉｏｎ　Ｍｏｎｉｔｏｒ　の起動用です。
Ｗａｒｎｉｎｇ：　メモリースティック書き込み中の警告用です。このメロディは自動的にループします。
Ｆｉｎｉｓｈ：　メモリースティック書き込みの終了用です。
【００８６】
Ａ．ライブラリー関数
ＯＰＥＮ−Ｒ　ＳＤＫで作成するプログラムでは、以下の関数が利用できます。これらの関数を定義するライブラリは、ｍｋｂｉｎコマンドによって自動的にリンクされます。
【００８７】
Ａ．１　ファイルシステム
以下の関数を使ってファイルシステムにアクセスすることができます。ｗｒｉｔｅ（）とｒｅａｄ（）関数はターミナルにアクセスするためにも使用します。以下の関数は同名のＵＮＩＸ　ＡＰＩとほぼ同様に動作します。関数：ｏｐｅｎ，　ｃｌｏｓｅ，　ｒｅａｄ，　ｗｒｉｔｅ，　ｌｓｅｅｋ，　ｆｓｔａｔ，　ｓｔａｔ，　ｕｎｌｉｎｋ，　ｉｓａｔｔｙ，ｍｋｄｉｒ，　ｒｍｄｉｒ，　ｏｐｅｎｄｉｒ，　ｃｌｏｓｅｄｉｒ，　ｒｅａｄｄｉｒ，ｒｅｗｉｎｄｄｉｒ
以下にＯＰＥＮ−Ｒ　ＳＤＫ特有の動作について説明します。
３未満のファイルディスクリプターは、ターミナルデバイス（ｔｅｌｎｅｔターミナル）を表わします。
ディスクリプター０、１、２の間で違いはありません。ファイルディスクリプターはシステム全体を通じて共通です。あるオブジェクトから他のオブジェクトによってオープンされたファイルディスクリプターを使用することができます。
以下は、ファイルシステムのパスに関する制限です。
・ディレクトリーの区切りは／で示します。
・パスは／ＭＳ／で始める必要があります。／ＭＳ／はＡＩＢＯプログラミングメモリースティックのルートを表わします。相対パスは使用できません。
・ファイル名は８＋３フォーマットです。
例
ＢＡＳＥＮＡＭＥ．ＥＸＴ　　　　　（正）
ＢＡＳＥＮＡＭＥＥＸＴ　　　　　　　　（誤）
ファイル名と拡張子を区別する記号は’．’です。
・以下は使用できる文字です。小文字は自動的に大文字に変換されます。
【００８８】
ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ
ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ
０１２３４５６７８９
＄＆＃｛｝￣％’（）−＠＾｀！＿
ｏｐｅｎ（）では、以下のフラグが使用できます。
Ｏ＿ＲＤＯＮＬＹ，　Ｏ＿ＷＲＯＮＬＹ，　Ｏ＿ＲＤＷＲ，　Ｏ＿ＡＰＰＥＮＤ，　Ｏ＿ＣＲＥＡＴＥ，　Ｏ＿ＴＲＵＮＣ，　Ｏ＿ＥＸＣＬ
ｏｐｅｎ（）　は、ｍｏｄｅ＿ｔ型の引数を無視します。すでにオープンされているファイルを再度オープンできるのは、双方のｏｐｅｎ（）の呼び出しで、Ｏ＿ＲＤＯＮＬＹを指定した場合に限ります。ｉｓａｔｔｙ（）　は、ファイルディスクリプターが３未満なら１を返します。それ以外は０を返します。
【００８９】
以下は、ｓｔａｔ（）とｆｓｔａｔ（）から返される構造体のメンバー変数です。下記以外のメンバーは、未定義の値を持ちます。
ｓｔ＿ｓｉｚｅ：　ファイルサイズです。この値はファイルがオープンしている間、正しい値を示さない場合があります。
ｓｔ＿ｍｏｄｅ：　アクセス権は常に０７７７です。ファイルの場合Ｓ＿ＩＦＲＥＧビットが１になります。ディレクトリの場合Ｓ＿ＩＦＤＩＲビットが１になります。
ｍｋｄｉｒ（）はｍｏｄｅ＿ｔ型の引数を無視します。ｒｅａｄｄｉｒ（）を使って読み込み可能なエントリの最大数は６８２です。ｒｅａｄｄｉｒ（）の返すｄｉｒｅｎｔ構造体は、ｄ＿ｎａｍｅフィールドのみが有効です。その他のフィールドの値は未定義です。ｄ＿ｎａｍｅフィールドには、ディレクトリエントリの名前がヌルで終わる文字列で格納されます。ｒｅａｄｄｉｒ（）はボリュームラベルとロングファイルネームのエントリを返しません。
【００９０】
Ａ．２　Ｃ標準ライブラリー
ＯＰＥＮ−Ｒ　ＳＤＫはＣライブラリー用にｎｅｗｌｉｂ−１．９．０を使用します。以下はＯＰＥＮ−Ｒ　ＳＤＫ特有の動作について説明します。
以下のＵＮＩＸ　ＡＰＩに依存する関数は動作しません。
ｅｘｅｃｖｅ，　ｆｏｒｋ，　ｇｅｔｐｉｄ，　ｇｅｔｔｉｍｅｏｆｄａｙ，　ｋｉｌｌ，　ｌｉｎｋ，　ｔｉｍｅｓ，　ｗａｉｔ，　ｆｃｎｔｌ
以下の関数がこれにあてはまります。
ｃｌｏｃｋ，　ｆｄｏｐｅｎ，　ｒａｉｓｅ，　ｓｉｇｎａｌ，　ｓｙｓｔｅｍ，　ｍｋｓｔｅｍｐ，　ｍｋｔｅｍｐ，　ｔｅｍｐｎａｍ，　ｔｍｐｆｉｌｅ，　ｔｍｐｎａｍ。
以下のＵＮＩＸ　ＡＰＩに依存する関数については、前節で説明したように、ＯＰＥＮ−Ｒ　ＳＤＫ特有の振舞いを持ちます。
ｏｐｅｎ，　ｃｌｏｓｅ，　ｒｅａｄ，　ｗｒｉｔｅ，　ｌｓｅｅｋ，　ｆｓｔａｔ，　ｓｔａｔ，　ｕｎｌｉｎｋ，　ｉｓａｔｔｙ
以下の関数がこれにあてはまります。
ｆｃｌｏｓｅ，　ｆｆｌｕｓｈ，　ｆｇｅｔｃ，　ｆｇｅｔｐｏｓ，　ｆｇｅｔｓ，　ｆｉｌｅｎｏ，　ｆｉｐｒｉｎｔｆ，　ｆｏｐｅｎ，　ｆｐｒｉｎｔｆ，　ｆｐｕｔｃ，　ｆｐｕｔｓ，　ｆｒｅａｄ，　ｆｒｅｏｐｅｎ，　ｆｓｅｅｋ，　ｆｓｅｔｐｏｓ，　ｆｔｅｌｌ，　ｆｗｒｉｔｅ，　ｇｅｔｃ，　ｇｅｔｃｈａｒ，　ｇｅｔｏｐｔ，　ｇｅｔｓ，　ｇｅｔｗ，　ｉｐｒｉｎｔｆ，　ｐｅｒｒｏｒ，　ｐｒｉｎｔｆ，　ｐｕｔｃ，　ｐｕｔｃｈａｒ，　ｐｕｔｓ，ｐｕｔｗ，　ｒｅｍｏｖｅ，　ｒｅｗｉｎｄ，　ｓｅｔｂｕｆ，　ｓｅｔｖｂｕｆ，　ｕｎｇｅｔｃ，　ｖｆｉｐｒｉｎｔｆ，　ｖｆｐｒｉｎｔｆ，　ｖｐｒｉｎｔｆ，　ｓｃａｎｆ，　ｆｓｃａｎｆ
以下の関数は、ｎｅｗｌｉｂの実装を使用しません。
・ｅｘｉｔ（）はオブジェクトの実行を停止します。オブジェクトは、メッセージ待ち状態に入ります。Ｃ＋＋静的変数のデストラクターは、呼ばれません。
・ａｔｅｘｉｔ（）はなにもしません。
・ａｂｏｒｔ（）は、ａｂｏｒｔ（）が呼ばれたという内容のメッセージを表示します。次にａｂｏｒｔ（）はオブジェクトの実行を停止します。オブジェクトは、メッセージ待ち状態に入ります。
・ｒｅｎａｍｅ（）はファイルまたはディレクトリーのパスを変更します。パスについての制限は前節を参照してください。
・ｍａｌｌｏｃ（）やｆｒｅｅ（）などのメモリー割り当て／開放の実装として、ｄｌｍａｌｌｏｃライブラリーバージョン２．７．０を、ｎｅｗｌｉｂにある２．６．４の代わりに使用します。
【００９１】
Ａ．３　Ｃ＋＋標準ライブラリー
ＯＰＥＮ−Ｒ　ＳＤＫは、Ｃ＋＋標準ライブラリーとしてｇｃｃパッケージに含まれるｌｉｂｓｔｄｃ＋＋−ｖ３を使用します。このライブラリは内部的にｎｅｗｌｉｂの関数を呼び出すので、上記の説明は、Ｃ＋＋の機能にも適用されます。
【００９２】
Ｂ．ｓｔｕｂ．ｃｃ
オブジェクトのソースコードは、以下の項目を満たす必要があります。スタブジェネレーターを使用していないときのみ、下記の項目に注意してください。スタブジェネレータで作成されるコードは、自動的に下記の項目を満たします。
【００９３】
ＯｂｊｅｃｔＥｎｔｒｙＴａｂｌｅ
オブジェクトは、ＯｂｊｅｃｔＥｎｔｒｙＴａｂｌｅという名前の構造体を待ちます。この構造体はセレクタ番号とエントリポイントとの対応を指定します。ＯｂｊｅｃｔＥｎｔｒｙＴａｂｌｅは以下の形式を持ちます。
2004001148.tif 000016
ＳＥＬＥＣＴＯＲ＿ＮＵＭＢＥＲは、負数でない整数です。セレクタ番号がＳＥＬＥＣＴＯＲ＿ＮＵＭＢＥＲであるメッセージをオブジェクトが受信したとき、ＥＮＴＲＹ＿ＰＯＩＮＴが呼ばれます。ＥＮＴＲＹ＿ＰＯＩＮＴには、後述するＧＥＮ＿ＥＮＴＲＹマクロを使用して定義した関数を指定します。
【００９４】
ＧＥＮ＿ＥＮＴＲＹ　マクロ
ＧＥＮ＿ＥＮＴＲＹマクロは、２個の引数ＥＮＴＲＹＮＡＭＥとＦＵＮＮＡＭＥをとり、ＥＮＴＲＹＮＡＭＥで指定した名前のエントリポイント関数を定義します。この関数はラッパー（ｗｒａｐｐｅｒ）関数です。この関数はいくつかのレジスターを設定しＦＵＮＮＡＭＥで指定した関数を呼びます。ＯｂｊｅｃｔＥｎｔｒｙＴａｂｌｅに登録するすべての関数は、このマクロを使用して定義します。関数ＦＵＮＮＡＭＥはＣリンケージを持ち、受信したメッセージのデータを指すｖｏｉｄ＊型の１個の引数をとります。ＧＥＮ＿ＥＮＴＲＹマクロはａｐｓｙｓ．ｈで定義されます。
【００９５】
ＰｒｏｌｏｇｕｅＥｎｔｒｙ
次の行をオブジェクトのソースコード内に記述する必要があります。
ＧＥＮ＿ＥＮＴＲＹ（ＰｒｏｌｏｇｕｅＥｎｔｒｙ，　Ｐｒｏｌｏｇｕｅ）；
これはエントリポイント関数ＰｒｏｌｏｇｕｅＥｎｔｒｙ（）を定義します。この関数はオブジェクトがロードされたときに呼ばれます。ＰｒｏｌｏｇｕｅＥｎｔｒｙ（）は、ｌｉｂａｐｓｙｓ．ａで定義されるＰｒｏｌｏｇｕｅ（）を呼びます。ｌｉｂａｐｓｙｓ．ａはｍｋｂｉｎコマンドでオブジェクトに自動的にリンクされます。Ｐｒｏｌｏｇｕｅ（）はいくつかの初期化を行い、Ｃ＋＋の大域変数のコンストラクターを呼びます。
【００９６】
コード例
以下は上記の条件を満たすコード例です。
2004001148.tif 000017
＜レファレンスガイド＞
続いて、本具体例で用いられるオブジェクトの基底クラスについて説明する。
【００９７】
第１章　基底クラス
１．１　ＯＯｂｊｅｃｔクラス
ＯＯｂｊｅｃｔは、オブジェクトの基底クラスです。オブジェクトのｏｅｎｔｒｙＩＮＩＴ、ｏｅｎｔｒｙＳＴＡＲＴ、ｏｅｎｔｒｙＳＴＯＰ、ｏｅｎｔｒｙＤＥＳＴＲＯＹのエントリに対してＩｎｉｔ（）、Ｓｔａｒｔ（）、Ｓｔｏｐ（）、Ｄｅｓｔｒｏｙ（）を対応づけます。ＯＯｂｊｅｃｔＭａｎａｇｅｒからｏｅｎｔｒｙＩＮＩＴ、ｏｅｎｔｒｙＳＴＡＲＴ、ｏｅｎｔｒｙＳＴＯＰ、ｏｅｎｔｒｙＤＥＳＴＲＯＹ　にメッセージが送信されると、Ｉｎｉｔ（）、Ｓｔａｒｔ（）、Ｓｔｏｐ（）、　Ｄｅｓｔｒｏｙ（）が起動され、それぞれＤｏＩｎｉｔ（）、ＤｏＳｔａｒｔ（）、ＤｏＳｔｏｐ（）、ＤｏＤｅｓｔｒｏｙ（）を起動します。ＯＯｂｊｅｃｔの継承クラスでは、ＤｏＩｎｉｔ（）、ＤｏＳｔａｒｔ（）、ＤｏＳｔｏｐ（）、ＤｏＤｅｓｔｒｏｙ（）でオブジェクトに固有の処理を記述します。ＯＯｂｊｅｃｔはｐｒｏｔｅｃｔｅｄメンバーにｍｙＯＩＤ＿　を持ち、継承クラスで使用できます。ｍｙＯＩＤ＿　は、ＯＯｂｊｅｃｔ：：ＯＯｂｊｅｃｔ（）で初期化されます。
【００９８】
ヘッダファイルは、「＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＯｂｊｅｃｔ．ｈ＞」、ライブラリは、「ｌｉｂＯＰＥＮＲ．ａ」である。クラスを以下に示す。
2004001148.tif 000018
【００９９】
また、ＯＯｂｊｅｃｔクラスには、以下のメンバー関数があります。
・Ｉｎｉｔ（）
構文は、ｖｏｉｄ　Ｉｎｉｔ（ｃｏｎｓｔ　ＯＳｙｓｔｅｍＥｖｅｎｔ＆　ｅｖｅｎｔ）　であり、オブジェクトが初期化されるときにＯＯｂｊｅｃｔＭａｎａｇｅｒ　から呼ばれます。Ｉｎｉｔ時に、ｅｖｅｎｔがＯＯｂｊｅｃｔＭａｎａｇｅｒからオブジェクトへ渡されます。　Ｉｎｉｔ（）はＤｏＩｎｉｔ（）を起動し、ＤｏＩｎｉｔ（）の戻り値をＯＯｂｊｅｃｔＭａｎａｇｅｒに通知します。仮引数は、ｅｖｅｎｔ（Ｉｎｉｔ　のイベント情報）である。戻り値はない。
【０１００】
・Ｓｔａｒｔ（）
構文は、ｖｏｉｄ　Ｓｔａｒｔ（ｃｏｎｓｔ　ＯＳｙｓｔｅｍＥｖｅｎｔ＆　ｅｖｅｎｔ）　であり、オブジェクトが起動するときにＯＯｂｊｅｃｔＭａｎａｇｅｒ　から呼ばれます。Ｓｔａｒｔ時に、ｅｖｅｎｔがＯＯｂｊｅｃｔＭａｎａｇｅｒからオブジェクトへ渡されます。Ｓｔａｒｔ（）はＤｏＳｔａｒｔ（）を起動し、ＤｏＳｔａｒｔ（）の戻り値をＯＯｂｊｅｃｔＭａｎａｇｅｒに通知します。仮引数は、ｅｖｅｎｔ（Ｓｔａｒｔ　のイベント情報）である。戻り値はない。
【０１０１】
・Ｓｔｏｐ（）
構文は、ｖｏｉｄ　Ｓｔｏｐ（ｃｏｎｓｔ　ＯＳｙｓｔｅｍＥｖｅｎｔ＆　ｅｖｅｎｔ）　であり、オブジェクトが停止するときにＯＯｂｊｅｃｔＭａｎａｇｅｒ　から呼ばれます。Ｓｔｏｐ時に、ｅｖｅｎｔがＯＯｂｊｅｃｔＭａｎａｇｅｒからオブジェクトへ渡されます。Ｓｔｏｐ（）はＤｏＳｔｏｐ（）を起動し、ＤｏＳｔｏｐ（）の戻り値をＯＯｂｊｅｃｔＭａｎａｇｅｒに通知します。仮引数は、ｅｖｅｎｔ（Ｓｔｏｐ　のイベント情報）である。戻り値はない。
【０１０２】
・Ｄｅｓｔｒｏｙ（）
構文は、ｖｏｉｄ　Ｄｅｓｔｒｏｙ（ｃｏｎｓｔ　ＯＳｙｓｔｅｍＥｖｅｎｔ＆　ｅｖｅｎｔ）　であり、オブジェクトが破壊されるときにＯＯｂｊｅｃｔＭａｎａｇｅｒから呼ばれます。Ｄｅｓｔｒｏｙ時に、ｅｖｅｎｔがＯＯｂｊｅｃｔＭａｎａｇｅｒからオブジェクトへ渡されます。Ｄｅｓｔｒｏｙ（）はＤｏＤｅｓｔｒｏｙ（）を起動し、ＤｏＤｅｓｔｒｏｙ（）の戻り値をＯＯｂｊｅｃｔＭａｎａｇｅｒに通知します。仮引数は、ｅｖｅｎｔ（Ｄｅｓｔｒｏｙ　のイベント情報）であり、戻り値はない。
【０１０３】
・ＤｏＩｎｉｔ（）
構文は、ＯＳｔａｔｕｓ　ＤｏＩｎｉｔ（ｃｏｎｓｔ　ＯＳｙｓｔｅｍＥｖｅｎｔ＆　ｅｖｅｎｔ）　であり、Ｉｎｉｔ（）から起動されます。継承クラスでオーバーライドして固有の処理を記述します。ｅｖｅｎｔはＩｎｉｔ（）で渡されるものと同じです。ＤｏＩｎｉｔ（）の戻り値がＩｎｉｔ（）の中でＯＯｂｊｅｃｔＭａｎａｇｅｒに対して通知されます。仮引数は、ｅｖｅｎｔ（Ｉｎｉｔのイベント情報）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、その他（失敗の場合は、ｏＳＵＣＣＥＳＳ以外を返します。）がある。戻り値は、オーバライドするＤｏＩｎｉｔ（）で自由に設定できます。
【０１０４】
・ＤｏＳｔａｒｔ（）
構文は、ＯＳｔａｔｕｓ　ＤｏＳｔａｒｔ（ｃｏｎｓｔ　ＯＳｙｓｔｅｍＥｖｅｎｔ＆　ｅｖｅｎｔ）　であり、Ｓｔａｒｔ（）から起動されます。継承クラスでオーバーライドして固有の処理を記述します。ｅｖｅｎｔはＳｔａｒｔ（）で渡されるものと同じです。ＤｏＳｔａｒｔ（）の戻り値がＳｔａｒｔ（）の中でＯＯｂｊｅｃｔＭａｎａｇｅｒに対して通知されます。仮引数は、ｅｖｅｎｔ（Ｓｔａｒｔ　のイベント情報）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、その他（失敗の場合は、ｏＳＵＣＣＥＳＳ以外を返します。）がある。戻り値は、オーバライドするＤｏＳｔａｒｔ（）で自由に設定できます。
【０１０５】
・ＤｏＳｔｏｐ（）
構文は、ＯＳｔａｔｕｓ　ＤｏＳｔｏｐ（ｃｏｎｓｔ　ＯＳｙｓｔｅｍＥｖｅｎｔ＆　ｅｖｅｎｔ）　であり、Ｓｔｏｐ（）から起動されます。継承クラスでオーバーライドして固有の処理を記述します。ｅｖｅｎｔはＳｔｏｐ（）で渡されるものと同じです。ＤｏＳｔｏｐ（）の戻り値がＳｔｏｐ（）の中でＯＯｂｊｅｃｔＭａｎａｇｅｒに対して通知されます。仮引数は、ｅｖｅｎｔ（Ｓｔｏｐ　のイベント情報）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、その他（失敗の場合は、ｏＳＵＣＣＥＳＳ以外を返します。）があり、戻り値は、オーバライドするＤｏＳｔｏｐ（）で自由に設定できます。
【０１０６】
・ＤｏＤｅｓｔｒｏｙ（）
構文は、ＯＳｔａｔｕｓ　ＤｏＤｅｓｔｒｏｙ（ｃｏｎｓｔ　ＯＳｙｓｔｅｍＥｖｅｎｔ＆　ｅｖｅｎｔ）　であり、Ｄｅｓｔｒｏｙ（）から起動されます。継承クラスでオーバーライドして固有の処理を記述します。ｅｖｅｎｔはＤｅｓｔｒｏｙ（）で渡されるものと同じです。ＤｏＤｅｓｔｒｏｙ（）の戻り値が、Ｄｅｓｔｒｏｙ（）の中でＯＯｂｊｅｃｔＭａｎａｇｅｒに対して通知されます。仮引数は、ｅｖｅｎｔ（Ｄｅｓｔｒｏｙ　のイベント情報）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、その他（失敗の場合は、ｏＳＵＣＣＥＳＳ以外を返します。）がある。戻り値は、オーバライドするＤｏＤｅｓｔｒｏｙ（）で自由に設定できます。
【０１０７】
・ＲｅｇｉｓｔｅｒＳｅｒｖｉｃｅＥｎｔｒｙ（）
構文は、Ｏｓｔａｔｕｓ　ＲｅｇｉｓｔｅｒＳｅｒｖｉｃｅＥｎｔｒｙ（ｃｏｎｓｔ　ＯＳｅｒｖｉｃｅＥｎｔｒｙ＆　ｅｎｔｒｙ，　ｃｏｎｓｔ　ｃｈａｒ＊　ｎａｍｅ）　であり、サービスエントリを登録します。仮引数は、ｅｎｔｒｙ（サービスエントリ）、ｎａｍｅ（サービスネーム）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＡＬＲＥＡＤＹ＿ＥＸＩＳＴ（すでに同じ名前のサービスエントリが登録されています。）、ｏＦＡＩＬ（失敗）である。
【０１０８】
第２章　オブジェクト間通信
２．１　ＯＳｕｂｊｅｃｔクラス
Ｏｓｕｂｊｅｃｔクラスには、以下のメンバー関数があります。
・ＯＳｕｂｊｅｃｔ（）
構文は、ＯＳｕｂｊｅｃｔ（ｖｏｉｄ）　であり、コンストラクタです。仮引数及び戻り値はない。
【０１０９】
・￣ＯＳｕｂｊｅｃｔ（）
構文は、￣ＯＳｕｂｊｅｃｔ（）であり、デストラクタです。仮引数及び戻り値はない。
【０１１０】
・ＳｅｔＲｅａｄｙＥｎｔｒｙ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＲｅａｄｙＥｎｔｒｙ（ｃｏｎｓｔ　ＯＳｅｒｖｉｃｅＥｎｔｒｙ＆　ｅｎｔｒｙ）　であり、サブジェクトがＡＳＳＥＲＴ−ＲＥＡＤＹメッセージまたはＤＥＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを受信するためのエントリを設定します。この設定はＤｏＩｎｉｔ（）内で行います。仮引数は、ｅｎｔｒｙ（ＡＳＳＥＲＴ−ＲＥＡＤＹメッセージまたはＤＥＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを受信するためのエントリ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１１１】
・ＧｅｔＩＤ（）
構文は、ｃｏｎｓｔ　ＳｕｂｊｅｃｔＩＤ＆　　ＧｅｔＩＤ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、サブジェクトのＳｕｂｊｅｃｔ　ＩＤを取得します。ＳｕｂｊｅｃｔＩＤは、サブジェクトごとに固有値です。仮引数はない。戻り値には、Ｓｕｂｊｅｃｔ　ＩＤがある。
【０１１２】
・ＳｅｔＢｕｆｆｅｒＳｉｚｅ（）
構文は、
ＯＳｔａｔｕｓ　　ＳｅｔＢｕｆｆｅｒＳｉｚｅ（ｓｉｚｅ＿ｔ　ｓｉｚｅ）　であり、サブジェクト内で各オブザーバ用に準備される最大バッファサイズを設定します。この設定を行う場合はＤｏＩｎｉｔ（）内で行います。仮引数は、ｓｉｚｅ（各オブザーバー用の最大バッファサイズ）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１１３】
・ＧｅｔＢｕｆｆｅｒＳｉｚｅ（）
構文は、ｓｉｚｅ＿ｔ　　ＧｅｔＢｕｆｆｅｒＳｉｚｅ（ｖｏｉｄ）　ｃｏｎｓｔであり、ＤｏＩｎｉｔ（）で設定されたバッファサイズを返します。仮引数はない。戻り値は、現在のバッファサイズである。
【０１１４】
・ＳｅｔＮｏｔｉｆｙＵｎｉｔＳｉｚｅ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＮｏｔｉｆｙＵｎｉｔＳｉｚｅ（ｓｉｚｅ＿ｔ　ｓｉｚｅ）　であり、送信データの最小単位を構成するＳｅｔＤａｔａ（）の数を設定します。例えば、あるデータがヘッダとボディから構成され、別々にＳｅｔＤａｔａ（）を実行しＮｏｔｉｆｙＯｂｓｅｒｖｅｒｓ（）を実行する場合、設定する値は２です。この関数の呼び出しは、サブジェクトが準備すべきバッファの大きさを計算する際に使用します。この値を設定する場合は、ＤｏＩｎｉｔ（）の中で行います。設定しない場合のデフォルト値は１です。これはＳｅｔＤａｔａ（）とＮｏｔｉｆｙＯｂｓｅｒｖｅｒｓ（）が１回づつ交互に呼ばれる場合に対応します。仮引数は、ｓｉｚｅ（送信データの最小単位を構成するのに必要なＳｅｔＤａｔａ（）数）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１１５】
・ＧｅｔＮｏｔｉｆｙＵｎｉｔＳｉｚｅ（）
構文は、ｓｉｚｅ＿ｔ　　ＧｅｔＮｏｔｉｆｙＵｎｉｔＳｉｚｅ（ｖｏｉｄ）　ｃｏｎｓｔであり、送信データの最小単位を構成するのに必要なＳｅｔＤａｔａ（）数を返します。仮引数はない。戻り値は、１回の送信に必要なＳｅｔＤａｔａ（）数である。
【０１１６】
・ＳｅｔＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＤａｔａ（ｃｏｎｓｔ　ｖｏｉｄ＊　ｂｕｆ，　ｓｉｚｅ＿ｔ　ｓｉｚｅ）　であり、すべてのオブザーバ用のバッファにデータ（アドレスとサイズ）を設定します。指定したデータは共有メモリ領域にコピーされるので、この関数を呼んだ後でｂｕｆにより指される領域を上書きできます。オーバーフロー時には、最も古い送信用のデータが現在のデータで上書きされます。オーバーフローを事前に知るにはＲｅｍａｉｎＢｕｆｆｅｒ（）を使用します。仮引数は、ｂｕｆ　（データがある領域を指すポインタ）、ｓｉｚｅ（データのサイズ）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１１７】
・ＳｅｔＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＤａｔａ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩｎｆｏ＆　ｉｎｆｏ，　ｃｏｎｓｔ　ｖｏｉｄ＊　ｂｕｆ，　ｓｉｚｅ＿ｔ　ｓｉｚｅ）　であり、指定したオブザーバ用のバッファにデータ（アドレスとサイズ）を設定します。この関数はＦｉｎｄＯｂｓｅｒｖｅｒ（）の呼び出しを省略できる分だけ、ＳｅｔＤａｔａ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆，　ｃｏｎｓｔ　ｖｏｉｄ＊，　ｓｉｚｅ＿ｔ）より効率的です。この関数内で、指定データは共有メモリ領域にコピーされるので、この関数を呼んだ後でｂｕｆにより指される領域を上書きできます。オーバーフロー時には、最も古い送信用のデータが現在のデータで上書きされます。オーバーフローを事前に知るにはＲｅｍａｉｎＢｕｆｆｅｒ（）を使用します。仮引数は、ｉｎｆｏ（オブザーバ情報。ＯｂｓｅｒｖｅｒＩｎｆｏ型は、例えばＯＳｕｂｊｅｃｔ：：ｂｅｇｉｎ（）などの呼び出しによって得られるＯｂｓｅｒｖｅｒＣｏｎｓｔＩｔｅｒａｔｏｒ型が指しているデータにアクセスすることにより取得できます。）、ｂｕｆ　（データのある領域を指すポインタ）、ｓｉｚｅ（データのサイズ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１１８】
・ＳｅｔＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＤａｔａ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　ｉｄ，　ｃｏｎｓｔ　ｖｏｉｄ＊　ｂｕｆ，　ｓｉｚｅ＿ｔ　ｓｉｚｅ）　であり、この関数は、ＳｅｔＤａｔａ（＊ＦｉｎｄＯｂｓｅｒｖｅｒ（ｉｄ），　ｂｕｆ，　ｓｉｚｅ）とまったく同じ動作をします。すなわち、指定したオブザーバ用のバッファにデータ（アドレスとサイズ）を設定します。この関数内で、指定データは共有メモリ領域にコピーされるので、この関数を呼んだ後でｂｕｆにより指される領域を上書きできます。オーバーフロー時には送信用のデータのうち最も古いものが上書きされます。オーバーフローを事前に知るにはＲｅｍａｉｎＢｕｆｆｅｒ（）を使用します。仮引数は、ｉｄ（ＯｂｓｅｒｖｅｒＩＤ。ｉｄがこのサブジェクトに対して無効な場合、この関数の結果または効果は不定です。）、ｂｕｆ（データのある領域を指すポインタ）、ｓｉｚｅ（データのサイズ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１１９】
・ＳｅｔＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＤａｔａ（ＲＣＲｅｇｉｏｎ＊　ｒｅｇｉｏｎ）　であり、すべてのオブザーバ用のバッファに、ｒｅｇｉｏｎ引数で指定される共有メモリ領域を設定します。　オーバーフロー時には送信用のデータのうち最も古いものが上書きされます。オーバーフローを事前に知るにはＲｅｍａｉｎＢｕｆｆｅｒ（）を使用します。　この関数内でＲＣＲｅｇｉｏｎ：：ＡｄｄＲｅｆｅｒｅｎｃｅ（）　が呼ばれ、指定した領域に対する参照カウンタをインクリメントします。指定した領域は、再度使用可能になるまで上書き、または変更しないでください。領域が使用可能か調べるにはＲＣＲｅｇｉｏｎ：：ＮｕｍｂｅｒＯｆＲｅｆｅｒｅｎｃｅ（）を使用します。仮引数は、ｒｅｇｉｏｎ（参照カウンタ付き共有メモリ領域へのポインタ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１２０】
・ＳｅｔＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＤａｔａ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩｎｆｏ＆　ｉｎｆｏ，　ＲＣＲｅｇｉｏｎ＊　ｒｅｇｉｏｎ）　であり、指定したオブザーバー用のバッファに、ｒｅｇｉｏｎ引数で指定される共有メモリ領域を設定します。この関数はＦｉｎｄＯｂｓｅｒｖｅｒ（）の呼び出しを省略できる分だけ、ＳｅｔＤａｔａ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆，　ＲＣＲｅｇｉｏｎ＊　ｒｅｇｉｏｎ）　より効率的です。オーバーフロー時には送信用のデータのうち最も古いものが上書きされます。オーバーフローを事前に知るにはＲｅｍａｉｎＢｕｆｆｅｒ（）を使用します。　この関数内でＲＣＲｅｇｉｏｎ：：ＡｄｄＲｅｆｅｒｅｎｃｅ（）　が呼ばれ、指定した領域に対する参照カウンタをインクリメントします。指定した領域は、再度使用可能になるまで上書き、または変更しないでください。領域が使用可能か調べるには、ＲＣＲｅｇｉｏｎ：：ＮｕｍｂｅｒＯｆＲｅｆｅｒｅｎｃｅ（）を使用します。仮引数は、ｉｎｆｏ（オブザーバ情報。ＯｂｓｅｒｖｅｒＩｎｆｏ型は、例えばＯＳｕｂｊｅｃｔ：：ｂｅｇｉｎ（）などの呼び出しによって得られるＯｂｓｅｒｖｅｒＣｏｎｓｔＩｔｅｒａｔｏｒ型が指しているデータにアクセスすることにより取得できます。）、ｒｅｇｉｏｎ（参照カウンタ付き共有メモリ領域へのポインタ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１２１】
・ＳｅｔＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＤａｔａ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　ｉｄ，　ＲＣＲｅｇｉｏｎ＊　ｒｅｇｉｏｎ）　であり、この関数はＳｅｔＤａｔａ（＊ＦｉｎｄＯｂｓｅｒｖｅｒ（ｉｄ），　ｒｅｇｉｏｎ）と同様に動作します。すなわち、指定したオブザーバ用のバッファに、ｒｅｇｉｏｎ引数で指定される共有メモリ領域を設定します。オーバーフロー時には送信用のデータのうち最も古いものが上書きされます。オーバーフローを事前に知るにはＲｅｍａｉｎＢｕｆｆｅｒ（）を使用します。
この関数内でＲＣＲｅｇｉｏｎ：：ＡｄｄＲｅｆｅｒｅｎｃｅ（）　が呼ばれ、指定した領域に対する参照カウンタをインクリメントします。指定した領域は、再度使用可能になるまで上書きしないでください。領域が使用可能か調べるにはＲＣＲｅｇｉｏｎ：：ＮｕｍｂｅｒＯｆＲｅｆｅｒｅｎｃｅ（）を使用します。仮引数は、ｉｄ（Ｏｂｓｅｒｖｅｒ　ＩＤです。ｉｄがサブジェクトに対して無効な場合は、関数の結果や効果は不定になります。）、ｒｅｇｉｏｎ（参照カウンタ付き共有メモリ領域を指すポインタ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１２２】
・ＳｅｔＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＤａｔａ（ｃｏｎｓｔ　ＯＳｈｍＰｔｒＢａｓｅ＆　ｐ）　であり、すべてのオブザーバ用のバッファに、指定したポインタが指す共有メモリ領域を設定します。オーバーフロー時には、送信用のデータのうち最も古いものが上書きされます。オーバーフローを事前に知るにはＲｅｍａｉｎＢｕｆｆｅｒ（）を使用します。仮引数は、ｐ（参照カウンタ付き共有メモリ領域を指すポインタ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１２３】
・ＳｅｔＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＤａｔａ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩｎｆｏ＆　ｉｎｆｏ，　ｃｏｎｓｔ　ＯＳｈｍＰｔｒＢａｓｅ＆　ｐ）であり、指定したオブザーバー用のバッファに、指定したポインタが指す共有メモリ領域を設定します。　この関数はＦｉｎｄＯｂｓｅｒｖｅｒ（）の呼び出しを省略できる分だけ、ＳｅｔＤａｔａ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆，　ｃｏｎｓｔ　ＯＳｈｍＰｔｒＢａｓｅ＆　ｐ）　より効率的です。　オーバーフロー時には送信用のデータのうち最も古いものが上書きされます。オーバーフローを事前に知るにはＲｅｍａｉｎＢｕｆｆｅｒ（）を使用します。仮引数は、ｉｎｆｏ（オブザーバ情報。ＯｂｓｅｒｖｅｒＩｎｆｏ型は、例えばＯＳｕｂｊｅｃｔ：：ｂｅｇｉｎ（）などの呼び出しによって得られるＯｂｓｅｒｖｅｒＣｏｎｓｔＩｔｅｒａｔｏｒ型が指しているデータにアクセスすることにより取得できます。）、ｐ（参照カウンタ付き共有メモリ領域を指すポインタ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１２４】
・ＳｅｔＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＤａｔａ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　ｉｄ，　ｃｏｎｓｔ　ＯＳｈｍＰｔｒＢａｓｅ＆　ｐ）　であり、指定したオブザーバー用のバッファに、指定したポインタが指す共有メモリ領域を設定します。　オーバーフロー時には送信用のデータのうち最も古いものが上書きされます。オーバーフローを事前に知るにはＲｅｍａｉｎＢｕｆｆｅｒ（）を使用します。ここの関数は、ＳｅｔＤａｔａ（＊ＦｉｎｄＯｂｓｅｒｖｅｒ（ｉｄ），　ｐ）　と同様の動作をします。仮引数は、ｉｄ（Ｏｂｓｅｒｖｅｒ　ＩＤ。　ｉｄがサブジェクトに対して無効な場合は、この関数の結果または効果は不定です。）、ｒｅｇｉｏｎ（参照カウンタ付き共有メモリ領域を指すポインタ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１２５】
・ＮｏｔｉｆｙＯｂｓｅｒｖｅｒ（）
構文は、ＯＳｔａｔｕｓ　　ＮｏｔｉｆｙＯｂｓｅｒｖｅｒ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩｎｆｏ＆　ｏｂｓｅｒｖｅｒ）　であり、指定したオブザーバに、バッファに保持されているデータを送信します。オブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態の場合はデータをすぐに送信します。オブザーバがＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態の場合はデータを削除します。オブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態でもＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態でもない場合はデータをバッファに保持しておき、ＡＳＳＥＲＴ−ＲＥＡＤＹ状態になり次第に送信します。仮引数は、ｏｂｓｅｒｖｅｒ（オブザーバ情報。ＯｂｓｅｒｖｅｒＩｎｆｏ型は、例えばＯＳｕｂｊｅｃｔ：：ｂｅｇｉｎ（）などの呼び出しによって得られるＯｂｓｅｒｖｅｒＣｏｎｓｔＩｔｅｒａｔｏｒ型が指しているデータにアクセスすることにより取得できます。）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１２６】
・ＮｏｔｉｆｙＯｂｓｅｒｖｅｒ（）
構文は、ＯＳｔａｔｕｓ　　ＮｏｔｉｆｙＯｂｓｅｒｖｅｒ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　ｉｄ）　であり、指定したオブザーバに、バッファに保持されているデータを送信します。オブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態の場合はデータをすぐに送信します。オブザーバがＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態の場合はデータを削除します。オブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態でもＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態でもない場合はデータをバッファに保持しておき、ＡＳＳＥＲＴ−ＲＥＡＤＹ状態になり次第に送信します。ＮｏｔｉｆｙＯｂｓｅｒｖｅｒ（＊ＦｉｎｄＯｂｓｅｒｖｅｒ（ｉｄ））と同じ処理を行うため、ＦｉｎｄＯｂｓｅｒｖｅｒ（）のオーバーヘッドを含みます。仮引数は、ｉｄ（ＯｂｓｅｒｖｅｒＩＤ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１２７】
・ＮｏｔｉｆｙＯｂｓｅｒｖｅｒｓ（）
構文は、ＯＳｔａｔｕｓ　　ＮｏｔｉｆｙＯｂｓｅｒｖｅｒｓ（ｖｏｉｄ）　であり、すべてのオブザーバに、バッファに保持されているデータを送信します。オブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態の場合はデータをすぐに送信します。オブザーバがＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態の場合はデータを捨てます。オブザーバーがＡＳＳＥＲＴ−ＲＥＡＤＹ状態でもＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態でもない場合はデータをバッファに保持しておき、ＡＳＳＥＲＴ−ＲＥＡＤＹ状態になり次第に送信します。仮引数はない。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１２８】
・ＲｅｍａｉｎＢｕｆｆｅｒ（）
構文は、ｓｉｚｅ＿ｔ　　ＲｅｍａｉｎＢｕｆｆｅｒ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩｎｆｏ＆　ｏｂｓｅｒｖｅｒ）　ｃｏｎｓｔ　であり、指定されたオブザーバ用のバッファの残り数を返します。ＳｅｔＤａｔａ（）を戻り値より多い回数呼び出すと、バッファに保持されている古いデータから消去されます。仮引数は、ｏｂｓｅｒｖｅｒ（オブザーバ情報。ＯｂｓｅｒｖｅｒＩｎｆｏ型は、例えばＯＳｕｂｊｅｃｔ：：ｂｅｇｉｎ（）などの呼び出しによって得られるＯｂｓｅｒｖｅｒＣｏｎｓｔＩｔｅｒａｔｏｒ型が指しているデータにアクセスすることにより取得できます。）である。戻り値は、バッファの残り数である。
【０１２９】
・ＲｅｍａｉｎＢｕｆｆｅｒ（）
構文は、ｓｉｚｅ＿ｔ　　ＲｅｍａｉｎＢｕｆｆｅｒ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　ｉｄ）　ｃｏｎｓｔ　であり、指定されたオブザーバ用のバッファの残り数を返します。ＳｅｔＤａｔａ（）を戻り値より多い回数呼び出すと、バッファに保持されている古いデータから消去されます。この関数はＲｅｍａｉｎＢｕｆｆｅｒ（＊　ＦｉｎｄＯｂｓｅｒｖｅｒ（ｉｄ））と同じ動作をします。仮引数は、ｉｄ（ｏｂｓｅｒｖｅｒ　ＩＤ）であり、戻り値は、バッファの残り数である。
【０１３０】
・ＲｅｍａｉｎＢｕｆｆｅｒ（）
構文は、ｓｉｚｅ＿ｔ　　ＲｅｍａｉｎＢｕｆｆｅｒ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、オブザーバ用のバッファの残り数を返します。ＳｅｔＤａｔａ（）を戻り値より多い回数呼び出すと、バッファに保持されている古いデータから消去されます。仮引数はない。戻り値は、バッファの残り数である。
【０１３１】
・ＣｌｅａｒＢｕｆｆｅｒ（）
構文は、ＯＳｔａｔｕｓ　ＣｌｅａｒＢｕｆｆｅｒ（ｖｏｉｄ）　であり、すべてのオブザーバの送信バッファをクリアします。仮引数はない。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１３２】
・ＣｌｅａｒＢｕｆｆｅｒ（）
構文は、ＯＳｔａｔｕｓ　ＣｌｅａｒＢｕｆｆｅｒ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩｎｆｏ＆　ｉｎｆｏ）　であり、指定されたオブザーバ用の送信バッファをクリアします。仮引数は、ｉｎｆｏ（オブザーバ情報）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１３３】
・ＣｌｅａｒＢｕｆｆｅｒ（）
構文は、ＯＳｔａｔｕｓ　ＣｌｅａｒＢｕｆｆｅｒ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　ｉｄ）　であり、指定されたオブザーバ用の送信バッファをクリアします。ＣｌｅａｒＢｕｆｆｅｒ（＊ＦｉｎｄＯｂｓｅｒｖｅｒ（ｉｄ））　と同じ動作をします。仮引数は、ｉｄ（オブザーバＩＤ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１３４】
・ＮｕｍｂｅｒＯｆＯｂｓｅｒｖｅｒｓ（）
構文は、ｉｎｔ　　ＮｕｍｂｅｒＯｆＯｂｓｅｒｖｅｒｓ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、サブジェクトに接続しているオブザーバ数を返します。仮引数はない。戻り値は、サブジェクトに接続しているオブザーバ数である。
【０１３５】
・ｂｅｇｉｎ（）
構文は、ＯｂｓｅｒｖｅｒＣｏｎｓｔＩｔｅｒａｔｏｒ　　ｂｅｇｉｎ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、サブジェクトに接続しているオブザーバのリストの中で、最初のオブザーバを指すイテレータ（反復子）を返します。仮引数はない。戻り値は、最初のオブザーバを指すイテレータである。
【０１３６】
・ｅｎｄ（）
構文は、ＯｂｓｅｒｖｅｒＣｏｎｓｔＩｔｅｒａｔｏｒ　　ｅｎｄ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、サブジェクトに接続しているオブザーバのリストの中で、最後のオブザーバの次を指す無効なイテレータを返します。仮引数はない。戻り値は、最後のオブザーバの次を指す無効なイテレータである。
【０１３７】
・ＦｉｎｄＯｂｓｅｒｖｅｒ（）
構文は、ＯｂｓｅｒｖｅｒＣｏｎｓｔＩｔｅｒａｔｏｒ　　ＦｉｎｄＯｂｓｅｒｖｅｒ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　ｉｄ）　ｃｏｎｓｔ　であり、ｉｄで指定したオブザーバを指すイテレータを返します。ｉｄを持つオブザーバが見つからない場合は、無効なイテレータを返します。仮引数はない。戻り値は、指定したオブザーバを指すイテレータである。
【０１３８】
・ＩｓＡｌｌＲｅａｄｙ（）
構文は、ｉｎｔ　ＩｓＡｌｌＲｅａｄｙ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、すべてのオブザーバが、ＡＳＳＥＲＴ−ＲＥＡＤＹ状態またはＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態のどちらであるかを調べます。仮引数はない。戻り値が０以外であれば、すべてのオブザーバーはＡＳＳＥＲＴ−ＲＥＡＤＹ状態またはＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態のどちらかを必ず保持しており、かつ少なくとも１つのオブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態です。この状態でＮｏｔｉｆｙＯｂｓｅｒｖｅｒ（）を実行すると、メッセージが必要なすべてのオブザーバに対して、ただちにメッセージが送信されます。また、０であれば、ＡＳＳＥＲＴ−ＲＥＡＤＹ状態でもＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態でもないオブザーバが少なくと１つあるか、またはすべてがＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態です。
【０１３９】
・ＩｓＡｎｙＲｅａｄｙ（）
構文は、ｉｎｔ　ＩｓＡｎｙＲｅａｄｙ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、ＡＳＳＥＲＴ−ＲＥＡＤＹ状態のオブザーバが存在するかどうかを調べます。仮引数はない。戻り値が０以外であれば、ＡＳＳＥＲＴ−ＲＥＡＤＹ状態のオブザーバが少なくとも１つ存在します。また、０であればＡＳＳＥＲＴ−ＲＥＡＤＹ状態のオブザーバが存在しません。
【０１４０】
・ＩｓＲｅａｄｙ（）
構文は、ｉｎｔ　　ＩｓＲｅａｄｙ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩｎｆｏ＆　ｉｎｆｏ）　ｃｏｎｓｔ　であり、指定したオブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態かどうかを調べます。仮引数は、ｉｎｆｏ（オブザーバ情報。ＯｂｓｅｒｖｅｒＩｎｆｏ型は、例えばＯＳｕｂｊｅｃｔ：：ｂｅｇｉｎ（）などの呼び出しによって得られるＯｂｓｅｒｖｅｒＣｏｎｓｔＩｔｅｒａｔｏｒ型が指しているデータにアクセスすることにより取得できます。）である。戻り値が０以外であれば、指定したオブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態である。０であれば、指定したオブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態でない。
【０１４１】
・ＩｓＲｅａｄｙ（）
構文は、ｉｎｔ　　ＩｓＲｅａｄｙ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　ｉｄ）　ｃｏｎｓｔ　であり、指定したオブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態かどうかを調べます。ＩｓＲｅａｄｙ　（＊ＦｉｎｄＯｂｓｅｒｖｅｒ（ｉｄ））と同じ動作をします。仮引数は、ｉｄ（Ｏｂｓｅｒｖｅｒ　ＩＤ）である。戻り値が０以外であれば、指定したオブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態であり、０であれば、指定したオブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態でない。
【０１４２】
・ＲｅａｄｙＳｔａｔｕｓ（）
構文は、ｉｎｔ　　ＲｅａｄｙＳｔａｔｕｓ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩｎｆｏ＆　ｉｎｆｏ）　ｃｏｎｓｔ　であり、指定したオブザーバの状態を返します。仮引数は、ｉｎｆｏ（オブザーバ情報。ＯｂｓｅｒｖｅｒＩｎｆｏ型は、例えばＯＳｕｂｊｅｃｔ：：ｂｅｇｉｎ（）などの呼び出しによって得られるＯｂｓｅｒｖｅｒＣｏｎｓｔＩｔｅｒａｔｏｒ型が指しているデータにアクセスすることにより取得できます。）である。戻り値が正数であれば、サブジェクトが指定したオブザーバからＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを受信した（ＡＳＳＥＲＴ−ＲＥＡＤＹ状態）ことを示し、０であれば、サブジェクトが指定したオブザーバがメッセージをまだ送信していないので状態が不明であることを示す。また、負数であれば、サブジェクトが指定したオブザーバからＤＥＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを受信した（ＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態）ことを示す。
【０１４３】
・ＲｅａｄｙＳｔａｔｕｓ（）
構文は、ｉｎｔ　　ＲｅａｄｙＳｔａｔｕｓ（ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　ｉｄ）　ｃｏｎｓｔ　であり、指定したオブザーバの状態を返します。ＲｅａｄｙＳｔａｔｕｓ（＊ＦｉｎｄＯｂｓｅｒｖｅｒ（ｉｄ））と同じ動作をします。仮引数は、ｉｄ（Ｏｂｓｅｒｖｅｒ　ＩＤ）である。戻り値が正数であれば、サブジェクトが指定したオブザーバからＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを受信した（ＡＳＳＥＲＴ−ＲＥＡＤＹ状態）ことを示し、０であれば、サブジェクトが指定オブザーバがメッセージをまだ送信していないので状態が不明であることを示し、負数であれば、サブジェクトが指定したオブザーバからＤＥＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを受信した（ＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ状態）ことを示す。
【０１４４】
・ＣｏｎｔｒｏｌＨａｎｄｌｅｒ（）
構文は、ｖｏｉｄ　　ＣｏｎｔｒｏｌＨａｎｄｌｅｒ（ｃｏｎｓｔ　ＯＣｏｎｔｒｏｌＭｅｓｓａｇｅ＆　ｍｓｇ，　ＯＳｔａｔｕｓ　ｓｔａｔｕｓ＝ｏＳＵＣＣＥＳＳ）　であり、受信したＯＣｏｎｔｒｏｌＭｅｓｓａｇｅに応じてサブジェクトの設定を行います。オブジェクトの接続フェーズに呼ばれます。仮引数は、ｍｓｇ（オブザーバから受信したＯＣｏｎｔｒｏｌＭｅｓｓａｇｅ）、ｓｔａｔｕｓ（ユーザー定義の状態です。）であり、デフォルト値はｏＳＵＣＣＥＳＳを指定します。ｏＳＵＣＣＥＳＳでない場合に接続は拒否されます。例えば、ユーザー定義のフックメソッドで初期化やリソース割り当てに失敗した場合は、ｏＦＡＩＬを指定してください。戻り値はない。
【０１４５】
・ＲｅａｄｙＨａｎｄｌｅｒ（）
構文は、ｖｏｉｄ　　ＲｅａｄｙＨａｎｄｌｅｒ（ｃｏｎｓｔ　ＯＲｅａｄｙＭｅｓｓａｇｅ＆　ｍｓｇ）　であり、ＯＲｅａｄｙＭｅｓｓａｇｅを受信して処理します。仮引数は、ｍｓｇ（オブザーバから受信したＯＲｅａｄｙＭｅｓｓａｇｅ）であり、戻り値はない。
【０１４６】
２．２　ＯＲｅａｄｙＥｖｅｎｔクラス
ＯＲｅａｄｙＥｖｅｎｔクラスには、以下のメンバー関数があります。
・ＳｂｊＩｎｄｅｘ（）
構文は、ｉｎｔ　　ＳｂｊＩｎｄｅｘ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、ＯＲｅａｄｙＥｖｅｎｔを受け取るサブジェクトのインデックスを返します。仮引数はない。戻り値は、サブジェクトのインデックスである。
【０１４７】
・ＳｅｎｄｅｒＩＤ（）
構文は、ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　　ＳｅｎｄｅｒＩＤ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、ＯＲｅａｄｙＥｖｅｎｔを送信したオブザーバのＯｂｓｅｒｖｅｒＩＤを返します。仮引数はない。戻り値は、ＯｂｓｅｒｖｅｒＩＤである。
【０１４８】
・ＩｓＡｓｓｅｒｔ（）
構文は、ｂｏｏｌ　　ＩｓＡｓｓｅｒｔ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、ＯＲｅａｄｙＭｅｓｓａｇｅがＡＳＳＥＲＴ−ＲＥＡＤＹメッセージか調べます。仮引数はない。戻り値には、ｔｒｕｅ（ＡＳＳＥＲＴ−ＲＥＡＤＹメッセージ）、ｆａｌｓｅ（上記以外）がある。
【０１４９】
・ＩｓＤｅａｓｓｅｒｔ（）
構文は、ｂｏｏｌ　　Ｉｓ　Ｄｅａｓｓｅｒｔ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、ＯＲｅａｄｙＭｅｓｓａｇｅがＤＥＡＳＳＥＲＴ−ＲＥＡＤＹメッセージか調べます。仮引数はない。戻り値には、ｔｒｕｅ（ＤＥＡＳＳＥＲＴ−ＲＥＡＤＹメッセージ）、ｆａｌｓｅ（上記以外）がある。
【０１５０】
２．３　ＯＯｂｓｅｒｖｅｒクラス
ＯＯｂｓｅｒｖｅｒクラスには、以下のメンバー関数があります。
・ＯＯｂｓｅｒｖｅｒ（）
構文は、ＯＯｂｓｅｒｖｅｒ（ｖｏｉｄ）　であり、これはコンストラクタです。仮引数及び戻り値はない。
・￣ＯＯｂｓｅｒｖｅｒ（）
構文は、￣ＯＯｂｓｅｒｖｅｒ（）　であり、これはデストラクタです。仮引数及び戻り値はない。
【０１５１】
・ＳｅｔＮｏｔｉｆｙＥｎｔｒｙ（）
構文は、ＯＳｔａｔｕｓ　　ＳｅｔＮｏｔｉｆｙＥｎｔｒｙ（ｃｏｎｓｔ　ＯＳｅｒｖｉｃｅＥｎｔｒｙ＆　ｅｎｔｒｙ）　であり、オブザーバーがＮＯＴＩＦＹメッセージを受信するためのエントリを設定します。　この設定はＤｏＩｎｉｔ（）内で行います。仮引数は、ｅｎｔｒｙ（ＮＯＴＩＦＹメッセージを受信するためのエントリ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１５２】
・ＧｅｔＩＤ（）
構文は、ｃｏｎｓｔ　ＯｂｓｅｒｖｅｒＩＤ＆　　ＧｅｔＩＤ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、オブザーバのＯｂｓｅｒｖｅｒ　ＩＤを返します。ＯｂｓｅｒｖｅｒＩＤはオブザーバごとに固有の値をとります。仮引数はない。戻り値は、各オブザーバに固有の値である。
【０１５３】
・ＳｅｔＢｕｆＣｔｒｌＰａｒａｍ（）
構文は、ｖｏｉｄ　　ＳｅｔＢｕｆＣｔｒｌＰａｒａｍ（ｓｉｚｅ＿ｔ　ｓｋｉｐ，　ｓｉｚｅ＿ｔ　ｍｉｎ，　ｓｉｚｅ＿ｔ　ｍａｘ）　であり、サブジェクトが保持するオブザーバ用のバッファに必要な制御パラメーターを設定します。この設定はＤｏＩｎｉｔ（）内で行います。
仮引数は、ｓｋｉｐ（受信するデータ数を減少させるために、データスキップ（サンプリング間隔）を指定します。デフォルト値は０で、サブサンプリングなしです。）、ｍｉｎ（サブジェクトがＮＯＴＩＦＹメッセージをオブザーバへ送信するときのデータの最小数を指定します。デフォルト値は１に設定されます。このパラメーターを適切に設定することで、データを損失しないでデータの受信頻度を減らすことができます。）、ｍａｘ（オブザーバがＡＳＳＥＲＴ−ＲＥＡＤＹ状態になるまでに、サブジェクトがバッファに保持しておくべき送信用のバッファサイズの最大値を指定します。このパラメーターはｍｉｎ以上に設定する必要があります。デフォルト値は１で、その場合は最後の送信用のデータだけがバッファに保持されます。）である。戻り値はない。
【０１５４】
・ＳｅｔＳｋｉｐ（）
構文は、ｖｏｉｄ　　ＳｅｔＳｋｉｐ（ｓｉｚｅ＿ｔ　ｓｋｉｐ）　であり、サブジェクトの保持するオブザーバ用のバッファに必要な制御パラメーターを設定します。この設定はＤｏＩｎｉｔ時に行います。この関数は過去との互換をとるためだけいに用意され、ＳｅｔＢｕｆＣｔｒＰａｒａｍ（ｓｋｉｐ，１，１）と同じ動作をします。仮引数は、ｓｋｉｐ（受信するデータ数を減少させるために、データスキップ（サンプリング間隔）を指定します。　デフォルト値は０で、サブサンプリングなしです。）である。戻り値はない。
【０１５５】
・ＡｓｓｅｒｔＲｅａｄｙ（）
構文は、ＯＳｔａｔｕｓ　　ＡｓｓｅｒｔＲｅａｄｙ（ｖｏｉｄ）　であり、接続しているすべてのサブジェクトにＡＳＳＥＲＴ−ＲＥＡＤＹを送信します。仮引数はない。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１５６】
・ＡｓｓｅｒｔＲｅａｄｙ（）
構文は、ＯＳｔａｔｕｓ　　ＡｓｓｅｒｔＲｅａｄｙ（ｃｏｎｓｔ　ＳｕｂｊｅｃｔＩＤ＆　ｉｄ）　であり、ＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを指定したサブジェクトのみに送信します。仮引数は、ｉｄ（メッセージの送信先サブジェクトのＩＤ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）である。
【０１５７】
・ＡｓｓｅｒｔＲｅａｄｙ（）
構文は、ＯＳｔａｔｕｓ　ＡｓｓｅｒｔＲｅａｄｙ（ｃｏｎｓｔ　ＳｕｂｊｅｃｔＩｎｆｏ＆　ｉｎｆｏ）　であり、ＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを指定したサブジェクトのみに送信します。仮引数は、ｉｎｆｏ（メッセージ送信先のサブジェクトのＩＤ情報）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１５８】
・ＤｅａｓｓｅｒｔＲｅａｄｙ（）
構文は、ＯＳｔａｔｕｓ　　ＤｅａｓｓｅｒｔＲｅａｄｙ（ｖｏｉｄ）　であり、接続しているすべてのサブジェクトにＤＥＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを送信します。仮引数はない。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１５９】
・ＤｅａｓｓｅｒｔＲｅａｄｙ（）
構文は、ＯＳｔａｔｕｓ　　ＤｅａｓｓｅｒｔＲｅａｄｙ（ｃｏｎｓｔ　ＳｕｂｊｅｃｔＩＤ＆　ｉｄ）　であり、ＤＥＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを指定したサブジェクトのみに送信します。仮引数は、ｉｄ（メッセージの送信先サブジェクトのＩＤ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１６０】
・ＤｅａｓｓｅｒｔＲｅａｄｙ（）
構文は、ＯＳｔａｔｕｓ　ＤｅａｓｓｅｒｔＲｅａｄｙ（ｃｏｎｓｔ　ＳｕｂｊｅｃｔＩｎｆｏ＆　ｉｎｆｏ）　であり、ＤＥＡＳＳＥＲＴ−ＲＥＡＤＹ　メッセージを指定したサブジェクトのみに送信します。仮引数は、ｉｎｆｏ（メッセージ送信先のサブジェクトのＩＤ情報）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１６１】
・ＮｕｍｂｅｒＯｆＳｕｂｊｅｃｔｓ（）
構文は、ｉｎｔ　　ＮｕｍｂｅｒＯｆＳｕｂｊｅｃｔｓ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、オブザーバに接続しているサブジェクトの数を返します。仮引数はない。戻り値は、オブザーバに接続しているサブジェクトの数である。
【０１６２】
・ｂｅｇｉｎ（）
構文は、ＳｕｂｊｅｃｔＣｏｎｓｔＩｔｅｒａｔｏｒ　　ｂｅｇｉｎ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、オブザーバに接続しているサブジェクトのリストの中で、最初のサブジェクトを指すイテレータを返します。仮引数はない。戻り値は、最初のサブジェクトを指すイテレータである。
【０１６３】
・ｅｎｄ（）
構文は、ＳｕｂｊｅｃｔＣｏｎｓｔＩｔｅｒａｔｏｒ　　ｅｎｄ（ｖｏｉｄ）　ｃｏｎｓｔ；　であり、オブザーバに接続しているサブジェクトのリストの中で、最後のサブジェクトの次を指す無効なイテレータを返します。仮引数はない。戻り値は、最後のサブジェクトの次を指す無効のイテレータである。
【０１６４】
・ＣｏｎｎｅｃｔＨａｎｄｌｅｒ（）
構文は、ｖｏｉｄ　　ＣｏｎｎｅｃｔＨａｎｄｌｅｒ（ｃｏｎｓｔ　ＯＣｏｎｎｅｃｔＭｅｓｓａｇｅ＆　ｍｓｇ，　ＯＳｔａｔｕｓ　ｓｔａｔｕｓ＝ｏＳＵＣＣＥＳＳ）　であり、受信したＯＣｏｎｎｅｃｔＭｅｓｓａｇｅに応じてオブザーバを設定します。オブジェクトの接続フェースに呼ばれます。仮引数は、ｍｓｇ（ＯＳｅｒｖｉｃｅＭａｎａｇｅｒから通知されるＯＣｏｎｎｅｃｔＭｅｓｓａｇｅ）、ｓｔａｔｕｓ（ユーザ定義の初期化やリソース確保用の関数の状態を示します。）である。デフォルト値はｏＳＵＣＣＥＳＳです。ｏＳＵＣＣＥＳＳ以外では接続が拒否されます。戻り値はない。
【０１６５】
・ＮｏｔｉｆｙＨａｎｄｌｅｒ（）
構文は、ｖｏｉｄ　　ＮｏｔｉｆｙＨａｎｄｌｅｒ（ｃｏｎｓｔ　ＯＮｏｔｉｆｙＭｅｓｓａｇｅ＆　ｍｓｇ，　ＯＮｏｔｉｆｙＥｖｅｎｔ＊　ｐＥｖｅｎｔ）　であり、受信したＯＮｏｔｉｆｙＭｅｓｓａｇｅに応じてＯＮｏｔｉｆｙＥｖｅｎｔの設定と初期化を行います。この関数はｓｔｕｂ．ｃｃで自動的に呼ばれます。仮引数は、ｍｓｇ（サブジェクトから受信するＯＮｏｔｉｆｙＭｅｓｓａｇｅ）、ｐＥｖｅｎｔ（受信したＯＮｏｔｉｆｙＭｅｓｓａｇｅに対応するＯＮｏｔｉｆｙＥｖｅｎｔ型データへのポインタ）である。戻り値はない。
【０１６６】
２．４　ＯＮｏｔｉｆｙＥｖｅｎｔクラス
ＯＮｏｔｉｆｙＥｖｅｎｔクラスには、以下のメンバー関数があります。
・ＯｂｓＩｎｄｅｘ（）
構文は、ｉｎｔ　　ＯｂｓＩｎｄｅｘ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、ＯＮｏｔｉｆｙＥｖｅｎｔの送信先のオブザーバのインデックスを返します。仮引数はない。戻り値は、送信先オブザーバのインデックスである。
【０１６７】
・ＳｅｎｄｅｒＩＤ（）
構文は、ｃｏｎｓｔ　ＳｕｂｊｅｃｔＩｎｆｏ＆　ＳｅｎｄｅｒＩＤ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、ＯＮｏｔｉｆｙＥｖｅｎｔを送信したサブジェクトのＩＤ情報を返します。仮引数はない。戻り値は、送信元サブジェクトのＩＤ情報である。
【０１６８】
・ＮｕｍＯｆＤａｔａ（）
構文は、ｉｎｔ　　ＮｕｍＯｆＤａｔａ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、受信したデータ数を返します。仮引数はない。戻り値は、受信したデータ数である。
【０１６９】
・ＮｕｍＯｆＮｏｔｉｆｙ（）
構文は、ｉｎｔ　　ＮｕｍＯｆＮｏｔｉｆｙ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、送信されたデータに対して、ＮｏｔｉｆｙＯｂｓｅｒｖｅｒ（）を実行した回数を返します。仮引数はない。戻り値は、サブジェクトがＮｏｔｉｆｙＯｂｓｅｒｖｅｒ（）を実行した回数である。
【０１７０】
・Ｄａｔａ（）
構文は、ｃｏｎｓｔ　ｖｏｉｄ＊　　Ｄａｔａ（ｉｎｔ　ｉ）　ｃｏｎｓｔ　であり、受信したデータのうちでｉ番目のデータのアドレスを返します。このポインタは、サブジェクトにＡＳＳＥＲＴ−ＲＥＡＤＹまたはＤＥＡＳＳＥＲＴ−ＲＥＡＤＹメッセージを送信すると、ただちに無効になります。仮引数は、ｉ（処理したいデータのインデックス）である。戻り値は、ｉ番目のデータの先頭アドレスである。
【０１７１】
・Ｄａｔａ（）
構文は、ｃｏｎｓｔ　ｖｏｉｄ＊＊　　Ｄａｔａ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、受信したデータを指すポインタの配列を返します。仮引数はない。戻り値は、ポインタの配列である。
【０１７２】
・ＲＣＤａｔａ（）
構文は、ＲＣＲｅｇｉｏｎ＊　　ＲＣＤａｔａ（ｉｎｔ　ｉ）　ｃｏｎｓｔ　であり、受信したデータのうちで、ｉ番目のデータに対応する参照カウンタ付き共有メモリ領域へのポインタを返します。仮引数は、ｉ　（処理したいデータのインデックス）である。戻り値は、ｉ番目のデータに対応する参照カウンタ付き共有メモリ領域へのポインタである。
【０１７３】
２．５　ＲＣＲｅｇｉｏｎクラス
このクラスは共有メモリ領域へのポインタを保持し、メモリ領域の参照カウンタを制御します。ＲＣＲｅｇｉｏｎクラスには、以下のメンバー関数があります。このクラスをスタック上に作成することはできません。
・ＲＣＲｅｇｉｏｎ（）
構文は、ＲＣＲｅｇｉｏｎ（ｖｏｉｄ）　であり、コンストラクタです。ＮＵＬＬを指すインスタンスを生成します。仮引数及び戻り値はない。
【０１７４】
・ＲＣＲｅｇｉｏｎ（）
構文は、ＲＣＲｅｇｉｏｎ（ｓｉｚｅ＿ｔ　ｓｉｚｅ）　であり、指定したサイズの共有メモリ領域を確保して、このメモリ領域を指すインスタンスを生成します。仮引数は、ｓｉｚｅ（割り当てる共有メモリのサイズ（単位はバイト））であり、戻り値はない。
【０１７５】
・ＲＣＲｅｇｉｏｎ（）
構文は、ＲＣＲｅｇｉｏｎ（ＭｅｍｏｒｙＲｅｇｉｏｎＩＤ　ｍｅｍＩＤ，　ｓｉｚｅ＿ｔ　ｏｆｆｓｅｔ，　ｖｏｉｄ＊　ｂａｓｅＡｄｄｒ＝ＮＵＬＬ，　ｓｉｚｅ＿ｔ　ｓｉｚｅ　＝　０）　であり、指定したメモリ領域を指すインスタンスを作成します。メモリの割り当ては行わないので、事前に外部で対応するメモリ領域を確保してください。仮引数は、ｍｅｍＩＤ（データを保持する共有メモリ領域のＩＤ）、ｏｆｆｓｅｔ（ｍｅｍＩＤで指定される共有メモリ領域の基底アドレスからのｂａｓｅＡｄｄｒのオフセット）、ｂａｓｅＡｄｄｒ（データの基底アドレス（先頭アドレス））、ｓｉｚｅ（データのサイズ）であり、戻り値はない。
【０１７６】
・￣ＲＣＲｅｇｉｏｎ（）
構文は、￣ＲＣＲｅｇｉｏｎ（）　であり、この関数を直接呼ぶことはできません。ＲＣＲｅｇｉｏｎはローカルスタック上ではなくヒープ上に配置します。領域の破壊もできません。その理由は、この領域が他から参照されている可能性があるためです。デストラクタを呼び出す代わりにできる唯一のことはＲＣＲｅｇｉｏｎ：：ＲｅｍｏｖｅＲｅｆｅｒｅｎｃｅ（）を呼びだすことです。仮引数及び戻り値はない。
【０１７７】
・ＡｄｄＲｅｆｅｒｅｎｃｅ（）
構文は、ｖｏｉｄ　　ＡｄｄＲｅｆｅｒｅｎｃｅ（ｖｏｉｄ）　であり、参照カウンタ付き共有メモリ領域の参照カウンタをインクリメントします。仮引数及び戻り値はない。
【０１７８】
・ＲｅｍｏｖｅＲｅｆｅｒｅｎｃｅ（）
構文は、ｖｏｉｄ　　ＲｅｍｏｖｅＲｅｆｅｒｅｎｃｅ（ｖｏｉｄ）　であり、参照カウンタ付き共有メモリ領域の参照カウンタをデクリメントします。領域へのすべての参照がなくなった場合、領域は自動的に破壊されます。自分が領域の所有者である場合、共有メモリ領域が削除されます。仮引数及び戻り値はない。
【０１７９】
・ＮｕｍｂｅｒＯｆＲｅｆｅｒｅｎｃｅ（）
構文は、ｉｎｔ　　ＮｕｍｂｅｒＯｆＲｅｆｅｒｅｎｃｅ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、参照カウンタの数を返します。戻り値が１の場合は、自分しか領域を参照していないので、領域の所有者であればデータを書き変えられます。戻り値が１より大きい場合は、読み出し以外の操作はしないでください。戻り値が０の場合は、領域は破壊されているのでアクセスしないでください。仮引数はない。戻り値は、参照カウンタの数である。
【０１８０】
・Ｂａｓｅ（）
構文は、ｃｈａｒ＊　　Ｂａｓｅ（ｖｏｉｄ）　ｃｏｎｓｔ　であり。共有メモリ領域に保持するデータの基底アドレスを返します。仮引数はない。戻り値は、共有メモリ領域に保持するデータの基底アドレスである。
【０１８１】
・Ｓｉｚｅ（）
構文は、ｓｉｚｅ＿ｔ　　Ｓｉｚｅ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、共有メモリ領域に保持するデータのサイズを返します。仮引数はない。戻り値は、共有メモリ領域に保持するデータのサイズである。
【０１８２】
・ＭｅｍＩＤ（）
構文は、ＭｅｍｏｒｙＲｅｇｉｏｎＩＤ　　ＭｅｍＩＤ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、共有メモリ領域のＩＤを返します。仮引数はない。戻り値は、共有メモリ領域のＩＤである。
【０１８３】
・Ｏｆｆｓｅｔ（）
構文は、ｓｉｚｅ＿ｔ　　Ｏｆｆｓｅｔ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、データ領域のオフセットを返します。オフセットは、共有メモリ領域のＩＤによって取得した基底アドレスからデータの先頭アドレスまでのバイト数です。仮引数はない。戻り値は、データ領域のオフセットである。
【０１８４】
・ＳｅｔＳｉｚｅ（）
構文は、ｖｏｉｄ　　ＳｅｔＳｉｚｅ（ｓｉｚｅ＿ｔ　ｓｉｚｅ）　であり、ＲＣＲｅｇｉｏｎ：：Ｓｉｚｅ（）によって返される値を仮引数の値に設定します。この関数はユーザー独自のメモリ割り当て処理などで最適化を行うときに使用します。仮引数は、ｓｉｚｅ（ＲＣＲｅｇｉｏｎ：：Ｓｉｚｅ（）によって返されるのと同じ値）である。戻り値はない。
【０１８５】
・ＲｅｓｅｒｖｅＳｈａｒｅｄＭｅｍｏｒｙ（）
構文は、ＯＳｔａｔｕｓ　　ＲｅｓｅｒｖｅＳｈａｒｅｄＭｅｍｏｒｙ（ｓｉｚｅ＿ｔ　ｓｉｚｅ）　であり、この関数はＲＣＲｅｇｉｏｎ　クラスの静的メンバー関数です。この関数は、実行時の予期せぬタイミングでのメモリ割り当てを回避するためのものです。この関数は共有メモリ領域の少なくともｓｉｚｅバイトがｌｉｂＯｂｊｅｃｔＣｏｍｍ　ライブラリ用に使用できることを保証します。関数を呼び出した時点で充分な共有メモリ領域がない場合は、必要なメモリが割り当てられます。割り当てられた共有メモリ領域は、ＳｅｔＤａｔａ（ｐｔｒ，　ｓｉｚｅ）を実行するときに使用されます。ＳｅｔＤａｔａ（ｒｅｇｉｏｎ）を使用するときは、この関数を呼ぶ必要はありません。その理由は、ＳｅｔＤａｔａ（ｒｅｇｉｏｎ）関数は、ＲＣＲｅｇｉｏｎクラスの生成タイミングを自由に制御できるからです。仮引数は、ｓｉｚｅ（ＳｅｔＤａｔａ（ｐｔｒ，　ｓｉｚｅ）を呼ぶときに使用されるメモリ領域として、ここで予約するサイズです。）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、上記以外（失敗）がある。
【０１８６】
２．６　ＯＳｈｍＰｔｒＢａｓｅクラス
共有メモリ領域を表す基底クラスです。このクラスはＲＣＲｅｇｉｏｎのカプセルクラスで、自動リファレンスカウンティングを行います。ＯＳｈｍＰｔｒＢａｓｅクラスには、以下のメンバー関数があります。
・ＯＳｈｍＰｔｒＢａｓｅ（）
構文は、ＯＳｈｍＰｔｒＢａｓｅ（ｖｏｉｄ）　であり、無効なＯＳｈｍＰｔｒＢａｓｅを生成します。仮引数及び戻り値はない。
【０１８７】
・ＯＳｈｍＰｔｒＢａｓｅ（）
構文は、ＯＳｈｍＰｔｒＢａｓｅ（ｃｏｎｓｔ　ＯＳｈｍＰｔｒＢａｓｅ＆　ｐ）　であり、指定したＯＳｈｍＰｔｒＢａｓｅと同じ領域を参照するＯＳｈｍＰｔｒＢａｓｅを生成します。仮引数は、ｐ（コピー元のＯＳｈｍＰｔｒＢａｓｅ）である。戻り値はない。
【０１８８】
・ＯＳｈｍＰｔｒＢａｓｅ（）
構文は、ＯＳｈｍＰｔｒＢａｓｅ（ＲＣＲｅｇｉｏｎ＊　ｒｅｇｉｏｎ）　であり、指定した領域を参照するＯＳｈｍＰｔｒＢａｓｅを生成します。仮引数は、ｒｅｇｉｏｎ（参照カウンタ付き共有メモリ領域）である。戻り値はない。
【０１８９】
・￣ＯＳｈｍＰｔｒＢａｓｅ（）
構文は、￣ＯＳｈｍＰｔｒＢａｓｅ（）　であり、ＯＳｈｍＰｔｒＢａｓｅを破壊して、参照カウンタをデクリメントします。仮引数及び戻り値はない。
【０１９０】
・ｏｐｅｒａｔｏｒ＝（）
構文は、ＯＳｈｍＰｔｒＢａｓｅ＆　　ｏｐｅｒａｔｏｒ＝（ｃｏｎｓｔ　ＯＳｈｍＰｔｒＢａｓｅ＆　ｐ）　であり、指定したＯＳｈｍＰｔｒＢａｓｅが参照する領域と同じ領域を参照するように、参照先を変更します。仮引数は、ｐ（ＯＳｈｍＰｔｒＢａｓｅのコピー元）であり、戻り値は、＊ｔｈｉｓである。
【０１９１】
・Ｄｅａｌｌｏｃａｔｅ（）
構文は、ｖｏｉｄ　　Ｄｅａｌｌｏｃａｔｅ（ｖｏｉｄ）　であり、参照カウンタをデクリメントして、ＯＳｈｍＰｔｒＢａｓｅを無効化します。仮引数及び戻り値はない。
【０１９２】
・Ｂａｓｅ（）
構文は、ｃｈａｒ＊　　Ｂａｓｅ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、共有メモリ領域が保持するデータの基底アドレスを返します。仮引数はない。戻り値は、共有メモリ領域が保持するデータの基底アドレスである。
【０１９３】
・Ｓｉｚｅ（）
構文は、ｓｉｚｅ＿ｔ　　Ｓｉｚｅ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、共有メモリ領域が保持するデータのサイズを返します。仮引数はない。戻り値は、共有メモリ領域が保持するデータのサイズである。
【０１９４】
・ＭｅｍＩＤ（）
構文は、ＭｅｍｏｒｙＲｅｇｉｏｎＩＤ　　ＭｅｍＩＤ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、共有メモリ領域のＩＤを返します。仮引数はない。戻り値は、共有メモリ領域のＩＤである。
【０１９５】
・Ｏｆｆｓｅｔ（）
構文は、ｓｉｚｅ＿ｔ　　Ｏｆｆｓｅｔ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、データ領域のオフセットを返します。オフセットとは、対応する共有メモリ領域のＩＤによって取得した基底アドレスからデータの先頭アドレスまでのバイト数です。仮引数はない。戻り値は、データ領域のオフセットである。
【０１９６】
・ＲＣＲＰｔｒ（）
構文は、ＲＣＲｅｇｉｏｎ＊　　ＲＣＲＰｔｒ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、対応するＲＣＲｅｇｉｏｎへのポインタを返します。仮引数はない。戻り値は、対応するＲＣＲｅｇｉｏｎへのポインタである。
【０１９７】
２．７　ＯＳｈｍＰｔｒクラス
共有メモリ領域へのポインタです。ＯＳｈｍＰｔｒＢａｓｅとは異なり、このクラスはテンプレートクラスです。ＯｓｈｍＰｔｒクラスには、以下のメンバー関数があります。
・ＯＳｈｍＰｔｒ（）
構文は、ＯＳｈｍＰｔｒ（ｖｏｉｄ）　であり、ＯＳｈｍＰｔｒ＜Ｔ＞型の無効なインスタンスを生成します。仮引数及び戻り値はない。
【０１９８】
・ＯＳｈｍＰｔｒ（）
構文は、ＯＳｈｍＰｔｒ（ｃｏｎｓｔ　ＯＳｈｍＰｔｒＢａｓｅ＆　ｐ）　であり、指定したＯＳｈｍＰｔｒＢａｓｅが参照する領域を参照するＯＳｈｍＰｔｒ＜Ｔ＞型のインスタンスを生成します。仮引数は、ｐ（コピー元のＯＳｈｍＰｔｒＢａｓｅ）である。戻り値はない。
【０１９９】
・ＯＳｈｍＰｔｒ（）
構文は、ＯＳｈｍＰｔｒ（ＲＣＲｅｇｉｏｎ＊　ｒｅｇｉｏｎ）　であり、指定した領域を参照するＯＳｈｍＰｔｒ＜Ｔ＞型のインスタンスを生成します。仮引数は、ｒｅｇｉｏｎ（参照カウンタ付き共有メモリ領域へのポインタ）である。戻り値はない。
【０２００】
・ＯＳｈｍＰｔｒ（）
構文は、ＯＳｈｍＰｔｒ（ｓｉｚｅ＿ｔ　ｎ）　であり、ｓｉｚｅｏｆ（Ｔ）＊ｎの大きさの共有メモリ領域を確保し、ＯＳｈｍＰｔｒ＜Ｔ＞の要素数ｎ個の配列を生成します。この関数は内部でＡｌｌｏｃａｔｅ（ｎ）を呼びます。型Ｔのコンストラクタは呼ばれません。仮引数は、ｎ（ＯＳｈｍＰｔｒ＜Ｔ＞の配列の要素数）であり、戻り数はない。
【０２０１】
・￣ＯＳｈｍＰｔｒ（）
構文は、￣ＯＳｈｍＰｔｒ（）　であり、ＯＳｈｍＰｔｒ＜Ｔ＞を破壊して、参照カウンタをデクリメントします。仮引数及び戻り値はない。
【０２０２】
・ｏｐｅｒａｔｏｒ＝（）
構文は、ＯＳｈｍＰｔｒ＜Ｔ＞＆　ｏｐｅｒａｔｏｒ＝（ｃｏｎｓｔ　ＯＳｈｍＰｔｒＢａｓｅ＆　ｐ）　であり、指定したＯＳｈｍＰｔｒＢａｓｅが参照するのと同じ領域へ参照を変更します。仮引数は、ｐ（コピー元のＯＳｈｍＰｔｒＢａｓｅ）である。戻り値は、＊ｔｈｉｓである。
【０２０３】
・Ａｌｌｏｃａｔｅ（）
構文は、ｖｏｉｄ　　Ａｌｌｏｃａｔｅ（ｉｎｔ　ｎ）　であり、ｓｉｚｅｏｆ（Ｔ）＊ｎの大きさの共有メモリ領域を確保し、要素数ｎ、型Ｔの配列を割り当てます。新規に作成された共有メモリ領域は参照カウンタで制御されます。型Ｔのコンストラクタは呼ばれません。仮引数は、ｎ（型Ｔの配列の要素数）であり、戻り値はない。
【０２０４】
・ＮｕｍＯｆＥｌｅｍｅｎｔ（）
構文は、ｓｉｚｅ＿ｔ　　ＮｕｍＯｆＥｌｅｍｅｎｔ（ｖｏｉｄ）　ｃｏｎｓｔ　であり、配列の最大要素数を返します。仮引数はない。戻り値は、配列の要素数である。
【０２０５】
・ｏｐｅｒａｔｏｒ＊（）
構文は、ｃｏｎｓｔ　Ｔ＆　　ｏｐｅｒａｔｏｒ＊（ｖｏｉｄ）　ｃｏｎｓｔ　であり、配列の最初の要素への参照を返します。仮引数はない。戻り値は、配列の最初の要素への参照である。
【０２０６】
・ｏｐｅｒａｔｏｒ＊（）
構文は、ＯＳｈｍＰｔｒ＜Ｔ＞：：Ｐｒｏｘｙ　　ｏｐｅｒａｔｏｒ＊（ｖｏｉｄ）　であり、配列の最初の要素を返します。この要素が参照されている最中に他から要素を上書きしようとすると、要素を保持する領域の内容が新規に確保された領域にコピーされ、新規に確保された領域が上書きされます。仮引数はない。戻り値は、最初の要素であり、配列の最初の要素を示す。
【０２０７】
・ｏｐｅｒａｔｏｒ［］（）
構文は、ｃｏｎｓｔ　Ｔ＆　　ｏｐｅｒａｔｏｒ［］（ｉｎｔ　ｉ）　ｃｏｎｓｔ　であり、配列のｉ番目の要素への参照を返します。仮引数は、ｉ　（配列の要素のインデックス）である。戻り値は、配列のｉ番目の要素への参照を示す。
【０２０８】
・ｏｐｅｒａｔｏｒ［］（）
構文は、ＯＳｈｍＰｔｒ＜Ｔ＞：：Ｐｒｏｘｙ　　ｏｐｅｒａｔｏｒ［］（ｉｎｔ　ｉ）　であり、配列のｉ番目の要素を返します。この要素が参照されている最中に他から要素を上書きしようとすると、要素を保持する領域の内容が新規に確保された領域にコピーされ、新規に確保された領域が上書きされます。仮引数は、ｉ　（配列の要素のインデックス）であり、戻り値は、配列のｉ番目の要素である。
【０２０９】
・ｏｐｅｒａｔｏｒ−＞（）
構文は、ｃｏｎｓｔ　Ｔ＊　　ｏｐｅｒａｔｏｒ−＞（ｖｏｉｄ）　ｃｏｎｓｔ　であり、配列の最初の要素へのポインタを返します。仮引数はない。戻り値は、配列の最初の要素へのポインタである。
【０２１０】
第３章　サービス
３．１　ＯＶｉｒｔｕａｌＲｏｂｏｔＣｏｍｍ
以下にＯＶｉｒｔｕａｌＲｏｂｏｔＣｏｍｍのサービスを説明する。
・ＯＶｉｒｔｕａｌＲｏｂｏｔＣｏｍｍ．Ｅｆｆｅｃｔｏｒ．ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ．Ｏ
ジョイントコマンド、ＬＥＤコマンドを受信するサービスです。受信するデータ構造体は、ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａです。ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａは、ＯＰＥＮＲ：：ＮｅｗＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ（）によって共有メモリを確保します。受信したＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａの出力が終了すると、ＲＥＡＤＹ　ＥＶＥＮＴを送信します。
・ＯＶｉｒｔｕａｌＲｏｂｏｔＣｏｍｍ．Ｓｅｎｓｏｒ．ＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａ．Ｓ
ロボットで使用可能なすべてのセンサーデータを送信するサービスです。送信するデータ構造体は、ＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａです。４フレーム（３２ｍｓ）のデータが１回の送信で送られます。
・ＯＶｉｒｔｕａｌＲｏｂｏｔＣｏｍｍ．ＦｂｋＩｍａｇｅＳｅｎｓｏｒ．ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａ．Ｓ
カメラの画像データを送信するサービスです。送信するデータ構造体は、ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａです。画像データのアクセス用にＯＦｂｋＩｍａｇｅとして３枚のＹＣｒＣｂ画像と１枚のＣＤＴ画像が送信されます。
【０２１１】
３．２　ＯＶｉｒｔｕａｌＲｏｂｏｔＡｕｄｉｏＣｏｍｍ
以下に、ＯＶｉｒｔｕａｌＲｏｂｏｔＡｕｄｉｏＣｏｍｍのサービスを説明する。
・ＯＶｉｒｔｕａｌＲｏｂｏｔＡｕｄｉｏＣｏｍｍ．Ｍｉｃ．ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａ．Ｓ
マイクからの音データを送信するサービスです。３２ｍｓごとにデータが送信されます。サウンドデータのフォーマットは１６ｋＨｚ、１６ｂｉｔステレオのＰＣＭデータです。
・ＯＶｉｒｔｕａｌＲｏｂｏｔＡｕｄｉｏＣｏｍｍ．Ｓｐｅａｋｅｒ．ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａ．Ｏ
サウンドデータを受信するサービスです。受信するデータの構造体はＯｓｏｕｎｄＶｅｃｔｏｒＤａｔａです。ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａは、ＯＰＥＮＲ：：ＮｅｗＳｏｕｎｄＶｅｃｔｏｒＤａｔａ（）によって共有メモリを確保します。受信したＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａの出力が終了すると、ＲＥＡＤＹ　ＥＶＥＮＴを送信します。
【０２１２】
第４章　データ型
４．１　共通ヘッダ
・ＯＤａｔａＶｅｃｔｏｒＩｎｆｏ
ＯＤａｔａＶｅｃｔｏｒＩｎｆｏは、ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ、　ＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａ、ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａ　、ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａ、ＯＣｄｔＶｅｃｔｏｒＤａｔａの共通のヘッダで、データの要素数、要素の情報ブロックサイズ、共有メモリに関する情報を保持します。構造体を以下に示す。
2004001148.tif 000019
【０２１３】
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｍｅｍＲｅｇｉｏｎＩＤ：データを保持する共有メモリ領域のＩＤ
ｐｈｙｓＡｄｄｒ　　　：ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａ、ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａでは共有メモリの物理アドレスに、それ以外のデータでは０に設定されます。
ｏｆｆｓｅｔ：オフセット
ｔｏｔａｌＳｉｚｅ：データを保持している共有メモリのサイズ
ｔｙｐｅ：データの種類と、それに対応するデータの構造
データの種類とこのデータの構造との関係は、以下のようになっている。
【０２１４】
ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａに対して、ｏｄａｔａＣＯＭＭＡＮＤ＿ＶＥＣＴＯＲ
ＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａに対して、ｏｄａｔａＳＥＮＳＯＲ＿ＦＲＡＭＥ＿ＶＥＣＴＯＲ
ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａに対して、ｏｄａｔａＦＢＫＩＭＡＧＥ＿ＶＥＣＴＯＲ
ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａに対して、ｏｄａｔａＳＯＵＮＤ＿ＶＥＣＴＯＲ
ＯＣｄｔＶｅｃｔｏｒＤａｔａに対して、ｏｄａｔａＣＤＴ＿ＶＥＣＴＯＲ
ｉｎｆｏＯｆｆｓｅｔ：データの先頭アドレスから要素の情報ブロックの配列へのオフセット（１９２バイト）
ｍａｘＮｕｍＤａｔａ：保持できるデータの最大要素数
ｎｕｍＤａｔａ：有効なデータの要素数
ｓｙｎｃＫｅｙ：　　　同期キー
ｗａｉｔ：コマンド、サウンドの出力をｗａｉｔで指定されたフレーム（８ｍｓｅｃ）分待ちます。
ｏｐｔＯｆｆｓｅｔ：オプショナル領域の有効データのオフセット
ｏｐｔＳｉｚｅ：オプショナル領域の有効データのサイズ
ｐａｄｄｉｎｇ［３］：総バイト数を調整するための余白
ｏｐｔｉｏｎａｌ［ｏｄａｔａＯＰＴＩＯＮＡＬ＿ＭＡＸ］：ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ，　ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａを送信するオブジェクトとＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａを受信するオブジェクト間で情報の受け渡しに使用します。ｏｐｔｉｏｎａｌ［］のデータのうちｏｐｔＯｆｆｓｅｔ、ｏｐｔＳｉｚｅで指定したデータが更新され、ＯＳｏｕｎｄＦｒａｍｅＶｅｃｔｏｒＤａｔａのｏｐｔｉｏｎａｌ［］にデータがコピーされます。
【０２１５】
４．２　ＯＶｉｒｔｕａｌＲｏｂｏｔＣｏｍｍとの通信
ＯＶｉｒｔｕａｌＲｏｂｏｔＣｏｍｍとの通信に使用するデータは、以下の３個です。
ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ：コマンドデータ
ＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａ：センサーデータ
ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａ：画像データ
これらのデータは、共有メモリ上に作成されます。各データの内容は、共通ヘッダのＯＤａｔａＶｅｃｔｏｒＩｎｆｏに続いて各要素の情報ブロックの配列、データ本体の配列の順に置かれます。
【０２１６】
４．２．１　ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ
ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａは、ジョイントコマンド、ＬＥＤコマンドを保持するデータ構造体です。ｖｅｃｔｏｒＩｎｆｏに続いてｖｅｃｔｏｒＩｎｆｏ．ｍａｘＮｕｍＤａｔａ数のＯＣｏｍｍａｎｄＩｎｆｏの配列、ＯＣｏｍｍａｎｄＤａｔａの配列が並びます。各コマンドの種類は、ＯＣｏｍｍａｎｄＩｎｆｏのｔｙｐｅにより指定されます。１個の　ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａで異なる種類のコマンドを複数保持することができます。構造体は、以下の通りである。
2004001148.tif 000020
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　である。
【０２１７】
・ＯＣｏｍｍａｎｄＩｎｆｏ
ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａの要素の種類、ＯＰｒｉｍｉｔｉｖｅＩＤ、コマンドフレーム数、
コマンドへのオフセットを保持します。構造体を以下に示す。
2004001148.tif 000021
【０２１８】
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｔｙｐｅ：コマンドの種類（ｏｄａｔａＪＯＩＮＴ＿ＣＯＭＭＡＮＤ２、ｏｄａｔａＬＥＤ＿ＣＯＭＭＡＮＤ２）
ｐｒｉｍｉｔｉｖｅＩＤ：コマンドを指定するＣＰＣ　ＰｒｉｍｉｔｉｖｅのＩＤ
ｆｒａｍｅＮｕｍｂｅｒ：コマンドの最初のフレームの処理を行ったときのフレーム番号が格納されます。
ｎｕｍＦｒａｍｅｓ：ＯＣｏｍｍａｎｄＤａｔａが保持するコマンドデータの有効フレーム数。ＯＣｏｍｍａｎｄＤａｔａでは最大ｏｃｏｍｍａｎｄＭＡＸ＿ＦＲＡＭＥＳ　（＝　１６）　フレーム分のうちｎｕｍＦｒａｍｅｓ　分のデータのみが処理されます。
ｆｒａｍｅＳｉｚｅ　　ＯＣｏｍｍａｎｄＤａｔａが保持する１フレーム分のコマンドデータのサイズ（８バイト）
ｄａｔａＯｆｆｓｅｔ：ＯＣｏｍｍａｎｄＩｎｆｏに対応するＯＣｏｍｍａｎｄＤａｔａのオフセット。ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａの先頭アドレスからのオフセットを表します。
ｄａｔａＳｉｚｅ：ＯＣｏｍｍａｎｄＩｎｆｏ　に対応する　ＯＣｏｍｍａｎｄＤａｔａ　のデータサイズ（１２８バイト）
ｐａｄｄｉｎｇ［１］：総バイト数を調整するための余白
【０２１９】
・ＯＣｏｍｍａｎｄＤａｔａ
コマンドデータの本体です。ＯＣｏｍｍａｎｄＶａｌｕｅは、１フレーム分の汎用データの構造体です。ジョイントコマンドの場合はＯＪｏｉｎｔＣｏｍｍａｎｄＶａｌｕｅ２に、耳プランジャーの場合はＯＪｏｉｎｔＣｏｍｍａｎｄＶａｌｕｅ３に、ＬＥＤコマンドの場合はＯＬＥＤＣｏｍｍａｎｄＶａｌｕｅにキャストして使用します。構造体を以下に示す。
2004001148.tif 000022
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーは、以下である。
ｖａｌｕｅ［ｏｃｏｍｍａｎｄＭＡＸ＿ＦＲＡＭＥＳ］：コマンドデータ。ＯＣｏｍｍａｎｄＤａｔａは、最大ｏｃｏｍｍａｎｄＭＡＸ＿ＦＲＡＭＥＳ　（＝　１６）フレーム分のデータを保持できます。有効フレーム数はＯＣｏｍｍａｎｄＩｎｆｏのｎｕｍＦｒａｍｅｓにより指定されます。
【０２２０】
・ＯＪｏｉｎｔＣｏｍｍａｎｄＶａｌｕｅ２
ＯＪｏｉｎｔＣｏｍｍａｎｄＶａｌｕｅ２は、１フレーム分のジョイントのコマンドデータである。構造体を以下に示す。
2004001148.tif 000023
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｖａｌｕｅ：ジョイントへの指示値。単位はマイクロラジアン（１０−６　ｒａｄ）で、３６０°の場合は３１４１５９２です。
ｐａｄｄｉｎｇ：総バイト数を調整するための余白
【０２２１】
・ＯＪｏｉｎｔＣｏｍｍａｎｄＶａｌｕｅ３
ＯＪｏｉｎｔＣｏｍｍａｎｄＶａｌｕｅ３は、耳のプランジャ動作のコマンドデータであり、構造体は以下である。
2004001148.tif 000024
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｖａｌｕｅ：プランジャーの指示値。ｏｊｏｉｎｔ３−ＳＴＡＴＥ０またはｏｊｏｉｎｔ３−ＳＴＡＴＥ１を指定します。
ｒｅｓｅｒｖｅｄ：予約済み
ｐａｄｄｉｎｇ：総バイト数を調整するための余白
【０２２２】
・ＯＬＥＤＣｏｍｍａｎｄＶａｌｕｅ２
ＯＬＥＤＣｏｍｍａｎｄＶａｌｕｅ２は、ＬＥＤを制御するコマンドデータです。ＬＥＤの制御はＯＮ、ＯＦＦとその時刻で指定します。ＬＥＤのＯＮ、ＯＦＦをコントロールできる時間の最小単位は８　ｍｓです。構造体を以下に示す。
2004001148.tif 000025
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｌｅｄ：ＬＥＤのＯＮ、ＯＦＦを指定します。ｏｌｅｄＯＮまたはｏｌｅｄＯＦＦを指定します。
ｐｅｒｉｏｄ：ＬＥＤ状態の継続時間を指定します。時間の最小単位は８　ｍｓです。
ｒｅｓｅｒｖｅｄ：予約済み
【０２２３】
４．２．２　ＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａ
ジョイント、加速度センサー、スイッチなどの各種センサーのデータを保持するデータ構造体です。ｖｅｃｔｏｒＩｎｆｏに続いてｖｅｃｔｏｒＩｎｆｏ．ｍａｘＮｕｍＤａｔａ数のＯＳｅｎｓｏｒＦｒａｍｅＩｎｆｏ　の配列、ＯＳｅｎｓｏｒＦｒａｍｅＤａｔａの配列が並びます。各センサーデータの種類は、ＯＳｅｎｓｏｒＦｒａｍｅＩｎｆｏのｔｙｐｅにより指定されます。１個のＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａで、異なる種類の複数のセンサーデータを保持することができます。以下に構造体を示す。
2004001148.tif 000026
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　である。
【０２２４】
・ＯＳｅｎｓｏｒＦｒａｍｅＩｎｆｏ
ＯＳｅｎｓｏｒＦｒａｍｅＩｎｆｏは、ＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａの要素の種類、ＯＰｒｉｍｉｔｉｖｅＩＤ、センサーデータのフレーム数、センサーデータへのオフセットを保持します。以下に構造体を示す。
2004001148.tif 000027
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｔｙｐｅ：センサーデータの種類。種類の一覧は　ＯＤａｔａＦｏｒｍａｔｓ．ｈで定義されています。
ｐｒｉｍｉｔｉｖｅＩＤ：センサーデータを得たＣＰＣ　ＰｒｉｍｉｔｉｖｅのＩＤ番号
ｆｒａｍｅＮｕｍｂｅｒ：対応するＯＳｅｎｓｏｒＦｒａｍｅＤａｔａの最初のデータ取得時のフレーム番号
ｎｕｍＦｒａｍｅｓ：ＯＳｅｎｓｏｒＦｒａｍｅＤａｔａが保持するセンサーデータの有効フレーム数
ｆｒａｍｅＳｉｚｅ　　：ＯＳｅｎｓｏｒＦｒａｍｅＤａｔａが保持する１フレーム分のセンサーデータのサイズ（１６バイト）
ｄａｔａＯｆｆｓｅｔ：ＯＳｅｎｓｏｒＦｒａｍｅＩｎｆｏに対応するＯＳｅｎｓｏｒＦｒａｍｅＤａｔａのオフセット。ＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａの先頭アドレスからのオフセットになります。
ｄａｔａＳｉｚｅ：ＯＳｅｎｓｏｒＦｒａｍｅＩｎｆｏに対応するＯＳｅｎｓｏｒＦｒａｍｅＤａｔａのデータサイズ（１２８バイト）
ｐａｄｄｉｎｇ［１］：総バイト数を調整するための余白
【０２２５】
・ＯＳｅｎｓｏｒＦｒａｍｅＤａｔａ
ＯＳｅｎｓｏｒＦｒａｍｅＤａｔａは、センサーデータの本体です。ＯＳｅｎｓｏｒＶａｌｕｅは、１フレーム分の汎用的なデータ構造体です。各種センサーデータにキャストして利用します。例えばジョイントデータの場合は　ＯＪｏｉｎｔＶａｌｕｅに、加速度センサーの場合はＯＡｃｃｅｌｅｒａｔｉｏｎにキャストします。以下に構造体を示す。
2004001148.tif 000028
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーは以下である。
ｆｒａｍｅ［ｏｓｅｎｓｏｒｆｒａｍｅＭＡＸ＿ＦＲＡＭＥＳ］：センサーデータである。ＯＳｅｎｓｏｒＦｒａｍｅＤａｔａは、最大ｏｓｅｎｓｏｒｆｒａｍｅＭＡＸ＿ＦＲＡＭＥＳ（＝　１６）フレーム分のデータを保持できます。有効フレーム数は、ＯＳｅｎｓｏｒＦｒａｍｅＩｎｆｏのｎｕｍＦｒａｍｅｓにより指定されます。
【０２２６】
・ＯＡｃｃｅｌｅｒａｔｉｏｎ
ＯＡｃｃｅｌｅｒａｔｉｏｎは、加速度であり、単位は、１０−６　ｍ／ｓｅｃ２です。以下に構造体を示す。
【０２２７】
2004001148.tif 000029
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｖａｌｕｅ：加速度センサーから得られた信号値をキャリブレーションテーブルにより変換した値。単位は１０−６　ｍ／ｓｅｃ２です。
ｓｉｇｎａｌ：加速度センサーから得られたＡＤ信号値
ｐａｄｄｉｎｇ［５］：総バイト数を調整するための余白
【０２２８】
・ＯＡｎｇｕｌａｒＶｅｌｏｃｉｔｙ
ＯＡｎｇｕｌａｒＶｅｌｏｃｉｔｙは、角速度であり、単位は、１０−６　ｒａｄ／ｓです。以下に構造体を示す。
2004001148.tif 000030
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｖａｌｕｅ：角速度センサーから得られた信号値をキャリブレーションテーブルにより変換した値。単位は、１０−６　ｒａｄ／ｓです。
ｓｉｇｎａｌ：角速度センサーから得られたＡＤ信号値
ｐａｄｄｉｎｇ［５］：総バイト数を調整するための余白
【０２２９】
・ＯＴｅｍｐｅｒａｔｕｒｅ
ＯＴｅｍｐｅｒａｔｕｒｅは、温度であり、単位は１０−６　℃です。以下に構造体を示す。
2004001148.tif 000031
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｖａｌｕｅ：温度センサーから得られた信号値をキャリブレーションテーブルにより変換した値。単位は１０−６　℃です。
ｓｉｇｎａｌ：温度センサーから得られたＡＤ信号値
ｐａｄｄｉｎｇ［５］：総バイト数を調整するための余白
【０２３０】
・ＯＦｏｒｃｅ
ＯＦｏｒｃｅは、力であり、単位は１０−６　Ｎです。以下に構造体を示す。
2004001148.tif 000032
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｖａｌｕｅ：センサーから得られた信号値をキャリブレーションテーブルにより変換した値。単位は１０−６　Ｎです。
ｓｉｇｎａｌ：センサーから得られたＡＤ信号値
ｐａｄｄｉｎｇ［５］：総バイト数を調整するための余白
【０２３１】
・ＯＰｒｅｓｓｕｒｅ
ＯＰｒｅｓｓｕｒｅは、圧力であり、単位は１０−６　Ｐａ　（Ｎ／ｍ２）です。以下に構造体を示す。
2004001148.tif 000033
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｖａｌｕｅ：圧力センサーから得られた信号値をキャリブレーションテーブルにより変換した値。単位は１０−６　Ｐａです。
ｓｉｇｎａｌ：圧力センサーから得られたＡＤ信号値
ｐａｄｄｉｎｇ［５］：総バイト数を調整するための余白
【０２３２】
・ＯＬｅｎｇｔｈ
ＯＬｅｎｇｔｈは、長さであり、単位は１０−６　ｍ　です。以下に構造体を示す。
2004001148.tif 000034
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｖａｌｕｅ：センサーから得られた信号値をキャリブレーションテーブルにより変換した値。単位は１０−６　ｍです。
ｓｉｇｎａｌ：センサーから得られた　ＡＤ　信号値
ｐａｄｄｉｎｇ［５］：総バイト数を調整するための余白
【０２３３】
・ＯＳｗｉｔｃｈＳｔａｔｕｓ
ＯＳｗｉｔｃｈＳｔａｔｕｓは、スイッチの状態である。以下に構造体を示す。
2004001148.tif 000035
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｖａｌｕｅ：スイッチから得られたＡＤ信号値を変換して得たスイッチの状態。ｏｓｗｉｔｃｈＯＮ　またはｏｓｗｉｔｃｈＯＦＦです。
ｓｉｇｎａｌ：スイッチから得られたＡＤ信号値
ｐａｄｄｉｎｇ［５］：総バイト数を調整するための余白
【０２３４】
・ＯＪｏｉｎｔＶａｌｕｅ
ＯＪｏｉｎｔＶａｌｕｅは、ジョイント値であり、単位は、回転関節の場合は１０−６　ｒａｄです。以下に構造体を示す。
2004001148.tif 000036
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｖａｌｕｅ：ジョイントのフィードバック信号をキャリブレーションテーブルで変換した値です。単位は、回転関節の場合は１０−６　ｒａｄです。
ｓｉｇｎａｌ：ジョイントのフィードバック信号
ｐｗｍＤｕｔｙ：ＰＷＭ信号値
ｒｅｆＶａｌｕｅ：センサーデータ取得時点の指示値です。単位は、マイクロラジアンです。
ｒｅｆＳｉｇｎａｌ：キャリブレーション変換後の１０ｂｉｔ値
ｐａｄｄｉｎｇ［１］：総バイト数を調整するための余白
【０２３５】
４．２．３　ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａ
ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａは、画像データであり、構造体は以下のようになっている。
2004001148.tif 000037
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　である。
【０２３６】
・ＯＦｂｋＩｍａｇｅＩｎｆｏ
ＯＦｂｋＩｍａｇｅＩｎｆｏは、画像情報であり、ＹＣｒＣｂ画像、ＣＤＴ画像を保持するデータ構造体です。以下に構造体を示す。
2004001148.tif 000038
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーは、以下である。
ｔｙｐｅ：データの種類。ｏｄａｔａＦＢＫ＿ＹＣｒＣｂまたはｏｄａｔａＦＢＫ＿ＣＤＴです。
ｐｒｉｍｉｔｉｖｅＩＤ：画像データを設定するＦｂｋＩｍａｇｅＳｅｎｓｏｒのｐｒｉｍｉｔｉｖｅＩＤ
ｆｒａｍｅＮｕｍｂｅｒ：画像取得時のフレーム番号
ｄａｔａＯｆｆｓｅｔ：画像データの共有メモリの先頭アドレスからのオフセット
ｄａｔａＳｉｚｅ：　　画像データのサイズ
ｗｉｄｔｈ：画像データの横画素数
ｈｅｉｇｈｔ：画像データの縦画素数
ｐａｄｄｉｎｇ［１］：総バイト数を調整するための余白
【０２３７】
・ＯＦｂｋＩｍａｇｅ
ＯＦｂｋＩｍａｇｅは、ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａの各Ｙ、Ｃｒ、Ｃｂ、ＣＤＴ画像にアクセスするためのクラスです。ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＦｂｋＩｍａｇｅ．ｈ＞　であり、ライブラリは、ｌｉｂＯＰＥＮＲ．ａである。
構文は、ＯＦｂｋＩｍａｇｅ（ＯＦｂｋＩｍａｇｅＩｎｆｏ＊　ｉｎｆｏ，　ｂｙｔｅ＊　ｄａｔａ，　ＯＦｂｋＩｍａｇｅＢａｎｄ　ｂａｎｄ）　であり、ＯＦｂｋＩｍａｇｅのコンストラクタ。ｉｎｆｏ、ｄａｔａにはＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａ：：ＧｅｔＩｎｆｏ（）、ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａ：：ＧｅｔＤａｔａ（）で得られるポインタを指定します。ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａ：：ＧｅｔＩｎｆｏ（）、ＯＦｂｋＩｍａｇｅＶｅｃｔｏｒＤａｔａ：：ＧｅｔＤａｔａ（）の引数がｏｆｂｋｉｍａｇｅＬＡＹＥＲ＿Ｈ、ｏｆｂｋｉｍａｇｅＬＡＹＥＲ＿Ｍ、ｏｆｂｋｉｍａｇｅＬＡＹＥＲ＿Ｌの場合は、　ｂａｎｄにｏｆｂｋｉｍａｇｅＢＡＮＤ＿Ｙ、ｏｆｂｋｉｍａｇｅＢＡＮＤ＿Ｃｒ、ｏｆｂｋｉｍａｇｅＢＡＮＤ＿Ｃｂの何れかを指定します。ｏｆｂｋｉｍａｇｅＬＡＹＥＲ＿Ｃの場合は、ｏｆｂｋｉｍａｇｅＢＡＮＤ＿ＣＤＴを指定します。仮引数は、ｉｎｆｏ（ＯＦｂｋＩｍａｇｅＩｎｆｏ　のポインタ）、ｄａｔａ（画像データのポインタ）、ｂａｎｄ（画像データのバンド）である。
【０２３８】
・ＩｓＶａｌｉｄ（）
構文は、ｂｏｏｌ　ＩｓＶａｌｉｄ（）　であり、ＯＦｂｋＩｍａｇｅが有効かどうかを調べます。コンストラクタが不正な仮引数で呼ばれたときに、ｆａｌｓｅが返ります。仮引数はない。戻り値には、ｔｒｕｅ（有効）、ｆａｌｓｅ（無効）がある。
【０２３９】
・Ｐｏｉｎｔｅｒ（）
構文は、ｂｙｔｅ＊　Ｐｏｉｎｔｅｒ（）　であり、画像データのポインタを返します。仮引数はない。戻り値は、画像データのポインタである。
【０２４０】
・Ｗｉｄｔｈ（）
構文は、ｉｎｔ　Ｗｉｄｔｈ（）　であり、画像の幅を返します。仮引数はない。戻り値は、画像の幅である。
【０２４１】
・Ｈｅｉｇｈｔ（）
構文は、ｉｎｔ　Ｈｅｉｇｈｔ（）　であり、画像の高さを返します。仮引数はない。戻り値は、画像の高さである。
【０２４２】
・Ｓｋｉｐ（）
構文は、ｉｎｔ　Ｓｋｉｐ（）　であり、画像データの次のラインへポインタを進めるとき、スキップするバイト数を返します。仮引数はない。戻り値は、画像データの次のラインへのスキップバイト数である。
【０２４３】
・Ｐｉｘｅｌ（）
構文は、ｂｙｔｅ　Ｐｉｘｅｌ（ｉｎｔ　ｘ，　ｉｎｔ　ｙ）　であり、座標（ｘ，　ｙ）の画像データのピクセル値を返します。座標の原点は左上の点です。仮引数は、ｘ　（画像データのＸ座標）、ｙ　（画像データのＹ座標）である。戻り値は、座標（ｘ，　ｙ）の画像データのピクセル値である。
【０２４４】
・ＦｉｅｌｄＣｏｕｎｔｅｒ（）
構文は、ｗｏｒｄ　ＦｉｅｌｄＣｏｕｎｔｅｒ（）　であり、各レイヤーの画像データの最終ラインに、カウンタ番号が記述されています。カウンタ番号は画像ごとにインクリメントされます。ＦｉｅｌｄＣｏｕｎｔｅｒ（）はこのカウンタ番号を返します。仮引数はない。戻り値は、画像のカウンタ値である。
【０２４５】
・ＣｏｌｏｒＦｒｅｑｕｅｎｃｙ（）
構文は、ｂｙｔｅ　ＣｏｌｏｒＦｒｅｑｕｅｎｃｙ（ＯＣｄｔＣｈａｎｎｅｌ　ｃｈａｎ）　であり、各レイヤーの画像データの最終ラインに色検出された画素数／１６の色頻度情報が記述されています。ＣｏｌｏｒＦｒｅｑｕｅｎｃｙ（）はこの色頻度を返します。仮引数は、ｃｈａｎ（ＣＤＴ　チャンネル）である。戻り値は、色検出された色頻度（画素数／１６）である。
【０２４６】
４．３　ＯＶｉｒｔｕａｌＲｏｂｏｔＡｕｄｉｏＣｏｍｍとの通信
ＯＶｉｒｔｕａｌＲｏｂｏｔＡｕｄｉｏＣｏｍｍとの通信に使用するデータは、「ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａ　音データ」の１つである。データは、共有メモリ上に作成されます。データの内容は、共通ヘッダのＯＤａｔａＶｅｃｔｏｒＩｎｆｏに続いて各要素の情報ブロックの配列、データ本体の配列の順に置かれます。
【０２４７】
４．３．１　ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａ
ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａは、サウンドデータを保持するデータ構造体です。ｖｅｃｔｏｒＩｎｆｏ　に続いて　ｖｅｃｔｏｒＩｎｆｏ．ｍａｘＮｕｍＤａｔａ数のＯＳｏｕｎｄＩｎｆｏの配列、サウンドデータのバイト列が並びます。以下に構造体を示す。
2004001148.tif 000039
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　である。
【０２４８】
・ＯＳｏｕｎｄＩｎｆｏ
ＯＳｏｕｎｄＩｎｆｏは、サウンドデータに関する情報を保持するデータ構造体です。以下に構造体を示す。
2004001148.tif 000040
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下のものがある。
ｔｙｐｅ：データの種類。ｏｄａｔａＳＯＵＮＤ　が入ります。
ｐｒｉｍｉｔｉｖｅＩＤ：サウンドデータを入出力するＣＰＣ　ＰｒｉｍｉｔｖｅのＩＤ番号。音を出力する場合はスピーカーのＯＰｒｉｍｉｔｉｖｅＩＤを設定します。音を入力する場合はマイクのＯＰｒｉｍｉｔｖｅＩＤを設定します。
ｆｒａｍｅＮｕｍｂｅｒ：音を出力する場合は最初のサウンドのフレームを処理するときのフレーム番号、音を入力する場合はデータを入力したときのフレーム番号です。
ｆｒａｍｅＳｉｚｅ　　：１フレーム分のサウンドデータのサイズ
ｄａｔａＯｆｆｓｅｔ：ＯＳｏｕｎｄＩｎｆｏに対応するサウンドデータのバイト列へのオフセット。
ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａの先頭アドレスからのオフセットを示します。
ｍａｘＤａｔａＳｉｚｅ：ＯＳｏｕｎｄＩｎｆｏに対応するサウンドデータのバイト列の最大サイズ
ｄａｔａＳｉｚｅ：　　有効なサウンドデータのバイト列のサイズ
ｆｏｒｍａｔ：サウンドデータの形式。現在はｏｓｏｕｎｄｆｏｒｍａｔＰＣＭのみサポートしています。
ｃｈａｎｎｅｌ：サウンドデータのチャンネル数
ｓａｍｐｌｉｎｇＲａｔｅ：サンプリングレート
ｂｉｔｓＰｅｒＳａｍｐｌｅ：サウンドデータの１サンプルあたりのビット数
ａｃｔｕａｌＤａｔａＳｉｚｅ：デバイスから転送されたサウンドデータのサイズ。
ｐａｄｄｉｎｇ［６］：総バイト数を調整するための余白
【０２４９】
４．４その他
その他に「ＯＣｄｔＶｅｃｔｏｒＤａｔａ　　ＣＤＴ　テーブルデータ」がある。このデータは、共有メモリ上に作成されます。データの内容は、共通ヘッダのＯＤａｔａＶｅｃｔｏｒＩｎｆｏに続いて各要素の情報ブロックの配列、データ本体の配列の順に置かれます。
【０２５０】
４．４．１　ＯＣｄｔＶｅｃｔｏｒＤａｔａ
ＯＣｄｔＶｅｃｔｏｒＤａｔａは、色検出テーブルを保持するデータ構造体です。最大ｏｃｄｔＮＵＭ＿ＣＨＡＮＮＥＬＳ　（＝　８）のテーブルを保持できます。ＯＤａｔａＶｅｃｔｏｒＩｎｆｏ：：ｎｕｍＤａｔａで有効なＯＣｄｔＩｎｆｏの数を指定します。以下に構造体を示す。
2004001148.tif 000041
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　である。
【０２５１】
・ＯＣｄｔＩｎｆｏ
色検出のテーブルは、Ｙ　（輝度信号）を３２のセグメントに分割し、各セグメントに対してＣｒｍａｘ、Ｃｒｍｉｎ、Ｃｂｍａｘ、Ｃｂｍｉｎを指定します。Ｃｒ、Ｃｂの値はオフセットバイナリで、０ｘ０から０ｘｆｆの範囲で指定できます。以下に構造体を示す。
2004001148.tif 000042
ヘッダファイルは、＃ｉｎｃｌｕｄｅ　＜ＯＰＥＮＲ／ＯＤａｔａＦｏｒｍａｔｓ．ｈ＞　であり、メンバーには、以下ものがある。
ｔｙｐｅ：データの種類。ｏｄａｔａＣＤＴが入ります。
ｐｒｉｍｉｔｉｖｅＩＤ：ＣＤＴを設定するＯＦｂｋＩｍａｇｅＳｅｎｓｏｒのＰｒｉｍｉｔｉｖｅＩＤ
ｃｈａｎｎｅｌ：テーブルを設定するＣＤＴのチャンネル
ｔａｂｌｅ［ｏｃｄｔＭＡＸ＿Ｙ＿ＳＥＧＭＥＮＴ］：テーブルデータの配列
ｐａｄｄｉｎｇ：総バイト数を調整するための余白
【０２５２】
第５章ＯＰＥＮ−Ｒ　ＡＰＩ
以下に、ＯＰＥＮ−Ｒ　ＡＰＩ　を示す。
・ＯＰＥＮＲ：：ＯｐｅｎＰｒｉｍｉｔｉｖｅ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＯｐｅｎＰｒｉｍｉｔｉｖｅ（ｃｏｎｓｔ　ｃｈａｒ＊　ｌｏｃａｔｏｒ，　ＯＰｒｉｍｉｔｉｖｅＩＤ＊　ｐｒｉｍｉｔｉｖｅＩＤ）　であり、ＣＰＣ　ＰｒｉｍｉｔｉｖｅをオープンしてＯＰｒｉｍｉｔｉｖｅＩＤを取得します。失敗した場合は、ｐｒｉｍｉｔｉｖｅＩＤにはｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＮＤＥＦが返ります。仮引数は、ｌｏｃａｔｏｒ（ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒ）、ｐｒｉｍｉｔｉｖｅＩＤ（ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　ＩＤ）である。また、戻り値は、ｏＳＵＣＣＥＳＳ（成功）、ｏＮＯＴ＿ＦＯＵＮＤ（ｌｏｃａｔｏｒ　に対応するＣＰＣ　Ｐｒｉｍｉｔｉｖｅが存在しない。）、ｏＯＰＥＮ＿ＦＡＩＬＵＲＥ（ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　のオープンに失敗）、ｏＩＮＶＡＬＩＤ＿ＡＲＧ（ｌｏｃａｔｏｒがＮＵＬＬ　ポインタ）、ｏＦＡＩＬ（失敗）である。
【０２５３】
・ＯＰＥＮＲ：：ＣｌｏｓｅＰｒｉｍｉｔｉｖｅ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＣｌｏｓｅＰｒｉｍｉｔｉｖｅ（ＯＰｒｉｍｉｔｉｖｅＩＤ　ｐｒｉｍｉｔｉｖｅＩＤ）　であり、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　をクローズします。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＰＲＩＭＩＴＩＶＥ＿ＩＤ（不正なｐｒｉｍｉｔｉｖｅＩＤ）がある。
【０２５４】
・ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（ＯＰｒｉｍｉｔｉｖｅＩＤ　ｐｒｉｍｉｔｉｖｅＩＤ，ＯＰｒｉｍｉｔｖｅＲｅｑｕｅｓｔ　ｒｅｑｕｅｓｔ，　ｖｏｉｄ＊　ｐａｒａｍ，　ｓｉｚｅ＿ｔ　ｐａｒａｍＳｉｚｅ，ｖｏｉｄ＊　ｒｅｓｕｌｔ，　ｓｉｚｅ＿ｔ　ｒｅｓｕｌｔＳｉｚｅ）　であり、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　のパラメーターを設定します。ｐａｒａｍ、ｐａｒａｍＳｉｚｅ、ｒｅｓｕｌｔ、ｒｅｓｕｌｔＳｉｚｅについては、ｒｅｑｕｅｓｔで指定します。指定する必要がない場合は０を指定します。以下は、ｒｅｑｕｅｓｔの種類です。
ｏｐｒｍｒｅｑＳＰＥＡＫＥＲ＿ＭＵＴＥ＿ＯＮ
ｏｐｒｍｒｅｑＳＰＥＡＫＥＲ＿ＭＵＴＥ＿ＯＦＦ
ｏｐｒｍｒｅｑＭＩＣ＿ＵＮＩ
ｏｐｒｍｒｅｑＭＩＣ＿ＯＭＮＩ
ｏｐｒｍｒｅｑＭＩＣ＿ＡＬＣ＿ＯＮ
ｏｐｒｍｒｅｑＭＩＣ＿ＡＬＣ＿ＯＦＦ
ｏｐｒｍｒｅｑＣＡＭ＿ＳＥＴ＿ＷＨＩＴＥ＿ＢＡＬＡＮＣＥ
ｏｐｒｍｒｅｑＣＡＭ＿ＳＥＴ＿ＧＡＩＮ
ｏｐｒｍｒｅｑＣＡＭ＿ＳＥＴ＿ＳＨＵＴＴＥＲ＿ＳＰＥＥＤ
【０２５５】
また、以下のように設定します。
／＊　Ｍｕｔｅ　ＯＮ　＊／
ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（ｓｐｅｋｅｒＩＤ，　ｏｐｒｍｒｅｑＳＰＥＡＫＥＲ＿ＭＵＴＥ＿ＯＮ，　０，　０，　０，　０）；
／＊　Ｍｕｔｅ　ＯＦＦ　＊／
ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（ｓｐｅｋｅｒＩＤ，　ｏｐｒｍｒｅｑＳＰＥＡＫＥＲ＿ＭＵＴＥ＿ＯＦＦ，　０，　０，　０，　０）；
／＊　ＵＮＩ　ＭＩＣ　＊／
ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（ｍｉｃＩＤ，　ｏｐｒｍｒｅｑＭＩＣ＿ＵＮＩ，　０，　０，　０，　０）；
／＊　ＯＭＮＩ　ＭＩＣ　＊／
ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（ｍｉｃＩＤ，　ｏｐｒｍｒｅｑＭＩＣ＿ＯＭＮＩ，　０，　０，　０，　０）；
／＊　ＡＬＣ　ＯＮ　＊／
ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（ｍｉｃＩＤ，　ｏｐｒｍｒｅｑＭＩＣ＿ＡＬＣ＿ＯＮ，　０，　０，　０，　０）；
／＊　ＡＬＣ　ＯＦＦ　＊／
ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（ｍｉｃＩＤ，　ｏｐｒｍｒｅｑＭＩＣ＿ＡＬＣ＿ＯＦＦ，　０，　０，　０，　０）；
／＊　ホワイトバランス設定　＊／
ＯＰｒｉｍｉｔｉｖｅＣｏｎｔｒｏｌ＿ＣａｍｅｒａＰａｒａｍ　ｗｂ（ｏｃａｍｐａｒａｍＷＢ＿ＯＵＴＤＯＯＲ＿ＭＯＤＥ）；
ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（ｐｒｍＩＤ，　ｏｐｒｍｒｅｑＣＡＭ＿ＳＥＴ＿ＷＨＩＴＥ＿ＢＡＬＡＮＣＥ，＆ｗｂ，　ｓｉｚｅｏｆ（ｗｂ），　０，　０）；
／＊　カメラゲイン　＊／
ＯＰｒｉｍｉｔｉｖｅＣｏｎｔｒｏｌ＿ＣａｍｅｒａＰａｒａｍ　ｇａｉｎ（ｏｃａｍｐａｒａｍＧＡＩＮ＿ＭＩＤ）；
ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（ｐｒｍＩＤ，　ｏｐｒｍｒｅｑＣＡＭ＿ＳＥＴ＿ＧＡＩＮ，＆ｇａｉｎ，　ｓｉｚｅｏｆ（ｇａｉｎ），　０，　０）；
／＊　シャッタースピード　＊／
ＯＰｒｉｍｉｔｉｖｅＣｏｎｔｒｏｌ＿ＣａｍｅｒａＰａｒａｍ　ｓｈｕｔｔｅｒ（ｏｃａｍｐａｒａｍＳＨＵＴＴＥＲ＿ＦＡＳＴ）；
ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（ｐｒｍＩＤ，　ｏｐｒｍｒｅｑＣＡＭ＿ＳＥＴ＿ＳＨＵＴＴＥＲ＿ＳＰＥＥＤ，＆ｓｈｕｔｔｅｒ，　ｓｉｚｅｏｆ（ｓｈｕｔｔｅｒ），　０，　０）；
【０２５６】
また、仮引数は、ｐｒｉｍｉｔｉｖｅＩＤ（ＯＰｒｉｍｉｔｉｖｅＩＤ）、ｒｅｑｕｅｓｔ（コントロールリクエスト）、ｐａｒａｍ（パラメータデータ）、ｐａｒａｍＳｉｚｅ（パラメータデータのサイズ）、ｒｅｓｕｌｔ（結果データ）、ｒｅｓｕｌｔＳｉｚｅ（結果データのサイズ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＰＲＩＭＩＴＩＶＥ＿ＩＤ（不正なｐｒｉｍｉｔｉｖｅＩＤ）、ｏＩＮＶＡＬＩＤ＿ＡＲＧ（不正なｒｅｑｕｅｓｔ、ｐａｒａｍ）がある。
【０２５７】
・ＯＰＥＮＲ：：ＮｅｗＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＮｅｗＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ（ｓｉｚｅ＿ｔ　ｎｕｍＣｏｍｍａｎｄｓ，ＭｅｍｏｒｙＲｅｇｉｏｎＩＤ＊　ｍｅｍＩＤ，　ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ＊＊　ｂａｓｅＡｄｄｒ）　であり、ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａの共有メモリを確保します。ｖｅｃｔｏｒＩｎｆｏ．ｎｕｍＤａｔａは０に初期化されます。ＳｅｔＮｕｍＤａｔａ（）を使用して有効要素数を設定します。仮引数は、ｎｕｍＣｏｍｍａｎｄｓ（ＯＣｏｍｍａｎｄＤａｔａ　の要素数）、ｍｅｍＩＤ（ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ　の共有メモリのＭｅｍｏｒｙＲｅｇｉｏｎＩＤ）、ｂａｓｅＡｄｄｒ（ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａへのポインタ）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＮＯ＿ＭＥＭＯＲＹ（共有メモリの確保に失敗）がある。
【０２５８】
・ＯＰＥＮＲ：：ＤｅｌｅｔｅＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＤｅｌｅｔｅＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ（ＭｅｍｒｏｒｙＲｅｇｉｏｎＩＤ　ｍｅｍＩＤ）　であり、ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａ　の共有メモリを解放します。仮引数は、ｍｅｍＩＤ（ＯＣｏｍｍａｎｄＶｅｃｔｏｒＤａｔａの共有メモリのＭｅｍｏｒｙＲｅｇｉｏｎＩＤ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）がある。
【０２５９】
・ＯＰＥＮＲ：：ＮｅｗＳｏｕｎｄＶｅｃｔｏｒＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　ＮｅｗＳｏｕｎｄＶｅｃｔｏｒＤａｔａ（ｓｉｚｅ＿ｔ　ｎｕｍＳｏｕｎｄｓ，　ｓｉｚｅ＿ｔ　ｄａｔａＳｉｚｅ，ＭｅｍｏｒｙＲｅｇｉｏｎＩＤ＊　ｍｅｍＩＤ，　ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａ＊＊　ｂａｓｅＡｄｄｒ）　であり、ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａの共有メモリを確保します。ｖｅｃｔｏｒＩｎｆｏ．ｎｕｍＤａｔａは０に初期化されます。ＳｅｔＮｕｍＤａｔａ（）を使用して有効要素数を設定します。
仮引数は、ｎｕｍＳｏｕｎｄｓ（音声データの要素数）、ｄａｔａＳｉｚｅ（各音声データのサイズ）、ｍｅｍＩＤ（ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａ　の共有メモリのＭｅｍｏｒｙＲｅｇｉｏｎＩＤ）、ｂａｓｅＡｄｄｒ（ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａへのポインタ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＮＯ＿ＭＥＭＯＲＹ（共有メモリの確保に失敗）がある。
【０２６０】
・ＯＰＥＮＲ：：ＤｅｌｅｔｅＳｏｕｎｄＶｅｃｔｏｒＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　ＤｅｌｅｔｅＳｏｕｎｄＶｅｃｔｏｒＤａｔａ（ＭｅｍｏｒｙＲｅｇｉｏｎＩＤ　ｍｅｍＩＤ）　であり、ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａの共有メモリを解放します。仮引数は、ｍｅｍＩＤ（ＯＳｏｕｎｄＶｅｃｔｏｒＤａｔａの共有メモリのＭｅｍｏｒｙＲｅｇｉｏｎＩＤ）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＡＲＧ（不正なｍｅｍＩＤ）、ｏＦＡＩＬ（失敗）がある。
【０２６１】
・ＯＰＥＮＲ：：ＮｅｗＣｄｔＶｅｃｔｏｒＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　ＮｅｗＣｄｔＶｅｃｔｏｒＤａｔａ（ＭｅｍｏｒｙＲｅｇｉｏｎＩＤ＊　ｍｅｍＩＤ，　ＯＣｄｔＶｅｃｔｏｒＤａｔａ＊＊ｂａｓｅＡｄｄｒ）　であり、ＯＣｄｔＶｅｃｔｏｒＤａｔａの共有メモリを確保します。ｖｅｃｔｏｒＩｎｆｏ．ｎｕｍＤａｔａは０に初期化されます。ＳｅｔＮｕｍＤａｔａ（）を使用して有効要素数を設定します。仮引数は、ｍｅｍＩＤ（ＯＣｄｔＶｅｃｔｏｒＤａｔａの共有メモリのＭｅｍｏｒｙＲｅｇｉｏｎＩＤ）、ｂａｓｅＡｄｄｒ（ＯＣｄｔＶｅｃｔｏｒＤａｔａのポインタ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＮＯ＿ＭＥＭＯＲＹ（共有メモリの確保に失敗）がある。
【０２６２】
・ＯＰＥＮＲ：：ＤｅｌｅｔｅＣｄｔＶｅｃｔｏｒＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　ＤｅｌｅｔｅＣｄｔＶｅｃｔｏｒＤａｔａ（ＭｅｍｏｒｙＲｅｇｉｏｎＩＤ　ｍｅｍＩＤ）　であり、ＯＣｄｔＶｅｃｔｏｒＤａｔａの共有メモリを解放します。仮引数は、ｍｅｍＩＤ（ＯＣｄｔＶｅｃｔｏｒＤａｔａの共有メモリのＭｅｍｏｒｙＲｅｇｉｏｎＩＤ）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）がある。
【０２６３】
・ＯＰＥＮＲ：：ＳｅｔＣｄｔＶｅｃｔｏｒＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　ＳｅｔＣｄｔＶｅｃｔｏｒＤａｔａ（ＭｅｍｏｒｙＲｅｇｉｏｎＩＤ　ｍｅｍＩＤ）　であり、ＯＣｄｔＶｅｃｔｏｒＤａｔａをＦｂｋＩｍａｇｅＳｅｎｓｏｒに設定します。仮引数は、ｍｅｍＩＤ（ＯＣｄｔＶｅｃｔｏｒＤａｔａの共有メモリのＭｅｍｏｒｙＲｅｇｉｏｎＩＤ）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＡＲＧ（不正なＯＣｄｔＩｎｆｏ：：ｃｈａｎｎｅｌ）、ｏＩＮＶＡＬＩＤ＿ＰＲＩＭＩＴＩＶＥ＿ＩＤ（不正なｐｒｉｍｉｔｉｖｉｅＩＤ）、ｏＩＮＶＡＬＩＤ＿ＤＡＴＡ＿ＴＹＰＥ（ｔｙｐｅがｏｄａｔａＣＤＴ＿ＶＥＣＴＯＲではありません。）、ｏＦＡＩＬ（上記以外の失敗）がある。
【０２６４】
・ＯＰＥＮＲ：：ＥｎａｂｌｅＪｏｉｎｔＧａｉｎ（）
構文は、ＯＳｔａｔｕｓ　ＥｎａｂｌｅＪｏｉｎｔＧａｉｎ（ＯＰｒｉｍｉｔｉｖｅＩＤ　ｐｒｉｍｉｔｉｖｅＩＤ）　であり、ジョイントのゲインを有効状態にします。ゲインが有効状態の時に、ＯＰＥＮＲ：：ＳｅｔＪｏｉｎｔＧａｉｎ（）　またはＯＰＥＮＲ：：ＳｅｔＤｅｆａｕｌｔＪｏｉｎｔＧａｉｎ（）を実行すると、サーボデバイスにＰＩＤゲインが設定されます。ｐｒｉｍｉｔｉｖｅＩＤにｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＮＤＥＦを指定すると、ＯＰＥＮＲ：：ＯｐｅｎＰｒｉｍｉｔｉｖｅ（）でオープンされているジョイントのゲインが有効状態になります。仮引数は、ｐｒｉｍｉｔｉｖｅＩＤ（ジョイントのＯＰｒｉｍｉｔｉｖｅＩＤまたはｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＤＥＦ）である。また、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＰＲＩＭＩＴＩＶＥ＿ＩＤ（不正なｐｒｉｍｉｔｉｖｅＩＤ）、ｏＡＬＥＲＴ＿ＪＯＩＮＴ＿ＵＮＣＯＮＴＲＯＬＬＡＢＬＥ（ポテンショが断線していて制御不能）　がある。
【０２６５】
・ＯＰＥＮＲ：：ＤｉｓａｂｌｅＪｏｉｎｔＧａｉｎ（）
構文は、ＯＳｔａｔｕｓ　ＤｉｓａｂｌｅＪｏｉｎｔＧａｉｎ（ＯＰｒｉｍｉｔｉｖｅＩＤ　ｐｒｉｍｉｔｉｖｅＩＤ）　であり、ジョイントのゲインを０に設定して、ゲインを無効状態にします。ｐｒｉｍｉｔｉｖｅＩＤにｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＮＤＥＦを指定すると、ＯＰＥＮＲ：：ＯｐｅｎＰｒｉｍｉｔｉｖｅ（）　でオープンされているＪｏｉｎｔのゲインを０に設定して、ゲインを無効状態にします。仮引数は、ｐｒｉｍｉｔｉｖｅＩＤ（ジョイントのＯＰｒｉｍｉｔｉｖｅＩＤ　またはｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＤＥＦ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＰＲＩＭＩＴＩＶＥ＿ＩＤ（不正なｐｒｉｍｉｔｉｖｅＩＤ）、ｏＦＡＩＬ（失敗）がある。
【０２６６】
・ＯＰＥＮＲ：：ＳｅｔＪｏｉｎｔＧａｉｎ（）
構文は、ＯＳｔａｔｕｓ　ＳｅｔＪｏｉｎｔＧａｉｎ（ＯＰｒｉｍｉｔｉｖｅＩＤ　ｐｒｉｍｉｔｉｖｅＩＤ，ｗｏｒｄ　ｐｇ，　ｗｏｒｄ　ｉｇ，　ｗｏｒｄ　ｄｇ，　ｗｏｒｄ　ｐｓ，　ｗｏｒｄ　ｉｓ，　ｗｏｒｄ　ｄｓ）　であり、ジョイントのゲイン設定を行います。ゲインが無効状態の場合は、ゲインは設定されずにｏＧＡＩＮ＿ＤＩＳＡＢＬＥＤを返します。ｐｒｉｍｉｔｉｖｅＩＤにｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＮＤＥＦ　を指定すると、ＯＰＥＮＲ：：ＯｐｅｎＰｒｉｍｉｔｉｖｅ（）がオープンされているすべてのジョイントのゲインを設定します。ジョイントのゲイン設定に成功するとｏＳＵＣＣＥＳＳ　を返します。仮引数は、ｐｒｉｍｉｔｉｖｅＩＤ（ジョイントのＯＰｒｉｍｉｔｉｖｅＩＤまたはｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＤＥＦ）、ｐｇ（ＰＧＡＩＮ係数）、ｉｇ（ＩＧＡＩＮ係数）、ｄｇ（ＤＧＡＩＮ係数）、ｐｓ（ＰＳＨＩＦＴ係数）、ｉｓ（ＩＳＨＩＦＴ係数）、ｄｓ（ＤＳＨＩＦＴ係数）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＰＲＩＭＩＴＩＶＥ＿ＩＤ（ｐｒｉｍｉｔｉｖｅＩＤが不正）、ｏＧＡＩＮ＿ＤＩＳＡＢＬＥＤ（ゲイン無効状態）、ｏＡＬＥＲＴ＿ＪＯＩＮＴ＿ＵＮＣＯＮＴＲＯＬＬＡＢＬＥ（ポテンショが断線していて制御不能）、ｏＦＡＩＬ（失敗）がある。
【０２６７】
・ＯＰＥＮＲ：：ＲｅｇｉｓｔｅｒＤｅｆａｕｌｔＪｏｉｎｔＧａｉｎ（）
構文は、ＯＳｔａｔｕｓ　ＲｅｇｉｓｔｅｒＤｅｆａｕｌｔＪｏｉｎｔＧａｉｎ（ＯＰｒｉｍｉｔｉｖｅＩＤ　ｐｒｉｍｉｔｉｖｅＩＤ，ｗｏｒｄ　ｐｇ，　ｗｏｒｄ　ｉｇ，　ｗｏｒｄ　ｄｇ，　ｗｏｒｄ　ｐｓ，　ｗｏｒｄ　ｉｓ，　ｗｏｒｄ　ｄｓ）　であり、ジョイントにデフォルトゲインを登録します。ｐｒｉｍｉｔｉｖｅＩＤにｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＮＤＥＦを指定すると、ＯＰＥＮＲ：：ＯｐｅｎＰｒｉｍｉｔｉｖｅ（）でオープンされているすべてのジョイントにデフォルトゲインを登録します。仮引数は、ｐｒｉｍｉｔｉｖｅＩＤ（ＪｏｉｎｔのＯＰｒｉｍｉｔｉｖｅＩＤまたはｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＤＥＦ）、ｐｇ（ＰＧＡＩＮ係数）、ｉｇ（ＩＧＡＩＮ係数）、ｄｇ（ＤＧＡＩＮ係数）、ｐｓ（ＰＳＨＩＦＴ係数）、ｉｓ（ＩＳＨＩＦＴ係数）、ｄｓ（ＤＳＨＩＦＴ係数）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＰＲＩＭＩＴＩＶＥ＿ＩＤ（不正なｐｒｉｍｉｔｉｖｅＩＤ）である。
【０２６８】
・ＯＰＥＮＲ：：ＳｅｔＤｅｆａｕｌｔＪｏｉｎｔＧａｉｎ（）
構文は、ＯＳｔａｔｕｓ　ＳｅｔＤｅｆａｕｌｔＪｏｉｎｔＧａｉｎ（ＯＰｒｉｍｉｔｉｖｅＩＤ　ｐｒｉｍｉｔｉｖｅＩＤ）　であり、登録されているデフォルトゲインをジョイントに設定します。ゲインが無効状態の場合は、ゲインは設定されずにｏＧＡＩＮ＿ＤＩＳＡＢＬＥＤを返します。ｐｒｉｍｉｔｉｖｅＩＤにｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＮＤＥＦを指定すると、ＯＰＥＮＲ：：ＯｐｅｎＰｒｉｍｉｔｉｖｅ（）でオープンされているすべてのジョイントのゲインを設定します。ジョイントのゲイン設定に成功するとｏＳＵＣＣＥＳＳを返します。
仮引数は、ｐｒｉｍｉｔｉｖｅＩＤ（ＪｏｉｎｔのＯＰｒｉｍｉｔｉｖｅＩＤまたはｏｐｒｉｍｉｔｉｖｅＩＤ＿ＵＤＥＦ）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＰＲＩＭＩＴＩＶＥ＿ＩＤ（不正なｐｒｉｍｉｔｉｖｅＩＤ）、ｏＧＡＩＮ＿ＤＩＳＡＢＬＥＤ（ゲイン無効状態）、ｏＡＬＥＲＴ＿ＪＯＩＮＴ＿ＵＮＣＯＮＴＲＯＬＬＡＢＬＥ（ポテンショが断線していて制御不能）、ｏＦＡＩＬ（失敗）がある。
【０２６９】
・ＯＰＥＮＲ：：ＧｅｔＪｏｉｎｔＶａｌｕｅ（）
構文は、ＯＳｔａｔｕｓ　ＧｅｔＪｏｉｎｔＶａｌｕｅ（ＯＰｒｉｍｉｔｉｖｅＩＤ　ｐｒｉｍｉｔｉｖｅＩＤ，　ＯＪｏｉｎｔＶａｌｕｅ＊　ｖａｌｕｅ）　であり、Ｊｏｉｎｔの現在値を取得します。仮引数は、ｐｒｉｍｉｔｉｖｅＩＤ（ジョイントのＯＰｒｉｍｉｔｉｖｅＩＤ）、ｖａｌｕｅ（ジョイントの現在値）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＰＲＩＭＩＴＩＶＥ＿ＩＤ（不正なｐｒｉｍｉｔｉｖｅＩＤ）がある。
【０２７０】
・ＯＰＥＮＲ：：ＧｅｔＳｅｎｓｏｒＶａｌｕｅ（）
構文は、ＯＳｔａｔｕｓ　ＧｅｔＪｏｉｎｔＶａｌｕｅ（ＯＰｒｉｍｉｔｉｖｅＩＤ　ｐｒｉｍｉｔｉｖｅＩＤ，　ＯＳｅｎｓｏｒＶａｌｕｅ＊　ｖａｌｕｅ）　であり、センサーの現在値を取得します。仮引数は、ｐｒｉｍｉｔｉｖｅＩＤ（センサーのＯＰｒｉｍｉｔｉｖｅＩＤ）、ｖａｌｕｅ（センサーの現在値）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＰＲＩＭＩＴＩＶＥ＿ＩＤ（不正なｐｒｉｍｉｔｉｖｅＩＤ）がある。
【０２７１】
・ＯＰＥＮＲ：：ＮｅｗＳｙｎｃＫｅｙ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＮｅｗＳｙｎｃＫｅｙ（ＯＶＲＳｙｎｃＫｅｙ＊　ｓｙｎｃＫｅｙ）　であり、ＬＥＤ、サウンド、モーションの開始時の同期をとるために使用します。ＯＰＥＮＲ：：ＮｅｗＳｙｎｃＫｅｙ（）で同期キーを発行し、ＯＰＥＮＲ：：ＤｉｖｉｄｅＳｙｎｃＫｅｙ（）で同期キーをとりたいオブジェクト数に分割して使用します。同期キーの最大数は８　個です。最大数を越えている場合はｓｙｎｃＫｅｙにｏｖｒｓｙｎｃｋｅｙＵＮＤＥＦが入り、ｏＮＯ＿ＳＹＮＣ＿ＫＥＹを返します。仮引数は、ｓｙｎｃＫｅｙ（同期キー）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＮＯ＿ＳＹＮＣ＿ＫＥＹ（最大数８個の同期キーが発行済）がある。
【０２７２】
・ＯＰＥＮＲ：：ＣａｎｃｅｌＳｙｎｃＫｅｙ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＣａｎｃｅｌＳｙｎｃＫｅｙ（ＯＶＲＳｙｎｃＫｅｙ　ｓｙｎｃＫｅｙ）　であり、同期キーをキャンセルします。仮引数は、ｓｙｎｃＫｅｙ（同期キー）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＳＹＮＣ＿ＫＥＹ（不正なｓｙｎｃＫｅｙ）がある。
【０２７３】
・ＯＰＥＮＲ：：ＤｉｖｉｄｅＳｙｎｃＫｅｙ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＤｉｖｉｄｅＳｙｎｃＫｅｙ（ＯＶＲＳｙｎｃＫｅｙ　ｓｙｎｃＫｅｙ，ＯＶＲＳｙｎｃＫｅｙ＊　ｋｅｙ１，　ＯＶＲＳｙｎｃＫｅｙ＊　ｋｅｙ２）であり、同期キーを分割します。仮引数は、ｓｙｎｃＫｅｙ（分割前の同期キー）、ｋｅｙ１、ｋｅｙ２（分割後の同期キー）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）がある。
【０２７４】
・ＯＰＥＮＲ：：ＳｅｔＭｏｔｏｒＰｏｗｅｒ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＳｅｔＭｏｔｏｒＰｏｗｅｒ（ＯＰｏｗｅｒ　ｐｏｗｅｒ）　であり、モーター電源を制御します。ｐｏｗｅｒ　にはｏｐｏｗｅｒＯＮまたはｏｐｏｗｅｒＯＦＦを指定します。仮引数は、ｐｏｗｅｒ（ｏｐｏｗｅｒＯＮまたはｏｐｏｗｅｒＯＦＦ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）がある。
【０２７５】
・ＯＰＥＮＲ：：Ｓｈｕｔｄｏｗｎ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：Ｓｈｕｔｄｏｗｎ（ｃｏｎｓｔ　ＯＢｏｏｔＣｏｎｄｉｔｉｏｎ＆　ｂｏｏｔＣｏｎｄｉｔｉｏｎ）　であり、指定したｂｏｏｔＣｏｎｄｉｔｉｏｉｎを設定して、シャットダウンの処理を開始します。仮引数は、ｂｏｏｔＣｏｎｄｉｔｉｏｎ（ブート条件）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）、ｏＮＯＴ＿ＦＯＵＮＤ（システムオブジェクトが存在しません。）がある。
【０２７６】
・ＯＰＥＮＲ：：ＧｅｔＢｏｏｔＣｏｎｄｉｔｉｏｎ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＧｅｔＢｏｏｔＣｏｎｄｉｔｉｏｎ（ＯＢｏｏｔＣｏｎｄｉｔｉｏｎ＊　ｂｏｏｔＣｏｎｄｉｔｉｏｎ）　であり、起動要因を取得します。
2004001148.tif 000043
ここで起動要因は、ｂｉｔｍａｐに格納されます。ｂｏｏｔＴｉｍｅ、ｂａｔｔｅｒｙＣａｐａｃｉｔｙＬｏｗ、ｖｉｂｒａｔｉｏｎＬｅｖｅｌは０になります。起動要因の種類は、以下である。
ｏｂｃｂＢＯＯＴ＿ＴＩＭＥＲ　　　　　　　　＝　０ｘ０００１；　時間で起動
ｏｂｃｂＶＩＢＲＡＴＩＯＮ＿ＤＥＴＥＣＴＥＤ　＝　０ｘ０００２；　振動で起動
ｏｂｃｂＰＡＵＳＥ＿ＳＷ　　　　　　　　　　＝　０ｘ０００４；　ポーズボタンで起動
ｏｂｃｂＳＴＡＴＩＯＮ＿ＣＯＮＮＥＣＴＥＤ　　＝　０ｘ０００８；　ステーション接続で起動
ｏｂｃｂＳＴＡＴＩＯＮ＿ＤＩＳＣＯＮＮＥＣＴＥＤ　＝　０ｘ００１０；　ステーション切断で
ｏｂｃｂＢＡＴＴＥＲＹ＿ＣＡＰＡＣＩＴＹ＿ＦＵＬＬ　＝　０ｘ００２０；　充電完了
ｏｂｃｂＲＥＱ＿ＦＲＯＭ＿ＳＴＡＴＩＯＮ　　　＝　０ｘ００４０；　将来使用予定
仮引数は、ｂｏｏｔＣｏｎｄｉｔｉｏｎ（起動要因）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）、ｏＮＯＴ＿ＦＯＵＮＤ（システムオブジェクトが存在しません。）がある。
【０２７７】
・ＯＰＥＮＲ：：ＧｅｔＰｏｗｅｒＳｔａｔｕｓ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＧｅｔＰｏｗｅｒＳｔａｔｕｓ（ＯＰｏｗｅｒＳｔａｔｕｓ＊　ｐｏｗｅｒＳｔａｔｕｓ）　であり、以下の構造体で定義されるパワーの状態を取得します。
2004001148.tif 000044
単位は、以下を使用します。
ｒｅｍａｉｎｉｎｇＣａｐａｃｉｔｙ：バッテリ残量（１％／ｂｉｔ，　０　−　１００％）
ｔｅｍｐｅｒａｔｕｒｅ：バッテリの温度（０．１Ｋｅｌｖｉｎ／ｂｉｔ，　０　−　５００．０Ｋｅｌｖｉｎ）
ｆｕｌｌｙＣｈａｒｇｅｄＣａｐａｃｉｔｙ：満充電時の容量　（ｍＡｈ）
ｖｏｌｔａｇｅ：バッテリの電圧（１ｍＶ／ｂｉｔ，　０　−　６５５３５ｍＶ）
ｃｕｒｒｅｎｔ：バッテリの電流（１ｍＡ／ｂｉｔ，　−３２７６８　−　３２７６７ｍＡ）
ｔｉｍｅＤｉｆ：ＵＴＣ（Ｕｎｉｖｅｒｓａｌ　Ｃｏｏｒｄｉｎａｔｅ　Ｔｉｍｅ）からの時差
ｖｏｌｕｍｅ：ボリューム　０，　１，　２，　３　の何れか
また、仮引数は、ｐｏｗｅｒＳｔａｔｕｓ（パワーの状態）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）、ｏＮＯＴ＿ＦＯＵＮＤ（システムオブジェクトが存在しません。）がある。
【０２７８】
・ＯＰＥＮＲ：：ＯｂｓｅｒｖｅＰｏｗｅｒＳｔａｔｕｓ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＯｂｓｅｒｖｅＰｏｗｅｒＳｔａｔｕｓ（ｃｏｎｓｔ　ＯＰｏｗｅｒＳｔａｔｕｓ＆　ｎｏｔｉｆｙＳｔａｔｕｓ，　ｃｏｎｓｔ　ＯＳｅｒｖｉｃｅＥｎｔｒｙ＆　ｅｎｔｒｙ）であり、ｎｏｔｉｆｙＳｔａｔｕｓ　で指定したパラメータに変更があればｅｎｔｒｙに通知します。ｎｏｔｉｆｙＳｔａｔｕｓ　のうちｆｕｌｌｙＣｈａｒｇｅｄＣａｐａｃｉｔｙ、ｖｏｌｔａｇｅ、ｃｕｒｒｅｎｔは変更を監視することはできません。　ｒｏｂｏｔＳｔａｔｕｓ、ｂａｔｔｅｒｙＳｔａｔｕｓ　は、指定したビットに変更があれば通知されます。　また、ｒｅｍａｉｎｉｎｇＣａｐａｃｉｔｙ、ｔｅｍｐｅｒａｔｕｒｅ、ｔｉｍｅＤｉｆ、ｖｏｌｕｍｅについては　ＯＰｏｗｅｒ．ｈ　において以下のような記号定数を定義し、ｏｐｓｏ＊＿ＮＯＴＩＦＹ＿ＥＶＥＲＹ＿ＣＨＡＮＧＥ　では変更があれば通知して、ｏｐｓｏ＊＿ＮＯＴ＿ＮＯＴＩＦＹ　では通知せず、それ以外の値では指定した値になったときに通知します。　通知されるメッセージの構造体はＯＰｏｗｅｒＳｔａｔｕｓＭｅｓｓａｇｅです。
【０２７９】
ＯＰｏｗｅｒ．ｈで定義されている記号定数には、以下のものがある。
ｃｏｎｓｔ　ｗｏｒｄ　ｏｐｓｏＴＥＭＰＥＲＡＴＵＲＥ＿ＮＯＴＩＦＹ＿ＥＶＥＲＹ＿ＣＨＡＮＧＥ　＝　０ｘＦＦＦＦ；
ｃｏｎｓｔ　ｗｏｒｄ　ｏｐｓｏＴＥＭＰＥＲＡＴＵＲＥ＿ＮＯＴ＿ＮＯＴＩＦＹ　＝　０ｘＦＦＦＥ；
ｃｏｎｓｔ　ｗｏｒｄ　ｏｐｓｏＲＥＭＡＩＮＩＮＧ＿ＣＡＰＡＣＩＴＹ＿ＮＯＴＩＦＹ＿ＥＶＥＲＹ＿ＣＨＡＮＧＥ　＝　０ｘＦＦＦＦ；
ｃｏｎｓｔ　ｗｏｒｄ　ｏｐｓｏＲＥＭＡＩＮＩＮＧ＿ＮＯＴ＿ＮＯＴＩＦＹ　＝　０ｘＦＦＦＥ；
ｃｏｎｓｔ　ｓｂｙｔｅ　ｏｐｓｏＴＩＭＥ＿ＤＩＦ＿ＮＯＴＩＦＹ＿ＥＶＥＲＹ＿ＣＨＡＮＧＥ　＝　０ｘＦＦ；
ｃｏｎｓｔ　ｓｂｙｔｅ　ｏｐｓｏＴＩＭＥ＿ＤＩＦ＿ＮＯＴ＿ＮＯＴＩＦＹ＝　０ｘＦＥ；
ｃｏｎｓｔ　ｓｂｙｔｅ　ｏｐｓｏＶＯＬＵＭＥ＿ＮＯＴＩＦＹ＿ＥＶＥＲＹ＿ＣＨＡＮＧＥ＝　０ｘＦＦ；
ｃｏｎｓｔ　ｓｂｙｔｅ　ｏｐｓｏＶＯＬＵＭＥ＿ＮＯＴ＿ＮＯＴＩＦＹ＝　０ｘＦＥ；
【０２８０】
一度ＯｂｓｅｒｖｅＰｏｗｅｒＳｔａｔｕｓ（）　を実行すると、ＯＰＥＮＲ：：ＵｎｏｂｓｅｒｖｅＰｏｗｅｒＳｔａｔｕｓ（）　を実行するまで、指定したｎｏｔｉｆｙＳｔａｔｕｓになったときに通知されます。ｎｏｔｉｆｙＳｔａｔｕｓのｒｏｂｏｔＳｔａｔｕｓ、ｂａｔｔｅｒｙＳｔａｔｕｓの各ビットについては立ち上がり、立ち下がり両エッジで　ｎｏｔｉｆｙが通知されます。ｒｅｍａｉｎｉｎｇＣａｐａｃｉｔｙ、ｔｅｍｐｅｒａｔｕｒｅ、ｔｉｍｅＤｉｆ、ｖｏｌｕｍｅについては値が変更される、もしくは指定した値になったら通知されます。　値を指定したときはその値になったときに通知され、その値から変更されたときには通知されません。　また、指定した値が変更されないときも通知されません。
【０２８１】
ここで仮引数は、ｎｏｔｉｆｙＳｔａｔｕｓ（変更を通知してほしいパラメーターを指定した　ＯＰｏｗｅｒＳｔａｔｕｓ構造体）、ｅｎｔｒｙ（変更が通知されるエントリ）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）、ｏＮＯＴ＿ＦＯＵＮＤ（システムオブジェクトが存在しません。）がある。
【０２８２】
・ＯＰＥＮＲ：：ＵｎｏｂｓｅｒｖｅＰｏｗｅｒＳｔａｔｕｓ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＵｎｏｂｓｅｒｖｅＰｏｗｅｒＳｔａｔｕｓ（ｃｏｎｓｔ　ＯＳｅｒｖｉｃｅＥｎｔｒｙ＆　ｅｎｔｒｙ）　であり、ＯＰＥＮＲ：：ＯｂｓｅｒｖｅＰｏｗｅｒＳｔａｔｕｓ（）の監視要求を取り消します。仮引数は、ｅｎｔｒｙ（監視要求を取り消すエントリ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）、ｏＮＯＴ＿ＦＯＵＮＤ（システムオブジェクトが存在しません。）、ｏＩＮＶＡＬＩＤ＿ＡＲＧ（不正なｅｎｔｒｙ）がある。
【０２８３】
・ＯＰＥＮＲ：：ＦｉｎｄＤｅｓｉｇｎＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＦｉｎｄＤｅｓｉｇｎＤａｔａ（ｃｏｎｓｔ　ｃｈａｒ＊　ｋｅｙｗｏｒｄ，ＯＤｅｓｉｇｎＤａｔａＩＤ＊ｄａｔａＩＤ，　ｂｙｔｅ＊＊　ｄａｔａ，　ｓｉｚｅ＿ｔ＊　ｓｉｚｅ）　であり、デザインデータベースのｋｅｙｗｏｒｄに対応するファイルを検索します。見つかった場合は共有メモリに読み込んでＯＤｅｓｉｇｎＤａｔａＩＤと先頭アドレスを返します。予約キーワード　「ＳＹＳ＿ＣＰＵＩＮＦＯ」　で引数を呼び出すと　ＣＰＵ　の動作周波数を取得することができます。　ＯＣＰＵＩｎｆｏ　の先頭アドレスを返します。このキーワード’ＳＹＳ＿ＣＰＵＩＮＦＯ’は、ＤＥＳＩＧＮＤＢ．ＣＦＧに登録されていなくても使用できます。
2004001148.tif 000045
仮引数は、ｋｅｙｗｏｒｄ（デザインデータベースを検索するキーワード）、ｄａｔａＩＤ（デザインデータのＩＤ）、ｄａｔａ（デザインデータの先頭アドレス）、ｓｉｚｅ（デザインデータのサイズ）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＮＯＴ＿ＦＯＵＮＤ（ｋｅｙｗｏｒｄまたはデザインデータの実体が存在しません。）、ｏＤＥＳＩＧＮＤＡＴＡ＿ＳＩＺＥ＿ＺＥＲＯ（デザインデータのファイルサイズが０）、ｏＮＯ＿ＭＥＭＯＲＹ（メモリが足りません。）、ｏＦＡＩＬ（失敗）がある。
【０２８４】
・ＯＰＥＮＲ：：ＤｅｌｅｔｅＤｅｓｉｇｎＤａｔａ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＤｅｌｅｔｅＤｅｓｉｇｎＤａｔａ（ＯＤｅｓｉｇｎＤａｔａＩＤ　ｄａｔａＩＤ）　であり、デザインデータのメモリを解放します。仮引数は、ｄａｔａＩＤ（デザインデータのＩＤ）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＩＮＶＡＬＩＤ＿ＡＲＧ（不正なｄａｔａＩＤ）、ｏＦＡＩＬ（失敗）がある。
【０２８５】
・ＯＰＥＮＲ：：ＧｅｔＲｏｂｏｔＤｅｓｉｇｎ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＧｅｔＲｏｂｏｔＤｅｓｉｇｎ（ｃｈａｒ＊　ｒｏｂｏｔＤｅｓｉｇｎ）　であり、ロボットデザインを取得します。仮引数は、ｒｏｂｏｔＤｅｓｉｇｎ（ロボットデザイン）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）がある。
【０２８６】
・ＯＰＥＮＲ：：ＧｅｔＭｅｍｏｒｙＳｔｉｃｋＳｔａｔｕｓ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＧｅｔＭｅｍｏｒｙＳｔｉｃｋＳｔａｔｕｓ（ＯＭｅｍｏｒｙＳｔｉｃｋＳｔａｔｕｓ＊　ｓｔａｔｕｓ）　であり、メモリスティックの状態を調べます。ｏｍｅｍｏｒｙｓｔｉｃｋＮＯＴ＿ＥＸＩＳＴであれば、メモリスティックが存在しないことを示す。ｏｍｅｍｏｒｙｓｔｉｃｋＷＲＩＴＥ＿ＰＲＯＴＥＣＴＥＤであれば、ライトプロテクトスイッチＯＮを示す。また、ｏｍｅｍｏｒｙｓｔｉｃｋＷＲＩＴＡＢＬＥであれば、ライトプロテクトスイッチＯＦＦを示す。仮引数は、ｓｔａｔｕｓ（メモリスティックの状態）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）がある。
【０２８７】
・ＯＰＥＮＲ：：Ｆａｔａｌ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：Ｆａｔａｌ（ＯＦａｔａｌ　ｆａｔａｌ）　であり、ＢＭＮマイコンのブザーで、警告音を鳴らしてから電源ＯＦＦにします。ｆａｔａｌで警告音の種類を指定します。仮引数は、ｆａｔａｌ（警告音の種類。現在はｏｆａｔａｌＭＥＭＯＲＹ＿ＳＴＩＣＹのみをサポートしています。）であり、ｏｆａｔａｌＵＮＤＥＦは、トッカータとフーガを示し、ｏｆａｔａｌＭＥＭＯＲＹ＿ＳＴＩＣＫは、メモリスティック破壊エラー音であり、ｏｆａｔａｌＰＡＵＳＥ＿ＳＷは、無音である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）がある。
【０２８８】
・ＯＰＥＮＲ：：ＳｅｔＴｉｍｅ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＳｅｔＴｉｍｅ（ｃｏｎｓｔ　ＯＴｉｍｅ＆　ｔｉｍｅ）　であり、ＲＴＣの時刻をｔｉｍｅで指定した時刻に設定します。ｔｉｍｅに−１２から＋１２までの値で、かつ現在の時差と異なる時差が設定されている場合は、時差もＢＭＮマイコンに設定されます。仮引数は、ｔｉｍｅ（時刻および時差）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）、ｏＮＯＴ＿ＦＯＵＮＤ（システムオブジェクトが存在しません。）がある。
【０２８９】
・ＯＰＥＮＲ：：ＧｅｔＴｉｍｅ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＧｅｔＴｉｍｅ（ＯＴｉｍｅ＊　ｔｉｍｅ）　であり、時刻および時差を取得します。仮引数は、ｔｉｍｅ（時刻および時差の構造体）である。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）、ｏＮＯＴ＿ＦＯＵＮＤ（システムオブジェクトが存在しません。）がある。
【０２９０】
・ＯＰＥＮＲ：：ＳｅｔＴｉｍｅＤｉｆｆｅｒｅｎｃｅ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＳｅｔＴｉｍｅＤｉｆｆｅｒｅｎｃｅ（ｓｂｙｔｅ　ｔｉｍｅＤｉｆｆｅｒｅｎｃｅ）　であり、時差を設定します。仮引数は、ｔｉｍｅＤｉｆｆｅｒｅｎｃｅ（時差）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）、ｏＮＯＴ＿ＦＯＵＮＤ（システムオブジェクトが存在しません。）がある。
【０２９１】
・ＯＰＥＮＲ：：ＧｅｔＴｉｍｅＤｉｆｆｅｒｅｎｃｅ（）
構文は、ＯＳｔａｔｕｓ　ＯＰＥＮＲ：：ＧｅｔＴｉｍｅＤｉｆｆｅｒｅｎｃｅ（ｓｂｙｔｅ＊　ｔｉｍｅＤｉｆｆｅｒｅｎｃｅ）　であり、時差を取得します。仮引数は、ｔｉｍｅＤｉｆｆｅｒｅｎｃｅ（時差）であり、戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）、ｏＮＯＴ＿ＦＯＵＮＤ（システムオブジェクトが存在しません。）がある。
【０２９２】
・ＯＰＥＮＲ：：ＳｅｔＶｏｌｕｍｅＳｗｉｔｃｈ（）
構文は、ＯＳｔａｔｕｓ　ＳｅｔＶｏｌｕｍｅＳｗｉｔｃｈ（ＯＶｏｌｕｍｅＳｗｉｔｃｈ　ｖｏｌＳＷ）　であり、ボリュームスイッチのレベルを設定します。仮引数は、ｖｏｌＳＷ（ボリュームスイッチのレベル）であり、ｏｖｏｌｕｍｅＳＷ０、ｏｖｏｌｕｍｅＳＷ１、ｏｖｏｌｕｍｅＳＷ２、ｏｖｏｌｕｍｅＳＷ３がある。また、戻り値は、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）である。
【０２９３】
・ＯＰＥＮＲ：：ＧｅｔＶｏｌｕｍｅＳｗｉｔｃｈ（）
構文は、ＯＳｔａｔｕｓ　ＧｅｔＶｏｌｕｍｅＳｗｉｔｃｈ（ＯＶｏｌｕｍｅＳｗｉｔｃｈ＊　ｖｏｌＳＷ）　であり、ボリュームスイッチのレベルを取得します。仮引数は、ｖｏｌＳＷ（ボリュームスイッチのレベル）であり、ｏｖｏｌｕｍｅＳＷ０、ｏｖｏｌｕｍｅＳＷ１、ｏｖｏｌｕｍｅＳＷ２、ｏｖｏｌｕｍｅＳＷ３がある。戻り値には、ｏＳＵＣＣＥＳＳ（成功）、ｏＦＡＩＬ（失敗）がある。
【０２９４】
＜インターネットプロトコル＞
続いて、ＯＰＥＮ−Ｒ　１．１．３が動作しているＯＰＥＮ−Ｒにおいて実装されているインターネットプロトコル第４版（ＩＰｖ４）について解説します。本バージョンのＩＰｖ４には４個のネットワークプロトコル、すなわちＴＣＰ、ＵＤＰ、ＩＰ及びＤＮＳのクライアント側が含まれています。本書は、ＩＰｖ４プログラマーズガイドと、ＩＰｖ４リファレンスガイドの２部から構成されています。
ＩＰｖ４プログラマーズガイドは、ＯＰＥＮ−Ｒ上のネットワーキング及びＩＰｖ４プロトコルスタックの紹介です。ＯＰＥＮ−ＲオブジェクトがスタックにおけるＴＣＰ、ＵＤＰ、ＤＮＳ、ＩＰのサービスをどのように使用するかを詳細に説明します。また、ＩＰｖ４リファレンスガイドは、すべてのクラス及びメッセージ、エラー、操作の詳細な説明です。これらはＩＰｖ４プロトコルスタックと通信するオブジェクトを書くときに必要です。
【０２９５】
以降の説明では、ＯＰＥＮ−Ｒオブジェクトのことを単にオブジェクトと呼びます。また、通信においてリモート側がＯＰＥＮ−Ｒではない場合、例えばＵｎｉｘの場合にはオブジェクトの代わりにプロセスと呼ぶ方が適切ですが、ここではこれらを総称してオブジェクトという語を使用しています。
【０２９６】
ＩＰｖ４プログラマーズガイド
第１章　ＩＰｖ４プロトコルスタック
この章では、ＩＰｖ４プロトコルスタックの現行バージョンに含まれる各プロトコルを記述し、ＯＰＥＮ−Ｒ上の実装であるＩＰＳｔａｃｋを紹介し、オブジェクトとプロトコルスタックとの間の通信方法について説明します。
【０２９７】
１．１　ＩＰｖ４プロトコルスタックのプロトコル
インターネットプロトコル（ＩＰ）は、インターネットで使用されるホスト間のデータ送信用のプロトコルです。ＩＰバージョン４（ＩＰｖ４）は、現在最も広く使用されており、ＯＰＥＮ−Ｒ上で利用できます。ＯＰＥＮ−Ｒ上のＩＰｖ４プロトコルスタックには、基本的なＩＰプロトコルを補足するいくつかのプロトコルが含まれています。現行バージョンのＩＰｖ４プロトコルスタックには以下のプロトコルが含まれています。
【０２９８】
（１）ＩＰ（Ｉｎｔｅｒｎｅｔ　Ｐｒｏｔｏｃｏｌ、インターネットプロトコル）：インターネット上でデータグラムを送信する役割を果たす基本プロトコルです。パケット指向、コネクションレス型のプロトコルで、ＩＰデータグラムの信頼性保証のない転送を行います。
【０２９９】
（２）ＴＣＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ　Ｃｏｎｔｒｏｌ　Ｐｒｏｔｏｃｏｌ、伝送制御プロトコル）：ＩＰプロトコルの上で動作します。オブジェクトに、コネクション指向で信頼性保証のあるバイトストリームサービスを提供します。
【０３００】
（３）ＵＤＰ（Ｕｓｅｒ　Ｄａｔａｇｒａｍ　Ｐｒｏｔｏｃｏｌ、ユーザーデータグラムプロトコル）：ＩＰプロトコル上で動作します。オブジェクトに信頼性保証のないデータグラム配送サービスを提供します。
【０３０１】
（４）ＤＮＳ（Ｄｏｍａｉｎ　Ｎａｍｅ　Ｓｙｓｔｅｍ、ドメインネームシステム）：ドメインネームをＩＰアドレスに、またはＩＰアドレスをドメインネームにマップするサービスです。
【０３０２】
１．２　ＩＰｖ４プロトコルスタック
ＯＰＥＮ−Ｒでは、ＩＰｖ４プロトコルスタックは、Ａｐｅｒｉｏｓ　Ｎｅｔｗｏｒｋｉｎｇ　Ｔｏｏｌｋｉｔ（ＡＮＴ）を使用して実装されています。プロトコルスタックは、実行時にＩＰＳｔａｃｋ内に存在し、そこにはＡＮＴ実行時環境も含まれています。ＩＰＳｔａｃｋは、ＯＰＥＮ−Ｒシステム層のオブジェクトです。また、ＩＰＳｔａｃｋは、メッセージパッシング（ｍｅｓｓａｇｅ　ｐａｓｓｉｎｇ）を使用してオブジェクトやデバイスドライバーと通信します。以下の図１７は、ＯＰＥＮ−Ｒ上におけるＩＰＳｔａｃｋのネットワークサービスを示している。
【０３０３】
１．３　オブジェクトがプロトコルスタックと通信する方法
オブジェクトは、ＩＰｖ４プロトコルスタックが提供するネットワークサービスを利用することができます。オブジェクトは、通常のメッセージパッシングを使用してＩＰＳｔａｃｋとの間で特別なメッセージを送受信することにより、プロトコルスタックと通信します。オブジェクトが最初に実行するのは、ＩＰＳｔａｃｋにエンドポイント（ｅｎｄｐｏｉｎｔ）の作成を依頼することです。エンドポイントは特殊なＡＮＴ構成体で、プロトコルスタックの最上位にあり、オブジェクトとスタックとの通信を請け負います。通常、オブジェクトには、ネットワークコネクションごとに１つのエンドポイントが必要となります。例えば、ＴＣＰコネクションとＵＤＰコネクションを通じてデータを送信するオブジェクトは、２つのエンドポイント（図１８を参照）が必要です。２つのＴＣＰコネクションを通じてデータを送信する場合も同様で、オブジェクトには２つのエンドポイントが必要です。新規のエンドポイントの作成方法については後述します。図１８は、オブジェクトが、ＩＰスタックのエンドポイントに対してネットワークサービス要求を送り、エンドポイントを使用してＩＰｖ４プロトコルスタックにアクセスする様子を示している。
【０３０４】
エンドポイントに加えて、オブジェクトは、１個以上の共有メモリーバッファを作成します。共有メモリーバッファは、オブジェクトとＩＰｖ４プロトコルスタック間のデータ交換に必要です。オブジェクトとプロトコルスタックは、必ずしも同一アドレス空間を共有していませんので、転送するデータへのポインタを交換することはできません。ＡｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体によって実装された共有メモリーバッファは、共通のメモリー領域を２つのオブジェクトのアドレス空間にマップします。共有メモリーバッファの作成方法は後述します。ＩＰＳｔａｃｋに送られるすべてのメッセージは、ａｎｔＥｎｖＭｓｇ構造体から継承しています。この構造体は、Ｓｅｎｄ（）やＣａｌｌ（）などの基本的なメッセージハンドリング関数を提供します。プロトコルが行う各サービスは、特有の継承したメッセージ型を持っています。例えば、ＴＣＰでデータ送信する要求はＴＣＰＥｎｄＰｏｉｎｔＳｅｎｄＭｓｇによって作成され、ＵＤＰコネクションをバインドする要求はＵＤＰＥｎｄＰｏｉｎｔＢｉｎｄＭｓｇによって作成されます。
【０３０５】
新エンドポイントを作成する
ＩＰスタック内のいずれかのプロトコルの新規のエンドポイントを作成するには、オブジェクトはａｎｔＥｎｖＣｒｅａｔｅＥｎｄｐｏｉｎｔＭｓｇをＩＰＳｔａｃｋに送ります。オブジェクトはａｎｔＥｎｖＣｒｅａｔｅＥｎｄｐｏｉｎｔＭｓｇのなかで、エンドポイントを必要とするプロトコルの種別と、エンドポイントのＳＤＵプールに割り当てるメモリー容量を指定します。ＩＰＳｔａｃｋは、指定されたプロトコルのための新規エンドポイントを作成し、ａｎｔＥｎｖＣｒｅａｔｅＥｎｄｐｏｉｎｔＭｓｇの結果メッセージを返します。このメッセージのなかのＭｏｄｕｌｅＲｅｆ仮引数には、新規のエンドポイントへの参照が格納されています。以下の例では、オブジェクトは新規のＴＣＰエンドポイントを作成します。この方法はＩＰＳｔａｃｋの他のプロトコルの場合も、オブジェクトが異なる型のエンドポイントを指定することを除き、全く同様です。
【０３０６】
最初に、以下のようにオブジェクトは新規のＴＣＰエンドポイントを要求するメッセージを作成します。
2004001148.tif 000046
このとき、以下のエンドポイントの型が使用できます。
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＴＣＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＵＤＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＤＮＳ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＩＰ
この例のオブジェクトは、パケットサイズの４倍の大きさ（４＊ＰＡＣＫＥＴＳＩＺＥ）のＳＤＵプールを要求している。ＳＤＵプールは、データをプロトコルスタックに格納する内部ＡＮＴ構成体です。指針として、送信しようとする最大のパケットより少し大きいＳＤＵプールを常に作成することが好ましいです。例えば８ＫＢのパケットの場合は、約１０ＫＢのＳＤＵプールが必要です。
【０３０７】
オブジェクトは、メッセージをＩＰＳｔａｃｋに送ります。
2004001148.tif 000047
Ｃａｌｌ（）は、ａｎｔＥｎｖＭｓｇから継承しています。ＩＰＳｔａｃｋを指すａｎｔＳｔａｃｋＲｅｆ（ＩＰＳｔａｃｋＲｅｆ）とメッセージの大きさを指定します。Ｃａｌｌ（）は同期型のメッセージパッシングを行うので、オブジェクトは結果メッセージを受け取るまで動作を中断します。結果メッセージを受け取ると、オブジェクトは新規のエンドポイントに対する参照を取得します。
【０３０８】
ｅｎｄｐｏｉｎｔ　＝　ｃｒｅａｔｅＭｓｇ．ｍｏｄｕｌｅＲｅｆ；
この参照によって、オブジェクトは、新規のエンドポイントと通信ができるようになります。オブジェクトはエンドポイント対してＴＣＰプロトコルの提供する、コネクション、リッスン、送信、受信、クローズなどのサービスを要求するメッセージを送ることができます。他のプロトコルでは提供するサービスは異なります。
【０３０９】
共有メモリーバッファを作成する
共有メモリーバッファはａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体によって実装されています。このバッファは、共有メモリー領域をオブジェクトとプロトコルスタックのアドレス空間にマップします。オブジェクトがプロトコルスタックとデータを交換する場合は、そのデータは共有バッファへのポインタとバッファ内のオフセットとによって識別されます。ａｎｔＳｈａｒｅｄＢｕｆｆｅｒは、図１９に示すとおり、このオフセットをオブジェクトのアドレス空間内のある位置に自動的に変換します。図１９には、共有メモリーバッファがメモリー領域をオブジェクトとプロトコルスタックのアドレス空間にマップする様子が示されている。これにより、データへのポインタのやりとりを可能にします。オブジェクトは、１個の共有バッファを作成しても、データの送信や受信のような特定の操作ごとに複数のバッファを作成してもかまいません。
【０３１０】
また、共有バッファの割当と開放は、共有メモリー管理ルーチンによって行われます。これらのルーチンは、実行に時間がかかります。したがって、共有バッファの作成及び削除は、必要なときのみ行い、できる限り既存のバッファを再使用するようにしてください。通常、個々の新規のエンドポイントごとに送信バッファと受信バッファを作成し、エンドポイントでの以後の送受信操作にはバッファを再使用します。共有バッファのサイズに関して、いくつかの制限事項があります。通常、要求されたサイズは、ＯＰＥＮ−Ｒ上のページサイズの一番近い倍数に切り上げられます。ＯＰＥＮ−Ｒのページサイズはメモリー保護モードの場合には４０９６バイトです。例えば、７０００バイトの共有バッファを要求すると、バッファは８１９２バイト（４０９６＊２）になります。共有バッファの使い方は様々ですが、個々のオブジェクトでの必要に応じて、どのように使用されるかが決まります。
【０３１１】
共有バッファを作成するには、オブジェクトは、バッファのサイズを指定してａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇをＩＰＳｔａｃｋに送ります。このときＩＰＳｔａｃｋは、共有バッファを作成し、ａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇに返事を返します。結果メッセージのｂｕｆｆｅｒ仮引数には、新規のａｎｔＳｈａｒｅｄＢｕｆｆｅｒへの参照が格納されています。その後、オブジェクトはａｎｔＳｈａｒｅｄＢｕｆｆｅｒ：：Ｍａｐ（）を呼び出して、バッファをそのアドレス空間にマップします。ａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇ及びａｎｔＳｈａｒｅｄＢｕｆｆｅｒについては、「第６章　ＡＮＴ環境リファレンス」を参照してください。
【０３１２】
以下の例では、ＴＣＰクライアントのオブジェクトは、２つの共有バッファを作成します。１つはデータ送信用であり、もう１つは、データ受信用です。最初に、オブジェクトは新規の共有バッファを要求するメッセージを作成します。
ａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇ　ｂｕｆｆｅｒＭｓｇ（ＰＡＣＫＥＴＳＩＺＥ）；
指定したバッファサイズは、バケットサイズと同一です。これは、オブジェクトとプロトコルスタックとのデータ交換は１回に１個のパケットで行われるためです。指針として、共有メモリーバッファは、オブジェクトが送受信する最大のパケットを保持する必要があります。
【０３１３】
ここで、オブジェクトはメッセージをＩＰＳｔａｃｋに送ります。
2004001148.tif 000048
Ｃａｌｌ（）は、ａｎｔＥｎｖＭｓｇから継承しています。ＩＰＳｔａｃｋを指すａｎｔＳｔａｃｋＲｅｆ（ＩＰＳｔａｃｋＲｅｆ）とメッセージのサイズを指定します。Ｃａｌｌ（）は同期型のメッセージパッシングを行うので、オブジェクトは結果メッセージを受け取るまで動作を中断します。オブジェクトは返事を受け取ると、新規の共有バッファに対する参照を取得し、それを送信バッファとして定義します。
ｓｅｎｄＢｕｆｆｅｒ　＝　ｂｕｆｆｅｒＭｓｇ．ｂｕｆｆｅｒ；
最後に、オブジェクトは共有バッファを自分のアドレス空間にマップします。
ｓｅｎｄＢｕｆｆｅｒ．Ｍａｐ（）
受信バッファを作成するために、オブジェクトは、ＩＰＳｔａｃｋにａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇを再度送って、上記の手順を繰り返します。
2004001148.tif 000049
オブジェクトがデータをプロトコルスタックに送信するとき、オブジェクトは、送信バッファ内のデータに対するポインタを送ります。プロトコルスタックからデータを受信するとき、受信バッファの該当データに対するポインタを受けとります。ＡｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体は、これらのポインタをオブジェクトまたはプロトコルスタックのアドレス空間の位置に自動的に変換します。
【０３１４】
ネットワークサービスを要求する
ＩＰプロトコルスタックのいずれかのプロトコルからのサービスを要求するには、オブジェクトはメッセージを作成し、それをＩＰＳｔａｃｋ内の該当するエンドポイントに送ります。メッセージの型によって、要求されているサービスを識別します。メッセージの内容には、サービスを実行するのに必要な情報（ＩＰアドレス、ポート番号、共有バッファ内のデータへのポインタなど）が含まれています。
【０３１５】
各プロトコルは、ａｎｔＥｎｖＭｓｇから継承したメッセージの独自のセットを提供します。これらのメッセージについては、「第２部　ＩＰｖ４リファレンスガイド」のＴＣＰ、ＵＤＰ、ＤＮＳ、ＩＰの項を参照してください。
【０３１６】
以下の例では、オブジェクトは他方のホストへのＴＣＰコネクションをオープンします。まず、オブジェクトは、コネクションを要求するメッセージを作成します。
2004001148.tif 000050
最初の仮引数のｅｎｄｐｏｉｎｔは、メッセージが送られるＴＣＰエンドポイントを識別します。次の２つの仮引数（ゼロ）は、コネクションが確立されたときにローカルＩＰアドレスとポート番号を返します。最後の２つの仮引数は、コネクション先ホストのＩＰアドレスとポート番号を指定します。
【０３１７】
次に、オブジェクトは、このメッセージをＩＰＳｔａｃｋのＴＣＰエンドポイントへ送ります。
2004001148.tif 000051
Ｃａｌｌ（）は、ａｎｔＥｎｖＭｓｇから継承しています。ＩＰＳｔａｃｋを指すａｎｔＳｔａｃｋＲｅｆ（ＩＰＳｔａｃｋＲｅｆ）とメッセージのサイズを指定します。Ｃａｌｌ（）は同期型のメッセージパッシングを行うので、オブジェクトは結果メッセージを受け取るまで動作を中断します。
【０３１８】
第２章　ＴＣＰガイド
この章では、ＯＰＥＮ−Ｒ上のＴＣＰプロトコルを紹介し、オブジェクトがＩＰｖ４プロトコルスタックの提供するＴＣＰサービスを使用する方法を説明します。
２．１　ＴＣＰ
ＴＣＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ　Ｃｏｎｔｒｏｌ　Ｐｒｏｔｏｃｏｌ、伝送制御プロトコル）は、ＩＰｖ４プロトコルスタックのＩＰ層の上位で動作します。ＴＣＰは、オブジェクトに信頼性保証のあるバイトストリームサービスを提供します。ＴＣＰは、コネクション指向のプロトコルです。したがって、送受信するオブジェクトは、コネクションを確立してからデータ転送を行います。
【０３１９】
ＴＣＰネットワーク操作
ＯＰＥＮ−Ｒでは、ＩＰｖ４プロトコルスタックはオブジェクトに対して、以下のＴＣＰ操作を提供します。
Ｃｏｎｎｅｃｔ：別のホスト上のサーバ（プログラム）へのＴＣＰコネクションをオープンします。
Ｌｉｓｔｅｎ：コネクション要求のリッスンを開始します。主として、この操作はコネクション操作の代わりにサーバのオブジェクトによって実行されます。通常、サーバのオブジェクトは、クライアント（プログラム）からのＴＣＰコネクション要求を受け入れます。
Ｓｅｎｄ：オープンされたコネクションでデータを送ります。
Ｒｅｃｅｉｖｅ：オープンされたコネクションでデータを受け取ります。
Ｃｌｏｓｅ：ＴＣＰコネクションをクローズします。
オブジェクトは、ＩＰＳｔａｃｋのＴＣＰエンドポイントに特別のメッセージを送ることによって、これらの操作を実行します。これらのメッセージは、ＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｅｓｓａｇｅを継承し、さらに後者はａｎｔＥｎｖＭｓｇを継承しています。これらのメッセージについては「第７章　ＴＣＰリファレンス」を参照してください。
【０３２０】
オブジェクトがどのようにエンドポイントを作成し、ネットワークサービスを要求するかについては、「１．３　オブジェクトがプロトコルスタックと通信する方法」を参照してください。
【０３２１】
ＴＣＰエンドポイントのライフサイクル
図２０は、ＴＣＰエンドポイントのライフサイクルの状態遷移です。これらの遷移は、ＴＣＰコネクション中のイベントと操作の起こりうるシーケンスを示しています。図２０に示すメッセージの型については、「第２部　ＩＰｖ４リファレンスガイド」で詳しく説明しています。オブジェクトは、オープンされたネットワークコネクションごとに１つのエンドポイントを必要とします。コネクションが確立されている場合は、新規のコネクションを要求することはできません。オブジェクトは、まず新規のエンドポイントを作成する必要があります。エンドポイントは、同種の操作を一度に１回しか実行できません。例えば、ＴＣＰＥｎｄｐｏｉｎｔＬｉｓｔｅｎＭｓｇをすでにリッスンしているエンドポイントに送ると、そのエンドポイントはＴＣＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＢＵＳＹエラーまたはＴＣＰ＿ＯＰＥＲＡＴＩＯＮ＿ＩＮＶＡＬＩＤエラーを返します。しかし、送受信の操作を同時に行うことは可能です。
【０３２２】
２．２　ＴＣＰエンドポイントを作成する
ＴＣＰコネクションをオープンする前に、オブジェクトは新規のＴＣＰエンドポイントを作成する必要が有ります。オブジェクトは、オープンするＴＣＰコネクションごとに１つの新規のエンドポイントを必要とします。エンドポイントを作成する手順は、ＩＰスタック内のすべてのプロトコルについても同様です。
【０３２３】
２．３　コネクションを確立する（クライアント側）
クライアントのオブジェクトがサーバとＴＣＰコネクションを確立するには、ＴＣＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。このメッセージにおける仮引数には、以下のものがある。
ＩＰＡｄｄｒｅｓｓｌＡｄｄｒｅｓｓ：（出力）コネクションが確立されるとローカルＩＰアドレスを返す。
ＰｏｒｔｌＰｏｒｔ：（出力）コネクションが確立されるとクライアントのオブジェクトに割り当てられた一時的なポート番号を返す。
ＩＰＡｄｄｒｅｓｓｆＡｄｄｒｅｓｓ：（入力）コネクションするホストのＩＰアドレスである。
ＰｏｒｔｆＰｏｒｔ：（入力）コネクションするオブジェクトのポート番号ある。
コネクションが確立されると、ＴＣＰエンドポイントは、完全に特定されたＩＰアドレスとポート番号を返します。２つのホスト上のオブジェクトは、コネクションの確立後にデータの送受信を行うことができます。
【０３２４】
２．４　コネクション要求のリッスン（サーバ側）
サーバのオブジェクトは、クライアントのオブジェクトからのコネクション要求を受け入れます。そのためには、サーバのオブジェクトは要求を常時モニター（リッスン）して、要求を受け取ったときだけコネクションを確立する必要が有ります。通常は、特定のポート番号へのコネクション要求だけ受け入れます。例えば、ＦＴＰサーバはＦＴＰポート（２１）上のコネクションだけを受け入れます。サーバのオブジェクトが複数のクライアントを同時に扱うためには、２つ以上のリッスン操作を同時並行に実行する必要があります。各リッスン操作は同じポート番号上のコネクション要求を待ちます。サーバのオブジェクトは、各リッスン操作ごとに別々のエンドポイントが必要です。コネクション要求に対してリッスンを開始するには、サーバのオブジェクトはＴＣＰＥｎｄｐｏｉｎｔＬｉｓｔｅｎＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。
【０３２５】
このメッセージの仮引数には、以下のものがある。
ＩＰＡｄｄｒｅｓｓｌ　Ａｄｄｒｅｓｓ：（出力）コネクションが確立されたときに、ローカルＩＰアドレスを返す。
Ｐｏｒｔｌ　Ｐｏｒｔ：（入力）コネクション要求を受け入れるポート番号である。任意のポートへのコネクション要求を受け入れる場合は、ＩＰ＿ＰＯＲＴ＿ＡＮＹの値を指定する。
ＩＰＡｄｄｒｅｓｓｆ　Ａｄｄｒｅｓｓ：（出力）コネクションを要求したホストのＩＰアドレスを返す。
Ｐｏｒｔｆ　Ｐｏｒｔ：（出力）コネクションを要求したオブジェクトのポート番号を返す。
コネクション要求を受け取ると、ＴＣＰエンドポイントは、コネクションを確立して、完全に特定されたＩＰアドレスとポート番号を返します。
【０３２６】
２．５　データを送信する
オープンしたＴＣＰコネクションでデータを送信するには、オブジェクトはＴＣＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。このメッセージの仮引数は、以下の通りである。
ｂｕｆｆｅｒ：（入力）送信するデータへのポインタである。データは、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体によって定義された共有メモリーバッファに格納しておきます。
ｓｉｚｅ：（入力）送信するデータのサイズでバイト単位で表される。
ＴＣＰエンドポイントは、データがＩＰスタックによって処理されバッファが再使用できるようになったとき、このメッセージに返事を返します。
【０３２７】
２．６　データを受信する
オープンしたＴＣＰコネクションからデータを受信するには、オブジェクトはＩＰＳｔａｃｋのＴＣＰエンドポイントへＴＣＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇを送ります。以下に、このメッセージの仮引数を示す。
ｂｕｆｆｅｒ：（入力）着信データが書き込まれるメモリー領域へのポインタである。この領域は、共有メモリーバッファにあり、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体によって定義されています。
ｓｉｚｅＭｉｎ：（入力／出力）受信する最小バイト数を指定します。受信動作が完了し、エンドポイントがオブジェクトに返事を返すと、この仮引数は実際に受信したバイト数を返します。
ｓｉｚｅＭａｘ：　　　（入力／出力）　受信する最大バイト数を指定します。受信動作が完了し、エンドポイントがオブジェクトに返事を返すと、この仮引数は実際に受信したバイト数を返します。
【０３２８】
データが受信バッファにコピーされると、ＴＣＰエンドポイントは、このメッセージに返事を返します。しかし、伝送中の全てのデータが受信されていてＴＣＰコネクションがクローズされた場合は、最後の受信要求は、ｓｉｚｅＭｉｎの指定より少ないバイト数になる可能性がある。
【０３２９】
２．７　コネクションをクローズする
ＴＣＰコネクションは、以下の３つの方法でクローズすることができます。
・アクティブクローズ
オブジェクトが直接通信クローズの要求を送信するクローズである。オブジェクトが直接ＴＣＰコネクションのクローズを開始するとアクティブクローズが生じます。アクティブクローズを実行するには、オブジェクトは、ＴＣＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。オブジェクトがアクティブクローズを実行すると、データの送受信はできなくなります。コネクション先のオブジェクトは、残りの伝送データを受け取り、その後にコネクションがクローズされたという信号を受け取ります。他方のオブジェクトからみるとパッシブクローズが発生したことになります。
【０３３０】
・パッシブクローズ
コネクション先のオブジェクトが通信クローズの要求を送信するクローズである。ネットワークの相手側のオブジェクトがＴＣＰコネクションを（アクティブクローズを実行して）クローズすると、パッシブクローズが起こります。オブジェクトがすべてのデータ伝送を受信し終わると、ＴＣＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＣＬＯＳＥＤエラーが発生します。その際は、オブジェクトは、ＴＣＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇをＩＰＳｔａｃｋのエンドポイントに送って、パッシブクローズを完了する。
【０３３１】
・アボート
エラーが発生した時にコネクションが不意にクローズされることであり、ＴＣＰコネクションに予期しないことが発生するとアボートが発生します。アボードが起こる例としては、コネクションが切れてタイムアウトになったとき、コネクション要求の時間がかかりすぎたとき、要求しているオブジェクトによって切断されたとき、通常のアクティブクローズ或いはパッシブクローズに時間がかかりすぎたためオブジェクトの一方によって切断されたとき、オブジェクトがコネクションをアボートすると決定したとき等があげられる。アボートでは、共有バッファからすべてのデータを削除し、直ちにコネクションをクローズします。コネクションをアボートするには、オブジェクトは、ＴＣＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇをＩＰＳｔａｃｋのエンドポイントへ送ります。このメッセージは、ａｂｏｒｔと呼ばれるｂｏｏｌｅａｎの仮引数を持っています。この仮引数がＴＲＵＥの場合は、ＴＣＰコネクションは通常の方法で終了せずにアボートされます。
【０３３２】
２．８　ＴＣＰエコークライアントの例
この節では、ＴＣＰエコークライアントプログラムの例を取り上げて、ＴＣＰメッセージの使用方法について説明します。ＴＣＰエコークライアントは、ＴＣＰエコーサーバとコネクションを確立してデータを送信します。そして、サーバから返送されたデータを受信するとコネクションをクローズします。この例では、データの送受信を同時に行わなければなりません。したがって、必要な個所ではａｎｔＥｎｖＭｓｇのメンバー関数の非同期バージョンが使用されます。このとき、それらのメッセージを処理するスタブと、エントリポイントの番号が定義されていることが必要です。エントリポイントの番号の付け方は「エントリポイントの定義」を参照してください。
【０３３３】
変数の定義
変数の定義は、以下のように実行する。
2004001148.tif 000052
【０３３４】
エントリポイントの定義
また、オブジェクトの初期化時、受信要求が完了時、送信要求が処理されたときにエントリポイントを定義する。ｓｔｕｂ．ｃｆｇには以下の記述が必要です。エントリポイントの定義方法の詳細は、「プログラマーズガイドの２．３　スタブ」のＥｘｔｒａ　ｅｎｔｒｙを参照してください。
Ｅｘｔｒａ　：　Ｉｎｉｔｉａｌｉｚｅ（）
Ｅｘｔｒａ　：　ＲｅｃｅｉｖｅＣｏｎｔ（）
Ｅｘｔｒａ　：　ＳｅｎｄＣｏｎｔ（）
ｓｔｕｂｇｅｎ２コマンドを実行するとｘｘｘＳｔｕｂ．ｃｃが生成され、以下が記述されます。
2004001148.tif 000053
ここで、エントリポイントの番号は、ＯｂｊｅｃｔＥｎｔｒｙＴａｂｌｅ［］の要素の順番に応じて決まります。
【０３３５】
オブジェクトの初期化
この関数は、クライアントオブジェクトが起動する時に呼び出され、共有バッファの作成、ＴＣＰエンドポイントの作成、ＴＣＰエコーサーバへのコネクション確立操作を実行する。
2004001148.tif 000054
2004001148.tif 000055
2004001148.tif 000056
【０３３６】
ＴＣＰ　コネクションのクローズ
以下の関数は、共有バッファを破棄してコネクションをクローズします。
2004001148.tif 000057
【０３３７】
データの受信
以下の関数は、必要な量のデータが到着するまでデータを受信した後にＴＣＰコネクションをクローズします。非同期通信を実現するために関数を２個使用しています。ＤｏＲｅｃｅｉｖｅ（）は、１からＰＡＣＫＥＴＳＩＺＥ　ｂｙｔｅｓまでの受信を試みます。
2004001148.tif 000058
【０３３８】
１回の受信要求が完了するとＲｅｃｅｉｖｅＣｏｎｔ（）　が呼ばれます。すべての送信したデータが受信されたとき、ＴＣＰコネクションは、クローズされます。それ以外の場合は、新規の受信要求が出されます。
2004001148.tif 000059
【０３３９】
データの送信
この関数は、データをエコーサーバに送信します。ここでは非同期通信を実現するために、関数を２個使用しています。ＤｏＳｅｎｄ（）は、エコーサーバに　ＰＡＣＫＥＴＳＩＺＥ　バイトを送信します。
2004001148.tif 000060
【０３４０】
送信バッファがＩＰスタックで処理されて、オブジェクトで再使用可能になると、ＳｅｎｄＣｏｎｔ（）が呼ばれます。さらにデータを送信するときは、新規の送信要求を出します。
2004001148.tif 000061
【０３４１】
第３章　ＵＤＰガイド
この章では、ＯＰＥＮ−Ｒ上のＵＤＰプロトコルを紹介し、ＩＰｖ４プロトコルスタックが提供するＵＤＰサービスをオブジェクトがどのように使用できるかを説明します。
３．１　ＵＤＰ
ＵＤＰ（Ｕｓｅｒ　Ｄａｔａｇｒａｍ　Ｐｒｏｔｏｃｏｌ）は、ＩＰｖ４プロトコルスタックのＩＰ層の上位で動作するプロトコルです。ＵＤＰはデータのパケットつまりデータグラムをＩＰ層へ送り、ＩＰ層はパケットをネットワークの先へ送り届けます。ＵＤＰは、オブジェクトにコネクションレスの信頼性保証の無いデータグラム配送サービスを提供します。コネクションレスとは、送信／受信ホストはコネクションを確立しないという意味です。ＵＤＰは、ＴＦＴＰやＤＮＳ、ＮＦＳなどのアプリケーション層のプロトコルによって使用されます。
【０３４２】
・ＵＤＰネットワーク操作
ＯＰＥＮ−Ｒでは、ＩＰｖ４プロトコルスタックは、オブジェクトに以下のＵＤＰ操作を提供します。
Ｂｉｎｄ：ローカルコネクションパラメタを設定し、オブジェクトをＵＤＰパケットの宛先として識別します。バインド操作後は、オブジェクトは、パケットの宛先アドレスがバインドパラメタで指定したＩＰアドレス及びポート番号と同じ場合のみパケットを受信します。
Ｃｏｎｎｅｃｔ：オプション操作です。この操作でオブジェクトは外部コネクションパラメタを設定します。パケットは、コネクションパラメタのＩＰアドレスとポート番号によって指定されたホストのみと交換されるようになります。
Ｓｅｎｄ：データを送信します。
Ｒｅｃｅｉｖｅ：データを受信します。
Ｃｌｏｓｅ：ＢｉｎｄとＣｏｎｎｅｃｔで設定したパラメタを消去し、データの送受信を停止します。
オブジェクトは、特別なメッセージをＩＰＳｔａｃｋのＵＤＰエンドポイントに送ることによって、これらの操作をします。これらのメッセージは、ＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｅｓｓａｇｅを継承しており、さらに後者はａｎｔＥｎｖＭｓｇを継承しています。これらのメッセージについては「第８章　ＵＤＰリファレンス」を参照してください。オブジェクトがどのようにエンドポイントを作成し、ネットワークサービスを要求するかについては「１−３　オブジェクトがプロトコルスタックと通信する方法」を参照してください。
【０３４３】
・ＵＤＰエンドポイントのライフサイクル
図２１は、ＵＤＰエンドポイントのライフサイクルの状態遷移を示しています。図２１に示すメッセージタイプについては「第２部　ＩＰｖ４リファレンスガイド」で詳しく説明しています。オブジェクトは、ＵＤＰコネクションごとに１つのエンドポイントを必要とします。エンドポイントは類似操作を一度に１回しか実行できません。例えば、ＵＤＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇを、すでにデータ送信中のエンドポイントに送ると、そのエンドポイントはＵＤＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＢＵＳＹエラーを返します。しかし、受信メッセージは、このエンドポイントに送れます。
【０３４４】
３．２　ＵＤＰエンドポイントを作成する
オブジェクトは、ＵＤＰでデータを送受信する前に、新ＵＤＰエンドポイントを作成する必要が有ります。オブジェクトは、ＵＤＰコネクションごとに新規のエンドポイントを必要とします。エンドポイントを作成する手順は、ＩＰスタックのすべてのプロトコルについても同様です。手順の詳細については、「１−３　オブジェクトがプロトコルスタックと通信する方法」を参照してください。
【０３４５】
３．３　エンドポイントをバインドする
オブジェクトは、エンドポイントの作成後、バインドを行なわねばなりません。バインドとは、ローカルコネクションパラメタを設定する手順です。ローカルコネクションパラメタは、ＵＤＰパケットを送信するときにエンドポイントが使用するポートを識別します。エンドポイントをバインドするには、オブジェクトはＵＤＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。以下に、このメッセージの仮引数を示す。
ａｄｄｒｅｓｓ：（入力／出力）ローカルホスト上の有効なＩＰアドレスです。ＩＰ＿ＡＤＤＲ＿ＡＮＹを指定すると、オブジェクトはローカルホスト上のどのＩＰアドレスに送られたパケットでも受信します。これは異なるアドレスで複数のインターフェイスをもつマルチホームのホストにとって有用です。ホストがマルチホームでない場合は、ローカルＩＰアドレスが返されます。マルチホームのホスト上では、オブジェクトがエンドポイントをバインドした後にコネクション操作をすると、ＩＰ＿ＡＤＤＲ＿ＡＮＹが特定のＩＰアドレスに更新されます。
【０３４６】
ｐｏｒｔ：（入力／出力）オブジェクトのポート番号です。ＩＰ＿ＰＯＲＴ＿ＡＮＹを指定すると、オブジェクトに一時的なポート番号が割り当てられ、エンドポイントがバインドされた時点で返されます。このポート番号は、１０２４またはそれ以上になります。エンドポイントがバインドされると、オブジェクトは、データの送受信ができます。オブジェクトが最初にコネクション操作（すべてのパケットの宛先指定）を実行していない限り、バケット毎に宛先のＩＰアドレスとポート番号を指定してください。コネクション操作についての詳細は、「３−４　外部コネクションパラメタを設定する（オプション）」を参照してください。
【０３４７】
３．４　外部コネクションパラメタを設定する（オプション）
エンドポイントをバインドした後、オブジェクトはコネクション操作を実行することもできます。この操作で、そのエンドポイント上でオブジェクトが送信するすべてのパケットの送信先のＩＰアドレスとポート番号を指定します。一度コネクションすると、オブジェクトはパケットを送信するたびに宛先を指定する必要がなくなります。コネクション操作のためには、オブジェクトは、ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。以下に、このメッセージの仮引数を示す。
ａｄｄｒｅｓｓ：（入力）パケット送信先のホストのＩＰアドレスを指定します。
ｐｏｒｔ：（入力）パケット送信先のオブジェクトのポート番号を指定します。
【０３４８】
３．５　データを送信する
ＵＤＰでデータを送信するには、オブジェクトは、ＩＰＳｔａｃｋのエンドポイントにＵＤＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇを送ります。エンドポイントがバインドされていてもコネクションされていない場合は、このメッセージで宛先のＩＰアドレスとポート番号を指定します。エンドポイントがコネクションされている場合は、この情報は必要ありません。以下に、ＵＤＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇメッセージの仮引数を示す。
ａｄｄｒｅｓｓ：（入力）データの送り先ホストのＩＰアドレスです。オブジェクトがコネクション操作を済ませていると、この仮引数は無視され、ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇで指定されているＩＰアドレスが使用されます。
ｐｏｒｔ：（入力）データの送り先のオブジェクトのポート番号です。オブジェクトがコネクション操作を済ませていると、この仮引数は無視され、ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇで指定されているポート番号が使用されます。
ｂｕｆｆｅｒ：（入力）送られるデータへのポインタです。このデータは、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体によって定義された共有メモリーバッファに格納しておきます。
ｓｉｚｅ：（入力）送られるデータのサイズで、単位はバイトです。
データが共有バッファから削除されて送信されたとき、ＵＤＰエンドポイントはこのメッセージに対して返事を返します。
【０３４９】
３．６　データを受信する
ＵＤＰでデータを受信するには、オブジェクトは、ＵＤＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇをＩＰＳｔａｃｋのＵＤＰエンドポイントに送ります。以下に、このメッセージの仮引数を示す。
ａｄｄｒｅｓｓ：（出力）データを送ったホストのＩＰアドレスである。
ｐｏｒｔ：（出力）データを送ったオブジェクトのポート番号である。
ｂｕｆｆｅｒ：（入力）受信データを格納するバッファへのポインタである。このデータの格納先は、共有メモリーバッファであり、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体によって定義されています。
ｓｉｚｅ：（入力／出力）受け取るバイトの最大値を指定します。受信操作が完了し、エンドポイントがオブジェクトに返事を返すと、この仮引数は受け取った実際のバイト数を返します。受信したパケットが指定されたｓｉｚｅより大きいと余剰データは削除されます。ＵＤＰエンドポイントは、データが共有バッファにコピーされると、このメッセージに返事を返します。
【０３５０】
３．７　エンドポイントをクローズする
ＵＤＰエンドポイントをクローズするには、オブジェクトは、ＵＤＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。このメッセージは仮引数を持っていません。このメッセージを送った後は、オブジェクトはデータの送受信はできません。コネクションが完全にクローズすると、エンドポイントは返事を返します。
【０３５１】
３．８　ＵＤＰエコーサーバの例
ＵＤＰエコーサーバの例で、ＵＤＰメッセージの使い方を説明します。ＵＤＰエコーサーバはＵＤＰコネクションをオープンし、それをエコーポート（７）にバインドします。このコネクションで受け取ったデータはすべて送り返されます。エントリポイントの番号の付け方は「エントリポイントの定義」を参照してください。
【０３５２】
変数の定義
以下のように変数を定義する。
2004001148.tif 000062
【０３５３】
エントリポイントの定義
ｓｔｕｂ．ｃｆｇに以下の記述が必要です。エントリポイントの定義方法の詳細は「プログラマーズガイドの２．３　スタブ」のＥｘｔｒａ　ｅｎｔｒｙを参照してください。
Ｅｘｔｒａ　：　Ｉｎｉｔｉａｌｉｚｅ（）
Ｅｘｔｒａ　：　ＲｅｃｅｉｖｅＣｏｎｔ（）
Ｅｘｔｒａ　：　ＳｅｎｄＣｏｎｔ（）
ｓｔｕｂｇｅｎ２コマンドを実行するとｘｘｘＳｔｕｂ．ｃｃが生成され、以下が記述されます。
2004001148.tif 000063
ここでエントリポイントの番号は、ＯｂｊｅｃｔＥｎｔｒｙＴａｂｌｅ［］の要素の順番に応じて決まります。
【０３５４】
オブジェクトの初期化
クライアントオブジェクトが起動したとき、この関数が呼ばれます。この関数は、送信／受信用に共有バッファの作成、ＵＤＰエンドポイントの作成、エンドポイントをエコーポート（７）にバインドする、の３項目を実行します。
2004001148.tif 000064
2004001148.tif 000065
【０３５５】
データのエコー
これらの関数は、ＵＤＰデータグラムを受信するとともに送り元のＩＰアドレス、ポート番号を取得し、データを送り返します。ＤｏＲｅｃｅｉｖｅ（）は、ＰＡＣＫＥＴＳＩＺＥバイトまでを含むパケットに対する受信要求を行います。
2004001148.tif 000066
【０３５６】
ＵＤＰデータグラムを受信したとき、ＲｅｃｅｉｖｅＣｏｎｔ（）が呼ばれます。この関数は、該当データの送り元にデータグラムを送り返します。
2004001148.tif 000067
【０３５７】
データがＩＰＳｔａｃｋで処理されてバッファが再使用できる状態になったとき、ＳｅｎｄＣｏｎｔ（）が呼ばれます。次に新規の受信要求がでます。
2004001148.tif 000068
【０３５８】
ＵＤＰコネクションをクローズする
Ｃｌｏｓｅ（）は、共有バッファをアンマップして廃棄する処理と、ＵＤＰコネクションをクローズする処理とを行う。
2004001148.tif 000069
【０３５９】
第４章ＤＮＳガイド
この章ではＯＰＥＮ−Ｒ上のＤＮＳクライアントサポートを紹介し、ＩＰｖ４プロトコルスタックが提供するＤＮＳクライアントサービスを、オブジェクトがどのように使用できるかを説明します。
４．１　ＤＮＳの紹介
ＤＮＳ（ドメインネームシステム）は、ＩＰｖ４プロトコルスタック内のＵＤＰ上で動作するプロトコルです。インターネットのドメイン名とＩＰアドレスを設定、取得、変換するサービスを提供します。例えば、オブジェクトがＦＴＰを使用してファイルをｆｔｐｓｅｒｖｅｒ．ｙｏｕｒｄｏｍａｉｎ．ｃｏｍというドメイン名を持つホストに送りたいとき、オブジェクトはそのホストのＩＰアドレスを知っていなければなりません。このアドレスを決定するために、オブジェクトがＤＮＳに要求を送ると、ＤＮＳはｆｔｐｓｅｒｖｅｒ．ｙｏｕｒｄｏｍａｉｎ．ｃｏｍが１９２．１６８．１．２００というＩＰアドレスを持っているという返事を返します。この情報によって、オブジェクトはＦＴＰコネクションを実行し、ファイルをｆｔｐｓｅｒｖｅｒ．ｙｏｕｒｄｏｍａｉｎ．ｃｏｍに送り始めることができます。
【０３６０】
・ＤＮＳネットワーク操作
ＯＰＥＮ−Ｒでは、ＩＰｖ４プロトコルスタックはオブジェクトに以下のようなＤＮＳ操作を提供します。
ホストのＤＮＳサーバの設定及び取得：ホストが使用しているすべてのＤＮＳサーバのＩＰアドレスを設定または取得します。すべてのオブジェクトはＤＮＳサーバの定義を共有していることに注意してください。１つのオブジェクトがＤＮＳサーバの定義を変更すると、他のオブジェクトは自動的に変更された定義を使用することになります。
オブジェクトのデフォルトドメイン名の設定及び取得：ホストのデフォルトドメイン名を設定、取得します。
ＩＰアドレスまたはドメイン名による完全なホストエントリの取得：指定されたホストのＩＰアドレスとドメイン名のエイリアスとの完全なリストを取得します。
ホストのＩＰアドレスの取得：ホストが複数のアドレスを持っている場合は、ホストの有効なＩＰアドレスのいずれかを取得します。
ホストのドメイン名エイアスの取得：ドメイン名に複数のエイリアスがある場合は、ホストの有効なエイリアスのいずれかを取得します。
クローズ：オブジェクトのＤＮＳエンドポイントをクローズします。
【０３６１】
オブジェクトは、特別なメッセージをＩＰＳｔａｃｋのＤＮＳエンドポイントに送り、これらの操作を実行します。これらのメッセージはＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｅｓｓａｇｅを継承しており、さらに後者はａｎｔＥｎｖＭｓｇを継承しています。オブジェクトがどのようにエンドポイントを作成し、ネットワークサービスを要求するかについては「１−３オブジェクトがプロトコルスタックと通信する方法」を参照してください。
【０３６２】
・ＤＮＳエンドポイントのサイクル
図２２は、ライフサイクル期間のＤＮＳエンドポイントの状態遷移を示しています。図２２のメッセージの型について「ＩＰｖ４リファレンスガイド」で説明します。オブジェクトは、ＤＮＳコネクションごとに１つのエンドポイントを必要とし、１つのエンドポイントは一度に１つの操作しか実行できません。例えば、その操作をすでに実行している１つのエンドポイントにＤＮＳＥｎｄｐｏｉｎｔＳｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇを送ると、そのエンドポイントはＤＮＳ＿ＣＯＮＮＥＣＴＩＯＮ＿ＢＵＳＹエラーを返します。
【０３６３】
４．２　ＤＮＳエンドポイントを作成する
ＤＮＳとデータの送受信を行うには、オブジェクトは新規のＤＮＳエンドポイントを作成する必要が有ります。エンドポイントを作成する手順は、ＩＰスタックのすべてのプロトコルについても同様です。「１−３　オブジェクトがプロトコルスタックと通信する方法」を参照してください。可能ならば、ＤＮＳエンドポイントは１つのみオープンし、そのオブジェクトの使用中はそのエンドポイントを、すべてのＤＮＳ操作とクエリーに再使用するようにしてください。ＤＮＳクエリーをこれ以上行わないときのみ、エンドポイントをクローズしてください。ただし、オブジェクトが必要とする場合は、複数のＤＮＳエンドポイントを作成することは可能です。
【０３６４】
４．３　オブジェクトのＤＮＳサーバの設定と取得
オブジェクトの初期化時、オブジェクトは、ドメイン名とＩＰアドレスを解決するのに使用するすべてのＤＮＳサーバのリストを登録します。一度このリストが登録されると、クエリーはリストされているサーバにリストの順序にしたがって送られます。
・ＤＮＳサーバのＩＰアドレスを設定する
ＤＮＳサーバのＩＰアドレスのリストを登録するには、オブジェクトはＤＮＳＥｎｄｐｏｉｎｔＳｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。以下に、ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇの仮引数を示す。
ｎｓｃｏｕｎｔ：（入力）登録するＩＰアドレスの数である。
ａｄｄｒＬｉｓｔ［ＭＡＸＮＳ］：（入力）登録するＩＰアドレスのリストである。
・ＤＮＳサーバのＩＰアドレスを取得する
ホスト用に登録したＤＮＳサーバのリストを取得するには、オブジェクトはＤＮＳＥｎｄｐｏｉｎｔＧｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。以下に、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇの仮引数を示す。
ｎｓｃｏｕｎｔ：（出力）登録されたＩＰアドレスの数である。
ａｄｄｒＬｉｓｔ［ＭＡＸＮＳ］：（出力）ＩＰアドレスのリストである。
【０３６５】
４．４　オブジェクトのデフォルトドメイン名の設定と取得
初期化時に、オブジェクトは、そのデフォルトドメイン名を登録します。デフォルトドメイン名が登録された後は、名前が完全指定されていないすべてのホスト名にこのドメイン名が自動的に付加されます。
・デフォルトドメイン名を設定する
デフォルトドメイン名を設定するには、オブジェクトは、ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇ　をＩＰＳｔａｃｋにあるオブジェクトのエンドポイントに送ります。ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇは、１つの仮引数を持っており、この仮引数でドメイン名ｎａｍｅ［ＭＡＸＤＮＡＭＥ］を指定します。ドメイン名はｎｕｌｌ文字で終わらせてください。
・デフォルトドメイン名を取得する
デフォルトドメイン名を取得するには、オブジェクトはＤＮＳＥｎｄｐｏｉｎｔＧｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇは１つの仮引数を持っており、この仮引数がドメイン名ｎａｍｅ［ＭＡＸＤＮＡＭＥ］を指定します。ドメイン名はｎｕｌｌ文字で終端しています。
【０３６６】
４．５　ホストエントリを取得する
インターネット上のホストのＩＰアドレス、ドメイン名、ドメイン名のエイリアスを決定しようとするとき、オブジェクトはそのＤＮＳサーバの１つからホスト用のエントリを取得します。ホストエントリには図２３に示すように、通常、ホスト用のすべてのＩＰアドレスやドメイン名のエイリアスのリストが含まれます。ＯＰＥＮ−Ｒでは、オブジェクトがＤＮＳプロトコルにホストエントリを要求すると、そのエントリには、ホストエントリを返したＤＮＳサーバのアドレス、リストの最初のＩＰアドレス（正式なアドレス）及びホスト用のＩＰアドレスの総数、リストの最初のドメイン名（正式なドメイン名）及びホスト用ドメイン名のエイリアスの総数のみが含まれます。異なるＩＰアドレスまたはドメイン名のエイリアスの１つを取得したい場合は、明示的に要求します。詳細については、この章の後にでてくる「４−６　ホストのＩＰアドレスを取得する」及び「４−７　ホストのドメイン名のエイリアスを取得する」を参照してください。
【０３６７】
・ドメイン名でエントリを取得する
ホストのドメイン名或いはドメイン名のエイリアスしか分からない場合に、ホストエントリを取得するには、オブジェクトはＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。以下に、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇの仮引数を示す。
ｎａｍｅ［ＭＡＸＤＮＡＭＥ］：（入力／出力）エントリを取得しようとしているホストのドメイン名です。ドメイン名はｎｕｌｌ文字で終端させてください。ドメイン名のエイリアスを指定すると、ホストの正式なドメイン名を返します。
ｓｅｒｖｅｒ＿ａｄｄｒｅｓｓ：（出力）ホストエントリを送ったＤＮＳサーバのＩＰアドレスである。
ｈｏｓｔ＿ａｄｄｒｅｓｓ：（出力）ホストのＩＰアドレスです。ホストが複数のＩＰアドレスを持つ場合は、最初のＩＰアドレスを返します。
ｎ＿ａｄｄｒｅｓｓ　　：（出力）ホスト用のＩＰアドレスの個数である。
ｎ＿ａｌｉａｓ：（出力）ホスト用のドメイン名のエイリアスの個数である。
【０３６８】
・ＩＰアドレスでエントリを取得する
ホストのＩＰアドレスしか分からない場合に、ホストエントリを取得するには、オブジェクトはＤＮＳＥｎｄｐｏｉｎｔｇｅｔＨｏｓｔＢｙＡｄｄｒＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。以下に、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＡｄｄｒＭｓｇの仮引数を示す。
ｈｏｓｔ＿ａｄｄｒｅｓｓ：（入力／出力）ホストのＩＰアドレスです。元のメッセージで異なるＩＰアドレスを指定しても、そのホストの最初のＩＰアドレスを返します。
ｓｅｒｖｅｒ＿ａｄｄｒｅｓｓ：（出力）ホストエントリを送ったＤＮＳサーバのＩＰアドレスである。
ｎａｍｅ［ＭＡＸＤＮＡＭＥ］：（出力）ホストの正式なドメイン名です。ドメイン名はｎｕｌｌ文字で終わります。
ｎ＿ａｄｄｒｅｓｓ　　：（出力）ホスト用のＩＰアドレスの個数です。
ｎ＿ａｌｉａｓ：（出力）ホスト用のドメイン名のエイリアスの個数です。
【０３６９】
４．６　ホストのＩＰアドレスを取得する
ホストの最初に登録したＩＰアドレスだけを取得したい場合は、「４．５　ホストエントリを取得する」を参照してください。ホストに登録した他のＩＰアドレスを取得したい場合は、この章で説明している操作を別途実行してください。ホストの別ＩＰアドレスの１つを取得するには、オブジェクトはＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｄｄｒｅｓｓＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。ただし、この操作をする前に、「４．５　ホストエントリを取得する」に従い、ホストエントリを取得しておく必要が有ります。以下に、ＤＮＥｎｄｐｏｉｎｔＧｅｔＡｄｄｒｅｓｓＭｓｇの仮引数を示す。
ｉｎｄｅｘ：（入力）取得したいＩＰアドレスのインデックスです。このインデックスは、前にホストエントリを受信したときに返したｎ＿ａｄｄｒｅｓｓより小さな値でなければなりません。０を与えると、ホストエントリリストで最初のＩＰアドレスを返します。
ａｄｄｒｅｓｓ：（出力）ホストエントリでｉｎｄｅｘの位置にあるＩＰアドレスである。
【０３７０】
４．７　ホストのドメイン名のエイリアスを取得する
ホストの正式なドメイン名だけを取得したい場合は、「４．５　ホストエントリを取得する」を参照してください。ホストのドメイン名のエイリアスを取得したい場合は、この章で説明している操作を別途行ってください。ホストのドメイン名の、エイリアスの１つを取得するには、オブジェクトはＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。ただし、この操作をする前に、「４．５　ホストエントリを取得する」に従い、ホストエントリを取得しておく必要が有ります。以下に、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇの仮引数を示す。
ｉｎｄｅｘ：（入力）取得したいドメイン名のエイリアスのインデックスです。このインデックスは、その前にホストエントリを受け取ったときに返したｎ＿ａｌｉａｓより小さい値でなければなりません。０を与えると、ホストの公式なドメイン名を返します。
ｎａｍｅ［ＭＡＸＤＮＡＭＥ］：（出力）ホストエントリでｉｎｄｅｘの位置のドメイン名のエイリアスです。
【０３７１】
４．８　エンドポイントをクローズする
ＤＮＳエンドポイントをクローズするには、オブジェクトは、ＤＮＳＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。このメッセージは仮引数を持っていません。このメッセージを送った後は、オブジェクトはデータの送受信はできません。
【０３７２】
４．９　ＤＮＳクライアントの例
ＤＮＳクライアントの例は、ＤＮＳメッセージをどのように使用するかを示しています。ＤＮＳクライアントは、ＩＰスタックのＤＮＳサービスに対してエンドポイントをオープンし、ドメイン名やＩＰアドレスを検索するのに使用します。
【０３７３】
変数の定義
変数を以下のように定義する。
2004001148.tif 000070
【０３７４】
エントリポイントの定義
ｓｔｕｂ．ｃｆｇには、以下の記述が必要です。エントリポイントの定義方法の詳細は「プログラマーズガイドの２．３　スタブ」のＥｘｔｒａ　ｅｎｔｒｙを参照してください。
Ｅｘｔｒａ　：　Ｉｎｉｔｉａｌｉｚｅ（）
【０３７５】
2004001148.tif 000071
【０３７６】
エンドポイントのオープンとクローズ
Ｏｐｅｎ（）は、ＤＮＳエンドポイントを作成します。　そのエンドポイントを使用してＩＰスタックのＤＮＳサービスと通信します。
2004001148.tif 000072
【０３７７】
ＤＮＳ機能を設定する
ＳｅｔＳｅｒｖｅｒｓ（）関数により、ＤＮＳプライマリーとＤＮＳセコンダリーサーバ、ローカルドメイン名を設定します。
2004001148.tif 000073
【０３７８】
2004001148.tif 000074
【０３７９】
2004001148.tif 000075
【０３８０】
第５章ＩＰガイド
この章では、ＯＰＥＮ−Ｒ上のＩＰプロトコルを紹介し、ＩＰｖ４プロトコルスタックが提供するＩＰサービスをオブジェクトがどのように使用できるかを説明します。
５．１　ＩＰの紹介
ＩＰｖ４プロトコルスタックでは、インターネットプロトコル層（ＩＰ）がネットワークを経由してパケットを送信する役割をします。通常は、オブジェクトはＩＰとは直接通信せずに、ＩＰ上のＴＣＰまたはＵＤＰのような層に対してコネクションをオープンします。しかし、オブジェクトのなかにはＩＰ層を直接使用する必要があるものもあります。例えば、ＩＰＳｔａｃｋのプログラムを変更せずに新規のプロトコルを追加しようとする場合は、ＩＰ層と直接通信するオブジェクトとしてプロトコルを記述することができます。
【０３８１】
・ＩＰネットワーク操作
ＯＰＥＮ−Ｒでは、ＩＰｖ４プロトコルスタックは、オブジェクトに以下のようなＩＰ操作を提供します。
Ｂｉｎｄ：ＩＰエンドポイントを特定のプロトコルにバインドします。オブジェクトが、エンドポイントを経由して送受信したパケットは、すべて指定されたプロトコルから発したものとして扱われます。
Ｓｅｎｄ：データを送ります。
Ｒｅｃｅｉｖｅ：データを受け取ります。
Ｃｌｏｓｅ：データの送受信を中止し、エンドポイントを削除します。
オブジェクトは、特別なメッセージをＩＰＳｔａｃｋのＩＰエンドポイントに送ることによってこれらの操作を行います。これらのメッセージはＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｅｓｓａｇｅを継承していますが、さらに後者はａｎｔＥｎｖＭｓｇを継承しています。これらのメッセージについては「第１０章　ＩＰリファレンス」を参照してください。オブジェクトがどのようにエンドポイントを作成し、ネットワークサービスを要求するかについては、「１．３　オブジェクトがプロトコルスタックと通信する方法」を参照してください。
【０３８２】
・ＩＰエンドポイントのライフサイクル
図２４は、ライフサイクル期間のＩＰエンドポイントの状態遷移を示しています。図２４のメッセージの型については、「ＩＰｖ４リファレンスガイド」で説明します。オブジェクトは、ＩＰコネクションごとにエンドポイントを必要とし、１つのエンドポイントは同様な操作を一度に１回しか実行できません。例えば、ＩＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇをデータを送信中の１つのエンドポイントに送ると、そのエンドポイントはＩＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＢＵＳＹエラーを返します。しかし、ＩＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇをこのエンドポイントに送ることは可能です。
【０３８３】
５．２　ＩＰエンドポイントを作成する
ＩＰによってデータの送受信をする前に、オブジェクトは新規のＩＰエンドポイントを作成しておく必要があります。エンドポイントを作成する手順はＩＰスタックのすべてのプロトコルについても同様です。「１．３　オブジェクトがプロトコルスタックと通信する方法」を参照してください。
【０３８４】
５．３　エンドポイントをバインドする
オブジェクトは、エンドポイントが作成された後、そのエンドポイントを特定のプロトコルにバインドする必要が有ります。エンドポイント経由でオブジェクトが送受信するすべてのパケットは、指定されたプロトコルから発したものとして扱われます。エンドポイントをバインドするには、オブジェクトはＩＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。このメッセージはｐｒｏｔｏｃｏｌと呼ばれる１つの仮引数を持っています。この仮引数はエンドポイントにバインドするプロトコルを指定します。各プロトコルは、２５６未満の整数によって識別されます。ただし、エンドポイントがプロトコルスタックにバインドされていない限り、そのエンドポイントをＴＣＰプロトコルまたはＵＤＰプロトコルにバインドすることはできません。バインドしようとすると、ＩＰ＿ＩＮＶＡＬＩＤ＿ＰＲＯＴＯＣＯＬエラーが返されます。しかし、エンドポイントをＩＣＭＰにバインドすることはできます。ＩＣＭＰは、認識するパケットをすべて通常どおりに処理しますが、識別できないパケットはバインドされたエンドポイントへすべて転送します。
【０３８５】
５．４　データを送信する
ＩＰでデータを送信するには、オブジェクトはＩＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。以下に、ＩＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇメッセージの仮引数を示す。
ｔｙｐｅ：（入力）送信されるパケットの型です。通常のＩＰパケットはＩＰ＿ＤＡＴＡ型です。その他の型はＩＣＭＰパケット用として存在します。
ｂｕｆｆｅｒ：（入力）送られるパケットへのポインタである。このパケットは、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体によって定義された共有メモリーバッファに格納する。
ｓｉｚｅ：（入力）送られるパケットのサイズで単位はバイトです。
【０３８６】
データが共有バッファから削除されて送られると、ＩＰエンドポイントはこのメッセージに返事を返します。ＩＰパケットを送信する場合は、ＩＰパケットの各欄にデータを入力して完全なパケットにしてください。ＩＰヘッダーは、図２５のようになります。Ｃ＋＋クラスのＩＰＨｅａｄｅｒは、ＩＰＰｒｏｔｏｃｏｌ．ｈで定義されています。ＩＰパケットに値を入れるには、ＩＰＨｅａｄｅｒを使用してください。このクラスがすべてのエンディアン関係の面倒を見ます。ここで、以下のフィールドは、必須項目である。
８−ｂｉｔ　ｐｒｏｔｏｃｏｌ　ｆｉｅｌｄ　［ＩＰＨｅａｄｅｒ：：ｉｐ＿ｐＳｅｔ（ｂｙｔｅ　＿ｖａｌ）］
３２−ｂｉｔ　ｓｏｕｒｃｅ　ＩＰ　ａｄｄｒｅｓｓ　［ＩＰＨｅａｄｅｒ：：ｉｐ＿ｓｒｃＳｅｔ（ｕｉｎｔ３２　＿ｖａｌ）］
３２−ｂｉｔ　ｄｅｓｔｉｎａｔｉｏｎ　ＩＰ　ａｄｄｒｅｓｓ　［ＩＰＨｅａｄｅｒ：：ｉｐ＿ｄｓｔＳｅｔ（ｕｉｎｔ３２　＿ｖａｌ）］
【０３８７】
また、以下のフィールドは、オプションである。フィールドに０を記述すると、そのフィールドは未定義として扱われて、スタックによって上書きされます。
１６−ｂｉｔ　ｔｏｔａｌ　ｌｅｎｇｔｈ　（ｉｎ　ｂｙｔｅｓ）　［ＩＰＨｅａｄｅｒ：：ｉｐ＿ｌｅｎＳｅｔ（ｕｉｎｔ１６　＿ｖａｌ）］
４−ｂｉｔ　ｈｅａｄｅｒ　ｌｅｎｇｔｈ　［ＩＰＨｅａｄｅｒ：：ｉｐ＿ｈｌＳｅｔ（ｂｙｔｅ＿ｖａｌ）］
８−ｂｉｔ　ｔｙｐｅ　ｏｆ　ｓｅｒｖｉｃｅ　［ＩＰＨｅａｄｅｒ：：ｉｐ＿ｔｏｓＳｅｔ（ｂｙｔｅ　＿ｖａｌ）］
８−ｂｉｔ　ｔｉｍｅ　ｔｏ　ｌｉｖｅ　［ＩＰＨｅａｄｅｒ：：ｉｐ＿ｔｔｌＳｅｔ（ｂｙｔｅ　＿ｖａｌ）］
ＩＰパケットがブロードキャストパケットでない場合のみ、８−ｂｉｔ　ｔｉｍｅ　ｔｏ　ｌｉｖｅフィールドは、スタックによって上書きされます。ただし、以下のフィールドには値を設定しない。ＩＰスタックによって常に上書きされます。ＩＰＨｅａｄｅｒクラスの使用例については「５．７　ＩＰ−ｐｉｎｇの例」を参照してください。
４−ｂｉｔ　ｖｅｒｓｉｏｎ
１３−ｂｉｔ　ｆｒａｇｍｅｎｔ　ｏｆｆｓｅｔ
１６−ｂｉｔ　ｉｄｅｎｆｉｆｉｃａｔｉｏｎ
１６−ｂｉｔ　ｈｅａｄｅｒ　ｃｈｅｃｋｓｕｍ
【０３８８】
５．５　データを受信する
ＩＰでデータを受け取るには、オブジェクトは、ＩＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。以下に、このメッセージの仮引数を示す。
ｔｙｐｅ：（出力）受け取ったパケットの型です。通常のＩＰパケットはＩＰ＿ＤＡＴＡ型です。他の型はＩＣＭＰパケット用として存在します。
ｂｕｆｆｅｒ：（入力）受け取るパケットを格納する領域へのポインタである。この領域は、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体によって定義された共有バッファー内であることが必要です。
ｓｉｚｅ：（入力／出力）受け取るバイトの最大値を指定します。受信が完了し、エンドポイントがオブジェクトに返事を返すと、受け取ったバイトの実数を返します。受け取るパケットが共有バッファにとって大きすぎると、そのパケットの一部だけがバッファに格納され、ＩＰ＿ＰＡＣＫＥＴＳＩＺＥエラーが返されます。
ＩＰエンドポイントは、データが共有バッファにコピーされると、このメッセージに返事を返します。
【０３８９】
５．６　エンドポイントをクローズする
ＩＰエンドポイントをクローズするには、オブジェクトは、ＩＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇをＩＰＳｔａｃｋのエンドポイントに送ります。このメッセージは仮引数を持っていません。このメッセージを送った後は、オブジェクトは、データの送受信はできません。エンドポイントは、コネクションが完全にクローズすると返事を返します。
【０３９０】
５．７　ＩＰ　ｐｉｎｇの例
このＩＰ　ｐｉｎｇの例は、ＩＰメッセージの使用方法を示しています。ＩＰ　ｐｉｎｇプログラムはＩＣＭＰパケットをネットワーク上のホストに送り返事を待ちます。
【０３９１】
2004001148.tif 000076
【０３９２】
エントリポイントの定義
ｓｔｕｂ．ｃｆｇに以下の記述が必要です。エントリポイントの定義方法の詳細は「プログラマーズガイドの２．３　スタブ」のＥｘｔｒａ　ｅｎｔｒｙを参照してください。
Ｅｘｔｒａ　：　Ｉｎｉｔｉａｌｉｚｅ（）
【０３９３】
オブジェクトの初期化
オブジェクトの初期化時に、この関数が呼ばれます。
2004001148.tif 000077
【０３９４】
エンドポイントをオープンする
Ｏｐｅｎ（）関数によって、ＩＣＭＰパケットを送受信するための共有バッファ、ＩＰエンドポイントを作成します。また、エンドポイントをＩＣＭＰプロトコルにバインドします。
2004001148.tif 000078
2004001148.tif 000079
【０３９５】
Ｃｌｏｓｅ
Ｃｌｏｓｅ（）関数によって、共有バッファをアンマップして廃棄します。また、ＩＰエンドポイントを廃棄します。
2004001148.tif 000080
【０３９６】
Ｐｉｎｇ
Ｐｉｎｇ（）は、実際のＩＣＭＰ＿ＥＣＨＯパケットを送受信します。最初に、Ｐｉｎｇ（）は共有バッファにＩＰ／ＩＣＭＰパケットを作成して、次にＩＰ／ＩＣＭＰパケットはＩＰスタックにネットワークに送られます。その後で、Ｐｉｎｇ（）はＩＣＭＰ＿ＥＣＨＯＲＥＰＬＹパケットが受信されるのを待ちます。
2004001148.tif 000081
2004001148.tif 000082
【０３９７】
第２部ＩＰｖ４リファレンスガイド
第６章　ＡＮＴ　環境リファレンス
この章では、エンドポイントや共有バッファの要求をＡＮＴ環境に対して送付するときに使用する構造体とメンバー関数について説明します。
2004001148.tif 000083
ここでは、新規のエンドポイントを要求するメッセージを定義します。オブジェクトは、新規のエンドポイントが必要なとき、ａｎｔＥｎｖＣｒｅａｔｅＥｎｄｐｏｉｎｔＭｓｇを作成し、そのエンドポイントがどのプロトコルを必要とするか、及びそのエンドポイント用に作成されるべきＳＤＵプールのサイズを指定します。以下に、ここでの仮引数を示す。
ｅｒｒｏｒ：（出力）要求に対する結果を記述したエラーを返します。
ｐｒｏｔｏｃｏｌ：（入力）作成するエンドポイントの型です。この型は、使用可能なプロトコルに対応しています。
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＴＣＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＵＤＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＴＦＴＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＤＮＳ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＰＯＰ３
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＳＭＴＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＩＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＭＩＢＩＩ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＭＩＢ＿ＥＴＨＥＲＮＥＴ
ｐｏｏｌＳｉｚｅ：（入力）新規のエンドポイント用に作成されるＳＤＵプールのサイズです。ＳＤＵプールとは、プロトコルスタックのなかにデータを格納する内部ＡＮＴ構成体です。目安として、送信したいパケットの最大のものより若干大きいＳＤＵプールをいつも作成してください。例えば、８−ＫＢのパケットには約１０−ＫＢのＳＤＵプールが必要です。
ｍｏｄｕｌｅＲｅｆ：（出力）新規のエンドポイントへの参照
【０３９８】
2004001148.tif 000084
ａｎｔＥｎｖＣｒｅａｔｅＥｎｄｐｏｉｎｔＭｓｇのインスタンスを作成します。メッセージを作成したら、ＡＮＴ環境へ送ってください。オブジェクトが応答メッセージを受け取ったしたとき、ａｎｔＥｎｖＣｒｅａｔｅＥｎｄｐｏｉｎｔＭｓｇの仮引数ｍｏｄｕｌｅＲｅｆには、新規のエンドポイントへの参照が格納されています。以下に、ここでの仮引数を示す。
ｐｒｏｔｏｃｏｌ：（入力）作成するエンドポイントの型です。この型は使用可能なプロトコルに対応しています。
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＴＣＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＵＤＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＴＦＴＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＤＮＳ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＰＯＰ３
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＳＭＴＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＩＰ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＭＩＢＩＩ
ＥｎｄｐｏｉｎｔＴｙｐｅ＿ＭＩＢ＿ＥＴＨＥＲＮＥＴ
ｐｏｏｌＳｉｚｅ：（入力）新エンドポイント用に作成するＳＤＵプールのサイズ
【０３９９】
2004001148.tif 000085
ここでは、共有メモリーバッファを要求するメッセージを定義します。オブジェクトは新たな共有メモリーバッファを要求するとき、バッファのサイズを指定するａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇを作成します。以下に、ここでの仮引数を示す。
ｅｒｒｏｒ：（出力）要求の結果を記述したエラーを返します。
ｓｉｚｅ：（入力）バイト単位の共有バッファサイズである。
ｂｕｆｆｅｒ：（出力）作成された新規のバッファへの参照を示す。
【０４００】
ａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇ：：ａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇ（）
コンストラクターを以下に示す。
ａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇ（ｕｉｎｔ３２　＿ｓｉｚｅ）；
ａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇのインスタンスを作成します。メッセージを作成後、ＡＮＴ　環境へ送ってください。オブジェクトが応答を受け取ったとき、ａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇの仮引数ｂｕｆｆｅｒが新規のバッファへの参照を返します。以下に、ここでの仮引数を示す。
ｓｉｚｅ：（入力）バイト単位の共有バッファサイズである。
【０４０１】
2004001148.tif 000086
ここでは、オブジェクトとＡＮＴ環境の間のデータ交換に使用される共有メモリーバッファを定義します。共有メモリーバッファは、共通のメモリー領域をオブジェクト及びＡＮＴ環境のアドレス空間にマップします。オブジェクトがＡＮＴ環境とデータを交換するとき、データはこの共有バッファへのポインタにより識別されます。ａｎｔＳｈａｒｅｄＢｕｆｆｅｒは、このポインタをオブジェクトとＡＮＴ環境のアドレス空間の間で変換します。共有バッファを作成するには、オブジェクトはＡＮＴ環境へバッファのサイズを指定してａｎｔＥｎｖＣｒｅａｔｅＳｈａｒｅｄＢｕｆｆｅｒＭｓｇを送ります。
【０４０２】
ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ：：Ｍａｐ（）
メンバーを以下に示す。
ａｎｔＥｒｒｏｒ　Ｍａｐ（）；
オブジェクトのアドレス空間へ共有メモリーバッファをマップします。この操作を行ってから、オブジェクトはＡＮＴ環境とデータ交換をしてください。以下に、このときの戻り値を示す。
ＡＮＴ＿ＳＵＣＣＥＳＳ：成功
ＡＮＴ＿ＦＡＩＬ：失敗
【０４０３】
ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ：：ＵｎＭａｐ（）
メンバーを以下に示す。
ａｎｔＥｒｒｏｒ　ＵｎＭａｐ（）；
オブジェクトのアドレス空間から共有メモリーバッファを削除します。共有バッファを破棄する前に、この操作を行ってください。また、このときの戻り値を以下に示す。
ＡＮＴ＿ＳＵＣＣＥＳＳ：成功
ＡＮＴ＿ＦＡＩＬ：失敗
【０４０４】
ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ：：ＧｅｔＡｄｄｒｅｓｓ（）
メンバーを以下に示す。
ｖｏｉｄ＊　ＧｅｔＡｄｄｒｅｓｓ（）；
共有メモリーバッファの基底アドレスを取得します。この操作を行う前に、オブジェクトは、バッファをそのアドレス空間にマップしている必要があります（ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ：：Ｍａｐ（）を参照）。このときの戻り値を以下に示す。
０：失敗
【０４０５】
ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ：：ＧｅｔＳｉｚｅ（）
メンバーを以下に示す。
ｕｉｎｔ３２　ＧｅｔＳｉｚｅ（）；
バイト単位で共有メモリーバッファのサイズを取得します。この操作を行う前に、オブジェクトは、バッファをそのアドレス空間にマップしている必要があります（ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ：：Ｍａｐ（）を参照）。
【０４０６】
第７章　ＴＣＰリファレンス
この章では、オブジェクトがＴＣＰサービスを要求する目的で、ＩＰＳｔａｃｋに送付するＴＣＰメッセージについて説明します。すべてのメッセージはＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。
ＴＣＰエラー
以下に、この章で説明されているメッセージが返すエラーリストを示す。エラー値は、列挙型ＴＣＰＥｎｄｐｏｉｎｔＥｒｒｏｒで定義されています。オブジェクトがネットワーク操作を要求し、ＴＣＰエンドポイントから応答を受けた際には、その要求のエラーフィールドを調べてください。（例えば、ＴＣＰＥｎｄｐｏｉｎｔＬｉｓｔｅｎＭｓｇ．ｅｒｒｏｒ）
ＴＣＰ＿ＢＵＦＦＥＲ＿ＩＮＶＡＬＩＤ：ＴＣＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇ或いはＴＣＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇで使用されたアドレスとサイズの引数は、共有バッファ内を示していません。
ＴＣＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＢＵＳＹ：コネクションがビジーで、要求した操作は未完了です。メッセージ送付先のＴＣＰエンドポイントは、すでに別の要求を処理中と考えられます。
ＴＣＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＣＬＯＳＥＤ：コネクションはクローズされました。
ＴＣＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＲＥＳＥＴ：コネクションはアボートされました。
ＴＣＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＴＩＭＥＯＵＴ：コネクションは時間切れとなりクローズされました。
ＴＣＰ＿ＦＡＩＬ：操作は失敗です（これ以上の情報はありません）。
ＴＣＰ＿ＨＯＳＴ＿ＵＮＲＥＡＣＨＡＢＬＥ：ＩＰスタックは、宛先アドレスへのルートを発見できませんでした。
ＴＣＰ＿ＭＥＳＳＡＧＥ＿ＴＯＯ＿ＬＯＮＧ：ＴＣＰ／ＩＰパケットが大きすぎて中間ルーターで処理できませんでした。
ＴＣＰ＿ＮＥＴＷＯＲＫ＿ＵＮＲＥＡＣＨＡＢＬＥ：ＩＰスタックが、宛先アドレスを含むネットワークへのルートを見つけられませんでした。
ＴＣＰ＿ＯＰＥＲＡＴＩＯＮ＿ＩＮＶＡＬＩＤ：要求した操作は、現在のエンドポイントの状態では許可されません。
ＴＣＰ＿ＯＰＥＲＡＴＩＯＮ＿ＵＮＫＮＯＷＮ：要求した操作は、ＴＣＰエンドポイントに認識されませんでした。
ＴＣＰ＿ＰＯＲＴ＿ＵＮＲＥＡＣＨＡＢＬＥ：コネクションを指定した宛先ポートでリッスンされていません。
ＴＣＰ＿ＰＲＯＴＯＣＯＬ＿ＵＮＲＥＡＣＨＡＢＬＥ：宛先ホストがＴＣＰを実装していません。
ＴＣＰ＿ＳＵＣＣＥＳＳ：操作は成功しました。
ＴＣＰ＿ＴＩＭＥ＿ＥＸＣＥＥＤＥＤ：ＩＰ組み立てキュー（ＩＰ　ｒｅａｓｓｅｍｂｌｙ　ｑｕｅｕｅ）が、時間切れになりました。
ＴＣＰ＿ＴＴＬ＿ＥＸＣＥＥＤＥＤ：宛先ホストが、発信元ホストからのＴＴＬホップを超えています（宛先ホストと発信元ホスト間のノードが多すぎます）。
【０４０７】
ＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ
以下のように定義する。
2004001148.tif 000087
ここでは、ＩＰｖ４プロトコルスタック中のどのエンドポイントがＴＣＰサービスの要求を受け取るか、また、どのオブジェクトがその要求に対する応答を受け取るかを指定します。個々のネットワークサービスの要求はＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承したメッセージで送られます（この章で後述します）。以下に仮引数を示す。
ｍｏｄｕｌｅ：（入力）ターゲットエンドポイント
ｏｐｅｒａｔｉｏｎ　　：（入力）送信側のオブジェクトが要求した操作
ｅｒｒｏｒ：（出力）ＴＣＰエラーコードについては「ＴＣＰエラー」を参照してください。
戻り値のＴＣＰエラーコードについては「ＴＣＰエラー」を参照してください。またここでは関連項目として、ＴＣＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇ、ＴＣＰＥｎｄｐｏｉｎｔＬｉｓｔｅｎＭｓｇ、ＴＣＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇ、ＴＣＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇ、ＴＣＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇがあげられる。
【０４０８】
ＴＣＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇ
以下のように定義する。
2004001148.tif 000088
ここでは、別のホストへのＴＣＰコネクションをオープンします。主として、ＴＣＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇはクライアントのオブジェクトによって発行されます。コネクションが完全に確立すると、ＴＣＰエンドポイントはこのメッセージに応答します。この応答には完全に特定されたローカル及び相手先のアドレスやポート番号が含まれています。ＴＣＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇはＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承しています。以下に、ここでの仮引数を示す。
ｍｏｄｕｌｅ：宛先モジュールへの参照である。
ｌＡｄｄｒｅｓｓ：（出力）コネクションが確立した場合は、ローカルＩＰアドレスを返します。
ｌＰｏｒｔ：（出力）コネクションが確立した場合は、クライアントのオブジェクトに割り当てられた一時的なポート番号を返します。
ｆＡｄｄｒｅｓｓ：（入力）コネクションしたいコンピューターのＩＰアドレスである。
ｆＰｏｒｔ：（入力）　コネクションしたいオブジェクトのポート番号である。
ここでの戻り値のＴＣＰエラーコードについては「ＴＣＰエラー」を参照してください。また、関連項目として、ＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇがあげられる。
【０４０９】
ＴＣＰＥｎｄｐｏｉｎｔＬｉｓｔｅｎＭｓｇ
以下のように定義する。
2004001148.tif 000089
ここでは、コネクション要求に対しリッスンを開始します。通常、ＴＣＰＥｎｄｐｏｉｎｔＬｉｓｔｅｎＭｓｇは、サーバオブジェクトによって発行されます。コネクションが完全に確立すると、ＴＣＰエンドポイントは、このメッセージに応答します。この応答には、指定されたローカル及び相手先アドレスやポート番号が含まれています。サーバのオブジェクトは、複数のリッスン操作を行うことができ、それらはすべて同一ポート番号へのコネクション要求を受け付けます。各リッスン操作に対して別々のエンドポイントが必要です。ＴＣＰＥｎｄｐｏｉｎｔＬｉｓｔｅｎＭｓｇは、ＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承しています。以下に、ここでの仮引数を示す。
ｍｏｄｕｌｅ：宛先モジュールへの参照である。
ｌＡｄｄｒｅｓｓ：（出力）コネクションが確立した場合は、ローカルＩＰアドレスを返します。
ｌＰｏｒｔ：（入力）　コネクション要求を受理するポート番号です。任意のポートへの要求も受理する場合は、ＩＰ＿ＰＯＲＴ＿ＡＮＹの値を指定してください。
ｆＡｄｄｒｅｓｓ：（出力）コネクションを要求したコンピューターのＩＰアドレスを返します。
ｆＰｏｒｔ：（出力）コネクションを要求したオブジェクトのポート番号を返します。
戻り値のＴＣＰエラーコードについては、「ＴＣＰエラー」を参照してください。またここでは、関連項目としてＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇがあげられる。
【０４１０】
ＴＣＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇ
以下に、コンストラクターを説明する。
2004001148.tif 000090
ここでは、オープンされたＴＣＰコネクション経由でデータを送信します。オブジェクトがプロトコルスタックに送信するすべてのデータは、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体により定義された共有メモリーバッファに格納してください。データが共有バッファからＩＰスタックの内部メモリーバッファにコピーさると、ＴＣＰエンドポイントはこのメッセージに応答します。ＴＣＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇはＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承しています。また、ここでの仮引数を以下に示す。
ｍｏｄｕｌｅ：宛先モジュールへの参照を示す。
ｂｕｆｆｅｒ：（入力）送信中のデータが格納されている共有バッファである。
ｓｉｚｅ：（入力）バイト単位の送信中のデータサイズである。
戻り値のＴＣＰエラーコードについては、「ＴＣＰエラー」を参照してください。またここでの関連項目として、ＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＴＣＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇ、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４１１】
ＴＣＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇ
コンストラクターを以下に示す。
2004001148.tif 000091
ここでは、オープンされたＴＣＰコネクションからデータを受信します。オブジェクトがプロトコルスタックより受信するすべてのデータは、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体により定義された共有メモリーバッファに格納されます。データが共有バッファへコピーされると、ＴＣＰエンドポイントはこのメッセージに応答します。伝送中のデータがすべて受信され、ＴＣＰコネクションがクローズされた場合は、最終の受信要求はｓｉｚｅＭｉｎの指定より少ないバイト数になる可能性があります。ＴＣＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇは、ＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承しています。以下に、ここでの仮引数を示す。
ｍｏｄｕｌｅ：宛先モジュールへの参照を示す。
ｂｕｆｆｅｒ：（入力）受信データ用の共有バッファである。
ｓｉｚｅＭｉｎ：（入出力）受信する最小バイト数を指定します。受信操作が完了しエンドポイントがオブジェクトに応答し終えると、この仮引数は受信したバイトの実際の数を返します。
ｓｉｚｅＭａｘ：（入出力）受信する最大バイト数を指定します。受信操作が完了しエンドポイントがオブジェクトに応答し終えると、この仮引数は受信したバイトの実際の数を返します。
戻り値のＴＣＰエラーコードについては「ＴＣＰエラー」を参照してください。また、関連項目として、ＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＣＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇ、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４１２】
ＴＣＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇ
以下に、コンストラクターを示す。
2004001148.tif 000092
ＴＣＰコネクションをクローズします。ＴＣＰコネクションのクローズには、以下の３つの方法があります。
・アクティブクローズ
オブジェクトが直接にクローズ要求を送信します。コネクションの相手側のオブジェクトは伝送の残りのデータを受信し、次にコネクションがクローズされたことを示すエラーを受信します。相手側のオブジェクトからみると、パッシブクローズが起こったことになります。
・パッシブクローズ
コネクションの相手側のオブジェクトからクローズ要求が送信されます。こちら側のオブジェクトが伝送データすべてを受信した後で、ＴＣＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＣＬＯＳＥＤエラーが起こります。こちらのオブジェクトはＴＣＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇをＡＮＴ環境のなかのエンドポイントに送ることでパッシブクローズを完了します。
・アボート
エラーが発生すると、コネクションが不意にクローズされます。アボートは共有バッファのすべてのデータを消去して、即座にコネクションをクローズします。
コネクションが完全にクローズされると、ＴＣＰエンドポイントはこのメッセージに応答します。　ＴＣＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇはＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承しています。
【０４１３】
以下に、ここでの仮引数を示す。
ｍｏｄｕｌｅ：宛先モジュールへの参照を示す。
ａｂｏｒｔ：（入力）ＴＲＵＥの場合は、ＴＣＰコネクションは通常のやり方で停止されるかわりにアボートされます。
戻り値のＴＣＰエラーコードについては、「ＴＣＰエラー」を参照してください。また、関連項目としてＴＣＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇがあげられる。
【０４１４】
第８章　ＵＤＰリファレンス
この章では、オブジェクトがＵＤＰサービスを要求する目的でＩＰＳｔａｃｋに送付するＵＤＰメッセージについて説明します。すべてのメッセージはＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。
ＵＤＰエラー
以下に、この章で説明されているメッセージが返すエラーリストを示す。エラー値はＵＤＰＥｎｄｐｏｉｎｔＥｒｒｏｒで定義されています。オブジェクトがネットワーク操作を要求して、ＵＤＰエンドポイントより応答を受けた際には、その要求のエラーフィールドを調べてください（例えば、ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇ．ｅｒｒｏｒ）。
ＵＤＰ＿ＡＤＤＲＥＳＳＥＲＲＯＲ：指定されたＩＰアドレスとポート番号の組み合わせは無効です。
ＵＤＰ＿ＡＤＤＲＥＳＳＩＮＵＳＥ：指定されたＩＰアドレスとポート番号の組み合わせはすでに他のコネクションで使用されています。
ＵＤＰ＿ＢＵＦＦＥＲ＿ＩＮＶＡＬＩＤ：ＴＣＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇ或いはＴＣＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇのアドレスとサイズの引数は、共有バッファ内を示していません。
ＵＤＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＢＵＳＹ：コネクションがビジーで要求した操作は未完了です。メッセージ送信先のＵＤＰエンドポイントは、すでに別の要求を処理中と考えられます。
ＵＤＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＣＬＯＳＥＤ：エンドポイントはクローズされました。
ＵＤＰ＿ＦＡＩＬ：操作失敗です（これ以上の情報はありません）。
ＵＤＰ＿ＨＯＳＴ＿ＵＮＲＥＡＣＨＡＢＬＥ：ＩＰスタックが宛先アドレスへのルートを発見できませんでした。
ＵＤＰ−ＭＥＳＳＡＧＥ＿ＴＯＯ＿ＬＯＮＧ：ＵＤＰパケットが大きすぎて中間ルーターが処理できませんでした。
ＵＤＰ＿ＮＥＴＷＯＲＫ＿ＵＮＲＥＡＣＨＡＢＬＥ：ＩＰスタックが、宛先アドレスのあるネットワークへのルートを見つけられませんでした。
ＵＤＰ＿ＯＰＥＲＡＴＩＯＮ＿ＩＮＶＡＬＩＤ：要求した操作は、現在のエンドポイントの状態では許可されません。
ＵＤＰ＿ＯＰＥＲＡＴＩＯＮ＿ＵＮＫＮＯＷＮ：要求した操作は、ＵＤＰエンドポイントに認識されませんでした。
ＵＤＰ＿ＰＯＲＴ＿ＵＮＲＥＡＣＨＡＢＬＥ：コネクションの指定先のポートでリッスンされていません。
ＵＤＰ＿ＰＲＯＴＯＣＯＬ＿ＵＮＲＥＡＣＨＡＢＬＥ：宛先ホストがＵＤＰを実装していません。
ＵＤＰ＿ＳＵＣＣＥＳＳ：操作は成功しました。
ＵＤＰ＿ＴＩＭＥ＿ＥＸＣＥＥＤＥＤ：ＩＰ組み立てキュー（ＩＰ　ｒｅａｓｓｅｍｂｌｅ　ｑｕｅｕｅ）が時間切れになりました。
ＵＤＰ＿ＴＴＬ＿ＥＸＣＥＥＤＥＤ：宛先ホストが、発信元ホストからのＴＴＬ　ホップを超えています（宛先ホストと発信元ホスト間のノードが多すぎます）。
【０４１５】
ＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ
以下のように定義する。
2004001148.tif 000093
ここでは、ＩＰｖ４プロトコルスタック中のどのエンドポイントがＵＤＰサービス要求を受け取るか、またどのオブジェクトがその要求に対する応答を受け取るかを指定します。個々のネットワークサービスの要求は、ＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承したメッセージで送られます。
【０４１６】
以下に、仮引数を示す。
ｅｒｒｏｒ：（出力）エンドポイントが返したＵＤＰＥｎｄｐｏｉｎｔＥｒｒｏｒです。エラーのリストは、上記記載を参照してください。
ｍｏｄｕｌｅ：（入力）ターゲットエンドポイントである。
ｏｐｅｒａｔｉｏｎ　　（入力）：送信側のオブジェクトが要求した操作である。
戻り値のＵＤＰエラーコードについては、「ＵＤＰエラー」を参照してください。また、関連項目として、ＵＤＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇ、ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇ、ＵＤＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇ、ＵＤＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇ、ＵＤＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇがあげられる。
【０４１７】
ＵＤＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇ
以下のように定義する。
2004001148.tif 000094
ここでは、ローカルコネクションパラメタを設定します。ローカルコネクションパラメタは、オブジェクトをＵＤＰパケットの宛先として識別します。バインド操作を行なった後は、宛先アドレス及びポートがバインドパラメタにより指定されたＩＰアドレス及びポート番号と同一の場合のみ、オブジェクトはパケットを受信します。データ送信の際には、オブジェクトが最初にコネクション操作（すべてのパケットの宛先指定）を行っていない限り、パケット毎に宛先ＩＰアドレスとポート番号を指定してください。詳しくはＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇを参照してください。ＵＤＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇは　ＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承しています。
【０４１８】
以下に、ここでの仮引数を示す。
ｍｏｄｕｌｅ：宛先モジュールへの参照を示す。
ａｄｄｒｅｓｓ：（入出力）ローカルホスト上の有効なＩＰアドレスです。ＩＰ＿ＡＤＤＲ＿ＡＮＹを指定すると、オブジェクトは、ローカルホスト上のどのＩＰアドレスに送信されたパケットでも受信します。これは、異なったアドレスで数個のインターフェイスをもつマルチホームホストにとっては有用です。ホストがマルチホームでない場合は、ローカルＩＰアドレスが返されます。マルチホームホスト上では、オブジェクトがエンドポイントをバインド後にコネクション操作を行うと、ＩＰ＿ＡＤＤＲ＿ＡＮＹが特定のＩＰアドレスに更新されます。
ｐｏｒｔ：（入出力）オブジェクトのポート番号。ＩＰ＿ＰＯＲＴ＿ＡＮＹを指定すると、一時的なポート番号がオブジェクトに割り当てられ、エンドポイントがバインドされた時点で一時的なポート番号が返されます。このポート番号は、１０２４以上となります。
戻り値のＵＤＰエラーコードについては、「ＵＤＰエラー」を参照してください。また、関連項目として、ＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇがあげられる。
【０４１９】
ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇ
以下のように定義する。
2004001148.tif 000095
ここでは、オブジェクトが送信するあらゆるパケットに、宛先ＩＰアドレスとポート番号を指定します。この操作はＵＤＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇの送付後に実行してください。一度コネクションされると、オブジェクトはパケットを送信するたびに宛先を指定する必要がなくなります。ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇはＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。
【０４２０】
以下に、ここでの仮引数を示す。
ｍｏｄｕｌｅ：宛先モジュールへの参照を示す。
ａｄｄｒｅｓｓ：（入力）パケットの送信先であるコンピューターのＩＰアドレスを指定します。
ｐｏｒｔ：（入力）パケットの送信先であるオブジェクトのポート番号を指定します。
戻り値のＵＤＰエラーコードについては、「ＵＤＰエラー」を参照してください。また、関連項目として、ＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＵＤＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇがあげられる。
【０４２１】
ＵＤＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇ
以下のように定義する。
2004001148.tif 000096
ここでは、ＵＤＰエンドポイント経由でデータを送信します。オブジェクトがプロトコルスタックに送信するデータは、すべてａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体により定義された共有メモリーバッファに格納してください。データが共有バッファからＩＰスタック内部メモリーバッファにコピーされたときに、ＵＤＰエンドポイントがこのメッセージに応答します。ＵＤＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇはＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承しています。なお、ここで、エンドポイントがバインドされているがコネクションされていない場合は、このメッセージで宛先のＩＰアドレスとポート番号を指定してください。エンドポイントがＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇによりコネクションされている場合は、この情報は必要ありません。
【０４２２】
以下に、ここでの仮引数を示す。
ｍｏｄｕｌｅ：宛先モジュールへの参照を示す。
ａｄｄｒｅｓｓ：（入力）データの宛先コンピューターのＩＰアドレスです。オブジェクトがコネクション操作を済ませている場合は、この仮引数は無視され、ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇで指定されたＩＰアドレスが使われます。
ｐｏｒｔ：（入力）データの宛先コンピューターのポート番号。オブジェクトがコネクション操作を済ませている場合は、この仮引数は無視され、ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇで指定されたポート番号が使われます。
ｂｕｆｆｅｒ：（入力）送信のデータが格納されている（共有バッファ内の）位置である。
ｓｉｚｅ：（入力）バイト単位の送信データサイズである。
戻り値のＵＤＰエラーコードについては、「ＵＤＰエラー」を参照してください。また、関連項目として、ＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇ、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４２３】
ＵＤＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇ
以下のように定義する。
2004001148.tif 000097
ここでは、ＵＤＰエンドポイントよりデータを受信します。オブジェクトがプロトコルスタックより受信するすべてのデータは、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体により定義された共有メモリーバッファに格納されます。データが共有バッファへコピーされると、ＵＤＰエンドポイントがこのメッセージに応答します。受信操作が完了すると、仮引数ｓｉｚｅが受信したバイトの実際の数を返します。受信したパケットが指定されているｓｉｚｅより大きい場合は、余剰データは削除されます。ＵＤＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇはＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承しています。
【０４２４】
以下に、ここでの仮引数を示す。
ｍｏｄｕｌｅ：宛先モジュールへの参照を示す。
ｂｕｆｆｅｒ：（入力）受信データが格納される位置（共有バッファ内）です。
ｓｉｚｅ：（入力／出力）受信する最大バイト数を指定します。受信操作が完了すると、この仮引数は受信したバイトの実際の数を返します。受信したパケットがｓｉｚｅより大きい場合は、余剰データは削除されます。
ａｄｄｒｅｓｓ：（出力）受信データの発信元ＩＰアドレスである。
ｐｏｒｔ：（出力）受信データの発信元ポートである。
戻り値のＵＤＰエラーコードについては、「ＵＤＰエラー」を参照してください。またここで、関連項目として、ＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＵＤＰＥｎｄｐｏｉｎｔＣｏｎｎｅｃｔＭｓｇ、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４２５】
ＵＤＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇ
以下のように定義する。
2004001148.tif 000098
ここでは、ＵＤＰエンドポイントをクローズします。このメッセージ送付後は、オブジェクトはデータの送受信ができません。コネクションが完全にクローズされると、エンドポイントが応答します。ＵＤＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇはＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇより継承したものです。
【０４２６】
以下に、ここでの仮引数を示す。
ｍｏｄｕｌｅ：宛先モジュールへの参照を示す。
戻り値のＵＤＰエラーコードに関する記述は、「ＵＤＰエラー」を参照してください。また、関連項目として、ＵＤＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇがあげられる。
【０４２７】
第９章　ＤＮＳリファレンス
本章では、オブジェクトがＤＮＳサービスを要求するとき、ＩＰＳｔａｃｋに送付するＤＮＳメッセージについて説明します。メッセージはすべてＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。
ＤＮＳエラー
以下に、この章で説明されているメッセージが返すエラーリストを示す。エラー値は、列挙型ＤＮＳＥｎｄｐｏｉｎｔＥｒｒｏｒで定義されます。オブジェクトがネットワーク操作を要求し、ＤＮＳエンドポイントから応答を受けた際には、その要求のエラーフィールドを調べて下さい（例えば、ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＳＥｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇ．ｅｒｒｏｒ）。
ＤＮＳ＿ＢＵＦＦＥＲ＿ＩＮＶＡＬＩＤ：共有バッファの無効使用
ＤＮＳ＿ＣＯＮＮＥＣＴＩＯＮ＿ＢＵＳＹ：コネクションがビジーで、要求した操作は未完了です。メッセージの送付先であるＤＮＳエンドポイントはすでに別の要求を処理している可能性があります。
ＤＮＳ＿ＣＯＮＮＥＣＴＩＯＮ＿ＣＬＯＳＥＤ：コネクションがクローズされました。
ＤＮＳ＿ＦＡＩＬ：操作は失敗しました（これ以上の情報はありません）。
ＤＮＳ＿ＨＯＳＴ＿ＮＯＴ＿ＦＯＵＮＤ：指定されたホスト名ではバインド情報がありません。
ＤＮＳ＿ＩＮＤＥＸ＿ＩＮＶＡＬＩＤ：指定されたインデックスは存在しません。
ＤＮＳ＿ＮＯ＿ＤＡＴＡ：要求された型に相当するデータレコードは存在しません。
ＤＮＳ＿ＮＯ＿ＲＥＣＯＶＥＲＹ：回復不能のエラーが発生しました。
ＤＮＳ＿ＯＰＥＲＡＴＩＯＮ＿ＩＮＶＡＬＩＤ：現在の状態では、要求された操作は許可されません。
ＤＮＳ＿ＯＰＥＲＡＴＩＯＮ＿ＵＮＫＮＯＷＮ：要求された操作は、ＤＮＳエンドポイントによって認識されませんでした。
ＤＮＳ＿ＳＵＣＣＥＳＳ：操作は成功しました。
ＤＮＳ＿ＴＲＹ＿ＡＧＡＩＮ：要求されたホストは見つかりませんでした。もしくはサーバの要求は失敗しました。
【０４２８】
ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ
以下のように定義する。
2004001148.tif 000099
ここでは、ＤＮＳネットワーク操作のあらゆる要求に対して基本メッセージを定義します。個々のネットワークサービスに対する要求は、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承したメッセージで送られます。本章で後述します。以下に、仮引数を示す。
ｅｒｒｏｒ：（出力）操作の結果を返します。
【０４２９】
また、関連項目として、ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇ、　ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＡｄｄｒＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｄｄｒｅｓｓＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇがあげられる。
【０４３０】
ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇ
以下のように定義する。
2004001148.tif 000100
ここでは、オブジェクトがドメイン名とＩＰアドレスの解決を行なうために使用する、ＤＮＳサーバのリストを登録します。このリストはＤＮＳサーバをＩＰアドレスで指定します。リスト登録後は、検索はリスト順にサーバに送信されます。ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇはＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ．から継承しています。以下に、ここでの仮引数を示す。
ｎｓｃｏｕｎｔ：（入力）登録するＩＰアドレスの数である。
ａｄｄｒＬｉｓｔ［ＭＡＸＮＳ］：（入力）登録するＩＰアドレスのリストである。
戻り値のＤＮＳエラーコードについては、「ＤＮＳエラー」を参照してください。また、関連項目として、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇ、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４３１】
ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇ
以下のように定義する。
2004001148.tif 000101
ここでは、オブジェクトがドメイン名とＩＰアドレスの解決を行なうために使用する、ＤＮＳサーバのリストを取得します。このリストはＤＮＳサーバをＩＰアドレスで示します。アドレスは事前にＤＮＳＥｎｄｐｏｉｎｔＳｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇで設定しておく必要が有ります。ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇは、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。以下に、ここでの仮引数を示す。
ｎｓｃｏｕｎｔ：（出力）登録されているＩＰアドレスの数である。
ａｄｄｒＬｉｓｔ［ＭＡＸＮＳ］：（出力）ＩＰアドレスのリストである。
戻り値のＤＮＳエラーコードについては、「ＤＮＳエラー」を参照してください。また、関連項目として、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＳｅｒｖｅｒＡｄｄｒｅｓｓｅｓＭｓｇ、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４３２】
ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇ
以下のように定義する。
2004001148.tif 000102
ここで、オブジェクト用に、デフォルトドメイン名を設定します。デフォルトドメイン名の登録後は、完全指定されていないホスト名にはすべてこのドメイン名が自動的に付加されます。ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇはＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。以下に、ここでの仮引数を示す。
ｎａｍｅ［ＭＡＸＤＮＡＭＥ］：（入力）デフォルトのドメイン名です。ドメイン名は、ｎｕｌｌで終わらせてください。
戻り値のＤＮＳエラーコードについては、「ＤＮＳエラー」を参照してください。また、関連項目として、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇ、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４３３】
ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇ
以下のように定義する。
2004001148.tif 000103
ここで、オブジェクトに対するデフォルトドメイン名を取得します。ドメイン名は、あらかじめＤＮＳＥｎｄｐｏｉｎｔＳｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇで設定してください。ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇはＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。以下に、ここでの仮引数を示す。
ｎａｍｅ［ＭＡＸＤＮＡＭＥ］：（出力）デフォルトドメイン名です。ドメイン名は、ｎｕｌｌで終わっています。
戻り値のＤＮＳエラーコードについては、「ＤＮＳエラー」を参照してください。また、関連項目として、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＳｅｔＤｅｆａｕｌｔＤｏｍａｉｎＮａｍｅＭｓｇ、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４３４】
ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇ
以下のように定義する。
2004001148.tif 000104
ここでは、ドメイン名で指定されたホストのＩＰアドレスと、ドメイン名エイリアスとのリストを取得します。ホストエントリと呼ばれるこのリストには、ホストエントリを返したＤＮＳサーバのアドレス、リスト内の最初のＩＰアドレス（公式アドレス）、そしてそのホストに対するＩＰアドレスの総数、リスト内の最初のドメイン名（公式ドメイン名）、そしてそのホストに対するドメイン名エイリアスの総数が含まれている。異なるＩＰアドレスまたはドメイン名エイリアスの１つを取得したい場合には、それらを個別に要求してください。詳細は、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｄｄｒｅｓｓＭｓｇ及びＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇを参照してください。ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇはＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。以下に、ここでの仮引数を示す。
ｎａｍｅ［ＭＡＸＤＮＡＭＥ］：（入力／出力）エントリを取得したいホストのドメイン名です。ドメイン名は、ｎｕｌｌで終わらせてください。ドメイン名エイリアスを指定した場合は、ホストの公式ドメイン名を返します。
ｓｅｒｖｅｒ＿ａｄｄｒｅｓｓ：（出力）ホストエントリを送信したＤＮＳサーバのＩＰアドレスである。
ｈｏｓｔ＿ａｄｄｒｅｓｓ：（出力）ホストのＩＰアドレスです。ホストが１つ以上のＩＰアドレスを使用している場合（マルチホーム）は、最初のＩＰアドレスを返します。
ｎ＿ａｄｄｒｅｓｓ：（出力）ホストのＩＰアドレスの個数である。
ｎ＿ａｌｉａｓ：（出力）ホストのドメイン名エイリアスの個数である。
戻り値のＤＮＳエラーコードについては、「ＤＮＳエラー」を参照してください。またここで、関連項目としてＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＡｄｄｒＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｄｄｒｅｓｓＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇ、　ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４３５】
ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＡｄｄｒＭｓｇ
以下のように定義する。
2004001148.tif 000105
ここでは、ＩＰアドレスで指定したホストに対する、ＩＰアドレスとドメイン名エイリアスとのリストを取得します。ホストエントリと呼ばれるこのリストには、そのホストエントリを返したＤＮＳサーバのアドレス、リスト内の最初のＩＰアドレス（公式アドレス）とそのホストに対するＩＰアドレスの総数、リスト内の最初のドメイン名（公式ドメイン名）とそのホストに対するドメイン名エイリアスの総数が含まれている。異なるＩＰアドレス、またはドメイン名エイリアスの１つを取得したい場合には、それらを個別に要求してください。詳細に関しては、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｄｄｒｅｓｓＭｓｇとＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇを参照してください。ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＡｄｄｒＭｓｇは、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。以下に、ここでの仮引数を示す。
ｈｏｓｔ＿ａｄｄｒｅｓｓ：（入力／出力）ホストのＩＰアドレスです。元のメッセージの異なるＩＰアドレスを指定しても、ホストの最初のＩＰアドレスを返します。
ｓｅｒｖｅｒ＿ａｄｄｒｅｓｓ：（出力）ホストエントリを送信したＤＮＳサーバのＩＰアドレスである。
ｎａｍｅ［ＭＡＸＤＮＡＭＥ］：（出力）ホストの公式ドメイン名です。ドメイン名はｎｕｌｌで終わります。
ｎ＿ａｄｄｒｅｓｓ：（出力）そのホストに対するＩＰアドレスの個数である。
ｎ＿ａｌｉａｓ：（出力）そのホストに対するドメイン名エイリアスの個数である。
戻り値のＤＮＳエラーコードについては、「ＤＮＳエラー」を参照してください。また、関連項目として、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｄｄｒｅｓｓＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇ、　ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４３６】
ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｄｄｒｅｓｓＭｓｇ
以下のように定義する。
2004001148.tif 000106
ここでは、指定したホストに対する登録ＩＰアドレスの１つを取得します。ただし、この操作を行う前にホストエントリを取得する必要がある。詳細に関しては、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇまたはＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＡｄｄｒＭｓｇを参照してください。ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｄｄｒｅｓｓＭｓｇは、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。以下に、ここでの仮引数を示す。
ｉｎｄｅｘ：（入力）取得したいＩＰアドレスのインデックスです。このインデックスは、以前にそのホストエントリを受け取ったときにＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇまたはＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＡｄｅｒＭｓｇで返されたｎ−ａｄｄｒｅｓｓよりも小さい値でなければなりません。０を与えると、ホストエントリリストの最初のＩＰアドレスが返ります。
ａｄｄｒｅｓｓ：（出力）ホストエントリで、ｉｎｄｅｘの位置のＩＰアドレスである。
戻り値のＤＮＳエラーコードについては、「ＤＮＳエラー」を参照してください。また、関連項目として、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＡｄｄｒＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇ、　ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４３７】
ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇ
以下のように定義する。
2004001148.tif 000107
ここでは、指定したホストに対するドメイン名のエイリアスの１つを取得します。ただし、この操作を行う前に、ホストエントリを取得してください。詳細に関しては、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇまたはＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＡｄｄｒＭｓｇを参照してください。ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇは、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。以下に、ここでの仮引数を示す。
ｉｎｄｅｘ：（入力）取得したいドメイン名エイリアスのインデックスです。以前にそのホストエントリを受け取ったときにＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇまたはＤＮＳＥｎｄｐｏｉｎｔＢｙＡｄｄｒＭｓｇで返されたｎ−ａｌｉａｓよりも小さい値でなければなりません。０を与えると、ホストの公式ドメイン名を返します。
ｎａｍｅ［ＭＡＸＤＮＡＭＥ］：（出力）ホストエントリで、ｉｎｄｅｘの位置におけるドメイン名エイリアスである。
戻り値のＤＮＳエラーコードについては、「ＤＮＳエラー」を参照してください。関連項目としては、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＮａｍｅＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＨｏｓｔＢｙＡｄｄｒＭｓｇ、ＤＮＳＥｎｄｐｏｉｎｔＧｅｔＡｌｉａｓＭｓｇ、　ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４３８】
ＤＮＳＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇ
以下のように定義する。
ＤＮＳＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇ（）；
ここでは、ＤＮＳエンドポイントをクローズします。このメッセージの送付後は、オブジェクトはデータの送受信を行なえません。コネクションが完全にクローズしたとき、エンドポイントが返事を返します。ＤＮＳＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇはＢａｓｅＭｓｇから継承しています。戻り値のＤＮＳエラーコードについては、「ＤＮＳエラー」を参照してください。関連項目としては、ＤＮＳＥｎｄｐｏｉｎｔＢａｓｅＭｓｇがあげられる。
【０４３９】
第１０章　ＩＰリファレンス
オブジェクトがＩＰＳｔａｃｋに送付するＩＰメッセージについて説明します。このメッセージは、ネットワークサービスを要求するときに使用されます。メッセージは、すべてＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ．から継承しています。
ＩＰエラー
以下に、本章のメッセージが返すエラーリストを示す。エラー値は、ＩＰＥｎｄｐｏｉｎｔＥｒｒｏｒ列挙型で定義されています。オブジェクトがネットワーク操作を要求し、そのＩＰエンドポイントから応答を受けた際には、要求のエラーフィールドを調べてください（例えば、ＩＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇ．ｅｒｒｏｒ）。
ＩＰ＿ＢＵＦＦＥＲ＿ＩＮＶＡＬＩＤ：共有バッファの無効使用です。
ＩＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＢＵＳＹ：コネクションがビジーで、要求した操作は未完了です。メッセージの送信先であるＩＰエンドポイントはすでに別の要求を処理している可能性があります。
ＩＰ＿ＣＯＮＮＥＣＴＩＯＮ＿ＣＬＯＳＥＤ：コネクションがクローズされました。
ＩＰ＿ＦＡＩＬ：操作は失敗しました（これ以上の情報はありません）。
ＩＰ＿ＩＮＶＡＬＩＤ＿ＰＲＯＴＯＣＯＬ：指定したプロトコル識別子は有効ではありません。
ＩＰ＿ＯＰＥＲＡＴＩＯＮ＿ＩＮＶＡＬＩＤ：現在の状況では要求した操作は許可されません。
ＩＰ＿ＯＰＥＲＡＴＩＯＮ＿ＵＮＫＮＯＷＮ：要求した操作は、ＩＰエンドポイントによって認識されませんでした。
ＩＰ＿ＰＡＣＫＥＴＳＩＺＥ：指定したパケットサイズは正しくありません。
ＩＰ＿ＳＵＣＣＥＳＳ：操作は成功しました。
【０４４０】
ＩＰパケットタイプ
ＩＰエンドポイントは、以下に記載するように種々のパケットを送受信することが可能です。ただし、通常のＩＰパケットはＩＰ＿ＤＡＴＡ型です。これ以外の型はＩＣＭＰパケットに対するものです。
ＩＰ＿ＤＡＴＡ：通常のＩＰデータ
ＩＰ＿ＨＯＳＴ＿ＵＮＲＥＡＣＨＡＢＬＥ：（ＩＣＭＰパケット）ホストに到達できません。
ＩＰ＿ＭＥＳＳＡＧＥ＿ＴＯＯ＿ＬＯＮＧ：（ＩＣＭＰパケット）メッセージが長すぎるか、或いは伝送中にいずれかの地点で分割に失敗しました。
ＩＰ＿ＮＥＴＷＯＲＫ＿ＵＮＲＥＡＣＨＡＢＬＥ：（ＩＣＭＰパケット）ネットワークに到達できません。
ＩＰ＿ＰＯＲＴ＿ＵＮＲＥＡＣＨＡＢＬＥ：（ＩＣＭＰパケット）要求したポートに到達できませんでした。
ＩＰ＿ＰＲＯＴＯＣＯＬ＿ＵＮＲＥＡＣＨＡＢＬＥ：（ＩＣＭＰパケット）要求したプロトコルはターゲットホスト上にありませんでした。
ＩＰ＿ＴＩＭＥ＿ＥＸＣＥＥＤＥＤ：（ＩＣＭＰパケット）パケット組み立てがタイムアウトとなりました。
ＩＰ＿ＴＴＬ＿ＥＸＣＥＥＤＥＤ：（ＩＣＭＰパケット）パケットのＴＴＬが、伝送中に期限切れとなりました。
【０４４１】
ＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ
メンバーは、以下である。
2004001148.tif 000108
ここでは、すべてのＩＰネットワーク操作の要求に対して、基本メッセージを定義します。個々のネットワークサービスに対する要求は、ＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承したメッセージで送られます。本章で後述します。以下に、仮引数を示す。
ｅｒｒｏｒ：（出力）操作の結果を返します。
戻り値のＩＰエラーコードの説明に関しては、「ＩＰエラー」を参照してください。関連項目としては、ＩＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇ、ＩＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇ、ＩＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇ、ＩＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇがあげられる。
【０４４２】
ＩＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇ
メンバーは、以下である。
2004001148.tif 000109
ここでは、エンドポイントを特定のプロトコルにバインドします。このエンドポイントを経由してオブジェクトが送受信するパケットは、すべて指定のプロトコルから発するものとして扱われます。プロトコルがバインドされてＩＰパケットを送受信できるようになると、エンドポイントはこのメッセージに応答します。ＩＰＥｎｄｐｏｉｎｔＢｉｎｄＭｓｇはＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ．から継承しています。ただし、ＴＣＰプロトコルまたはＵＤＰプロトコルは、プロトコルスタック内ですでにバインド済みなので、エンドポイントをこれらのプロトコルにバインドすることはできません。バインドを試みても、エラーＩＰ＿ＩＮＶＡＬＩＤ＿ＰＲＯＴＯＣＯＬが返ります。エンドポイントをＩＣＭＰにバインドすることはできます。ＩＣＭＰは認識したパケットを通常通りすべて処理します。しかし、認識しなかったパケットはすべてバインド済みのエンドポイントに転送します。以下に、仮引数を示す。
ｐｒｏｔｏｃｏｌ：（入力）エンドポイントにバインドするプロトコルです。各プロトコルは２５６未満の整数によって識別されます。
戻り値のＩＰエラーコードについては、「ＩＰエラー」を参照してください。関連項目としては、ＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇがあげられる。
【０４４３】
ＩＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇ
メンバーは、以下である。
2004001148.tif 000110
ここでは、ＩＰパケットを送信します。オブジェクトがプロトコルスタックに送信するデータは、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体で定義された共有メモリーバッファ内に格納してください。データが共有バッファからＩＰＳｔａｃｋ内部メモリーバッファにコピーされると、ＩＰエンドポイントはメッセージに応答します。ＩＰＥｎｄｐｏｉｎｔＳｅｎｄＭｓｇはＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ．から継承しています。以下に、ここでの仮引数を示す。
ｔｙｐｅ：（入力）送信するパケットのタイプ通常のＩＰパケットは、ＩＰ＿ＤＡＴＡタイプである。
ｂｕｆｆｅｒ：（入力）送信するパケットが格納されている位置（共有バッファ内）である。
ｓｉｚｅ：（入力）送信するパケットのサイズで、単位はバイトです。
戻り値のＩＰエラーコードについては、「ＩＰエラー」を参照してください。関連項目としては、ＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４４４】
ＩＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇ
メンバーは、以下である。
2004001148.tif 000111
ここでは、ＩＰパケットを受信します。オブジェクトがプロトコルスタックから受信するデータはａｎｔＳｈａｒｅｄＢｕｆｆｅｒ構造体によって定義された共有メモリーバッファ内に格納されます。データの共有バッファへのコピーが完了すると、ＩＰエンドポイントはメッセージに応答します。Ｓｉｚｅ仮引数は、受信した実際のバイト数を返します。受信したパケットが共有バッファより大きい場合はパケットの一部だけがバッファ内に格納され、ＩＰ＿ＰＡＣＫＥＴＳＩＺＥエラーが返ります。ＩＰＥｎｄｐｏｉｎｔＲｅｃｅｉｖｅＭｓｇはＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ．から継承しています。以下に、ここでの仮引数を示す。
ｔｙｐｅ：（出力）受信したパケットの型です。通常のＩＰパケットはＩＰ＿ＤＡＴＡ型です。
ｂｕｆｆｅｒ：（入力）受信したパケットを格納されている位置（共有バッファ内）である。
ｓｉｚｅ：（入力／出力）受信する最大バイト数を指定します。受信操作が完了し、エンドポイントがオブジェクトに応答すると、仮引数は実際に受信したバイト数を返します。受信したパケットが共有バッファより大きい場合は、パケットの一部だけがバッファ内に格納され、ＩＰ＿ＰＡＣＫＥＴＳＩＺＥエラーが返ります。
戻り値のＩＰエラーコードについては、「ＩＰエラー」を参照してください。関連項目としては、ＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇ、ａｎｔＳｈａｒｅｄＢｕｆｆｅｒがあげられる。
【０４４５】
ＩＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇ
メンバーは、以下である。
ＩＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇ（）；
ここでは、ＩＰコネクションをクローズします。このメッセージを送った後は、オブジェクトはデータの送受信を行うことができません。コネクションが完全にクローズすると、エンドポイントは応答します。ＩＰＥｎｄｐｏｉｎｔＣｌｏｓｅＭｓｇはＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇから継承しています。
戻り値のＩＰエラーコードについては、「ＩＰエラー」を参照してください。関連項目としては、ＩＰＥｎｄｐｏｉｎｔＢａｓｅＭｓｇがあげられる。
【０４４６】
なお、以上のインターネットプロトコルに関する記載において、「ＡＮＴ環境」とは、オブジェクトにネットワークサービスを提供するＯＰＥＮ−Ｒシステム層のオブジェクトを示す。ＡＮＴ環境は、通常のメッセージパッシングを使用してオブジェクトと通信を行います。ＡＮＴ環境は、デバイスドライバーとも直接通信を行います。このデバイスドライバーは、物理ネットワーク上でデータ交換を行います。また、「ｄａｔａｇｒａｍ」とは、ＵＤＰプロトコルで、パケットに相当する。「ＤＮＳ」とは、ＩＰｖ４プロトコルスタックで、ＵＤＰレイヤーの上位で動作するプロトコルです。インターネットのドメイン名とＩＰアドレスの設定、取得、変換のサービスを提供します。また、「エンドポイント」とは、オブジェクトがメッセージパッシングでＡＮＴ環境と通信するためのものです。エンドポイントはプロトコルスタックの最上位に位置しています。オブジェクトは、オープンしたネットワークコネクション１つに対して１つのエンドポイントを持ちます。オブジェクトが新ネットワークコネクションを要求すると、エンドポイントは動的に作成されます。オブジェクトは新エンドポイントに対する要求をエンドポイントファクトリーに送付し、エンドポイントファクトリーがエンドポイントを作成します。
【０４４７】
また、「Ｉｎｔｅｒｎｅｔ　Ｐｒｏｔｏｃｏｌ（ＩＰ）」とは、ネットワーク越しにパケットを伝送する役割のネットワークプロトコルです。ＩＰｖ４プロトコルスタックで、ＩＰは最下層です。通常、オブジェクトはＩＰと直接通信しません。代わりに、オブジェクトはＴＣＰやＵＤＰといったＩＰの上位の層とのコネクションをオープンします。ただし、オブジェクトによっては直接ＩＰ層を使用することもできます。例えば、ＡＮＴ環境内のプログラミングを行うことなく新規のプロトコルを追加したい場合は、ＩＰ層と直接通信するオブジェクトとしてプロトコルを記述できます。Ｉｎｔｅｒｎｅｔ　Ｐｒｏｔｏｃｏｌ　ｖｅｒｓｉｏｎ　４（ＩＰｖ４）　Ｐｒｏｔｏｃｏｌ　ｓｔａｃｋでは、ＡＮＴ環境内のプロトコルスタックで、ＴＣＰ、ＵＤＰ、ＤＮＳ、ＩＰのネットワークプロトコルを提供します。
また、「ＳＤＵ（サービスデータユニット）」は、ＡＮＴ環境内の基本データコンテナーです。ＳＤＵは、ＳＤＵプール内の一連のデータセルに対するポインタです。ＳＤＵはネットワークへ送信されつつあるデータを収容しています。これはＯＳＩ標準では、プロトコルデータユニット（ＰＤＵ）と呼ばれています。「ＳＤＵプール」は、ＡＮＴ環境内のメモリーバッファで、プロトコルスタックによって処理されるデータを格納します。ＡＮＴ環境は、ＳＤＵプール内にサービスデータユニット（ＳＤＵ）を割り当てます。
【０４４８】
＜インストールガイド＞
第１章　　導入
１．１　準備
以上説明したＯＰＥＮ−Ｒ　ＳＤＫは、Ｗｉｎｄｏｗｓ２０００，Ｐｒｏｆｅｓｓｉｏｎａｌ／ＸＰ（何れも登録商標）のプラットホームで動作する。なお、ＯＰＥＮ−Ｒ　ＳＤＫはＷｉｎｄｏｗｓ環境以外の他のオペレーティングシステム上でも動作するが、そのためには、ｓｈ、ｃｐなどの標準Ｕｎｉｘコマンド、ｐｅｒｌ、ＧＮＵ　ｍａｋｅ、ＧＮＵ　ｂｉｎｕｔｉｌｓ、ｇｃｃ、ｎｅｗｌｉｂなどのｍｉｐｓクロス開発環境が必要となる。これらのツールは、通常のＵｎｉｘ環境と互換性があります。Ｗｉｎｄｏｗｓ上のＣｙｇｗｉｎで動作するこれらのｍｉｐｓクロス開発環境のバイナリーは、ＯＰＥＮ−Ｒ　ＳＤＫのｗｅｂサイトからダウンロードできます。これらのツールを他のＵｎｉｘ環境で動作させる場合は、「２．２　ｇｃｃ　」を参照してください。Ｗｉｎｄｏｗｓ環境以外では、ソースコードからバイナリーツールを自動的に生成するシェルスクリプトを提供しています。このスクリプトやＯＰＥＮ−Ｒ　ＳＤＫが、Ｌｉｎｕｘ上で正常動作することを確認済みです。
【０４４９】
また、ＯＰＥＮ−Ｒ　ＳＤＫを使用してソフト開発するためには、以下のハードウェアが必要である。ＣＰＵ：Ｐｅｎｔｉｕｍ　２３３ＭＨｚ以上、メモリ：６４ＭＢ以上、ハードディスク：２００ＭＢ以上の空き容量、メモリスティックリーダーライター：ＰＣに内蔵または外付け、ＡＩＢＯ　ＥＲＳ−２１０、ＥＲＳ−２２０、ＥＲＳ−２１０Ａ、ＥＲＳ−２２０Ａの何れか。また、無線ＬＡＮ環境として、ＰＣ側には、（ａ）ＩＥＥＥ８０２．１１ｂ準拠の無線ＬＡＮカード、（ｂ）有線ＬＡＮカードとＩＥＥＥ８０２．１１ｂ準拠のアクセスポイントの何れかを必要とする。また、ＡＩＢＯ側には、ＡＩＢＯワイヤレスＬＡＮカード（ＥＲＡ−２０１Ｄ１）及びＡＩＢＯプログラミングメモリスティックが必要である。なお、本ＯＰＥＮ−Ｒ　ＳＤＫを使用したソフト開発では、ＡＩＢＯプログラミングメモリスティック以外のメモリスティックは使用できないようになっている。
【０４５０】
１．２　ダウンロード
以下は、ダウンロードファイルのリストである。
・ＯＰＥＮ−Ｒ　ＳＤＫ
例えば、ＯＰＥＮ−Ｒ　ＳＤＫ本体（ＯＰＥＮ＿Ｒ＿ＳＤＫ−１．１．３−ｒ１．ｔａｒ．ｇｚ）、サンプルプログラム（ＯＰＥＮ＿Ｒ＿ＳＤＫ−ｓａｍｐｌｅ−１．１．３−ｒ１．ｔａｒ．ｇｚ）、日本語マニュアル（ＯＰＥＮ＿Ｒ＿ＳＤＫ−ｄｏｃＪ−１．１．３−ｒ１．ｔａｒ．ｇｚ）、英語マニュアル（ＯＰＥＮ＿Ｒ＿ＳＤＫ−ｄｏｃＥ−１．１．３−ｒ１．ｔａｒ．ｇｚ）に分けられて、インターネットによりダウンロードできるようになっている。
・Ｗｉｎｄｏｗｓ環境での開発ツール
また、この他にＷｉｎｄｏｗｓ環境での開発ツールとして、Ｃｙｇｗｉｎ（ｃｙｇｗｉｎ−ｐａｃｋａｇｅｓ−１．３．１０−ｂｉｎ．ｅｘｅ）、ＭＩＰＳクロス開発環境のツール（ｍｉｐｓｅｌ−ｄｅｖｔｏｏｌｓ−３．０．４−ｂｉｎ−ｒ１．ｔａｒ．ｇｚ）を必要とする。
・ＥＲＳ−２１０ユーザー用ユーティリティ
ｕｐｇｒａｄｅ−ＯＰＥＮ＿Ｒ−１．１．３−ｒ１．ｔａｒ．ｇｚ　・・・ＥＲＳ−２１０用のフラッシュ更新
・ソースファイル
ｃｙｇｗｉｎ−ｐａｃｋａｇｅｓ−１．３．１０−ｓｒｃ．ｔａｒ．ｇｚ　・・・Ｃｙｇｗｉｎのソース
ｂｉｎｕｔｉｌｓ−２．１２．ｔａｒ．ｇｚ　・・・ｂｉｎｕｔｉｌｓ　のソース
ｇｃｃ−３．０．４．ｔａｒ．ｇｚ　・・・ｇｃｃ　のソース
ｎｅｗｌｉｂ−１．９．０．ｔａｒ．ｇｚ　・・・ｎｅｗｌｉｂの　ソース
ｂｕｉｌｄ−ｄｅｖｔｏｏｌｓ−３．０．４−ｒ１．ｓｈ　・・・上記３個のファイルのビルド用のシェルスクリプト
なお、上述のファイル名における数値は、バージョン番号を表しています。ファイルが変更された場合はバージョン番号も変更されます。
【０４５１】
第２章　インストール
２．１　Ｃｙｇｗｉｎ
Ｗｉｎｄｏｗｓ環境の場合には、最初にＣｙｇｗｉｎをインストールします。Ｃｙｇｗｉｎを使用すると、Ｗｉｎｄｏｗｓ上で標準的なＵｎｉｘコマンドが動作します。以下の手順でＣｙｇｗｉｎをインストールする。
１．ｃｙｇｗｉｎ−ｐａｃｋａｇｅｓ−１．３．１０−ｂｉｎ．ｅｘｅをダブルクリックします。
２．Ｕｎｚｉｐを実行するフォルダーを指定し、［Ｕｎｚｉｐ］をクリックするとｃｙｇｗｉｎ−ｐａｃｋａｇｅｓ−１．３．１０ディレクトリが作成されるので、このなかにあるｓｅｔｕｐ．ｅｘｅを実行します。
３．ｓｅｔｕｐ．ｅｘｅのバージョンが表示されるので、［Ｎｅｘｔ−＞］をクリックします。
４．［Ｉｎｓｔａｌｌ　ｆｒｏｍ　Ｌｏｃａｌ　Ｄｉｒｅｃｔｏｒｙ］を選択し、［Ｎｅｘｔ−＞］をクリックします。
５．Ｃｙｇｗｉｎをインストールするディレクトリを指定します。特に必要が無い限り’Ｃ：￥ｃｙｇｗｉｎ’の指定のままにしてください。テキストファイル型に［Ｕｎｉｘ］を選択し、［Ｎｅｘｔ−＞］をクリックします。
６．ｓｅｔｕｐ．ｅｘｅがあるディレクトリを指定し、［Ｎｅｘｔ−＞］をクリックします。
７．パッケージ内容の選択画面が表示されます。デフォルトの設定のままにし、［Ｎｅｘｔ−＞］をクリックします。
【０４５２】
ただし、このパッケージにはＯＰＥＮ−Ｒ　ＳＤＫを使用するために必要な最小限のツールのみが含まれています。新規にツールを追加するには、ｓｅｔｕｐ．ｅｘｅを再実行し、手順４で［Ｉｎｓｔａｌｌ　ｆｒｏｍ　Ｉｎｔｅｒｎｅｔ］　を選択する。
【０４５３】
２．２　ｇｃｃ
Ｃｙｇｗｉｎ上の　／ｕｓｒ／ｌｏｃａｌ　（Ｃ：￥ｃｙｇｗｉｎ￥ｕｓｒ￥ｌｏｃａｌ）でパッケージを解凍します。以降の説明では、Ｃｙｇｗｉｎ上の／ｕｓｒ／ｌｏｃａｌのことを単に／ｕｓｒ／ｌｏｃａｌと記述し、ｃ：￥ｃｙｇｗｉｎ￥ｕｓｒ￥ｌｏｃａｌとは記述しません。以下の手順でｇｃｃをインストールする。以下では、ｍｉｐｓｅｌ−ｄｅｖｔｏｏｌｓ−３．０．４−ｂｉｎ−ｒ１．ｔａｒ．ｇｚを／ｕｓｒ／ｌｏｃａｌに置くと仮定します。
１．パッケージを解凍します。ここで、／ｘｘｘはダウンロードしたディレクトリです。
ｃｄ　／ｕｓｒ／ｌｏｃａｌ
ｔａｒ　ｘｚｆ　／ｘｘｘ／ｍｉｐｓｅｌ−ｄｅｖｔｏｏｌｓ−３．０．４−ｂｉｎ−ｒ１．ｔａｒ．ｇｚ
／ｕｓｒ／ｌｏｃａｌ／ＯＰＥＮ＿Ｒ＿ＳＤＫ　ディレクトリが生成され、そのなかにｍｉｐｓｅｌ−ｌｉｎｕｘを対象とする以下のツールやライブラリがインストールされます。
ＧＮＵ　ｂｉｎｕｔｉｌｓ−２．１２
ＧＮＵ　ｇｃｃ−３．０．４
ｎｅｗｌｉｂ−１．９．０
なお、ここではｌｉｎｕｘを対象名としていますが、ＡＩＢＯ上でＬｉｎｕｘが動作する意味ではありません。　Ｕｎｉｘ環境を使用する場合は、ｂｕｉｌｄ−ｄｅｖｔｏｏｌｓ−３．０．４．ｓｈ　を実行すると自動的に開発環境を生成します。ｂｕｉｌｄ−ｄｅｖｔｏｏｌｓ−３．０．４．ｓｈと同じディレクトリに以下のファイルを置いて、　ｂｕｉｌｄ−ｄｅｖｔｏｏｌｓ−３．０．４．ｓｈ　を実行してください。
ｂｉｎｕｔｉｌｓ−２．１２．ｔａｒ．ｇｚ
ｇｃｃ−３．０．４．ｔａｒ．ｇｚ
ｎｅｗｌｉｂ−１．９．０．ｔａｒ．ｇｚ
【０４５４】
２．３　ＯＰＥＮ−Ｒ　ＳＤＫ
続いて、以下の手順でＯＰＥＮ−Ｒ　ＳＤＫ本体をインストールする。
１．パッケージを解凍します（／ｘｘｘはダウンロードしたディレクトリです）。
ｃｄ／ｕｓｒ／ｌｏｃａｌ
ｔａｒ　ｘｚｆ　／ｘｘｘ／ＯＰＥＮ＿Ｒ＿ＳＤＫ−１．１．３−ｒ１．ｔａｒ．ｇｚ
ここでは、／ｕｓｒ／ｌｏｃａｌ／ＯＰＥＮ＿Ｒ＿ＳＤＫ／ＯＰＥＮ＿Ｒディレクトリが生成されます。
【０４５５】
２．４　サンプルプログラム
続いて、以下の手順でサンプルプログラムをインストールする。
任意のディレクトリに移動し、パッケージを解凍します（／ｍｙｄｉｒは任意のディレクトリ、／ｘｘｘはダウンロードしたディレクトリです）。
ｃｄ　／ｍｙｄｉｒ
ｔａｒ　ｘｚｆ　／ｘｘｘ／ＯＰＥＮ＿Ｒ＿ＳＤＫ−ｓａｍｐｌｅ−１．１．３−ｒ１．ｔａｒ．ｇｚ
ここでｓａｎｐｌｅディレクトリが生成され、そのなかに複数のサンプルプログラムがインストールされます。
【０４５６】
２．５　ＡＩＢＯ本体内蔵フラッシュＲＯＭの更新
ＯＰＥＮ−Ｒ　ＳＤＫで作成したプログラムを動作させるために、ＡＩＢＯ　ＥＲＳ−２１０では、フラッシュＲＯＭを更新する必要があります。ただし、ＡＩＢＯが　’ＯＰＥＮ−Ｒ　Ｖｅｒ．１．１．２’または　’ＯＰＥＮ−Ｒ　Ｖｅｒ．１．１．３’に対応している場合、または、ＥＲＳ−２２０、ＥＲＳ−２１０Ａ、ＥＲＳ−２２０Ａの場合は、フラッシュＲＯＭの更新の必要はありません。本体内蔵フラッシュＲＯＭの更新は、以下の手順にて行う。
１．任意のディレクトリに移動し、パッケージを解凍します（／ｍｙｄｉｒは任意のディレクトリ、／ｘｘｘはダウンロードしたディレクトリです）。
ｃｄ　／ｍｙｄｉｒ
ｔａｒ　ｘｚｆ　／ｘｘｘ／ｕｐｇｒａｄｅ−ＯＰＥＮ−Ｒ＿１．１．３−ｒ１．ｔａｒ．ｇｚ
ここで、Ｕｐｇｒａｄｅディレクトリが作成されます。フラッシュＲＯＭの更新手順は、ＵｐｇｒａｄｅディレクトリにあるＲＥＡＤＭＥ＿Ｊ．ＴＸＴに記述されています。
【０４５７】
第３章　ＨｅｌｌｏＷｏｒｌｄのビルドと実行
続いて、インストールが成功したことをサンプルプログラムのＨｅｌｌｏＷｏｒｌｄのビルドと実行で確認する。Ｈｅｌｌｏ　Ｗｏｒｌｄは、ＨＥＬＬＯ．ＢＩＮとＰＯＷＥＲＭＯＮ．ＢＩＮに対応するＯＰＥＮ−Ｒオブジェクトから構成され、’Ｈｅｌｌｏ　Ｗｏｒｌｄ’を無線コンソールに出力します（以降の説明ではＯＰＥＮ−Ｒオブジェクトのことをオブジェクトと記述します）。ＨｅｌｌｏＷｏｒｌｄディレクトリは、以下のサブディレクトリを含む。
ＨｅｌｌｏＷｏｒｌｄ／ＨｅｌｌｏＷｏｒｌｄ　：ＨｅｌｌｏＷｏｒｌｄオブジェクトのソース
ＨｅｌｌｏＷｏｒｌｄ／ＭＳ　：ＡＩＢＯプログラミングメモリスティックに置くファイルです。最初はＯＢＪＥＣＴ．ＣＦＧのみで、後に実行ファイルがコピーされます。
【０４５８】
３．１　ビルド
以下の手順でサンプルプログラムをビルドする。
１．実行ファイルをビルドします。
ｃｄ　ｓａｍｐｌｅ／ＨｅｌｌｏＷｏｒｌｄ
ｍａｋｅ
ｍａｋｅ　ｉｎｓｔａｌｌ
ここで、実行ファイルが生成され、ＭＳディレクトリにコピーされます。なお、本ＯＰＥＮ−Ｒ　ＳＤＫを／ｕｓｒ／ｌｏｃａｌ以外のディレクトリにインストールする場合は、以下の様にＯＰＥＮ−Ｒ　ＳＤＫディレクトリのパスを指定する。
（／ｍｙｄｉｒは、ＯＰＥＮ−Ｒ　　ＳＤＫをインストールしたディレクトリです）。
ｍａｋｅ　ＰＲＥＦＩＸ＝／ｍｙｄｉｒ／ＯＰＥＮ＿Ｒ＿ＳＤＫ
なお、ファイル名は、８＋３フォーマット（ｘｘｘｘｘｘｘｘ．ｘｘｘ）です。ファイルは、ｇｚｉｐされます。ｇｚｉｐは、必須ではありませんがＡＩＢＯプログラミングメモリスティック上のメモリを節約できます。
【０４５９】
３．２　実行
３．２．１　無線ＬＡＮ環境での実行
以下の手順で無線ＬＡＮ環境を設定しプログラムを実行する。
１．空のＡＩＢＯプログラミングメモリスティックに、以下の２個のＯＰＥＮ−Ｒディレクトリをコピーします（／ｍｙｄｉｒはサンプルプログラムをインストールしたディレクトリです）。
／ｕｓｒ／ｌｏｃａｌ／ＯＰＥＮ＿Ｒ＿ＳＤＫ／ＯＰＥＮ＿Ｒ／ＭＳ／ＷＣＯＮＳＯＬＥ／ｍｅｍｐｒｏｔ／ＯＰＥＮ−Ｒ
／ｍｙｄｉｒ／ｓａｍｐｌｅ／ＨｅｌｌｏＷｏｒｌｄ／ＭＳ／ＯＰＥＮ−Ｒ
２．ＡＩＢＯプログラミングメモリスティック上にあるＷＬＡＮＣＯＮＦ．ＴＸＴを編集して、ＡＩＢＯ側の無線ＬＡＮの設定を行います。詳細は「３．２．２　ＷＬＡＮＣＯＮＦ．ＴＸＴの設定」を参照してください。
３．ＡＩＢＯワイヤレスＬＡＮカードをＡＩＢＯに装着します。
４．ＰＣ側の無線ＬＡＮ環境を設定します。　ＰＣとＡＩＢＯを無線ＬＡＮで接続するには、アクセスポイントを使用する方法と使用しない方法があります。ＡＩＢＯがネットワークに接続されているか確認するには、以下のコマンドを実行するとよい。
ｐｉｎｇ　（ＡＩＢＯのＩＰアドレス）
５．ＰＣからＡＩＢＯの無線コンソールに接続するため、ＰＣ側で下記のようにｔｅｌｎｅｔプログラムを起動しておきます。ＡＩＢＯの無線コンソールはＴＣＰポート番号５９０００でｔｅｌｎｅｔプロトコルを使用します（他のｔｅｌｎｅｔプログラムを使用しても構いません）。
ｔｅｌｎｅｔ　（ＡＩＢＯのＩＰアドレス）　５９０００
６．ＡＩＢＯプログラミングメモリスティックをＡＩＢＯに挿入し、ＡＩＢＯを起動します。一連のシステム情報が出力された後に’！！！　Ｈｅｌｌｏ　Ｗｏｒｌｄ　！！！’の文字列が表示されれば正常に動作しています。
７．ＡＩＢＯのポーズボタンを押してシャットダウンしてください。
【０４６０】
３．２．２　ＷＬＡＮＣＯＮＦ．ＴＸＴの設定
ＡＩＢＯプログラミングメモリスティックの／ＯＰＥＮ−Ｒ／ＳＹＳＴＥＭ／ＣＯＮＦ／には、２種類の無線ＬＡＮ設定ファイル、ＷＬＡＮＤＦＬＴ．ＴＸＴとＷＬＡＮＣＯＮＦ．ＴＸＴがあります。ＷＬＡＮＤＥＬＴ．ＴＸＴは、ＡＩＢＯ無線ＬＡＮカードのデフォルトの設定がされているので編集しないでください。ＷＬＡＮＣＯＮＦ．ＴＸＴはユーザーの設定用のファイルです。ＡＩＢＯが起動するとＷＬＡＮＣＯＮＦ．ＴＸＴを最初に見にいき、ファイルが存在すればそのなかの情報を使います。ファイルが存在しないときはＷＬＡＮＤＦＬＴ．ＴＸＴの情報を使います。ＷＬＡＮＤＦＬＴ．ＴＸＴをＷＬＡＮＣＯＮＦ．ＴＸＴのファイル名でコピーして編集します。ＷＬＡＮＣＯＮＦ．ＴＸＴの内容は、デフォルトでは以下に設定されています。
ＨＯＳＴＮＡＭＥ＝ＡＩＢＯ
ＥＴＨＥＲ＿ＩＰ＝１０．０．１．１００
ＥＴＨＥＲ＿ＮＥＴＭＡＳＫ＝２５５．２５５．２５５．０
ＩＰ＿ＧＡＴＥＷＡＹ＝１０．０．１．１
ＥＳＳＩＤ＝ＡＩＢＯＮＥＴ
ＷＥＰＥＮＡＢＬＥ　＝１
ＷＥＰＫＥＹ　＝ＡＩＢＯ２
ＡＰＭＯＤＥ　＝２
ＣＨＡＮＮＥＬ＝３
各項目の意味は、以下の通りである。
ＨＯＳＴＮＡＭＥ：ＡＩＢＯに無線ネットワーク上で使用する名前を指定します。半角英数字で最大８文字の文字列を指定します。
ＥＴＨＥＲ＿ＩＰ：ＡＩＢＯが使用するＩＰアドレスを指定します。
ＥＴＨＥＲ＿ＮＥＴＭＡＳＫ：ＩＰサブネットマスクを指定します。
ＩＰ＿ＧＡＴＥＷＡＹ：ゲートウェイのＩＰアドレスを指定します。ネットワーク上にゲートウェイが存在しない場合は、ＥＴＨＥＲ＿ＩＰと同じＩＰアドレスを設定してください。
ＥＳＳＩＤ：無線ネットワークの名前を指定します。最大３２文字の半角英数字を指定します。
ＷＥＰＥＮＡＢＬＥ：ＷＥＰ（無線暗号システム）を使うかどうかを指定します。使用しない場合は、‘０’であり、使用する場合は‘１’である。
ＷＥＰＫＥＹ：（ＷＥＰｋｅｙ（無線暗号キー）を指定します。半角英数字５文字で指定する。
ＡＰＭＯＤＥ：ＡＩＢＯの無線ＬＡＮモードを指定します。Ａｄ　Ｈｏｃ　Ｄｅｍｏ　Ｍｏｄｅで接続する場合は‘０’、Ｉｎｆｒａｓｔｒｕｃｔｕｒｅ　Ｍｏｄｅで接続する場合は‘１’、Ｉｎｆｒａｓｔｒｕｃｔｕｒｅ　Ｍｏｄｅ、Ａｄ　Ｈｏｃ　Ｄｅｍｏ　Ｍｏｄｅの順で自動接続する場合は‘２’を指定する。
ＣＨＡＮＮＥＬ：Ａｄ　Ｈｏｃ　Ｄｅｍｏ　Ｍｏｄｅ時に使用するチャンネルを指定します。１−１１までの数値で指定してください。
【０４６１】
なお、無線ＬＡＮカードを挿入したＰＣとＡＩＢＯとをアクセスポイントを使用せず直接に接続する場合（ＩＢＳＳ　Ｐｅｅｒ−ｔｏ−Ｐｅｅｒ　ＭｏｄｅまたはＡｄ　Ｈｏｃ　Ｄｅｍｏ　Ｍｏｄｅ）は、まず、ＥＳＳＩＤ、ＷＥＰＥＮＡＢＬＥ、ＷＥＰＫＥＹをＰＣと同じ設定にする。また、ＩＢＳＳ　Ｐｅｅｒ−ｔｏ−Ｐｅｅｒ　Ｍｏｄｅで接続する場合は、ＡＰＭＯＤＥ＝１に指定する。Ａｄ　Ｈｏｃ　Ｄｅｍｏ　Ｍｏｄｅで接続する場合は、ＡＰＭＯＤＥ＝０に指定し、ＣＨＡＮＮＥＬは、ＰＣの設定に合せます。
【０４６２】
無線ＬＡＮアクセスポイントを使用して、ＰＣとＡＩＢＯを接続する場合には、ＥＳＳＩＤとＷＥＰＫＥＹは、アクセスポイントと同じ設定にする。ＡＩＢＯをＩｎｆｒａｓｔｒｕｃｔｕｒｅ　Ｍｏｄｅで動作させるため、ＡＰＭＯＤＥ＝１に指定します。
【０４６３】
＜ＥＲＳ−２１０＞
また、ＯＰＥＮ−Ｒ　ＳＤＫを用いてインタラクションが可能となる上記にＡＩＢＯ（登録商標）として説明したロボット装置の具体的仕様例を以下に示す。
第１章　ＥＲＳ−２１０外部仕様
１．１　ＥＲＳ−２１０外形
外観図及び外形寸法
本発明を適用するロボット装置の機種仕様例について図面を用いて説明する。
【０４６４】
このロボット装置は、頭部と上肢と体幹部と下肢とを備え、上肢及び下肢、又は下肢のみを移動手段とする脚式移動ロボットである。脚式移動ロボットには、４足歩行の動物の身体メカニズムやその動きを模倣したペット型ロボットや、下肢のみを移動手段として使用する２足歩行の動物の身体メカニズムやその動きを模倣したロボット装置があるが、本実施の形態として示すロボット装置は、４足歩行タイプの脚式移動ロボットである。なお、本明細書では説明していないが、当然のことながら本発明を２足歩行タイプの脚式移動ロボットに適用することもできる。
【０４６５】
図２６には、このロボット装置（以下、ＥＲＳ−２１０と記す。）の上面からの眺望、正面空の眺望及び側面からの眺望が示されている。以下、ＥＲＳ−２１０について図面を参照して説明する。ＥＲＳ−２１０は、図２６に示すように「動物」を模した形状のいわゆるペット型ロボットである。ＥＲＳ−２１０は、胴体部ユニットの前後左右に各脚部ユニットが連結され、胴体部ユニットの前端部に頭部ユニットが連結されて構成されている。また、胴体部ユニットの後端部には、尻尾部が設けられている。ＥＲＳ−２１０の外形寸法は、図２７及び図２８において説明している
このロボット装置は、住環境その他の日常生活上の様々な場面における人的活動を支援する実用ロボットであり、内部状態（怒り、悲しみ、喜び、楽しみ等）に応じて行動できるほか、４足歩行の動物が行う基本的な動作を表出できるエンターテインメントロボットである。このロボット装置は、特に、頭部、胴体部、上肢部、下肢部等を有している。各部の連結部分及び関節に相当する部位には、運動の自由度に応じた数のアクチュエータ及びポテンショメータが備えられており、制御部の制御によって目標とする動作を表出できる。
【０４６６】
さらに、このＥＲＳ−２１０は、周囲の状況を画像データとして取得するための撮像部や、外部から受ける作用を検出するための各種センサや、外部から受ける物理的な働きかけ等を検出するための各種スイッチ等を備えている。撮像部には、小型のＣＣＤ（Ｃｈａｒｇｅ−Ｃｏｕｐｌｅｄ　Ｄｅｖｉｃｅ）カメラを使用する。センサには、角速度を検出する角速度センサ、ＣＣＤカメラによって撮像された対象物までの距離を計測する距離センサ等がある。各種スイッチには、主としてユーザによる接触を検出する押下式スイッチ、ユーザからの操作入力が可能な操作スイッチ等がある。これら各種センサ及び各種スイッチは、ロボット装置外部又は内部の適切な箇所に設置されている。
【０４６７】
１．２　可動範囲
続いて、ＥＲＳ−２１０の可動部分に関して説明する。
１．２．１　頭部
図２９には、頭部における可動部分とその可動範囲が示されている。頭部では、首、耳、顎が可動である。各部の自由度は、首がパン、チルト、ロールの３自由度、各耳がそれぞれ１自由度、顎が１自由度となっており、頭部全体で合計６自由度を有している。
【０４６８】
１．２．２　脚部
図３０には、脚部における可動部分とその可動範囲が示されている。脚部は、腰、肩、膝が可動であって、各部の自由度は、前脚がそれぞれ３自由度（腰：１自由度、肩：１自由度、膝：１自由度）、後脚がそれぞれ３自由度（腰：１自由度、肩：１自由度、膝：１自由度）となっており、脚部全体で合計１２自由度を有している。
【０４６９】
１．２．３　尾部
図３１には、尾部におけるの可動範囲が示されている。尾部は、尻尾が可動であって、２自由度を有している。なお、初期位置は、１５度になるように制御されている。
【０４７０】
１．３　デバイス配置図
１．３．１　出力デバイス
ＥＲＳ−２１０の出力デバイスに関して説明する。図３２には、ＥＲＳ−２１０に設けられた出力デバイスの概略位置が示されている。ＥＲＳ−２１０の頭部には、モード及び状態を知らせるモードランプ、目ランプＬＥＤ（赤色４個、緑色２個）が設けられている。頭部正面位置にはスピーカ、胸部正面位置には胸ランプ（緑色、オレンジ色）が設けられている。さらに、尻尾には、尻尾ＬＥＤ（青色、オレンジ色）が設けられている。また、この他にも本体内部に、時刻表示用のＬＥＤ、メモリスティックアクセス確認ランプ、起動音及びシャットダウン音のための圧電ブザー等が設けられている。
【０４７１】
１．３．２　入力デバイス
ＥＲＳ−２１０の入力デバイスに関して説明する。図３３には、ＥＲＳ−２１０に設けられた入力デバイスの概略位置が示されている。ＥＲＳ−２１０の頭部には、頭部センサ、距離センサ、及び顎センサ、左右の耳位置にステレオマイクが設けられている。また、頭部正面位置には、カラーＣＣＤカメラ、胸部正面位置には、動作停止用のポーズボタンが設けられている。胴体部の背面には、背中センサ、脚部の足裏に肉球センサが設けられている。また、本体内部に、加速度センサ、振動センサ、温度センサ、時計（設定スイッチ）、ＰＣカード挿入口、メモリスティック挿入口が設けられている。
【０４７２】
１．４　各部の構成
１．４．１　ＥＲＳ−２１０全体
ＥＲＳ−２１０全体構成について説明する。図３４には、ＥＲＳ−２１０全体の組み付けの様子が示されている。ＥＲＳ−２１０は、ＯＰＥＮ−Ｒバス接続端子を備えた本体コアユニットに、頭部ユニット、左右前脚ユニット、左右後脚ユニット、尾部ユニットが組み付けられている。
【０４７３】
１．４．２　ＥＲＳ−２１０頭部
ＥＲＳ−２１０頭部ユニットについて説明する。図３５には、外部保護筐体を取り外したＥＲＳ−２１０頭部が示されている。ＥＲＳ−２１０の頭部には、頭部センサ、左右耳部、ＬＥＤ基板、カラーカメラ、首ロールのためのモータ、顎開閉のためのモータ、首パンのためのモータ、首チルトのためのモータ、動作停止のためのポーズボタンが設けられている。
【０４７４】
１．４．３　ＥＲＳ−２１０脚部
ＥＲＳ−２１０脚部ユニットについて説明する。図３６には、外部保護筐体を取り外したＥＲＳ−２１０脚部が示されている。ＥＲＳ−２１０の脚部には、腰（Ｊ１）、肩（Ｊ２）、膝（Ｊ３）の各関節毎に駆動用モータ及びポテンショメータが設けられている。また、足裏部には肉球センサが取り付けられている。なお、ＯＰＥＮ−Ｒバス接続端子は、脚部ユニットに設けられていてもよい。
【０４７５】
第２章　ＥＲＳ−２１０関節
２．１　ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒリスト
続いて、プログラムのコードを記述する際に使用する各部の名称を列挙する。以下では、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒに続けてこのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示す部位を示す。
頭部
ＰＲＭ：／ｒ１／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・首チルト
ＰＲＭ：／ｒ１／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・首パン
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３・・・首ロール
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｃ４−Ｊｏｉｎｔ２：ｊ４・・・口
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ１−Ｓｅｎｓｏｒ：ｆ１・・・頭センサ（後）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ２−Ｓｅｎｓｏｒ：ｆ２・・・頭センサ（前）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｃ４／ｓ５−Ｓｅｎｓｏｒ：ｓ５・・・あごセンサ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｐ１−Ｓｅｎｓｏｒ：ｐ１・・・距離センサ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｍ１−Ｍｉｃ：Ｍ１・・・ステレオマイク
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｓ１−Ｓｐｅａｋｅｒ：Ｓ１・・・スピーカ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｉ１−ＦｂｋＩｍａｇｅＳｅｎｓｏｒ：Ｆ１・・・カラーカメラ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｅ１−Ｊｏｉｎｔ３：ｊ５・・・左耳
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｅ２−Ｊｏｉｎｔ３：ｊ６・・・右耳
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ１−ＬＥＤ２：ｌ１・・・目ランプ（左下）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ２−ＬＥＤ２：ｌ２・・・目ランプ（左中）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ３−ＬＥＤ２：ｌ３・・・目ランプ（左上）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ４−ＬＥＤ２：ｌ４・・・目ランプ（右下）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ５−ＬＥＤ２：ｌ５・・・目ランプ（右中）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ６−ＬＥＤ２：ｌ６・・・目ランプ（右上）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ７−ＬＥＤ２：ｌ７・・・モードランプ
【０４７６】
左前脚
ＰＲＭ：／ｒ２／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・腰関節
ＰＲＭ：／ｒ２／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・肩関節
ＰＲＭ：／ｒ２／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３・・・膝関節
ＰＲＭ：／ｒ２／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・肉球センサ
左後脚
ＰＲＭ：／ｒ３／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・腰関節
ＰＲＭ：／ｒ３／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・肩関節
ＰＲＭ：／ｒ３／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３・・・膝関節
ＰＲＭ：／ｒ３／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・肉球センサ
右前脚
ＰＲＭ：／ｒ４／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・腰関節
ＰＲＭ：／ｒ４／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・肩関節
ＰＲＭ：／ｒ４／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３・・・膝関節
ＰＲＭ：／ｒ４／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・肉球センサ
右後脚
ＰＲＭ：／ｒ５／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・腰関節
ＰＲＭ：／ｒ５／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・肩関節
ＰＲＭ：／ｒ５／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３・・・膝関節
ＰＲＭ：／ｒ５／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・肉球センサ
【０４７７】
尻尾
ＰＲＭ：／ｒ６／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・尻尾パン
ＰＲＭ：／ｒ６／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・尻尾チルト
ＲＰＭ：／ｒ６／ｌ１−ＬＥＤ２：ｌ１・・・尻尾ランプ（青）
ＲＰＭ：／ｒ６／ｌ２−ＬＥＤ２：ｌ２・・・尻尾ランプ（オレンジ）
ＰＲＭ：／ｒ６／ｔ１−Ｓｅｎｓｏｒ：ｔ１・・・温度センサ
ＰＲＭ：／ｒ６／ｓ１−Ｓｅｎｓｏｒ：ｓ１・・・背中センサ
【０４７８】
加速度センサ
ＰＲＭ：／ａ１−Ｓｅｎｓｏｒ：ａ１・・・ｙ軸（前後方向　前方向が正）
ＰＲＭ：／ａ２−Ｓｅｎｓｏｒ：ａ２・・・ｘ軸（左右方向　右方向が正）
ＰＲＭ：／ａ３−Ｓｅｎｓｏｒ：ａ３・・・ｚ軸（上下方向　上方向が正）
【０４７９】
続いて、ＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａのインデックス番号とＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒとの対応を示す。以下では、インデックス番号に続いて、これに対応するＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示されている。
０　　　ＰＲＭ：／ｒ１／ｃ１−Ｊｏｉｎｔ２：ｊ１
１　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２
２　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３
３　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ１−Ｓｅｎｓｏｒ：ｆ１
４　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ２−Ｓｅｎｓｏｒ：ｆ２
５　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｐ１−Ｓｅｎｓｏｒ：ｐ１
６　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｃ４−Ｊｏｉｎｔ２：ｊ４
７　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｃ４／ｓ５−Ｓｅｎｓｏｒ：ｓ５
８　　　ＰＲＭ：／ｒ２／ｃ１−Ｊｏｉｎｔ２：ｊ１
９　　　ＰＲＭ：／ｒ２／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２
１０　　　ＰＲＭ：／ｒ２／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３
１１　　　ＰＲＭ：／ｒ２／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４
１２　　　ＰＲＭ：／ｒ３／ｃ１−Ｊｏｉｎｔ２：ｊ１
１３　　　ＰＲＭ：／ｒ３／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２
１４　　　ＰＲＭ：／ｒ３／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３
１５　　　ＰＲＭ：／ｒ３／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４
１６　　　ＰＲＭ：／ｒ４／ｃ１−Ｊｏｉｎｔ２：ｊ１
１７　　　ＰＲＭ：／ｒ４／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２
１８　　　ＰＲＭ：／ｒ４／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３
１９　　　ＰＲＭ：／ｒ４／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４
２０　　　ＰＲＭ：／ｒ５／ｃ１−Ｊｏｉｎｔ２：ｊ１
２１　　　ＰＲＭ：／ｒ５／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２
２２　　　ＰＲＭ：／ｒ５／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３
２３　　　ＰＲＭ：／ｒ５／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４
２４　　　ＰＲＭ：／ｒ６／ｃ１−Ｊｏｉｎｔ２：ｊ１
２５　　　ＰＲＭ：／ｒ６／ｃ２−Ｊｏｉｎｔ２：ｊ２
２６　　　ＰＲＭ：／ｒ６／ｔ１−Ｓｅｎｓｏｒ：ｔ１
２７　　　ＰＲＭ：／ｒ６／ｓ１−Ｓｅｎｓｏｒ：ｓ１
２８　　　ＰＲＭ：／ａ１−Ｓｅｎｓｏｒ：ａ１
２９　　　ＰＲＭ：／ａ２−Ｓｅｎｓｏｒ：ａ２
３０　　　ＰＲＭ：／ａ３−Ｓｅｎｓｏｒ：ａ３
【０４８０】
２．２　関節動作の制限値
２．２．１　単関節リミット
各関節のソフトリミットについて説明する。脚部Ｊ１のソフトリミットは、−１１７°〜１１７°であり、Ｊ２のソフトリミットは、−１１°〜８９°であり、Ｊ３のソフトリミットは、−２７°〜１４７°である。ただし、脚部Ｊ１のメカリミットは、−１２０°〜１２０°であり、脚部Ｊ２のメカリミットは、−１４°〜９２°であり、脚部Ｊ３のメカリミットは、−２７°〜１４７°である。
【０４８１】
頭部のソフトリミットは、首チルトが−８２°〜４３°であり、首パンが−８９．６°〜８９．６°であり、首ロールが−２９°〜２９°であり、口（顎）開閉が−４７°〜−３°である。但し、メカリミットは、首チルトが−８５°〜４６°であり、首パンが−９２．６°〜９２．６°であり、首ロールが−３２°〜３２°であり、口（顎）開閉が−５０°〜０°である。
【０４８２】
また、尻尾部のソフトリミットは、パンが−２２°〜２２°であり、チルトが−２２°〜２２°である。但し、メカリミットは、パンが−２５°〜２５°であり、チルトが−２５°〜２５°となっている。
【０４８３】
２．２．２　脚の２関節ソフトリミット
Ｊ１の角度が変化したときのＪ２前脚の角度リミットとＪ２後脚の角度リミットの最小値を図３７に示す。図において、単位は、度（°）である。
【０４８４】
２．２．３　頭部の４関節ソフトリミット
以下に頭部の各関節のリミットの関係を説明する。ロールと口（顎）の可動範囲は、図３８のチルト軸とパン軸のエリア内に定義された範囲内にする。首パンは、右側の場合、対称になる。但し、以下の記載では、単位は、度（°）とする。
Ａ領域であれば、−２５≦ｒｏｌｌ≦０　ａｎｄ　ｍｏｕｔｈ＝−３
Ｂ領域であれば、ｒｏｌｌ＝０　ａｎｄ　ｍｏｕｔｈ＝−３
Ｃ領域であれば、−１５≦ｒｏｌｌ≦１０　ａｎｄ　ｍｏｕｔｈ＝−３
Ｄ領域であれば、−２９≦ｒｏｌｌ２０　ａｎｄ　−３０≦ｍｏｕｔｈ−３
Ｅ領域であれば、−２０≦ｒｏｌｌ≦２９　ａｎｄ　−２０≦ｍｏｕｔｈ≦−３
Ｆ領域であれば、−２０≦ｒｏｌｌ≦２０　ａｎｄ　−３０≦ｍｏｕｔｈ≦−３
Ｇ領域であれば、−２０≦ｒｏｌｌ≦２９　ａｎｄ　−３０≦ｍｏｕｔｈ≦−３
Ｈ領域であれば、−２０≦ｒｏｌｌ≦２９　ａｎｄ　−４７≦ｍｏｕｔｈ≦−３
Ｉ領域であれば、−２９≦ｒｏｌｌ≦２９　ａｎｄ　−４７≦ｍｏｕｔｈ≦−３
Ｋ領域であれば、−１５≦ｒｏｌｌ≦２９　ａｎｄ　−３０≦ｍｏｕｔｈ≦−３
Ｌ領域であれば、−１３≦ｒｏｌｌ≦２９　ａｎｄ　−３０≦ｍｏｕｔｈ≦−３
Ｍ領域であれば、−１５≦ｒｏｌｌ≦２０　ａｎｄ　−１０≦ｍｏｕｔｈ≦−３
Ｎ領域であれば、２≦ｒｏｌｌ≦２０　ａｎｄ　−１０≦ｍｏｕｔｈ≦−３
Ｏ領域であれば、−７≦ｒｏｌｌ≦２９　ａｎｄ　−３０≦ｍｏｕｔｈ≦−３
【０４８５】
２．３　サーボゲイン
図３９には、ＥＲＳ−２１０の関節のデフォルトのサーボゲインが示されている。ここでは、ＰＳＨＩＦＴ、ＩＳＨＩＦＴ、ＤＳＨＩＦＴは、固定値であるため値を変更することはできない。
【０４８６】
第３章　出力デバイス
３．１　ＬＥＤ
続いて、プログラムのコードを記述する際に使用する出力デバイスの名称を列挙する。以下では、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒに続けてこのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示す部位（ＬＥＤデバイス）を示す。
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ１−ＬＥＤ２：ｌ１・・・目ランプ（左下）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ２−ＬＥＤ２：ｌ２・・・目ランプ（左中）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ３−ＬＥＤ２：ｌ３・・・目ランプ（左上）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ４−ＬＥＤ２：ｌ４・・・目ランプ（右下）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ５−ＬＥＤ２：ｌ５・・・目ランプ（右中）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ６−ＬＥＤ２：ｌ６・・・目ランプ（右上）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ７−ＬＥＤ２：ｌ７・・・モードランプ
ＲＰＭ：／ｒ６／ｌ１−ＬＥＤ２：ｌ１・・・尻尾ランプ（青）
ＲＰＭ：／ｒ６／ｌ２−ＬＥＤ２：ｌ２・・・尻尾ランプ（オレンジ）
３．２　スピーカ
ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒは、ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｓ１−Ｓｐｅａｋｅｒ：Ｓ１である。このスピーカのサンプリング周波数は、８０００Ｈｚであり、量子化ビット数は、８ｂｉｔリニアＰＣＭであり、チャンネルは、１チャンネル（モノラル）である。また、ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（）　に設定可能なパラメータを以下に示す。
2004001148.tif 000112
設定可能なサウンドタイプは、ｏｓｐｋｓｎｄＭＯＮＯ８Ｋ８Ｂ　（デフォルト）である。
【０４８７】
３．３　ＬＣＤ
ＬＣＤは、現在時刻、バッテリ残量、音量を表示する。
【０４８８】
第４章　入力デバイス
４．１　外部
４．１．１　頭センサ
続いて、プログラムのコードを記述する際に使用する入力デバイスの名称を示す。以下では、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒに続けてこのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示す部位（センサ）を示す。
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ１−Ｓｅｎｓｏｒ：ｆ１・・・頭センサ（後）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ２−Ｓｅｎｓｏｒ：ｆ２・・・頭センサ（前）
2004001148.tif 000113
【０４８９】
４．１．２　カラーカメラ
カラーカメラのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒを以下に示す。
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｉ１−ＦｂｋＩｍａｇｅＳｅｎｓｏｒ：Ｆ１
カラーカメラの仕様
ＣＭＯＳ部：１／６インチ、出力画素数３５２（Ｈ）×２８８（Ｖ）、２５ＦＰＳ
レンズ部：Ｆ２．０、ｆ＝２．１８ｍｍ
画角：水平５７．６°、垂直４７．８°
デフォルト
ホワイトバランス　４３００Ｋ（固定）
シャッタ速度　　　１／１００ｓｅｃ固定
ゲイン　　　　　　０ｄＢ固定
また、ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（）　に設定可能なパラメータを以下に示す。
ホワイトバランス
2004001148.tif 000114
【０４９０】
４．１．３　距離センサ
距離センサのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒは、ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｐ１−Ｓｅｎｓｏｒ：ｐ１である。ｖａｌｕｅの範囲は、１０００００であれば１０ｃｍ、９０００００であれば９０ｃｍを表す。
【０４９１】
４．１．４　ポーズボタン
バッテリ制御マイコンに接続されています。電源が切れた状態のとき、ポーズボタンを押すとシステムを起動します。
【０４９２】
４．１．５　ステレオマイク
ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒは、以下のようになっている。
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｍ１−Ｍｉｃ：Ｍ１・・・マイク
サンプリング周波数は、１６０００Ｈｚであり、量子化ビット数は、１６ｂｉｔリニアＰＣＭであり、チャンネルは、２チャンネル（ステレオ）である。また、ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（）　に設定可能なパラメータを以下に示す。
単一指向性（ＵＮＩ）　／無指向性（ＯＭＮＩ）の切り替え
ｏｐｒｍｒｅｑＭＩＣ＿ＵＮＩ
ｏｐｒｍｒｅｑＭＩＣ＿ＯＭＮＩ
ここで指向性方向は、マイクユニットの長手方向を前方向とする。
ＡＬＣ（Ａｕｔｏｍａｔｉｃ　Ｌｉｍｉｔ　Ｃｏｎｔｒｏｌ）のＯＮ／ＯＦＦ切り替え
ｏｐｒｍｒｅｑＭＩＣ＿ＡＬＣ＿ＯＮ
ｏｐｒｍｒｅｑＭＩＣ＿ＡＬＣ＿ＯＦＦ
【０４９３】
４．１．６　スイッチ
続いて、プログラムのコードを記述する際に使用するスイッチの名称を示す。以下では、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒに続けてこのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示すスイッチを示す。
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｃ４／ｓ５−Ｓｅｎｓｏｒ：ｓ５・・・顎センサ
ＰＲＭ：／ｒ２／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・肉球センサ（左前脚）
ＰＲＭ：／ｒ３／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・肉球センサ（左後脚）
ＰＲＭ：／ｒ４／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・肉球センサ（右前脚）
ＰＲＭ：／ｒ５／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・肉球センサ（右後脚）
ＰＲＭ：／ｒ６／ｓ１−Ｓｅｎｓｏｒ：ｓ１・・・背中センサ
【０４９４】
４．２　内部
４．２．１　加速度センサ
プログラムのコードを記述する際に使用する加速度センサの名称を示す。以下では、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒに続けてこのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示す加速度センサを示す。
ＰＲＭ：／ａ１−Ｓｅｎｓｏｒ：ａ１・・・ｙ軸（前後方向、前方向が正）
ＰＲＭ：／ａ２−Ｓｅｎｓｏｒ：ａ２・・・ｘ軸（左右方向、右方向が正）
ＰＲＭ：／ａ３−Ｓｅｎｓｏｒ：ａ３・・・ｚ軸（上下方向、上方向が正）
ｖａｌｕｅの範囲は、以下の通りである。
−１９６１３３００　　　−１９．６１３３　ｍ／ｓ２　　　−２．０Ｇ
＋１９６１３３００　　　＋１９．６１３３　ｍ／ｓ２　　　＋２．０Ｇ
【０４９５】
４．２．２　振動センサ
バッテリ制御マイコンに接続されています。ブートコンディションにｏｂｃｂＶＩＢＲＡＴＩＯＮ＿ＤＥＴＥＣＴＥＤが設定されている場合は、バッテリ制御マイコンが振動を検出するとシステムを起動します。
【０４９６】
＜ＥＲＳ−２２０＞
続いて、ロボット装置（ＡＩＢＯ（登録商標））の別の仕様に関して説明する。
第１章　ＥＲＳ−２２０外部仕様
１．１　ＥＲＳ−２２０外形
１．１．１．　外観図
図４０には、このロボット装置（以下、ＥＲＳ−２２０と記す。）の上面からの眺望、正面空の眺望及び側面からの眺望が示されている。以下、ＥＲＳ−２２０について図面を参照して説明する。ＥＲＳ−２２０は、ＥＲＳ−２１０同様、図４０に示すように「動物」を模した形状のいわゆるペット型ロボットである。ＥＲＳ−２２０は、胴体部ユニットの前後左右に各脚部ユニットが連結され、胴体部ユニットの前端部に頭部ユニットが連結されて構成されている。また、胴体部ユニットの後端部には、尻尾部が設けられている。ＥＲＳ−２２０の外形寸法は、図４１及び図４２において説明している
【０４９７】
１．２　可動範囲
続いて、ＥＲＳ−２２０の可動部分に関して説明する。
【０４９８】
１．２．１　頭部
図４３には、頭部における可動部分とその可動範囲が示されている。頭部では、首、角、顎が可動である。各部の自由度は、首がパン、チルト、ロールの３自由度、角が１自由度、顎が１自由度となっており、頭部全体で合計４自由度を有している。
【０４９９】
１．２．２　脚部
図４４には、脚部における可動部分とその可動範囲が示されている。脚部は、腰、肩、膝が可動であって、各部の自由度は、前脚がそれぞれ３自由度（腰：１自由度、肩：１自由度、膝：１自由度）、後脚がそれぞれ３自由度（腰：１自由度、肩：１自由度、膝：１自由度）となっており、脚部全体で合計１２自由度を有している。
【０５００】
１．３　デバイス配置図
１．３．１　出力デバイス
ＥＲＳ−２２０の出力デバイスに関して説明する。図４５には、ＥＲＳ−２２０に設けられた出力デバイスの概略位置が示されている。ＥＲＳ−２２０の頭部には、モード及び状態を知らせるモードランプ、フェイスサイドランプ、フェイスフロントランプ、リトラクタブルヘッドライトが設けられている。頭部正面位置にはスピーカ、胸部正面位置には動作ランプが設けられている。さらに、背部に背中マルチランプ、尾部にテールランプが設けられている。また、この他にも本体内部に、時刻表示用のＬＥＤ、メモリスティックアクセス確認ランプ、起動音及びシャットダウン音のための圧電ブザー等が設けられている。
【０５０１】
１．３．２　入力デバイス
ＥＲＳ−２２０の入力デバイスに関して説明する。図４６には、ＥＲＳ−２２０に設けられた入力デバイスの概略位置が示されている。ＥＲＳ−２２０の頭部には、フェイスタッチセンサ、距離センサ、ヘッドタッチセンサ、左右の耳位置にステレオマイクが設けられている。また、頭部正面位置には、カラーカメラ、胸部正面位置には、動作停止用のポーズボタンが設けられている。胴体部の背面には、背中タッチセンサ及びテールタッチセンサ、脚部の足裏にフットタッチセンサが設けられている。また、本体内部に、加速度センサ、振動センサ、温度センサ、時計（設定スイッチ）、ＰＣカード挿入口、メモリスティック挿入口が設けられている。
【０５０２】
１．４　各部の構成
１．４．１　ＥＲＳ−２２０全体
ＥＲＳ−２２０全体構成について説明する。図４７には、ＥＲＳ−２２０全体の組み付けの様子が示されている。ＥＲＳ−２２０は、ＯＰＥＮ−Ｒバス接続端子を備えた本体コアユニットに、頭部ユニット、左右前脚ユニット、左右後脚ユニット、尾部ユニットが組み付けられている。
【０５０３】
１．４．２　ＥＲＳ−２２０頭部
ＥＲＳ−２２０頭部ユニットについて説明する。図４８には、外部保護筐体を取り外したＥＲＳ−２２０頭部が示されている。ＥＲＳ−２２０の頭部には、リトラクタブルヘッドライト、距離センサ、ヘッドタッチセンサ、左右耳部のステレオマイク、ＬＥＤ等のプリント基板、カラーカメラ、首ロールのためのモータ、首パンのためのモータ、首チルトのためのモータ、動作停止のためのポーズボタンが設けられている。
【０５０４】
１．４．３　ＥＲＳ−２２０脚部
ＥＲＳ−２２０脚部ユニットについて説明する。図４９には、外部保護筐体を取り外したＥＲＳ−２２０脚部が示されている。ＥＲＳ−２２０の脚部には、腰（Ｊ１）、肩（Ｊ２）、膝（Ｊ３）の各関節毎に駆動用モータ及びポテンショメータが設けられている。また、足裏部には肉球センサが取り付けられている。なお、ＯＰＥＮ−Ｒバス接続端子は、脚部ユニットに設けられていてもよい。
【０５０５】
第２章　ＥＲＳ−２２０関節
２．１　ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒリスト
続いて、プログラムのコードを記述する際に使用する各部の名称を列挙する。以下では、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒに続けてこのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示す部位を示す。
ＰＲＭ：／ｒ１／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・首チルト
ＰＲＭ：／ｒ１／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・首パン
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３・・・首ロール
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ１−ＬＥＤ２：ｌ１・・・頭フェイスサイドランプ（左前）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ２−ＬＥＤ２：ｌ２・・・頭フェイスサイドランプ（左中央）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ３−ＬＥＤ２：ｌ３・・・頭フェイスサイドランプ（左後）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ４−ＬＥＤ２：ｌ４・・・頭フェイスサイドランプ（右前）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ５−ＬＥＤ２：ｌ５・・・頭フェイスサイドランプ（右中央）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ６−ＬＥＤ２：ｌ６・・・頭フェイスサイドランプ（右後）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ７−ＬＥＤ２：ｌ７・・・頭モードランプ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ８−ＬＥＤ２：ｌ８・・・フェイスフロントランプＢ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ９−ＬＥＤ２：ｌ９・・・フェイスフロントランプＡ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌａ−ＬＥＤ２：ｌａ・・・フェイスフロントランプＣ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌｂ−ＬＥＤ２：ｌｂ・・・リトラクタブルヘッドライト
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ１−Ｓｅｎｓｏｒ：ｆ１・・・ヘッドタッチセンサ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ２−Ｓｅｎｓｏｒ：ｆ２・・・ヘッドタッチセンサ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｃ４／ｓ５−Ｓｅｎｓｏｒ：ｓ５・・・フェイスタッチセンサ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｐ１−Ｓｅｎｓｏｒ：ｐ１・・・距離センサ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｍ１−Ｍｉｃ：Ｍ１・・・ステレオマイク
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｓ１−Ｓｐｅａｋｅｒ：Ｓ１・・・スピーカ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｉ１−ＦｂｋＩｍａｇｅＳｅｎｓｏｒ：Ｆ１・・・カラーカメラ
【０５０６】
左前脚
ＰＲＭ：／ｒ２／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・腰関節
ＰＲＭ：／ｒ２／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・肩関節
ＰＲＭ：／ｒ２／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３・・・膝関節
ＰＲＭ：／ｒ２／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・フットタッチセンサ
左後脚
ＰＲＭ：／ｒ３／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・腰関節
ＰＲＭ：／ｒ３／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・肩関節
ＰＲＭ：／ｒ３／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３・・・膝関節
ＰＲＭ：／ｒ３／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・フットタッチセンサ
右前脚
ＰＲＭ：／ｒ４／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・腰関節
ＰＲＭ：／ｒ４／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・肩関節
ＰＲＭ：／ｒ４／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３・・・膝関節
ＰＲＭ：／ｒ４／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・フットタッチセンサ
右後脚
ＰＲＭ：／ｒ５／ｃ１−Ｊｏｉｎｔ２：ｊ１・・・腰関節
ＰＲＭ：／ｒ５／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２・・・肩関節
ＰＲＭ：／ｒ５／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３・・・膝関節
ＰＲＭ：／ｒ５／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・フットタッチセンサ
【０５０７】
尻尾
ＰＲＭ：／ｒ６／ｓ１−Ｓｅｎｓｏｒ：ｓ１・・・背中タッチスイッチ
ＰＲＭ：／ｒ６／ｔ１−Ｓｅｎｓｏｒ：ｔ１・・・温度センサ
ＰＲＭ：／ｒ６／ｓ２−Ｓｅｎｓｏｒ：ｓ２・・・テールタッチセンサ　（左）
ＰＲＭ：／ｒ６／ｓ３−Ｓｅｎｓｏｒ：ｓ３・・・テールタッチセンサ　（中央）
ＰＲＭ：／ｒ６／ｓ４−Ｓｅｎｓｏｒ：ｓ４・・・テールタッチセンサ　（右）
ＰＲＭ：／ｒ６／ｌ１−ＬＥＤ２：ｌ１・・・背中タッチセンサ（左から１番目）
ＰＲＭ：／ｒ６／ｌ２−ＬＥＤ２：ｌ２・・・背中タッチセンサ（左から２番目）
ＰＲＭ：／ｒ６／ｌ３−ＬＥＤ２：ｌ３・・・背中タッチセンサ（左から３番目）
ＰＲＭ：／ｒ６／ｌ４−ＬＥＤ２：ｌ４・・・背中タッチセンサ（右から３番目）
ＰＲＭ：／ｒ６／ｌ５−ＬＥＤ２：ｌ５・・・背中タッチセンサ（右から２番目）
ＰＲＭ：／ｒ６／ｌ６−ＬＥＤ２：ｌ６・・・背中タッチセンサ（右から１番目）
ＰＲＭ：／ｒ６／ｌ７−ＬＥＤ２：ｌ７・・・テールタッチセンサ（中央）
ＰＲＭ：／ｒ６／ｌ８−ＬＥＤ２：ｌ８・・・テールタッチセンサ（右）
ＰＲＭ：／ｒ６／ｌ９−ＬＥＤ２：ｌ９・・・テールタッチセンサ（左）
【０５０８】
加速度センサ
ＰＲＭ：／ａ１−Ｓｅｎｓｏｒ：ａ１・・・ｙ軸（前後方向、前方向が正）
ＰＲＭ：／ａ２−Ｓｅｎｓｏｒ：ａ２・・・ｘ軸（左右方向、右方向が正）
ＰＲＭ：／ａ３−Ｓｅｎｓｏｒ：ａ３・・・ｚ軸（上下方向、上方向が正）
【０５０９】
続いて、ＯＳｅｎｓｏｒＦｒａｍｅＶｅｃｔｏｒＤａｔａのインデックス番号とＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒとの対応を示す。以下では、インデックス番号に続いて、これに対応するＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示されている。
０　　　ＰＲＭ：／ｒ１／ｃ１−Ｊｏｉｎｔ２：ｊ１
１　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２
２　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３
３　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｐ１−Ｓｅｎｓｏｒ：ｐ１
４　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ１−Ｓｅｎｓｏｒ：ｆ１
５　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ２−Ｓｅｎｓｏｒ：ｆ２
６　　　ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｃ４／ｓ５−Ｓｅｎｓｏｒ：ｓ５
７　　　ＰＲＭ：／ｒ２／ｃ１−Ｊｏｉｎｔ２：ｊ１
８　　　ＰＲＭ：／ｒ２／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２
９　　　ＰＲＭ：／ｒ２／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３
１０　　　ＰＲＭ：／ｒ２／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４
１１　　　ＰＲＭ：／ｒ３／ｃ１−Ｊｏｉｎｔ２：ｊ１
１２　　　ＰＲＭ：／ｒ３／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２
１３　　　ＰＲＭ：／ｒ３／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３
１４　　　ＰＲＭ：／ｒ３／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４
１５　　　ＰＲＭ：／ｒ４／ｃ１−Ｊｏｉｎｔ２：ｊ１
１６　　　ＰＲＭ：／ｒ４／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２
１７　　　ＰＲＭ：／ｒ４／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３
１８　　　ＰＲＭ：／ｒ４／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４
１９　　　ＰＲＭ：／ｒ５／ｃ１−Ｊｏｉｎｔ２：ｊ１
２０　　　ＰＲＭ：／ｒ５／ｃ１／ｃ２−Ｊｏｉｎｔ２：ｊ２
２１　　　ＰＲＭ：／ｒ５／ｃ１／ｃ２／ｃ３−Ｊｏｉｎｔ２：ｊ３
２２　　　ＰＲＭ：／ｒ５／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４
２３　　　ＰＲＭ：／ｒ６／ｔ１−Ｓｅｎｓｏｒ：ｔ１
２４　　　ＰＲＭ：／ｒ６／ｓ１−Ｓｅｎｓｏｒ：ｓ１
２５　　　ＰＲＭ：／ｒ６／ｓ２−Ｓｅｎｓｏｒ：ｓ２
２６　　　ＰＲＭ：／ｒ６／ｓ３−Ｓｅｎｓｏｒ：ｓ３
２７　　　ＰＲＭ：／ｒ６／ｓ４−Ｓｅｎｓｏｒ：ｓ４
２８　　　ＰＲＭ：／ａ１−Ｓｅｎｓｏｒ：ａ１
２９　　　ＰＲＭ：／ａ２−Ｓｅｎｓｏｒ：ａ２
３０　　　ＰＲＭ：／ａ３−Ｓｅｎｓｏｒ：ａ３
【０５１０】
２．２　関節動作の制限値
２．２．１　単関節リミット
各関節のソフトリミットについて説明する。脚部Ｊ１のソフトリミットは、−１１７°〜１１７°であり、Ｊ２のソフトリミットは、−１１°〜８９°であり、Ｊ３のソフトリミットは、−２７°〜１４７°である。ただし、脚部Ｊ１のメカリミットは、−１２０°〜１２０°であり、脚部Ｊ２のメカリミットは、−１４°〜９２°であり、脚部Ｊ３のメカリミットは、−２７°〜１４７°である。
【０５１１】
頭部のソフトリミットは、首チルトが−８２°〜４３°であり、首パンが−８９．６°〜８９．６°であり、首ロールが−２９°〜２９°である。但し、メカリミットは、首チルトが−８５°〜４６°であり、首パンが−９２．６°〜９２．６°であり、首ロールが−３２°〜３２°である。
【０５１２】
６．２．２　脚の２関節ソフトリミット
Ｊ１の角度が変化したときのＪ２前脚の角度リミットとＪ２後脚の角度リミットの最小値を図５０に示す。図において、単位は、度（°）である。
【０５１３】
６．２．３　頭部の４関節ソフトリミット
以下に頭部の各関節のリミットの関係を説明する。ロールの可動範囲は、図５１のチルト軸とパン軸のエリア内に定義された範囲内にする。首パンは、右側の場合、対称になる。但し、以下の記載では、単位は、度（°）とする。
Ａ領域であれば、−２５≦ｒｏｌｌ≦０
Ｂ領域であれば、ｒｏｌｌ＝０
Ｃ領域であれば、−１５≦ｒｏｌｌ≦１０
Ｄ領域であれば、−２９≦ｒｏｌｌ２０
Ｅ領域であれば、−２０≦ｒｏｌｌ≦２９
Ｆ領域であれば、−２０≦ｒｏｌｌ≦２０
Ｇ領域であれば、−２０≦ｒｏｌｌ≦２９
Ｈ領域であれば、−２０≦ｒｏｌｌ≦２９
Ｉ領域であれば、−２９≦ｒｏｌｌ≦２９
Ｋ領域であれば、−１５≦ｒｏｌｌ≦２９
Ｌ領域であれば、−１３≦ｒｏｌｌ≦２９
Ｍ領域であれば、−１５≦ｒｏｌｌ≦２０
Ｎ領域であれば、２≦ｒｏｌｌ≦２０
Ｏ領域であれば、−７≦ｒｏｌｌ≦２９
【０５１４】
２．３　サーボゲイン
図５２には、ＥＲＳ−２２０の関節のデフォルトのサーボゲインが示されている。ここでは、ＰＳＨＩＦＴ、ＩＳＨＩＦＴ、ＤＳＨＩＦＴは、固定値であるため値を変更することはできない。
【０５１５】
第３章　出力デバイス
３．１　ＬＥＤ
続いて、プログラムのコードを記述する際に使用する出力デバイスの名称を列挙する。以下では、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒに続けてこのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示す部位（ＬＥＤデバイス）を示す。
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ１−ＬＥＤ２：ｌ１・・・フェイスサイドランプ（前左）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ２−ＬＥＤ２：ｌ２・・・フェイスサイドランプ（中央左）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ３−ＬＥＤ２：ｌ３・・・フェイスサイドランプ（後左）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ４−ＬＥＤ２：ｌ４・・・フェイスサイドランプ（前右）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ５−ＬＥＤ２：ｌ５・・・フェイスサイドランプ（中央右）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ６−ＬＥＤ２：ｌ６・・・フェイスサイドランプ（後右）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ７−ＬＥＤ２：ｌ７・・・モードランプ
ＰＲＭ：／ｒ６／ｌ１−ＬＥＤ２：ｌ１・・・背中タッチセンサ（左から１番目）
ＰＲＭ：／ｒ６／ｌ２−ＬＥＤ２：ｌ２・・・背中タッチセンサ（左から２番目）
ＰＲＭ：／ｒ６／ｌ３−ＬＥＤ２：ｌ３・・・背中タッチセンサ（左から３番目）
ＰＲＭ：／ｒ６／ｌ４−ＬＥＤ２：ｌ４・・・背中タッチセンサ（右から３番目）
ＰＲＭ：／ｒ６／ｌ５−ＬＥＤ２：ｌ５・・・背中タッチセンサ（右から２番目）
ＰＲＭ：／ｒ６／ｌ６−ＬＥＤ２：ｌ６・・・背中タッチセンサ（右から１番目）
ＰＲＭ：／ｒ６／ｌ７−ＬＥＤ２：ｌ７・・・テールタッチセンサ（中央）
ＰＲＭ：／ｒ６／ｌ８−ＬＥＤ２：ｌ８・・・テールタッチセンサ（右）
ＰＲＭ：／ｒ６／ｌ９−ＬＥＤ２：ｌ９・・・テールタッチセンサ（左）
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ８−ＬＥＤ２：ｌ８・・・フェイスフロントランプＢ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌ９−ＬＥＤ２：ｌ９・・・フェイスフロントランプＡ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌａ−ＬＥＤ２：ｌａ・・・フェイスフロントランプＣ
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｌｂ−ＬＥＤ２：ｌｂ・・・リトラクタブルヘッドライト
【０５１６】
３．２　スピーカ
ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒは、ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｓ１−Ｓｐｅａｋｅｒ：Ｓ１である。このスピーカのサンプリング周波数は、８０００Ｈｚであり、量子化ビット数は、８ｂｉｔリニアＰＣＭであり、チャンネルは、１チャンネル（モノラル）である。また、ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（）　に設定可能なパラメータを以下に示す。
2004001148.tif 000115
設定可能なサウンドタイプは、ｏｓｐｋｓｎｄＭＯＮＯ８Ｋ８Ｂ　（デフォルト）である。
【０５１７】
３．３　ＬＣＤ
ＬＣＤは、現在時刻、バッテリ残量、音量を表示する。
【０５１８】
第４章　入力デバイス
４．１　外部
４．１．１　頭センサ
続いて、プログラムのコードを記述する際に使用する入力デバイスの名称を示す。以下では、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒに続けてこのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示す部位（センサ）を示す。
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ１−Ｓｅｎｓｏｒ：ｆ１・・・頭センサ１
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｆ２−Ｓｅｎｓｏｒ：ｆ２・・・頭センサ２
ｖａｌｕｅ　の出力は、図５３に示す。ヘッドタッチセンサを後ろに倒した場合は、倒した角度により、例えば、「通常→後１→後２→後３→後２→後１→通常」の順に値が変化する。
【０５１９】
４．１．２　カラーカメラ
カラーカメラのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒを以下に示す。
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｉ１−ＦｂｋＩｍａｇｅＳｅｎｓｏｒ：Ｆ１
カラーカメラの仕様
ＣＭＯＳ部：１／６インチ、出力画素数３５２（Ｈ）×２８８（Ｖ）、２５ＦＰＳ
レンズ部：Ｆ２．０、ｆ＝２．１８ｍｍ
画角：水平５７．６°、垂直４７．８°
デフォルト
ホワイトバランス　４３００Ｋ（固定）
シャッタ速度　　　１／１００ｓｅｃ固定
ゲイン　　　　　　０ｄＢ固定
また、ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（）　に設定可能なパラメータを以下に示す。
2004001148.tif 000116
【０５２０】
４．１．３　距離センサ
距離センサのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒは、ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｐ１−Ｓｅｎｓｏｒ：ｐ１である。
ｖａｌｕｅの範囲は、１０００００であれば１０ｃｍ、９０００００であれば９０ｃｍを表す。
【０５２１】
４．１．４　ポーズボタン
バッテリ制御マイコンに接続されています。電源が切れた状態のとき、ポーズボタンを押すとシステムを起動します。
【０５２２】
４．１．５　ステレオマイク
ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒは、以下のようになっている。
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｍ１−Ｍｉｃ：Ｍ１・・・マイク
サンプリング周波数は、１６０００Ｈｚであり、量子化ビット数は、１６ｂｉｔリニアＰＣＭであり、チャンネルは、２チャンネル（ステレオ）である。また、ＯＰＥＮＲ：：ＣｏｎｔｒｏｌＰｒｉｍｉｔｉｖｅ（）　に設定可能なパラメータを以下に示す。
単一指向性（ＵＮＩ）　／無指向性（ＯＭＮＩ）の切り替え
ｏｐｒｍｒｅｑＭＩＣ＿ＵＮＩ
ｏｐｒｍｒｅｑＭＩＣ＿ＯＭＮＩ
ここで指向性方向は、マイクユニットの長手方向を前方向とする。
ＡＬＣ（Ａｕｔｏｍａｔｉｃ　Ｌｉｍｉｔ　Ｃｏｎｔｒｏｌ）のＯＮ／ＯＦＦ切り替え
ｏｐｒｍｒｅｑＭＩＣ＿ＡＬＣ＿ＯＮ
ｏｐｒｍｒｅｑＭＩＣ＿ＡＬＣ＿ＯＦＦ
【０５２３】
４．１．６　スイッチ
続いて、プログラムのコードを記述する際に使用するスイッチの名称を示す。以下では、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒに続けてこのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示すスイッチを示す。
ＰＲＭ：／ｒ１／ｃ１／ｃ２／ｃ３／ｃ４／ｓ５−Ｓｅｎｓｏｒ：ｓ５・・・フェイスタッチセンサ
ＰＲＭ：／ｒ２／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・フットタッチセンサ（左前脚）
ＰＲＭ：／ｒ３／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・フットタッチセンサ（左後脚）
ＰＲＭ：／ｒ４／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・フットタッチセンサ（右前脚）
ＰＲＭ：／ｒ５／ｃ１／ｃ２／ｃ３／ｃ４−Ｓｅｎｓｏｒ：ｓ４・・・フットタッチセンサ（右前脚）
ＰＲＭ：／ｒ６／ｓ１−Ｓｅｎｓｏｒ：ｓ１・・・背中タッチセンサ
ＰＲＭ：／ｒ６／ｓ２−Ｓｅｎｓｏｒ：ｓ２・・・テールタッチセンサ（左）
ＰＲＭ：／ｒ６／ｓ３−Ｓｅｎｓｏｒ：ｓ３・・・テールタッチセンサ（中央）
ＰＲＭ：／ｒ６／ｓ４−Ｓｅｎｓｏｒ：ｓ４・・・テールタッチセンサ（右）
【０５２４】
４．２　内部
４．２．１　加速度センサ
プログラムのコードを記述する際に使用する加速度センサの名称を示す。以下では、ＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒに続けてこのＣＰＣ　Ｐｒｉｍｉｔｉｖｅ　Ｌｏｃａｔｏｒが示す加速度センサを示す。
ＰＲＭ：／ａ１−Ｓｅｎｓｏｒ：ａ１・・・ｙ軸（前後方向、前方向が正）
ＰＲＭ：／ａ２−Ｓｅｎｓｏｒ：ａ２・・・ｘ軸（左右方向、右方向が正）
ＰＲＭ：／ａ３−Ｓｅｎｓｏｒ：ａ３・・・ｚ軸（上下方向、上方向が正）
ｖａｌｕｅの範囲は、以下の通りである。
−１９６１３３００　　　−１９．６１３３　ｍ／ｓ２　　　−２．０Ｇ
＋１９６１３３００　　　＋１９．６１３３　ｍ／ｓ２　　　＋２．０Ｇ
【０５２５】
４．２．２　振動センサ
バッテリ制御マイコンに接続されています。ブートコンディションにｏｂｃｂＶＩＢＲＡＴＩＯＮ＿ＤＥＴＥＣＴＥＤが設定されている場合は、バッテリ制御マイコンが振動を検出するとシステムを起動します。
【０５２６】
【発明の効果】
以上詳細に説明したように、本発明に係るロボット装置のインターフェイスは、ソフトウェアに基づいて外部情報や外部からの働きかけに応じた動作及び／又は内部状態に基づく自律的動作を実行するロボット装置のシステム層とアプリケーション層との間のインターフェイスであって、ソフトウェアがオブジェクト指向に基づいて部品化され、部品化されたソフトウェアの各部品としてのオブジェクトがそれぞれ並行動作することにより、エンターテインメントロボットのソフトウェア開発に必要なシステム層とアプリケーション層との間のインターフェイス仕様を規定することにより、エンターテインメント性や社会適合性を必要に応じて進化させるロボットのハードウェアやソフトウェアの開発が効率良く行なえる。
【図面の簡単な説明】
【図１】本発明の具体例として示すアプリケーションソフトウェアの概念図である。
【図２】本発明の具体例として示すアプリケーションソフトウェアにおけるオブジェクト間通信を説明する概念図である。
【図３】本発明の具体例として示すアプリケーションソフトウェアにおけるオブジェクトを表現するためのＣ＋＋のクラスを説明する概念図である。
【図４】本発明の具体例として示すアプリケーションソフトウェアにおけるオブジェクト間通信の例を説明する概念図である。
【図５】本発明の具体例として示すアプリケーションソフトウェアにおいて、オブジェクトをビルドし、実行ファイルを作成する手順を説明する図である。
【図６】本発明の具体例として示すアプリケーションソフトウェアのディレクトリ構成を説明する図である。
【図７】本具体例において関数ｅｎｔｒｙ＿ｐｏｉｎｔ０から順にｆｕｎｃ１，ｆｕｎｃ２が呼び出されｆｕｎｃ２のアドレス（ａ）を実行中のスタック状態を示す図である。
【図８】本具体例においてＣＰＵ例外の種類とオブジェクトの特定を説明する図である。
【図９】本具体例においてアセンブリ命令の特定を説明する図である。
【図１０】本発明の具体例として示すアプリケーションソフトウェアにおいて、ＥＭＯＮ．ＣＦＧで使用するコマンド（ｅｘｃｅｐｔｉｏｎ）の実行例を説明する図である。
【図１１】本発明の具体例として示すアプリケーションソフトウェアにおいて、ＥＭＯＮ．ＣＦＧで使用するコマンド（ｃｐ０）の実行例を説明する図である。
【図１２】本発明の具体例として示すアプリケーションソフトウェアにおいて、ＥＭＯＮ．ＣＦＧで使用するコマンド（ｃｐ１）の実行例を説明する図である。
【図１３】本発明の具体例として示すアプリケーションソフトウェアにおいて、ＥＭＯＮ．ＣＦＧで使用するコマンド（ｏｂｊｓ）の実行例を説明する図である。
【図１４】本発明の具体例として示すアプリケーションソフトウェアにおいて、ＥＭＯＮ．ＣＦＧで使用するコマンド（ｓｔａｃｋ、ｄｓｔａｃｋ）の実行例を説明する図である。
【図１５】本発明の具体例として示すアプリケーションソフトウェアにおいて、ＥＭＯＮ．ＣＦＧで使用するコマンド（ｔｌｂ）の実行例を説明する図である。
【図１６】本発明の具体例として示すアプリケーションソフトウェアにおいて、ＥＭＯＮ．ＣＦＧで使用するコマンド（ｄｕｍｐ）の実行例を説明する図である。
【図１７】本発明の具体例として示すアプリケーションソフトウェアのＩＰｖ４プロトコルスタックを説明する図である。
【図１８】本具体例において、オブジェクトとプロトコルスタックとの通信の様子を示す模式図である。
【図１９】本具体例において、共有メモリ領域をオブジェクトとプロトコルスタックのアドレス空間にマッピングする様子を説明する模式図である。
【図２０】本具体例におけるエンドポイントの状態遷移図である。
【図２１】本具体例におけるＵＤＰエンドポイントの状態遷移図である。
【図２２】本具体例におけるＤＮＳエンドポイントの状態遷移図である。
【図２３】本具体例においてインターネット上から取得されるホストエントリの例を示す図である。
【図２４】本具体例におけるＩＰエンドポイントの状態遷移図である。
【図２５】本具体例におけるＩＰヘッダの内容の一例を説明する図である。
【図２６】本具体例に適用されるロボット装置（ＥＲＳ−２１０）の外観図である。
【図２７】本具体例に適用されるロボット装置（ＥＲＳ−２１０）の外形寸法を示す図である。
【図２８】本具体例に適用されるロボット装置（ＥＲＳ−２１０）頭部の外形寸法を示す図である。
【図２９】本具体例に適用されるロボット装置（ＥＲＳ−２１０）の頭部の可動範囲を説明する図である。
【図３０】本具体例に適用されるロボット装置（ＥＲＳ−２１０）の脚部の可動範囲を説明する図である。
【図３１】本具体例に適用されるロボット装置（ＥＲＳ−２１０）の尾部の可動範囲を説明する図である。
【図３２】本具体例に適用されるロボット装置（ＥＲＳ−２１０）の出力デバイスの概略配置を説明する外観図である。
【図３３】本具体例に適用されるロボット装置（ＥＲＳ−２１０）の入力デバイスの概略配置を説明する外観図である。
【図３４】本具体例に適用されるロボット装置（ＥＲＳ−２１０）の全体構成の組み付けを説明する斜視図である。
【図３５】本具体例に適用されるロボット装置（ＥＲＳ−２１０）の頭部構成を説明する斜視図である。
【図３６】本具体例に適用されるロボット装置（ＥＲＳ−２１０）の脚部構成を説明する斜視図である。
【図３７】本具体例に適用されるロボット装置（ＥＲＳ−２１０）において、Ｊ１の角度が変化したときのＪ２前脚の角度リミットとＪ２後脚の角度リミットの最小値とを示す図である。
【図３８】本具体例に適用されるロボット装置（ＥＲＳ−２１０）における頭部４関節の最適な対応関係を示す図である。
【図３９】本具体例に適用されるロボット装置（ＥＲＳ−２１０）における関節のデフォルトのサーボゲインを示す図である。
【図４０】本具体例に適用されるロボット装置（ＥＲＳ−２２０）の外観図である。
【図４１】本具体例に適用されるロボット装置（ＥＲＳ−２２０）の外形寸法を示す図である。
【図４２】本具体例に適用されるロボット装置（ＥＲＳ−２２０）頭部の外形寸法を示す図である。
【図４３】本具体例に適用されるロボット装置（ＥＲＳ−２２０）の頭部の可動範囲を説明する図である。
【図４４】本具体例に適用されるロボット装置（ＥＲＳ−２２０）の脚部の可動範囲を説明する図である。
【図４５】本具体例に適用されるロボット装置（ＥＲＳ−２２０）の出力デバイスの概略配置を説明する外観図である。
【図４６】本具体例に適用されるロボット装置（ＥＲＳ−２２０）の入力デバイスの概略配置を説明する外観図である。
【図４７】本具体例に適用されるロボット装置（ＥＲＳ−２２０）の全体構成の組み付けを説明する斜視図である。
【図４８】本具体例に適用されるロボット装置（ＥＲＳ−２２０）の頭部構成を説明する斜視図である。
【図４９】本具体例に適用されるロボット装置（ＥＲＳ−２２０）の脚部構成を説明する斜視図である。
【図５０】本具体例に適用されるロボット装置（ＥＲＳ−２２０）において、Ｊ１の角度が変化したときのＪ２前脚の角度リミットとＪ２後脚の角度リミットの最小値とを示す図である。
【図５１】本具体例に適用されるロボット装置（ＥＲＳ−２２０）における頭部４関節の最適な対応関係を示す図である。
【図５２】本具体例に適用されるロボット装置（ＥＲＳ−２２０）における関節のデフォルトのサーボゲインを示す図である。
【図５３】本具体例に適用されるロボット装置（ＥＲＳ−２２０）における頭部センサの出力値を説明する図である。
【符号の説明】
１　アプリケーションソフトウェア、１１，１２，１３　オブジェクト、ＥＲＳ−２１０　ロボット装置、ＥＲＳ−２２０　ロボット装置
【図１】
2004001148.tif 000117
【図２】
2004001148.tif 000118
【図３】
2004001148.tif 000119
【図４】
2004001148.tif 000120
【図５】
2004001148.tif 000121
【図６】
2004001148.tif 000122
【図７】
2004001148.tif 000123
【図８】
2004001148.tif 000124
【図９】
2004001148.tif 000125
【図１０】
2004001148.tif 000126
【図１１】
2004001148.tif 000127
【図１２】
2004001148.tif 000128
【図１３】
2004001148.tif 000129
【図１４】
2004001148.tif 000130
【図１５】
2004001148.tif 000131
【図１６】
2004001148.tif 000132
【図１７】
2004001148.tif 000133
【図１８】
2004001148.tif 000134
【図１９】
2004001148.tif 000135
【図２０】
2004001148.tif 000136
【図２１】
2004001148.tif 000137
【図２２】
2004001148.tif 000138
【図２３】
2004001148.tif 000139
【図２４】
2004001148.tif 000140
【図２５】
2004001148.tif 000141
【図２６】
2004001148.tif 000142
【図２７】
2004001148.tif 000143
【図２８】
2004001148.tif 000144
【図２９】
2004001148.tif 000145
【図３０】
2004001148.tif 000146
【図３１】
2004001148.tif 000147
【図３２】
2004001148.tif 000148
【図３３】
2004001148.tif 000149
【図３４】
2004001148.tif 000150
【図３５】
2004001148.tif 000151
【図３６】
2004001148.tif 000152
【図３７】
2004001148.tif 000153
【図３８】
2004001148.tif 000154
【図３９】
2004001148.tif 000155
【図４０】
2004001148.tif 000156
【図４１】
2004001148.tif 000157
【図４２】
2004001148.tif 000158
【図４３】
2004001148.tif 000159
【図４４】
2004001148.tif 000160
【図４５】
2004001148.tif 000161
【図４６】
2004001148.tif 000162
【図４７】
2004001148.tif 000163
【図４８】
2004001148.tif 000164
【図４９】
2004001148.tif 000165
【図５０】
2004001148.tif 000166
【図５１】
2004001148.tif 000167
【図５２】
2004001148.tif 000168
【図５３】
2004001148.tif 000169