(57)【要約】【課題】周期実行型の制御プログラムに非周期実行型の機能モジュールを組み込むことができる環境を提供する。【解決手段】開発支援プログラムは、コンピュータに、非周期実行型の第１機能モジュールを呼び出す周期実行型の第２機能モジュールを生成するステップを実行させる。当該ステップは、第１機能モジュールの引数のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定し、当該データ型の入力変数を第２機能モジュールに設定するステップと、第１機能モジュールの戻り値のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定し、当該データ型の出力変数を第２機能モジュールに設定するステップとを含む。【選択図】図１
2020060855.tif 000002
【特許請求の範囲】
【請求項１】
コントローラ用の制御プログラムの開発を支援するための開発支援プログラムであって、
前記開発支援プログラムは、コンピュータに、
非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との対応関係を取得するステップと、
前記非周期実行型のプログラミング言語で規定される非周期実行型の機能モジュールの引数のデータ型と、当該機能モジュールの戻り値のデータ型とを含む定義情報を取得するステップと、
前記非周期実行型の機能モジュールを呼び出すための機能モジュールであって、前記制御プログラムで利用可能な周期実行型の機能モジュールを生成するステップとを実行させ、
前記生成するステップは、
前記対応関係および前記定義情報に基づいて、前記引数のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の入力変数であり前記引数の値を反映するための入力変数を前記周期実行型の機能モジュールの入力インターフェイスとして設定するステップと、
前記対応関係および前記定義情報に基づいて、前記戻り値のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の出力変数であり前記戻り値を反映するための出力変数を前記周期実行型の機能モジュールの出力インターフェイスとして設定するステップとを含む、開発支援プログラム。
【請求項２】
前記生成するステップで生成される前記周期実行型の機能モジュールは、前記非周期実行型の機能モジュールを呼び出してから前記非周期実行型の機能モジュールの実行が完了するまでの間、前記制御プログラムの実行を中断するように動作する、請求項１に記載の開発支援プログラム。
【請求項３】
前記生成するステップで生成される前記周期実行型の機能モジュールは、前記非周期実行型の機能モジュールの実行完了を待たずに前記制御プログラムを継続して実行するように動作する、請求項１に記載の開発支援プログラム。
【請求項４】
前記生成するステップは、前記非周期実行型の機能モジュールの実行完了を反映するための出力変数を前記周期実行型の機能モジュールの出力に設定するステップをさらに含む、請求項３に記載の開発支援プログラム。
【請求項５】
前記入力変数の名前は、前記引数の名前と同じである、請求項１〜４のいずれか１項に記載の開発支援プログラム。
【請求項６】
前記周期実行型の機能モジュールのモジュール名は、前記非周期実行型の機能モジュールのモジュール名と同じである、請求項１〜５のいずれか１項に記載の開発支援プログラム。
【請求項７】
コントローラ用の制御プログラムの開発を支援するための開発支援装置であって、
非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との対応関係を格納する記憶装置を備え、
前記記憶装置は、前記非周期実行型のプログラミング言語で規定される非周期実行型の機能モジュールの引数のデータ型と、当該機能モジュールの戻り値のデータ型とを含む定義情報をさらに格納し、
前記非周期実行型の機能モジュールを呼び出すための機能モジュールであって、前記制御プログラムで利用可能な周期実行型の機能モジュールを生成するための制御装置をさらに備え、
前記制御装置は、
前記対応関係および前記定義情報に基づいて、前記引数のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の入力変数であり前記引数の値を反映するための入力変数を前記周期実行型の機能モジュールの入力インターフェイスとして設定し、
前記対応関係および前記定義情報に基づいて、前記戻り値のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の出力変数であり前記戻り値を反映するための出力変数を前記周期実行型の機能モジュールの出力インターフェイスとして設定する、開発支援装置。
【請求項８】
コントローラ用の制御プログラムの開発を支援するための開発支援方法であって、
開発支援装置が、非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との対応関係を取得するステップと、
前記開発支援装置が、前記非周期実行型のプログラミング言語で規定される非周期実行型の機能モジュールの引数のデータ型と、当該機能モジュールの戻り値のデータ型とを含む定義情報を取得するステップと、
前記開発支援装置が、前記非周期実行型の機能モジュールを呼び出すための機能モジュールであって、前記制御プログラムで利用可能な周期実行型の機能モジュールを生成するステップとを備え、
前記生成するステップは、
前記開発支援装置が、前記対応関係および前記定義情報に基づいて、前記引数のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の入力変数であり前記引数の値を反映するための入力変数を前記周期実行型の機能モジュールの入力インターフェイスとして設定するステップと、
前記開発支援装置が、前記対応関係および前記定義情報に基づいて、前記戻り値のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の出力変数であり前記戻り値を反映するための出力変数を前記周期実行型の機能モジュールの出力インターフェイスとして設定するステップとを含む、開発支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、コントローラの制御プログラムの作成を支援するための技術に関する。
【背景技術】
【０００２】
様々な製造現場において、ＰＬＣ（Programmable Logic Controller）などのコントローラが導入されている。コントローラは、一種のコンピュータであり、製造装置や製造設備などに応じて設計された制御プログラムが実行される。このような制御プログラムは、コントローラとは別に用意されたサポート装置を用いて作成される。
【０００３】
たとえば、特開２０１６−２２４５５７号公報（特許文献１）は、グラフィカルプログラミング言語により記述されるプログラムと高級プログラミング言語により記述されるプログラムを作成するユーザの負担を軽減するための技術を開示している。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１６−２２４５５７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
コントローラの制御プログラムは、周期実行型のプログラミング言語で記述される。周期実行型とは、制御プログラムの先頭行から最終行までが予め定められた周期ごとに繰り返し実行される実行形態をいう。すなわち、周期実行型の制御プログラムにおいては、プログラムの実行周期が保障されている。
【０００６】
このような周期実行型の制御プログラムから、非周期実行型のプログラミング言語で記述される機能モジュールを呼び出したいという要望がある。非周期実行型とは、プログラムの各行が逐次的に実行される実行形態をいう。非周期実行型の機能モジュールにおいては、実行を開始してから終了するまでの時間が保障されない。
【０００７】
設計者は、周期実行型の制御プログラムに非周期実行型の機能モジュールを組み込む場合、周期実行型のプログラミング言語に関する知識だけでなく、非周期実行型のプログラミング言語に関する知識が必要となる。そのため、非周期実行型のプログラミング言語に関する知識を有さない設計者は、周期実行型の制御プログラムに非周期実行型の機能モジュールを組み込むことができない。
【０００８】
本開示は上述のような問題点を解決するためになされたものであって、ある局面における目的は、周期実行型の制御プログラムに非周期実行型の機能モジュールを組み込むことが可能な開発支援プログラムを提供することである。他の局面における目的は、周期実行型の制御プログラムに非周期実行型の機能モジュールを組み込むことが可能な開発支援装置を提供することである。他の局面における目的は、周期実行型の制御プログラムに非周期実行型の機能モジュールを組み込むことが可能な開発支援方法を提供することである。
【課題を解決するための手段】
【０００９】
本開示の一例では、コントローラ用の制御プログラムの開発を支援するための開発支援プログラムは、コンピュータに、非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との対応関係を取得するステップと、上記非周期実行型のプログラミング言語で規定される非周期実行型の機能モジュールの引数のデータ型と、当該機能モジュールの戻り値のデータ型とを含む定義情報を取得するステップと、上記非周期実行型の機能モジュールを呼び出すための機能モジュールであって、上記制御プログラムで利用可能な周期実行型の機能モジュールを生成するステップとを実行させる。上記生成するステップは、上記対応関係および上記定義情報に基づいて、上記引数のデータ型に対応する、上記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の入力変数であり上記引数の値を反映するための入力変数を上記周期実行型の機能モジュールの入力インターフェイスとして設定するステップと、上記対応関係および上記定義情報に基づいて、上記戻り値のデータ型に対応する、上記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の出力変数であり上記戻り値を反映するための出力変数を上記周期実行型の機能モジュールの出力インターフェイスとして設定するステップとを含む。
【００１０】
この開示によれば、開発支援プログラムは、非周期実行型の機能モジュールの定義情報からラッパーモジュールとしての周期実行型の機能モジュールを生成することができる。ラッパーモジュールである機能モジュールが自動で生成されることで、非周期実行型のプログラミング言語に関する知識がない設計者であっても、ラッパーモジュールである機能モジュールを介して非周期実行型の機能モジュールを利用することができる。また、ラッパーモジュールである機能モジュールが自動で生成されることで、設計者は、コントローラの制御プログラムから非周期実行型の機能モジュールを呼び出すためのプログラミングを行う必要がない。その結果、設計工数が削減される。
【００１１】
本開示の一例では、上記生成するステップで生成される上記周期実行型の機能モジュールは、上記非周期実行型の機能モジュールを呼び出してから上記非周期実行型の機能モジュールの実行が完了するまでの間、上記制御プログラムの実行を中断するように動作する。
【００１２】
この開示によれば、ラッパーモジュールとしての機能モジュールは、制御プログラムの実行周期に同期させて、非周期実行型の機能モジュールを呼び出すことができる。
【００１３】
本開示の一例では、上記生成するステップで生成される上記周期実行型の機能モジュールは、上記非周期実行型の機能モジュールの実行完了を待たずに上記制御プログラムを継続して実行するように動作する。
【００１４】
この開示によれば、ラッパーモジュールとしての機能モジュールは、制御プログラムの実行と並列して、非周期実行型の機能モジュールを呼び出すことができる。
【００１５】
本開示の一例では、上記生成するステップは、上記非周期実行型の機能モジュールの実行完了を反映するための出力変数を上記周期実行型の機能モジュールの出力に設定するステップをさらに含む。
【００１６】
この開示によれば、周期実行型の機能モジュールの実行結果が、ラッパーモジュールとしての機能モジュールの出力変数に反映される。
【００１７】
本開示の一例では、上記入力変数の名前は、上記引数の名前と同じである。
この開示によれば、設計者は、ラッパー対象の機能モジュールの引数名と、ラッパーモジュールとしての機能モジュールの入力変数との対応関係を把握しやすくなる。
【００１８】
本開示の一例では、上記周期実行型の機能モジュールのモジュール名は、上記非周期実行型の機能モジュールのモジュール名と同じである。
【００１９】
この開示によれば、設計者は、ラッパー対象の機能モジュールのモジュール名と、ラッパーモジュールとしての機能モジュールのモジュール名との対応関係を把握しやすくなる。
【００２０】
本開示の他の例では、コントローラ用の制御プログラムの開発を支援するための開発支援装置は、非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との対応関係を格納する記憶装置を備える。上記記憶装置は、上記非周期実行型のプログラミング言語で規定される非周期実行型の機能モジュールの引数のデータ型と、当該機能モジュールの戻り値のデータ型とを含む定義情報をさらに格納する。開発支援装置は、上記非周期実行型の機能モジュールを呼び出すための機能モジュールであって、上記制御プログラムで利用可能な周期実行型の機能モジュールを生成するための制御装置をさらに備える。上記制御装置は、上記対応関係および上記定義情報に基づいて、上記引数のデータ型に対応する、上記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の入力変数であり上記引数の値を反映するための入力変数を上記周期実行型の機能モジュールの入力インターフェイスとして設定し、上記対応関係および上記定義情報に基づいて、上記戻り値のデータ型に対応する、上記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の出力変数であり上記戻り値を反映するための出力変数を上記周期実行型の機能モジュールの出力インターフェイスとして設定する。
【００２１】
この開示によれば、開発支援装置は、非周期実行型の機能モジュールの定義情報からラッパーモジュールとしての周期実行型の機能モジュールを生成することができる。ラッパーモジュールである機能モジュールが自動で生成されることで、非周期実行型のプログラミング言語に関する知識がない設計者であっても、ラッパーモジュールである機能モジュールを介して非周期実行型の機能モジュールを利用することができる。また、ラッパーモジュールである機能モジュールが自動で生成されることで、設計者は、コントローラの制御プログラムから非周期実行型の機能モジュールを呼び出すためのプログラミングを行う必要がない。その結果、設計工数が削減される。
【００２２】
本開示の他の例では、コントローラ用の制御プログラムの開発を支援するための開発支援方法は、開発支援装置が、非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との対応関係を取得するステップと、上記開発支援装置が、上記非周期実行型のプログラミング言語で規定される非周期実行型の機能モジュールの引数のデータ型と、当該機能モジュールの戻り値のデータ型とを含む定義情報を取得するステップと、上記開発支援装置が、上記非周期実行型の機能モジュールを呼び出すための機能モジュールであって、上記制御プログラムで利用可能な周期実行型の機能モジュールを生成するステップとを備える。上記生成するステップは、上記開発支援装置が、上記対応関係および上記定義情報に基づいて、上記引数のデータ型に対応する、上記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の入力変数であり上記引数の値を反映するための入力変数を上記周期実行型の機能モジュールの入力インターフェイスとして設定するステップと、上記開発支援装置が、上記対応関係および上記定義情報に基づいて、上記戻り値のデータ型に対応する、上記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の出力変数であり上記戻り値を反映するための出力変数を上記周期実行型の機能モジュールの出力インターフェイスとして設定するステップとを含む。
【００２３】
この開示によれば、開発支援方法は、非周期実行型の機能モジュールの定義情報からラッパーモジュールとしての周期実行型の機能モジュールを生成することができる。ラッパーモジュールである機能モジュールが自動で生成されることで、非周期実行型のプログラミング言語に関する知識がない設計者であっても、ラッパーモジュールである機能モジュールを介して非周期実行型の機能モジュールを利用することができる。また、ラッパーモジュールである機能モジュールが自動で生成されることで、設計者は、コントローラの制御プログラムから非周期実行型の機能モジュールを呼び出すためのプログラミングを行う必要がない。その結果、設計工数が削減される。
【発明の効果】
【００２４】
ある局面において、周期実行型の制御プログラムに非周期実行型の機能モジュールを組み込むことができる。
【図面の簡単な説明】
【００２５】
【図１】実施の形態に従う開発支援装置を示す図である。
【図２】ＦＡ（Factory  Automation）システムのシステム構成の一例を示す図である。
【図３】開発支援装置のハードウェア構成の一例を示す模式図である。
【図４】コントローラのハードウェア構成の一例を示す模式図である。
【図５】外部機器のハードウェア構成の一例を示すブロック図である。
【図６】開発支援装置の機能構成の一例を示す図である。
【図７】プログラム解析部の機能を説明するための図である。
【図８】モジュール登録部の機能を説明するための図である。
【図９】非同期設定時における機能モジュールの生成過程を概略的に表わす図である。
【図１０】同期設定時における機能モジュールの生成過程を概略的に表わす図である。
【図１１】エディター部の機能を説明するための図である。
【図１２】開発支援装置が実行する処理の一部を表わすフローチャートである。
【図１３】各コアの実装形態の具体例１を示す図である。
【図１４】各コアの実装形態の具体例２を示す図である。
【図１５】各コアの実装形態の具体例３を示す図である。
【図１６】各コアの機能構成の一例を示す図である。
【図１７】委託部による委託処理を概略的に示す概念図である。
【図１８】呼出し先の機能モジュールを非同期実行する場合における制御システムのデータフローの一例を示す図である。
【図１９】呼出し先の機能モジュールを同期実行する場合における制御システムのデータフローの一例を示す図である。
【発明を実施するための形態】
【００２６】
以下、図面を参照しつつ、本発明に従う各実施の形態について説明する。以下の説明では、同一の部品および構成要素には同一の符号を付してある。それらの名称および機能も同じである。したがって、これらについての詳細な説明は繰り返さない。
【００２７】
＜Ａ．適用例＞
まず、図１を参照して、本発明の適用例について説明する。図１は、実施の形態に従う開発支援装置１００を示す図である。
【００２８】
開発支援装置１００は、たとえば、ノート型またはデスクトップ型のＰＣ（Personal Computer）、タブレット端末、スマートフォン、または、その他の情報処理装置である。
【００２９】
開発支援装置１００には、開発支援プログラム５０がインストールされている。開発支援プログラム５０は、コントローラ用の制御プログラムの開発を支援するためのアプリケーションである。開発支援プログラム５０は、たとえば、オムロン社製の「Ｓｙｓｍａｃ  Ｓｔｕｄｉｏ」である。ユーザは、開発支援プログラム５０上でコントローラ用の制御プログラムを設計し、設計した制御プログラムをコントローラにインストールすることができる。
【００３０】
コントローラ用の制御プログラムは、周期実行型のプログラミング言語で記述される。周期実行型とは、制御プログラムの先頭行から最終行までが予め定められた周期ごとに繰り返し実行される実行形態をいう。すなわち、周期実行型の制御プログラムにおいては、プログラムの実行周期が保障されている。周期実行型のプログラミング言語としては、たとえば、ラダー言語やＳＴ（Structured Text）言語などが挙げられる。
【００３１】
本実施の形態に従う開発支援装置１００は、非周期実行型のプログラミング言語で記述される機能モジュールを呼び出すための機能モジュールであって、コントローラ用の制御プログラムで利用可能な周期実行型の機能モジュールを自動で生成する。非周期実行型とは、プログラムの各行が逐次的に実行される実行形態をいう。非周期実行型の機能モジュールにおいては、実行を開始してから終了するまでの時間が保障されない。非周期実行型のプログラミング言語としては、たとえば、Ｃ言語、Ｃ＋＋、Ｊａｖａ（登録商標）、Ｐｙｔｈｏｎなどが挙げられる。
【００３２】
図１の例では、開発支援装置１００は、非周期実行型の機能モジュール５５Ａを呼び出すためのラッパーモジュールとして周期実行型の機能モジュール５５Ｂを自動生成している。
【００３３】
より具体的には、まず、開発支援プログラム５０は、非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との対応関係１２１を所定の格納先から取得する。当該所定の格納先は、開発支援装置１００内の記憶装置であってもよいし、開発支援装置１００と通信可能な外部装置（たとえば、サーバー等）であってもよい。
【００３４】
次に、開発支援プログラム５０は、非周期実行型の機能モジュール５５Ａに関する定義情報１２２を取得する。一例として、定義情報１２２には、機能モジュール５５Ａのモジュール名、機能モジュール５５Ａの引数のデータ型、機能モジュール５５Ａの引数の変数名、機能モジュール５５Ａの戻り値のデータ型、機能モジュール５５Ａの戻り値が反映される変数の名前などが規定されている。
【００３５】
図１の定義情報１２２の例では、機能モジュール５５Ａのモジュール名として、「ｓａｍｐｌｅ」が例示されている。機能モジュール５５Ａの引数のデータ型として、「ｆｌｏａｔ」型および「ｄｏｕｂｌｅ」型が例示されている。機能モジュール５５Ａの引数の変数名として、「ｉｎ１」、「ｉｎ２」が例示されている。機能モジュール５５Ａの戻り値のデータ型として、「ｂｏｏｌ」型が例示されている。機能モジュール５５Ａの戻り値が反映される変数の名前として、「ｒｅｔ」が例示されている。
【００３６】
開発支援プログラム５０は、対応関係１２１および定義情報１２２に基づいて、非周期実行型の機能モジュール５５Ａの引数のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定する。図１の例では、引数「ｉｎ１」のデータ型「ｆｌｏａｔ」に対してデータ型「ＲＥＡＬ」が特定され、引数「ｉｎ２」のデータ型「ｄｏｕｂｌｅ」に対してデータ型「ＬＲＥＡＬ」が特定される。開発支援プログラム５０は、当該特定したデータ型「ＲＥＡＬ」，「ＬＲＥＡＬ」の入力変数５５Ｂ１，５５Ｂ２を周期実行型の機能モジュール５５Ｂの入力インターフェイスとして設定する。機能モジュール５５Ｂの入力変数５５Ｂ１，５５Ｂ２は、機能モジュール５５Ａの引数「ｉｎ１」，「ｉｎ２」の値を反映するための入力インターフェイスである。
【００３７】
また、開発支援プログラム５０は、対応関係１２１および定義情報１２２に基づいて、非周期実行型の機能モジュール５５Ａの戻り値のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定する。図１の例では、機能モジュール５５Ａの戻り値のデータ型「ｂｏｏｌ」に対して、データ型「ＢＯＯＬ」が特定される。開発支援プログラム５０は、当該特定したデータ型「ＢＯＯＬ」の出力変数を周期実行型の機能モジュール５５Ｂの出力インターフェイスとして設定する。機能モジュール５５Ｂの出力変数５５Ｂ３は、機能モジュール５５Ａの戻り値を反映するための出力インターフェイスである。
【００３８】
「変数」とは、コントローラ用の制御プログラムにおいて扱われるデータに与えられた識別子である。典型的には、「変数」は、コントローラやコントローラの制御対象の状態を表わすデータである。異なる言い方をすれば、「変数」とは、コントローラやコントローラの制御対象の状態に連動して値が変化するデータのことをいう。「変数」との概念は、一つの値を表わすデータ、配列として表されるデータ、構造体として表されるデータ、制御プログラムに規定され得る種々のデータを含み得る。
【００３９】
以上のように、開発支援プログラム５０は、機能モジュール５５Ａの定義情報１２２からラッパーモジュールとしての機能モジュール５５Ｂを生成することができる。ラッパーモジュールである機能モジュール５５Ｂが自動で生成されることで、非周期実行型のプログラミング言語に関する知識がない設計者であっても、機能モジュール５５Ｂを介して非周期実行型の機能モジュール５５Ａを利用することができる。また、ラッパーモジュールである機能モジュール５５Ｂが自動で生成されることで、設計者は、コントローラ２００の制御プログラムから非周期実行型の機能モジュール５５Ａを呼び出すためのプログラミングを行う必要がない。その結果、設計工数が削減される。
【００４０】
なお、図１の例では、対応関係１２１において、２種類のプログラミング言語間のデータ型の対応関係が規定されているが、３種類以上のプログラミング言語間のデータ型の対応関係が規定されてもよい。
【００４１】
また、図１の例では、定義情報１２２において、１つの機能モジュール５５Ａに関する入出力インターフェイスの情報が規定されているが、複数の機能モジュール５５Ａのそれぞれに関する入出力インターフェイスの情報が規定されてもよい。
【００４２】
＜Ｂ．ＦＡシステム１のシステム構成＞
図２は、ＦＡシステム１のシステム構成の一例を示す図である。図２を参照して、ＦＡシステム１のシステム構成について説明する。
【００４３】
ＦＡシステム１は、生産工程を自動化するためのシステムである。ＦＡシステム１は、１つ以上の開発支援装置１００と、１つ以上のコントローラ２００と、１つ以上の駆動機器３００と、１つ以上の外部機器４００とで構成される。
【００４４】
開発支援装置１００、コントローラ２００、および外部機器４００は、ネットワークＮＷ１に接続されている。ネットワークＮＷ１には、ＥｔｈｅｒＮＥＴ（登録商標）などが採用される。
【００４５】
コントローラ２００および駆動機器３００は、ネットワークＮＷ２に接続されている。ネットワークＮＷ２には、データの到達時間が保証される、定周期通信を行うフィールドネットワークを採用することが好ましい。このような定周期通信を行うフィールドネットワークとしては、ＥｔｈｅｒＣＡＴ（登録商標）、ＥｔｈｅｒＮｅｔ／ＩＰ（登録商標）、登録商標）、ＣｏｍｐｏＮｅｔ（登録商標）などが知られている。
【００４６】
駆動機器３００は、生産工程を自動化するための種々の産業用機器を含む。一例として、駆動機器３００は、ロボットコントローラ３００Ａや、サーボドライバ３００Ｂや、ロボットコントローラ３００Ａに制御されるアームロボット３０１Ａや、サーボドライバ３００Ｂによって制御されるサーボモータ３０１Ｂなどを含む。また、駆動機器３００は、ワークを撮影するための視覚センサや、生産工程で利用されるその他の機器などを含んでもよい。
【００４７】
設計者は、開発支援プログラム５０を実行することで、ユーザプログラム２１０の開発ツールを起動することができる。設計者は、起動された開発ツール上でユーザプログラム２１０を設計することができる。このとき、設計者は、図１で説明したラッパーモジュールとしての機能モジュール５５Ｂをユーザプログラム２１０に組み込むことができる。設計されたユーザプログラム２１０は、コンパイルされた上でコントローラ２００に転送される。
【００４８】
コントローラ２００は、ユーザプログラム２１０の実行開始命令を受け付けたことに基づいてユーザプログラム２１０の実行を開始し、ユーザプログラム２１０に規定される制御命令に従って駆動機器３００を制御する。ユーザプログラム２１０の実行中において、ラッパーモジュールである機能モジュール５５Ｂが実行された場合、コントローラ２００は、対応する機能モジュール５５Ａの実行開始命令を外部機器４００に送信する。外部機器４００は、当該実行開始命令を受信したことに基づいて、機能モジュール５５Ａの実行を開始する。その後、外部機器４００は、機能モジュール５５Ａの実行結果をコントローラ２００に送信する。
【００４９】
なお、上述では、機能モジュール５５Ａの実行を外部機器４００に委託する例について説明を行ったが、機能モジュール５５Ａの実行は、必ずしも外部機器４００に委託される必要はない。機能モジュール５５Ａの実行を外部機器４００に委託しないパターンについては後述する。
【００５０】
＜Ｃ．ハードウェア構成＞
図３〜図５を参照して、図２に示される開発支援装置１００、コントローラ２００、および外部機器４００のハードウェア構成について順に説明する。
【００５１】
（Ｃ１．開発支援装置１００のハードウェア構成）
まず、図３を参照して、開発支援装置１００のハードウェア構成について説明する。図３は、開発支援装置１００のハードウェア構成の一例を示す模式図である。
【００５２】
開発支援装置１００は、一例として、汎用的なコンピュータアーキテクチャに準じて構成されるコンピュータからなる。開発支援装置１００は、ＣＰＵ（Central Processing Unit）やＭＰＵ（Micro-Processing Unit）などの制御装置１０２と、主メモリ１０４と、通信インターフェイス１１１と、Ｉ／Ｏ（Input/Output）インターフェイス１１４と、表示インターフェイス１１７と、不揮発性の記憶装置１２０とを含む。これらのコンポーネントは、内部バス１２５を介して互いに通信可能に接続されている。
【００５３】
制御装置１０２は、記憶装置１２０に格納されている開発支援プログラム５０を主メモリ１０４に展開して実行することで、ユーザプログラム２１０（図２参照）の開発ツールを起動する。記憶装置１２０は、開発支援プログラム５０の他にも、ラッパーモジュールとしての機能モジュール５５Ｂ（図１参照）を生成するための各種データ５６を格納する。
【００５４】
通信インターフェイス１１１は、他の通信機器との間でネットワークを介してデータを遣り取りする。当該他の通信機器は、たとえば、コントローラ２００、外部機器４００、サーバなどを含む。開発支援装置１００は、通信インターフェイス１１１を介して、当該他の通信機器から、開発支援プログラム５０などの各種プログラムをダウンロード可能なように構成されてもよい。
【００５５】
Ｉ／Ｏインターフェイス１１４は、操作部１１５に接続され、操作部１１５からのユーザ操作を示す信号を取り込む。操作部１１５は、典型的には、キーボード、マウス、タッチパネル、タッチパッドなどからなり、ユーザからの操作を受け付ける。操作部１１５は、開発支援装置１００と一体的に構成されてもよいし、開発支援装置１００とは別に構成されてもよい。
【００５６】
表示インターフェイス１１７は、表示部１１８と接続され、制御装置１０２などからの指令に従って、表示部１１８に対して、画像を表示するための画像信号を送出する。表示部１１８は、ＬＣＤ（Liquid Crystal Display）や有機ＥＬ（Electro Luminescence）ディスプレイなどからなり、ユーザに対して各種情報を提示する。表示部１１８は、開発支援装置１００と一体的に構成されてもよいし、開発支援装置１００とは別に構成されてもよい。
【００５７】
（Ｃ２．コントローラ２００のハードウェア構成）
次に、図４を参照して、コントローラ２００のハードウェア構成について説明する。図４は、コントローラ２００のハードウェア構成の一例を示す模式図である。
【００５８】
コントローラ２００は、通信インターフェイス２０１と、ＣＰＵやＭＰＵなどの制御装置２０２と、チップセット２０４と、主メモリ２０６と、不揮発性の記憶装置２０８と、内部バスコントローラ２２２と、フィールドバスコントローラ２２４と、メモリカードインターフェイス２３９とを含む。
【００５９】
制御装置２０２は、記憶装置２０８に格納された制御プログラム２１１を読み出して、主メモリ２０６に展開して実行することで、ロボットコントローラ３００Ａやサーボドライバ３００Ｂなどの駆動機器３００に対する任意の制御を実現する。制御プログラム２１１は、コントローラ２００を制御するための各種プログラムを含む。一例として、制御プログラム２１１は、システムプログラム２０９およびユーザプログラム２１０などを含む。システムプログラム２０９は、データの入出力処理や実行タイミング制御などの、コントローラ２００の基本的な機能を提供するための命令コードを含む。ユーザプログラム２１０は、開発支援装置１００からダウンロードされたものである。ユーザプログラム２１０は、制御対象に応じて任意に設計され、シーケンス制御を実行するためのシーケンスプログラム２１０Ａおよびモーション制御を実行するためのモーションプログラム２１０Ｂとを含む。
【００６０】
チップセット２０４は、各コンポーネントを制御することで、コントローラ２００全体としての処理を実現する。
【００６１】
記憶装置２０８は、制御プログラム２１１や、コントローラ２００で用いられる各種データ２１２を格納する。
【００６２】
内部バスコントローラ２２２は、コントローラ２００と内部バスを通じて連結される各種デバイスとデータを遣り取りするインターフェイスである。このようなデバイスの一例として、Ｉ／Ｏユニット２２６が接続されている。
【００６３】
フィールドバスコントローラ２２４は、コントローラ２００とフィールドバスを通じて連結される各種の駆動機器３００とデータを遣り取りするインターフェイスである。このようなデバイスの一例として、ロボットコントローラ３００Ａやサーボドライバ３００Ｂが接続されている。他にも、視覚センサなどの駆動機器が接続されてもよい。
【００６４】
内部バスコントローラ２２２およびフィールドバスコントローラ２２４は、接続されているデバイスに対して任意の指令を与えることができるとともに、デバイスが管理している任意のデータを取得することができる。また、内部バスコントローラ２２２および／またはフィールドバスコントローラ２２４は、ロボットコントローラ３００Ａやサーボドライバ３００Ｂとの間でデータを遣り取りするためのインターフェイスとしても機能する。
【００６５】
通信インターフェイス２０１は、各種の有線／無線ネットワークを通じたデータの遣り取りを制御する。コントローラ２００は、通信インターフェイス２０１を介して、開発支援装置１００や外部機器４００と通信を行う。
【００６６】
メモリカードインターフェイス２３９は、外部記憶媒体の一例であるメモリカード２４０（たとえば、ＳＤカード）を着脱可能に構成されており、メモリカード２４０に対してデータを書き込み、メモリカード２４０からデータを読出すことが可能になっている。
【００６７】
（Ｃ３．外部機器４００のハードウェア構成）
次に、図５を参照して、外部機器４００のハードウェア構成について説明する。図５は、外部機器４００のハードウェア構成の一例を示すブロック図である。
【００６８】
外部機器４００は、汎用的なアーキテクチャを有するハードウェア構成を有している。すなわち、外部機器４００は、一種のパーソナルコンピュータとして実装される。但し、外部機器４００を汎用的なハードウェアではなく、専用ハードウェアを用いて実装してもよい。
【００６９】
より具体的には、外部機器４００は、ＣＰＵやＭＰＵなどの制御装置４０２と、主メモリ４０４と、不揮発性の記憶装置４１０と、通信インターフェイス４１２と、Ｉ／Ｏインターフェイス４１４と、表示インターフェイス４２０とを含む。これらのコンポーネントは、内部バス４２５を介して、互いにデータ通信可能に接続されている。
【００７０】
制御装置４０２は、記憶装置４１０に格納された制御プログラム（図示しない）を読み出して、主メモリ４０４に展開して実行することで、外部機器４００を制御する。すなわち、制御装置４０２は、主メモリ４０４および記憶装置４１０と連係することで、制御演算を実行する制御部を実現する。
【００７１】
通信インターフェイス４１２、Ｉ／Ｏインターフェイス４１４、および、フィールドバスインターフェイス４１６は、外部機器４００と他の通信機器とのデータの遣り取りを仲介する。
【００７２】
より具体的には、通信インターフェイス４１２は、ネットワークＮＷ１（図１参照）などを介した、コントローラ２００との通信を仲介する。通信インターフェイス４１２には、たとえば、ＥｔｈｅｒＮＥＴに従う通信が可能なコンポーネントが採用され得る。
【００７３】
Ｉ／Ｏインターフェイス４１４は、操作部４１５に接続され、操作部４１５からのユーザ操作を示す信号を取り込む。操作部４１５は、典型的には、キーボード、マウス、タッチパネル、タッチパッドなどからなり、ユーザからの操作を受け付ける。操作部４１５は、外部機器４００と一体的に構成されてもよいし、外部機器４００とは別に構成されてもよい。
【００７４】
表示インターフェイス４２０は、表示部４２１と接続され、制御装置４０２などからの指令に従って、表示部４２１に対して、画像を表示するための画像信号を送出する。表示部４２１は、ＬＣＤや有機ＥＬディスプレイなどからなり、ユーザに対して各種情報を提示する。表示部４２１は、外部機器４００と一体的に構成されてもよいし、外部機器４００とは別に構成されてもよい。
【００７５】
＜Ｄ．開発支援装置１００の機能構成＞
図６を参照して、開発支援装置１００の機能構成について説明する。図６は、開発支援装置１００の機能構成の一例を示す図である。
【００７６】
開発支援装置１００は、ハードウェア構成として、制御装置１０２と、記憶装置１２０とを含む。制御装置１０２は、機能構成として、プログラム解析部１５２と、モジュール登録部１５４と、ラッパーモジュール生成部１５６と、エディター部１５８と、ビルド部１６０とを含む。記憶装置１２０は、上述の各種データ５６（図３参照）と、ユーザプログラム２１０とを格納している。各種データ５６は、上述のデータ型の対応関係１２１と、上述の定義情報１２２と、ラッパーモジュール１２６と、モジュール対応関係１２７とを含む。
【００７７】
以下では、プログラム解析部１５２、モジュール登録部１５４、ラッパーモジュール生成部１５６、エディター部１５８、およびビルド部１６０の機能について順に説明する。
【００７８】
（Ｄ１．プログラム解析部１５２）
まず、図７を参照して、図６に示されるプログラム解析部１５２について説明する。図７は、プログラム解析部１５２の機能を説明するための図である。
【００７９】
プログラム解析部１５２は、非周期実行型のプログラム６０を解析し、上述の定義情報１２２（図１参照）を自動生成する。より具体的には、プログラム解析部１５２は、非周期実行型のプログラム６０から機能モジュール５５Ａ（たとえば、関数）の宣言部分を特定する。次に、プログラム解析部１５２は、特定した宣言部分から、機能モジュール５５Ａのモジュール名と、機能モジュール５５Ａの引数のデータ型と、機能モジュール５５Ａの引数の変数名と、機能モジュール５５Ａの戻り値のデータ型とを抽出する。図７の例では、モジュール名として「ｓａｍｐｌｅ」が抽出され、引数のデータ型として「ｆｌｏａｔ」型および「ｄｏｕｂｌｅ」型が抽出され、引数の変数名として「ｉｎ１」および「ｉｎ２」が抽出され、戻り値のデータ型として「ｂｏｏｌ」が抽出される。
【００８０】
さらに、プログラム解析部１５２は、機能モジュール５５Ａの内部の記述を解析し、戻り値の変数名を取得する。一例として、プログラム解析部１５２は、予め定められたキーワード（たとえば、"return"）を探索し、当該キーワードに続く記述を戻り値の変数名として取得する。図７の例では、戻り値の変数名として「ｒｅｔ」が取得される。
【００８１】
プログラム解析部１５２は、モジュール名「ｓａｍｐｌｅ」と、引数のデータ型「ｆｌｏａｔ」，「ｄｏｕｂｌｅ」と、引数の変数名「ｉｎ１」，「ｉｎ２」と、戻り値のデータ型「ｂｏｏｌ」と、戻り値の変数名「ｒｅｔ」とを対応付けた上でそれらを定義情報１２２に書き込む。定義情報１２２は、たとえば、開発支援装置１００の記憶装置１２０に格納される。
【００８２】
なお、図７の例では、機能モジュール５５Ａの処理内容がプログラム６０に規定されているが、機能モジュール５５Ａの宣言部のみがプログラム６０に規定されていてもよい。この場合、プログラム解析部１５２は、機能モジュール５５Ａの宣言のみを規定したヘッダファイルとしてのプログラム６０を読み込む。当該ヘッダファイルは、機能モジュール５５Ａのモジュール名と、機能モジュール５５Ａの引数のデータ型と、機能モジュール５５Ａの引数の変数名と、機能モジュール５５Ａの戻り値のデータ型とを含む。
【００８３】
（Ｄ２．モジュール登録部１５４）
次に、図８を参照して、図６に示されるモジュール登録部１５４について説明する。図８は、モジュール登録部１５４の機能を説明するための図である。
【００８４】
以下では、非周期実行型の機能モジュール５５Ａ（図１参照）に関する各種情報の登録する例について説明を行うが、登録対象の機能モジュールは、機能モジュール５５Ａに限定されない。
【００８５】
モジュール登録部１５４は、たとえば、開発支援プログラム５０によって提供される登録画面３２である。登録画面３２は、入力領域３３Ａ〜３３Ｅを含む。登録画面３２に対する操作は、たとえば、開発支援装置１００の操作部１１５（図３参照）を用いて行われる。
【００８６】
入力領域３３Ａは、機能モジュール５５Ａの名称の入力を受け付ける。当該名称の入力は、たとえば、文字入力により行われる。
【００８７】
入力領域３３Ｂは、機能モジュール５５Ａのプログラミング言語の種類の入力を受け付ける。一例として、入力領域３３Ｂには展開ボタンＢ１が対応付けられている。設計者が展開ボタンＢ１を押下すると、予め定められた各種のプログラミング言語がリスト表示される。設計者は、リスト表示されるプログラミング言語の中から１つのプログラミング言語を選択することで、機能モジュール５５Ａのプログラミング言語の種類を指定することができる。
【００８８】
入力領域３３Ｃは、機能モジュール５５Ａの引数に関する各種情報の入力を受け付ける。一例として、入力領域３３Ｃには、追加ボタンＢ３が対応付けられている。設計者が追加ボタンＢ３を押下する度に、引数の登録欄が入力領域３３Ｃに追加される。設計者は、引数の登録欄において、引数のデータ型と、引数の変数名とを入力することができる。引数の登録欄の各々には、展開ボタンＢ４が対応付けられている。設計者が展開ボタンＢ４を押下すると、入力領域３３Ｂで指定されたプログラミング言語で利用可能なデータ型がリスト表示される。設計者は、リスト表示されたデータ型の中から１つのデータ型を選択することで、引数のデータ型を指定することができる。さらに、設計者は、指定したデータ型に対応付けて引数の変数名を入力することができる。変数名の入力は、たとえば、文字入力により行われる。
【００８９】
入力領域３３Ｄは、機能モジュール５５Ａの戻り値に関する各種情報の入力を受け付ける。一例として、入力領域３３Ｄには、追加ボタンＢ７が対応付けられている。設計者が追加ボタンＢ７を押下する度に、戻り値の登録欄が入力領域３３Ｄに追加される。設計者は、戻り値の登録欄において、戻り値のデータ型と、戻り値の変数名とを入力することができる。戻り値の登録欄の各々には、展開ボタンＢ８が対応付けられている。設計者が展開ボタンＢ８を押下すると、入力領域３３Ｂで指定されたプログラミング言語で利用可能なデータ型がリスト表示される。設計者は、リスト表示されたデータ型の中から１つのデータ型を選択することで、戻り値のデータ型を指定することができる。さらに、設計者は、指定したデータ型に対応付けて戻り値の変数名を入力することができる。変数名の入力は、たとえば、文字入力により行われる。
【００９０】
入力領域３３Ｅは、機能モジュール５５Ａの実行をコントローラ２００の実行周期に同期させるか否かについての選択を受け付ける。一例として、入力領域３３Ｅには、追加ボタンＢ１０が対応付けられている。設計者が追加ボタンＢ１０を押下すると、「ＹＥＳ」および「ＮＯ」の選択肢がリスト表示される。設計者が「ＹＥＳ」を選択した場合、機能モジュール５５Ａの実行は、コントローラ２００の実行周期に同期されない。設計者が「ＮＯ」を選択した場合、機能モジュール５５Ａの実行は、コントローラ２００の実行周期に同期される。機能モジュール５５Ａの同期実行／非同期実行の詳細については後述する。
【００９１】
設計者が登録ボタンＢ１２を押下した場合、登録画面３２に入力された各種情報は、上述の定義情報１２２として登録される。図８の例では、モジュール登録部１５４は、モジュール名「ｓａｍｐｌｅ」と、引数のデータ型「ｆｌｏａｔ」，「ｄｏｕｂｌｅ」と、引数の変数名「ｉｎ１」，「ｉｎ２」と、戻り値のデータ型「ｂｏｏｌ」と、戻り値の変数名「ｒｅｔ」とを対応付けた上でそれらを定義情報１２２として登録する。
【００９２】
設計者がキャンセルボタンＢ１３を押下した場合、登録画面３２に入力された各種情報は破棄され、登録画面３２が閉じられる。
【００９３】
（Ｄ３．ラッパーモジュール生成部１５６）
次に、図９および図１０を参照して、図６に示されるラッパーモジュール生成部１５６について説明する。図９は、非同期設定時における機能モジュール５５Ｂの生成過程を概略的に表わす図である。図１０は、同期設定時における機能モジュール５５Ｂの生成過程を概略的に表わす図である。
【００９４】
図９および図１０に示されるように、ラッパーモジュール生成部１５６は、プログラミング別のデータ型の対応関係１２１と、ラッパー対象の機能モジュール５５Ａの定義情報１２２とに基づいて、機能モジュール５５Ａを呼び出すための周期実行型の機能モジュール５５Ｂを生成する。
【００９５】
より具体的には、ラッパーモジュール生成部１５６は、プログラミング別のデータ型の対応関係１２１を参照して、定義情報１２２に規定される引数のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定する。その後、ラッパーモジュール生成部１５６は、当該データ型の入力変数であり機能モジュール５５Ａの引数の値を反映するための入力変数を機能モジュール５５Ｂの入力インターフェイスとして設定する。
【００９６】
機能モジュール５５Ｂに設定される入力変数の名前は、任意である。好ましくは、機能モジュール５５Ｂの入力変数の名前は、機能モジュール５５Ａの引数の名前と同じになるように設定される。図９および図１０の例では、機能モジュール５５Ａの引数「ｉｎ１」のデータ型「ｆｌｏａｔ」に対して、「ＲＥＡＬ」型の入力変数「ｉｎ１」が機能モジュール５５Ｂに設定される。また、機能モジュール５５Ａの引数「ｉｎ２」のデータ型「ｄｏｕｂｌｅ」に対して、「ＬＲＥＡＬ」型の入力変数「ｉｎ２」が機能モジュール５５Ｂに設定される。これにより、設計者は、機能モジュール５５Ａの引数名と、機能モジュール５５Ｂの入力変数との対応関係を把握しやすくなる。
【００９７】
また、ラッパーモジュール生成部１５６は、プログラミング別のデータ型の対応関係１２１を参照して、定義情報１２２に規定される戻り値のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定する。その後、ラッパーモジュール生成部１５６は、特定したデータ型の出力変数であって機能モジュール５５Ａの戻り値を反映するための出力変数を機能モジュール５５Ｂの出力インターフェイスとして設定する。
【００９８】
機能モジュール５５Ｂに設定される出力変数の名前は、任意である。好ましくは、機能モジュール５５Ｂの出力変数の名前は、機能モジュール５５Ａの戻り値の変数名と同じになるように設定される。図９および図１０の例では、機能モジュール５５Ａの戻り値「ｒｅｔ」のデータ型「ｂｏｏｌ」に対して、データ型「ＢＯＯＬ」の出力変数「ｒｅｔ」が機能モジュール５５Ｂに設定される。これにより、設計者は、機能モジュール５５Ａの戻り値と、機能モジュール５５Ｂの出力変数との対応関係を把握しやすくなる。
【００９９】
また、ラッパーモジュール生成部１５６は、定義情報１２２に規定されるモジュール名を参照して、機能モジュール５５Ｂのモジュール名を決定する。機能モジュール５５Ｂのモジュール名は、任意である。好ましくは、機能モジュール５５Ｂのモジュール名は、機能モジュール５５Ａのモジュール名と同じになるように設定される。図９および図１０の例では、機能モジュール５５Ａのモジュール名が「ｓａｍｐｌｅ」であるので、機能モジュール５５Ｂのモジュール名は、「ｓａｍｐｌｅ」に設定される。これにより、設計者は、機能モジュール５５Ａのモジュール名と、機能モジュール５５Ｂのモジュール名との対応関係を把握しやすくなる。
【０１００】
典型的には、ラッパーモジュール生成部１５６は、上述の登録画面３２の入力領域３３Ｅにおいて、同期設定がなされたか否かによって機能モジュール５５Ｂの入出力インターフェイスを変える。
【０１０１】
非同期設定時においては、ラッパーモジュール生成部１５６は、機能モジュール５５Ａの実行完了を待たずにコントローラ２００の制御プログラムを継続して実行するように動作する機能モジュール５５Ｂを生成する。すなわち、機能モジュール５５Ｂがコントローラ２００で実行された場合には、呼出し先の機能モジュール５５Ａは、コントローラ２００の制御プログラムの実行と並列して実行される。
【０１０２】
より具体的には、図９に示されるように、非同期設定時においては、ラッパーモジュール生成部１５６は、「ＢＯＯＬ」型の入力変数「ｃｏｎｔ」を機能モジュール５５Ｂの入力インターフェイスにさらに設定し、「ＢＯＯＬ」型の出力変数「ｄｏｎｅ」と「ＤＷＯＲＤ」型の出力変数「ｅｒｒｏｒ」とを機能モジュール５５Ｂの出力インターフェイスにさらに設定する。入力変数「ｃｏｎｔ」は、呼出し先の機能モジュール５５Ａの実行開始を受け付ける入力インターフェイスである。出力変数「ｄｏｎｅ」は、機能モジュール５５Ｂから呼び出された機能モジュール５５Ａの実行完了を反映するための出力インターフェイスである。出力変数「ｅｒｒｏｒ」は、機能モジュール５５Ｂから呼び出された機能モジュール５５Ａが正常に実行されたか否かを反映するための出力インターフェイスである。機能モジュール５５Ａが異常終了した場合、エラーコードが出力変数「ｅｒｒｏｒ」に反映される。
【０１０３】
同期設定時においては、ラッパーモジュール生成部１５６は、機能モジュール５５Ａが呼び出されてから機能モジュール５５Ａの実行が完了するまでの間、コントローラ２００の制御プログラムの実行を中断するように動作する機能モジュール５５Ｂを生成する。
【０１０４】
より具体的には、図１０に示されるように、同期設定時においては、ラッパーモジュール生成部１５６は、「ＤＷＯＲＤ」型の出力変数「ｅｒｒｏｒ」を機能モジュール５５Ｂの出力インターフェイスにさらに設定する。出力変数「ｅｒｒｏｒ」は、機能モジュール５５Ｂから呼び出された機能モジュール５５Ａの実行結果を反映するための出力インターフェイスである。
【０１０５】
ラッパーモジュール生成部１５６によって生成された機能モジュール５５Ｂは、ラッパーモジュール１２６として開発支援装置１００の記憶装置１２０に格納される。
【０１０６】
また、ラッパーモジュール生成部１５６は、生成元の機能モジュール５５Ａの入出力インターフェイスと、生成された機能モジュール５５Ｂの入出力インターフェイスとの関係を規定したモジュール対応関係１２７を生成する。モジュール対応関係１２７において、機能モジュール５５Ａのモジュール名と、機能モジュール５５Ｂのモジュール名とが関連付けられる。また、モジュール対応関係１２７において、機能モジュール５５Ａの引数と、機能モジュール５５Ｂの入力変数とが関連付けられる。また、モジュール対応関係１２７において、機能モジュール５５Ａの戻り値と、機能モジュール５５Ｂの出力変数とが関連付けられる。生成されたモジュール対応関係１２７は、開発支援装置１００の記憶装置１２０に格納される。
【０１０７】
なお、上述では、ラッパーモジュール生成部１５６は、機能モジュール５５Ａに対する同期設定／非同期設定に基づいて、生成する機能モジュール５５Ｂの入出力インターフェイスを変える例について説明を行ったが、同期設定／非同期設定は必ずしも行われる必要はない。ある局面において、ラッパーモジュール生成部１５６は、同期設定／非同期設定に関係なく、図９に示される機能モジュール５５Ｂを生成する。他の局面において、ラッパーモジュール生成部１５６は、同期設定／非同期設定に関係なく、図１０に示される機能モジュール５５Ｂを生成する。
【０１０８】
（Ｄ４．エディター部１５８）
次に、図１１を参照して、図６に示されるエディター部１５８について説明する。図１１は、エディター部１５８の機能を説明するための図である。
【０１０９】
エディター部１５８は、上述のユーザプログラム２１０の編集操作を受け付ける。エディター部１５８は、たとえば、開発支援プログラム５０によって提供される設計画面３５である。
【０１１０】
設計画面３５は、ユーザプログラム２１０の編集領域３６Ａと、ファンクションブロック名をリスト表示するための表示領域３６Ｂとを含む。表示領域３６Ｂに表示されるファンクションブロックは、ラッパーモジュール生成部１５６によって生成されたラッパーモジュール１２６を含む。一例として、ラッパーモジュール１２６は、上述の機能モジュール５５Ｂを含む。たとえば、表示領域３６Ｂに表示されている機能モジュール５５Ｂが編集領域３６Ａにドラッグ＆ドロップされると、機能モジュール５５Ｂが編集領域３６Ａに表示される。
【０１１１】
このように、設計者は、ラッパーモジュール１２６をユーザプログラム２１０に任意に組み込むことができる。このとき、設計者は、ラッパーモジュール１２６から呼び出される機能モジュールのプログラミング言語の種別を気にする必要はない。すなわち、設計者は、非周期実行型のプログラミング言語に関する知識がなくとも、周期実行型のユーザプログラム２１０から非周期実行型の機能モジュールを利用することが可能になる。
【０１１２】
典型的には、エディター部１５８は、ラッパーモジュール１２６としての機能モジュール５５Ｂの表示時に、呼出し先の機能モジュール５５Ａに関するプロパティ情報を機能モジュール５５Ｂに対応付けて表示する。一例として、表示されるプロパティ情報は、呼出し先の機能モジュール５５Ａのプログラミング言語の種別などを含む。図１１の例では、「Ｃ＋＋」が表示されている。他にも、表示されるプロパティ情報は、呼出し先の機能モジュール５５Ａの引数のデータ型、呼出し先の機能モジュール５５Ａの戻り値のデータ型、呼出し先の機能モジュール５５Ａのモジュール名などを含んでもよい。プロパティ情報の表示／非表示は、ユーザ操作によって適宜切り替えられる。
【０１１３】
また、エディター部１５８は、ラッパーモジュール１２６の表示態様を他の機能モジュールの表示態様と異ならせる。一例として、ラッパーモジュール１２６は、他の機能モジュールとは異なる色で表示される。あるいは、ラッパーモジュール１２６は、他の機能モジュールとは異なるフォントで表示されてもよい。
【０１１４】
なお、図１１の例では、ラッパーモジュール１２６がラダープログラムとしてのユーザプログラム２１０に組み込まれる例について説明を行ったが、ラッパーモジュール１２６は、ＳＴ言語としてのユーザプログラム２１０に組み込まれてもよい。ＳＴ言語は、文字列で記述されているため、呼出し先の機能モジュール５５Ａに関するプロパティ情報がプログラムの設計画面にそのまま表示されると、編集中のプログラムが見にくくなる。そのため、当該プロパティ情報は、ＴｏｏｌＴｉｐで表示される。より具体的には、設計者が設計画面中のラッパーモジュール１２６にカーソルを当てたことに基づいて、エディター部１５８は、呼出し先の機能モジュール５５Ａに関するプロパティ情報を別画面に表示する。
【０１１５】
ＴｏｏｌＴｉｐで表示されるプロパティ情報は、たとえば、呼出し先の機能モジュール５５Ａのプログラミング言語の種別、呼出し先の機能モジュール５５Ａの引数のデータ型、呼出し先の機能モジュール５５Ａの戻り値のデータ型、呼出し先の機能モジュール５５Ａのモジュール名などを含む。
【０１１６】
また、エディター部１５８は、ＳＴ言語で記述されるラッパーモジュール１２６の表示態様を他の機能モジュールの表示態様と異ならせる。一例として、ラッパーモジュール１２６は、他の機能モジュールとは異なる色で表示される。あるいは、ラッパーモジュール１２６は、他の機能モジュールとは異なるフォントで表示されてもよい。
【０１１７】
（Ｄ５．ビルド部１６０）
次に、図６に示されるビルド部１６０について説明する。
【０１１８】
設計者が上述の設計画面３５（図１１参照）においてビルド操作を行った場合、ビルド部１６０は、設計画面３５で設計されたユーザプログラム２１０をビルドし、ユーザプログラム２１０の実行ファイルを生成する。その後、設計者が上述の設計画面３５（図１１参照）において転送操作を行った場合、ビルド部１６０は、ユーザプログラム２１０の実行ファイルと、上述のモジュール対応関係１２７（図９，図１０参照）とをコントローラ２００に転送する。
【０１１９】
モジュール対応関係１２７は、ユーザプログラム２１０の実行ファイルに組み込まれた状態でコントローラ２００に転送されてもよいし、ユーザプログラム２１０の実行ファイルとは別にコントローラ２００に転送されてもよい。
【０１２０】
＜Ｅ．開発支援装置１００の制御構造＞
図１２を参照して、開発支援装置１００の制御構造について説明する。図１２は、開発支援装置１００が実行する処理の一部を表わすフローチャートである。図１２に示される処理は、開発支援装置１００の制御装置１０２が上述のラッパーモジュール生成部１５６（図６参照）として機能することにより実現される。他の局面において、処理の一部または全部が、回路素子またはその他のハードウェアによって実行されてもよい。
【０１２１】
ステップＳ１０において、制御装置１０２は、非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との関係を規定している対応関係１２１（図１参照）を取得する。
【０１２２】
ステップＳ１２において、制御装置１０２は、ラッパー対象の機能モジュール５５Ａに関する定義情報１２２（図１参照）を取得する。定義情報１２２は、機能モジュール５５Ａのモジュール名、機能モジュール５５Ａの引数のデータ型、機能モジュール５５Ａの引数の変数名、機能モジュール５５Ａの戻り値のデータ型、機能モジュール５５Ａの戻り値の変数名などを含む。
【０１２３】
ステップＳ１４において、制御装置１０２は、ステップＳ１０で取得したデータ型の対応関係１２１と、ステップＳ１２で取得した定義情報１２２とに基づいて、機能モジュール５５Ａの引数のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定する。その後、制御装置１０２は、当該特定したデータ型の入力変数を機能モジュール５５Ｂの入力インターフェイスを設定する。当該入力変数は、機能モジュール５５Ａの引数の値を反映するための入力インターフェイスである。
【０１２４】
ラッパー対象の機能モジュール５５Ａに対して非同期設定がなされている場合には、制御装置１０２は、機能モジュール５５Ｂの入力インターフェイスに「ＢＯＯＬ」型の入力変数「ｃｏｎｔ」をさらに設定する（図９参照）。入力変数「ｃｏｎｔ」は、呼出し先の機能モジュール５５Ａの実行開始命令を受け付ける入力インターフェイスである。一方で、ラッパー対象の機能モジュール５５Ａに対して同期設定がなされている場合には、制御装置１０２は、「ＢＯＯＬ」型の入力変数「ｃｏｎｔ」を機能モジュール５５Ｂの入力インターフェイスに設定しない（図１０参照）。
【０１２５】
ステップＳ１６において、制御装置１０２は、ステップＳ１０で取得したデータ型の対応関係１２１と、ステップＳ１２で取得した定義情報１２２とに基づいて、機能モジュール５５Ａの戻り値のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定する。その後、制御装置１０２は、当該特定したデータ型の出力変数を機能モジュール５５Ｂの出力インターフェイスとして設定する。当該出力変数は、機能モジュール５５Ａの戻り値を反映するための出力インターフェイスである。
【０１２６】
また、制御装置１０２は、「ＤＷＯＲＤ」型の出力変数「ｅｒｒｏｒ」を機能モジュール５５Ｂの出力インターフェイスにさらに設定する（図９，図１０参照）。出力変数「ｅｒｒｏｒ」は、機能モジュール５５Ｂから呼び出された機能モジュール５５Ａが正常に実行されたか否かを反映するための出力インターフェイスである。機能モジュール５５Ａが異常終了した場合、エラーコードが出力変数「ｅｒｒｏｒ」に反映される。
【０１２７】
さらに、ラッパー対象の機能モジュール５５Ａに対して非同期設定がなされている場合には、制御装置１０２は、「ＢＯＯＬ」型の出力変数「ｄｏｎｅ」を機能モジュール５５Ｂの出力インターフェイスにさらに設定する（図９参照）。出力変数「ｄｏｎｅ」は、機能モジュール５５Ｂから呼び出された機能モジュール５５Ａの実行完了を反映するための出力インターフェイスである。一方で、ラッパー対象の機能モジュール５５Ａに対して同期設定がなされている場合には、制御装置１０２は、「ＢＯＯＬ」型の出力変数「ｄｏｎｅ」を機能モジュール５５Ｂの出力インターフェイスに設定しない（図１０参照）。
【０１２８】
ステップＳ１８において、制御装置１０２は、生成した機能モジュール５５Ｂをラッパーモジュール１２６として開発支援装置１００の記憶装置１２０に格納する。
【０１２９】
＜Ｆ．実装形態＞
コントローラ２００は、開発支援装置１００から転送されたユーザプログラム２１０に従って駆動機器３００を制御する。ユーザプログラム２１０は、コアＣ１（第１制御部）で実行される。ユーザプログラム２１０に含まれているラッパーモジュールとしての機能モジュール５５Ｂが実行された場合、コントローラ２００は、対応する機能モジュール５５Ａを呼び出す。非周期実行型の機能モジュール５５Ａは、第２コア（第２制御部）で実行される。
【０１３０】
コアＣ１およびコアＣ２は、それぞれ異なる種類のＯＳ（Operating System）上で動作する。典型的には、コアＣ１は、リアルタイムＯＳなどの第１の種類のＯＳ上で動作し、当該ＯＳの基本機能を利用する。一方で、コアＣ２は、Ｌｉｎｕｘ（登録商標）やＷｉｎｄｏｗｓ（登録商標）などの第２の種類のＯＳ上で動作し、当該ＯＳの基本機能を利用する。
【０１３１】
本明細書においては、２つ以上のコアＣ１，Ｃ２（第１，第２制御部）で構成されるシステムを「制御システム」と称する。すなわち、「制御システム」との概念は、少なくとも２つのコアＣ１，Ｃ２で構成される１つの装置や、コアＣ１を備える第１装置とコアＣ２を備える第２装置とで構成されるシステムを含む。
【０１３２】
以下では、図１３〜図１５を参照して、コアＣ１，Ｃ２の実装形態について説明する。
（Ｆ１．コアＣ１，Ｃ２の実装形態の具体例１）
図１３は、コアＣ１およびコアＣ２の実装形態の具体例１を示す図である。
【０１３３】
図１３に示されるように、コントローラ２００は、ＣＰＵユニット２５０を含む。ＣＰＵユニット２５０は、２つ以上のコアで構成される制御装置２０２を含む。一例として、制御装置２０２は、コアＣ１およびコアＣ２を含む。本具体例においては、制御システム１０は、１つの制御装置２０２に搭載される複数のコアＣ１，Ｃ２によって構成される。
【０１３４】
コアＣ１は、上述のユーザプログラム２１０を実行する。ユーザプログラム２１０は、ラダープログラムやＳＴ言語などの非周期実行型のＰＬＣ言語で規定される。コアＣ１は、ユーザプログラム２１０の実行中にラッパーモジュールとしての上述の機能モジュール５５Ｂを実行した場合に、対応する非周期実行型の機能モジュール５５Ａの実行開始命令をコアＣ２に出力する。
【０１３５】
コアＣ２は、当該実行開始命令を受け付けたことに基づいて、機能モジュール５５Ａを実行する。当該機能モジュール５５Ａは、たとえば、Ｃ言語、Ｃ＋＋、Ｊａｖａ、またはＰｙｔｈｏｎなどで規定される。コアＣ２は、機能モジュール５５Ａの実行が完了したことに基づいて、機能モジュール５５Ａの実行結果をコアＣ１に出力する。
【０１３６】
以上のように、本具体例においては、周期実行型のプログラミング言語を実行するコアＣ１と、非周期実行型のプログラミング言語を実行するコアＣ２とが１つの制御装置１０２に搭載される。
【０１３７】
（Ｆ２．コアＣ１，Ｃ２の実装形態の具体例２）
図１４は、コアＣ１およびコアＣ２の実装形態の具体例２を示す図である。
【０１３８】
図１４に示されるように、コントローラ２００は、ＣＰＵユニット２５０と、拡張ユニット２５１とを含む。拡張ユニット２５１は、ＣＰＵユニット２５０と分離可能に構成され、コントローラ２００のバスを介してＣＰＵユニット２５０に接続される。
【０１３９】
ＣＰＵユニット２５０は、制御装置２０２を含む。ＣＰＵユニット２５０は、１つ以上のコアＣ１を含む。コアＣ１は、コントローラ２００用の制御プログラムであるユーザプログラム２１０を実行する。ユーザプログラム２１０は、ラダープログラムやＳＴ言語などの非周期実行型のＰＬＣ言語で規定される。
【０１４０】
拡張ユニット２５１は、１つ以上のコアで構成される制御装置２５２を含む。一例として、制御装置２５２は、コアＣ２を含む。コアＣ２は、非周期実行型の機能モジュール５５Ａを実行する。当該機能モジュール５５Ａは、たとえば、Ｃ言語、Ｃ＋＋、Ｊａｖａ、またはＰｙｔｈｏｎなどで規定される。
【０１４１】
本具体例においては、制御システム１０は、ＣＰＵユニット２５０に搭載されるコアＣ１と、拡張ユニット２５１に搭載されるコアＣ２とで構成される。
【０１４２】
コアＣ１は、ユーザプログラム２１０の実行中にラッパーモジュールとしての機能モジュール５５Ｂを実行した場合に、対応する非周期実行型の機能モジュール５５Ａの実行開始命令をコアＣ２に出力する。コアＣ２は、当該実行開始命令を受け付けたことに基づいて、機能モジュール５５Ａを実行する。コアＣ２は、機能モジュール５５Ａの実行が完了したことに基づいて、機能モジュール５５Ａの実行結果をコアＣ１に出力する。
【０１４３】
以上のように、本具体例においては、周期実行型のプログラミング言語を実行するコアＣ１は、ＣＰＵユニット２５０の制御装置２０２に搭載される。一方で、非周期実行型のプログラミング言語を実行するコアＣ２は、拡張ユニット２５１の制御装置２５２に搭載される。
【０１４４】
（Ｆ３．コアＣ１，Ｃ２の実装形態の具体例３）
図１５は、コアＣ１およびコアＣ２の実装形態の具体例３を示す図である。
【０１４５】
コントローラ２００は、外部機器４００と通信可能に構成される。ＣＰＵユニット２５０は、制御装置２０２を含む。制御装置２０２は、１つ以上のコアＣ１を含む。コアＣ１は、コントローラ２００用の制御プログラムであるユーザプログラム２１０を実行する。ユーザプログラム２１０は、ラダープログラムやＳＴ言語などの非周期実行型のＰＬＣ言語で規定される。
【０１４６】
コントローラ２００は、外部機器４００と通信可能に構成される。外部機器４００は、１つ以上のコアで構成される制御装置４０２を含む。一例として、制御装置４０２は、コアＣ２を含む。コアＣ２は、非周期実行型の機能モジュール５５Ａを実行する。当該機能モジュール５５Ａは、たとえば、Ｃ言語、Ｃ＋＋、Ｊａｖａ、またはＰｙｔｈｏｎなどで規定される。
【０１４７】
本具体例においては、制御システム１０は、コントローラ２００の制御装置２０２に搭載されるコアＣ１と、外部機器４００の制御装置４０２に搭載されるコアＣ２とで構成される。
【０１４８】
コアＣ１は、ユーザプログラム２１０の実行中にラッパーモジュールとしての上述の機能モジュール５５Ｂを実行した場合に、対応する非周期実行型の機能モジュール５５Ａの実行開始命令をコアＣ２に出力する。コアＣ２は、当該実行開始命令を受け付けたことに基づいて、機能モジュール５５Ａを実行する。コアＣ２は、機能モジュール５５Ａの実行が完了したことに基づいて、機能モジュール５５Ａの実行結果をコアＣ１に出力する。
【０１４９】
以上のように、本具体例においては、周期実行型のプログラミング言語を実行するコアＣ１は、コントローラ２００の制御装置２０２に搭載される。一方で、非周期実行型のプログラミング言語を実行するコアＣ２は、外部機器４００の制御装置４０２に搭載される。
【０１５０】
＜Ｇ．コアＣ１，Ｃ２の機能構成＞
図１６を参照して、図１３〜図１５に示されるコアＣ１，Ｃ２の機能構成について説明する。図１６は、コアＣ１，Ｃ２の機能構成の一例を示す図である。
【０１５１】
制御システム１０は、ハードウェア構成として、コアＣ１と、コアＣ２と、記憶装置２０８，４１０とを含む。コアＣ１は、機能構成として、第１実行部２５４と、委託部２５６とを含む。コアＣ２は、機能構成として、第２実行部２６４を含む。
【０１５２】
コントローラ２００の記憶装置２０８、または外部機器４００の記憶装置４１０は、上述の機能モジュール５５Ｂと、上述のモジュール対応関係１２７と、上述のユーザプログラム２１０とを格納する。モジュール対応関係１２７およびユーザプログラム２１０は、たとえば、記憶装置２０８に格納される。モジュール対応関係１２７は、記憶装置２０８および記憶装置４１０のいずれかに格納される。
【０１５３】
第１実行部２５４は、ユーザプログラム２１０の先頭行から最終行までが予め定められた周期ごとに繰り返し実行し、ユーザプログラム２１０に従って駆動機器３００を制御する。第１実行部２５４は、ユーザプログラム２１０に含まれるラッパーモジュールとしての機能モジュール５５Ｂが実行された場合、対応する機能モジュール５５Ａの実行を委託部２５６に委託する。
【０１５４】
委託部２５６は、ＲＰＣ（Remote Procedure Call）機能を有する。すなわち、委託部２５６は、呼出し先の機能モジュール５５Ａの実行を他のコアＣ２に実行させる。
【０１５５】
図１７を参照して、委託部２５６の機能について説明する。図１７は、委託部２５６による委託処理を概略的に示す概念図である。
【０１５６】
図１７に示されるように、委託部２５６は、ラッパーモジュール１２６の１つである機能モジュール５５Ｂから機能モジュール５５Ａの実行命令を受けたとする。このことに基づいて、委託部２５６は、モジュール対応関係１２７を参照して、機能モジュール５５Ｂのモジュール名に対応する、呼出し先の機能モジュール５５Ａのモジュール名（関数名）を特定する。図１７の例では、機能モジュール５５Ａのモジュール名として、「ｓａｍｐｌｅ」が特定される。
【０１５７】
その後、委託部２５６は、モジュール対応関係１２７を参照して、機能モジュール５５Ｂの入力変数に対応する機能モジュール５５Ａの引数を特定する。図１７の例では、「ＲＥＡＬ」型の入力変数「ｉｎ１」に対して「ｆｌｏａｔ」型の引数「ｉｎ１」が特定される。「ＬＲＥＡＬ」型の入力変数「ｉｎ２」に対して「ｄｏｕｂｌｅ」型の引数「ｉｎ２」が特定される。
【０１５８】
委託部２５６は、特定したデータ型の関係に従って、「ＲＥＡＬ」型の入力変数「ｉｎ１」の値を「ｆｌｏａｔ」型に変換し、当該変換後の値を機能モジュール５５Ａの引数「ｉｎ１」に代入する。同様に、委託部２５６は、特定したデータ型の関係に従って、「ＬＲＥＡＬ」型の入力変数「ｉｎ２」を「ｄｏｕｂｌｅ」型に変換し、当該変換後の入力変数「ｉｎ２」を機能モジュール５５Ａの引数「ｉｎ２」に代入する。このように、委託部２５６は、機能モジュール５５Ｂの入力変数の値を機能モジュール５５Ａのデータ型に合わせて変換した上で、当該入力変数の値を当該引数に反映する。その後、委託部２５６は、機能モジュール５５Ａの実行開始命令を第２実行部２６４に出力する。
【０１５９】
再び図１６を参照して、第２実行部２６４は、委託部２５６から実行開始命令を受け付けたことに基づいて、呼出し対象の機能モジュール５５Ａの実行プログラムを読み出し、当該実行プログラムの各行を順次実行する。このとき、第２実行部２６４は、当該実行プログラムの実行が完了したことに基づいて、実行結果を委託部２５６に出力する。
【０１６０】
再び図１７を参照して、委託部２５６は、第２実行部２６４から機能モジュール５５Ａの実行結果を受けたことに基づいて、当該実行結果を機能モジュール５５Ｂの出力変数に反映する。より具体的には、委託部２５６は、モジュール対応関係１２７を参照して、機能モジュール５５Ａの戻り値に対応する機能モジュール５５Ｂの出力変数を特定する。図１７の例では、「ｂｏｏｌ」型の戻り値「ｒｅｔ」に対して「ＢＯＯＬ」型の出力変数「ｒｅｔ」が特定される。委託部２５６は、特定したデータ型の関係に従って、「ｂｏｏｌ」型の戻り値「ｒｅｔ」を「ＢＯＯＬ」型に変換し、当該変換後の戻り値を機能モジュール５５Ｂの出力変数「ｒｅｔ」に代入する。このように、委託部２５６は、機能モジュール５５Ａの戻り値を機能モジュール５５Ｂの出力変数のデータ型に合わせて変換した上で、当該戻り値を当該出力変数に反映する。
【０１６１】
＜Ｈ．データフロー＞
上述の図９および図１０で説明したように、非同期設定がなされたラッパーモジュール１２６と、同期設定がなされたラッパーモジュール１２６とがある。非同期設定がなされたラッパーモジュール１２６が実行された場合、呼出し先の機能モジュール５５Ａは、ユーザプログラム２１０の実行周期に同期させずに実行される。同期設定がなされたラッパーモジュール１２６が実行された場合、呼出し先の機能モジュール５５Ａは、ユーザプログラム２１０の実行周期に同期して実行される。
【０１６２】
以下では、図１８および図１９を参照して、呼出し先の機能モジュール５５Ａを非同期実行する場合における制御システム１０のデータフローと、呼出し先の機能モジュール５５Ａを同期実行する場合における制御システム１０のデータフローとについて順に説明する。
【０１６３】
（Ｈ１．非同期実行）
図１８は、呼出し先の機能モジュール５５Ａを非同期実行する場合における制御システム１０のデータフローの一例を示す図である。以下では、ラッパーモジュールである機能モジュール５５Ｂから機能モジュール５５Ａを呼び出す前提で説明を行う。
【０１６４】
第１実行部２５４は、コントローラ２００の制御周期に従ってユーザプログラム２１０を繰り返し実行する。非同期実行の場合には、呼出し先の機能モジュール５５Ａは、ユーザプログラム２１０の実行と並列して実行される。
【０１６５】
より具体的には、ステップＳ５０（コントローラ２００の制御周期０周目）において、ラッパーモジュール１２６の１つである機能モジュール５５Ｂの入力変数「ｃｏｎｔ」が「ＯＮ」であったとする。上述の図９で説明したように、入力変数「ｃｏｎｔ」は、呼出し先の機能モジュール５５Ａの実行開始命令を受け付ける入力インターフェイスである。入力変数「ｃｏｎｔ」を「ＯＮ」にすることは、呼出し先の機能モジュール５５Ａの実行を開始することを示す。
【０１６６】
ステップＳ５２において、機能モジュール５５Ｂの入力変数「ｃｏｎｔ」が「ＯＮ」に設定されたことに基づいて、委託部２５６は、ユーザプログラム２１０を実行するスレッド（タスク）とは別に新たなスレッドを生成する。
【０１６７】
ステップＳ５４において、委託部２５６は、機能モジュール５５Ｂの出力変数「ｄｏｎｅ」を「ＯＦＦ」に設定する。上述の図９で説明したように、出力変数「ｄｏｎｅ」は、機能モジュール５５Ｂから呼び出された機能モジュール５５Ａの実行完了を反映するための出力インターフェイスである。出力変数「ｄｏｎｅ」が「ＯＦＦ」であることは、呼出し先の機能モジュール５５Ａの実行が完了していないことを示す。
【０１６８】
ステップＳ５６において、委託部２５６は、ステップＳ５２で生成された別スレッドとして、呼出し元の機能モジュール５５Ｂの入力変数の値を呼出し先の機能モジュール５５Ａの引数に反映し、当該機能モジュール５５Ａの実行開始命令を第２実行部２６４に出力する。入力変数を引数に反映する方法については図１７で説明した通りであるので、その説明については繰り返さない。
【０１６９】
ステップＳ６０（コントローラ２００の制御周期１周目）において、機能モジュール５５Ｂの入力変数「ｃｏｎｔ」が、引き続き「ＯＮ」であったとする。このとき、呼出し先の機能モジュール５５Ａが未だに実行中であるので、委託部２５６は、機能モジュール５５Ｂの入力変数「ｃｏｎｔ」が「ＯＮ」に設定されていたとしても第２実行部２６４に対して特に何もしない。
【０１７０】
ステップＳ６２において、委託部２５６は、機能モジュール５５Ｂの出力変数「ｄｏｎｅ」を「ＯＦＦ」に設定する。上述のように、出力変数「ｄｏｎｅ」が「ＯＦＦ」であることは、呼出し先の機能モジュール５５Ａの実行が完了していないことを示す。
【０１７１】
ステップＳ６４において、呼出し先の機能モジュール５５Ａの実行が完了したとする。このことに基づいて、第２実行部２６４は、機能モジュール５５Ａの実行結果を委託部２５６に出力する。
【０１７２】
ステップＳ６６において、委託部２５６は、ステップＳ５２で生成された別スレッドとして、機能モジュール５５Ｂの出力変数「ｄｏｎｅ」を「ＯＮ」に設定する。出力変数「ｄｏｎｅ」が「ＯＮ」であることは、呼出し先の機能モジュール５５Ａの実行が完了したことを示す。
【０１７３】
ステップＳ７０（コントローラ２００の制御周期２周目）において、機能モジュール５５Ｂの入力変数「ｃｏｎｔ」が、引き続き「ＯＮ」であったとする。このとき、呼出し先の機能モジュール５５Ａが完了した直後であるので、委託部２５６は、機能モジュール５５Ｂの入力変数「ｃｏｎｔ」が「ＯＮ」に設定されていたとしても第２実行部２６４に対しては特に何もしない。
【０１７４】
ステップＳ７２において、委託部２５６は、機能モジュール５５Ａの実行結果（戻り値）を機能モジュール５５Ｂの出力変数「ｒｅｔ」に反映する。戻り値を出力変数に反映する方法については図１７で説明した通りであるので、その説明については繰り返さない。
【０１７５】
以上のように、委託部２５６は、非同期実行時においては、機能モジュール５５Ａの実行開始命令を第２実行部２６４に出力してから機能モジュール５５Ａの実行結果を受けるまでの間、ユーザプログラム２１０を継続して実行する。すなわち、呼出し先の機能モジュール５５Ａの実行は、ユーザプログラム２１０の実行と並列に行われる。これにより、委託部２５６は、ユーザプログラム２１０の実行周期に同期させずに、非周期実行型の機能モジュール５５Ａを実行することができる。
【０１７６】
（Ｈ２．同期実行）
図１９は、呼出し先の機能モジュール５５Ａを同期実行する場合における制御システム１０のデータフローの一例を示す図である。以下では、ラッパーモジュールである機能モジュール５５Ｂから機能モジュール５５Ａを呼び出す前提で説明を行う。
【０１７７】
第１実行部２５４は、コントローラ２００の制御周期に従ってユーザプログラム２１０を繰り返し実行する。同期実行の場合には、呼出し先の機能モジュール５５Ａが完了するまで、ユーザプログラム２１０の実行は中断される。
【０１７８】
より具体的には、ステップＳ８０（コントローラ２００の制御周期０周目）において、第１実行部２５４は、呼出し元の機能モジュール５５Ｂから呼出し先の機能モジュール５５Ａを呼び出したとする。
【０１７９】
ステップＳ８２において、委託部２５６は、第１実行部２５４から機能モジュール５５Ａの実行命令を受けたことに基づいて、呼出し元の機能モジュール５５Ｂの入力変数の値を呼出し先の機能モジュール５５Ａの引数に反映し、機能モジュール５５Ａの実行開始命令を第２実行部２６４に出力する。入力変数を引数に反映する方法については図１７で説明した通りであるので、その説明については繰り返さない。
【０１８０】
ステップＳ８４において、呼出し先の機能モジュール５５Ａの実行が完了したとする。このことに基づいて、第２実行部２６４は、機能モジュール５５Ａの実行結果を委託部２５６に出力する。
【０１８１】
ステップＳ８６において、委託部２５６は、機能モジュール５５Ａの実行結果（戻り値）を機能モジュール５５Ｂの出力変数「ｒｅｔ」に反映する。戻り値を出力変数に反映する方法については図１７で説明した通りであるので、その説明については繰り返さない。
【０１８２】
ステップＳ９０（コントローラ２００の制御周期１周目）において、第１実行部２５４は、呼出し元の機能モジュール５５Ｂから呼出し先の機能モジュール５５Ａを再び呼び出したとする。
【０１８３】
ステップＳ９２において、委託部２５６は、第１実行部２５４から機能モジュール５５Ａの呼出し命令を受け付けたことに基づいて、呼出し元の機能モジュール５５Ｂの入力変数の値を呼出し先の機能モジュール５５Ａの引数に反映し、機能モジュール５５Ａの実行開始命令を第２実行部２６４に出力する。
【０１８４】
ステップＳ９４において、呼出し先の機能モジュール５５Ａの実行が完了したとする。このことに基づいて、第２実行部２６４は、機能モジュール５５Ａの実行結果を委託部２５６に出力する。
【０１８５】
ステップＳ９６において、委託部２５６は、機能モジュール５５Ａの実行結果（戻り値）を機能モジュール５５Ｂの出力変数「ｒｅｔ」に反映する。
【０１８６】
以上のように、委託部２５６は、同期実行時においては、ステップＳ９２で機能モジュール５５Ａの実行開始命令を第２実行部２６４に出力してからステップＳ９４で機能モジュール５５Ａの実行結果を受けるまでの間、ユーザプログラム２１０の実行を中断する。すなわち、委託部２５６は、ユーザプログラム２１０の実行と機能モジュール５５Ａの実行とを直列的に実行する。これにより、委託部２５６は、ユーザプログラム２１０の実行周期に同期させて、非周期実行型の機能モジュール５５Ａを実行することができる。
【０１８７】
＜Ｉ．付記＞
以上のように、本実施形態は以下のような開示を含む。
【０１８８】
［構成１］
コントローラ用の制御プログラムの開発を支援するための開発支援プログラム（５０）であって、
前記開発支援プログラム（５０）は、コンピュータに、
非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との対応関係（１２１）を取得するステップ（Ｓ１０）と、
前記非周期実行型のプログラミング言語で規定される非周期実行型の機能モジュール（５５Ａ）の引数のデータ型と、当該機能モジュールの戻り値のデータ型とを含む定義情報（１２２）を取得するステップ（Ｓ１２）と、
前記非周期実行型の機能モジュール（５５Ａ）を呼び出すための機能モジュールであって、前記制御プログラム（２１０、２１１）で利用可能な周期実行型の機能モジュール（５５Ｂ）を生成するステップ（Ｓ１４，Ｓ１６）とを実行させ、
前記生成するステップ（Ｓ１４，Ｓ１６）は、
前記対応関係（１２１）および前記定義情報（１２２）に基づいて、前記引数のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の入力変数であり前記引数の値を反映するための入力変数を前記周期実行型の機能モジュール（５５Ｂ）の入力インターフェイスとして設定するステップ（Ｓ１４）と、
前記対応関係（１２１）および前記定義情報（１２２）に基づいて、前記戻り値のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の出力変数であり前記戻り値を反映するための出力変数を前記周期実行型の機能モジュール（５５Ｂ）の出力インターフェイスとして設定するステップ（Ｓ１６）とを含む、開発支援プログラム。
【０１８９】
［構成２］
前記生成するステップ（Ｓ１４，Ｓ１６）で生成される前記周期実行型の機能モジュール（５５Ｂ）は、前記非周期実行型の機能モジュール（５５Ａ）を呼び出してから前記非周期実行型の機能モジュール（５５Ａ）の実行が完了するまでの間、前記制御プログラム（２１０、２１１）の実行を中断するように動作する、構成１に記載の開発支援プログラム。
【０１９０】
［構成３］
前記生成するステップ（Ｓ１４，Ｓ１６）で生成される前記周期実行型の機能モジュール（５５Ｂ）は、前記非周期実行型の機能モジュール（５５Ａ）の実行完了を待たずに前記制御プログラム（２１０、２１１）を継続して実行するように動作する、構成１に記載の開発支援プログラム。
【０１９１】
［構成４］
前記生成するステップ（Ｓ１４，Ｓ１６）は、前記非周期実行型の機能モジュール（５５Ａ）の実行完了を反映するための出力変数を前記周期実行型の機能モジュール（５５Ｂ）の出力に設定するステップをさらに含む、構成３に記載の開発支援プログラム。
【０１９２】
［構成５］
前記入力変数の名前は、前記引数の名前と同じである、構成１〜４のいずれか１項に記載の開発支援プログラム。
【０１９３】
［構成６］
前記周期実行型の機能モジュール（５５Ｂ）のモジュール名は、前記非周期実行型の機能モジュール（５５Ａ）のモジュール名と同じである、構成１〜５のいずれか１項に記載の開発支援プログラム。
【０１９４】
［構成７］
コントローラ用の制御プログラム（２１０、２１１）の開発を支援するための開発支援装置（１００）であって、
非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との対応関係（１２１）を格納する記憶装置（１２０）を備え、
前記記憶装置（１２０）は、前記非周期実行型のプログラミング言語で規定される非周期実行型の機能モジュール（５５Ａ）の引数のデータ型と、当該機能モジュールの戻り値のデータ型とを含む定義情報（１２２）をさらに格納し、
前記非周期実行型の機能モジュール（５５Ａ）を呼び出すための機能モジュールであって、前記制御プログラム（２１０、２１１）で利用可能な周期実行型の機能モジュール（５５Ｂ）を生成するための制御装置（１０２）をさらに備え、
前記制御装置（１０２）は、
前記対応関係（１２１）および前記定義情報（１２２）に基づいて、前記引数のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の入力変数であり前記引数の値を反映するための入力変数を前記周期実行型の機能モジュール（５５Ｂ）の入力インターフェイスとして設定し、
前記対応関係（１２１）および前記定義情報（１２２）に基づいて、前記戻り値のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の出力変数であり前記戻り値を反映するための出力変数を前記周期実行型の機能モジュール（５５Ｂ）の出力インターフェイスとして設定する、開発支援装置。
【０１９５】
［構成８］
コントローラ用の制御プログラム（２１０、２１１）の開発を支援するための開発支援方法であって、
開発支援装置（１００）が、非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との対応関係（１２１）を取得するステップ（Ｓ１０）と、
前記開発支援装置（１００）が、前記非周期実行型のプログラミング言語で規定される非周期実行型の機能モジュール（５５Ａ）の引数のデータ型と、当該機能モジュールの戻り値のデータ型とを含む定義情報（１２２）を取得するステップ（Ｓ１２）と、
前記開発支援装置（１００）が、前記非周期実行型の機能モジュール（５５Ａ）を呼び出すための機能モジュールであって、前記制御プログラム（２１０、２１１）で利用可能な周期実行型の機能モジュール（５５Ｂ）を生成するステップ（Ｓ１４，Ｓ１６）とを備え、
前記生成するステップ（Ｓ１４，Ｓ１６）は、
前記開発支援装置（１００）が、前記対応関係（１２１）および前記定義情報（１２２）に基づいて、前記引数のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の入力変数であり前記引数の値を反映するための入力変数を前記周期実行型の機能モジュール（５５Ｂ）の入力インターフェイスとして設定するステップ（Ｓ１４）と、
前記開発支援装置（１００）が、前記対応関係（１２１）および前記定義情報（１２２）に基づいて、前記戻り値のデータ型に対応する、前記周期実行型のプログラミング言語のデータ型を特定し、当該データ型の出力変数であり前記戻り値を反映するための出力変数を前記周期実行型の機能モジュール（５５Ｂ）の出力インターフェイスとして設定するステップ（Ｓ１６）とを含む、開発支援方法。
【０１９６】
今回開示された実施の形態は全ての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内での全ての変更が含まれることが意図される。
【符号の説明】
【０１９７】
１０  制御システム、３２  登録画面、３３Ａ，３３Ｂ，３３Ｃ，３３Ｄ，３３Ｅ  入力領域、３５  設計画面、３６Ａ  編集領域、３６Ｂ  表示領域、５０  開発支援プログラム、５５Ａ，５５Ｂ  機能モジュール、５５Ｂ１，５５Ｂ２  入力変数、５５Ｂ３  出力変数、５６，２１２  各種データ、６０  プログラム、１００  開発支援装置、１０２，２０２，２５２，４０２  制御装置、１０４，２０６，４０４  主メモリ、１１１，２０１，４１２  通信インターフェイス、１１４，４１４  Ｉ／Ｏインターフェイス、１１５，４１５  操作部、１１７，４２０  表示インターフェイス、１１８，４２１  表示部、１２０，２０８，４１０  記憶装置、１２１  対応関係、１２２  定義情報、１２５，４２５  内部バス、１２６  ラッパーモジュール、１２７  モジュール対応関係、１５２  プログラム解析部、１５４  モジュール登録部、１５６  ラッパーモジュール生成部、１５８  エディター部、１６０  ビルド部、２００  コントローラ、２０４  チップセット、２０９  システムプログラム、２１０  ユーザプログラム、２１０Ａ  シーケンスプログラム、２１０Ｂ  モーションプログラム、２１１  制御プログラム、２２２  内部バスコントローラ、２２４  フィールドバスコントローラ、２２６  Ｉ／Ｏユニット、２３９  メモリカードインターフェイス、２４０  メモリカード、２５０  ユニット、２５１  拡張ユニット、２５４  第１実行部、２５６  委託部、２６４  第２実行部、３００  駆動機器、３００Ａ  ロボットコントローラ、３００Ｂ  サーボドライバ、３０１Ａ  アームロボット、３０１Ｂ  サーボモータ、４００  外部機器、４１６  フィールドバスインターフェイス。
【図１】
2020060855.tif 000003
【図２】
2020060855.tif 000004
【図３】
2020060855.tif 000005
【図４】
2020060855.tif 000006
【図５】
2020060855.tif 000007
【図６】
2020060855.tif 000008
【図７】
2020060855.tif 000009
【図８】
2020060855.tif 000010
【図９】
2020060855.tif 000011
【図１０】
2020060855.tif 000012
【図１１】
2020060855.tif 000013
【図１２】
2020060855.tif 000014
【図１３】
2020060855.tif 000015
【図１４】
2020060855.tif 000016
【図１５】
2020060855.tif 000017
【図１６】
2020060855.tif 000018
【図１７】
2020060855.tif 000019
【図１８】
2020060855.tif 000020
【図１９】
2020060855.tif 000021