(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-06-20
(45)【発行日】2022-06-28
(54)【発明の名称】制御システム、制御方法、および開発支援プログラム
(51)【国際特許分類】
G05B 19/05 20060101AFI20220621BHJP
【FI】
G05B19/05 F
(21)【出願番号】P 2018190150
(22)【出願日】2018-10-05
【審査請求日】2020-12-14
(73)【特許権者】
【識別番号】000002945
【氏名又は名称】オムロン株式会社
(74)【代理人】
【識別番号】110001195
【氏名又は名称】特許業務法人深見特許事務所
(72)【発明者】
【氏名】廣田 拓也
【審査官】影山 直洋
(56)【参考文献】
【文献】特開2016-110220(JP,A)
【文献】特開2002-189507(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G05B 19/05
(57)【特許請求の範囲】
【請求項1】
コントローラ用の制御プログラムの開発を支援する開発支援装置と、
前記制御プログラムを格納するための記憶装置とを備え、前記制御プログラムは、非周期実行型の機能モジュールを呼び出すための周期実行型の機能モジュールを含み、
前記制御プログラムを実行するための第1制御部と、
前記非周期実行型の機能モジュールを実行するための第2制御部とを備え、
前記開発支援装置は、
前記非周期実行型の機能モジュールの解析、または入力操作に応じて、前記非周期実行型の機能モジュールの引数のデータ型と、前記非周期実行型の機能モジュールの戻り値のデータ型とを示す定義情報を生成し、
プログラミング別のデータ型の対応関係に基づいて、前記定義情報によって規定される前記引数のデータ型に対応する、周期実行型のプログラム言語のデータ型を特定し、特定したデータ型の入力変数を前記周期実行型の機能モジュールの入力インターフェイスとして設定し、
前記対応関係に基づいて、前記定義情報によって規定される前記戻り値のデータ型に対応する、前記周期実行型のプログラム言語のデータ型を特定し、特定したデータ型の出力変数を前記周期実行型の機能モジュールの出力インターフェイスとして設定し、
前記第1制御部は、前記制御プログラムの実行中に前記周期実行型の機能モジュールを実行した場合に、当該周期実行型の機能モジュールの入力変数の値を前記非周期実行型の機能モジュールの引数に反映し、前記非周期実行型の機能モジュールの実行開始命令を前記第2制御部に出力し、
前記第2制御部は、前記実行開始命令を受け付けたことに基づいて、前記非周期実行型の機能モジュールの実行を開始し、当該非周期実行型の機能モジュールの実行が完了したことに基づいて、当該非周期実行型の機能モジュールの戻り値を前記第1制御部に出力し、
前記第1制御部は、前記第2制御部から前記戻り値を受けたことに基づいて、前記周期実行型の機能モジュールの出力変数に前記戻り値を反映する、制御システム。
【請求項2】
前記第1制御部は、前記実行開始命令を前記第2制御部に出力してから前記戻り値を受けるまでの間、前記制御プログラムの実行を中断する、請求項1に記載の制御システム。
【請求項3】
前記第1制御部は、前記実行開始命令を前記第2制御部に出力してから前記戻り値を受けるまでの間、前記制御プログラムを継続して実行する、請求項1に記載の制御システム。
【請求項4】
前記周期実行型の機能モジュールの出力は、前記非周期実行型の機能モジュールの実行完了を反映するための出力変数を含む、請求項3に記載の制御システム。
【請求項5】
前記第1制御部は、前記入力変数の値を前記引数のデータ型に合わせて変換した上で、当該入力変数の値を当該引数に反映する、請求項1~4のいずれか1項に記載の制御システム。
【請求項6】
前記第1制御部は、前記戻り値を前記出力変数のデータ型に合わせて変換した上で、当該戻り値を当該出力変数に反映する、請求項1~5のいずれか1項に記載の制御システム。
【請求項7】
第1制御部と、第2制御部とを備える制御システムの制御方法であって、
前記制御方法は、
コントローラ用の制御プログラムを
開発するステップを備え、前記制御プログラムは、非周期実行型の機能モジュールを呼び出すための周期実行型の機能モジュールを含み、
前記開発するステップは、
前記非周期実行型の機能モジュールの解析、または入力操作に応じて、前記非周期実行型の機能モジュールの引数のデータ型と、前記非周期実行型の機能モジュールの戻り値のデータ型および変数名とを示す定義情報を生成するステップと、
プログラミング別のデータ型の対応関係に基づいて、前記定義情報によって規定される前記引数のデータ型に対応する、周期実行型のプログラム言語のデータ型を特定し、特定したデータ型の入力変数を前記周期実行型の機能モジュールの入力インターフェイスとして設定するステップと、
前記対応関係に基づいて、前記定義情報によって規定される前記戻り値のデータ型に対応する、前記周期実行型のプログラム言語のデータ型を特定し、特定したデータ型の出力変数を前記周期実行型の機能モジュールの出力インターフェイスとして設定するステップとを含み、
前記制御方法は、さらに、
前記第1制御部が、前記制御プログラムを実行するステップと、
前記第1制御部が、前記制御プログラムの実行中に前記周期実行型の機能モジュールを実行した場合に、当該周期実行型の機能モジュールの入力変数の値を前記非周期実行型の機能モジュールの引数に反映し、前記非周期実行型の機能モジュールの実行開始命令を前記第2制御部に出力するステップと、
前記第2制御部が、前記実行開始命令を受け付けたことに基づいて、前記非周期実行型の機能モジュールの実行を開始し、当該非周期実行型の機能モジュールの実行が完了したことに基づいて、当該非周期実行型の機能モジュールの戻り値を前記第1制御部に出力するステップと、
前記第1制御部が、前記第2制御部から前記戻り値を受けたことに基づいて、前記周期実行型の機能モジュールの出力変数に前記戻り値を反映するステップとを備える、制御方法。
【請求項8】
コントローラによって実行される周期実行型の制御プログラム
の開発を支援する開発支援プログラムであって、
前記制御プログラムは、非周期実行型の機能モジュールを呼び出すための周期実行型の機能モジュールを含み、
前記コントローラは、第1制御部を備え、
前記コントローラと通信可能に構成される外部機器、または前記コントローラは、第2制御部を備え、
前記制御プログラムは、前記第1制御部に、
前記制御プログラムを実行するステップと、
前記制御プログラムの実行中に前記周期実行型の機能モジュールが実行された場合に、当該機能モジュールの入力変数の値を前記非周期実行型の機能モジュールの引数に反映し、前記非周期実行型の機能モジュールの実行開始命令を前記第2制御部に出力するステップと、
前記非周期実行型の機能モジュールの実行結果を前記第2制御部から受けたことに基づいて、前記周期実行型の機能モジュールの出力変数に当該実行結果を反映するステップとを実行させ
、
前記開発支援プログラムは、
コンピュータに、
前記非周期実行型の機能モジュールの解析、または入力操作に応じて、前記非周期実行型の機能モジュールの引数のデータ型と、前記非周期実行型の機能モジュールの戻り値のデータ型とを示す定義情報を生成するステップと、
プログラミング別のデータ型の対応関係に基づいて、前記定義情報によって規定される前記引数のデータ型に対応する、周期実行型のプログラム言語のデータ型を特定し、特定したデータ型の入力変数を前記周期実行型の機能モジュールの入力インターフェイスとして設定するステップと、
前記対応関係に基づいて、前記定義情報によって規定される前記戻り値のデータ型に対応する、前記周期実行型のプログラム言語のデータ型を特定し、特定したデータ型の出力変数を前記周期実行型の機能モジュールの出力インターフェイスとして設定するステップとを実行させる、
開発支援プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、異なる種類のプログラミング言語で規定されるプログラムを実行するための技術に関する。
【背景技術】
【0002】
様々な製造現場において、PLC(Programmable Logic Controller)などのコントローラが導入されている。コントローラは、一種のコンピュータであり、製造装置や製造設備などに応じて設計された制御プログラムが実行される。このような制御プログラムは、コントローラとは別に用意されたサポート装置を用いて作成される。
【0003】
たとえば、特開2016-224557号公報(特許文献1)は、グラフィカルプログラミング言語により記述されるプログラムと高級プログラミング言語により記述されるプログラムを作成するユーザの負担を軽減するための技術を開示している。
【先行技術文献】
【特許文献】
【0004】
【発明の概要】
【発明が解決しようとする課題】
【0005】
コントローラの制御プログラムは、周期実行型のプログラミング言語で記述される。周期実行型とは、制御プログラムの先頭行から最終行までが予め定められた周期ごとに繰り返し実行される実行形態をいう。すなわち、周期実行型の制御プログラムにおいては、プログラムの実行周期が保障されている。
【0006】
このような周期実行型の制御プログラムから、非周期実行型のプログラミング言語で記述される機能モジュールを呼び出したいという要望がある。非周期実行型とは、プログラムの各行が逐次的に実行される実行形態をいう。非周期実行型の機能モジュールにおいては、実行を開始してから終了するまでの時間が保障されない。
【0007】
本開示は上述のような問題点を解決するためになされたものであって、ある局面における目的は、周期実行型の制御プログラムから非周期実行型の機能モジュールを呼び出すことが可能な制御システムを提供することである。他の局面における目的は、周期実行型の制御プログラムから非周期実行型の機能モジュールを呼び出すことが制御方法を提供することである。他の局面における目的は、周期実行型の制御プログラムから非周期実行型の機能モジュールを呼び出すことが可能な制御プログラムを提供することである。
【課題を解決するための手段】
【0008】
本開示の一例では、制御システムは、コントローラ用の制御プログラムを格納するための記憶装置を備える。上記制御プログラムは、非周期実行型の機能モジュールを呼び出すための周期実行型の機能モジュールを含む。上記制御システムは、上記制御プログラムを実行するための第1制御部と、上記非周期実行型の機能モジュールを実行するための第2制御部とを備える。上記第1制御部は、上記制御プログラムの実行中に上記周期実行型の機能モジュールを実行した場合に、当該周期実行型の機能モジュールの入力変数の値を上記非周期実行型の機能モジュールの引数に反映し、上記非周期実行型の機能モジュールの実行開始命令を上記第2制御部に出力する。上記第2制御部は、上記実行開始命令を受け付けたことに基づいて、上記非周期実行型の機能モジュールの実行を開始し、当該非周期実行型の機能モジュールの実行が完了したことに基づいて、当該非周期実行型の機能モジュールの戻り値を上記第1制御部に出力する。上記第1制御部は、上記第2制御部から上記戻り値を受けたことに基づいて、上記周期実行型の機能モジュールの出力変数に上記戻り値を反映する。
【0009】
この開示によれば、呼出し元の周期実行型の機能モジュールの入力変数が、呼出し先の非周期実行型の機能モジュールの引数に反映される。また、呼出し先の非周期実行型の機能モジュールの戻り値が、呼出し元の周期実行型の機能モジュールの出力変数に反映される。これにより、上記制御システムは、周期実行型の機能モジュールから非周期実行型の機能モジュールを呼び出すことができる。
【0010】
本開示の一例では、上記第1制御部は、上記実行開始命令を上記第2制御部に出力してから上記戻り値を受けるまでの間、上記制御プログラムの実行を中断する。
【0011】
この開示によれば、上記第1制御部は、周期実行型の制御プログラムの実行周期に同期させて、非周期実行型の機能モジュールを実行することができる。
【0012】
本開示の一例では、上記第1制御部は、上記実行開始命令を上記第2制御部に出力してから上記戻り値を受けるまでの間、上記制御プログラムを継続して実行する。
【0013】
この開示によれば、これにより、第1制御部は、周期実行型の制御プログラムの実行周期に同期させずに、非周期実行型の機能モジュールを実行することができる。
【0014】
本開示の一例では、上記周期実行型の機能モジュールの出力は、上記非周期実行型の機能モジュールの実行完了を反映するための出力変数を含む。
【0015】
この開示によれば、周期実行型の機能モジュールの実行結果が、呼出し元の非周期実行型の機能モジュールの出力変数に反映される。
【0016】
本開示の一例では、上記第1制御部は、上記入力変数の値を上記引数のデータ型に合わせて変換した上で、当該入力変数の値を当該引数に反映する。
【0017】
この開示によれば、周期実行型の機能モジュールの入力変数のデータ型と、非周期実行型の機能モジュールの引数のデータ型との間の差異が吸収される。
【0018】
本開示の一例では、上記第1制御部は、上記戻り値を上記出力変数のデータ型に合わせて変換した上で、当該戻り値を当該出力変数に反映する。
【0019】
この開示によれば、非周期実行型の機能モジュールの戻り値のデータ型と、周期実行型の機能モジュールの出力変数のデータ型との間の差異が吸収される。
【0020】
本開示の他の例では、第1制御部と、第2制御部とを備える制御システムの制御方法が提供される。上記制御方法は、コントローラ用の制御プログラムを取得するステップを備える。上記制御プログラムは、非周期実行型の機能モジュールを呼び出すための周期実行型の機能モジュールを含む。上記制御方法は、さらに、上記第1制御部が、上記制御プログラムを実行するステップと、上記第1制御部が、上記制御プログラムの実行中に上記周期実行型の機能モジュールを実行した場合に、当該周期実行型の機能モジュールの入力変数の値を上記非周期実行型の機能モジュールの引数に反映し、上記非周期実行型の機能モジュールの実行開始命令を上記第2制御部に出力するステップと、上記第2制御部が、上記実行開始命令を受け付けたことに基づいて、上記非周期実行型の機能モジュールの実行を開始し、当該非周期実行型の機能モジュールの実行が完了したことに基づいて、当該非周期実行型の機能モジュールの戻り値を上記第1制御部に出力するステップと、上記第1制御部が、上記第2制御部から上記戻り値を受けたことに基づいて、上記周期実行型の機能モジュールの出力変数に上記戻り値を反映するステップとを備える。
【0021】
この開示によれば、呼出し元の周期実行型の機能モジュールの入力変数が、呼出し先の非周期実行型の機能モジュールの引数に反映される。また、呼出し先の非周期実行型の機能モジュールの戻り値が、呼出し元の周期実行型の機能モジュールの出力変数に反映される。これにより、上記制御方法は、周期実行型の機能モジュールから非周期実行型の機能モジュールを呼び出すことができる。
【0022】
本開示の他の例では、コントローラによって実行される周期実行型の制御プログラムが提供される。上記制御プログラムは、非周期実行型の機能モジュールを呼び出すための周期実行型の機能モジュールを含む。上記コントローラは、第1制御部を備える。上記コントローラと通信可能に構成される外部機器、または上記コントローラは、第2制御部を備える。上記制御プログラムは、上記第1制御部に、上記制御プログラムを実行するステップと、上記制御プログラムの実行中に上記周期実行型の機能モジュールが実行された場合に、当該機能モジュールの入力変数の値を上記非周期実行型の機能モジュールの引数に反映し、上記非周期実行型の機能モジュールの実行開始命令を上記第2制御部に出力するステップと、上記非周期実行型の機能モジュールの実行結果を上記第2制御部から受けたことに基づいて、上記周期実行型の機能モジュールの出力変数に当該実行結果を反映するステップとを実行させる。
【0023】
この開示によれば、呼出し元の周期実行型の機能モジュールの入力変数が、呼出し先の非周期実行型の機能モジュールの引数に反映される。また、呼出し先の非周期実行型の機能モジュールの戻り値が、呼出し元の周期実行型の機能モジュールの出力変数に反映される。これにより、上記制御プログラムは、周期実行型の機能モジュールから非周期実行型の機能モジュールを呼び出すことができる。
【発明の効果】
【0024】
ある局面において、周期実行型の制御プログラムから非周期実行型の機能モジュールを呼び出すことができる。
【図面の簡単な説明】
【0025】
【
図2】FA(Factory Automation)システムのシステム構成の一例を示す図である。
【
図3】開発支援装置のハードウェア構成の一例を示す模式図である。
【
図4】コントローラのハードウェア構成の一例を示す模式図である。
【
図5】外部機器のハードウェア構成の一例を示すブロック図である。
【
図6】開発支援装置の機能構成の一例を示す図である。
【
図7】プログラム解析部の機能を説明するための図である。
【
図8】モジュール登録部の機能を説明するための図である。
【
図9】非同期設定時における機能モジュールの生成過程を概略的に表わす図である。
【
図10】同期設定時における機能モジュールの生成過程を概略的に表わす図である。
【
図11】エディター部の機能を説明するための図である。
【
図12】開発支援装置が実行する処理の一部を表わすフローチャートである。
【
図13】各コアの実装形態の具体例1を示す図である。
【
図14】各コアの実装形態の具体例2を示す図である。
【
図15】各コアの実装形態の具体例3を示す図である。
【
図17】委託部による委託処理を概略的に示す概念図である。
【
図18】呼出し先の機能モジュールを非同期実行する場合における制御システムのデータフローの一例を示す図である。
【
図19】呼出し先の機能モジュールを同期実行する場合における制御システムのデータフローの一例を示す図である。
【発明を実施するための形態】
【0026】
以下、図面を参照しつつ、本発明に従う各実施の形態について説明する。以下の説明では、同一の部品および構成要素には同一の符号を付してある。それらの名称および機能も同じである。したがって、これらについての詳細な説明は繰り返さない。
【0027】
<A.適用例1>
まず、
図1を参照して、本発明の適用例について説明する。
図1は、実施の形態に従う制御システム10の装置構成を示す図である。
【0028】
制御システム10は、周期実行型のプログラムを実行するためのコアC1(第1制御部)と、非周期実行型のプログラムを実行するためのコアC2(第2制御部)と、記憶装置208とを含む。
【0029】
コアC1およびコアC2は、それぞれ異なる種類のOS(Operating System)上で動作する。典型的には、コアC1は、リアルタイムOSなどの第1の種類のOS上で動作し、当該OSの基本機能を利用する。一方で、コアC2は、Linux(登録商標)やWindows(登録商標)などの第2の種類のOS上で動作し、当該OSの基本機能を利用する。
【0030】
本明細書においては、2つ以上のコアC1,C2(第1,第2制御部)で構成されるシステムを「制御システム」と称する。すなわち、「制御システム」との概念は、少なくとも2つのコアC1,C2で構成される1つの装置や、コアC1を備える第1装置とコアC2を備える第2装置とで構成されるシステムを含む。
【0031】
記憶装置208は、不揮発性のメモリであり、コントローラ用の制御プログラムの一種であるユーザプログラム210を格納する。ユーザプログラム210は、周期実行型のプログラミング言語で記述される。周期実行型とは、制御プログラムの先頭行から最終行までが予め定められた周期ごとに繰り返し実行される実行形態をいう。すなわち、周期実行型の制御プログラムにおいては、プログラムの実行周期が保障されている。周期実行型のプログラミング言語としては、たとえば、ラダー言語やST(Structured Text)言語などが挙げられる。
【0032】
本実施の形態に従う開発支援装置100は、周期実行型のユーザプログラム210から非周期実行型のプログラミング言語で規定されている非周期実行型の機能モジュール55Aを呼び出すことができる。非周期実行型とは、プログラムの各行が逐次的に実行される実行形態をいう。非周期実行型の機能モジュールにおいては、実行を開始してから終了するまでの時間が保障されない。非周期実行型のプログラミング言語としては、たとえば、C言語、C++、Java(登録商標)、Pythonなどが挙げられる。
【0033】
ステップS1において、コアC1は、予め定められた制御周期ごとにユーザプログラム210を繰り返し実行する。ユーザプログラム210は、機能モジュール55Aを呼び出すための周期実行型の機能モジュール55Bを含む。機能モジュール55Bは、機能モジュール55Aのラッパーモジュールである。
【0034】
ステップS2において、コアC2は、ユーザプログラム210の実行中に周期実行型の機能モジュール55Bを実行した場合に、非周期実行型の機能モジュール55Aの実行開始命令をコアC2に出力する。このとき、コアC2は、機能モジュール55Bの入力変数「in1」,「in2」を機能モジュール55Aの引数「in1」,「in2」に反映する。
【0035】
ステップS3において、コアC2は、機能モジュール55Aの実行開始命令をコアC1から受け付けたことに基づいて、機能モジュール55Aの実行を開始する。このとき、コアC2は、機能モジュール55Aの各行を逐次的に実行する。
【0036】
ステップS4において、コアC2は、機能モジュール55Aの実行が完了したことに基づいて、機能モジュール55Aの実行結果をコアC1に出力する。このとき、コアC1は、機能モジュール55Aの戻り値「ret」を機能モジュール55Bの出力変数「ret」に反映する。
【0037】
「変数」とは、コントローラ用の制御プログラムにおいて扱われるデータに与えられた識別子である。典型的には、「変数」は、コントローラやコントローラの制御対象の状態を表わすデータである。異なる言い方をすれば、「変数」とは、コントローラやコントローラの制御対象の状態に連動して値が変化するデータのことをいう。「変数」との概念は、一つの値を表わすデータ、配列として表されるデータ、構造体として表されるデータ、制御プログラムに規定され得る種々のデータを含み得る。
【0038】
以上のように、制御システム10は、周期実行型のユーザプログラム210を実行するコアC1と、コアC1からの委託を受けて非周期実行型の機能モジュール55Aを実行するコアC2とを含む。実行形態の異なるプログラムを異なるコアで実行させることで、周期実行型の制御プログラムから非周期実行型の機能モジュールを呼び出すことが可能になる。
【0039】
<B.FAシステム1のシステム構成>
図2は、FAシステム1のシステム構成の一例を示す図である。
図2を参照して、FAシステム1のシステム構成について説明する。
【0040】
FAシステム1は、生産工程を自動化するためのシステムである。FAシステム1は、1つ以上の開発支援装置100と、1つ以上のコントローラ200と、1つ以上の駆動機器300と、1つ以上の外部機器400とで構成される。
【0041】
開発支援装置100、コントローラ200、および外部機器400は、ネットワークNW1に接続されている。ネットワークNW1には、EtherNET(登録商標)などが採用される。
【0042】
コントローラ200および駆動機器300は、ネットワークNW2に接続されている。ネットワークNW2には、データの到達時間が保証される、定周期通信を行うフィールドネットワークを採用することが好ましい。このような定周期通信を行うフィールドネットワークとしては、EtherCAT(登録商標)、EtherNet/IP(登録商標)、登録商標)、CompoNet(登録商標)などが知られている。
【0043】
駆動機器300は、生産工程を自動化するための種々の産業用機器を含む。一例として、駆動機器300は、ロボットコントローラ300Aや、サーボドライバ300Bや、ロボットコントローラ300Aに制御されるアームロボット301Aや、サーボドライバ300Bによって制御されるサーボモータ301Bなどを含む。また、駆動機器300は、ワークを撮影するための視覚センサや、生産工程で利用されるその他の機器などを含んでもよい。
【0044】
設計者は、開発支援プログラム50を実行することで、ユーザプログラム210の開発ツールを起動することができる。設計者は、起動された開発ツール上でユーザプログラム210を設計することができる。このとき、設計者は、
図1で説明したラッパーモジュールとしての機能モジュール55Bをユーザプログラム210に組み込むことができる。設計されたユーザプログラム210は、コンパイルされた上でコントローラ200に転送される。
【0045】
コントローラ200は、ユーザプログラム210の実行開始命令を受け付けたことに基づいてユーザプログラム210の実行を開始し、ユーザプログラム210に規定される制御命令に従って駆動機器300を制御する。ユーザプログラム210の実行中において、ラッパーモジュールである機能モジュール55Bが実行された場合、コントローラ200は、対応する機能モジュール55Aの実行開始命令を外部機器400に送信する。外部機器400は、当該実行開始命令を受信したことに基づいて、機能モジュール55Aの実行を開始する。その後、外部機器400は、機能モジュール55Aの実行結果をコントローラ200に送信する。
【0046】
なお、上述では、機能モジュール55Aの実行を外部機器400に委託する例について説明を行ったが、機能モジュール55Aの実行は、必ずしも外部機器400に委託される必要はない。機能モジュール55Aの実行を外部機器400に委託しないパターンについては後述する。
【0047】
<C.ハードウェア構成>
図3~
図5を参照して、
図2に示される開発支援装置100、コントローラ200、および外部機器400のハードウェア構成について順に説明する。
【0048】
(C1.開発支援装置100のハードウェア構成)
まず、
図3を参照して、開発支援装置100のハードウェア構成について説明する。
図3は、開発支援装置100のハードウェア構成の一例を示す模式図である。
【0049】
開発支援装置100は、一例として、汎用的なコンピュータアーキテクチャに準じて構成されるコンピュータからなる。開発支援装置100は、CPU(Central Processing Unit)やMPU(Micro-Processing Unit)などの制御装置102と、主メモリ104と、通信インターフェイス111と、I/O(Input/Output)インターフェイス114と、表示インターフェイス117と、不揮発性の記憶装置120とを含む。これらのコンポーネントは、内部バス125を介して互いに通信可能に接続されている。
【0050】
制御装置102は、記憶装置120に格納されている開発支援プログラム50を主メモリ104に展開して実行することで、ユーザプログラム210(
図2参照)の開発ツールを起動する。記憶装置120は、開発支援プログラム50の他にも、ラッパーモジュールとしての機能モジュール55B(
図1参照)を生成するための各種データ56を格納する。
【0051】
通信インターフェイス111は、他の通信機器との間でネットワークを介してデータを遣り取りする。当該他の通信機器は、たとえば、コントローラ200、外部機器400、サーバなどを含む。開発支援装置100は、通信インターフェイス111を介して、当該他の通信機器から、開発支援プログラム50などの各種プログラムをダウンロード可能なように構成されてもよい。
【0052】
I/Oインターフェイス114は、操作部115に接続され、操作部115からのユーザ操作を示す信号を取り込む。操作部115は、典型的には、キーボード、マウス、タッチパネル、タッチパッドなどからなり、ユーザからの操作を受け付ける。操作部115は、開発支援装置100と一体的に構成されてもよいし、開発支援装置100とは別に構成されてもよい。
【0053】
表示インターフェイス117は、表示部118と接続され、制御装置102などからの指令に従って、表示部118に対して、画像を表示するための画像信号を送出する。表示部118は、LCD(Liquid Crystal Display)や有機EL(Electro Luminescence)ディスプレイなどからなり、ユーザに対して各種情報を提示する。表示部118は、開発支援装置100と一体的に構成されてもよいし、開発支援装置100とは別に構成されてもよい。
【0054】
(C2.コントローラ200のハードウェア構成)
次に、
図4を参照して、コントローラ200のハードウェア構成について説明する。
図4は、コントローラ200のハードウェア構成の一例を示す模式図である。
【0055】
コントローラ200は、通信インターフェイス201と、CPUやMPUなどの制御装置202と、チップセット204と、主メモリ206と、不揮発性の記憶装置208と、内部バスコントローラ222と、フィールドバスコントローラ224と、メモリカードインターフェイス239とを含む。
【0056】
制御装置202は、記憶装置208に格納された制御プログラム211を読み出して、主メモリ206に展開して実行することで、ロボットコントローラ300Aやサーボドライバ300Bなどの駆動機器300に対する任意の制御を実現する。制御プログラム211は、コントローラ200を制御するための各種プログラムを含む。一例として、制御プログラム211は、システムプログラム209およびユーザプログラム210などを含む。システムプログラム209は、データの入出力処理や実行タイミング制御などの、コントローラ200の基本的な機能を提供するための命令コードを含む。ユーザプログラム210は、開発支援装置100からダウンロードされたものである。ユーザプログラム210は、制御対象に応じて任意に設計され、シーケンス制御を実行するためのシーケンスプログラム210Aおよびモーション制御を実行するためのモーションプログラム210Bとを含む。
【0057】
チップセット204は、各コンポーネントを制御することで、コントローラ200全体としての処理を実現する。
【0058】
記憶装置208は、制御プログラム211や、コントローラ200で用いられる各種データ212を格納する。
【0059】
内部バスコントローラ222は、コントローラ200と内部バスを通じて連結される各種デバイスとデータを遣り取りするインターフェイスである。このようなデバイスの一例として、I/Oユニット226が接続されている。
【0060】
フィールドバスコントローラ224は、コントローラ200とフィールドバスを通じて連結される各種の駆動機器300とデータを遣り取りするインターフェイスである。このようなデバイスの一例として、ロボットコントローラ300Aやサーボドライバ300Bが接続されている。他にも、視覚センサなどの駆動機器が接続されてもよい。
【0061】
内部バスコントローラ222およびフィールドバスコントローラ224は、接続されているデバイスに対して任意の指令を与えることができるとともに、デバイスが管理している任意のデータを取得することができる。また、内部バスコントローラ222および/またはフィールドバスコントローラ224は、ロボットコントローラ300Aやサーボドライバ300Bとの間でデータを遣り取りするためのインターフェイスとしても機能する。
【0062】
通信インターフェイス201は、各種の有線/無線ネットワークを通じたデータの遣り取りを制御する。コントローラ200は、通信インターフェイス201を介して、開発支援装置100や外部機器400と通信を行う。
【0063】
メモリカードインターフェイス239は、外部記憶媒体の一例であるメモリカード240(たとえば、SDカード)を着脱可能に構成されており、メモリカード240に対してデータを書き込み、メモリカード240からデータを読出すことが可能になっている。
【0064】
(C3.外部機器400のハードウェア構成)
次に、
図5を参照して、外部機器400のハードウェア構成について説明する。
図5は、外部機器400のハードウェア構成の一例を示すブロック図である。
【0065】
外部機器400は、汎用的なアーキテクチャを有するハードウェア構成を有している。すなわち、外部機器400は、一種のパーソナルコンピュータとして実装される。但し、外部機器400を汎用的なハードウェアではなく、専用ハードウェアを用いて実装してもよい。
【0066】
より具体的には、外部機器400は、CPUやMPUなどの制御装置402と、主メモリ404と、不揮発性の記憶装置410と、通信インターフェイス412と、I/Oインターフェイス414と、表示インターフェイス420とを含む。これらのコンポーネントは、内部バス425を介して、互いにデータ通信可能に接続されている。
【0067】
制御装置402は、記憶装置410に格納された制御プログラム(図示しない)を読み出して、主メモリ404に展開して実行することで、外部機器400を制御する。すなわち、制御装置402は、主メモリ404および記憶装置410と連係することで、制御演算を実行する制御部を実現する。
【0068】
通信インターフェイス412、I/Oインターフェイス414、および、フィールドバスインターフェイス416は、外部機器400と他の通信機器とのデータの遣り取りを仲介する。
【0069】
より具体的には、通信インターフェイス412は、ネットワークNW1(
図1参照)などを介した、コントローラ200との通信を仲介する。通信インターフェイス412には、たとえば、EtherNETに従う通信が可能なコンポーネントが採用され得る。
【0070】
I/Oインターフェイス414は、操作部415に接続され、操作部415からのユーザ操作を示す信号を取り込む。操作部415は、典型的には、キーボード、マウス、タッチパネル、タッチパッドなどからなり、ユーザからの操作を受け付ける。操作部415は、外部機器400と一体的に構成されてもよいし、外部機器400とは別に構成されてもよい。
【0071】
表示インターフェイス420は、表示部421と接続され、制御装置402などからの指令に従って、表示部421に対して、画像を表示するための画像信号を送出する。表示部421は、LCDや有機ELディスプレイなどからなり、ユーザに対して各種情報を提示する。表示部421は、外部機器400と一体的に構成されてもよいし、外部機器400とは別に構成されてもよい。
【0072】
<D.開発支援装置100の機能構成>
図6を参照して、開発支援装置100の機能構成について説明する。
図6は、開発支援装置100の機能構成の一例を示す図である。
【0073】
開発支援装置100は、ハードウェア構成として、制御装置102と、記憶装置120とを含む。制御装置102は、機能構成として、プログラム解析部152と、モジュール登録部154と、ラッパーモジュール生成部156と、エディター部158と、ビルド部160とを含む。記憶装置120は、上述の各種データ56(
図3参照)と、ユーザプログラム210とを格納している。各種データ56は、上述のデータ型の対応関係121と、上述の定義情報122と、ラッパーモジュール126と、モジュール対応関係127とを含む。
【0074】
以下では、プログラム解析部152、モジュール登録部154、ラッパーモジュール生成部156、エディター部158、およびビルド部160の機能について順に説明する。
【0075】
(D1.プログラム解析部152)
まず、
図7を参照して、
図6に示されるプログラム解析部152について説明する。
図7は、プログラム解析部152の機能を説明するための図である。
【0076】
プログラム解析部152は、非周期実行型のプログラム60を解析し、上述の定義情報122(
図1参照)を自動生成する。より具体的には、プログラム解析部152は、非周期実行型のプログラム60から機能モジュール55A(たとえば、関数)の宣言部分を特定する。次に、プログラム解析部152は、特定した宣言部分から、機能モジュール55Aのモジュール名と、機能モジュール55Aの引数のデータ型と、機能モジュール55Aの引数の変数名と、機能モジュール55Aの戻り値のデータ型とを抽出する。
図7の例では、モジュール名として「sample」が抽出され、引数のデータ型として「float」型および「double」型が抽出され、引数の変数名として「in1」および「in2」が抽出され、戻り値のデータ型として「bool」が抽出される。
【0077】
さらに、プログラム解析部152は、機能モジュール55Aの内部の記述を解析し、戻り値の変数名を取得する。一例として、プログラム解析部152は、予め定められたキーワード(たとえば、"return")を探索し、当該キーワードに続く記述を戻り値の変数名として取得する。
図7の例では、戻り値の変数名として「ret」が取得される。
【0078】
プログラム解析部152は、モジュール名「sample」と、引数のデータ型「float」,「double」と、引数の変数名「in1」,「in2」と、戻り値のデータ型「bool」と、戻り値の変数名「ret」とを対応付けた上でそれらを定義情報122に書き込む。定義情報122は、たとえば、開発支援装置100の記憶装置120に格納される。
【0079】
なお、
図7の例では、機能モジュール55Aの処理内容がプログラム60に規定されているが、機能モジュール55Aの宣言部のみがプログラム60に規定されていてもよい。この場合、プログラム解析部152は、機能モジュール55Aの宣言のみを規定したヘッダファイルとしてのプログラム60を読み込む。当該ヘッダファイルは、機能モジュール55Aのモジュール名と、機能モジュール55Aの引数のデータ型と、機能モジュール55Aの引数の変数名と、機能モジュール55Aの戻り値のデータ型とを含む。
【0080】
(D2.モジュール登録部154)
次に、
図8を参照して、
図6に示されるモジュール登録部154について説明する。
図8は、モジュール登録部154の機能を説明するための図である。
【0081】
以下では、非周期実行型の機能モジュール55A(
図1参照)に関する各種情報の登録する例について説明を行うが、登録対象の機能モジュールは、機能モジュール55Aに限定されない。
【0082】
モジュール登録部154は、たとえば、開発支援プログラム50によって提供される登録画面32である。登録画面32は、入力領域33A~33Eを含む。登録画面32に対する操作は、たとえば、開発支援装置100の操作部115(
図3参照)を用いて行われる。
【0083】
入力領域33Aは、機能モジュール55Aの名称の入力を受け付ける。当該名称の入力は、たとえば、文字入力により行われる。
【0084】
入力領域33Bは、機能モジュール55Aのプログラミング言語の種類の入力を受け付ける。一例として、入力領域33Bには展開ボタンB1が対応付けられている。設計者が展開ボタンB1を押下すると、予め定められた各種のプログラミング言語がリスト表示される。設計者は、リスト表示されるプログラミング言語の中から1つのプログラミング言語を選択することで、機能モジュール55Aのプログラミング言語の種類を指定することができる。
【0085】
入力領域33Cは、機能モジュール55Aの引数に関する各種情報の入力を受け付ける。一例として、入力領域33Cには、追加ボタンB3が対応付けられている。設計者が追加ボタンB3を押下する度に、引数の登録欄が入力領域33Cに追加される。設計者は、引数の登録欄において、引数のデータ型と、引数の変数名とを入力することができる。引数の登録欄の各々には、展開ボタンB4が対応付けられている。設計者が展開ボタンB4を押下すると、入力領域33Bで指定されたプログラミング言語で利用可能なデータ型がリスト表示される。設計者は、リスト表示されたデータ型の中から1つのデータ型を選択することで、引数のデータ型を指定することができる。さらに、設計者は、指定したデータ型に対応付けて引数の変数名を入力することができる。変数名の入力は、たとえば、文字入力により行われる。
【0086】
入力領域33Dは、機能モジュール55Aの戻り値に関する各種情報の入力を受け付ける。一例として、入力領域33Dには、追加ボタンB7が対応付けられている。設計者が追加ボタンB7を押下する度に、戻り値の登録欄が入力領域33Dに追加される。設計者は、戻り値の登録欄において、戻り値のデータ型と、戻り値の変数名とを入力することができる。戻り値の登録欄の各々には、展開ボタンB8が対応付けられている。設計者が展開ボタンB8を押下すると、入力領域33Bで指定されたプログラミング言語で利用可能なデータ型がリスト表示される。設計者は、リスト表示されたデータ型の中から1つのデータ型を選択することで、戻り値のデータ型を指定することができる。さらに、設計者は、指定したデータ型に対応付けて戻り値の変数名を入力することができる。変数名の入力は、たとえば、文字入力により行われる。
【0087】
入力領域33Eは、機能モジュール55Aの実行をコントローラ200の実行周期に同期させるか否かについての選択を受け付ける。一例として、入力領域33Eには、追加ボタンB10が対応付けられている。設計者が追加ボタンB10を押下すると、「YES」および「NO」の選択肢がリスト表示される。設計者が「YES」を選択した場合、機能モジュール55Aの実行は、コントローラ200の実行周期に同期されない。設計者が「NO」を選択した場合、機能モジュール55Aの実行は、コントローラ200の実行周期に同期される。機能モジュール55Aの同期実行/非同期実行の詳細については後述する。
【0088】
設計者が登録ボタンB12を押下した場合、登録画面32に入力された各種情報は、上述の定義情報122として登録される。
図8の例では、モジュール登録部154は、モジュール名「sample」と、引数のデータ型「float」,「double」と、引数の変数名「in1」,「in2」と、戻り値のデータ型「bool」と、戻り値の変数名「ret」とを対応付けた上でそれらを定義情報122として登録する。
【0089】
設計者がキャンセルボタンB13を押下した場合、登録画面32に入力された各種情報は破棄され、登録画面32が閉じられる。
【0090】
(D3.ラッパーモジュール生成部156)
次に、
図9および
図10を参照して、
図6に示されるラッパーモジュール生成部156について説明する。
図9は、非同期設定時における機能モジュール55Bの生成過程を概略的に表わす図である。
図10は、同期設定時における機能モジュール55Bの生成過程を概略的に表わす図である。
【0091】
図9および
図10に示されるように、ラッパーモジュール生成部156は、プログラミング別のデータ型の対応関係121と、ラッパー対象の機能モジュール55Aの定義情報122とに基づいて、機能モジュール55Aを呼び出すための周期実行型の機能モジュール55Bを生成する。
【0092】
より具体的には、ラッパーモジュール生成部156は、プログラミング別のデータ型の対応関係121を参照して、定義情報122に規定される引数のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定する。その後、ラッパーモジュール生成部156は、当該データ型の入力変数であり機能モジュール55Aの引数の値を反映するための入力変数を機能モジュール55Bの入力インターフェイスとして設定する。
【0093】
機能モジュール55Bに設定される入力変数の名前は、任意である。好ましくは、機能モジュール55Bの入力変数の名前は、機能モジュール55Aの引数の名前と同じになるように設定される。
図9および
図10の例では、機能モジュール55Aの引数「in1」のデータ型「float」に対して、「REAL」型の入力変数「in1」が機能モジュール55Bに設定される。また、機能モジュール55Aの引数「in2」のデータ型「double」に対して、「LREAL」型の入力変数「in2」が機能モジュール55Bに設定される。これにより、設計者は、機能モジュール55Aの引数名と、機能モジュール55Bの入力変数との対応関係を把握しやすくなる。
【0094】
また、ラッパーモジュール生成部156は、プログラミング別のデータ型の対応関係121を参照して、定義情報122に規定される戻り値のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定する。その後、ラッパーモジュール生成部156は、特定したデータ型の出力変数であって機能モジュール55Aの戻り値を反映するための出力変数を機能モジュール55Bの出力インターフェイスとして設定する。
【0095】
機能モジュール55Bに設定される出力変数の名前は、任意である。好ましくは、機能モジュール55Bの出力変数の名前は、機能モジュール55Aの戻り値の変数名と同じになるように設定される。
図9および
図10の例では、機能モジュール55Aの戻り値「ret」のデータ型「bool」に対して、データ型「BOOL」の出力変数「ret」が機能モジュール55Bに設定される。これにより、設計者は、機能モジュール55Aの戻り値と、機能モジュール55Bの出力変数との対応関係を把握しやすくなる。
【0096】
また、ラッパーモジュール生成部156は、定義情報122に規定されるモジュール名を参照して、機能モジュール55Bのモジュール名を決定する。機能モジュール55Bのモジュール名は、任意である。好ましくは、機能モジュール55Bのモジュール名は、機能モジュール55Aのモジュール名と同じになるように設定される。
図9および
図10の例では、機能モジュール55Aのモジュール名が「sample」であるので、機能モジュール55Bのモジュール名は、「sample」に設定される。これにより、設計者は、機能モジュール55Aのモジュール名と、機能モジュール55Bのモジュール名との対応関係を把握しやすくなる。
【0097】
典型的には、ラッパーモジュール生成部156は、上述の登録画面32の入力領域33Eにおいて、同期設定がなされたか否かによって機能モジュール55Bの入出力インターフェイスを変える。
【0098】
非同期設定時においては、ラッパーモジュール生成部156は、機能モジュール55Aの実行完了を待たずにコントローラ200の制御プログラムを継続して実行するように動作する機能モジュール55Bを生成する。すなわち、機能モジュール55Bがコントローラ200で実行された場合には、呼出し先の機能モジュール55Aは、コントローラ200の制御プログラムの実行と並列して実行される。
【0099】
より具体的には、
図9に示されるように、非同期設定時においては、ラッパーモジュール生成部156は、「BOOL」型の入力変数「cont」を機能モジュール55Bの入力インターフェイスにさらに設定し、「BOOL」型の出力変数「done」と「DWORD」型の出力変数「error」とを機能モジュール55Bの出力インターフェイスにさらに設定する。入力変数「cont」は、呼出し先の機能モジュール55Aの実行開始を受け付ける入力インターフェイスである。出力変数「done」は、機能モジュール55Bから呼び出された機能モジュール55Aの実行完了を反映するための出力インターフェイスである。出力変数「error」は、機能モジュール55Bから呼び出された機能モジュール55Aが正常に実行されたか否かを反映するための出力インターフェイスである。機能モジュール55Aが異常終了した場合、エラーコードが出力変数「error」に反映される。
【0100】
同期設定時においては、ラッパーモジュール生成部156は、機能モジュール55Aが呼び出されてから機能モジュール55Aの実行が完了するまでの間、コントローラ200の制御プログラムの実行を中断するように動作する機能モジュール55Bを生成する。
【0101】
より具体的には、
図10に示されるように、同期設定時においては、ラッパーモジュール生成部156は、「DWORD」型の出力変数「error」を機能モジュール55Bの出力インターフェイスにさらに設定する。出力変数「error」は、機能モジュール55Bから呼び出された機能モジュール55Aの実行結果を反映するための出力インターフェイスである。
【0102】
ラッパーモジュール生成部156によって生成された機能モジュール55Bは、ラッパーモジュール126として開発支援装置100の記憶装置120に格納される。
【0103】
また、ラッパーモジュール生成部156は、生成元の機能モジュール55Aの入出力インターフェイスと、生成された機能モジュール55Bの入出力インターフェイスとの関係を規定したモジュール対応関係127を生成する。モジュール対応関係127において、機能モジュール55Aのモジュール名と、機能モジュール55Bのモジュール名とが関連付けられる。また、モジュール対応関係127において、機能モジュール55Aの引数と、機能モジュール55Bの入力変数とが関連付けられる。また、モジュール対応関係127において、機能モジュール55Aの戻り値と、機能モジュール55Bの出力変数とが関連付けられる。生成されたモジュール対応関係127は、開発支援装置100の記憶装置120に格納される。
【0104】
なお、上述では、ラッパーモジュール生成部156は、機能モジュール55Aに対する同期設定/非同期設定に基づいて、生成する機能モジュール55Bの入出力インターフェイスを変える例について説明を行ったが、同期設定/非同期設定は必ずしも行われる必要はない。ある局面において、ラッパーモジュール生成部156は、同期設定/非同期設定に関係なく、
図9に示される機能モジュール55Bを生成する。他の局面において、ラッパーモジュール生成部156は、同期設定/非同期設定に関係なく、
図10に示される機能モジュール55Bを生成する。
【0105】
(D4.エディター部158)
次に、
図11を参照して、
図6に示されるエディター部158について説明する。
図11は、エディター部158の機能を説明するための図である。
【0106】
エディター部158は、上述のユーザプログラム210の編集操作を受け付ける。エディター部158は、たとえば、開発支援プログラム50によって提供される設計画面35である。
【0107】
設計画面35は、ユーザプログラム210の編集領域36Aと、ファンクションブロック名をリスト表示するための表示領域36Bとを含む。表示領域36Bに表示されるファンクションブロックは、ラッパーモジュール生成部156によって生成されたラッパーモジュール126を含む。一例として、ラッパーモジュール126は、上述の機能モジュール55Bを含む。たとえば、表示領域36Bに表示されている機能モジュール55Bが編集領域36Aにドラッグ&ドロップされると、機能モジュール55Bが編集領域36Aに表示される。
【0108】
このように、設計者は、ラッパーモジュール126をユーザプログラム210に任意に組み込むことができる。このとき、設計者は、ラッパーモジュール126から呼び出される機能モジュールのプログラミング言語の種別を気にする必要はない。すなわち、設計者は、非周期実行型のプログラミング言語に関する知識がなくとも、周期実行型のユーザプログラム210から非周期実行型の機能モジュールを利用することが可能になる。
【0109】
典型的には、エディター部158は、ラッパーモジュール126としての機能モジュール55Bの表示時に、呼出し先の機能モジュール55Aに関するプロパティ情報を機能モジュール55Bに対応付けて表示する。一例として、表示されるプロパティ情報は、呼出し先の機能モジュール55Aのプログラミング言語の種別などを含む。
図11の例では、「C++」が表示されている。他にも、表示されるプロパティ情報は、呼出し先の機能モジュール55Aの引数のデータ型、呼出し先の機能モジュール55Aの戻り値のデータ型、呼出し先の機能モジュール55Aのモジュール名などを含んでもよい。プロパティ情報の表示/非表示は、ユーザ操作によって適宜切り替えられる。
【0110】
また、エディター部158は、ラッパーモジュール126の表示態様を他の機能モジュールの表示態様と異ならせる。一例として、ラッパーモジュール126は、他の機能モジュールとは異なる色で表示される。あるいは、ラッパーモジュール126は、他の機能モジュールとは異なるフォントで表示されてもよい。
【0111】
なお、
図11の例では、ラッパーモジュール126がラダープログラムとしてのユーザプログラム210に組み込まれる例について説明を行ったが、ラッパーモジュール126は、ST言語としてのユーザプログラム210に組み込まれてもよい。ST言語は、文字列で記述されているため、呼出し先の機能モジュール55Aに関するプロパティ情報がプログラムの設計画面にそのまま表示されると、編集中のプログラムが見にくくなる。そのため、当該プロパティ情報は、ToolTipで表示される。より具体的には、設計者が設計画面中のラッパーモジュール126にカーソルを当てたことに基づいて、エディター部158は、呼出し先の機能モジュール55Aに関するプロパティ情報を別画面に表示する。
【0112】
ToolTipで表示されるプロパティ情報は、たとえば、呼出し先の機能モジュール55Aのプログラミング言語の種別、呼出し先の機能モジュール55Aの引数のデータ型、呼出し先の機能モジュール55Aの戻り値のデータ型、呼出し先の機能モジュール55Aのモジュール名などを含む。
【0113】
また、エディター部158は、ST言語で記述されるラッパーモジュール126の表示態様を他の機能モジュールの表示態様と異ならせる。一例として、ラッパーモジュール126は、他の機能モジュールとは異なる色で表示される。あるいは、ラッパーモジュール126は、他の機能モジュールとは異なるフォントで表示されてもよい。
【0114】
(D5.ビルド部160)
次に、
図6に示されるビルド部160について説明する。
【0115】
設計者が上述の設計画面35(
図11参照)においてビルド操作を行った場合、ビルド部160は、設計画面35で設計されたユーザプログラム210をビルドし、ユーザプログラム210の実行ファイルを生成する。その後、設計者が上述の設計画面35(
図11参照)において転送操作を行った場合、ビルド部160は、ユーザプログラム210の実行ファイルと、上述のモジュール対応関係127(
図9,
図10参照)とをコントローラ200に転送する。
【0116】
モジュール対応関係127は、ユーザプログラム210の実行ファイルに組み込まれた状態でコントローラ200に転送されてもよいし、ユーザプログラム210の実行ファイルとは別にコントローラ200に転送されてもよい。
【0117】
<E.開発支援装置100の制御構造>
図12を参照して、開発支援装置100の制御構造について説明する。
図12は、開発支援装置100が実行する処理の一部を表わすフローチャートである。
図12に示される処理は、開発支援装置100の制御装置102が上述のラッパーモジュール生成部156(
図6参照)として機能することにより実現される。他の局面において、処理の一部または全部が、回路素子またはその他のハードウェアによって実行されてもよい。
【0118】
ステップS10において、制御装置102は、非周期実行型のプログラミング言語で使用され得るデータ型と、周期実行型のプログラミング言語で使用され得るデータ型との関係を規定している対応関係121(
図1参照)を取得する。
【0119】
ステップS12において、制御装置102は、ラッパー対象の機能モジュール55Aに関する定義情報122(
図1参照)を取得する。定義情報122は、機能モジュール55Aのモジュール名、機能モジュール55Aの引数のデータ型、機能モジュール55Aの引数の変数名、機能モジュール55Aの戻り値のデータ型、機能モジュール55Aの戻り値の変数名などを含む。
【0120】
ステップS14において、制御装置102は、ステップS10で取得したデータ型の対応関係121と、ステップS12で取得した定義情報122とに基づいて、機能モジュール55Aの引数のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定する。その後、制御装置102は、当該特定したデータ型の入力変数を機能モジュール55Bの入力インターフェイスを設定する。当該入力変数は、機能モジュール55Aの引数の値を反映するための入力インターフェイスである。
【0121】
ラッパー対象の機能モジュール55Aに対して非同期設定がなされている場合には、制御装置102は、機能モジュール55Bの入力インターフェイスに「BOOL」型の入力変数「cont」をさらに設定する(
図9参照)。入力変数「cont」は、呼出し先の機能モジュール55Aの実行開始命令を受け付ける入力インターフェイスである。一方で、ラッパー対象の機能モジュール55Aに対して同期設定がなされている場合には、制御装置102は、「BOOL」型の入力変数「cont」を機能モジュール55Bの入力インターフェイスに設定しない(
図10参照)。
【0122】
ステップS16において、制御装置102は、ステップS10で取得したデータ型の対応関係121と、ステップS12で取得した定義情報122とに基づいて、機能モジュール55Aの戻り値のデータ型に対応する、周期実行型のプログラミング言語のデータ型を特定する。その後、制御装置102は、当該特定したデータ型の出力変数を機能モジュール55Bの出力インターフェイスとして設定する。当該出力変数は、機能モジュール55Aの戻り値を反映するための出力インターフェイスである。
【0123】
また、制御装置102は、「DWORD」型の出力変数「error」を機能モジュール55Bの出力インターフェイスにさらに設定する(
図9,
図10参照)。出力変数「error」は、機能モジュール55Bから呼び出された機能モジュール55Aが正常に実行されたか否かを反映するための出力インターフェイスである。機能モジュール55Aが異常終了した場合、エラーコードが出力変数「error」に反映される。
【0124】
さらに、ラッパー対象の機能モジュール55Aに対して非同期設定がなされている場合には、制御装置102は、「BOOL」型の出力変数「done」を機能モジュール55Bの出力インターフェイスにさらに設定する(
図9参照)。出力変数「done」は、機能モジュール55Bから呼び出された機能モジュール55Aの実行完了を反映するための出力インターフェイスである。一方で、ラッパー対象の機能モジュール55Aに対して同期設定がなされている場合には、制御装置102は、「BOOL」型の出力変数「done」を機能モジュール55Bの出力インターフェイスに設定しない(
図10参照)。
【0125】
ステップS18において、制御装置102は、生成した機能モジュール55Bをラッパーモジュール126として開発支援装置100の記憶装置120に格納する。
【0126】
<F.実装形態>
コントローラ200は、開発支援装置100から転送されたユーザプログラム210に従って駆動機器300を制御する。ユーザプログラム210は、コアC1(第1制御部)で実行される。ユーザプログラム210に含まれているラッパーモジュールとしての機能モジュール55Bが実行された場合、コントローラ200は、対応する機能モジュール55Aを呼び出す。非周期実行型の機能モジュール55Aは、第2コア(第2制御部)で実行される。
【0127】
コアC1およびコアC2は、それぞれ異なる種類のOS(Operating System)上で動作する。典型的には、コアC1は、リアルタイムOSなどの第1の種類のOS上で動作し、当該OSの基本機能を利用する。一方で、コアC2は、Linux(登録商標)やWindows(登録商標)などの第2の種類のOS上で動作し、当該OSの基本機能を利用する。
【0128】
本明細書においては、2つ以上のコアC1,C2(第1,第2制御部)で構成されるシステムを「制御システム」と称する。すなわち、「制御システム」との概念は、少なくとも2つのコアC1,C2で構成される1つの装置や、コアC1を備える第1装置とコアC2を備える第2装置とで構成されるシステムを含む。
【0129】
以下では、
図13~
図15を参照して、コアC1,C2の実装形態について説明する。
(F1.コアC1,C2の実装形態の具体例1)
図13は、コアC1およびコアC2の実装形態の具体例1を示す図である。
【0130】
図13に示されるように、コントローラ200は、CPUユニット250を含む。CPUユニット250は、2つ以上のコアで構成される制御装置202を含む。一例として、制御装置202は、コアC1およびコアC2を含む。本具体例においては、制御システム10は、1つの制御装置202に搭載される複数のコアC1,C2によって構成される。
【0131】
コアC1は、上述のユーザプログラム210を実行する。ユーザプログラム210は、ラダープログラムやST言語などの非周期実行型のPLC言語で規定される。コアC1は、ユーザプログラム210の実行中にラッパーモジュールとしての上述の機能モジュール55Bを実行した場合に、対応する非周期実行型の機能モジュール55Aの実行開始命令をコアC2に出力する。
【0132】
コアC2は、当該実行開始命令を受け付けたことに基づいて、機能モジュール55Aを実行する。当該機能モジュール55Aは、たとえば、C言語、C++、Java、またはPythonなどで規定される。コアC2は、機能モジュール55Aの実行が完了したことに基づいて、機能モジュール55Aの実行結果をコアC1に出力する。
【0133】
以上のように、本具体例においては、周期実行型のプログラミング言語を実行するコアC1と、非周期実行型のプログラミング言語を実行するコアC2とが1つの制御装置102に搭載される。
【0134】
(F2.コアC1,C2の実装形態の具体例2)
図14は、コアC1およびコアC2の実装形態の具体例2を示す図である。
【0135】
図14に示されるように、コントローラ200は、CPUユニット250と、拡張ユニット251とを含む。拡張ユニット251は、CPUユニット250と分離可能に構成され、コントローラ200のバスを介してCPUユニット250に接続される。
【0136】
CPUユニット250は、制御装置202を含む。CPUユニット250は、1つ以上のコアC1を含む。コアC1は、コントローラ200用の制御プログラムであるユーザプログラム210を実行する。ユーザプログラム210は、ラダープログラムやST言語などの非周期実行型のPLC言語で規定される。
【0137】
拡張ユニット251は、1つ以上のコアで構成される制御装置252を含む。一例として、制御装置252は、コアC2を含む。コアC2は、非周期実行型の機能モジュール55Aを実行する。当該機能モジュール55Aは、たとえば、C言語、C++、Java、またはPythonなどで規定される。
【0138】
本具体例においては、制御システム10は、CPUユニット250に搭載されるコアC1と、拡張ユニット251に搭載されるコアC2とで構成される。
【0139】
コアC1は、ユーザプログラム210の実行中にラッパーモジュールとしての機能モジュール55Bを実行した場合に、対応する非周期実行型の機能モジュール55Aの実行開始命令をコアC2に出力する。コアC2は、当該実行開始命令を受け付けたことに基づいて、機能モジュール55Aを実行する。コアC2は、機能モジュール55Aの実行が完了したことに基づいて、機能モジュール55Aの実行結果をコアC1に出力する。
【0140】
以上のように、本具体例においては、周期実行型のプログラミング言語を実行するコアC1は、CPUユニット250の制御装置202に搭載される。一方で、非周期実行型のプログラミング言語を実行するコアC2は、拡張ユニット251の制御装置252に搭載される。
【0141】
(F3.コアC1,C2の実装形態の具体例3)
図15は、コアC1およびコアC2の実装形態の具体例3を示す図である。
【0142】
コントローラ200は、外部機器400と通信可能に構成される。CPUユニット250は、制御装置202を含む。制御装置202は、1つ以上のコアC1を含む。コアC1は、コントローラ200用の制御プログラムであるユーザプログラム210を実行する。ユーザプログラム210は、ラダープログラムやST言語などの非周期実行型のPLC言語で規定される。
【0143】
コントローラ200は、外部機器400と通信可能に構成される。外部機器400は、1つ以上のコアで構成される制御装置402を含む。一例として、制御装置402は、コアC2を含む。コアC2は、非周期実行型の機能モジュール55Aを実行する。当該機能モジュール55Aは、たとえば、C言語、C++、Java、またはPythonなどで規定される。
【0144】
本具体例においては、制御システム10は、コントローラ200の制御装置202に搭載されるコアC1と、外部機器400の制御装置402に搭載されるコアC2とで構成される。
【0145】
コアC1は、ユーザプログラム210の実行中にラッパーモジュールとしての上述の機能モジュール55Bを実行した場合に、対応する非周期実行型の機能モジュール55Aの実行開始命令をコアC2に出力する。コアC2は、当該実行開始命令を受け付けたことに基づいて、機能モジュール55Aを実行する。コアC2は、機能モジュール55Aの実行が完了したことに基づいて、機能モジュール55Aの実行結果をコアC1に出力する。
【0146】
以上のように、本具体例においては、周期実行型のプログラミング言語を実行するコアC1は、コントローラ200の制御装置202に搭載される。一方で、非周期実行型のプログラミング言語を実行するコアC2は、外部機器400の制御装置402に搭載される。
【0147】
<G.コアC1,C2の機能構成>
図16を参照して、
図13~
図15に示されるコアC1,C2の機能構成について説明する。
図16は、コアC1,C2の機能構成の一例を示す図である。
【0148】
制御システム10は、ハードウェア構成として、コアC1と、コアC2と、記憶装置208,410とを含む。コアC1は、機能構成として、第1実行部254と、委託部256とを含む。コアC2は、機能構成として、第2実行部264を含む。
【0149】
コントローラ200の記憶装置208、または外部機器400の記憶装置410は、上述の機能モジュール55Bと、上述のモジュール対応関係127と、上述のユーザプログラム210とを格納する。モジュール対応関係127およびユーザプログラム210は、たとえば、記憶装置208に格納される。モジュール対応関係127は、記憶装置208および記憶装置410のいずれかに格納される。
【0150】
第1実行部254は、ユーザプログラム210の先頭行から最終行までが予め定められた周期ごとに繰り返し実行し、ユーザプログラム210に従って駆動機器300を制御する。第1実行部254は、ユーザプログラム210に含まれるラッパーモジュールとしての機能モジュール55Bが実行された場合、対応する機能モジュール55Aの実行を委託部256に委託する。
【0151】
委託部256は、RPC(Remote Procedure Call)機能を有する。すなわち、委託部256は、呼出し先の機能モジュール55Aの実行を他のコアC2に実行させる。
【0152】
図17を参照して、委託部256の機能について説明する。
図17は、委託部256による委託処理を概略的に示す概念図である。
【0153】
図17に示されるように、委託部256は、ラッパーモジュール126の1つである機能モジュール55Bから機能モジュール55Aの実行命令を受けたとする。このことに基づいて、委託部256は、モジュール対応関係127を参照して、機能モジュール55Bのモジュール名に対応する、呼出し先の機能モジュール55Aのモジュール名(関数名)を特定する。
図17の例では、機能モジュール55Aのモジュール名として、「sample」が特定される。
【0154】
その後、委託部256は、モジュール対応関係127を参照して、機能モジュール55Bの入力変数に対応する機能モジュール55Aの引数を特定する。
図17の例では、「REAL」型の入力変数「in1」に対して「float」型の引数「in1」が特定される。「LREAL」型の入力変数「in2」に対して「double」型の引数「in2」が特定される。
【0155】
委託部256は、特定したデータ型の関係に従って、「REAL」型の入力変数「in1」の値を「float」型に変換し、当該変換後の値を機能モジュール55Aの引数「in1」に代入する。同様に、委託部256は、特定したデータ型の関係に従って、「LREAL」型の入力変数「in2」を「double」型に変換し、当該変換後の入力変数「in2」を機能モジュール55Aの引数「in2」に代入する。このように、委託部256は、機能モジュール55Bの入力変数の値を機能モジュール55Aのデータ型に合わせて変換した上で、当該入力変数の値を当該引数に反映する。その後、委託部256は、機能モジュール55Aの実行開始命令を第2実行部264に出力する。
【0156】
再び
図16を参照して、第2実行部264は、委託部256から実行開始命令を受け付けたことに基づいて、呼出し対象の機能モジュール55Aの実行プログラムを読み出し、当該実行プログラムの各行を順次実行する。このとき、第2実行部264は、当該実行プログラムの実行が完了したことに基づいて、実行結果を委託部256に出力する。
【0157】
再び
図17を参照して、委託部256は、第2実行部264から機能モジュール55Aの実行結果を受けたことに基づいて、当該実行結果を機能モジュール55Bの出力変数に反映する。より具体的には、委託部256は、モジュール対応関係127を参照して、機能モジュール55Aの戻り値に対応する機能モジュール55Bの出力変数を特定する。
図17の例では、「bool」型の戻り値「ret」に対して「BOOL」型の出力変数「ret」が特定される。委託部256は、特定したデータ型の関係に従って、「bool」型の戻り値「ret」を「BOOL」型に変換し、当該変換後の戻り値を機能モジュール55Bの出力変数「ret」に代入する。このように、委託部256は、機能モジュール55Aの戻り値を機能モジュール55Bの出力変数のデータ型に合わせて変換した上で、当該戻り値を当該出力変数に反映する。
【0158】
<H.データフロー>
上述の
図9および
図10で説明したように、非同期設定がなされたラッパーモジュール126と、同期設定がなされたラッパーモジュール126とがある。非同期設定がなされたラッパーモジュール126が実行された場合、呼出し先の機能モジュール55Aは、ユーザプログラム210の実行周期に同期させずに実行される。同期設定がなされたラッパーモジュール126が実行された場合、呼出し先の機能モジュール55Aは、ユーザプログラム210の実行周期に同期して実行される。
【0159】
以下では、
図18および
図19を参照して、呼出し先の機能モジュール55Aを非同期実行する場合における制御システム10のデータフローと、呼出し先の機能モジュール55Aを同期実行する場合における制御システム10のデータフローとについて順に説明する。
【0160】
(H1.非同期実行)
図18は、呼出し先の機能モジュール55Aを非同期実行する場合における制御システム10のデータフローの一例を示す図である。以下では、ラッパーモジュールである機能モジュール55Bから機能モジュール55Aを呼び出す前提で説明を行う。
【0161】
第1実行部254は、コントローラ200の制御周期に従ってユーザプログラム210を繰り返し実行する。非同期実行の場合には、呼出し先の機能モジュール55Aは、ユーザプログラム210の実行と並列して実行される。
【0162】
より具体的には、ステップS50(コントローラ200の制御周期0周目)において、ラッパーモジュール126の1つである機能モジュール55Bの入力変数「cont」が「ON」であったとする。上述の
図9で説明したように、入力変数「cont」は、呼出し先の機能モジュール55Aの実行開始命令を受け付ける入力インターフェイスである。入力変数「cont」を「ON」にすることは、呼出し先の機能モジュール55Aの実行を開始することを示す。
【0163】
ステップS52において、機能モジュール55Bの入力変数「cont」が「ON」に設定されたことに基づいて、委託部256は、ユーザプログラム210を実行するスレッド(タスク)とは別に新たなスレッドを生成する。
【0164】
ステップS54において、委託部256は、機能モジュール55Bの出力変数「done」を「OFF」に設定する。上述の
図9で説明したように、出力変数「done」は、機能モジュール55Bから呼び出された機能モジュール55Aの実行完了を反映するための出力インターフェイスである。出力変数「done」が「OFF」であることは、呼出し先の機能モジュール55Aの実行が完了していないことを示す。
【0165】
ステップS56において、委託部256は、ステップS52で生成された別スレッドとして、呼出し元の機能モジュール55Bの入力変数の値を呼出し先の機能モジュール55Aの引数に反映し、当該機能モジュール55Aの実行開始命令を第2実行部264に出力する。入力変数を引数に反映する方法については
図17で説明した通りであるので、その説明については繰り返さない。
【0166】
ステップS60(コントローラ200の制御周期1周目)において、機能モジュール55Bの入力変数「cont」が、引き続き「ON」であったとする。このとき、呼出し先の機能モジュール55Aが未だに実行中であるので、委託部256は、機能モジュール55Bの入力変数「cont」が「ON」に設定されていたとしても第2実行部264に対して特に何もしない。
【0167】
ステップS62において、委託部256は、機能モジュール55Bの出力変数「done」を「OFF」に設定する。上述のように、出力変数「done」が「OFF」であることは、呼出し先の機能モジュール55Aの実行が完了していないことを示す。
【0168】
ステップS64において、呼出し先の機能モジュール55Aの実行が完了したとする。このことに基づいて、第2実行部264は、機能モジュール55Aの実行結果を委託部256に出力する。
【0169】
ステップS66において、委託部256は、ステップS52で生成された別スレッドとして、機能モジュール55Bの出力変数「done」を「ON」に設定する。出力変数「done」が「ON」であることは、呼出し先の機能モジュール55Aの実行が完了したことを示す。
【0170】
ステップS70(コントローラ200の制御周期2周目)において、機能モジュール55Bの入力変数「cont」が、引き続き「ON」であったとする。このとき、呼出し先の機能モジュール55Aが完了した直後であるので、委託部256は、機能モジュール55Bの入力変数「cont」が「ON」に設定されていたとしても第2実行部264に対しては特に何もしない。
【0171】
ステップS72において、委託部256は、機能モジュール55Aの実行結果(戻り値)を機能モジュール55Bの出力変数「ret」に反映する。戻り値を出力変数に反映する方法については
図17で説明した通りであるので、その説明については繰り返さない。
【0172】
以上のように、委託部256は、非同期実行時においては、機能モジュール55Aの実行開始命令を第2実行部264に出力してから機能モジュール55Aの実行結果を受けるまでの間、ユーザプログラム210を継続して実行する。すなわち、呼出し先の機能モジュール55Aの実行は、ユーザプログラム210の実行と並列に行われる。これにより、委託部256は、ユーザプログラム210の実行周期に同期させずに、非周期実行型の機能モジュール55Aを実行することができる。
【0173】
(H2.同期実行)
図19は、呼出し先の機能モジュール55Aを同期実行する場合における制御システム10のデータフローの一例を示す図である。以下では、ラッパーモジュールである機能モジュール55Bから機能モジュール55Aを呼び出す前提で説明を行う。
【0174】
第1実行部254は、コントローラ200の制御周期に従ってユーザプログラム210を繰り返し実行する。同期実行の場合には、呼出し先の機能モジュール55Aが完了するまで、ユーザプログラム210の実行は中断される。
【0175】
より具体的には、ステップS80(コントローラ200の制御周期0周目)において、第1実行部254は、呼出し元の機能モジュール55Bから呼出し先の機能モジュール55Aを呼び出したとする。
【0176】
ステップS82において、委託部256は、第1実行部254から機能モジュール55Aの実行命令を受けたことに基づいて、呼出し元の機能モジュール55Bの入力変数の値を呼出し先の機能モジュール55Aの引数に反映し、機能モジュール55Aの実行開始命令を第2実行部264に出力する。入力変数を引数に反映する方法については
図17で説明した通りであるので、その説明については繰り返さない。
【0177】
ステップS84において、呼出し先の機能モジュール55Aの実行が完了したとする。このことに基づいて、第2実行部264は、機能モジュール55Aの実行結果を委託部256に出力する。
【0178】
ステップS86において、委託部256は、機能モジュール55Aの実行結果(戻り値)を機能モジュール55Bの出力変数「ret」に反映する。戻り値を出力変数に反映する方法については
図17で説明した通りであるので、その説明については繰り返さない。
【0179】
ステップS90(コントローラ200の制御周期1周目)において、第1実行部254は、呼出し元の機能モジュール55Bから呼出し先の機能モジュール55Aを再び呼び出したとする。
【0180】
ステップS92において、委託部256は、第1実行部254から機能モジュール55Aの呼出し命令を受け付けたことに基づいて、呼出し元の機能モジュール55Bの入力変数の値を呼出し先の機能モジュール55Aの引数に反映し、機能モジュール55Aの実行開始命令を第2実行部264に出力する。
【0181】
ステップS94において、呼出し先の機能モジュール55Aの実行が完了したとする。このことに基づいて、第2実行部264は、機能モジュール55Aの実行結果を委託部256に出力する。
【0182】
ステップS96において、委託部256は、機能モジュール55Aの実行結果(戻り値)を機能モジュール55Bの出力変数「ret」に反映する。
【0183】
以上のように、委託部256は、同期実行時においては、ステップS92で機能モジュール55Aの実行開始命令を第2実行部264に出力してからステップS94で機能モジュール55Aの実行結果を受けるまでの間、ユーザプログラム210の実行を中断する。すなわち、委託部256は、ユーザプログラム210の実行と機能モジュール55Aの実行とを直列的に実行する。これにより、委託部256は、ユーザプログラム210の実行周期に同期させて、非周期実行型の機能モジュール55Aを実行することができる。
【0184】
<I.付記>
以上のように、本実施形態は以下のような開示を含む。
【0185】
[構成1]
コントローラ用の制御プログラム(210、211)を格納するための記憶装置(208)を備え、前記制御プログラム(210、211)は、非周期実行型の機能モジュール(55A)を呼び出すための周期実行型の機能モジュール(55B)を含み、
前記制御プログラム(210、211)を実行するための第1制御部(C1)と、
前記非周期実行型の機能モジュール(55A)を実行するための第2制御部(C2)とを備え、
前記第1制御部(C1)は、前記制御プログラム(210、211)の実行中に前記周期実行型の機能モジュール(55B)を実行した場合に、当該周期実行型の機能モジュール(55B)の入力変数の値を前記非周期実行型の機能モジュール(55A)の引数に反映し、前記非周期実行型の機能モジュール(55A)の実行開始命令を前記第2制御部(C2)に出力し、
前記第2制御部(C2)は、前記実行開始命令を受け付けたことに基づいて、前記非周期実行型の機能モジュール(55A)の実行を開始し、当該非周期実行型の機能モジュール(55A)の実行が完了したことに基づいて、当該非周期実行型の機能モジュール(55A)の戻り値を前記第1制御部(C1)に出力し、
前記第1制御部(C1)は、前記第2制御部(C2)から前記戻り値を受けたことに基づいて、前記周期実行型の機能モジュール(55B)の出力変数に前記戻り値を反映する、制御システム。
【0186】
[構成2]
前記第1制御部(C1)は、前記実行開始命令を前記第2制御部(C2)に出力してから前記戻り値を受けるまでの間、前記制御プログラム(210、211)の実行を中断する、構成1に記載の制御システム。
【0187】
[構成3]
前記第1制御部(C1)は、前記実行開始命令を前記第2制御部(C2)に出力してから前記戻り値を受けるまでの間、前記制御プログラム(210、211)を継続して実行する、構成1に記載の制御システム。
【0188】
[構成4]
前記周期実行型の機能モジュール(55B)の出力は、前記非周期実行型の機能モジュール(55A)の実行完了を反映するための出力変数を含む、構成3に記載の制御システム。
【0189】
[構成5]
前記第1制御部(C1)は、前記入力変数の値を前記引数のデータ型に合わせて変換した上で、当該入力変数の値を当該引数に反映する、構成1~4のいずれか1項に記載の制御システム。
【0190】
[構成6]
前記第1制御部(C1)は、前記戻り値を前記出力変数のデータ型に合わせて変換した上で、当該戻り値を当該出力変数に反映する、構成1~5のいずれか1項に記載の制御システム。
【0191】
[構成7]
第1制御部(C1)と、第2制御部(C2)とを備える制御システムの制御方法であって、
前記制御方法は、
コントローラ用の制御プログラム(210、211)を取得するステップを備え、前記制御プログラム(210、211)は、非周期実行型の機能モジュール(55A)を呼び出すための周期実行型の機能モジュール(55B)を含み、
前記制御方法は、さらに、
前記第1制御部(C1)が、前記制御プログラム(210、211)を実行するステップ(S1)と、
前記第1制御部(C1)が、前記制御プログラム(210、211)の実行中に前記周期実行型の機能モジュール(55B)を実行した場合に、当該周期実行型の機能モジュール(55B)の入力変数の値を前記非周期実行型の機能モジュール(55A)の引数に反映し、前記非周期実行型の機能モジュール(55A)の実行開始命令を前記第2制御部(C2)に出力するステップ(S2)と、
前記第2制御部(C2)が、前記実行開始命令を受け付けたことに基づいて、前記非周期実行型の機能モジュール(55A)の実行を開始し、当該非周期実行型の機能モジュール(55A)の実行が完了したことに基づいて、当該非周期実行型の機能モジュール(55A)の戻り値を前記第1制御部(C1)に出力するステップ(S4)と、
前記第1制御部(C1)が、前記第2制御部(C2)から前記戻り値を受けたことに基づいて、前記周期実行型の機能モジュール(55B)の出力変数に前記戻り値を反映するステップ(S4)とを備える、制御方法。
【0192】
[構成8]
コントローラによって実行される周期実行型の制御プログラム(210、211)であって、
前記制御プログラム(210、211)は、非周期実行型の機能モジュール(55A)を呼び出すための周期実行型の機能モジュール(55B)を含み、
前記コントローラは、第1制御部(C1)を備え、
前記コントローラと通信可能に構成される外部機器、または前記コントローラは、第2制御部(C2)を備え、
前記制御プログラム(210、211)は、前記第1制御部(C1)に、
前記制御プログラム(210、211)を実行するステップ(S1)と、
前記制御プログラム(210、211)の実行中に前記周期実行型の機能モジュール(55B)が実行された場合に、当該機能モジュールの入力変数の値を前記非周期実行型の機能モジュール(55A)の引数に反映し、前記非周期実行型の機能モジュール(55A)の実行開始命令を前記第2制御部(C2)に出力するステップ(S2)と、
前記非周期実行型の機能モジュール(55A)の実行結果を前記第2制御部(C2)から受けたことに基づいて、前記周期実行型の機能モジュール(55B)の出力変数に当該実行結果を反映するステップ(S4)とを実行させる、制御プログラム。
【0193】
今回開示された実施の形態は全ての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内での全ての変更が含まれることが意図される。
【符号の説明】
【0194】
10 制御システム、32 登録画面、33A,33B,33C,33D,33E 入力領域、35 設計画面、36A 編集領域、36B 表示領域、50 開発支援プログラム、55A,55B 機能モジュール、55B1,55B2 入力変数、55B3 出力変数、56,212 各種データ、60 プログラム、100 開発支援装置、102,202,252,402 制御装置、104,206,404 主メモリ、111,201,412 通信インターフェイス、114,414 I/Oインターフェイス、115,415 操作部、117,420 表示インターフェイス、118,421 表示部、120,208,410 記憶装置、121 対応関係、122 定義情報、125,425 内部バス、126 ラッパーモジュール、127 モジュール対応関係、152 プログラム解析部、154 モジュール登録部、156 ラッパーモジュール生成部、158 エディター部、160 ビルド部、200 コントローラ、204 チップセット、209 システムプログラム、210 ユーザプログラム、210A シーケンスプログラム、210B モーションプログラム、211 制御プログラム、222 内部バスコントローラ、224 フィールドバスコントローラ、226 I/Oユニット、239 メモリカードインターフェイス、240 メモリカード、250 ユニット、251 拡張ユニット、254 第1実行部、256 委託部、264 第2実行部、300 駆動機器、300A ロボットコントローラ、300B サーボドライバ、301A アームロボット、301B サーボモータ、400 外部機器、416 フィールドバスインターフェイス。