(57)【要約】【課題】二つのＣＰＵを有するＰＬＣにおいて繰り返し実行されるデータ処理の効率化を図る。【解決手段】ＣＰＵ＃Ｂ１２が含まれるメイン側２１は、所定のトリガーイベントを検出した際に、当該トリガーイベントを契機としてサブ側２２に実行させる複数のデータ処理の内容と、各データ処理の実行前の状態である開始状態と実行後の状態である終了状態と、トリガーイベントとをサブ側２２に通知して、トリガーイベントを契機とする複数のデータ処理の実行をサブ側２２に指示する。サブ側２２は、指示された各データ処理を実行し、また、通知された各データ処理の内容と、各データ処理の開始状態と終了状態と、トリガーイベントとを対応付けて登録し、登録後に検出したイベントがトリガーイベントに一致する場合に、メイン側２１からの指示なしに、登録内容に従って状態遷移を行いながら、トリガーイベントに対応付けられている各データ処理を実行する。【選択図】図２
2011170476.tif 000002
【特許請求の範囲】
【請求項１】
第１の制御部と第２の制御部とを有し、
前記第１の制御部は、
所定のトリガーイベントを検出した際に、前記トリガーイベントを契機として前記第２の制御部に実行させる複数のデータ処理の各々の内容と、各データ処理の実行前の状態である開始状態と実行後の状態である終了状態と、前記トリガーイベントとを前記第２の制御部に通知して、前記トリガーイベントを契機とする前記複数のデータ処理の実行を前記第２の制御部に指示し、
前記第２の制御部は、
前記第１の制御部から実行が指示された各データ処理を実行するとともに、前記第１の制御部から通知された各データ処理の内容と、各データ処理の開始状態と終了状態と、前記トリガーイベントとを対応付けてデータ処理管理情報として登録し、
前記データ処理管理情報の登録後に検出したイベントがトリガーイベントに一致する場合に、前記第１の制御部からの指示なしに、前記データ処理管理情報に従って状態遷移を行いながら、前記データ処理管理情報に従って前記トリガーイベントに対応付けられている各データ処理を実行することを特徴とするデータ処理システム。
【請求項２】
前記第２の制御部は、
前記データ処理管理情報の登録後に検出したイベントがトリガーイベントに一致する場合に、前記第１の制御部からの指示なしに、データ処理が実行される前の状態を特定し、特定した状態と一致する開始状態と対応付けられているデータ処理を前記データ処理管理情報から抽出し、抽出したデータ処理を実行し、実行したデータ処理の終了状態へ状態を遷移させる動作を繰り返して、前記トリガーイベントに対応付けられている各データ処理を実行することを特徴とする請求項１に記載のデータ処理システム。
【請求項３】
前記第１の制御部は、
前記トリガーイベントを契機として前記第２の制御部に前記複数のデータ処理の実行を指示した後は、前記トリガーイベントを更に検出した場合でも、前記第２の制御部に前記複数のデータ処理の実行を指示しないことを特徴とする請求項１又は２に記載のデータ処理システム。
【請求項４】
前記第２の制御部は、
前記トリガーイベントに対応付けられている各データ処理を実行する度に、各データ処理の実行結果を前記第１の制御部に通知することを特徴とする請求項１〜３のいずれかに記載のデータ処理システム。
【請求項５】
前記第１の制御部は、
複数種のイベントをトリガーイベントとし、
トリガーイベントごとに、前記第２の制御部に実行させる複数のデータ処理の各々の内容と、各データ処理の開始状態と終了状態と、対象となるトリガーイベントとを前記第２の制御部に通知し、
前記第２の制御部は、
トリガーイベントごとにデータ処理管理情報を登録し、
検出したイベントがいずれかのトリガーイベントに一致する場合に、前記第１の制御部からの指示なしに、当該トリガーイベントに対応付けられている複数のデータ処理を実行することを特徴とする請求項１〜４のいずれかに記載のデータ処理システム。
【請求項６】
前記第１の制御部は、
任意のタイミングで、前記第２の制御部に対して、データ処理管理情報の変更及び削除の少なくともいずれかを指示し、
前記第２の制御部は、
前記第１の制御部からの指示に従い、登録しているデータ処理管理情報の変更又は削除を行うことを特徴とする請求項１〜５のいずれかに記載のデータ処理システム。
【請求項７】
前記第２の制御部は、
前記データ処理管理情報においてトリガーイベントに対応付けられている複数のデータ処理を、他のデータ処理に優先して実行することを特徴とする請求項１〜６のいずれかに記載のデータ処理システム。
【請求項８】
前記第２の制御部は、
トリガーイベントを契機として前記第１の制御部から実行が指示された複数のデータ処理を、他のデータ処理に優先して実行することを特徴とする請求項１〜７のいずれかに記載のデータ処理システム。
【請求項９】
前記第１の制御部は、
外部からの割り込みの発生をトリガーイベントとすることを特徴とする請求項１〜８のいずれかに記載のデータ処理システム。
【請求項１０】
前記第１の制御部は、
トリガーイベントを契機として前記第２の制御部に実行させる各データ処理の内容として、制御関数と、当該制御関数の実行に用いられる引数の値を通知し、
前記第２の制御部は、
前記第１の制御部から通知された各データ処理の制御関数と引数の値をデータ処理管理情報として登録し、
前記データ処理管理情報の登録後に検出したイベントがトリガーイベントに一致する場合に、前記第１の制御部からの指示なしに、前記データ処理管理情報に従って状態遷移を行いながら、前記データ処理管理情報に従って前記トリガーイベントに対応付けられている各制御関数を対象となる引数の値を用いて実行することを特徴とする請求項１〜９のいずれかに記載のデータ処理システム。
【請求項１１】
前記データ処理システムは、
入力機器及び出力機器の少なくともいずれかに接続され、
前記第１の制御部は、
トリガーイベントを契機として前記第２の制御部に実行させる各データ処理の内容として、入力機器及び出力機器の少なくともいずれかに対する制御処理を通知し、
前記第２の制御部は、
前記データ処理管理情報の登録後に検出したイベントがトリガーイベントに一致する場合に、前記第１の制御部からの指示なしに、前記データ処理管理情報に基づき、入力機器及び出力機器の少なくともいずれかに対する制御処理を行うことを特徴とする請求項１〜１０のいずれかに記載のデータ処理システム。
【請求項１２】
前記第２の制御部は、
リアルタイムＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）を実行する第２のＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）が含まれ、
前記第１の制御部は、
前記第２の制御部のリアルタイムＯＳ以外のＯＳとユーザアプリケーションを実行する第１のＣＰＵが含まれていることを特徴とする請求項１〜１１のいずれかに記載のデータ処理システム。
【請求項１３】
前記第１の制御部と前記第２の制御部が、同じプログラマブルコントローラに配置されていることを特徴とする請求項１〜１２のいずれかに記載のデータ処理システム。
【請求項１４】
前記データ処理システムは、更に、
メモリ領域がメッセージ交換エリアとデータ交換エリアに区別され、前記第１の制御部と前記第２の制御部で共用される共有メモリを有し、
前記第１の制御部は、
トリガーイベントを契機として前記第２の制御部に実行させるデータ処理ごとに、データ処理の内容と、当該データ処理の開始状態と終了状態と、前記トリガーイベントとを前記第２の制御部に通知するとともに前記第２の制御部に当該データ処理の実行を指示する通知指示メッセージを生成し、
生成した通知指示メッセージの前記第２の制御部への伝達方法として、前記共有メモリのメッセージ交換エリアに前記通知指示メッセージを格納する方法と、前記共有メモリのデータ交換エリアに前記通知指示メッセージを格納するとともに前記通知指示メッセージの格納アドレスの情報を前記メッセージ交換エリアに格納する方法のいずれかを通知指示メッセージごとに選択することを特徴とする請求項１３に記載のデータ処理システム。
【請求項１５】
前記第１の制御部が、第１のプログラマブルコントローラに配置され、
前記第２の制御部が、前記第１のプログラマブルコントローラとネットワーク接続されている第２のプログラマブルコントローラに配置されていることを特徴とする請求項１〜１２のいずれかに記載のデータ処理システム。
【請求項１６】
第１のＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）が、
所定のトリガーイベントを検出した際に、前記トリガーイベントを契機として第２のＣＰＵに実行させる複数のデータ処理の各々の内容と、各データ処理の実行前の状態である開始状態と実行後の状態である終了状態と、前記トリガーイベントとを前記第２のＣＰＵに通知して、前記トリガーイベントを契機とする前記複数のデータ処理の実行を前記第２のＣＰＵに指示し、
前記第２のＣＰＵが、
前記第１のＣＰＵから実行が指示された各データ処理を実行するとともに、前記第１のＣＰＵから通知された各データ処理の内容と、各データ処理の開始状態と終了状態と、前記トリガーイベントとを対応付けてデータ処理管理情報として登録し、
前記データ処理管理情報の登録後に検出したイベントがトリガーイベントに一致する場合に、前記第１のＣＰＵからの指示なしに、前記データ処理管理情報に従って状態遷移を行いながら、前記データ処理管理情報に従って前記トリガーイベントに対応付けられている各データ処理を実行することを特徴とするデータ処理方法。
【請求項１７】
第１のＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）に、
所定のトリガーイベントを検出した際に、前記トリガーイベントを契機として第２のＣＰＵに実行させる複数のデータ処理の各々の内容と、各データ処理の実行前の状態である開始状態と実行後の状態である終了状態と、前記トリガーイベントとを前記第２のＣＰＵに通知する処理と、前記トリガーイベントを契機とする前記複数のデータ処理の実行を前記第２のＣＰＵに指示する処理を行わせ、
前記第２のＣＰＵに、
前記第１のＣＰＵから実行が指示された各データ処理を実行させるとともに、前記第１のＣＰＵから通知された各データ処理の内容と、各データ処理の開始状態と終了状態と、前記トリガーイベントとを対応付けてデータ処理管理情報として登録させ、
前記データ処理管理情報の登録後に検出したイベントがトリガーイベントに一致する場合に、前記第１のＣＰＵからの指示なしに、前記データ処理管理情報に従って状態遷移を行いながら、前記データ処理管理情報に従って前記トリガーイベントに対応付けられている各データ処理を実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、二つの制御部を有するデータ処理システムにおいてデータ処理を効率的に行う技術に関する。
なお、以下では、二つのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を有するプログラマブルコントローラを例にして説明を進める。
【背景技術】
【０００２】
第一のＣＰＵ（メインＣＰＵともいう）と第二のＣＰＵ（サブＣＰＵともいう）という二つのＣＰＵから構成される従来のプログラマブルコントローラ（例えば、特許文献１）について説明する。
第一のＣＰＵは、ユーザプログラム実行処理とＩ／Ｏリフレッシュ実行処理とをサイクリックに行うサイクリック実行制御手段を有する。
また、第一のＣＰＵは、第二のＣＰＵから割込み要求を受けた時に、Ｉ／Ｏメモリ内の特定の領域に関するＩ／Ｏリフレッシュ実行処理を割込みで行い、その後にリフレッシュ完了を第二のＣＰＵへ通知する割込み実行制御手段を有する。
また、第二のＣＰＵでは、第一のＣＰＵに対してサイクリックに割込み要求を送出すると共に、これに応答して第一のＣＰＵからリフレッシュ完了が通知されるのを待って、ユーザプログラム実行処理を行うサイクリック実行制御手段が設けられている。
【０００３】
従来のプログラマブルコントローラでは、メインＣＰＵは基本的にサイクル処理を行っており、サブＣＰＵからの割込み通知があった時点で、依頼された割込みタスクＩＤに応じた割込みプログラムを実行する。
サブＣＰＵは、タイマ割込みにより起動され、割込み要求フラグに優先度と割込みタスクＩＤを設定し、割込み信号をオンにする。
割込み信号がオンされると、メインＣＰＵに対してハードウェア割込みが発行される。
メインＣＰＵは、割込み要求フラグを取得し、割込み要求フラグで指定されている優先順位及び割込みタスクＩＤに基づき、Ｉ／Ｏリフレッシュを実行し、都度リフレッシュが完了したことを通知する。
サブＣＰＵは、リフレッシュ完了フラグが通知されると、Ｉ／Ｏメモリからデータの取り込みを行い、Ｉ／Ｏデータに基づいて演算処理を行う。
このように、従来のプログラマブルコントローラでは、タイマ割込みが発生する度に、メインＣＰＵとサブＣＰＵとの間でハンドシェークを行っている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００１−５５０５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上記のように、従来のプログラマブルコントローラは、イベント（特許文献１ではタイマ割込み）が発生する度に、メインＣＰＵとサブＣＰＵ間でハンドシェークを行う必要がある。
また、二つのＣＰＵを搭載したプログラマブルコントローラでは、一方のＣＰＵ（ＣＰＵ＃Ａ）側で入力機器・出力機器に対するＩ／Ｏ制御機能を制御関数としてユーザアプリケーションに提供し、もう一方のＣＰＵ（ＣＰＵ＃Ｂ）側で動作するユーザアプリケーションでは、直接Ｉ／Ｏ制御は行わず、任意の制御関数の実行をＣＰＵ＃Ａ側へ要求し、ＣＰＵ＃Ａ側から関数の実行結果を受け取る方法が取られている。
これらの処理は、ユーザアプリケーションが異なるＣＰＵ上の制御関数を用いて行うため、ＣＰＵ間でメッセージ交換しながら処理を進める必要があり、特許文献１と同様、ハンドシェークを行う必要がある。
サブＣＰＵからメインＣＰＵに要求するＩ／Ｏメモリの領域がその都度変化するようなケースではハンドシェークを毎回行わざるを得ない。
しかし、Ｉ／Ｏメモリの固定された領域のデータを繰り返し収集するようなケースでも、ハンドシェークを毎回行わなくてはいけないという課題がある。
具体例として、半導体製造装置におけるトレーサビリティを目的としたアプリケーションでは、予め指定しておいた入力機器のデータを、定周期でモーションコントローラユニットから発行される割込み（コントローラ同期割込み）を検出する度に、その時点の入力機器のデータ（入力信号の値）を収集し、ログデータとして保管している。
【０００６】
この発明は、上記のような課題を解決することを主な目的の一つとしており、二つの制御部を有するデータ処理システムにおいて繰り返し実行されるデータ処理の効率化を図ることを主な目的とする。
【課題を解決するための手段】
【０００７】
本発明に係るデータ処理システムは、
第１の制御部と第２の制御部とを有し、
前記第１の制御部は、
所定のトリガーイベントを検出した際に、前記トリガーイベントを契機として前記第２の制御部に実行させる複数のデータ処理の各々の内容と、各データ処理の実行前の状態である開始状態と実行後の状態である終了状態と、前記トリガーイベントとを前記第２の制御部に通知して、前記トリガーイベントを契機とする前記複数のデータ処理の実行を前記第２の制御部に指示し、
前記第２の制御部は、
前記第１の制御部から実行が指示された各データ処理を実行するとともに、前記第１の制御部から通知された各データ処理の内容と、各データ処理の開始状態と終了状態と、前記トリガーイベントとを対応付けてデータ処理管理情報として登録し、
前記データ処理管理情報の登録後に検出したイベントがトリガーイベントに一致する場合に、前記第１の制御部からの指示なしに、前記データ処理管理情報に従って状態遷移を行いながら、前記データ処理管理情報に従って前記トリガーイベントに対応付けられている各データ処理を実行することを特徴とする。
【発明の効果】
【０００８】
本発明によれば、第２の制御部においてデータ処理管理情報が登録された後は、トリガーイベントの発生の際に第１の制御部からの指示なしにデータ処理管理情報に従って第２の制御部が自律的にデータ処理を行うことができ、第１の制御部と第２の制御部の間のハンドシェークが不要になり、データ処理の効率化を図ることができる。
【図面の簡単な説明】
【０００９】
【図１】実施の形態１に係るＰＬＣシステムの構成例を示す図。
【図２】実施の形態１に係るコントローラユニットの構成例を示す図。
【図３】実施の形態１に係るサブ側のソフトウェア構成例を示す図。
【図４】実施の形態１に係るメッセージ形式の例を示す図。
【図５】実施の形態１に係るステート情報管理テーブルの例を示す図。
【図６】実施の形態１に係るステートマシン管理テーブルの例を示す図。
【図７】実施の形態１に係るメイン側の動作例を示すフローチャート図。
【図８】実施の形態１に係るメイン側の動作例を示すフローチャート図。
【図９】実施の形態１に係るメイン側の動作例を示すフローチャート図。
【図１０】実施の形態１に係るＳＥＮＤ関数の例を示す図。
【図１１】実施の形態１に係るサブ側の割り込み要因解析部の動作例を示すフローチャート図。
【図１２】実施の形態１に係るサブ側のステートマシン管理部の動作例を示すフローチャート図。
【図１３】実施の形態１に係るサブ側のメッセージ受信部等の動作例を示すフローチャート図。
【図１４】実施の形態１に係るステートマシン管理テーブルの更新動作を示すフローチャート図。
【図１５】実施の形態１に係るメイン側とサブ側との間の通信例を示す図。
【図１６】実施の形態１に係るステートマシン管理テーブルの例を示す図。
【図１７】実施の形態１に係るメイン側とサブ側との間の通信例を示す図。
【図１８】実施の形態２に係るＰＬＣシステムの構成例を示す図。
【図１９】実施の形態２に係るコントローラユニットの構成例を示す図。
【発明を実施するための形態】
【００１０】
実施の形態１．
本実施の形態では、あるイベントをきっかけとして繰り返し実行するＩ／Ｏ制御群の処理シーケンスを第２のＣＰＵが含まれるサブ側に登録することで、サブ側で提供されるＩ／Ｏ制御関数を使用するユーザアプリケーション（Ｉ／Ｏ制御プログラム）の割込みプログラムの実行時間を短縮する。
また、それに伴い、第１のＣＰＵが含まれるメイン側の割込みハンドラ全体の処理時間を短縮するとともに、メイン側の通常タスクの待ち時間を短縮する。
以下、図面を参照して、本実施の形態に係るＰＬＣ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｃｏｎｔｒｏｌｌｅｒ）システムを説明する。
【００１１】
図１は、本実施の形態に係るＰＬＣシステムの構成図である。
図１において、ＰＬＣ１は、様々な種類のＰＬＣユニットを提供しており、ユーザの用途に応じて、任意に組み合わせて構成する。
ＰＬＣユニットには、ベースユニット（図示せず）、電源ユニット（図示せず）、コントローラユニット２、モーションコントローラユニット３、割込みユニット４、ネットワークユニット５、近接Ｉ／Ｏユニット６などがある。
コントローラユニット２は、ＰＬＣシステムにおいて、センサやスイッチなどの入力機器からの入力信号を取り込み、予めプログラムされた条件で出力回路をＯＮ／ＯＦＦすることで、電磁弁や表示灯やモータなどの出力機器を制御する（以降ではＩ／Ｏ制御と称する）。
モーションコントローラユニット３は、サーボアンプ７、ベクトルインバータなどの産業機械のモーション制御を高速・高精度に行う制御機器である。モーションコントローラユニット３では、同期運転や位置追従などのモーション制御を行う位置決めプログラムが動作する。
割込みユニット４は、入力機器と接続し、入力機器がＯＮになった時に、コントローラユニット２やモーションコントローラユニット３に対して外部割込みを発行するＰＬＣユニットである。
ネットワークユニット５は、各種ネットワークと接続し、ネットワーク９上に接続されているリモートＩ／Ｏ８と通信するためのＰＬＣユニットである。
近接Ｉ／Ｏユニット６は、入力機器、または、出力機器と接続するＰＬＣユニットである。
リモートＩ／Ｏ８は、近接Ｉ／Ｏユニット６と同様に入力機器や出力機器と接続する。リモートＩ／Ｏ８は、ＰＬＣ１とは離れた位置に置かれ、コントローラユニット２からはネットワークユニット５を経由して制御される。
【００１２】
図２は、コントローラユニット２の詳細を示す。
図２において、コントローラユニット２は、二つのＣＰＵで構成され、それぞれのＣＰＵ上で異種ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）が動作する。並列動作するＯＳは、以下のように役割を分担する。
ＣＰＵ＃Ａ１１では副ＯＳ１３（リアルタイムＯＳ）が搭載され、近接Ｉ／Ｏユニット６やリモートＩ／Ｏ８に接続されている入力機器・出力機器に対するＩ／Ｏ制御機能を制御関数１５としてユーザアプリケーション１６に提供する。
ＣＰＵ＃Ａ１１、副ＯＳ１３、制御関数１５を合わせて、サブ側ユニット２２と称する（但し、単にサブ側２２又はサブ側ともいう）。
ＣＰＵ＃Ｂ１２では主ＯＳ１４が搭載され、その上でユーザアプリケーション１６が動作する。
ＣＰＵ＃Ｂ１２、主ＯＳ１４、ユーザアプリケーション１６を合わせて、メイン側ユニット２１と称する（但し、単にメイン側２１又はメイン側ともいう）。
メイン側ユニット２１は、直接Ｉ／Ｏ制御は行わず、任意の制御関数１５の実行をサブ側ユニット２２へ要求（以降では実行要求と称する）し、サブ側２２から制御関数１５の実行結果を受け取る（以降では結果応答と称する）。
二つのＣＰＵは、共有メモリ１７に接続される。
実行要求や結果応答は、共有メモリ１７を用いて、実行する制御関数１５の引数など（以降では関数情報と称する）をメッセージとしてメイン側２１とサブ側２２で交換する。
図２では、主ＯＳ１４及び副ＯＳ１３が、それぞれＣＰＵ＃Ａ１２及びＣＰＵ＃Ｂ１１にロードされている状態を示している。主ＯＳ１４及び副ＯＳ１３は、実行前はそれぞれ所定の記憶領域に記憶されており、実行の際にそれぞれＣＰＵに読み出される。
なお、ＣＰＵ＃Ｂ１２は第１のＣＰＵの例であり、ＣＰＵ＃Ａ１１は第２のＣＰＵの例である。
また、メイン側ユニット２１は第１の制御部の例であり、サブ側ユニット２２は第２の制御部の例である。
【００１３】
共有メモリ１７は、データ交換エリア１８、送信メッセージ交換エリア１９、受信メッセージ交換エリア２０から構成される。
データ交換エリア１８は、ユーザアプリケーション１６と制御関数１５の双方から直接読書き可能できる領域である。
ユーザアプリケーション１６は、実行したい制御関数１５の引数のデータサイズに応じて交換エリアを使い分ける。
データサイズが小さい引数の場合は、引数のデータそのものをメッセージの一部として送信メッセージ交換エリア１９経由で渡し、データ交換エリア１８は使用しない。
データサイズが大きい引数の場合は、引数のデータはデータ交換エリア１８に置き、その格納位置（アドレス）をメッセージの一部として送信メッセージ交換エリア１９経由で渡す。
【００１４】
また、コントローラユニット２は、Ｉ／Ｏ制御部２３とメッセージ制御部２４を持つ。
Ｉ／Ｏ制御部２３は、制御関数１５により制御され、入力機器や出力機器を動作させる。
メッセージ制御部２４は、共有メモリ１７にメッセージが記述されたことをメッセージ送信側からメッセージ受信側へ伝えるために割込みを発行する。
メッセージ制御部２４が発行する割込みは、実行要求割込みと結果応答割込みの２種類ある。
実行要求割込みは、メイン側２１からサブ側２２へ実行要求メッセージを通知するための割込みである。
メイン側２１は、メッセージ制御部２４に実行要求割込みの発行を指示することで、メッセージ制御部２４からＣＰＵ＃Ａ１１へ実行要求割込みが発行される。
結果応答割込みは、サブ側２２からメイン側２１へ結果応答メッセージを通知するための割込みである。
サブ側２２は、メッセージ制御部２４に結果応答割込みの発行を指示することで、メッセージ制御部２４からＣＰＵ＃Ｂ１２に結果応答割込みが発行される。
また、モーションコントローラユニット３や割込みユニット４は、コントローラユニット２に対してＨ／Ｗ割込みを発行できる。このＨ／Ｗ割込みは、メイン側２１（ＣＰＵ＃Ｂ１２）とサブ側２２（ＣＰＵ＃Ａ１１）の双方に同時に発行される。
ユーザアプリケーション１６が行うＩ／Ｏ制御は、時間制約でみると２種類に分類される。
一つ目は、同一ＰＬＣ１上のモーションコントローラユニット３や割込みユニット４からのＨ／Ｗ割込みをトリガとする処理である。
この処理は、一定時間を経過すると入力機器や出力機器の情報が更新されてしまうため時間制約が厳しい。
時間制約は厳しい反面、一回のＨ／Ｗ割込みに対して制約時間内であれば複数回のＩ／Ｏ制御を行っても良い。
二つ目は、ユーザアプリケーション１６から任意のタイミングで行う処理である。
この処理は、Ｈ／Ｗ割込みをトリガとする処理と比較して時間的制約はゆるい。
【００１５】
ここで、図１を参照しながら、本実施の形態に係るデータ処理システムの動作の概要を説明する。
なお、詳細な動作手順については、図３以降を用いて後述する。
【００１６】
本実施の形態に係るデータ処理システムは、メイン側ユニット２１とサブ側ユニット２２により実現される。
メイン側ユニット２１は、所定のトリガーイベント（例えば、外部からの割り込みの発生）を検出した際に、当該トリガーイベントを契機としてサブ側ユニット２２に実行させる複数のデータ処理の各々の内容と、各データ処理の実行前の状態である開始状態と実行後の状態である終了状態と、トリガーイベントとをサブ側ユニット２２に通知して、トリガーイベントを契機とする複数のデータ処理の実行をサブ側ユニット２２に指示する。
メイン側ユニット２１は、より具体的には、実行要求メッセージ（通知指示メッセージ）を生成し、生成した実行要求メッセージを共有メモリ１７に格納する。実行要求メッセージは、各データ処理の内容、開始状態、終了状態、トリガーイベントを通知し、また、データ処理の実行を指示するメッセージである。
また、メイン側ユニット２１は、各データ処理の内容として、例えば、各データ処理で実行される制御関数と当該制御関数の実行に用いられる引数の値を実行要求メッセージに記述する。
また、メイン側ユニット２１は、トリガーイベントを契機としてサブ側ユニット２２に複数のデータ処理の実行を指示した後は、後刻にトリガーイベントを更に検出した場合でも、サブ側ユニット２２に複数のデータ処理の実行を指示しない。
【００１７】
サブ側ユニット２２は、メイン側ユニット２１から実行が指示された各データ処理を実行する。例えば、メイン側ユニット２１から通知された引数を用いて制御関数を実行する。
また、サブ側ユニット２２は、メイン側ユニット２１から通知された各データ処理の内容（例えば、制御関数と引数）と、各データ処理の開始状態と終了状態と、トリガーイベントとを対応付けてステートマシン管理テーブル（データ処理管理情報）として登録する。ステートマシン管理テーブルは、サブ側ユニット２２に割り当てられている記憶領域に設けられる。
そして、サブ側ユニット２２は、ステートマシン管理テーブルの登録後に検出したイベントがトリガーイベントに一致する場合に、メイン側ユニット２１からの指示なしに、ステートマシン管理テーブルに従って状態遷移を行いながら、ステートマシン管理テーブルに従ってトリガーイベントに対応付けられている各データ処理を実行する（例えば、ステートマシン管理テーブルの引数を用いて制御関数を実行する）。
より具体的には、サブ側ユニット２２は、ステートマシン管理テーブルの登録後に検出したイベントがトリガーイベントに一致する場合に、メイン側ユニット２１からの指示なしに、データ処理が実行される前の状態を特定し、特定した状態と一致する開始状態と対応付けられているデータ処理をステートマシン管理テーブルから抽出し、抽出したデータ処理を実行し、実行したデータ処理の終了状態へ状態を遷移させる動作を繰り返して、トリガーイベントに対応付けられている各データ処理を実行する。
【００１８】
次に、コントローラユニット２のサブ側２２のソフトウェア構成例を図３に示す。
なお、図３に示す各要素は、副ＯＳ１３の機能に含まれている。
割込みハンドラ３１は、ＣＰＵ＃Ａ１１が割込みを検出した際に動作する。
割込みハンドラ３１は、割込み要因解析部３２、メッセージ受信部３３、メッセージ解析部３４、ステートマシン管理部３５、制御関数スタブ３６、制御関数１５から構成される。
割込み要因解析部３２は、ＣＰＵ＃Ａ１１が検出した割込みの割込み要因を解析する。
メッセージ受信部３３は、メイン側２１から渡された実行要求メッセージから、ヘッダや関数情報などを抽出する。
メッセージ解析部３４は、メッセージ種別に応じて、対応する制御関数スタブ３６を呼び出す。
メッセージ解析部３４は、メイン側２１からどの関数が指定されたのかが分かるように、関数テーブル（図示せず）を用意する。関数テーブルでは、サブ側２２で提供する制御関数スタブ３６と関数番号との対応を管理する。
メッセージ解析部３４は、対応する制御関数スタブ３６を呼び出す時に、引数として実行要求メッセージ（図４参照）を渡す。
ステートマシン管理部３５は、ステートマシンを管理する部分であり、割込み要因や実行要求メッセージの内容をもとに、次に実行すべき処理を決定する。
制御関数スタブ３６は、制御関数１５毎に用意する。制御関数スタブ３６は、実行要求メッセージを解釈して、制御関数１５の引数を求める。また、制御関数スタブ３６は、対応する制御関数１５を実行する。また、制御関数スタブ３６は、対応する制御関数１５の実行結果を返すための結果応答メッセージを受信メッセージ交換エリア２０に記述し、メイン側２１に対して結果応答割込みを発行する。
ステートマシン管理テーブル３７は、サブ側２２の状態によって実行するＩ／Ｏ制御を登録するためのテーブルである。
【００１９】
Ｉ／Ｏ制御実行タスク３８は、メッセージ解析部、制御関数スタブ、制御関数から構成される。
メッセージ解析部、制御関数スタブ、制御関数は、割込みハンドラ３１の同一名称のものと同一の機能を提供する。
違いは、割込みハンドラ３１側は、メイン側２１の割込みハンドラから実行要求された制御関数１５を処理するのに対して、Ｉ／Ｏ制御実行タスク３８は、メイン側２１の通常タスクから実行要求された制御関数１５を処理する点である。
【００２０】
図４は、メイン側２１とサブ側２２が送信メッセージ交換エリア１９及び受信メッセージ交換エリア２０で交換するメッセージのメッセージ形式である。
ヘッダ５１は、メッセージタイプ５３、メッセージサイズ５４、リクエストＩＤ５５で構成される。
メッセージタイプ５３は、メイン側２１とサブ側２２で交換するメッセージの種別を示すものであり、実行要求メッセージと結果応答メッセージがある。
メッセージサイズ５４は、メッセージ全体のサイズである。
リクエストＩＤ５５は、実行要求メッセージと結果応答メッセージを紐付けるものであり、実行要求メッセージを発行する側、すなわち、メイン側２１が付与する。メイン側２１は、結果応答メッセージを受信すると、リクエストＩＤ５５からどの実行要求メッセージに対する応答であるかを特定する。
関数情報５２は、関数番号５６、引数情報５７から構成される。
関数番号５６は、サブ側２２で提供している制御関数１５毎に一意に割り当てられた番号である。関数番号５６は、関数シリーズ６１とシーケンシャル番号６２から構成される。関数シリーズ６１は、通常タスク内でのみ実行可能な制御関数１５と、割込みハンドラ内でのみ実行可能な割込みハンドラ専用の制御関数１５を区別するために割り当てられる。シーケンシャル番号６２は、関数シリーズ６１毎に一意に割り当てられた番号である。
引数情報５７は、関数番号５６で指定された制御関数１５について、引数番号６３、引数タイプ６４、引数フラグ６５、データサイズ６６、引数データ６７を一組として、第一引数から順番に記述したものである。
引数タイプ６４は、入力引数、出力引数、入出力引数、戻り値の４種類から該当するものを選択する。
引数フラグ６５は、データ渡しとアドレス渡しのいずれかを選択する。データ渡しは、引数データ６７としてデータ自体を渡す方法である。また、アドレス渡しは、データはデータ交換エリア１８に格納し、引数データ６７としてその格納位置を渡す方法である。
データサイズ６６は、引数データ６７で渡されるデータのサイズを示す。アドレス渡しの場合は、格納位置（アドレス）のサイズになる。
連続実行フラグ５８は、このメッセージで渡された関数情報５２、イベント５９、状態遷移情報６０を、サブ側２２のステートマシン管理テーブル３７へ登録するか否かを示すフラグである。
連続実行フラグ５８が「あり」の場合は、ステートマシン管理テーブル３７に登録する。また、連続実行フラグ５８が「なし」の場合は、ステートマシン管理テーブル３７には登録しない。また、連続実行フラグ５８が「全クリア」の場合は、該当するイベント５９の関数情報５２を、ステートマシン管理テーブル３７から削除する。
イベント５９は、登録されている関数群を実行するトリガ（きっかけ）を示す。例えば、イベント５９には、コントローラ同期割込み、割込みユニット４からのＨ／Ｗ割込み、ＣＰＵ＃Ｂ１２からの実行要求割込みなどがある。
状態遷移情報６０は、開始状態６８と終了状態６９で構成される。開始状態６８は、その制御関数１５を実行可能な状態を示す。終了状態６９は、その関数が終了した時の状態を示す。割込み発生直後の状態を「Ｓ１」、次に実行する制御関数１５がない状態を「Ｓ０」、その他の状態はユーザアプリケーション１６で定義する。
【００２１】
図５は、サブ側２２で保有するステート情報管理テーブル７０の概略図である。
ステート情報管理テーブル７０は、ステート情報７１を管理するためのテーブルである。
ステート情報管理テーブル７０は、サブ側２２に割り当てられている記憶領域に格納されている。
ステート情報７１は、イベント７２とカレント状態７３から構成される。
イベント７２は、メイン側２１が実行中の処理のトリガ（きっかけ）イベントを示す。
カレント状態７３は、そのイベント７２に対する処理シーケンスの内のどの処理を実行中であるかを示す。
【００２２】
図６は、サブ側２２のステートマシン管理テーブル３７（データ処理管理情報）の概略図である。
ステートマシン管理テーブル３７は、サブ側２２に割り当てられている記憶領域に格納されている。
ステートマシン管理テーブル３７は、イベント８１、開始状態８２、終了状態８３、関数情報８４から構成される。
イベント８１は、登録されている関数群を実行するトリガ（きっかけ）イベントを示す。
開始状態８２は、その制御関数を実行可能な状態を示す。終了状態８３は、その制御関数が終了した時の状態を示す。
サブ側２２は、メイン側２１からの実行要求がなくても、開始状態８２になった時点で、ステートマシン管理テーブル３７に登録されている制御関数を実行する。
関数情報８４は、ステート情報７１のカレント状態７３がステートマシン管理テーブル３７の開始状態８２になった時に実行する制御関数１５の情報であり、図４のメッセージ形式で渡された実行要求メッセージの関数番号５６と引数情報５７を記録する。
また、サブ側２２は、ステートマシン管理テーブル３７の関数情報８４に記録されている制御関数１５を実行完了した時点で、ステート情報７１のカレント状態７３をステートマシン管理テーブル３７の終了状態８３に記録されている状態に更新する。
【００２３】
次に動作について説明する。
ここでは、モーションコントローラユニット３からメイン側２１とサブ側２２の双方にコントローラ同期割込みが発行された場合を例に説明する。
【００２４】
メイン側２１は、ＣＰＵ＃Ｂ１２がコントローラ同期割込みを検出すると、メイン側２１の割込みハンドラを起床する。
コントローラ同期割込みを検出した場合のメイン側２１の割込みハンドラの処理フローを図７に示す。
【００２５】
メイン側２１の割込みハンドラは、まず、割込みが発生した要因（以降では割込み要因と称する）を調べる（Ｓ１０１）。
メイン側２１の割込みハンドラは、ユーザアプリケーション１６が割込み要因毎に用意された割込みプログラムの中から、それに該当する割込みプログラムを実行する。
割込み要因がコントローラ同期割込みである場合（Ｓ１０２の［ＹＥＳ］）、ユーザアプリケーション１６が用意したコントローラ同期割込み用割込みプログラムを実行する（Ｓ１０３）。
コントローラ同期割込み用割込みプログラムには、定期的に発行されるコントローラ同期割込みをトリガとして、毎周期繰り返し実行する一連の処理シーケンスが書かれている。
この一連の処理シーケンスの中に、サブ側２２で提供する制御関数１５を使用するものが含まれている。
メイン側２１の割込みプログラムが、サブ側２２で提供する制御関数１５を実行する場合、メイン側２１とサブ側２２でメッセージ交換する。
最後に、コントローラ同期割込み用割込みプログラムは、一連の処理シーケンスが完了した時点で、割込み要因をクリアする。
メイン側２１は、割込みプログラムの一連の処理シーケンスが完了するまでは、割込みハンドラ３１から抜けない。
そのため、メイン側２１で動作する他のプログラムは待たされることになる。
【００２６】
以降に、図８及び図９を用いて、サブ側２２が提供する制御関数１５をメイン側２１から実行する処理フローを説明する。
なお、ユーザは各制御関数１５の引数毎にデータ渡しとアドレス渡しを選択できるが、本説明では、ユーザが基準となるデータサイズ（以降では基準データサイズと称する）を設けて、基準データサイズより大きい場合はアドレス渡しを、基準データサイズより小さい場合はデータ渡しを選択することを想定する。
【００２７】
メイン側２１は、メッセージ形式に従って、送信メッセージ交換エリア１９に実行要求メッセージを記述する。
まず、メイン側２１は、実行要求したい関数に一意に割り当てられた関数番号５６を記述する（Ｓ２０１）。
次に、メイン側２１は、引数として渡すデータのデータサイズを調べる（Ｓ２０２）。
引数として渡すデータのデータサイズが基準データサイズより小さい場合（Ｓ２０３の［ＹＥＳ］）、メイン側２１は、引数フラグ６５を「データ渡し」に設定し、引数データ６７にはデータ自体を記述する（Ｓ２０４）。
この場合、引数として渡すデータは、実行要求メッセージの一部として送信メッセージ交換エリア１９経由でサブ側２２に渡すため、データ交換エリア１８は確保しない。
引数として渡すデータのデータサイズが基準データサイズより大きい場合（Ｓ２０３の［ＮＯ］）、メイン側２１は、引数で渡すデータのデータサイズ分の領域をデータ交換エリア１８から確保する（Ｓ２０５）。
そして、メイン側２１は、引数フラグ６５を「アドレス渡し」に設定し、引数データ６７には、Ｓ２０５で確保した領域のアドレスを記述する（Ｓ２０６）。
【００２８】
具体的として、ＳＥＮＤ関数の場合を図１０に示す。
この例では、ポインタ型の引数の内、第３引数のｐｓＣｏｎｔｒｏｌＤａｔａと第６引数のｐｓＡｄｄＩｎｆｏは「データ渡し」を選択し、第４引数のｐｕｓＤａｔａＢｕｆは「アドレス渡し」を選択した場合である。
なお、ポインタ型以外の引数は「データ渡し」を選択している。
【００２９】
アドレス渡し／データ渡しの選択は、実行要求メッセージにある引数フラグ６５で指定する。
メイン側２１は、第３引数のｐｓＣｏｎｔｒｏｌＤａｔａ（データ送信実行用のコントロールデータ）には、１６バイト分のデータを実行要求メッセージの一部として記述する。
また、メイン側２１は、第４引数のｐｕｓＤａｔａＢｕｆ（送信データ）には、実行要求メッセージの引数データ６７に、送信データを格納したデータ交換エリア１８の格納位置（アドレス）を指定する。
そのため、実行要求メッセージには送信データは含まれない。
また、メイン側２１は、第６引数のｐｓＡｄｄＩｎｆｏ（付属情報）にはデータ渡しを指定する。
第６引数のｐｓＡｄｄＩｎｆｏに関しては、出力引数であるため、サブ側２２が必要なデータ（１４バイト分の付属情報）を結果応答メッセージの一部として記述する。
そのため、実行要求メッセージでは、メイン側２１からデータサイズ６６は特に指定しない。
【００３０】
メイン側２１は、イベント毎に繰返し実行するＩ／Ｏ制御について、実行要求時に、関数情報５２と連続実行フラグ５８とイベント５９と状態遷移情報６０を実行要求メッセージとして渡す。
連続実行フラグ５８が「あり」は、サブ側２２に対して、イベント５９の条件を満たした時に、この実行要求メッセージで渡した関数情報５２と同一条件で、制御関数１５を実行することを要求することを意味する。
メイン側２１は、繰り返して実行する制御関数１５であるかを確認する（Ｓ２０８）。
繰り返して実行する場合（Ｓ２０８の［ＹＥＳ］）、連続実行フラグ５８を「あり」に指定する（Ｓ２０９）。また、繰り返して実行しない場合（Ｓ２０８の［ＮＯ］）、連続実行フラグ５８を「なし」に指定する（Ｓ２１０）。
メイン側２１は、一連の処理シーケンスを行うイベントを実行要求メッセージのイベント５９に指定する（Ｓ２１１）。
メイン側２１は、この制御関数１５を開始するための条件として、開始状態８２を指定する（Ｓ２１２）。
メイン側２１は、この制御関数１５を正常終了した場合の状態を指定する（Ｓ２１３）。
メイン側２１は、送信メッセージ交換エリア１９に実行要求メッセージを記述し終わった後に、メッセージ制御部２４に対して実行要求割込みの発行を指示する（Ｓ２１４）。それにより、メッセージ制御部２４は、ＣＰＵ＃Ａ１１に対して実行要求割込みを発行する。
メイン側２１は、結果応答割込みの待ち状態になる（Ｓ２１５の［ＮＯ］）。
メイン側２１は、ＣＰＵ＃Ａ１１から結果応答割込みを検出すると（Ｓ２１５の［ＹＥＳ］）、受信メッセージ交換エリア２０から結果応答メッセージを受け取る（Ｓ２１６）。
【００３１】
サブ側２２の割込み要因解析部３２の処理フローを図１１に示す。
【００３２】
サブ側２２は、ＣＰＵ＃Ａ１１が割込みを検出すると、サブ側２２の割込みハンドラ３１を起床する。
サブ側２２の割込みハンドラ３１では、まず、割込み要因解析部３２が割込み要因を確認する（Ｓ３０１）。
割込み要因が実行要求割込みの場合（Ｓ３０２の［実行要求割込みの場合］）、送信メッセージ交換エリア１９に記述されている実行要求メッセージで指定されているイベント５９をトリガ要因とする（Ｓ３０３）。
割込み要因が実行要求割込み以外の場合（Ｓ３０２の［実行要求割込み以外の場合］）、割込み要因をトリガ要因とする（Ｓ３０４）。
まず、割込み要因解析部３２は、Ｓ３０３またはＳ３０４で決めたトリガ要因をキーに、ステート情報管理テーブル７０を検索し、該当するイベント（トリガ要因）が登録されているかを確認する（Ｓ３０５）。
ステート情報管理テーブル７０に該当するイベントが登録されていない場合（Ｓ３０６の［ＮＯ］）、新しいステート情報７１を作成し（Ｓ３０７）、ステート情報管理テーブル７０（図５）に登録する（Ｓ３０８）。
具体的には、ステート情報７１のイベント７２に割込み要因解析部３２で決定したトリガ要因を設定し、ステート情報７１のカレント状態７３をＳ０に設定したステート情報７１をステート情報管理テーブル７０に登録する。
ステート情報管理テーブル７０に該当するトリガ要因が登録されている場合（Ｓ３０６の［ＹＥＳ］）、既に登録済みであるステート情報７１のカレント状態７３をＳ１に設定する（Ｓ３０９）。
次に、割込み要因解析部３２は、割込み要因を確認する（Ｓ３１０）。
割込み要因が実行要求割込みの場合（Ｓ３１０の［実行要求割込みの場合］）、割込み要因解析部３２は、該当するステート情報７１を指定してメッセージ受信部３３に処理要求する（Ｓ３１１）。
割込み要因が実行要求割込み以外の場合（Ｓ３１０の［実行要求割込み以外の場合］）、又は割込み要因が実行要求割込みであって（Ｓ３１０の［実行要求割込みの場合］）Ｓ３１１の処理が行われた後は、割込み要因解析部３２は、該当するステート情報７１を指定してステートマシン管理部３５に処理要求する（Ｓ３１２）。
Ｓ３１１は実行要求メッセージで指定された関数を実行する。
それに対して、Ｓ３１２はステートマシン管理テーブルに登録された関数を実行する。
Ｓ３１１の後にＳ３１２を実行するのは、カレント状態をチェックするためである。
この時、Ｓ３１２に続く図１２のフローにおいて、Ｓ４０２の終了条件又はＳ４０４の終了条件を満たせば処理が終了する。
また、ステートマシン管理テーブルにカレント状態と同じ開始状態があればＳ４０５の処理に移り、Ｓ４０２又はＳ４０４の終了条件を満たすまで処理が続けられる。
なお、Ｓ３１１を受けてメッセージ受信部３３が後述する図１３に示す動作を行う。
図１３のＳ５０８ではＩ／Ｏ制御が行われる。
また、Ｓ３１２を受けてステートマシン管理部３５が後述する図１２に示す動作を行う。
図１２のＳ４０５において図１３のフローが実行されるため、Ｓ３１２から図１３のＳ５０８でＩ／Ｏ制御が行われる。
このように、Ｓ３１１に基づくＳ５０８のＩ／Ｏ制御とＳ３１２に基づくＳ５０８のＩ／Ｏ制御という２つのＩ／Ｏ制御が行われるが、それぞれのＩ／Ｏ制御の対象が異なる。
図１３のＳ５１２で、終了状態で指定されている状態にカレント状態が更新されるので、図１３が呼ばれる度に対象となる関数情報は異なる。
このため、Ｓ３１１に基づくＳ５０８のＩ／Ｏ制御とＳ３１２に基づくＳ５０８のＩ／Ｏ制御とでは、制御対象が異なる。
【００３３】
ステートマシン管理テーブル３７にイベント８１、開始状態８２、終了状態８３、関数情報８４が未登録のイベントが発生した場合は、メイン側２１はサブ側２２に実行要求を行うので、Ｓ３０２の判断は［実行要求割込みの場合］となる。
また、同様にＳ３１０の判断も［実行要求割込みの場合］となる。
このため、Ｓ３１１の動作は、ステートマシン管理テーブル３７にイベント８１、開始状態８２、終了状態８３、関数情報８４が未登録のイベントが発生した場合に、実行要求メッセージに従って制御関数を実行する動作になる。
一方、ステートマシン管理テーブル３７にイベント８１、開始状態８２、終了状態８３、関数情報８４が登録されているイベントが発生した場合は、メイン側２１はサブ側２２に実行要求を行わないので、割り込み要因はトリガーイベントの発生であり、Ｓ３０２の判断は［実行要求割り込み以外の場合］となる。
また、同様に、Ｓ３１０の判断も［実行要求割り込み以外の場合］となる。
このため、Ｓ３１２の動作は、ステートマシン管理テーブル３７の関数情報に従って制御関数を実行する動作となる。
【００３４】
次に、サブ側２２のステートマシン管理部３５の処理フローを図１２に示す。
ステートマシン管理部３５は、ステート情報７１のカレント状態７３を確認する（Ｓ４０１）。
ステート情報７１のカレント状態７３がＳ０の場合（Ｓ４０２の［Ｓ０の場合］）、サブ側２２の割込みハンドラ３１を抜ける。
ステート情報７１のカレント状態７３がＳ０以外の場合（Ｓ４０２の［Ｓ０以外の場合］）、ステートマシン管理部３５は、ステート情報７１のイベント７２とカレント状態７３をキーに、ステートマシン管理テーブル３７のイベント８１と開始状態８２が一致するものを検索し、該当する関数情報８４を特定する（Ｓ４０３）。
該当する関数情報がない場合（Ｓ４０４の［該当関数なし］の場合）、何もせずに、サブ側２２の割込みハンドラ３１を抜ける。
該当する関数情報がある場合（Ｓ４０４の［該当関数あり］の場合）、該当する関数情報８４を指定して、メッセージ受信部３３に処理要求する（Ｓ４０５）。
【００３５】
サブ側２２のメッセージ受信部３３等の処理フローを図１３に示す。
【００３６】
サブ側２２は、メイン側２１の割込みハンドラが記述した実行要求メッセージは、サブ側２２の割込みハンドラ３１内で最優先して行うことで、サブ側２２で動作している他のプログラムの影響を受けないようにする。
しかし、実行要求メッセージは、メイン側２１の通常タスク、または、メイン側２１の割込みハンドラのいずれかからも発行できる。
そのため、メイン側２１の割込みハンドラからの実行要求メッセージであることを識別するために、実行要求メッセージで指定された関数シリーズ６１を用いて判定する。
メッセージ受信部３３は、実行要求メッセージで指定された関数シリーズ６１を確認する（Ｓ５０１）。
実行要求された関数の関数シリーズ６１が割込みハンドラ内専用制御関数である場合（Ｓ５０２の［ＹＥＳ］の場合）、すなわち、メイン側２１の割込みハンドラからの実行要求メッセージについては、サブ側２２の割込みハンドラ３１内で、指定された関数の実行からメイン側２１への結果応答の発行まで最優先で処理する。
そのため、メッセージ受信部３３は、サブ側２２の割込みハンドラ３１のメッセージ解析部３４に、メッセージ解析を要求する（Ｓ５０３）。
メッセージ解析部３４は、実行要求メッセージで指定された関数番号５６を抽出する（Ｓ５０４）。
メッセージ解析部３４は、Ｓ５０４で抽出した関数番号５６をキーとして関数テーブル（図示せず）を検索し、指定された関数番号５６に紐付けられている制御関数スタブ３６を特定する（Ｓ５０５）。
メッセージ解析部３４は、制御関数スタブ３６に対して、制御関数スタブ３６と１対１で対応する制御関数１５の実行を要求する（Ｓ５０６）。
制御関数スタブ３６は、実行要求メッセージで指定された引数データ６７をもとに、制御関数１５の各引数で渡すデータを取得し、制御関数１５に渡す（Ｓ５０７）。
この時、引数フラグ６５の値によって、送信メッセージ交換エリア１９、または、データ交換エリア１８のいずれにあるかを特定する。
制御関数１５は、Ｓ５０７で引数として渡されたデータをもとに、Ｉ／Ｏ制御を行う（Ｓ５０８）。
制御関数スタブ３６は、制御関数１５の実行結果をもとに、受信メッセージ交換エリア２０に、結果応答メッセージを記述する（Ｓ５０９）。
図１０の例では、ＳＥＮＤ関数の戻り値、および、出力引数である第６引数のｐｓＡｄｄＩｎｆｏ（付属情報）のデータ（１４バイト分）を、結果応答メッセージとして、受信メッセージ交換エリア２０に記述する。
制御関数スタブ３６は、メッセージ制御部２４に対して結果応答割込みの発行を指示する（Ｓ５１０）。それにより、メッセージ制御部２４は、ＣＰＵ＃Ｂ１２に対して結果応答割込みを発行する。
制御関数スタブ３６は、実行要求メッセージの連続実行フラグ５８を見て、ステートマシン管理テーブル３７を登録・変更・削除を行う（Ｓ５１１）。本処理の処理フローは図１４に示す。
制御関数スタブ３６は、最後に、実行要求メッセージの終了状態６９で指定されている状態に、ステート情報７１のカレント状態７３を更新し（Ｓ５１２）、ステートマシン管理部３５に処理が戻る。
【００３７】
なお、図１３のフローは、図１１のＳ３１１でメッセージ受信部３３が呼び出された場合の動作を示しているが、メッセージ受信部３３が図１２のＳ４０５で呼び出されている場合は、ステートマシン管理テーブル３７の関数情報８４がＳ４０５で指定されているので、Ｓ５０１、Ｓ５０３、Ｓ５０４、Ｓ５０７にある「実行要求メッセージ」を「関数情報」と読み替え、Ｓ５０５においてメッセージ解析部３４が関数情報８４の関数番号５６に対応する制御関数スタブ３６を特定する。
なお、上記の「関数情報」は、図４のメッセージ形式内の関数情報、または、図６のステートマシン管理テーブル内の関数情報のいずれかを指す。
また、Ｓ５０７では、制御関数スタブ３６が関数情報８４の引数情報５７中の引数データ６７をもとに該当するデータを取得する。
Ｓ５０８〜Ｓ５１０は、図１３に示した通りの処理が行われる。
一方で、図１３が図１２のＳ４０５から続く場合は、ステートマシン管理テーブル３７は既に生成済みなので、Ｓ５１１は行われない。
また、図１３が図１２のＳ４０５から続く場合は、Ｓ５１２の「実行要求メッセージの終了状態」は、「図４のメッセージ形式内の終了状態、または、図６のステートマシン管理テーブル内の終了状態」と読み替える。
【００３８】
制御関数スタブ３６によるステートマシン管理テーブル３７の更新の処理フローを図１４に示す。
制御関数スタブ３６は、実行要求メッセージの連続実行フラグ５８を確認する（Ｓ６０１）。
実行要求メッセージの連続実行フラグ５８が「なし」の場合（Ｓ６０２の［なしの場合］）、制御関数スタブ３６は、実行要求メッセージのイベント５９と開始状態６８をキーとして、ステートマシン管理テーブル３７を検索する（Ｓ６０３）。
ステートマシン管理テーブル３７に既に登録されている場合（Ｓ６０４の［登録ありの場合］）、制御関数スタブ３６は、実行要求メッセージのイベント５９と開始状態６８と一致する情報を、ステートマシン管理テーブル３７から削除する（Ｓ６０５）。
また、ステートマシン管理テーブル３７に登録されていない場合（Ｓ６０４の［登録なしの場合］）、何もしない。
実行要求メッセージの連続実行フラグ５８が「あり」の場合（Ｓ６０２の［ありの場合］）、制御関数スタブ３６は、実行要求メッセージのイベント５９と開始状態６８をキーとして、ステートマシン管理テーブル３７を検索する（Ｓ６０６）。
ステートマシン管理テーブル３７に既に登録されている場合（Ｓ６０７の［登録ありの場合］）、制御関数スタブ３６は、ステートマシン管理テーブル３７を、実行要求メッセージの関数情報５２と終了状態６９に更新する（Ｓ６０８）。
また、ステートマシン管理テーブル３７に登録されていない場合（Ｓ６０７の［登録なしの場合］）、制御関数スタブ３６は、ステートマシン管理テーブル３７に、実行要求メッセージをもとに追加する（Ｓ６０９）。
実行要求メッセージの連続実行フラグ５８が「全クリア」の場合（Ｓ６０２の［全クリアの場合］）、制御関数スタブ３６は、実行要求メッセージのイベント５９と一致する情報を、ステートマシン管理テーブル３７から削除する（Ｓ６１０）。この時、制御関数スタブ３６は、自身の関数情報８４に限らず、実行要求メッセージのイベント５９に対する処理シーケンスとして登録されている全ての関数情報８４を削除する。
【００３９】
一方、実行要求された関数の関数シリーズ６１が割込みハンドラ内専用制御関数でない場合（Ｓ５０２の［ＮＯ］の場合）、すなわち、メイン側２１の通常タスクからの実行要求メッセージについては、サブ側２２は、実行要求メッセージで指定された優先度（図示せず）でＩ／Ｏ制御実行タスク３８を起動し、ＯＳスケジューラ３９により優先制御する。
なお、Ｉ／Ｏ制御実行タスク３８のメッセージ解析部、制御関数スタブ、制御関数は、それぞれ、サブ側２２の割込みハンドラ３１内の同一名称の処理部（メッセージ解析部３４、制御関数スタブ３６、制御関数１５）と同等の機能である。
そのため、Ｉ／Ｏ制御実行タスク３８の処理フローについての説明は省略する。
【００４０】
第一の具体例として、モーションコントローラユニット３から定期的に発行されるコントローラ同期割込み毎に、毎回同一の入力機器のデータを収集する場合で説明する。
ここでは、ユーザアプリケーション１６は、図６のように三回のＲＥＡＤ関数（但し、割込みハンドラ内専用制御関数とする）を用いてデータ収集することを想定する。
具体的には、コントローラ同期割込みを検出した直後に、まずはＲＥＡＤ関数（引数データ＃１）を実行し、ＲＥＡＤ関数（引数データ＃１）が実行完了してからＲＥＡＤ関数（引数データ＃２）を実行し、ＲＥＡＤ関数（引数データ＃２）が実行完了してからＲＥＡＤ関数（引数データ＃３）を実行する。
また、電源投入時、サブ側２２のステートマシン管理テーブル３７に何も登録されていないものとし、メイン側２１がコントローラ同期割込みを検出した時に実行される割込みハンドラで、サブ側に繰り返し実行の指示を出すものとする。
【００４１】
ユーザアプリケーション１６では、まず、状態遷移を定義する。
コントローラ同期割込み発生直後をＳ１と定義する。
また、一つ目の制御関数１５であるＲＥＡＤ関数（引数データ＃１）は、開始状態をＳ１、終了状態をＳ２と定義する。
また、二つ目の制御関数１５であるＲＥＡＤ関数（引数データ＃２）は、開始状態をＳ２、終了状態をＳ３と定義する。
また、三つ目の制御関数１５であるＲＥＡＤ関数（引数データ＃３）は、開始状態をＳ３、終了状態をＳ０と定義する。
ここで、ＲＥＡＤ関数（引数データ＃３）の後に実行する制御関数１５はないため、終了状態をＳ０としている。
ユーザアプリケーション１６は、ここで定義した開始状態と終了状態を、実行要求メッセージの状態遷移情報６０で指定する。
また、これらの制御関数１５は、コントローラ同期割込みをトリガとするため、実行要求メッセージのイベント５９を「コントローラ同期割込み」と指定する。
【００４２】
電源投入後、サブ側２２は、コントローラ同期割込みを検出すると、サブ側２２の割込みハンドラ３１が起床される。
この時点ではステートマシン管理テーブル３７に何も登録されていないため、サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込み以外の場合］→Ｓ３０４→Ｓ３０５→Ｓ３０６の［ＮＯ］→Ｓ３０７→Ｓ３０８→Ｓ３１０の［実行要求割込み以外の場合］→Ｓ３１２の手順で処理を行い、ステートマシン管理部３５に実行要求する。
Ｓ３０８の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込み、カレント状態７３＝Ｓ０のステート情報７１が登録される。
次に、サブ側２２の割込みハンドラ３１は、図１２のＳ４０１→Ｓ４０２の［Ｓ０の場合］の手順で処理を行い、割込みハンドラ３１を抜ける。
【００４３】
メイン側２１は、コントローラ同期割込みを検出すると、メイン側２１の割込みハンドラが起床され、図７の処理フローが動作する。
図７のＳ１０３のコントローラ同期割込み用割込みプログラムでは、図８及び図９の処理フローで、三回のＲＥＡＤ関数を順番に実行する。
この時、コントローラ同期割込み毎に同一の処理を繰り返し行わせるために、連続実行フラグを「あり」に指定する（図９のＳ２０９）。
【００４４】
サブ側２２は、メイン側２１からの一つ目のＲＥＡＤ関数の実行要求割込みを検出すると、サブ側２２の割込みハンドラ３１が起床される。サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込みの場合］→Ｓ３０３→Ｓ３０５→Ｓ３０６の［ＹＥＳ］→Ｓ３０９→Ｓ３１０の［実行要求割込みの場合］→Ｓ３１１の手順で処理を行い、メッセージ受信部３３に処理要求する。
Ｓ３０９の処理の結果として、ステート情報管理テーブル７０が、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ１に更新される。
【００４５】
次に、サブ側２２の割込みハンドラ３１は、図１１のＳ３１１の中で図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＲＥＡＤ関数（引数データ＃１）で指定された内容に従って、入力機器のデータを読込み、メイン側２１に結果応答メッセージを返す。
次に、サブ側２２の割込みハンドラ３１は、Ｓ５１１の中で図１４の処理フローが動作し、Ｓ６０１→Ｓ６０２の［ありの場合］→Ｓ６０６→Ｓ６０７の［登録なしの場合］→Ｓ６０９の手順で処理を行い、図６の一段目のようにＲＥＡＤ関数（引数データ＃１）に関する情報がステートマシン管理テーブル３７に登録される（Ｓ６０９）。
また、Ｓ５１２の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ２に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０以外の場合］→Ｓ４０３→Ｓ４０４の［該当関数なしの場合］の手順で処理を行い、割込みハンドラ３１の処理を終了する。
この時は、イベント７２＝コントローラ同期割込み、カレント状態７３＝Ｓ２のステート情報７１がステートマシン管理テーブル３７に登録されていないため、Ｓ４０４の［該当関数なしの場合］の場合になる。
【００４６】
サブ側２２は、メイン側２１からの二つ目のＲＥＡＤ関数の実行要求割込みを検出すると、サブ側２２の割込みハンドラ３１が起床される。
サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込みの場合］→Ｓ３０３→Ｓ３０５→Ｓ３０６の［ＹＥＳ］→Ｓ３０９→Ｓ３１０の［実行要求割込みの場合］→Ｓ３１１の手順で処理を行い、メッセージ受信部３３に処理要求する。
Ｓ３０９の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ１に更新される。
【００４７】
次に、サブ側２２の割込みハンドラ３１は、図１１のＳ３１１の中で図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＲＥＡＤ関数（引数データ＃２）で指定された内容に従って、入力機器のデータを読込み、メイン側２１に結果応答メッセージを返す。
次に、サブ側２２の割込みハンドラ３１は、Ｓ５１１の中で図１４の処理フローが動作し、Ｓ６０１→Ｓ６０２の［ありの場合］→Ｓ６０６→Ｓ６０７の［登録なしの場合］→Ｓ６０９の手順で処理を行い、図６の二段目のようにＲＥＡＤ関数（引数データ＃２）に関する情報がステートマシン管理テーブル３７に登録される（Ｓ６０９）。
また、Ｓ５１２の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ３に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０以外の場合］→Ｓ４０３→Ｓ４０４の［該当関数なしの場合］の手順で処理を行い、割込みハンドラ３１の処理を終了する。
この時は、イベント７２＝コントローラ同期割込み、カレント状態７３＝Ｓ３のステート情報７１がステートマシン管理テーブル３７に登録されていないため、Ｓ４０４の［該当関数なしの場合］の場合になる。
【００４８】
サブ側２２は、メイン側２１からの三つ目のＲＥＡＤ関数の実行要求割込みを検出すると、サブ側２２の割込みハンドラ３１が起床される。
サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込みの場合］→Ｓ３０３→Ｓ３０５→Ｓ３０６の［ＹＥＳ］→Ｓ３０９→Ｓ３１０の［実行要求割込みの場合］→Ｓ３１１の手順で処理を行い、メッセージ受信部３３に処理要求する。
Ｓ３０９の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ１に更新される。
【００４９】
次に、サブ側２２の割込みハンドラ３１は、図１１のＳ３１１の中で図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＲＥＡＤ関数（引数データ＃３）で指定された内容に従って、入力機器のデータを読込み、メイン側２１に結果応答メッセージを返す。
次に、サブ側２２の割込みハンドラ３１は、Ｓ５１１の中で図１４の処理フローが動作し、Ｓ６０１→Ｓ６０２の［ありの場合］→Ｓ６０６→Ｓ６０７の［登録なしの場合］→Ｓ６０９の手順で処理を行い、図６の三段目のようにＲＥＡＤ関数（引数データ＃３）に関する情報がステートマシン管理テーブル３７に登録される（Ｓ６０９）。
また、Ｓ５１２の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ０に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０の場合］の手順で処理を行い、割込みハンドラ３１の処理を終了する。
【００５０】
以降に、ステートマシン管理テーブル３７が更新された後に、サブ側２２がコントローラ同期割込みを検出した場合の、サブ側２２の割込みハンドラ３１の処理を説明する。
サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込み以外の場合］→Ｓ３０４→Ｓ３０５→Ｓ３０６の［ＹＥＳ］→Ｓ３０９→Ｓ３１０の［実行要求割込み以外の場合］→Ｓ３１２の手順で処理を行い、ステートマシン管理部３５に実行要求する。
Ｓ３０９の処理の結果として、ステート情報管理テーブル７０にあるイベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３がＳ１に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２のＳ４０１→Ｓ４０２の［Ｓ０以外の場合］→Ｓ４０３→Ｓ４０４の［該当関数ありの場合］→Ｓ４０５の手順で処理を行う。
この時、ステートマシン管理テーブル３７は図６のように登録されており、ステート情報７１はステートマシン管理テーブル３７の一段目に該当するため、ＲＥＡＤ関数（引数データ＃１）の関数情報を指定してメッセージ受信部３３に処理要求する。
【００５１】
次に、サブ側２２の割込みハンドラ３１は、図１２のＳ４０５から図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＲＥＡＤ関数（引数データ＃１）で指定された内容に従って、入力機器のデータを読込み、メイン側２１に結果応答メッセージを返す。
また、Ｓ５１２の処理の結果として、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３は、ステートマシン管理テーブル３７の一段目の終了状態８３として登録されているＳ２に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０以外の場合］→Ｓ４０３→Ｓ４０４の［該当関数ありの場合］→Ｓ４０５の手順で処理を行う。
この時は、イベント７２＝コントローラ同期割込み、カレント状態７３＝Ｓ２のステート情報７１がステートマシン管理テーブル３７の二段目に登録されているため、二段目に登録されているＲＥＡＤ関数（引数データ＃２）を指定して、メッセージ受信部３３に処理要求する。
【００５２】
次に、サブ側２２の割込みハンドラ３１は、図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＲＥＡＤ関数（引数データ＃２）で指定された内容に従って、入力機器のデータを読込み、メイン側２１に結果応答メッセージを返す。
また、Ｓ６０８の処理の結果として、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３は、ステートマシン管理テーブル３７の二段目の終了状態８３として登録されているＳ３に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０以外の場合］→Ｓ４０３→Ｓ４０４の［該当関数ありの場合］→Ｓ４０５の手順で処理を行う。
この時は、イベント７２＝コントローラ同期割込み、カレント状態７３＝Ｓ３のステート情報７１がステートマシン管理テーブル３７の三段目に登録されているため、三段目に登録されているＲＥＡＤ関数（引数データ＃３）を指定して、メッセージ受信部３３に処理要求する。
【００５３】
次に、サブ側２２の割込みハンドラ３１は、図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＲＥＡＤ関数（引数データ＃３）で指定された内容に従って、入力機器のデータを読込み、メイン側２１に結果応答メッセージを返す。
また、Ｓ６０８の処理の結果として、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３は、ステートマシン管理テーブル３７の三段目の終了状態８３として登録されているＳ０に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０の場合］の手順で処理を行う。カレント状態７３＝Ｓ０はイベント８１を検出した場合の処理シーケンスの最後を示すため、割込みハンドラ３１の処理を終了する。
【００５４】
以上のように、トレーサビリティに必要なログデータ収集のように毎回同じＩ／Ｏ情報を読込む処理について、図１５のようにメイン側２１とサブ側２２間の関数実行のためのハンドシェークにおけるメッセージ数、及び、それに伴う処理（メッセージ生成／メモリ確保・解放）を減らすことで、メイン側２１の割込み処理時間を短縮する。
また、データサイズ６６が大きい引数をデータ交換エリア１８経由で渡すことで、メッセージ交換に係るデータコピーを削減でき、Ｉ／Ｏ制御の処理時間を短縮できる。
【００５５】
第二の具体例として、モーションコントローラユニット３から定期的に発行されるコントローラ同期割込み毎に、毎回同一の入力機器のデータを取得し、その取得したデータによって、出力機器への指示や入力機器のデータの収集の実施有無を変える場合で説明する。
ここでは、ユーザアプリケーション１６は、図１６のように一回のＲＥＡＤ関数（但し、割込みハンドラ内専用制御関数とする）を用いてデータ収集し、そのデータによって、一回のＷＲＩＴＥ関数（但し、割込みハンドラ内専用制御関数とする）と一回のＲＥＡＤ関数（但し、割込みハンドラ内専用関数とする）を用いて出力機器の制御やデータ収集することを想定する。
また、電源投入時、サブ側２２のステートマシン管理テーブル３７に何も登録されていないものとし、メイン側２１がコントローラ同期割込みを検出した時に実行される割込みハンドラで、サブ側に繰り返し実行の指示を出すものとする。
【００５６】
ユーザアプリケーション１６では、まず、状態遷移を定義する。コントローラ同期割込み発生直後をＳ１と定義する。また、一つ目の制御関数１５であるＲＥＡＤ関数（引数データ＃ａ）は、開始状態をＳ１、終了状態をＳ２と定義する。
また、Ｓ２の状態では、ＲＥＡＤ関数（引数データ＃ａ）で取得したデータを演算などの内部処理を行うものと定義し、その処理が完了した状態をＳ３と定義する。
また、二つ目の制御関数１５であるＷＲＩＴＥ関数（引数データ＃ｂ）は、開始状態をＳ３、終了状態をＳ４と定義する。
また、三つ目の制御関数１５であるＲＥＡＤ関数（引数データ＃ｃ）は、開始状態をＳ４、終了状態をＳ０と定義する。
ここで、ＲＥＡＤ関数（引数データ＃ｃ）の後に実行する制御関数１５はないため、終了状態をＳ０としている。
ユーザアプリケーション１６は、ここで定義した開始状態と終了状態を、実行要求メッセージの状態遷移情報６０で指定する。
また、これらの制御関数１５は、コントローラ同期割込みをトリガとするため、実行要求メッセージのイベント５９を「コントローラ同期割込み」と指定する。
【００５７】
電源投入後、サブ側２２は、コントローラ同期割込みを検出すると、サブ側２２の割込みハンドラ３１が起床される。
この時点ではステートマシン管理テーブル３７に何も登録されていないため、サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込み以外の場合］→Ｓ３０４→Ｓ３０５→Ｓ３０６の［ＮＯ］→Ｓ３０７→Ｓ３０８→Ｓ３１０の［実行要求割込み以外の場合］→Ｓ３１２の手順で処理を行い、ステートマシン管理部３５に実行要求する。
Ｓ３０８の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込み、カレント状態７３＝Ｓ０のステート情報７１が登録される。
次に、サブ側２２の割込みハンドラ３１は、図１２のＳ４０１→Ｓ４０２の［Ｓ０の場合］の手順で処理を行い、割込みハンドラ３１を抜ける。
【００５８】
メイン側２１は、コントローラ同期割込みを検出すると、メイン側２１の割込みハンドラが起床され、図７の処理フローが動作する。
図７のＳ１０３のコントローラ同期割込み用割込みプログラムでは、図８及び図９の処理フローで、三回の制御関数１５を順番に実行する。
この時、コントローラ同期割込み毎に同一の処理を繰り返し行わせるために、連続実行フラグを「あり」に指定する（図９のＳ２０９）。
【００５９】
サブ側２２は、メイン側２１からの一つ目のＲＥＡＤ関数の実行要求割込みを検出すると、サブ側２２の割込みハンドラ３１が起床される。
サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込みの場合］→Ｓ３０３→Ｓ３０５→Ｓ３０６の［ＹＥＳ］→Ｓ３０９→Ｓ３１０の［実行要求割込みの場合］→Ｓ３１１の手順で処理を行い、メッセージ受信部３３に処理要求する。
Ｓ３０９の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ１に更新される。
【００６０】
次に、サブ側２２の割込みハンドラ３１は、図１１のＳ３１１の中で図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＲＥＡＤ関数（引数データ＃ａ）で指定された内容に従って、入力機器のデータを読込み、メイン側２１に結果応答メッセージを返す。
次に、サブ側２２の割込みハンドラ３１は、Ｓ５１１の中で図１４の処理フローが動作し、Ｓ６０１→Ｓ６０２の［ありの場合］→Ｓ６０６→Ｓ６０７の［登録なしの場合］→Ｓ６０９の手順で処理を行い、図１６の一段目のようにＲＥＡＤ関数（引数データ＃ａ）に関する情報がステートマシン管理テーブル３７に登録される（Ｓ６０９）。
また、Ｓ５１２の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ２に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０以外の場合］→Ｓ４０３→Ｓ４０４の［該当関数なしの場合］の手順で処理を行い、割込みハンドラ３１の処理を終了する。この時は、イベント７２＝コントローラ同期割込み、カレント状態７３＝Ｓ２のステート情報７１がステートマシン管理テーブル３７に登録されていないため、Ｓ４０４の［該当関数なしの場合］の場合になる。
【００６１】
サブ側２２は、メイン側２１からの二つ目のＷＲＩＴＥ関数の実行要求割込みを検出すると、サブ側２２の割込みハンドラ３１が起床される。サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込みの場合］→Ｓ３０３→Ｓ３０５→Ｓ３０６の［ＹＥＳ］→Ｓ３０９→Ｓ３１０の［実行要求割込みの場合］→Ｓ３１１の手順で処理を行い、メッセージ受信部３３に処理要求する。
Ｓ３０９の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ１に更新される。
【００６２】
次に、サブ側２２の割込みハンドラ３１は、図１１のＳ３１１の中で図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＷＲＩＴＥ関数（引数データ＃ｂ）で指定された内容に従って、出力機器を制御し、メイン側２１に結果応答メッセージを返す。
次に、サブ側２２の割込みハンドラ３１は、Ｓ５１１の中で図１４の処理フローが動作し、Ｓ６０１→Ｓ６０２の［ありの場合］→Ｓ６０６→Ｓ６０７の［登録なしの場合］→Ｓ６０９の手順で処理を行い、図１６の二段目のようにＷＲＩＴＥ関数（引数データ＃ｂ）に関する情報がステートマシン管理テーブル３７に登録される（Ｓ６０９）。
また、Ｓ５１２の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ４に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０以外の場合］→Ｓ４０３→Ｓ４０４の［該当関数なしの場合］の手順で処理を行い、割込みハンドラ３１の処理を終了する。
この時は、イベント７２＝コントローラ同期割込み、カレント状態７３＝Ｓ４のステート情報７１がステートマシン管理テーブル３７に登録されていないため、Ｓ４０４の［該当関数なしの場合］の場合になる。
【００６３】
サブ側２２は、メイン側２１からの三つ目のＲＥＡＤ関数の実行要求割込みを検出すると、サブ側２２の割込みハンドラ３１が起床される。
サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込みの場合］→Ｓ３０３→Ｓ３０５→Ｓ３０６の［ＹＥＳ］→Ｓ３０９→Ｓ３１０の［実行要求割込みの場合］→Ｓ３１１の手順で処理を行い、メッセージ受信部３３に処理要求する。
Ｓ３０９の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ１に更新される。
【００６４】
次に、サブ側２２の割込みハンドラ３１は、図１１のＳ３１１の中で図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＲＥＡＤ関数（引数データ＃ｃ）で指定された内容に従って、入力機器のデータを読込み、メイン側２１に結果応答メッセージを返す。
次に、サブ側２２の割込みハンドラ３１は、Ｓ５１１の中で図１４の処理フローが動作し、Ｓ６０１→Ｓ６０２の［ありの場合］→Ｓ６０６→Ｓ６０７の［登録なしの場合］→Ｓ６０９の手順で処理を行い、図６の三段目のようにＲＥＡＤ関数（引数データ＃ｃ）に関する情報がステートマシン管理テーブル３７に登録される（Ｓ６０９）。
また、Ｓ５１２の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ０に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０の場合］の手順で処理を行い、割込みハンドラ３１の処理を終了する。
【００６５】
以降に、ステートマシン管理テーブル３７が更新された後に、サブ側２２がコントローラ同期割込みを検出した場合の、サブ側２２の割込みハンドラ３１の処理を説明する。
サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込み以外の場合］→Ｓ３０４→Ｓ３０５→Ｓ３０６の［ＹＥＳ］→Ｓ３０９→Ｓ３１０の［実行要求割込み以外の場合］→Ｓ３１２の手順で処理を行い、ステートマシン管理部３５に実行要求する。
Ｓ３０９の処理の結果として、ステート情報管理テーブル７０にあるイベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３がＳ１に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２のＳ４０１→Ｓ４０２の［Ｓ０以外の場合］→Ｓ４０３→Ｓ４０４の［該当関数ありの場合］→Ｓ４０５の手順で処理を行う。
この時、ステートマシン管理テーブル３７は図１６のように登録されており、ステート情報７１はステートマシン管理テーブル３７の一段目に該当するため、ＲＥＡＤ関数（引数データ＃ａ）の関数情報を指定してメッセージ受信部３３に処理要求する。
【００６６】
次に、サブ側２２の割込みハンドラ３１は、図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＲＥＡＤ関数（引数データ＃ａ）で指定された内容に従って、入力機器のデータを読込み、メイン側２１に結果応答メッセージを返す。
また、Ｓ６０８の処理の結果として、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３は、ステートマシン管理テーブル３７の一段目の終了状態８３として登録されているＳ２に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０以外の場合］→Ｓ４０３→Ｓ４０４の［該当関数なしの場合］の手順で処理を行う。
この時は、イベント７２＝コントローラ同期割込み、カレント状態７３＝Ｓ２のステート情報７１がステートマシン管理テーブル３７に登録されていないため、割込みハンドラ３１の処理を完了する。
【００６７】
第一の具体例とは異なり、メイン側２１は、ＲＥＡＤ関数（引数データ＃ａ）で取得したデータをもとに、ＷＲＩＴＥ関数（引数データ＃ｂ）やＲＥＡＤ関数（引数データ＃ｃ）を行うため、サブ側２２は、ＲＥＡＤ関数（引数データ＃ａ）の実行が完了した時点で割込みハンドラ３１を一旦終了し、メイン側２１からの実行要求がくるまで、コントローラ同期割込みに対する処理を進めない。
【００６８】
サブ側２２は、メイン側２１からのＷＲＩＴＥ関数（引数データ＃ｂ）の実行要求割込みを検出すると、サブ側２２の割込みハンドラ３１が起床される。
サブ側２２の割込みハンドラ３１は、図１１のＳ３０１→Ｓ３０２の［実行要求割込みの場合］→Ｓ３０３→Ｓ３０５→Ｓ３０６の［ＹＥＳ］→Ｓ３０９→Ｓ３１０の［実行要求割込みの場合］→Ｓ３１１の手順で処理を行い、メッセージ受信部３３に処理要求する。
Ｓ３０９の処理の結果として、ステート情報管理テーブル７０に、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ１に更新される。
【００６９】
次に、サブ側２２の割込みハンドラ３１は、図１１のＳ３１１の中で図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＷＲＩＴＥ関数（引数データ＃ｂ）で指定された内容に従って、出力機器を制御し、メイン側２１に結果応答メッセージを返す。
次に、サブ側２２の割込みハンドラ３１は、Ｓ５１１の中で図１４の処理フローが動作し、Ｓ６０１→Ｓ６０２の［ありの場合］→Ｓ６０６→Ｓ６０７の［登録なしの場合］→Ｓ６０９の手順で処理を行う。
また、Ｓ６０９の処理の結果として、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３＝Ｓ４に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２のＳ４０１→Ｓ４０２の［Ｓ０以外の場合］→Ｓ４０３→Ｓ４０４の［該当関数ありの場合］→Ｓ４０５の手順で処理を行う。
この時、ステートマシン管理テーブル３７は図１６のように登録されており、ステート情報７１はステートマシン管理テーブル３７の三段目に該当するため、ＲＥＡＤ関数（引数データ＃ｃ）の関数情報を指定してメッセージ受信部３３に処理要求する。
【００７０】
次に、サブ側２２の割込みハンドラ３１は、図１３のＳ５０１→Ｓ５０２の［ＹＥＳ］→Ｓ５０３→Ｓ５０４〜Ｓ５１０の手順で処理を行い、ＲＥＡＤ関数（引数データ＃ｃ）で指定された内容に従って、入力機器のデータを読込み、メイン側２１に結果応答メッセージを返す。
また、Ｓ６０８の処理の結果として、イベント７２＝コントローラ同期割込みのステート情報７１のカレント状態７３は、ステートマシン管理テーブル３７の三段目の終了状態８３として登録されているＳ０に更新される。
次に、サブ側２２の割込みハンドラ３１は、Ｓ３１２の中で図１２の処理フローが動作し、Ｓ４０１→Ｓ４０２の［Ｓ０の場合］の手順で処理を行う。
カレント状態７３＝Ｓ０はイベント８１を検出した場合の処理シーケンスの最後を示すため、割込みハンドラ３１の処理を終了する。
【００７１】
以上のように、モーション制御に同期したリアルタイムな逐次制御や時々刻々と目標値が変化する追従制御のように、入力機器から読み込んだデータの値によって処理を変える場合についても、図１７のようにメイン側２１とサブ側２２間の関数実行のためのハンドシェークにおけるメッセージ数、及び、それに伴う処理（メッセージ生成／メモリ確保・解放）を減らすことで、メイン側２１の割込み処理時間を短縮する。
【００７２】
以上の説明では、コントローラ同期割込みを用いた場合について説明したが、トリガ要因として他の要因を用いた場合も同様に動作する。
また、ステート情報管理テーブル７０には複数のステート情報７１を登録できるため、サブ側２２は複数のイベントをきっかけとする処理シーケンスを動作させることも可能である。
【００７３】
以上、本実施の形態では、
リアルタイムＯＳを搭載し、近接Ｉ／ＯユニットやリモートＩ／Ｏに接続されている入力機器や出力機器に対するＩ／Ｏ制御を行う制御関数を提供するサブ側と、
サブ側とは異なるＯＳを搭載し、ユーザアプリケーションが動作するメイン側とから構成され、
メイン側とサブ側をつなぐ共有メモリ上に、所定のメッセージ形式にしたがって、メイン側がサブ側に対して制御関数の実行を要求するための実行要求メッセージ、および、サブ側がメイン側に対して制御関数の結果を応答するための結果応答メッセージを記述することで、メイン側のユーザアプリケーションから、サブ側が提供する制御関数を用いて間接的に入力機器や出力機器のＩ／Ｏ制御を行うプログラマブルコントローラにおいて、
任意のイベントをトリガとして繰返し実行するＩ／Ｏ制御群に関して、サブ側に、制御関数を一意に識別できる識別情報と制御関数の各引数に渡すデータと状態遷移情報を登録できる管理テーブルを具備し、
メイン側が、実行要求メッセージの中で、繰り返し実行することと実行開始条件および実行完了状態を指示することで、サブ側は前記管理テーブルに登録しておき、
次以降の当該イベント発生時に、メイン側からの実行要求がなくても、サブ側が前記管理テーブルに登録されている状態遷移情報にもとづき主体的にＩ／Ｏ制御を行うＰＬＣシステムを説明した。
【００７４】
また、本実施の形態では、
メイン側は、任意のタイミング（初期化時、最初の割込み発生時、状態遷移情報の変更時など）で発行した実行要求メッセージの中で、繰り返し実行の有無、実行開始条件および実行完了状態を指示することで、サブ側は管理テーブルに制御関数を一意に識別できる識別情報と制御関数の各引数に渡すデータと状態遷移情報を追加登録・変更・削除することができることを説明した。
【００７５】
また、本実施の形態では、複数のイベントに対する処理シーケンスをサブ側に登録できることを説明した。
【００７６】
また、本実施の形態では、
メイン側とサブ側をつなぐ共有メモリを、メッセージを交換するためのメッセージ交換エリアとデータを交換するためのデータ交換エリアに分割し、
制御関数の引数データの受け渡し方法を、引数データをメッセージ交換エリア経由で渡すデータ渡しと、引数データをデータ交換エリアに格納し、その格納位置（アドレス）をメッセージ交換エリア経由で渡すアドレス渡しの２種類用意し、ユーザアプリケーションが制御関数の引数データ毎に選択できることを説明した。
【００７７】
また、本実施の形態では、
メイン側からの実行要求メッセージを受けた場合は、サブ側は、サブ側に登録されている処理シーケンスよりもメイン側からの実行要求メッセージを優先して実行し、
その実行完了後には、サブ側の状態を、その実行要求メッセージで指定された実行完了状態に更新することを説明した。
【００７８】
実施の形態２．
以上の実施の形態１のＰＬＣシステムは、１台のコントローラユニット内の二つのＣＰＵ間で一つのＣＰＵ＃Ａ１１側（サブ側２２）で提供する制御関数１５をもう一方のＣＰＵ＃Ｂ１２側（メイン側２１）から実行できるようにしたものである。
実施の形態２に係るＰＬＣシステムは、ネットワークを経由した２台のコントローラユニット間で一つのコントローラユニットが提供する制御関数１５をもう一方のコントローラユニットから実行できるようにしたものである。
図１８に、２つのＰＬＣ（ＰＬＣ１とＰＬＣ１０１）をネットワークで接続したシステムの構成図を示す。
ＰＬＣ１０１の構成要素については、ＰＬＣ１の構成要素と同一の名称の要素は同一の機能を有する。
また、図１９に各ＰＬＣのコントローラユニットの詳細を示す。
ＰＬＣ１のコントローラユニット２の内部構成は、図２に示したものと同様である。
また、ＰＬＣ１０１のコントローラユニット１０２においても、コントローラユニット２の構成要素と同一名称の要素は同一の機能を有する。
なお、本実施の形態では、ＰＬＣ１０１が第１のプログラマブルコントローラに相当し、ＰＬＣ１が第２のプログラマブルコントローラに相当する。
また、本実施の形態では、メイン側ユニット１２１が第１の制御部に相当し、サブ側ユニット２２が第２の制御部に相当する。
【００７９】
実施の形態１では共有メモリ１７を経由して実行要求メッセージや結果応答メッセージを交換していたが、ＰＬＣ１０１上のユーザアプリケーション１１６がＰＬＣ１側で提供する制御関数１５を使用する場合、ネットワークユニット５とネットワークユニット１０５間で通信を行い、実行要求メッセージや結果応答メッセージを交換する。
この時、ネットワーク９の種類に応じて、図４で示すフレーム形式をネットワーク９のパケット形式でパッキングしたもので通信を行う。
メッセージ交換する形式が異なる以外は、ＰＬＣ１０１上のユーザアプリケーション１１６は実施の形態１のメイン側２１と同様に処理し、ＰＬＣ１側のサブ側２２も実施の形態１と同様に処理する。
また、実施の形態２の場合は、ネットワーク経由でメッセージを交換するために、制御関数の引数はすべてデータ渡しで行う。
【００８０】
以上のように、ネットワークを経由してあるＰＬＣから他のＰＬＣが提供する制御関数をリモートで実行する場合も、図１５や図１７のようにメイン側２１とサブ側２２間の関数実行のためのハンドシェークにおけるメッセージ数、及び、それに伴う処理（メッセージ生成／メモリ確保・解放）を減らすことで、メイン側２１の割込み処理時間を短縮する。
【００８１】
以上、本実施の形態では、
サブ側の割込み処理をメイン側の割込み処理に連動し、実行要求時のメイン側の状態に応じてサブ側の処理方法を切り替えるＰＬＣシステムを説明した。
【００８２】
また、本実施の形態では、
プログラマブルコントローラをネットワーク経由で接続したＦＡシステムで、一方のプログラマブルコントローラのメイン側のユーザアプリケーションから、もう一方のプログラマブルコントローラのサブ側が提供する制御関数を用いて間接的に入力機器や出力機器のＩ／Ｏ制御を行うコントローラにおいて、
任意のイベントをトリガとして繰返し実行するＩ／Ｏ制御に関して、サブ側に、制御関数を一意に識別できる識別情報と制御関数の各引数に渡すデータと状態遷移情報を登録できる管理テーブルを具備し、
メイン側が、実行要求メッセージの中で、繰り返し実行することと実行開始条件および実行完了状態を指示することで、サブ側は前記管理テーブルに登録しておき、
次以降の当該イベント発生時に、メイン側からの実行要求がなくても、サブ側が前記管理テーブルに登録されている状態遷移情報にもとづき主体的にＩ／Ｏ制御を行うＦＡシステムを説明した。
【００８３】
なお、実施の形態１及び２では、メイン側ユニットを第１の制御部の例とし、サブ側ユニットを第２の制御部の例とするデータ処理システムについて説明した。
なお、実施の形態１及び２で示したメイン側ユニットの処理手順を第１のＣＰＵが行い、サブ側ユニットの処理手順を第２のＣＰＵが行うデータ処理方法として捉えることも可能である。
また、実施の形態１及び２で示したメイン側ユニットの処理手順を第１のＣＰＵに実行させ、サブ側ユニットの処理手順を第２のＣＰＵに実行させるプログラムとして捉えることも可能である。
つまり、実施の形態１及び２で説明したフローチャートに示すステップ、手順、処理により、本発明に係るデータ処理方法及びプログラムを実現することもできる。
【符号の説明】
【００８４】
１  ＰＬＣ、２  コントローラユニット、３  モーションコントローラユニット、４  割込みユニット、５  ネットワークユニット、６  近接Ｉ／Ｏユニット、７  サーボアンプ、８  リモートＩ／Ｏ、９  ネットワーク、１１  ＣＰＵ＃Ａ、１２  ＣＰＵ＃Ｂ、１３  副ＯＳ、１４  主ＯＳ、１５  制御関数、１６  ユーザアプリケーション、１７  共有メモリ、１８  データ交換エリア、１９  送信メッセージ交換エリア、２０  受信メッセージ交換エリア、２１  メイン側ユニット、２２  サブ側ユニット、２３  Ｉ／Ｏ制御部、２４  メッセージ制御部、３１  割込みハンドラ、３２  割込み要因解析部、３３  メッセージ受信部、３４  メッセージ解析部、３５  ステートマシン管理部、３６  制御関数スタブ、３７  ステートマシン管理テーブル、３８  Ｉ／Ｏ制御実行タスク、３９  ＯＳスケジューラ、１０１  ＰＬＣ、１０２  コントローラユニット、１０５  ネットワークユニット、１１１  ＣＰＵ＃Ａ、１１２  ＣＰＵ＃Ｂ、１１３  副ＯＳ、１１４  主ＯＳ、１１５  制御関数、１１６  ユーザアプリケーション、１１７  共有メモリ、１１８  データ交換エリア、１１９  送信メッセージ交換エリア、１２０  受信メッセージ交換エリア、１２１  メイン側ユニット、１２２  サブ側ユニット、１２３  Ｉ／Ｏ制御部、１２４  メッセージ制御部。
【図１】
2011170476.tif 000003
【図２】
2011170476.tif 000004
【図３】
2011170476.tif 000005
【図４】
2011170476.tif 000006
【図５】
2011170476.tif 000007
【図６】
2011170476.tif 000008
【図７】
2011170476.tif 000009
【図８】
2011170476.tif 000010
【図９】
2011170476.tif 000011
【図１０】
2011170476.tif 000012
【図１１】
2011170476.tif 000013
【図１２】
2011170476.tif 000014
【図１３】
2011170476.tif 000015
【図１４】
2011170476.tif 000016
【図１５】
2011170476.tif 000017
【図１６】
2011170476.tif 000018
【図１７】
2011170476.tif 000019
【図１８】
2011170476.tif 000020
【図１９】
2011170476.tif 000021