(57)【特許請求の範囲】
【請求項１】
複数の外部センサからのセンサ値に基づいて、あらかじめ与えられた複数の関数を実行することにより複数のアクチュエータを制御する制御装置と、前記制御装置に対し実行するべき関数を提供する関数提供装置と、を備えた制御システムであって、
（Ａ）前記関数提供装置は、
複数の関数を含み、
各前記関数は、前記複数の外部センサと、前記複数の関数のうち前記関数と異なる他の関数と、のうち少なくとも１つを入力引数として指定し、
前記複数の関数のうちの少なくとも１つは、前記複数のアクチュエータのうちの少なくとも１つを出力引数として指定した
プログラムの入力を受け付けるプログラム入力受付部と、
関数の識別情報を複数記憶する識別情報記憶部と、
前記識別情報記憶部を検索することにより、前記プログラム入力受付部に入力された前記プログラムに含まれる各前記関数のうち前記識別情報記憶部にマッチする識別情報が記憶されていない関数を検出する関数検出部と、
検出された関数の識別情報を前記識別情報記憶部に登録する識別情報登録部と、
前記検出された関数を前記制御装置に提供する関数提供部と、を有し、
（Ｂ）前記制御装置は、
前記関数提供装置から、前記関数の提供を受け付ける関数受付部と、
前記関数受付部で受け付けた各関数を記憶保持する関数記憶保持部と、
前記関数記憶保持部で保持される各前記関数の各々について、前記関数の入力引数を受信し、前記関数を実行する関数実行部と、
前記複数の外部センサに対応する複数の第１チャネルを管理し、前記複数の外部センサから前記複数の第１チャネルを介して前記センサ値を受信し、各前記第１チャネルに対応して受信したセンサ値を、各前記第１チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行部に送信する第１チャネル管理部と、
前記複数のアクチュエータに対応する複数の第２チャネルを管理し、各前記第２チャネルを介して受け取った値を各々対応する前記アクチュエータに送信する第２チャネル管理部と、
前記関数記憶保持部に保持される各関数のうち前記出力引数を含む関数について、前記出力引数の値を、前記出力引数に指定されたアクチュエータに対応する前記第２チャネルを指定して前記第２チャネル管理部に送信する出力引数送信処理部と、
前記関数受付部で受け付けた関数について、第３チャネルを生成する第３チャネル生成部と、
前記第３チャネル生成部により生成された複数の前記第３チャネルを管理し、各前記第３チャネルを介して受信した値を各前記第３チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行部に送信する第３チャネル管理部と、
前記関数記憶保持部に保持される各前記関数の実行により得られた前記関数の出力値を各前記関数に対応する前記第３チャネルを指定して前記第３チャネル管理部に送信する関数出力送信処理部と、
前記関数受付部で受け付けた関数について、前記関数における入力引数に指定された前記外部センサまたは前記他の関数に対応する第１チャネルまたは第３チャネルを特定し、特定した第１チャネルまたは第３チャネルを介して受信された値を前記関数の入力引数として前記関数実行部に送信することを前記第１チャネル管理部または第３チャネル管理部に指示する送信指示部と、を有する
ことを特徴とする制御システム。
【請求項２】
前記識別情報記憶部に記憶される各前記関数の識別情報は、各前記関数の文字列であり、
前記関数提供装置は、前記プログラムに含まれる前記関数の文字列を正規化する正規化部をさらに有し、
前記関数提供装置における前記関数検出部は、正規化された文字列に基づき前記識別情報記憶部を検索し、
前記関数提供装置における前記識別情報登録部は、前記正規化された文字列にマッチする文字列が記憶されていないとき、前記正規化された文字列を前記識別情報記憶部に登録し、
前記関数提供装置における前記関数提供部は、前記正規化された文字列からなる関数を前記制御装置に提供する、
ことを特徴とする請求項１に記載の制御システム。
【請求項３】
前記識別情報記憶部に記憶される各前記関数の識別情報は、各前記関数の符号表現であり、
前記関数提供装置は、前記プログラムに含まれる前記関数を符号化して符号表現を得る符号化部をさらに有し、
前記関数提供装置における前記関数検出部は、前記プログラムに含まれる前記関数について得られた符号表現に基づき前記識別情報記憶部を検索し、
前記関数提供装置における前記識別情報登録部は、前記関数検出部により検出された関数について、前記関数の符号表現を前記識別情報記憶部に登録する、
ことを特徴とする請求項１または２に記載の制御システム。
【請求項４】
複数の前記制御装置を備え、
前記関数提供装置は、前記検出された関数を実行するべき制御装置を選択する実行先選択部をさらに備え、
前記関数提供部は、前記検出された関数を前記実行先選択部により選択された制御装置に提供する
ことを特徴とする請求項１ないし３のいずれか一項に記載の制御システム。
【請求項５】
複数の前記制御装置はネットワークを介して互いに接続され、
各前記制御装置は、異なる前記外部センサおよび異なる前記アクチュエータに接続され、  
前記制御装置における前記出力引数送信処理部は、前記第２チャネルが他の前記制御装置に存在するとき、前記他の制御装置における前記第２チャネル管理部に前記送信を行い、
前記制御装置における前記第１チャネル管理部は、前記あらかじめ指定された関数が前記他の制御装置に存在するとき、前記他の制御装置における前記関数実行部に前記送信を行い、
前記制御装置における前記第３チャネル管理部は、前記あらかじめ指定された関数が前記他の制御装置に存在するとき、前記他の制御装置における前記関数実行部に前記送信を行い、
前記制御装置における前記送信指示部は、前記第１チャネルまたは第３チャネルが前記他の制御装置に存在するとき、前記他の制御装置における前記第１チャネル管理部または第３チャネル管理部に指示を行う
ことを特徴とする請求項４に記載の制御システム。
【請求項６】
前記関数提供装置の前記実行先選択部は、前記検出された関数により指定される入力引数および出力引数に対応する前記第１チャネルおよび前記第３チャネルを、最も多くまたは閾値以上有する制御装置を選択することを特徴とする請求項４または５に記載の制御システム。
【請求項７】
前記関数提供装置における前記実行先選択部は、前記複数の制御装置のうち最も低いまたは閾値以下の負荷をもつ制御装置を選択することを特徴とする請求項４ないし６のいずれか一項に記載の制御システム。
【請求項８】
前記関数提供装置は、
前記プログラム入力受付部と、前記関数提供部とを含む要求配置装置と、
前記識別情報記憶部と、前記関数検出部と、前記識別情報登録部とを含むインデックス装置とからなり、
前記要求配置装置は、前記プログラムに含まれる各前記関数の識別情報が識別情報記憶部に登録されているか否かの検査を前記インデックス装置に対して要求し、前記インデックス装置から前記各関数が登録済みか否かを示す検査結果の通知を受ける検査要求部をさらに有し、
前記インデックス装置における前記関数検出部は、前記要求配置装置からの検査要求を受けて前記識別情報記憶部を検索し、前記検査結果を前記要求配置装置に通知する
ことを特徴とする請求項１ないし７のいずれか一項に記載の制御システム。
【請求項９】
複数の外部センサからのセンサ値に基づいて、あらかじめ与えられた複数の関数を実行することにより複数のアクチュエータを制御する制御装置であって、
外部の関数提供装置から、
前記複数の外部センサと、１つ以上のある関数と、のうちの少なくとも１つを入力引数として指定した関数と、
前記複数の外部センサと、１つ以上のある関数と、のうちの少なくとも１つを入力引数として指定し、かつ、前記複数のアクチュエータのうちの少なくとも１つを出力引数として指定した関数と
の提供を受け付ける関数受付部と、
前記関数受付部で受け付けた各関数を記憶保持する関数記憶保持部と、
前記関数記憶保持部で保持される各前記関数の各々について、前記関数の入力引数を受信し、前記関数を実行する関数実行部と、
前記複数の外部センサに対応する複数の第１チャネルを管理し、前記複数の外部センサから前記複数の第１チャネルを介して前記センサ値を受信し、各前記第１チャネルに対応して受信したセンサ値を、各前記第１チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行部に送信する第１チャネル管理部と、
前記複数のアクチュエータに対応する複数の第２チャネルを管理し、各前記第２チャネルを介して受け取った値を各々対応する前記アクチュエータに送信する第２チャネル管理部と、
前記関数記憶保持部に保持される各関数のうち前記出力引数を含む関数について、前記出力引数の値を、前記出力引数に指定されたアクチュエータに対応する前記第２チャネルを指定して前記第２チャネル管理部に送信する出力引数送信処理部と、
前記関数受付部で受け付けた関数について、第３チャネルを生成する第３チャネル生成部と、
前記第３チャネル生成部により生成された複数の前記第３チャネルを管理し、各前記第３チャネルを介して受信した値を各前記第３チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行部に送信する第３チャネル管理部と、
前記関数記憶保持部に保持される各前記関数の実行により得られた前記関数の出力値を各前記関数に対応する前記第３チャネルを指定して前記第３チャネル管理部に送信する関数出力送信処理部と、
前記関数受付部で受け付けた関数について、前記関数における入力引数に指定された前記外部センサまたは前記ある関数に対応する第１チャネルまたは第３チャネルを特定し、特定した第１チャネルまたは第３チャネルを介して受信された値を前記関数の入力引数として前記関数実行部に送信することを前記第１チャネル管理部または第３チャネル管理部に指示する送信指示部と、
を備えた制御装置。
【請求項１０】
複数の各外部センサからのセンサ値に基づいて、複数のアクチュエータを制御する制御方法であって、
複数の関数を含み、
各前記関数は、前記複数の外部センサと、前記複数の関数のうち前記関数と異なる他の関数と、のうち少なくとも１つを入力引数として指定し、
前記複数の関数のうちの少なくとも１つは、前記複数のアクチュエータのうちの少なくとも１つを出力引数として指定した
プログラムの入力を受け付けるプログラム入力受付ステップと、
関数の識別情報を複数記憶する識別情報記憶部を検索することにより、前記プログラム入力受付ステップに入力された前記プログラムに含まれる各前記関数のうち前記識別情報記憶部に識別情報が記憶されていない関数を検出する関数検出ステップと、
検出された関数の識別情報を前記識別情報記憶部に登録する関数登録ステップと、
前記関数検出ステップで検出された各関数を記憶保持する関数記憶保持ステップと、
前記関数記憶保持ステップで保持される各前記関数の各々について、前記関数の入力引数を受信し、前記関数を実行する関数実行ステップと、
前記複数の外部センサに対応する複数の第１チャネルを管理し、前記複数の外部センサから前記複数の第１チャネルを介して前記センサ値を受信し、各前記第１チャネルに対応して受信したセンサ値を、各前記第１チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行ステップに送信する第１チャネル管理ステップと、
前記複数のアクチュエータに対応する複数の第２チャネルを管理し、各前記第２チャネルを介して受け取った値を各々対応する前記アクチュエータに送信する第２チャネル管理ステップと、
前記関数記憶保持ステップで保持される各関数のうち前記出力引数を含む関数について、前記出力引数の値を、前記出力引数に指定されたアクチュエータに対応する前記第２チャネルを指定して前記第２チャネル管理ステップに送信する出力引数送信処理ステップと、
前記関数検出ステップで検出された関数について、第３チャネルを生成する第３チャネル生成ステップと、
前記第３チャネル生成ステップにより生成された複数の前記第３チャネルを管理し、各前記第３チャネルを介して受信した値を各前記第３チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行ステップに送信する第３チャネル管理ステップと、
前記関数記憶保持ステップに保持される各前記関数の実行により得られた前記関数の出力値を各前記関数に対応する前記第３チャネルを指定して前記第３チャネル管理ステップに送信する関数出力送信処理ステップと、
前記関数受付ステップで受け付けた関数について、前記関数における入力引数に指定された前記外部センサまたは前記他の関数に対応する第１チャネルまたは第３チャネルを特定し、特定した第１チャネルまたは第３チャネルを介した受信した値を前記関数の入力引数として前記関数実行ステップに送信するように前記第１チャネル管理ステップまたは第３チャネル管理ステップに指示する送信指示ステップと、
を備えたことを特徴とする制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、外部センサに基づいてアクチュエータを制御する制御システム、制御装置および制御方法に関する。
【背景技術】
【０００２】
センサネットワーク応用において、多数のコンピュータに対して柔軟かつ効率的な動作指示を行うことは困難である。利用方法について事前の設計が困難である場合、例えば多様なユーザからの利用を想定する場合には、日々変わる要求に応えるためのシステムを構築することは難しい。
【０００３】
特開２００６−３４４０１７号 「センサネットワークシステム及びセンサネットワークのデータ処理方法」(日立製作所) は、階層化されたプログラム(スクリプト) をネットワークで接続されたノード間に展開することにより、多数の機器を柔軟にプログラミングする、という課題に取り組んでいる。
【特許文献１】特開２００６−３４４０１７号
【発明の開示】
【発明が解決しようとする課題】
【０００４】
特開２００６−３４４０１７号を含む従来の方式では、多数のユーザが各個にプログラムを記述した場合、類似したプログラムが個々のデバイスに投入されることが考えられる。例えば、センサネットワーク応用において、ある一定領域の温度センサの平均値を取得するといった一般的な処理は、多数のユーザが行うものと考えられる。
【０００５】
この時、多数のユーザが同じ、あるいは類似したプログラムを多数投入することにより、元々少ないセンサノードまたは中継ノードの処理容量を使い切ってしまうことが考えられる。
【０００６】
本発明は、各ユーザからの多数のプログラムを同一の環境で動作させるとき効率良いプログラムの実行を可能とした制御システム、制御装置および制御方法を提供する。
【課題を解決するための手段】
【０００７】
本発明の一態様としての制御システムは、
複数の外部センサからのセンサ値に基づいて、あらかじめ与えられた複数の関数を実行することにより複数のアクチュエータを制御する制御装置と、前記制御装置に対し実行するべき関数を提供する関数提供装置と、を備えた制御システムであって、
（Ａ）前記関数提供装置は、
複数の関数を含み、
各前記関数は、前記複数の外部センサと、前記複数の関数のうち前記関数と異なる他の関数と、のうち少なくとも１つを入力引数として指定し、
前記複数の関数のうちの少なくとも１つは、前記複数のアクチュエータのうちの少なくとも１つを出力引数として指定した
プログラムの入力を受け付けるプログラム入力受付部と、
関数の識別情報を複数記憶する識別情報記憶部と、
前記識別情報記憶部を検索することにより、前記プログラム入力受付部に入力された前記プログラムに含まれる各前記関数のうち前記識別情報記憶部にマッチする識別情報が記憶されていない関数を検出する関数検出部と、
検出された関数の識別情報を前記識別情報記憶部に登録する識別情報登録部と、
前記検出された関数を前記制御装置に提供する関数提供部と、を有し、
（Ｂ）前記制御装置は、
前記関数提供装置から、前記関数の提供を受け付ける関数受付部と、
前記関数受付部で受け付けた各関数を記憶保持する関数記憶保持部と、
前記関数記憶保持部で保持される各前記関数の各々について、前記関数の入力引数を受信し、前記関数を実行する関数実行部と、
前記複数の外部センサに対応する複数の第１チャネルを管理し、前記複数の外部センサから前記複数の第１チャネルを介して前記センサ値を受信し、各前記第１チャネルに対応して受信したセンサ値を、各前記第１チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行部に送信する第１チャネル管理部と、
前記複数のアクチュエータに対応する複数の第２チャネルを管理し、各前記第２チャネルを介して受け取った値を各々対応する前記アクチュエータに送信する第２チャネル管理部と、
前記関数記憶保持部に保持される各関数のうち前記出力引数を含む関数について、前記出力引数の値を、前記出力引数に指定されたアクチュエータに対応する前記第２チャネルを指定して前記第２チャネル管理部に送信する出力引数送信処理部と、
前記関数受付部で受け付けた関数について、第３チャネルを生成する第３チャネル生成部と、
前記第３チャネル生成部により生成された複数の前記第３チャネルを管理し、各前記第３チャネルを介して受信した値を各前記第３チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行部に送信する第３チャネル管理部と、
前記関数記憶保持部に保持される各前記関数の実行により得られた前記関数の出力値を各前記関数に対応する前記第３チャネルを指定して前記第３チャネル管理部に送信する関数出力送信処理部と、
前記関数受付部で受け付けた関数について、前記関数における入力引数に指定された前記外部センサまたは前記他の関数に対応する第１チャネルまたは第３チャネルを特定し、特定した第１チャネルまたは第３チャネルを介して受信された値を前記関数の入力引数として前記関数実行部に送信することを前記第１チャネル管理部または第３チャネル管理部に指示する送信指示部と、を有する
ことを特徴とする。
【０００８】
本発明の一態様としての制御装置は、
複数の外部センサからのセンサ値に基づいて、あらかじめ与えられた複数の関数を実行することにより複数のアクチュエータを制御する制御装置であって、
外部の関数提供装置から、
前記複数の外部センサと、１つ以上のある関数と、のうちの少なくとも１つを入力引数として指定した関数と、
前記複数の外部センサと、１つ以上のある関数と、のうちの少なくとも１つを入力引数として指定し、かつ、前記複数のアクチュエータのうちの少なくとも１つを出力引数として指定した関数と
の提供を受け付ける関数受付部と、
前記関数受付部で受け付けた各関数を記憶保持する関数記憶保持部と、
前記関数記憶保持部で保持される各前記関数の各々について、前記関数の入力引数を受信し、前記関数を実行する関数実行部と、
前記複数の外部センサに対応する複数の第１チャネルを管理し、前記複数の外部センサから前記複数の第１チャネルを介して前記センサ値を受信し、各前記第１チャネルに対応して受信したセンサ値を、各前記第１チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行部に送信する第１チャネル管理部と、
前記複数のアクチュエータに対応する複数の第２チャネルを管理し、各前記第２チャネルを介して受け取った値を各々対応する前記アクチュエータに送信する第２チャネル管理部と、
前記関数記憶保持部に保持される各関数のうち前記出力引数を含む関数について、前記出力引数の値を、前記出力引数に指定されたアクチュエータに対応する前記第２チャネルを指定して前記第２チャネル管理部に送信する出力引数送信処理部と、
前記関数受付部で受け付けた関数について、第３チャネルを生成する第３チャネル生成部と、
前記第３チャネル生成部により生成された複数の前記第３チャネルを管理し、各前記第３チャネルを介して受信した値を各前記第３チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行部に送信する第３チャネル管理部と、
前記関数記憶保持部に保持される各前記関数の実行により得られた前記関数の出力値を各前記関数に対応する前記第３チャネルを指定して前記第３チャネル管理部に送信する関数出力送信処理部と、
前記関数受付部で受け付けた関数について、前記関数における入力引数に指定された前記外部センサまたは前記ある関数に対応する第１チャネルまたは第３チャネルを特定し、特定した第１チャネルまたは第３チャネルを介して受信された値を前記関数の入力引数として前記関数実行部に送信することを前記第１チャネル管理部または第３チャネル管理部に指示する送信指示部と、
を備えたことを特徴とする。
【０００９】
本発明の一態様としての制御方法は、
複数の各外部センサからのセンサ値に基づいて、複数のアクチュエータを制御する制御方法であって、
複数の関数を含み、
各前記関数は、前記複数の外部センサと、前記複数の関数のうち前記関数と異なる他の関数と、のうち少なくとも１つを入力引数として指定し、
前記複数の関数のうちの少なくとも１つは、前記複数のアクチュエータのうちの少なくとも１つを出力引数として指定した
プログラムの入力を受け付けるプログラム入力受付ステップと、
関数の識別情報を複数記憶する識別情報記憶部を検索することにより、前記プログラム入力受付ステップに入力された前記プログラムに含まれる各前記関数のうち前記識別情報記憶部に識別情報が記憶されていない関数を検出する関数検出ステップと、
検出された関数の識別情報を前記識別情報記憶部に登録する関数登録ステップと、
前記関数検出ステップで検出された各関数を記憶保持する関数記憶保持ステップと、
前記関数記憶保持ステップで保持される各前記関数の各々について、前記関数の入力引数を受信し、前記関数を実行する関数実行ステップと、
前記複数の外部センサに対応する複数の第１チャネルを管理し、前記複数の外部センサから前記複数の第１チャネルを介して前記センサ値を受信し、各前記第１チャネルに対応して受信したセンサ値を、各前記第１チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行ステップに送信する第１チャネル管理ステップと、
前記複数のアクチュエータに対応する複数の第２チャネルを管理し、各前記第２チャネルを介して受け取った値を各々対応する前記アクチュエータに送信する第２チャネル管理ステップと、
前記関数記憶保持ステップで保持される各関数のうち前記出力引数を含む関数について、前記出力引数の値を、前記出力引数に指定されたアクチュエータに対応する前記第２チャネルを指定して前記第２チャネル管理ステップに送信する出力引数送信処理ステップと、
前記関数検出ステップで検出された関数について、第３チャネルを生成する第３チャネル生成ステップと、
前記第３チャネル生成ステップにより生成された複数の前記第３チャネルを管理し、各前記第３チャネルを介して受信した値を各前記第３チャネルに対して各々あらかじめ指定された関数の入力引数として前記関数実行ステップに送信する第３チャネル管理ステップと、
前記関数記憶保持ステップに保持される各前記関数の実行により得られた前記関数の出力値を各前記関数に対応する前記第３チャネルを指定して前記第３チャネル管理ステップに送信する関数出力送信処理ステップと、
前記関数受付ステップで受け付けた関数について、前記関数における入力引数に指定された前記外部センサまたは前記他の関数に対応する第１チャネルまたは第３チャネルを特定し、特定した第１チャネルまたは第３チャネルを介した受信した値を前記関数の入力引数として前記関数実行ステップに送信するように前記第１チャネル管理ステップまたは第３チャネル管理ステップに指示する送信指示ステップと、
を備えたことを特徴とする。
【発明の効果】
【００１０】
本発明により、各ユーザからの多数のプログラムを同一の環境で動作させるとき効率良いプログラムの実行が可能となる。
【発明を実施するための最良の形態】
【００１１】
以下、図面を参照しながら、本発明の実施の形態について説明する。
【００１２】
図１は、本発明の一実施の形態としての制御システム（分散処理システム）の構成を示すブロック図である。多数の作用装置（センサおよびアクチュエータ）１１ａ〜１１ｄ、多数の要求処理装置（制御装置）２１ａ〜２１ｃ、多数のユーザ装置３１ａ〜３１ｂが存在する中、一つの要求配置装置４１（または冗長化され連動する一組の要求配置装置）が、これらを統括する。要求配置装置４１とインデックス装置５１とは関数提供装置をなしている。以下ではまず本システムの概要について説明し、その後、各構成要素の詳細について説明する。
【００１３】
作用装置１１ａ、１１ｂはセンサ、作用装置１１ｃ、１１ｄはアクチュエータであり、これらの作用装置は、環境との相互作用を行う機能を持つ装置である。各作用装置は、要求処理装置（制御装置）と通信する通信機能を持ち、より詳細には、要求処理装置（制御装置）２１ａ〜２１ｃにより管理されるチャネルとの間で相互作用を行うことで通信を行う。個々の作用装置は一意な識別子（ID） を持ち、そのID から算出される識別子をもつチャネル（たとえばそのIDと同一名のチャネル）と相互作用を行う。識別子はたとえばＩＰアドレス、ＭＡＣアドレスを用いてもよいし、その他の指標を用いてもよい。作用装置がセンサの場合は、センサ値（観測値）をチャネルに出力し、作用装置がアクチュエータの場合はチャネルから与えられる命令を受けて動作する。後述のように、センサと通信するチャネルは、第１識別子を有する第１チャネル、アクチュエータと通信するチャネルは、第２識別子を有する第２チャネルに相当する。
【００１４】
要求処理装置（制御装置）２１ａ〜２１ｃは、一つの要求配置装置４１によって利用される。個々の要求処理装置（制御装置）は、例えばビル管理ネットワークにおけるフロアコントローラに相当し、ネットワークを介して互いに通信可能に接続されている。個々の要求処理装置（制御装置）は、各々が担当される作用装置と、IP( インターネットプロトコル) あるいはBACnet( バックネットASHRAE の商標) などにより接続されている。個々の作用装置は、要求処理装置（制御装置）２１ａ〜２１ｃのいずれかに接続されている。各作用装置に関係するチャネルはそれぞれ担当する要求処理装置（制御装置）において登録（作成）されている。
【００１５】
要求処理装置（制御装置）２１ａ〜２１ｃは、各センサからのセンサ値に基づき関数（要求処理関数）を実行することにより各アクチュエータを制御する。要求処理装置（制御装置）２１ａ〜２１ｃは、ユーザ装置３１ａ〜３１ｂと作用装置１１ａ〜１１ｄとの間に介在し、ユーザ装置により要求配置装置４１を介して与えられた要求処理関数を実体化する。すなわち要求処理装置（制御装置）２１ａ〜２１ｃは、該要求処理関数を保持し、該関数を、関連するチャネルに関連づけ、所望のタイミングで実行する。要求処理装置（制御装置）の構成例を図２に示す。
【００１６】
要求処理装置（制御装置）はPublish-subscribeブローカ１０１と要求処理関数実行環境１０２とを備える。Publish-subscribeブローカ１０１は、第１チャネル管理部、第２チャネル管理理部、第３チャネル管理部、を含んでいる。要求処理関数実行環境１０２は、関数受付部、関数保持部、関数実行部、第３チャネル生成部、関数出力送信処理部、送信指示部を含んでいる。
【００１７】
Publish-subscribeブローカ１０１は、各作用装置が利用するチャネル、および要求処理関数が利用するチャネルを管理する。要求処理関数実行環境１０２は複数の要求処理関数の実体化を行う。
【００１８】
各作用装置および要求処理関数間でのデータの送受信はPublish-subscribeブローカ１０１により管理されるチャネルを介して行われる。すなわち、データの送受信はチャネルを介して行われ、要求処理関数はチャネルからデータを受け取りチャネルにデータを送出する。またセンサはチャネルにデータを送出し、アクチュエータはチャネルからデータを受け取る。
【００１９】
センサからデータを受信し受信したデータを要求処理関数に渡すチャネルは第１チャネル、要求処理関数から関数の出力値を受信し受信した出力値を他の要求処理関数に渡すチャネルは第３チャネル、要求処理関数から出力引数の値を受信し受信した値をアクチュエータに渡すチャネルは第２チャネルに相当する。図では、１０１ａが第１チャネル、１０１ｂが第３チャネル、１０１ｃが第２チャネルを示す。第３チャネルは、出力値の送信元である要求処理関数の記述からなる識別子（第３識別子）を有する。第１〜第３チャネルはそれぞれ第１〜第３チャネル管理部によって管理される。
【００２０】
ここでチャネルとは、本システムが前提とするPublish-Subscribe モデルに基づく仮想的な通信路のことである。データの生成者と需要者はチャネルを経由してデータを交換する。実際には要求処理装置（制御装置）がいわゆるブローカの役目を担い、生成者（たとえばセンサ、および要求処理関数）と需要者（たとえばアクチュエータ、および要求処理関数）との通信を仲立ちする。
【００２１】
このモデルは、通常の要求-応答モデルと異なり、需要者は、事前に必要なデータが流れるチャネルに対して自分自身の情報を登録し、個々のデータが流れたタイミングでそれぞれのデータを受信する。以後、チャネルにデータを送出することを「パブリッシュ」、チャネルに送信されたデータを受信できるように需要者の情報をチャネルに登録することを「サブスクライブ」と呼ぶことがある。チャネルを介した通信は、同一の要求処理装置（制御装置）内のみならず、異なる要求処理装置（制御装置）間でも可能である。このため各要求処理装置（制御装置）は互いに通信する通信部を有する。
【００２２】
要求処理関数は、一つまたは複数のチャネル（第１チャネルまたは第３チャネルまたはこれらの両方）をサブスクライブし（送信指示部の処理に相当）、それらのチャネルへの入力に対して、あらかじめ定められたタイミングで所定の判断および処理に基づく演算を行い、その演算結果（関数の出力値）または出力引数の値を必要に応じて一つまたは複数のチャネル（第３チャネルまたは第２チャネル）に対してパブリッシュする（関数出力送信処理部および出力引数送信処理部の処理に相当）。判断および処理の結果によっては、パブリッシュを行わない場合もある。要求処理関数は、チャネル（第１または第３チャネルまたはこれらの両方）から受けた情報を入力引数として演算を行うことにより有益な情報を抽出し、チャネル（第２チャネルまたは第３チャネル）に出力する。第２チャネルに関わる要求処理関数により抽出される情報（出力引数の値）は、環境に作用するアクチュエータに対する制御指令に相当する。
【００２３】
ここで、チャネルの実体は、チャネル識別子と、サブスクライバーの宛先リストを保持したオブジェクトである。各チャネルは、入力されたデータを、宛先リストに示される各サブスクライバーに転送するように振る舞う。各チャネルは、後述する要求配置装置４１およびインデックス装置５１では、どこの要求処理装置（制御装置）に属するかを示すため、チャネル識別子と、要求処理装置（制御装置）識別子との組によって、チャネル情報として識別される。
【００２４】
各チャネルは、それぞれ宛先表を保持し、あるチャネルのデータを必要とする需要者からのサブスクライブ要求あるいはサブスクライブ解除要求に従って、この宛先表を書き換える。また、各チャネルは、送信元(センサあるいは要求処理関数) からのデータがチャネルに到着したら、その時点での宛先表の内容に従い、到着したデータをそれぞれの宛先(アクチュエータあるいは要求処理関数) に送付する。
【００２５】
各センサからデータ入力されるチャネル（第１チャネル）および各アクチュエータへのデータ出力を行うチャネル（第２チャネル）はあらかじめブローカ１０１に人為的に登録してもよいし、各作用装置（センサおよびアクチュエータ）からの要求に応じて登録してもよい。Publish-Subscribe ブローカ１０１は、ユーザからの指示によりまたは各作用装置からの要求に応じて第１チャネルおよび第２チャネルを作成する第１チャネル作成部および第２チャネル作成部を有していてもよい。
【００２６】
ユーザ装置３１ａ〜３１ｂはユーザによりセンサネットワークに対する要求を記述したプログラムを入力し、入力したプログラムを要求配置装置４１に送出する。ユーザの要求を記述したプログラムは、要求処理関数の種類と、その入出力に関連づけられたチャネルとのリンク(グラフ)として定義される。より詳細にはプログラムは、引数（入力引数、出力引数）を用いて演算を行う複数の要求処理関数を含んでいる。各要求処理関数は、第１チャネル、前記複数の要求処理関数のうち他の要求処理関数のうち少なくとも１つを入力引数に指定している。すなわち、各要求処理関数は、第１チャネルの識別子、他の要求処理関数のうち少なくとも１つを入力引数部分に記述している。また、少なくとも１つの要求処理関数は、少なくとも１つの第２チャネルを出力引数に指定している。すなわち、少なくとも１つの要求処理関数は、少なくとも１つの第２チャネルの識別子を出力引数部分に記述している。プログラムの詳細は後述する。
【００２７】
インデックス装置５１は、要求処理関数の文字列（すなわち要求処理関数そのもの）と、チャネル情報（要求処理関数の文字列と、該要求処理関数を実行する要求処理装置（制御装置）の識別子との組）との対応を保持している。インデックス装置５１は、要求処理関数の識別情報（たとえば要求処理関数の文字列）を複数記憶する識別情報記憶部を含んでいる。インデックス装置５１に保持されるデータの一例を図８に示す。図８には、要求処理関数の文字列と、これに対応するチャネル情報とのペアが複数示されている。図８の詳細は後に説明する。
【００２８】
要求配置装置４１は、ユーザ装置から入力されたプログラムに含まれる各要求処理関数が、インデックス装置５１に登録済みであるかの検査をインデックス装置５１に要求する。つまり、ユーザ装置の要求に対応する上記グラフ（要求処理関数の種類と、その入出力に関連づけられたチャネルとのリンク）から、部分グラフを再帰的に抽出し、個々の部分グラフに対して、インデックス装置５１に対し、検査を要求する。インデックス装置５１は、要求配置装置４１からの要求を受けて各要求処理関数が登録済みであるかどうかを検査し、登録済みであるか否かを示す検査結果を返す。
【００２９】
検索の結果、同一の処理内容を実現する要求処理関数（同一の入力チャネルを用い、同一の出力値が得られる要求処理関数）が登録されていれば、該要求処理関数はすでに要求処理装置（制御装置）において実体化されており共用化可能であることを要求配置装置４１は決定する。もし同一の処理内容を実現する要求処理関数がインデックス装置５１に登録されていなければ、この要求処理関数を実体化するべき要求処理装置（制御装置）を選択し、この要求処理関数の文字列と、チャネル情報（該文字列と選択した要求処理装置（制御装置）の識別子との組）との登録をインデックス装置５１に要求し、インデックス装置５１は、これらの情報を登録する。
【００３０】
ここでインデックス装置５１に対する検索要求の際、所定の規則にしたがって要求処理関数の文字列を並び替えることにより正規化（詳細は後述）し、正規化された関数に基づき検索要求を行ってもよい。そして、検索がヒットしないときは、正規化された文字列の登録を要求してもよい。また検索要求の際、要求処理関数の文字列を一定の手続に従い符号化し、符号化された文字列（関数の符号表現）に基づき検索要求を行い、検索がヒットしないときは、符号化された文字列の登録を登録してもよい。また、符号化を行う際は、符号化の前に上記正規化を行ってもよい。インデックス装置５１は要求処理関数を正規化する正規化部、または要求処理関数のコードを符号化して符号化関数データを生成する符号化部を有していてもよい。
【００３１】
要求配置装置４１は、インデックス装置５１に登録されていない要求処理関数について、当該要求処理関数の実体化を、選択した要求処理装置（制御装置）に対し要求する。要求を受けた要求処理装置（制御装置）の要求処理関数実行環境１０２では、この要求処理関数を、入力チャネルおよび出力チャネルと関連づけて保持し、所望のタイミング（たとえばサブスクライブしているチャネルに対してデータが到着したタイミング）で実行する。より詳細には、入力チャネルすでに存在するときは当該入力チャネルとの関連づけを行い、まだ存在しないときは当該入力チャネルが作成されたときに関連づけを行う。また上記要求処理関数の記述により識別される出力チャネル（第３チャネル）を生成し、当該出力チャネルとの関連づけを行う（なお図２の一番上に位置する要求処理関数の出力チャネルは図面の簡単のため図示を省略している）。また、要求処理関数に出力引数が存在するときは、当該出力引数に指定された出力チャネル（第２チャネル）への関連づけを行う（この場合、この関数の出力値は存在しない（ＮＵＬＬである）ため、この関数に対する第３チャネルの生成および関連づけは省略してもよい。図２の一番下に位置する要求処理関数を参照）。
【００３２】
以上に説明した図１の制御システムについてさらに詳細に説明する。
【００３３】
まず図２に示した要求処理装置（制御装置）の詳細について説明する。
【００３４】
上述したように、Publish-Subscribe ブローカ１０１は複数のチャネルを管理するが、１つのチャネルが複数の要求処理装置（制御装置）によって利用される場合がある。たとえば、複数の要求処理関数によりあるセンサのデータが必要になる場合、あるいはある要求処理関数の出力値が、複数の要求処理関数により必要とされる場合などである。
【００３５】
この場合の一つの実現方法としては、各要求処理装置（制御装置）のブローカ１０１間でチャネルの宛先表を分割管理した上で、データを必要としているブローカ１０１を互いにそれぞれの宛先表に含め、お互いに到着したデータを転送し合う、という方式を用いることができる。この場合は、メッセージのループを避ける仕組みが必要である。
【００３６】
また、チャネル毎に一つの要求処理装置（制御装置）がマスタブローカとなり、このチャネルの宛先管理は全て該当の要求処理装置（制御装置）が管理する、という方法を用いることもできる。この場合には、どの要求処理装置（制御装置）でどのチャネルがどのように管理・利用されているかを集約する必要がある。インデックス装置においてこれを行ってもよいし、他のチャネル管理・割り当て手段を用意してもよい。例えば、より大規模な発展が期待される場合は、Scribe（M. Castro, P. Druschel, A-M. Kermarrec, and A. Rowstron. Scalable application-level anycast for highly dynamic groups. In Proceedings of NGC 2003, September 2003.）のようなアプリケーションレベルマルチキャストなどを利用することもできる。
【００３７】
要求処理関数実行環境１０２は、上述したように、要求配置装置４１から提供された要求処理関数の実体化を行う。すなわち、要求処理関数実行環境１０２は、要求配置装置４１から要求処理関数の提供を受け（関数受付部の処理に相当）、提供された要求処理関数を保持し（関数保持部の処理に相当）、入出力チャネルとの関連づけを行い、所望のタイミングで要求処理関数を実行する（関数実行部の処理に相当）。要求処理関数実行環境１０２としては、具体的には、Java（登録商標） におけるバーチャルマシンまたはサーブレット実行環境のようなものが想定される。
【００３８】
各々の要求処理関数は、上述したように、一つまたは複数のチャネルをサブスクライブし、また一つまたは複数のチャネルに対してパブリッシュすることができる。また、各関数は内部メモリ(状態) を保持してもよい。
【００３９】
要求処理関数実行環境１０２は、各々サブスクライブしているチャネルに対してデータが到着したタイミングで要求処理関数を起動し、短時間のうちに内部メモリを書き換え、必要なデータ加工を済ませ、またパブリッシュを行う。
【００４０】
なお、要求処理関数を定期的に実行するために、個々のPublish-Subscribe ブローカ１０１において、仮想的なクロックチャネルを定義してもよい。定期的に実行される必要がある要求処理関数は、該当するクロックチャネルをサブスクライブするものとする。各ブローカ１０１は、サブスクライブ要求到着時点で仮想的なクロックチャネルを実体化し、要求処理関数へ定期的なイベントを供給することにより、要求処理関数を起動する。
【００４１】
ここで要求処理関数は、少なくとも以下の要素を持つ。
・任意個のチャネル入力
・処理内容（種類）
・１つまたは複数のチャネル出力
【００４２】
ここで、本実施形態で扱うチャネルは、特に、「名前なしチャネル」と称されることもある。名前なしチャネルとは、作用装置の識別子、または、要求処理関数の入力と処理内容、によって一意に定まるチャネルのことである。例えば、作用装置に対応するチャネルがi 個存在するとして、作用装置の識別子をN とすると、識別子N[i] によって識別されるチャネルのことである。
【００４３】
また、要求処理関数内部のチャネル入力部には、内部状態を記録する、非同期動作を実現するためのウィンドウと呼ばれる機構を導入しても良い。ウィンドウは一定量の内部記憶を持つ機構であり、その内容とチャネルからの入力との単純な演算により内部記憶を更新する。ウィンドウは単純な最新値や、一定個数あるいは期間の最大・最小・平均値などが計算できる機能を持っていてもよい。また、ウィンドウは、チャネルに対する修飾子として記述されることができる。例えば、チャネルX に対する最新値はチャネルX.current のように記述する。ただし、以下の例では簡単のため、ウィンドウは明示的には表現せず、全て最新値が取り扱われるものとする。
【００４４】
チャネルの修飾子は、後に述べる要求配置アルゴリズムの処理においては、ウィンドウを変換して単独の要求処理関数を取得し、その内側の項のみを評価する。例えば、(f1 (f2 A).current) とあった場合は(f1 (select (f2 A) “current”)) と変換する。f1,f2は要求処理関数であり、(f2 A)はAを要求処理関数f2で処理したときの出力値、(select (f2 A) “current”)は、(f2 A)の最新値を取得したときのその値である。
【００４５】
ただし、要求処理装置（制御装置）への実体化の段階では、select に対して単独の要求処理関数を実体化してもよいし（すなわち(f2 A)を入力チャネルとし、(f2 A)の最新値を取得する要求処理関数を実体化し、関数の出力値（演算結果）を(select (f2 A) “current”)の名をもつチャネルに出力する）、f1 への入力時の時点で処理しても良い（すなわち(f2 A)を入力チャネルとし、(f2 A)の最新値を取得するとともにf1に基づく処理を行う要求処理関数を実体化し、関数の出力値（演算結果）を、(f1(select (f2 A) “current”))の名をもつチャネルに出力する）。後者の場合、実体化することによりウィンドウが持つ内部メモリを共有化できるメリットがあり、または、ウィンドウを個々の実体化した要求処理関数に含めることで、チャネル数の増大を防ぐ効果がある。上記２つのどちらが、与えられたプログラムに対して効率的かは、要求処理装置（制御装置）が判断してもよい。
【００４６】
ここで複数の要求処理関数は以下の条件で同一化（同一視）できる。
【００４７】
入力チャネルが同一のとき、出力結果が同質となるアルゴリズムに基づく処理では、処理内容と入力チャネルとが一致すれば同質の出力が得られる。すなわち、処理内容と、入力チャネルとが一致する要求処理関数同士は、同一化できる。
【００４８】
また、入力チャネルの順序が結果に与えないものについては、入力チャネルを一定の規則で正規化することで、入力チャネルの順序の異なる要求処理関数同士についても同一視可能とする。
【００４９】
正規化とは、演算結果に影響を与えない範囲において、要求処理関数を書き換えることを示す。具体的には、以下の規則により要求処理関数に与えられる引数を再帰的にソートすることにより行う。
（１）要求処理関数において引数が交換可能である部分のみを対象とする。
（２）交換可能な引数は、型により、例えば以下の順位でソートする。
−  定数
−  チャネル 
−  要求処理関数
なお、要求処理関数内の引数は、要求処理関数内で同様にソートする。
（３）個々の同一型同士では、その引数の文字列表現を特定のハッシュ関数(例えばSHA-1) にかけた時のハッシュ値で比較し、ハッシュ値の昇順または降順でソートする。
【００５０】
このような正規化により、多様な表現が行われる可能性のあるプログラム処理が、より高い確率で共用化可能となる。
【００５１】
例えば、センサX とセンサY の出力がそれぞれチャネルX とチャネルY から得られるとして、これらのうち最大値を出力する処理を行う要求処理関数を考える。ここで、センサＸ、Ｙの最新値のうち最大値を取る要求処理関数の名をMAX とすると、この要求処理関数の実体(インスタンス) は、例えばS 式で以下のように記述できる。
(MAX X Y)
【００５２】
X とY の順序関係は計算の結果に影響を与えないため、これは次の式と同じ意味である。
(MAX Y X)
【００５３】
こういった多様な表現が成立し得るものについては、整列することにより正規化するものとする。
【００５４】
正規化後の表現が(MAX X Y) であったとすると、この計算結果は、(MAX X Y) という名前で識別されるチャネルに自動的に出力される。このため、要求処理装置（制御装置）内の要求処理関数実行環境１０２における関数実体化機能は、要求配置装置４１から、実体化すべき要求処理関数（たとえば正規化されている）を受信すると、この要求処理関数の文字列によって識別されるチャネルをブローカ１０１に登録し、登録したチャネルに当該要求処理関数の計算結果（関数の出力値）を出力することができる。計算を表現する式自身がチャネルの識別子を兼ねているため、これを特に、名前なしチャネルと呼んでいる。
【００５５】
なお、以上の例では簡単のためにS 式を用いたが、名前なしチャネルは、一定の手順により正規化した、XML あるいはこれに類似した木構造のプログラム表現、その他任意の表現形式においても同様に定義できる。なお、あるシステム内においては同一の計算は表現形式に従うものとすることが望ましい。また、後述する式のネストを考慮すると、個々のチャネルの識別子が長くなってしまうことは実装上不利であるため、表現(例えば(MAX X Y)) を表すバイト列に対してハッシュ値を求め、これをチャネルの識別子としてもよい。
【００５６】
ここで、この要求処理関数の処理を駆動するタイミング(駆動方式) は、MAX の処理自身によって定義するものとする。このタイミングについても、あるチャネルからの入力の更新を契機として(イベント駆動的な用語を用いれば、イベントの到着を契機として) 処理を行う方式(単チャネル駆動) や、複数のチャネルの入力更新の都度処理を行う方式(複数チャネル駆動)、一定の時間間隔で定期的に処理を行う方式(時間駆動) などが考えられる。これらには、要求処理関数において各チャネルに対してウィンドウが与えられることを前提とするものもある。
【００５７】
次に、要求配置装置４１の詳細について説明する。
【００５８】
まず要求配置装置４１の目的について具体例を用いて説明する。
【００５９】
例えば、ある建物において、センサA,B,C,D,E,F が配置され、それぞれ同名で定義されるチャネルに定期的に気温のデータを出力するとする。また、空調制御用のスイッチX および異常通知用の警報機Y が存在し、それぞれ同名のチャネルからのboolean 入力(“t” あるいは“nil” の2 値入力) により、動作したり、動作を停止したりするとする。なお、スイッチ・警報機は、アクチュエータに相当する。
【００６０】
ここで、この建物に対して、以下の２つのプログラム１およびプログラム２をユーザ装置により投入するとする。
１．A〜F の平均値において、28 度を閾値として、それ以上のときは空調を作動させ（スイッチＸをオンにし）、未満のときは空調を停止させる（スイッチＸをオフにする）
２．A〜F の最大値において、80 度を閾値として、それ以上のときは警報機を作動させ、未満のときは警報機を停止させる。
【００６１】
これら２つのプログラムは、それぞれお互いのことを考慮せずにたとえば以下のように記述される。
プログラム１： (| (>= (AVERAGE A B C D E F) 28) X)
プログラム２： (| (>= (MAX A B C D E F) 80) Y)
【００６２】
各プログラムはそれぞれ複数の要求処理関数を含んでいる。要求処理関数の種類の一例を表1 に示す。例示された要求処理関数のうち、“|”以外は、要求処理関数の出力値（要求処理関数の演算結果）を、他の要求処理関数で利用できる。一方、“|”（代入関数）は要求処理関数の出力値（要求処理関数の演算結果）を利用するためのものではない。具体的に、“|”は、“|”の第二引数（出力引数）にアクチュエータのチャネル（名前なしチャネル）を与えることにより、チャネルとチャネルとを結合する副作用的なものを定め、プログラムの最終出力先であるアクチュエータを選択するために利用する。
【表１】
0004919995.tif 000002
【００６３】
ここで、例に挙げた２つのプログラム１、２は、A〜F までの統計値を利用することにおいて共通している。実際、当該２つのプログラム１，２におけるMAX とAVERAGE は入力が共通しており、また処理内容も似通っている。従って、ここでは、基本統計関数STAT の出力を修飾することにより、ひとつの統計量が取り出せるものとすると、上記プログラム１、２は、STATを用いて、次のように書き換え可能である。
プログラム１：(| (>= (STAT A B C D E F) .average 28) X)
プログラム２：(| (>= (STAT A B C D E F) .max 80) Y)
【００６４】
ここでは、STAT の出力をウィンドウ類似の記法で修飾した。例えば、XML の断片のような、タグ付けされたデータ組から、対応するタグの中に記録された値の最新値を記録するウィンドウを想定する。
【００６５】
こうすると、プログラム１、２中の(STAT A B C D E F) は全く同じ処理(要求処理関数) であることが分かる。特にセンサネットワーク応用においては、このように同様の処理がたくさんあることが想定される。コスト(帯域・遅延・処理能力・電力消耗等) 上昇を阻止すべく、同一の処理はまとめたい。
【００６６】
例えば、上にある2 つのプログラムを実際の処理として展開する際は、共通する要求処理関数(STAT A B C D E F)のみ実体化し、他の要求処理関数はこの要求処理関数(STAT A B C D E F)の出力を共用化する。
【００６７】
図４は、要求処理関数の共用化の具体例を示す。図中、p がSTAT に、q,r が“>=” に、s,t が“|”に対応する。そして、STAT を共用化することにより、もっともデータ転送量が多いA〜F からのデータ転送を2 つのプログラムに対して高々1 度で済ませることができるようになる。
【００６８】
このように上にある２つのプログラムにおいて共通する要求処理関数(STAT A B C D E F)のみ実体化し、他の要求処理関数はこの要求処理関数(STAT A B C D E F)の出力を共用化することにより、同一の処理は高々1 度のみ行えばよいことになる。
【００６９】
本実施形態における要求配置装置は、このようにユーザ装置から入力されるプログラムを解析して、プログラムに含まれる各関数のうち、すでに実体化されている関数についてはそれを共用し、まだ実体化されていない関数のみを実体化する。このように、センサネットワーク環境の分散プログラミング基盤において、多様なプログラムが実行されても共通する要求処理関数を効率的に共用化することで不必要な資源の消費を避けることができる。
【００７０】
図３ は、要求配置装置４１の詳細構成を示す。
【００７１】
要求配置装置４１は、プログラム入力受付部２０１、インデックス装置通信部２０２、 要求処理装置管理部（関数提供部）２０３および要求配置アルゴリズム実行部（登録要求部、実行先選択部）２０４を備える。
【００７２】
プログラム入力受付部２０１は、S 式のような、データ処理の流れを複数の要求処理関数によって記述したプログラムの入力をユーザ装置３１ａまたはユーザ装置３２ｂから受け付け、入力されたプログラムを要求配置アルゴリズム実行部２０４に投入する。
【００７３】
要求配置アルゴリズム実行部２０４は、プログラム入力受付部２０１から投入されたプログラムを複数の要求処理関数に分解し、各要求処理関数のそれぞれがインデックス装置５１に登録済みか否かの検査を、インデックス装置通信部２０２を介してインデックス装置５１に対して要求する。インデックス装置通信部２０２は要求配置アルゴリズム実行部２０４とインデックス装置５１との通信のインターフェースとして機能する。
【００７４】
インデックス装置５１は、前述したように、要求処理関数の文字列と、チャネル情報（要求処理関数の文字列と要求処理装置（制御装置）の識別子との組）との対応表（インデックス表）を持っている（図８参照）。インデックス装置５１は、要求処理アルゴリズム実行部２０４から指示された要求処理関数について、当該要求処理関数の文字列がインデックス表に登録済みか否かを検査し、登録済みか否かを示す検査結果を要求配置アルゴリズム実行部２０４に返す。この機能は、たとえば関数検出部の機能に相当する。
【００７５】
要求配置アルゴリズム実行部２０４は、登録済みでないと判断された要求処理関数について、その要求処理関数を実体化するべき要求処理装置（制御装置）を選択し、選択した要求処理装置（制御装置）の識別子と該要求処理関数の文字列との組であるチャネル情報と、該要求処理関数の文字列との登録を、インデックス装置５１に要求する。また、登録済みでないと判断された要求処理関数の実体化要求を要求処理装置管理部２０３に対して行う。要求配置アルゴリズム実行部２０４の詳細は、別途、後述するものとする
インデックス装置５１は、要求処理アルゴリズム実行部２０４から指示された要求処理関数の文字列およびチャネル情報（要求処理関数の文字列と要求配置装置識別子との組）をインデックス表に登録する。この機能は、たとえば識別情報登録部の機能に相当する。インデックス装置５１は、インデックス表の読み出しキャッシュを持ってもよい。
【００７６】
なお、本実施形態では、１つのインデックス装置を１つの要求配置装置が利用する例を示しているが、１つのシステム内に、１つのインデックス装置を利用する複数の要求配置装置が存在してもよい。また、本実施形態では、インデックス装置と要求配置装置とは別体として構成されているが、これらが１つの装置として一体に構成されてもよい。
【００７７】
要求処理装置管理部（関数提供部）２０３は、要求配置装置が利用可能な要求処理装置（制御装置）の一覧リストと、個々の要求処理装置（制御装置）の状態（負荷・障害有無など）とを管理する。また要求処理装置管理部２０３は、要求配置アルゴリズム実行部２０４から、要求処理関数の実体化要求を受けて実体化のための処理を行う。具体的には、実行すべき要求処理関数に対応するオブジェクトコード(Java（登録商標） などのコード)を生成し、要求配置アルゴリズム実行部２０４により指定された要求処理装置（制御装置）に対して与える。要求処理関数とオブジェクトコードとの変換ルールがあらかじめ与えられ、このルールに基づき、上記要求処理関数に対応するオブジェクトコードを生成する。あるいは、このルールを、ユーザ装置から入力するプログラムに記述してもよい。
【００７８】
要求処理装置（制御装置）は、要求処理装置管理部２０３から与えられた情報に基づき、要求処理関数を実体化する。具体的には、与えられた要求処理関数（オブジェクトコード）を保持し、この関数における入力チャネルをサブスクライブし、この関数の記述からなる識別子をもつチャネル（出力チャネル）を、Publish-Subscribeブローカ１０１に登録（作成）する。
【００７９】
ここで、要求配置装置４１における要求配置アルゴリズム実行部２０４は、要求処理関数の実体化するべき要求処理装置（制御装置）を、例えば以下の方法により選択する。
（１）要求処理関数の入力および出力となるチャネルそれぞれについて、あるチャネルを主として管轄するブローカ(マスタブローカ) の役割を果す要求処理装置（制御装置）、および個々のチャネルを既にサブスクライブしている要求処理装置（制御装置）が、それぞれわかるとする。これらの要求処理装置（制御装置）を、該当する要求処理関数を実行することができる要求処理関数実行環境の候補とする。なお、チャネル識別子と要求処理装置（制御装置）との対応関係は、インデックス装置（図８のチャネル情報を参照）や他の手段により管理する。
（２）要求処理関数実行環境の候補は、それぞれ要求処理装置（制御装置）の負荷(時間あたりの通信負荷および計算負荷) を含めた情報を定期的に要求配置装置の要求処理装置管理部２０３へ報告する。ここで、要求処理装置（制御装置）の負荷が、個々の要求処理装置（制御装置）に設定された上限閾値に達しているものは候補から外される。
（３）残された候補のうち、作用装置あるいは他の要求処理関数により、既にサブスクライブされているチャネルをできるだけ多く含む要求処理装置（制御装置）を選択する。これは、要求処理装置（制御装置）を超えるサブスクライブにより、要求処理装置（制御装置）間の通信コストが新規に発生することによる。
（４）以上の手続きで候補が残らなかった場合、要求処理装置（制御装置）全体でもっとも負荷が低いものを利用する。ただし、要求処理装置（制御装置）が全て過負荷状態となった場合は、要求処理関数の実体化を失敗として、ユーザと管理者に警告(資源過少) してもよい。
【００８０】
図５は、要求配置装置４１の動作（要求配置アルゴリズム）を説明するフローチャートである。要求配置装置４１に対しては、たとえば、STATを用いた前述のプログラム１またはプログラム２といったプログラムが、ユーザ装置から与えられる。要求配置装置４１は、与えられたプログラムを、図５の手順に従って処理し、要求処理装置（制御装置）に配置する。以下、図５の手順について概略的に説明し、その後、具体例を用いてさらに詳しく説明する。
S1：実体化手続き(instantiate)を開始する。ユーザ装置から与えられたプログラムをf とする。たとえばプログラムとして(| (>= (STAT A B C D E F) .average 28) X)が与えられた場合、このプログラムをfとする。
S2：f をfsに退避させる。
S3：インデックス装置５１にf の有無を問い合わせ、その結果がchに入力されて返される。インデックス装置５１は問い合わせに係るfに対応づけられたチャネル情報が存在すればそれをchに入れて返し、存在しなければnil(空) をchに入れて返す。本ステップは、当該プログラムfの文字列を識別子として有するチャネル（第３チャネル）あるいは当該プログラムfを実行する関数が、すでに、いずれかの要求処理装置（制御装置）に存在するか否かを問い合わせていることと等価である。
S4：インデックス装置５１から返されたchの内容 がnil かどうかを確認し、nil でなければステップS14に進み、本処理を終了する。なお終了の際、ユーザ装置に対し処理が正常に行われたことを示すメッセージを返すようにしてもよい。一方、インデックス装置５１から返されたchの内容 がnilであるときは、f は実体化する必要があるため、ステップS5に進む。
S5：f に指定される引数は、実際には定数だったり、チャネルだったり、あるいは別の要求処理関数（プログラムの断片) だったりする。ここで、fの引数を順に評価するために、変数i を0 で初期化する。以下、引数は最初の引数から順に、第0 引数、第1 引数、とする。たとえば(| (>= (STAT A B C D E F) .average 28) X)の場合、第0引数は(>= (STAT A B C D E F) .average 28)、 第1引数はXである。引数の記述は、関数の型から判別できる。
S6：i 番目の引数の存在を検証し、もしi 番目の引数が存在しない、つまり全ての引数の評価が終わっていれば、ステップS12 に飛ぶ。一方、i 番目の引数が存在すればステップS7に進む。
S7：f の第i 引数をfi とする。たとえばf0= (>= (STAT A B C D E F) .average 28)とする。
S8：fi の型を判定し、要求処理関数（サブプログラム）であればステップS9 に進む。そうでなければ（すなわち定数またはチャネル識別子の場合など）ステップS11 に進む。f0= (>= (STAT A B C D E F) .average 28)の場合、これは要求処理関数であるので、ステップS9に進む。
S9：fi を引数として、実体化手続き(instantiate) を開始する。すなわち再帰的処理を行うべく、ステップS1から処理を開始する。結果として戻される（再帰処理のステップS14で戻される）、チャネル情報（fiの文字列と、要求処理装置（制御装置）識別子との組）をch_iに代入する。
S10：f に含まれる要求処理関数fiを、チャネル情報ch_iで置換する。
S11：i をインクリメントし、ステップS6 に戻る。
S12：全ての引数の評価が終了したので、f を実体化する要求処理装置（制御装置）を選択し、選択した要求処理装置（制御装置）に対してfの実体化要求を要求処理装置管理部２０３に送る。また、f の出力を受けるチャネルの情報(たとえばfの文字列そのものと、選択された要求処理装置（制御装置）の識別子との組）をch に代入する。
S13：インデックス装置５１にfsの文字列と、fsの出力を受けるチャネルの情報ch（fsの文字列および、選択された要求処理装置（制御装置）の識別子との組）との対応を登録する。このようにして登録された後は、このfの実体化手続きが再度要求されたときは、ステップS3で、このfに対応づけられたチャネル情報chを返せばよい。なお、チャネル情報chに含まれるfsの文字列（後述する図８の右側のフィールドに含まれるfsの文字列）の登録は省略することも可能である。その場合、ステップS3でのインデックス装置５１への問い合わせの際には、fの文字列と、識別子との組をチャネル情報chとして返す。
S14：本フローチャートのメイン処理で本ステップに至ったときは処理終了し、再帰処理で本ステップに至ったときは、呼び出し元にチャネル情報ch を返す。
【００８１】
ここで、ステップS2でのインデックス装置５１への問い合わせ時、またはステップS12でのインデックス装置５１への登録時には、要求処理関数を、前述したようにして正規化してもよい。正規化により、多様な表現が行われる可能性のあるプログラム処理が、より高い確率で共用化可能となる。
【００８２】
図６は、この正規化を適用した場合に、図５のステップS2に代えて行う処理の流れの一例を示したフローチャートである。
【００８３】
ステップS21では、インデックス装置５１への問い合わせの前に、fを正規化し、正規化された要求処理関数をfnに代入する。
【００８４】
ステップS22では、fnのハッシュ値を計算し、得られたハッシュ値を鍵として、インデックス装置５１への問い合わせを行う。問い合わせ結果がchに入力されて返される。インデックス装置５１は問い合わせに対し、対応づけられたチャネル情報が存在すればそれをchに入れて返し、存在しなければnil(空) をchに入れて返す。
【００８５】
図７は、上記正規化を適用した場合は、図５のステップS12に代えて行う処理の流れの一例を示したフローチャートである。
【００８６】
ステップS31では、インデックス装置５１への登録前に、fを正規化し、正規化された要求処理関数をfnに代入する。
【００８７】
ステップS32では、fnのハッシュ値を計算し、得られたハッシュ値を鍵とする項目に、fの出力を受けるチャネル情報chを登録する。
【００８８】
ここで実際にユーザ装置からプログラム１である(| (>= (STAT A B C D E F) .average 28) X)が入力された場合を想定して、図５の処理について説明を行う。ただし説明の簡単のため、正規化は行わないものとする。なお、このプログラムにはチャネルの装飾子があるため、以下の処理では、前述したような変換を施し、(| (>= (select (STAT A B C D E F) “average”) 28) X)とされる。ここで、このプログラムについて簡単に補足説明しておくと、このプログラムは、４つの要求処理関数、すなわち、
(STAT A B C D E F)
(select (STAT A B C D E F) “average”)
(>= (select (STAT A B C D E F) “average”) 28) 
(| (>= (select (STAT A B C D E F) “average”) 28) X)を含む。
【００８９】
これらの要求処理関数は、少なくとも１つの第１チャネル（ここではA,B,C,D,E,Fが該当する）、他の要求処理関数、第２チャネル（ここではＸがそれに該当する）の少なくとも１つを引数として指定している。たとえば３番目の関数は、(select (STAT A B C D E F) “average”)と 28との２つを入力引数として指定している。４番目の要求処理関数は出力引数Xへの出力を定めており、この関数に対応するチャネルの生成は省略してもよい。なお、X以外の引数はすべて入力引数に相当する。以下、図５の処理の具体例を説明する。
【００９０】
（メイン処理）
まずステップS1で実体化手続き(instantiate)を 開始する。ユーザ装置から入力されたプログラムは(| (>= (STAT A B C D E F) .average 28) X)であり、これをf とする。このプログラムにはチャネルの装飾子があるため、前述したような変換を施し、(| (>= (select (STAT A B C D E F) “average”) 28) X)とする。
【００９１】
次に、ステップS2でfをfsに退避する。
【００９２】
次に、ステップS3で、インデックス装置５１にfの有無を問い合わせる。インデックス装置５１からはnil（空）を含むchが返されるとし、ステップS5に進む。
【００９３】
次にステップS5で、変数i を0 で初期化する。以下、引数は最初の引数から順に、第0 引数、第1 引数、第２引数・・・とする。ここでは第0引数は(>= select (STAT A B C D E F) “average”) 28)、 第1引数はXである。ステップS6に進む。
【００９４】
次にステップS6で、i＝０ 番目の引数の存在を検証し、i ＝０番目の引数が存在するためステップS7に進む。
【００９５】
次にステップS7で、第０引数をf0とする。ここではf0は (>= select (STAT A B C D E F) “average”) 28)である。
【００９６】
次にステッS8で、f0の型を判定し、要求処理関数（サブプログラム）であるため、ステップS9に進む。
【００９７】
次にステップS9で、f0 を引数として、実体化手続き(instantiate) を開始する。すなわち再帰処理１に入る。
【００９８】
（再帰処理１）
ステップS1で、f0をfとみなして、ステップS2で退避を行い、ステップS3でインデックス装置への問い合わせを行い、nil（空）を含むchが返されたとして（S4のYES）、ステップS5に進む。
【００９９】
ステップS5で、変数iを０で初期化する。第０変数は(select (STAT A B C D E F) “average”)、第１変数は、28である。i=0番目の引数が存在するため（S6のYES）ステップS7に進み、第０引数をf0とする。ここではf0は、(select (STAT A B C D E F) “average”)である。
【０１００】
次にステッS8で、f0の型を判定し、要求処理関数であるため、ステップS9に進む。
【０１０１】
次にステップS9で、f0 を引数として、実体化手続き(instantiate) を開始する。すなわち再帰処理２に入る。
【０１０２】
（再帰処理２）
ステップS1で、f0をfとみなして、ステップS2で退避を行い、ステップS3でインデックス装置への問い合わせを行い、nil（空）を含むchが返されたとして（S4のYES）、ステップS5に進む。
【０１０３】
ステップS5で、変数iを０で初期化する。第０変数は(STAT A B C D E F)、第１変数は、“average”である。i=0番目の引数が存在するため（S6のYES）ステップS7に進み、第０引数をf0とする。ここではf0は、(STAT A B C D E F)である。
【０１０４】
次にステッS8で、f0の型を判定し、要求処理関数であるため、ステップS9に進む。
【０１０５】
次にステップS9で、f0 を引数として、実体化手続き(instantiate) を開始する。すなわち再帰処理３に入る。
【０１０６】
（再帰処理３）
ステップS1で、f0をfとみなして、ステップS2で退避を行い、ステップS3でインデックス装置への問い合わせを行い、nil（空）を含むchが返されたとして（S4のYES）、ステップS5に進む。
【０１０７】
ステップS5で、変数iを０で初期化する。第０変数はA、第１引数はB、 第２変数はC、第３引数はD、 第４変数はE、第５引数はFである。i=0番目の引数が存在するため（S6のYES）ステップS7に進み、第０引数をf0とする。ここではf0は、Aである。
【０１０８】
次にステッS8で、f0の型を判定し、要求処理関数でないため、ステップS11に進みiを１だけインクリメントする。
【０１０９】
ステップS6に戻り、i=1番目の引数が存在するため（S6のYES）ステップS7に進み、第１引数をf1とする。ここではf1は、Bとなる。
【０１１０】
次にステップS8で、f1の型を判定し、要求処理関数でないため、ステップS11に進みiを１だけインクリメントする。
【０１１１】
第２変数のC、第３引数のD、 第４変数のE、第５引数のFについていずれも要求処理関数でないため、同様の処理を経て、ステップS6においてNOとなり、ステップS12に進む。
【０１１２】
ステップS12では、fを実体化する要求処理装置（制御装置）を選択し、選択した要求処理装置（制御装置）に対するfの実体化要求を要求処理装置管理部２０３に送る。また、fの出力を受けるチャネルの情報、すなわち、(STAT A B C D E F)と、選択した要求処理装置（制御装置）の識別子との組、をch に代入する。
【０１１３】
ステップS13では、インデックス装置５１に、(STAT A B C D E F)と、チャネル情報chとの対応を登録する（図８のインデックス表の２行目を参照）。
【０１１４】
ステップS14ではチャネル情報chを返すことにより再帰処理３を終了する。すなわち再帰処理２の途中のステップS9に戻り、再帰処理３で返されたチャネル情報chをch_0に代入する。
【０１１５】
（再帰処理２）
ステップS10において、fにおける第０引数であるf0をch_0で置換し、iを１だけインクリメントし、ステップS6に戻る。
【０１１６】
i=1番目の引数が存在するため（S6のYES）、ステップS7に進み、第１引数をf1とする。ここではf1は、“average”である。
【０１１７】
次にステップS8で、f1の型を判定し、要求処理関数でないため、ステップS11に進みiを１だけインクリメントする。
【０１１８】
i=2番目の引数は存在しないため（S6のNO）、ステップS12に進む。
【０１１９】
ステップS12では、fを実体化する要求処理装置（制御装置）を選択し、選択した要求処理装置（制御装置）に対するfの実体化要求を要求処理装置管理部２０３に送る。また、チャネル情報、すなわち(select (STAT A B C D E F) “average”)と、選択した要求処理装置（制御装置）の識別子との組をch に代入する。
【０１２０】
ステップS13では、インデックス装置５１に、(select (STAT A B C D E F) “average”)と、チャネル情報chとの対応を登録する（図８のインデックス表の４行目を参照）。
【０１２１】
ステップS14ではチャネル情報chを返すことにより再帰処理２を終了する。すなわち再帰処理１の途中のステップS9に戻り、再帰処理２で返されたチャネル情報chをch_0に代入する。
【０１２２】
（再帰処理１）
ステップS10において、f0をch_0で置換し、iを１だけインクリメントし、ステップS6に戻る。
【０１２３】
i=1番目の引数が存在するため（S6のYES）、ステップS7に進み、第１引数をf1とする。ここではf1は、28である。
【０１２４】
次にステップS8で、f1の型を判定し、要求処理関数でないため、ステップS11に進みiを１だけインクリメントする。
【０１２５】
i=2番目の引数は存在しないため（S6のNO）、ステップS12に進む。
【０１２６】
ステップS12では、fを実体化する要求処理装置（制御装置）を選択し、選択した要求処理装置（制御装置）に対するfの実体化要求を要求処理装置管理部２０３に送る。また、チャネル情報、すなわち(>= (select (STAT A B C D E F) “average”) 28)と、選択した要求処理装置（制御装置）の識別子との組をch に代入する。
【０１２７】
ステップS13では、インデックス装置５１に、(>= (select (STAT A B C D E F) “average”) 28)と、チャネル情報chとの対応を登録する（図８のインデックス表の３行目を参照）。
【０１２８】
ステップS14ではチャネルchを返すことにより再帰処理１を終了する。すなわちメイン処理０の途中のステップS9に戻り、再帰処理１で返されたチャネルchをch_0に代入する。
【０１２９】
（メイン処理）
ステップS10において、f0をch_0で置換し、iを１だけインクリメントし、ステップS6に戻る。
【０１３０】
i=1番目の引数が存在するため（S6のYES）、ステップS7に進み、第１引数をf1とする。ここではf1は、Xである。
【０１３１】
次にステッS8で、f1の型を判定し、要求処理関数でないため、ステップS11に進みiを１だけインクリメントする。
【０１３２】
i=2番目の引数は存在しないため（S6のNO）、ステップS12に進む。
【０１３３】
ステップS12では、fを実体化する要求処理装置（制御装置）を選択し、選択した要求処理装置（制御装置）に対するfの実体化要求を要求処理装置管理部２０３に送る。また、チャネル情報、すなわち、(| (>= select (STAT A B C D E F) .average 28) X)と、選択した要求処理装置（制御装置）の識別子との組、をch に代入する。
【０１３４】
ステップS13では、インデックス装置５１に、(| (>= select (STAT A B C D E F) .average 28) X)と、チャネルchとの対応を登録する。
【０１３５】
ステップS14に進み、本処理を終了する。
【０１３６】
以上のように、本実施形態によれば、多数のプログラムを同一の環境で動作させるとき、各プログラムで共通する処理を行う要求処理関数を共用化することで効率良いプログラム実行が可能となる。これにより同一の環境であればより多くのプログラムを同時に実行できるようになる。また、同一のパフォーマンスを求めるのにより安価な機材でセンサネットワークを構成でき、あるいは、より少ないエネルギーで多くのプログラムを実行できるようになる。
【図面の簡単な説明】
【０１３７】
【図１】本発明の一実施の形態としての分散処理システムの概略構成を示すブロック図。
【図２】要求処理装置（制御装置）の内部構成を示す図。
【図３】要求配置装置の内部構成を示す図。
【図４】要求処理関数の共用化の例を示す図。
【図５】要求配置装置の動作（要求配置アルゴリズム）を説明するフローチャート。
【図６】要求処理関数の正規化に対応した要求処理関数問合せ処理の流れを示すフローチャート。
【図７】要求処理関数の正規化に対応した要求処理関数登録処理の流れを示すフローチャート。
【図８】インデックス装置に記憶されたインデックス表の一例を示す図。
【符号の説明】
【０１３８】
１１ａ〜１１ｂ：作用装置（センサ）
１１ｃ〜１１ｄ：作用装置（アクチュエータ）
２１ａ〜２１ｃ：要求処理装置（制御装置）
３１ａ〜３１ｂ：ユーザ装置
４１：要求配置装置
５１：インデックス装置（関数登録装置、識別情報記憶部、関数検出部、識別情報登録部）
１０１：Publish-Subscribeブローカ（第１チャネル管理部、第２チャネル管理部、第３チャネル管理部）
１０２：要求処理関数実行環境（関数受付部、関数保持部、関数実行部、出力引数送信処理部、第３チャネル生成部、関数出力送信処理部、送信指示部）
２０１：プログラム入力受付部
２０２：インデックス装置通信部
２０３：要求処理装置管理部（関数提供部）
２０４：要求配置アルゴリズム実行部（検査要求部、実行先選択部、符号化部、正規化部）
【図１】
0004919995.tif 000003
【図２】
0004919995.tif 000004
【図３】
0004919995.tif 000005
【図４】
0004919995.tif 000006
【図５】
0004919995.tif 000007
【図６】
0004919995.tif 000008
【図７】
0004919995.tif 000009
【図８】
0004919995.tif 000010