(57)【要約】【課題】  ベースソフトウェアのソースコードを一切修正しないで、組み込みソフトウェアをカスタマイズするための方法を提供する。【解決手段】  基底クラスと、インスタンスとクラス名称を登録／参照するインスタンステーブル１１２と、実行制御を司るコードなどから成るベースソフトウェア部１１と、前記基底クラスのヘッダファイルを参照して定義・実装された派生クラスコードから成るカスタムソフトウェア部１２とで構成され、ＲＯＭ作成時には、前記ベースソフトウェア部１１とカスタムソフトウェア部１２をリンクし、実行時には、前記基底クラスのコンストラクタ内で前記派生クラスのインスタンスおよびクラス名称を前記インスタンステーブルに登録し、コンパイル済みのモジュール内から派生クラスのインスタンスを呼び出す。【選択図】図１
2007279918.tif 000002
【特許請求の範囲】
【請求項１】
基底クラスとクラスインスタンスのアドレスとそのクラス名称を格納するインスタンステーブルと前記インスタンステーブルへの登録関数および検索関数と実行制御コードとを含むベースソフトウェア部と、前記基底クラスのヘッダファイルを参照して定義・実装された派生クラスと前記派生クラスのグローバルインスタンスを定義した派生クラスのインスタンスとを含むカスタムソフトウェア部と、を備え、ＲＯＭに格納されて実行される組み込みソフトウェアのカスタマイズ方法において、
前記ＲＯＭに前記組み込みソフトウェアを格納する時には、前記ベースソフトウェア部と前記カスタムソフトウェア部をリンクする組み込みソフトウェアＲＯＭ作成手順を実行し、
前記組み込みソフトウェア実行時には、前記基底クラスのコンストラクタ内で前記派生クラスのインスタンスおよびクラス名称を前記インスタンステーブルに登録し、コンパイル済みのモジュール内から前記派生クラスのインスタンスを呼び出す手順を実行することを特徴とする組み込みソフトウェアのカスタマイズ方法。
【請求項２】
基底クラスとクラスインスタンスのアドレスとそのクラス名称を格納するインスタンステーブルと前記インスタンステーブルへの登録関数および検索関数と実行制御コードとを含むベースソフトウェア部と、前記基底クラスのヘッダファイルを参照して定義・実装された派生クラスと前記派生クラスのグローバルインスタンスを定義した派生クラスのインスタンスとを含むカスタムソフトウェア部と、を備え、ＲＯＭに格納される組み込みソフトウェアによって制御される制御装置において、
前記ＲＯＭに前記組み込みソフトウェアを格納する時に、前記ベースソフトウェア部と前記カスタムソフトウェア部をリンクする組み込みソフトウェアＲＯＭ作成手順を実行する手段と、
前記組み込みソフトウェア実行時に、前記基底クラスのコンストラクタ内で前記派生クラスのインスタンスおよびクラス名称を前記インスタンステーブルに登録し、コンパイル済みのモジュール内から前記派生クラスのインスタンスを呼び出す手順を実行する手段と、を備えたことを特徴とする制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＲＯＭに格納されて実行される組み込みソフトウェアのカスタマイズ方法および当該ソフトウェアによって制御される制御装置に関する。
【背景技術】
【０００２】
制御装置内の機器に組み込まれるソフトウェアなど、中間製品に組み込むソフトウェアは、最終製品の要求に応じてカスタマイズされることが多い。例えば、産業用ロボットでは、ロボットマニピュレータの機械的構成は多種多彩であり、運動力学・逆運動力学を解くためのソフトウェアは機器に固有のアルゴリズムであるため、マニピュレータの種類に応じてそれを制御するソフトウェアの種類数も増えることになる。こうした多種類の機器のソフトウェア開発においては、従来、対象とする機器ごとに機器専用のソフトウェアを設計しなおすか、汎用的なソフトウェアを作り、対象機器に合わせてカスタマイズを行うといった設計手法をとっていた。また、ソフトウェアには予め予測しうるすべての機能を搭載し、パラメータ設定によって条件分岐を行って異なる複数の対象機器を制御することでカスタマイズするという設計手法もあった。
例えば、図５は、特許文献１におけるカスタマイズ方法のデータ構造を示しており、システムソフトウェア登録テーブル１５に格納されたプログラム実行アドレスを介して間接的にメインルーチンが実行されるようにプログラムし、サブルーチン実行登録テーブル１６に格納されたプログラム実行アドレスを介して間接的にサブルーチンが実行されるようにプログラムし、システムソフトウェア登録テーブル１５およびサブルーチン実行登録テーブル１６を変更してシステムソフトウェアのカスタマイズをするという手法をとっている。このように、従来、制御装置のシステムソフトウェアをカスタマイズする場合、登録テーブルに格納されたプログラムが実行アドレスを介して間接的に関数を呼び出すように作成しておいて、後からテーブルのアドレスを変更するという手法を用いていた。
【特許文献１】特開２００４−３４１６６７号公報（図２）
【発明の開示】
【発明が解決しようとする課題】
【０００３】
従来の技術では、例えばＣ言語でプログラミングをする際には、関数テーブルを指すポインタあるいは配列型変数で関数を呼び出す記述をしなければならず、関数ポインタを使った記述は関数を直接呼び出す記述に比べて複雑で、実際にどのような関数を呼んでいるのかをソースコードを広範囲に参照しないと理解しにくくなり、ソースコードレベルでのデバッグが直感的でなくなるなどコードの可読性を低めていた。
また、カスタマイズする部分以外のソフトウェアを変更すると予期しない不具合が潜む可能性が生じるので、中間製品の製造者と最終製品の製造者が異なる場合には、中間製品の製造者が最終製品の製造者に対してカスタマイズを許可したくない部分に関しては改変が不可能な形でソフトウェアを提供したいという要求があった。
本発明はこのような問題点に鑑みてなされたものであり、ソースコードの記述に特殊な記述方法を取らず、ベースソフトウェア部のソースコードを一切修正しないで、組み込みソフトウェアをカスタマイズするための方法を提供することを目的とする。
【課題を解決するための手段】
【０００４】
上記問題を解決するため、本発明は、次のようにしたのである。
請求項１に記載の発明は、基底クラスとクラスインスタンスのアドレスとそのクラス名称を格納するインスタンステーブルと前記インスタンステーブルへの登録関数および検索関数と実行制御コードとを含むベースソフトウェア部と、前記基底クラスのヘッダファイルを参照して定義・実装された派生クラスと前記派生クラスのグローバルインスタンスを定義した派生クラスのインスタンスとを含むカスタムソフトウェア部と、を備え、ＲＯＭに格納されて実行される組み込みソフトウェアのカスタマイズ方法において、前記ＲＯＭに前記組み込みソフトウェアを格納する時には、前記ベースソフトウェア部と前記カスタムソフトウェア部をリンクする組み込みソフトウェアＲＯＭ作成手順を実行し、前記組み込みソフトウェア実行時には、前記基底クラスのコンストラクタ内で前記派生クラスのインスタンスおよびクラス名称を前記インスタンステーブルに登録し、コンパイル済みのモジュール内から前記派生クラスのインスタンスを呼び出す手順を実行することを特徴とするものである。
請求項２に記載の発明は、基底クラスとクラスインスタンスのアドレスとそのクラス名称を格納するインスタンステーブルと前記インスタンステーブルへの登録関数および検索関数と実行制御コードとを含むベースソフトウェア部と、前記基底クラスのヘッダファイルを参照して定義・実装された派生クラスと前記派生クラスのグローバルインスタンスを定義した派生クラスのインスタンスとを含むカスタムソフトウェア部と、を備え、ＲＯＭに格納される組み込みソフトウェアによって制御される制御装置において、前記ＲＯＭに前記組み込みソフトウェアを格納する時に、前記ベースソフトウェア部と前記カスタムソフトウェア部をリンクする組み込みソフトウェアＲＯＭ作成手順を実行する手段と、前記組み込みソフトウェア実行時に、前記基底クラスのコンストラクタ内で前記派生クラスのインスタンスおよびクラス名称を前記インスタンステーブルに登録し、コンパイル済みのモジュール内から前記派生クラスのインスタンスを呼び出す手順を実行する手段と、を備えたことを特徴とするものである。
【発明の効果】
【０００５】
本発明によると、ソースコードの記述に特殊な記述方法を取らず、ベースソフトウェア部のソースコードを一切修正しないで、組み込みソフトウェアをカスタマイズすることができる。
【発明を実施するための最良の形態】
【０００６】
以下、本発明の方法の具体的実施例について、図に基づいて説明する。
【実施例１】
【０００７】
図１は、本発明の方法を実施する組み込みソフトウェアの構成を示すブロック図である。図において、１１はカスタマイズを施すベースとなるベースソフトウェア部、１２はカスタムソフトウェア部である。ベースソフトウェア部は、基底クラスのコード１１１、クラスインスタンスのアドレスとそのクラス名称を登録／参照するインスタンステーブル１１２、テーブル登録関数１１３、テーブル検索関数１１４、実行制御コード１１５やその他のコードおよびデータで構成される。また、カスタムソフトウェア部１２は、派生クラスのインスタンス１２１、派生クラスのコード１２２で構成される。
【０００８】
図２は、本発明の組み込みソフトウェアＲＯＭ作成手順を示すフローである。図２において、２１は  ベースソフトウェア部作成手順、２２はカスタムソフトウェア部作成手順、２３は組み込みソフトウェア作成手順である。組み込みソフトウェアＲＯＭ作成手順２３は、主にベースソフトウェア部作成手順２１と、カスタムソフトウェア部作成手順２２からなる。
ベースソフトウェア部は、次の手順で作成する。開発者はプログラミング言語Ｃ＋＋を用いてプログラムを作成し（ステップ２１１）、Ｃ＋＋コンパイラを用いてオブジェクトコードに変換する（ステップ２１２）。一般に、Ｃ＋＋言語のソースコードは、クラス関数やクラス変数の定義のみを宣言するヘッダファイルと、ヘッダファイルで宣言したクラス関数の処理を実装するソースファイルとに分けて記述される。ベースソフトウェア部のプログラムのソースコードは開発者によって機能ごとに複数に分割される。カスタマイズ対象となるクラスの基底クラスも、この中のひとつとして作成される。各ソースコードはコンパイラを使ってソースコード単位でオブジェクトコードに変換される。いくつかのオブジェクトコードをまとめてオブジェクトライブラリとすることがあり（ステップ２１３および２１４）、単にひとつのオブジェクトコードをオブジェクトライブラリとすることもある。複数のオブジェクトコードまたはオブジェクトライブラリをリンク対象のファイルとして指定し、リンカを呼び出すことによって結合し（ステップ２１５）、コンパイル済みのオブジェクトモジュールとしてベースソフトウェア部を作成する（ステップ２１６）。カスタムソフトウェア部作成手順２２も、ベースソフトウェア部作成手順２１と同様のステップで行うので説明は省略する。
組み込みソフトウェアＲＯＭ作成は、次の手順で行う。上記の手順で作成したベースソフトウェア部と、上記手順で作成したカスタムソフトウェア部とをリンク対象のファイルとして指定し、ベースソフトウェア部作成手順２１と同様のリンク手順と同じ手順でリンカを呼び出してリンクする（ステップ２３２）。
【０００９】
図４は、カスタムソフトウェア部のソースコード作成方法を示す概念図とコード例である。カスタムソフトウェア部のソースコードは、次の手順で作成する。カスタマイズ対象となるクラスの、基底クラス４１のヘッダファイル４１１を参照して、そのクラスから派生クラス４２を作成する。Ｃ＋＋では、基底クラスの仮想関数（例ではｍｅｔｈｏｄ１）に対して派生クラスのヘッダファイル内（例では４２１）で同一関数（例ではｍｅｔｈｏｄ１）を宣言し、派生クラスのソースファイル４２２内で関数を実装することで、基底クラスの仮想関数の動作をオーバライドすることができる。また、派生クラスのソースファイル４２２には、その派生クラスのインスタンスをグローバルなインスタンスとして記述しておく。（例では「Ｄｅｒｉｖｅｄ  ｄ；」の記述）
基底クラスのコンストラクタ関数（例では４１２）は、文字列型の引数を取り、関数内では引数の文字列とｔｈｉｓポインタをテーブル登録関数３２１（４１２の例ではＲｅｓｉｓｔｅｒＩｎｓｔａｎｃｅ（））を呼び出してテーブルに登録する処理を記述しておく。派生クラスのデフォルトコンストラクタは、基底クラスの引数つきコンストラクタ関数を、自クラスを一意に特定する文字列（通常、クラス名）を引数に指定して実行する（例では４２２）。
このように記述することで、派生クラスの中にテーブル登録関数の呼び出しを記述することなく、派生クラスのグローバルなインスタンスとして定義することで、派生クラスのデフォルトコンストラクタが呼ばれる際に、テーブルへの登録が完了する。実行制御コード（例では４３１）は、テーブル検索関数（例ではＦｉｎｄＩｎｓｔａｎｃｅ（））を用いて派生クラスへのポインタを取得する。基底クラスを派生して作られた派生クラスのインスタンスのポインタは、基底クラスのポインタと同等に用いることができるので、基底クラスのポインタ変数に代入することができる。（例では「Ｂａｓｅ  ＊ｐＡ  ＝  ＦｉｎｄＩｎｓｔａｎｃｅ（ｎａｍｅ）；」の記述）このポインタ変数を使用して基底クラスの関数を呼び出すと、派生クラスの関数が実行される（例では「ｐＡ−＞ｍｅｔｈｏｄ１（）；」の記述）。このため、派生クラスのインスタンスのポインタをインスタンステーブルから取得して、基底クラスのポインタとして使用しても、ベースソフトウェアのソースコードは一切修正する必要がない。
【００１０】
図３は、本発明におけるソフトウェア実行の手順である。
Ｃ＋＋で記述されたソフトウェアの実行時には、まず、グローバルなクラスインスタンスが生成され（ステップ３４１）、それらのコンストラクタが実行される。したがって、カスタムソフトウェア部１２に存在する派生クラスのインスタンス１２１のコンストラクタ３３１が実行されることになるが、このとき、Ｃ＋＋の言語仕様に則り、まず基底クラスのコンストラクタ３１１が呼び出される（ステップ３４２）。基底クラスのコンストラクタ内３１１では、ベースソフトウェア部１２に存在するインスタンステーブル１１２に呼び出し元クラスのインスタンスを示すｔｈｉｓポインタと、クラス名称文字列を対にしてテーブルへ登録する処理が実行される（ステップ３４３）。次に、派生クラスのコンストラクタ３３１が実行される（ステップ３４４）。その後、エントリ関数の起動を経てベースソフトウェア部に存在する実行制御コード１１３が実行される（ステップ３４５）。インスタンステーブルから派生クラスを検索するときのクラス名称文字列は、例えば、ベースソフトウェア部を作成する前に予め決めておき、カスタムソフトウェア部を作成する開発者に伝えておけば、実行制御コードのソースコードに既に記述されている。（ステップ３４６）。あるいは、同じ基底クラスから派生して作成した複数の異なるカスタムソフトウェア部をリンクして組み込みソフトウェア部を作成し、実行時にいずれの派生クラスを使用するかを決定することも可能である。実行時にどのクラスを実行するかは、ＳＲＡＭやＦＬＡＳＨ−ＲＯＭなど、ＲＯＭ作成後にも変更可能な記憶領域を機器に持たせておいて、その記憶領域に名称文字列を記録し、実効制御コードが起動時に読み出すようにしてもよい（４３１の例では、「ｃｏｎｓｔ  ｃｈａｒ＊  ｎａｍｅ  ＝  ＧｅｔＰａｒａｍ（）；」の記述）。実行制御コード１１３が派生クラスへのポインタを取得するには、インスタンステーブル１１２から、テーブル検索関数３２２を呼び出し、名称文字列により必要とするクラスのインスタンスを検索する（ステップ３４７）。インスタンステーブル内にクラス名称が一致する項があれば、テーブル検索関数３２２からそのインスタンスのポインタを得ることができる。このようにして、カスタムソフトウェア部に存在する実行制御コード１１３が、カスタムソフトウェア部１２に存在する派生クラスのコード１２２を呼び出すことができるのである（ステップ３４８）。
ベースソフトウェア部の開発者は、ベースソフトウェア部の作成時にはカスタムソフトウェア部を必要としない。また、カスタムソフトウェア部の開発者は、カスタムソフトウェア部の作成時にはベースソフトの基本クラスのヘッダファイル以外はベースソフトウェアのソースコードを必要としない。組み込みソフトウェアＲＯＭを作成時には、ベースソフトウェア部とカスタムソフトウェア部をリンクするのみで、ソースコードの記述等は必要ない。したがって、カスタムソフトウェア部の開発者にはカスタムソフトウェア部をコンパイル済みのバイナリオブジェクトモジュールとして渡すことができ、カスタマイズソフトウェア部の開発者がベースソフトウェア部を変更することは不可能な状態にすることもできる。
【００１１】
このように、基底クラスとインスタンステーブルをベースソフトウェア部に持ち、派生クラスとそのインスタンスをカスタムソフトウェア部に持たせ、基底クラスのコンストラクタで派生クラスのインスタンスをテーブルに登録するという手順をとったので、ソースコードの記述に特殊な記述方法を取らず、ベースソフトウェア部のソースコードを一切修正しないで、組み込みソフトウェアをカスタマイズすることができるのである。
【産業上の利用可能性】
【００１２】
制御装置だけでなく、ＲＯＭに格納されて実行される組み込みソフトウェア全般に適用できる。
【図面の簡単な説明】
【００１３】
【図１】本発明の方法を実施する組み込みソフトウェアの構成を示すブロック図
【図２】本発明の組み込みソフトウェアＲＯＭ作成手順を示すフロー
【図３】本発明におけるソフトウェア実行の手順
【図４】カスタムソフトウェア部のソースコード作成方法を示す概念図とコード例
【図５】従来のカスタマイズ方法のデータ構造を示したブロック図
【符号の説明】
【００１４】
１０  組み込みソフトウェア
１１  ベースソフトウェア部
１２  カスタムソフトウェア部
１１１  基底クラスのコード
１１２  インスタンステーブル
１１３  テーブル登録関数
１１４  テーブル検索関数
１１５  実行制御コード
１２１  派生クラスのインスタンス
１２２  派生クラスのコード
【図１】
2007279918.tif 000003
【図２】
2007279918.tif 000004
【図３】
2007279918.tif 000005
【図４】
2007279918.tif 000006
【図５】
2007279918.tif 000007