(57)【要約】【課題】複数種類のプログラムを容易に連携して実行させることができる環境を提供する。【解決手段】制御装置は、シーケンスプログラムを第１の制御周期毎に実行して第１の指令値を算出する第１のプログラム実行部と、逐次解釈されるコードで記述されたアプリケーションプログラムを実行して第１の制御周期毎に第２の指令値を算出する第２のプログラム実行部と、第１のプログラム実行部および第２のプログラム実行部のいずれもからアクセス可能に構成された共有メモリとを含む。第２のプログラム実行部は、アプリケーションプログラムに記述されるコードに従って、共有メモリに保持される第１の共有変数値を参照しつつアプリケーションプログラムを実行する。【選択図】図１
2019053459.tif 000002
【特許請求の範囲】
【請求項１】
シーケンスプログラムを第１の制御周期毎に実行して第１の指令値を算出する第１のプログラム実行部と、
逐次解釈されるコードで記述されたアプリケーションプログラムを実行して前記第１の制御周期毎に第２の指令値を算出する第２のプログラム実行部と、
前記第１のプログラム実行部および前記第２のプログラム実行部のいずれもからアクセス可能に構成された共有メモリとを備え、
前記第１のプログラム実行部は、前記シーケンスプログラムに含まれる命令に従って、プログラム実行過程において用いられる第１の共有変数値を前記共有メモリに書込み、
前記第２のプログラム実行部は、前記アプリケーションプログラムに記述されるコードに従って、前記共有メモリに保持される前記第１の共有変数値を参照しつつ前記アプリケーションプログラムを実行する、制御装置。
【請求項２】
前記第２のプログラム実行部は、
前記第１の制御周期の整数倍である第２の制御周期毎に前記アプリケーションプログラムを逐次解釈して中間コードを生成するインタプリタと、
前記インタプリタにより生成される中間コードに従って前記第１の制御周期毎に前記第２の指令値を算出する指令値演算部とを含み、
前記インタプリタの処理完了に対応して、前記第２の制御周期毎に、前記第１のプログラム実行部および前記第２のプログラム実行部と前記共有メモリとの間でデータ同期処理が実行される、請求項１に記載の制御装置。
【請求項３】
前記データ同期処理は、前記インタプリタの処理完了後、次に到来する第１の制御周期内で実行される、請求項２に記載の制御装置。
【請求項４】
前記第１のプログラム実行部は、前記共有メモリに保持される値を参照しつつ前記シーケンスプログラムを実行する、請求項３に記載の制御装置。
【請求項５】
前記インタプリタは、前記アプリケーションプログラムに記述されるコードに従って、プログラム実行過程において参照される第２の共有変数値を前記共有メモリに書込み、
前記アプリケーションプログラムに記述されるコードは、前記第２の共有変数値を更新した後に、前記第１のプログラム実行部により前記第２の共有変数値の更新を待つための特殊コードを含む、請求項３または４に記載の制御装置。
【請求項６】
前記特殊コードは、前記アプリケーションプログラムを記述するための言語形式に沿って予め定義される、請求項５に記載の制御装置。
【請求項７】
前記インタプリタは、前記第１のプログラム実行部および前記指令値演算部のいずれもが処理を実行していない期間に処理を実行する、請求項２〜６のいずれか１項に記載の制御装置。
【請求項８】
前記アプリケーションプログラムは、予め定められた言語に従って記述された数値制御プログラムである、請求項１〜７のいずれか１項に記載の制御装置。
【請求項９】
制御装置による制御方法であって、
シーケンスプログラムを第１の制御周期毎に実行して第１の指令値を算出するステップと、
逐次解釈されるコードで記述されたアプリケーションプログラムを実行して前記第１の制御周期毎に第２の指令値を算出するステップとを備え、
前記制御装置は、前記シーケンスプログラムの実行主体および前記アプリケーションプログラムの実行主体のいずれもからアクセス可能に構成された共有メモリを備え、
前記第１の指令値を算出するステップは、前記シーケンスプログラムに含まれる命令に従って、プログラム実行過程において用いられる第１の共有変数値を前記共有メモリに書込むステップを含み、
前記第２の指令値を算出するステップは、前記アプリケーションプログラムに記述されるコードに従って、前記共有メモリに保持される前記第１の共有変数値を参照しつつ前記アプリケーションプログラムを実行するステップを含む、制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、制御対象を制御するための制御装置および制御方法に関する。
【背景技術】
【０００２】
様々な生産現場において、ＰＬＣ（プログラマブルコントローラ）などの制御装置を用いたＦＡ（Factory Automation）技術が広く普及している。このような制御装置は、直接的に制御対象を制御するだけではなく、他の装置に制御指令を与えることで、間接的に制御対象を制御する場合もある。例えば、特開２０１３−１３４７８６号公報（特許文献１）は、工作機械および工作機械に接続されたプログラマブル論理制御装置からなるシステムを開示する。
【０００３】
一方、近年のＩＣＴ（Information and Communication Technology）の進歩に伴って、制御装置の処理能力も飛躍的に向上しつつある。従来技術においては複数の専用装置を用いて実現されていた制御システムをより少ない数の制御装置に統合したいというニーズも生じている。例えば、特開２０１２−１９４６６２号公報（特許文献２）は、ＰＬＣのＣＰＵユニットにおいて、モーション演算プログラムおよびユーザプログラムが同期して実行される構成を開示する。特開２０１２−１９４６６２号公報（特許文献２）に開示される構成によれば、シーケンスプログラムなどのユーザプログラムとモーション演算プログラムとを連携／互いに動機して実行させることができる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１３−１３４７８６号公報
【特許文献２】特開２０１２−１９４６６２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
実行形態の異なる複数種類のプログラムに従う制御演算を単一の制御装置で実現したいというニーズが高まると想定されている。複数種類のプログラムを単一の制御装置で実行するにあたって、プログラム間を互いに連携しつつ実行させることが要求される場合もある。本発明は、このようなニーズに向けられるものであり、複数種類のプログラムを容易に連携して実行させることができる環境を提供することを一つの目的としている。
【課題を解決するための手段】
【０００６】
本開示の一例に係る制御装置は、シーケンスプログラムを第１の制御周期毎に実行して第１の指令値を算出する第１のプログラム実行部と、逐次解釈されるコードで記述されたアプリケーションプログラムを実行して第１の制御周期毎に第２の指令値を算出する第２のプログラム実行部と、第１のプログラム実行部および第２のプログラム実行部のいずれもからアクセス可能に構成された共有メモリとを含む。第１のプログラム実行部は、シーケンスプログラムに含まれる命令に従って、プログラム実行過程において用いられる第１の共有変数値を共有メモリに書込む。第２のプログラム実行部は、アプリケーションプログラムに記述されるコードに従って、共有メモリに保持される第１の共有変数値を参照しつつアプリケーションプログラムを実行する。
【０００７】
この開示によれば、共有メモリに保持される第１の共有変数値に対する書込みおよび参照を利用して、シーケンスプログラムおよびアプリケーションプログラムを容易に連携して実行させることができる。
【０００８】
上述の開示において、第２のプログラム実行部は、第１の制御周期の整数倍である第２の制御周期毎にアプリケーションプログラムを逐次解釈して中間コードを生成するインタプリタと、インタプリタにより生成される中間コードに従って第１の制御周期毎に第２の指令値を算出する指令値演算部とを含んでいてもよい。インタプリタの処理完了に対応して、第２の制御周期毎に、第１のプログラム実行部および第２のプログラム実行部と共有メモリとの間でデータ同期処理が実行されてもよい。
【０００９】
この開示によれば、制御周期が異なる複数の処理が並列的に実行される第１のプログラム実行部および第２のプログラム実行部の間で、処理途中に共有変数値が変化するような事態を避けることができる。
【００１０】
上述の開示において、データ同期処理は、インタプリタの処理完了後、次に到来する第１の制御周期内で実行されてもよい。
【００１１】
この開示によれば、データ同期が可能になると、可能な限り早期にデータ同期処理を実行することができ、第１のプログラム実行部と第２のプログラム実行部との間の共有変数をより迅速に更新できる。
【００１２】
上述の開示において、第１のプログラム実行部は、共有メモリに保持される値を参照しつつシーケンスプログラムを実行してもよい。
【００１３】
この開示によれば、第１のプログラム実行部がシーケンスプログラムを実行するにあたって、インタプリタなどの第２のプログラム実行部における処理の状態を参照しつつ、適切なタイミングおよび内容の処理を提供できる。
【００１４】
上述の開示において、インタプリタは、アプリケーションプログラムに記述されるコードに従って、プログラム実行過程において参照される第２の共有変数値を前記共有メモリに書込み、アプリケーションプログラムに記述されるコードは、第２の共有変数値を更新した後に、第１のプログラム実行部により第２の共有変数値の更新を待つための特殊コードを含んでもよい。
【００１５】
この開示によれば、アプリケーションプログラムに特殊コードを用いることで、処理タイミングを同期させるための命令を作成する必要がなく、プログラム開発工数を低減できる。
【００１６】
上述の開示において、特殊コードは、アプリケーションプログラムを記述するための言語形式に沿って予め定義されてもよい。
【００１７】
この開示によれば、アプリケーションプログラムを記述するための言語形式に沿った特殊コードを採用することで、アプリケーションプログラムの開発者が違和感なく特殊コードを利用できる。
【００１８】
上述の開示において、インタプリタは、第１のプログラム実行部および指令値演算部のいずれもが処理を実行していない期間に処理を実行してもよい。
【００１９】
この開示によれば、演算リソースが限られたプログラム実行環境であっても、シーケンスプログラムおよびアプリケーションプログラムの連携実行を実現できる。
【００２０】
上述の開示において、アプリケーションプログラムは、予め定められた言語に従って記述された数値制御プログラムであってもよい。
【００２１】
この開示によれば、数値制御に従って制御される工作機械などの制御をより高精度に実現できる。
【００２２】
本開示の一例によれば、制御装置による制御方法が提供される。制御方法は、シーケンスプログラムを第１の制御周期毎に実行して第１の指令値を算出するステップと、逐次解釈されるコードで記述されたアプリケーションプログラムを実行して第１の制御周期毎に第２の指令値を算出するステップとを含む。制御装置は、シーケンスプログラムの実行主体およびアプリケーションプログラムの実行主体のいずれもからアクセス可能に構成された共有メモリを含む。第１の指令値を算出するステップは、シーケンスプログラムに含まれる命令に従って、プログラム実行過程において用いられる第１の共有変数値を共有メモリに書込むステップを含む。第２の指令値を算出するステップは、アプリケーションプログラムに記述されるコードに従って、共有メモリに保持される第１の共有変数値を参照しつつアプリケーションプログラムを実行するステップを含む。
【００２３】
この開示によれば、共有メモリに保持される第１の共有変数値に対する書込みおよび参照を利用して、シーケンスプログラムおよびアプリケーションプログラムを容易に連携して実行させることができる。
【発明の効果】
【００２４】
本開示の一例によれば、複数種類のプログラムを容易に連携して実行させることができる環境を提供できる。
【図面の簡単な説明】
【００２５】
【図１】本実施の形態に係る制御装置の適用場面の一例を示す模式図である。
【図２】本実施の形態に係る制御システムの全体構成例を示す模式図である。
【図３】本実施の形態に係る制御装置のハードウェア構成例を示すブロック図である。
【図４】本実施の形態に係る制御装置のプログラム実行機構の構成例を示す模式図である。
【図５】本実施の形態に係る制御装置における中間コードの生成例を説明するための模式図である。
【図６】本実施の形態に係る制御装置におけるプログラム実行およびデータ同期の周期を示すタイムチャートである。
【図７】本実施の形態に係る制御装置においてシーケンスプログラムおよびＮＣプログラムを連携して実行させる場合のプログラムの一例を説明するための模式図である。
【図８】図７に示すシーケンスプログラムおよびＮＣプログラムを連携して実行させる場合の処理を示すタイムチャートである。
【図９】本実施の形態に係る制御装置においてシーケンスプログラムおよびＮＣプログラムの連携実行に係る処理手順を示すフローチャートである。
【発明を実施するための形態】
【００２６】
本発明の実施の形態について、図面を参照しながら詳細に説明する。なお、図中の同一または相当部分については、同一符号を付してその説明は繰返さない。
【００２７】
＜Ａ．適用例＞
まず、図１を参照して、本発明が適用される場面の一例について説明する。図１は、本実施の形態に係る制御装置１００の適用場面の一例を示す模式図である。本実施の形態に係る制御装置１００は、任意の制御対象（例えば、製造装置や設備）を制御する。
【００２８】
図１に示すように、制御装置１００は、シーケンスプログラム３０を第１の制御周期毎に実行して第１の指令値１４を算出する第１のプログラム実行部１０と、逐次解釈されるコードで記述されたアプリケーションプログラム３２に従って第１の制御周期毎に第２の指令値１６を算出する第２のプログラム実行部１２とを含む。
【００２９】
制御装置１００は、さらに、第１のプログラム実行部１０（すなわち、シーケンスプログラム３０の実行主体）および第２のプログラム実行部１２（すなわち、アプリケーションプログラム３２の実行主体）のいずれからもアクセス可能に構成された共有メモリ２０を含む。第１のプログラム実行部１０は、シーケンスプログラム３０に含まれる命令に従って、プログラム実行過程において用いられる第１の共有変数値１８を共有メモリ２０に書込む。
【００３０】
第１の指令値１４および第２の指令値１６は、図示しない入出力リフレッシュ処理部によって、制御対象の設備や装置などへ出力される。共有メモリ２０に書込まれた第１の共有変数値１８は、第２のプログラム実行部１２により参照することもできる。すなわち、第２のプログラム実行部１２は、アプリケーションプログラム３２に記述されるコードに従って、共有メモリ２０に保持される第１の共有変数値１８を参照しつつアプリケーションプログラム３２を実行することもできる。
【００３１】
本明細書において、「シーケンスプログラム」は、実行毎に全体がスキャンされて、実行毎に１または複数の指令値が算出されるプログラムを包含する概念である。「シーケンスプログラム」は、国際電気標準会議（International Electrotechnical Commission：ＩＥＣ）によって規定された国際規格ＩＥＣ６１１３１−３に従って記述された１または複数の命令からなるプログラムを包含する。「シーケンスプログラム」には、シーケンス命令および／またはモーション命令を含み得る。なお、「シーケンスプログラム」としては、国際規格ＩＥＣ６１１３１−３に従って記述された命令に限らず、ＰＬＣ（プログラマブルコントローラ）の製造メーカまたはベンダーなどが独自に規定した命令を含むようにしてもよい。このように、「シーケンスプログラム」は、即時性および高速性が要求される制御に好適である。
【００３２】
本明細書において、「シーケンス命令」は、基本的には、入力値、出力値、内部値などを算出する１または複数の論理回路により記述される１または複数の命令を包含する用語である。基本的には、１回の制御周期において、「シーケンス命令」は、先頭から最終まで実行され、次の制御周期において、「シーケンス命令」は、先頭から最終までが再度実行される。本明細書において、「モーション命令」は、サーボモータなどのアクチュエータに対して、位置、速度、加速度、加加速度、角度、角速度、角加速度、角加加速度などの数値を指令として算出するための１または複数の命令を包含する用語である。「モーション命令」についても、１回の制御周期において、ファンクションブロックや数値算出式などにより記述されるモーション命令のプログラム（モーションプログラム）の先頭から最終までが実行される。すなわち、第１の制御周期毎に指令値は算出（更新）されることになる。
【００３３】
第１のプログラム実行部１０により算出される第１の指令値１４は、典型的には、シーケンス命令に従って決定されるデジタル出力のオン／オフ、および、モーション命令に従って算出されるアナログ出力を含む。
【００３４】
本明細書において、「アプリケーションプログラム」は、逐次解釈される任意のプログラムを包含する。すなわち、「アプリケーションプログラム」は、１行ずつ逐次解釈して実行するインタプリタ方式で実行可能な任意の言語で記述されたプログラムを包含する。以下の説明においては、このような「アプリケーションプログラム」の一例として、ＣＮＣ（Computer Numerical Control：コンピュータ数値制御）における挙動を記述するプログラム（以下、「ＮＣプログラム」とも称する。）を想定する。ＮＣプログラムは、予め定められた言語に従って記述される。
【００３５】
但し、このようなＮＣプログラムに限定されることなく、例えば、ロボットを制御するためのプログラムなどにも適用可能である。一例として、ＮＣプログラムは「Ｇ言語」を用いて記述され、ロボットを制御するためのプログラムは、専用のロボット言語を用いて記述されることが多い。
【００３６】
後述するように、本実施の形態に係るアプリケーションプログラムは、「中間コード」に変換された上で、「中間コード」に基づいて、第１の制御周期毎に第２の指令値１６が算出される。本明細書において、「中間コード」は、逐次解釈されるプログラム（本来的に、一定周期毎に指令値が更新されるという処理には不向きである）に従って、第１の制御周期毎に指令値を算出するための任意の命令を包含する概念である。すなわち、中間コードは、第２のプログラム実行部１２が第１の制御周期毎に指令値を算出できるものであれば、どのようなコードであってもよい。典型的には、「中間コード」は、１または複数の命令、あるいは、１または複数の関数を含む。
【００３７】
本実施の形態に係る制御装置１００においては、第１の制御周期毎に全体がスキャンされるシーケンスプログラム３０と、逐次解釈されるアプリケーションプログラム３２とを実行させて、それぞれのプログラムに従う指令値を第１の制御周期毎に算出する。このとき、シーケンスプログラム３０に従って、第１の共有変数値１８が算出または更新される。一方、第２のプログラム実行部１２は、第１の共有変数値１８を参照して、アプリケーションプログラム３２の実行を制御することができる。例えば、第１の共有変数値１８が予め定められた値に変更されるまで、次の行の解釈を中断するといった処理を実現できる。
【００３８】
このように、本実施の形態においては、シーケンスプログラム３０を介して第１の共有変数値１８の値を適宜更新することで、アプリケーションプログラム３２の実行開始、実行中断、実行待機、実行終了などを間接的に制御できる。そのため、シーケンスプログラム３０およびアプリケーションプログラム３２を組み合わせたシステムにおいて、それぞれのプログラムに従う同期処理などを容易に実現できる。
【００３９】
また、アプリケーションプログラム３２から共有メモリ２０に保持される共有変数値の更新も可能であり、この場合には、アプリケーションプログラム３２が主導して、シーケンスプログラム３０の実行開始、実行中断、実行待機、実行終了などを制御できる。
【００４０】
本実施の形態に係る制御装置１００においては、シーケンスプログラム３０およびアプリケーションプログラム３２の両方を実行させるにあたって、共有メモリ２０上の任意の共有変数値に対してそれぞれのプログラムからのアクセスが可能であり、このような共有メモリ２０に保持される共有変数値を適宜利用することで、複数種類のプログラムを組み合わせた任意のシステムを実現できる。
【００４１】
以下、本発明のより具体的な応用例として、本実施の形態に係る制御装置１００のより詳細な構成および処理について説明する。
【００４２】
＜Ｂ．制御システムの全体構成例＞
次に、本実施の形態に係る制御装置を含む制御システム１の全体構成例について説明する。図２は、本実施の形態に係る制御システム１の全体構成例を示す模式図である。図２には、本実施の形態に係る制御装置１００を中心とした制御システム１を示す。
【００４３】
制御装置１００は、各種の設備や装置などの制御対象を制御する産業用コントローラに相当する。制御装置１００は、後述するような制御演算を実行する一種のコンピュータであり、典型的には、ＰＬＣ（プログラマブルコントローラ）として具現化されてもよい。
【００４４】
図２に示す構成において、制御装置１００は、シーケンスプログラム３０およびアプリケーションプログラム３２の一例であるＮＣプログラム３４を実行する。
【００４５】
制御装置１００は、フィールドネットワーク２を介して各種のフィールドデバイス５００と接続されてもよい。制御装置１００は、フィールドネットワーク２などを介して、１または複数のフィールドデバイス５００との間でデータを遣り取りする。一般的に「フィールドネットワーク」は、「フィールドバス」とも称されるが、説明の簡素化のため、以下の説明においては、「フィールドネットワーク」と総称する。すなわち、本明細書の「フィールドネットワーク」は、狭義の「フィールドネットワーク」に加えて「フィールドバス」を含み得る概念である。
【００４６】
制御装置１００において実行される制御演算は、フィールドデバイス５００において収集または生成されたデータ（入力データ）を収集する処理（入力処理）、フィールドデバイス５００に対する指令値などのデータ（出力データ）を生成する処理（演算処理）、生成した出力データを対象のフィールドデバイス５００へ送信する処理（出力処理）などを含む。
【００４７】
フィールドネットワーク２は、定周期通信を行うバスまたはネットワークを採用することが好ましい。このような定周期通信を行うバスまたはネットワークとしては、ＥｔｈｅｒＣＡＴ（登録商標）、ＥｔｈｅｒＮｅｔ／ＩＰ（登録商標）、ＤｅｖｉｃｅＮｅｔ（登録商標）、ＣｏｍｐｏＮｅｔ（登録商標）などが知られている。データの到達時間が保証される点において、ＥｔｈｅｒＣＡＴ（登録商標）が好ましい。
【００４８】
フィールドネットワーク２には、任意のフィールドデバイス５００を接続することができる。フィールドデバイス５００は、フィールド側にある製造装置や生産ラインなどに対して何らかの物理的な作用を与えるアクチュエータ、および、フィールドとの間で情報を遣り取りする入出力装置などを含む。
【００４９】
フィールドネットワーク２を介して、制御装置１００とフィールドデバイス５００との間でデータが遣り取りされることになるが、これらの遣り取りされるデータは、数１００μｓｅｃオーダ〜数１０ｍｓｅｃオーダのごく短い周期で更新されることになる。
【００５０】
図２に示す構成例においては、制御装置１００は、ＣＮＣ工作機械５４０と、ＣＮＣ工作機械５４０に対してワークＷを供給する搬送装置５５０とを制御する。
【００５１】
ＣＮＣ工作機械５４０は、位置や速度などを指定するＮＣプログラム３４に従って、マシニングセンタなどを制御することで、任意の対象物を加工する。ＣＮＣ工作機械５４０としては、図示のものに限られず、旋盤加工、フライス盤、放電加工などの任意の加工装置に適用できる。
【００５２】
ＣＮＣ工作機械５４０および搬送装置５５０は、制御装置１００からの指令値に従って駆動される。搬送装置５５０により搬送されるワークＷは、作業台５５４の上に配置され、ＣＮＣ工作機械５４０により指定された加工が行われる。
【００５３】
図２に示す構成例においては、フィールドデバイス５００は、リモートＩ／Ｏ（Input/Output）装置５１０と、サーボドライバ５２０＿１，５２０＿２，５２０＿３およびサーボモータ５２２＿１，５２２＿２，５２２＿３と、サーボドライバ５３０とを含む。
【００５４】
リモートＩ／Ｏ装置５１０は、典型的には、フィールドネットワーク２を介して通信を行う通信カプラと、入力データの取得および出力データの出力を行うための入出力部（以下、「Ｉ／Ｏユニット」とも称す。）とを含む。リモートＩ／Ｏ装置５１０には、入力リレーや各種センサ（例えば、アナログセンサ、温度センサ、振動センサなど）などの入力データを収集する装置、および、出力リレー、コンタクタ、サーボドライバ、および、その他任意のアクチュエータなどのフィールドに対して何らかの作用を与える装置が接続される。
【００５５】
フィールドデバイス５００としては、これらに限られることなく、入力データを収集する任意のデバイス（例えば、視覚センサなど）、出力データに従う何らかの作用を与える任意のデバイス（例えば、インバータ装置など）、各種ロボットなどを採用することができる。
【００５６】
サーボモータ５２２＿１，５２２＿２，５２２＿３は、ＣＮＣ工作機械５４０の一部として組み込まれている。サーボドライバ５２０＿１〜５２０＿３は、制御装置１００からの指令値（例えば、位置指令値や速度指令値など）に従って、対応するサーボモータを駆動する。図２に示す構成例において、サーボモータ５２２＿１，５２２＿２，５２２＿３は、ＣＮＣ工作機械５４０のＸ軸，Ｙ軸，Ｚ軸の駆動源であり、これらの３軸については、一体的に制御することが好ましい。
【００５７】
サーボドライバ５３０は、ＣＮＣ工作機械５４０の先端工具を交換するための機構に組み込まれたサーボモータ（不図示）を駆動する。先端工具の交換は、ＣＮＣ工作機械５４０のＸ軸，Ｙ軸，Ｚ軸の制御と同期して、実行する必要がある。
【００５８】
本実施の形態に係る制御装置１００は、シーケンスプログラム３０を実行することで、シーケンス命令およびモーション命令に従って決定される指令値だけではなく、ＮＣプログラム３４を実行することで、ＣＮＣ工作機械５４０の挙動を制御するための指令値を生成できる。但し、シーケンスプログラム３０に含まれる制御命令により、ＮＣプログラム３４の実行開始および実行終了などが制御される。
【００５９】
以下の説明においては、ＣＮＣ工作機械５４０のＸ軸，Ｙ軸，Ｚ軸は、主として、ＮＣプログラム３４に従って制御され、ＣＮＣ工作機械５４０の先端工具の交換動作は、主として、シーケンスプログラム３０に従って制御されるものとする。
【００６０】
制御装置１００は、上位ネットワーク６を介して、他の装置にも接続されている。上位ネットワーク６には、一般的なネットワークプロトコルであるイーサネット（登録商標）やＥｔｈｅｒＮｅｔ／ＩＰ（登録商標）が採用されてもよい。より具体的には、上位ネットワーク６には、１または複数のサーバ装置３００および１または複数の表示装置４００が接続されてもよい。
【００６１】
サーバ装置３００としては、データベースシステム、製造実行システム（ＭＥＳ：Manufacturing Execution System）などが想定される。製造実行システムは、制御対象の製造装置や設備からの情報を取得して、生産全体を監視および管理するものであり、オーダ情報、品質情報、出荷情報などを扱うこともできる。これに限らず、情報系サービスを提供する装置を上位ネットワーク６に接続するようにしてもよい。情報系サービスとしては、制御対象の製造装置や設備からの情報を取得して、マクロ的またはミクロ的な分析などを行う処理が想定される。例えば、制御対象の製造装置や設備からの情報に含まれる何らかの特徴的な傾向を抽出するデータマイニングや、制御対象の設備や機械からの情報に基づく機械学習を行うための機械学習ツールなどが想定される。
【００６２】
表示装置４００は、ユーザからの操作を受けて、制御装置１００に対してユーザ操作に応じたコマンドなどを出力するとともに、制御装置１００での演算結果などをグラフィカルに表示する。
【００６３】
制御装置１００には、サポート装置２００が接続可能になっている。サポート装置２００は、制御装置１００が制御対象を制御するために必要な準備を支援する装置である。具体的には、サポート装置２００は、制御装置１００で実行されるプログラムの開発環境（プログラム作成編集ツール、パーサ、コンパイラなど）、制御装置１００および制御装置１００に接続される各種デバイスの構成情報（コンフィギュレーション）を設定するための設定環境、生成したユーザプログラムを制御装置１００へ出力する機能、制御装置１００上で実行されるユーザプログラムなどをオンラインで修正・変更する機能、などを提供する。
【００６４】
＜Ｃ．制御装置のハードウェア構成例＞
次に、本実施の形態に係る制御装置１００のハードウェア構成例について説明する。
【００６５】
図３は、本実施の形態に係る制御装置１００のハードウェア構成例を示すブロック図である。図３を参照して、制御装置１００は、ＣＰＵユニットと称される演算処理部であり、プロセッサ１０２と、チップセット１０４と、主メモリ１０６と、ストレージ１０８と、上位ネットワークコントローラ１１０と、ＵＳＢ（Universal Serial Bus）コントローラ１１２と、メモリカードインターフェイス１１４と、内部バスコントローラ１２０と、フィールドネットワークコントローラ１３０とを含む。
【００６６】
プロセッサ１０２は、ＣＰＵ（Central Processing Unit）、ＭＰＵ（Micro Processing Unit）、ＧＰＵ（Graphics Processing Unit）などで構成される。プロセッサ１０２としては、複数のコアを有する構成を採用してもよいし、プロセッサ１０２を複数配置してもよい。チップセット１０４は、プロセッサ１０２および周辺エレメントを制御することで、制御装置１００全体としての処理を実現する。主メモリ１０６は、ＤＲＡＭ（Dynamic Random Access Memory）やＳＲＡＭ（Static Random Access Memory）などの揮発性記憶装置などで構成される。ストレージ１０８は、例えば、ＨＤＤ（Hard Disk Drive）やＳＳＤ（Solid State Drive）などの不揮発性記憶装置などで構成される。
【００６７】
プロセッサ１０２は、ストレージ１０８に格納された各種プログラムを読出して、主メモリ１０６に展開して実行することで、制御対象に応じた制御、および、後述するような各種処理を実現する。ストレージ１０８には、基本的な機能を実現するためのシステムプログラム３６に加えて、制御対象の製造装置や設備に応じて作成されるユーザプログラム（シーケンスプログラム３０およびＮＣプログラム３４）が格納される。
【００６８】
上位ネットワークコントローラ１１０は、上位ネットワーク６を介して、サーバ装置３００や表示装置４００（図３参照）などとの間のデータの遣り取りを制御する。ＵＳＢコントローラ１１２は、ＵＳＢ接続を介してサポート装置２００との間のデータの遣り取りを制御する。
【００６９】
メモリカードインターフェイス１１４は、メモリカード１１６が着脱可能に構成されており、メモリカード１１６に対してデータを書込み、メモリカード１１６から各種データ（ユーザプログラムやトレースデータなど）を読出すことが可能になっている。
【００７０】
内部バスコントローラ１２０は、制御装置１００に装着されるＩ／Ｏユニット１２２との間のデータの遣り取りを制御する。フィールドネットワークコントローラ１３０は、フィールドネットワーク２を介したフィールドデバイスとの間のデータの遣り取りを制御する。
【００７１】
図３には、プロセッサ１０２がプログラムを実行することで必要な機能が提供される構成例を示したが、これらの提供される機能の一部または全部を、専用のハードウェア回路（例えば、ＡＳＩＣまたはＦＰＧＡなど）を用いて実装してもよい。あるいは、制御装置１００の主要部を、汎用的なアーキテクチャに従うハードウェア（例えば、汎用パソコンをベースとした産業用パソコン）を用いて実現してもよい。この場合には、仮想化技術を用いて、用途の異なる複数のＯＳ（Operating System）を並列的に実行させるとともに、各ＯＳ上で必要なアプリケーションを実行させるようにしてもよい。
【００７２】
図２に示す制御システム１においては、制御装置１００、サポート装置２００および表示装置４００がそれぞれ別体として構成されているが、これらの機能の全部または一部を単一の装置に集約するような構成を採用してもよい。
【００７３】
＜Ｄ．プログラム実行機構＞
次に、本実施の形態に係る制御装置１００のプログラム実行機構例について説明する。
【００７４】
図４は、本実施の形態に係る制御装置１００のプログラム実行機構の構成例を示す模式図である。図４を参照して、制御装置１００は、第１のプログラム実行部１０の具体例であるシーケンスプログラム実行部１５０と、第２のプログラム実行部１２の具体例である数値制御プログラム実行部１６０（以下、「ＮＣプログラム実行部」とも称す。）とを有している。
【００７５】
シーケンスプログラム実行部１５０は、シーケンスプログラム３０を第１の制御周期毎に実行して第１の指令値１４を算出する。具体的には、シーケンスプログラム実行部１５０は、シーケンス命令処理部１５２と、モーション指令値演算部１５４とを有しており、シーケンスプログラム３０を実行する。
【００７６】
シーケンス命令処理部１５２は、シーケンスプログラム３０に含まれるシーケンス命令を解釈し、指定されたシーケンス演算（論理演算）を実行して、シーケンス指令値１４２を第１の制御周期毎に算出または更新する。シーケンスプログラム実行部１５０は、シーケンスプログラム３０に含まれる命令に従って、プログラム実行過程において用いられる第１の共有変数値（例えば、共有変数１８４）を共有メモリ２０に書込む。
【００７７】
以下においては、説明の便宜上、第１の制御周期に対応する周期を、単に「制御周期」と称し、第２の制御周期に対応する周期（典型的には、第１の制御周期の整数倍）を、「アプリケーション周期」とも称す。
【００７８】
モーション指令値演算部１５４は、シーケンスプログラム３０に含まれるモーション命令に従ってモーション指令値１４４を算出する。モーション命令は、１つのコマンドによって複数の制御周期に亘ってモーション指令値１４４の算出を定義しており、モーション指令値演算部１５４は、このようなモーション命令を解釈して、モーション指令値１４４を制御周期毎に算出する。
【００７９】
シーケンス命令処理部１５２により算出されるシーケンス指令値１４２、および、モーション指令値演算部１５４により算出されるモーション指令値１４４は、第１の指令値１４の一例である。
【００８０】
ＮＣプログラム実行部１６０は、逐次解釈されるコードで記述されたアプリケーションプログラム３２（図４に示す例では、ＮＣプログラム３４）を実行して第１の制御周期毎に第２の指令値１６を算出する。すなわち、ＮＣプログラム実行部１６０は、ＮＣプログラム３４をインタプリタ方式で実行して、各モータに対する指令値（以下、「ＣＮＣ指令値１７０」とも称す。）を制御周期毎に算出する。
【００８１】
ＮＣプログラム実行部１６０によるＣＮＣ指令値１７０の算出または更新は、制御周期毎に繰返し実行される。このように、ＮＣプログラム実行部１６０は、シーケンスプログラム実行部１５０による指令値の算出に同期して、ＮＣプログラム３４に従うＣＮＣ指令値１７０を算出する。制御周期毎の指令値の算出を実現するために、ＮＣプログラム実行部１６０においては、指令値を算出するための中間コードが用いられる。
【００８２】
また、ＮＣプログラム実行部１６０は、アプリケーションプログラム３２（図４に示す例では、ＮＣプログラム３４）に記述されるコードに従って、共有メモリ２０に保持される第１の共有変数値（例えば、共有変数１８４）を参照しつつアプリケーションプログラム３２を実行する。
【００８３】
より具体的には、ＮＣプログラム実行部１６０は、インタプリタ１６２と、中間コードバッファ１６４と、ＣＮＣ指令値演算部１６８とを含む。
【００８４】
インタプリタ１６２は、制御周期（第１の制御周期）の整数倍であるアプリケーション周期（第２の制御周期）毎にアプリケーションプログラム３２（図４に示す例では、ＮＣプログラム３４を逐次解釈して中間コード１６６を生成する。インタプリタ１６２は、生成した中間コード１６６を中間コードバッファ１６４に順次格納する。インタプリタ１６２は、ＮＣプログラム３４から中間コード１６６の生成をある程度事前に行う。そのため、中間コードバッファ１６４には、複数の中間コード１６６が格納されることもある。本実施の形態において、インタプリタ１６２は、ＣＮＣ指令値１７０を算出するための軌道を生成するため、「プランナー」と称されることもある。
【００８５】
インタプリタ１６２によるＮＣプログラム３４の解釈は、アプリケーション周期（第２の制御周期）毎に繰返し実行される。なお、制御装置１００のプロセッサ１０２のリソースが限られている場合には、シーケンスプログラム実行部１５０および／またはＣＮＣ指令値演算部１６８による制御周期毎の処理が実行される間、インタプリタ１６２の処理が中断されることになる。そのため、インタプリタ１６２は、アプリケーション周期において処理を完了できる範囲で、ＮＣプログラム３４の一部を読込み、中間コードの生成などの処理を実行する。
【００８６】
ＣＮＣ指令値演算部１６８は、インタプリタ１６２により生成される中間コード１６６に従って制御周期（第１の制御周期）毎にＣＮＣ指令値１７０（第２の指令値）を算出する。一般的に、ＮＣプログラムに記述される命令（コード）は、逐次解釈されるために、演算周期毎にＣＮＣ指令値１７０を算出できる保証はないが、中間コード１６６を利用することで、制御周期毎のＣＮＣ指令値１７０の算出を実現できる。
【００８７】
インタプリタ１６２は、生成した中間コード１６６を中間コードバッファ１６４に逐次キューイングし、ＣＮＣ指令値演算部１６８は、中間コードバッファ１６４にキューイングされた順に中間コード１６６を読出す。
【００８８】
共有メモリ２０は、シーケンスプログラム実行部１５０および数値制御プログラム実行部１６０のいずれもからアクセス可能に構成される。典型的には、共有メモリ２０は、制御装置１００の主メモリ１０６（図３参照）などが提供する領域により実現される。共有メモリ２０には、１または複数の共有変数値が保持されてもよい。これらの共有変数値は、シーケンスプログラム実行部１５０および／または数値制御プログラム実行部１６０からのアクセスが可能になっている。
【００８９】
図４に示す例では、一例として、シーケンス命令処理部１５２から書込まれる共有変数１８２と、シーケンス命令処理部１５２およびインタプリタ１６２のいずれもから書込まれる共有変数１８４と、インタプリタ１６２から書込まれる共有変数１８６とを示す。図４に示す例に限らず、シーケンスプログラム実行部１５０および／または数値制御プログラム実行部１６０のいずれかのエレメントから書込み／読出しが可能な任意の共有変数を定義してもよい。
【００９０】
さらに、いずれかの共有変数に対して、複数のエレメントが互いに値を書込むことを防止するための排他処理などを実装してもよい。
【００９１】
＜Ｅ．中間コード＞
次に、ＮＣプログラム実行部１６０のインタプリタ１６２がＮＣプログラム３４を解釈して生成される中間コードの一例について説明する。
【００９２】
図５は、本実施の形態に係る制御装置１００における中間コードの生成例を説明するための模式図である。図５（Ａ）を参照して、ＮＣプログラム実行部１６０のインタプリタ１６２がＮＣプログラム３４を逐次実行すると、ＮＣプログラム３４に含まれる各命令が解釈される（（１）ＮＣプログラム解釈）。この命令の解釈によって、規定された軌道が内部的に生成される（（２）軌道生成）。複数の軸からなるグループが規定される場合には、軸毎に軌道を生成してもよいし、当該グループに属する軸の全体の挙動を規定する軌道を生成してもよい。
【００９３】
最終的に、インタプリタ１６２は、生成した軌道を所定の区間に分割した上で、各区間の軌道を規定する１または複数の関数（中間コード）を生成する（（３）中間コード生成）。
【００９４】
複数の区間を共通の中間コードで規定してもよいし、１つの区間をさらに分割してそれぞれの共通コードを生成してもよい。すなわち、ＮＣプログラム３４の命令または当該命令によって規定される軌道の区間と、生成される中間コードの数とを一致させる必要はなく、任意に生成すればよい。また、中間コード１６６の出力形態についても、要求される制御周期の時間幅などを考慮して、適宜設計されてもよい。
【００９５】
図５（Ａ）に示すように、中間コード１６６の一例としては、時間と指令値との関係を規定する関数であってもよい。図５（Ａ）に示す例では、内部的に生成された軌道は、直線の組み合わせで規定できる。一例として、Ｘ軸に関して、直線区間毎（区間１〜区間３）の軌道を時間と速度との関係を示す関数Ｆｘ１（ｔ），Ｆｘ２（ｔ），Ｆｘ３（ｔ）を出力できる。同一のグループに属する他の軸（例えば、Ｙ軸およびＺ軸）についても、それぞれ同様に関数が出力されてもよい。
【００９６】
図５（Ｂ）に示すように、ＮＣプログラム実行部１６０のＣＮＣ指令値演算部１６８が、制御周期毎に、生成された中間コード１６６に従って指令値を算出することで、制御周期毎に指令値が算出される（（４）指令値算出（軸数分））。すなわち、各区間に対応する関数に、各制御周期の時刻を入力することで、当該時刻における指令値を一意に決定できる。何らかのグループが設定されている場合には、当該グループに属する各軸について、指令値を同期して出力することが好ましい。
【００９７】
上述の図５には、一例として、ＣＮＣで用いられるＧ言語により記述されたコードの一例を示すが、これに限らず、任意のインタプリタ方式で実行されるプログラムであれば、どのような言語を用いてもよい。また、処理対象の言語形式に応じて、生成される中間コードの形式を異ならせてもよい。
【００９８】
＜Ｆ．プログラム実行およびデータ同期の周期＞
次に、本実施の形態に係る制御装置１００におけるプログラム実行およびデータ同期の周期について説明する。
【００９９】
図６は、本実施の形態に係る制御装置１００におけるプログラム実行およびデータ同期の周期を示すタイムチャートである。図６には、一例として、優先度別に複数のタスクが設定され、各タスクがそれぞれの優先度に応じてプロセッサ１０２のリソースを共有する例を示す。
【０１００】
図６に示す例では、高優先タスクとして、（１）フィールド側からの入力データの取得処理および算出された指令値のフィールド側への出力処理を含む入出力リフレッシュ処理１８０と、（２）シーケンス命令処理部１５２によるシーケンスプログラム３０の実行によるシーケンス指令値１４２の算出処理と、（３）ＣＮＣ指令値演算部１６８によるＮＣプログラム３４の実行によるＣＮＣ指令値１７０の算出処理と、（４）モーション指令値演算部１５４によるシーケンスプログラム３０の実行によるモーション指令値１４４の算出処理との４つの処理が設定されているとする。
【０１０１】
また、低優先タスクとして、ＮＣプログラム実行部１６０のインタプリタ１６２によるＮＣプログラム３４の逐次解釈が設定されているとする。
【０１０２】
高優先タスクは、予め定められた制御周期Ｔ１毎に繰返し実行される。図６に示す処理例においては、低優先タスクは、高優先タスクが実行されていない期間に適宜実行される。すなわち、制御周期毎に、高優先タスクの実行時間が割当てられ、高優先タスクの実行時間以外の時間において、低優先タスクが実行される。より具体的には、ＮＣプログラム実行部１６０のインタプリタ１６２は、シーケンスプログラム実行部１５０およびＣＮＣ指令値演算部１６８のいずれもが処理を実行していない期間に処理を実行するようにしてもよい。
【０１０３】
但し、プロセッサ１０２としてマルチコアプロセッサを採用し、あるいは、プロセッサ１０２を複数配置した場合には、高優先タスクおよび低優先タスクを並列的に実行するようにしてもよい。
【０１０４】
まず、高優先タスクについて説明すると、各制御周期の開始タイミングが到来すると、まず、入出力リフレッシュ処理１８０が実行された後、シーケンス命令処理部１５２がシーケンスプログラム３０を実行することでシーケンス指令値１４２を算出する。ＣＮＣ指令値演算部１６８は、ＮＣプログラム３４を解釈して生成された中間コード１６６に基づいてＣＮＣ指令値１７０を算出する。また、モーション指令値演算部１５４は、シーケンスプログラム３０に含まれるモーション命令に従って、モーション指令値１４４を算出する。以下、同様の処理が制御周期Ｔ１毎に繰返される。
【０１０５】
高優先タスクとして、（基本的には）アプリケーション周期Ｔ２毎に、シーケンスプログラム実行部１５０および数値制御プログラム実行部１６０と共有メモリ２０との間で共有変数を同期するためのデータ同期処理１８８が実行される。
【０１０６】
データ同期処理１８８により、シーケンス命令処理部１５２は、シーケンス指令値１４２の算出過程などにおいて、共有メモリ２０に保持される共有変数を参照できる。ＣＮＣ指令値演算部１６８および／またはモーション指令値演算部１５４についても、プログラムの実行過程などにおいて共有メモリ２０に保持される共有変数を参照できる。
【０１０７】
各制御周期における高優先タスクの実行が完了すると、シーケンス指令値１４２、ＣＮＣ指令値１７０、モーション指令値１４４のセットが算出される。これらの指令値は、基本的には、次の制御周期の開始タイミングが到来すると、入出力リフレッシュ処理１８０により、フィールド側に反映される。また、共有メモリ２０に反映すべき共有変数の値は、データ同期処理１８８により、共有メモリ２０に反映される。
【０１０８】
図６には、説明の便宜上、シーケンス指令値１４２の算出、ＣＮＣ指令値１７０の算出、モーション指令値１４４の算出の順序で処理が実行される例を示すが、処理の実行順番については適宜変更してもよいし、各処理をさらに細分化して交互に実行するようにしてもよい。すなわち、先行の入出力リフレッシュ処理１８０の実行完了後から次の入出力リフレッシュ処理１８０の実行開始前までの間に、指令値を含む外部データとして出力すべきデータが算出できていればよい。
【０１０９】
一方、低優先タスクについて説明すると、予め定められたアプリケーション周期Ｔ２（基本的には、制御周期Ｔ１の整数倍）毎に、ＮＣプログラム実行部１６０のインタプリタ１６２による処理がトリガされる。ＮＣプログラム実行部１６０のインタプリタ１６２は、ＮＣプログラム３４を逐次解釈する。インタプリタ１６２がＮＣプログラム３４を解析処理して生成された中間コード１６６は、中間コードバッファ１６４（図４参照）に逐次、キューイング（エンキュー）される。中間コードバッファ１６４にキューイングされた中間コード１６６は、ＣＮＣ指令値演算部１６８により都度デキューされて、ＣＮＣ指令値１７０の算出に用いられる。
【０１１０】
インタプリタ１６２は、ＮＣプログラム３４を事前に解析処理しておくことで、ＣＮＣ指令値演算部１６８がＣＮＣ指令値１７０の算出に必要な中間コードを事前に余裕をもって生成しておくことができる。
【０１１１】
図６に示すように、インタプリタ１６２は、ＮＣプログラム３４の逐次解釈を途中に中断を挟みつつ断片的に実行することもある。このような実行形態を採用しているため、制御周期Ｔ１毎に共有メモリ２０に対するデータ同期処理１８８を実行した場合には、処理途中で参照先の共有変数の値が変化してしまう可能性もある。
【０１１２】
そこで、本実施の形態においては、インタプリタ１６２の処理完了に対応して、アプリケーション周期Ｔ２毎に、シーケンスプログラム実行部１５０およびシーケンスプログラム実行部１５０と共有メモリ２０との間でデータ同期処理１８８が実行される。このような共有メモリ２０に対する排他処理を実行することで、処理途中に参照先の共有変数が変化してしまうといった事態を回避する。
【０１１３】
より具体的には、インタプリタ１６２は、アプリケーション周期Ｔ２毎に、ＮＣプログラム３４の少なくとも一部を解釈する処理を逐次実行する。インタプリタ１６２が１回のアプリケーション周期Ｔ２において解釈するＮＣプログラム３４のコード量は変化する。そのため、インタプリタ１６２は、アプリケーション周期Ｔ２毎に対象のコードについての処理が完了すると、実行完了通知を発行する。この実行完了通知を受けて、データ同期処理１８８が実行される。
【０１１４】
データ同期処理１８８は、対象となる制御周期Ｔ１内のいずれかのタイミングで実行されればよいが、本実施の形態においては、シーケンス命令処理部１５２による処理の後、ＣＮＣ指令値演算部１６８による処理前に実行される。これは、シーケンス命令処理部１５２により生成される指令値のうち、共有変数として出力される値を共有メモリ２０に即座に反映するためである。
【０１１５】
このような共有メモリ２０への共有変数値の反映の時間遅れを最小化するために、データ同期処理１８８は、インタプリタ１６２の処理完了後、次に到来する制御周期Ｔ１内で実行されるようにしてもよい。
【０１１６】
図６に示すような共有メモリ２０の共有変数の書込みおよび参照を、インタプリタ１６２の処理完了に対応して、アプリケーション周期Ｔ２毎に実行することで、シーケンスプログラム３０の実行処理とＮＣプログラム３４の実行処理との間で、共有変数の不整合を生ずることなく、必要な共有変数の共有または遣り取りを実現できる。
【０１１７】
なお、シーケンスプログラム３０とＮＣプログラム３４との間で厳格な処理の同期性などを制御する必要がない場合には、高優先タスクおよび低優先タスクのそれぞれの制御周期において、共有メモリ２０上の共有変数に対する書込みおよび参照を行うようにしてもよい。シーケンスプログラム実行部１５０と数値制御プログラム実行部１６０との間で、共有メモリ２０についての排他処理を不要とすることで、制御装置１００におけるシステム上の処理を簡素化できる。
【０１１８】
＜Ｇ．プログラム例＞
次に、シーケンスプログラム３０とＮＣプログラム３４との間で共有変数を用いて制御を実行するプログラムの一例について説明する。
【０１１９】
図７は、本実施の形態に係る制御装置１００においてシーケンスプログラム３０およびＮＣプログラム３４を連携して実行させる場合のプログラムの一例を説明するための模式図である。図７を参照して、制御装置１００においては、シーケンスプログラム３０およびＮＣプログラム３４が並列的に実行されるとする。
【０１２０】
図７に示すような２つのプログラムは、例えば、図２に示すようなＣＮＣ工作機械５４０において、ＮＣプログラム３４に従ってワークＷに対して第１の加工処理が実行された後、ＣＮＣ工作機械５４０の先端工具が交換され、その後、ＮＣプログラム３４に従ってワークＷに対して第２の加工処理が実行されるようなアプリケーションに適用できる。このような場合、例えば、図７に示すＮＣプログラム３４の前半部分が第１の加工処理を記述するコードに相当し、後半部分が第２の加工処理を記述するコードに相当する。また、シーケンスプログラム３０は、ＣＮＣ工作機械５４０の先端工具を交換するための命令を含むようにしてもよい。
【０１２１】
シーケンスプログラム実行部１５０により実行されるシーケンスプログラム３０は、ＣＮＣ＿ＣｏｏｒｄＣｏｎｔｒｏｌ（ＣＮＣ座標制御）命令３０２を含む。ＣＮＣ＿ＣｏｏｒｄＣｏｎｔｒｏｌ命令３０２は、数値制御プログラム実行部１６０でのＮＣプログラム３４の実行を開始する命令である。ＣＮＣ＿ＣｏｏｒｄＣｏｎｔｒｏｌ命令３０２の実行が指示されると（（１）開始トリガ）、内部的な実行指令が数値制御プログラム実行部１６０に与えられ（（２）ＮＣプログラム実行開始）、数値制御プログラム実行部１６０によるＮＣプログラム３４の実行が開始される（（３）実行）。このとき、ＮＣプログラム３４に含まれるコードが逐次解釈される。
【０１２２】
ＮＣプログラム３４は、ＮＣプログラム３４の実行を制御するための特殊コード３４２を含む。このようなＮＣプログラム３４に記述される特殊コード３４２は、実行中断変数の値（第２の共有変数値）を更新した後に、シーケンスプログラム実行部１５０により実行中断変数の更新を待つことを指示する。特殊コード３４２が解釈されると、共有メモリ２０に保持される対応する共有変数の値が更新される。図７に示す例においては、Ｇ言語での記述に類似した形式で、「Ｍ１００」というコードが特殊コード３４２として記述されている。このように、特殊コード３４２は、ＮＣプログラム３４（あるいは、アプリケーションプログラム３２）を記述するための言語形式に沿って予め定義されてもよい。
【０１２３】
共有変数のデータ型はどのようなものであってもよいが、本実施の形態においては、セット（ＴＲＵＥに設定）またはリセット（ＦＡＬＳＥに設定）されるブール値であるとする。説明の便宜上、このような共有変数を「実行中断変数」とも称す。すなわち、数値制御プログラム実行部１６０によりＮＣプログラム３４の特殊コード３４２が解釈されると、共有メモリ２０に保持される実行中断変数がセットされる（（４）実行中断変数セット）とともに、ＮＣプログラム３４の実行が中断される。すなわち、ＮＣプログラム３４に含まれる特殊コード３４２は、実行中断変数がリセットされるまで実行完了を応答せず、ＮＣプログラム３４の実行は、特殊コード３４２の位置で実質的に中断されることになる。
【０１２４】
一方、シーケンスプログラム実行部１５０により実行されるシーケンスプログラム３０は、ＣＮＣ＿ＣｏｏｒｄＣａｔｃｈＭＣｏｄｅ（ＣＮＣ座標Ｍコード検出）命令３０４を含む。ＣＮＣ＿ＣｏｏｒｄＣａｔｃｈＭＣｏｄｅ命令３０４は、実行中（有効化されている期間）において共有メモリ２０に保持される実行中断変数の値を監視する。そして、実行中断変数がセット（ＴＲＵＥに設定）されると、ＣＮＣ＿ＣｏｏｒｄＣａｔｃｈＭＣｏｄｅ命令３０４は、ＴＲＵＥを検出結果として出力する（（５）実行中断変数検出）。
【０１２５】
ＣＮＣ＿ＣｏｏｒｄＣａｔｃｈＭＣｏｄｅ命令３０４からのＴＲＵＥ出力を受けて、シーケンスプログラム３０において予め規定された処理３０６が実行される（（６）必要な処理実行）。
【０１２６】
予め規定された処理３０６の実行が完了すると、シーケンスプログラム３０に含まれる、ＣＮＣ＿ＣｏｏｒｄＲｅｓｅｔＭＣｏｄｅ（ＣＮＣ座標Ｍコードリセット）命令３０８が実行される。ＣＮＣ＿ＣｏｏｒｄＲｅｓｅｔＭＣｏｄｅ命令３０８は、共有メモリ２０に保持される実行中断変数の値をリセットする（（７）実行中断変数リセット）。すなわち、ＣＮＣ＿ＣｏｏｒｄＲｅｓｅｔＭＣｏｄｅ命令３０８の実行により、共有メモリ２０に保持に保持される実行中断変数の値がＦＡＬＳＥに変更される。
【０１２７】
実行中断変数の値がＦＡＬＳＥに変更されることで、ＮＣプログラム３４に含まれる特殊コード３４２の実行完了が応答され、後続のコードの解釈が再開される。すなわち、ＮＣプログラム３４に含まれる特殊コード３４２以降のコードが逐次実行される（（８）実行）。
【０１２８】
上述したように、共有メモリ２０に保持される共有変数（上述の例では、実行中断変数）の値をＮＣプログラム３４側から書込みおよび参照するとともに、シーケンスプログラム３０側からも書込みおよび参照することで、シーケンスプログラム３０とＮＣプログラム３４との間の実行タイミングを容易かつ正確に制御できる。
【０１２９】
図８は、図７に示すシーケンスプログラム３０およびＮＣプログラム３４を連携して実行させる場合の処理を示すタイムチャートである。図８には、図６に示すタイムチャートに対応させて、高優先タスクおよび低優先タスクの別に処理の時間変化を示す。
【０１３０】
基本的には、シーケンスプログラム３０は、高優先タスクとして、制御周期Ｔ１毎に繰返し実行される。また、ＮＣプログラム３４の逐次解釈は、低優先タスクとして、アプリケーション周期Ｔ２毎に順次実行される。
【０１３１】
まず、制御周期Ｔ１のあるタイミングで開始トリガが与えられると（（１）開始トリガ）、次の制御周期Ｔ１のタイミングでＮＣプログラム３４の実行が指示される（（２）ＮＣプログラム実行開始）。
【０１３２】
すると、低優先タスクとして、ＮＣプログラム３４は、アプリケーション周期Ｔ２毎に逐次解釈される。例えば、最初のアプリケーション周期Ｔ２において、図７に示すＮＣプログラム３４の１行目のコードが解釈され、２番目のアプリケーション周期Ｔ２において、図７に示すＮＣプログラム３４の２行目のコードが解釈されるとする（（３）実行）。
【０１３３】
説明の便宜上、１回のアプリケーション周期Ｔ２において１行分のコードの解釈が実行される例を示すが、１回のアプリケーション周期Ｔ２において複数行のコードを解釈するも可能であり、むしろ、そのような形態が通常である。
【０１３４】
その後、ＮＣプログラム３４の３行目のコード（すなわち、図７に示す特殊コード３４２）が実行されると、共有メモリ２０に保持される共有変数の一例である、実行中断変数がセットされる（（４）実行中断変数セット）。すなわち、インタプリタ１６２は、ＮＣプログラム３４に記述されるコードに従って、プログラム実行過程において参照される実行中断変数（第２の変数値）を共有メモリ２０に書込む。この実行中断変数がセットされるタイミングは、アプリケーション周期Ｔ２に応じたものとなる。
【０１３５】
なお、３行目のコードの直前にある２行目のコードに基づいて生成される中間コードによるＣＮＣ指令値１７０の生成は、複数の制御周期Ｔ１に亘って、高優先タスクとして実行される。そのため、特殊コード３４２が実行された際に、依然として直前にある２行目のコードに基づくＣＮＣ指令値１７０の生成が継続している場合には、そのＣＮＣ指令値１７０の生成が完了した直後に、実行中断変数がセットされる。
【０１３６】
実行中断変数がセットされると、周期実行されるシーケンスプログラム３０においてその実行中断変数の値の変化が検出される（（５）実行中断変数検出）。高優先タスクにおいては、実行中断変数の値が変化したことを条件に開始される処理が実行される（（６）必要な処理実行）。これらの処理の実行が完了すると、共有メモリ２０に保持される共有変数の一例である、実行中断変数がリセットされる（（７）実行中断変数リセット）。
【０１３７】
但し、シーケンスプログラム実行部１５０および数値制御プログラム実行部１６０と共有メモリ２０との間でデータ同期処理は、インタプリタ１６２の処理完了に対応して、アプリケーション周期Ｔ２毎に実行される。そのため、ある制御周期Ｔ１においてシーケンスプログラム実行部１５０がリセット指令を出力したとしても、その制御周期Ｔ１内において共有メモリ２０の実行中断変数をリセットされるとは限らない。これは、インタプリタ１６２の処理途中に実行中断変数を変化させないようにする排他処理の一種である。
【０１３８】
実行中断変数をセットしてから実行中断変数がリセットされるまでの間、低優先タスクにおけるＮＣプログラム３４は、実行完了待の状態となる。
【０１３９】
実行中断変数がリセットされると、アプリケーション周期Ｔ２毎に、ＮＣプログラム３４のコードの逐次実行が再開される（（８）実行）。すなわち、ＮＣプログラム３４の４行目以降のコードの逐次実行が開始される。
【０１４０】
以上のような低優先タスクと高優先タスクとの間の遣り取りによって、シーケンスプログラム３０とＮＣプログラム３４との連携制御を実現できる。
【０１４１】
図８に示すタイムチャートにおいては、ＮＣプログラム３４の実行を制御するための特殊コード３４２が解釈されると、インタプリタ１６２によるＮＣプログラム３４の逐次解釈が待機状態になるような処理を例示したが、実装形態としては、これに限られるものではない。例えば、通常のＣＮＣ指令値１７０を生成するための通常のコードおよび特殊コード３４２を含む中間コードを生成するようにしてもよい。この場合においても、中間コードのレベルで、共有変数である実行中断変数の値を互いに変化させることで、シーケンスプログラム３０とＮＣプログラム３４との連携制御を実現してもよい。
【０１４２】
＜Ｈ．処理手順＞
次に、本実施の形態に係る制御装置１００におけるプログラムの実行動作例について説明する。
【０１４３】
図９は、本実施の形態に係る制御装置１００においてシーケンスプログラム３０およびＮＣプログラム３４の連携実行に係る処理手順を示すフローチャートである。図９には、高優先タスクおよび低優先タスクの実行をそれぞれ示す。
【０１４４】
図９を参照して、高優先タスクに関して、制御周期Ｔ１が到来する（ステップＳ１００においてＹＥＳ）と、入出力リフレッシュ処理が実行される（ステップＳ１０２）。これによって、直前の制御周期において算出された指令値がアクチュエータなどへ出力されるとともに、フィールドから入力データが取得される。
【０１４５】
続いて、シーケンスプログラム実行部１５０（または、ＮＣプログラム実行部１６０）は、インタプリタ１６２から実行完了通知を受けているか否かを判断する（ステップＳ１０４）。インタプリタ１６２から実行完了通知を受けていれば（ステップＳ１０４においてＹＥＳ）、シーケンスプログラム実行部１５０およびシーケンスプログラム実行部１５０と共有メモリ２０との間でデータ同期処理１８８が実行される（ステップＳ１０６）。インタプリタ１６２から実行完了通知を受けていなければ（ステップＳ１０４においてＮＯ）、ステップＳ１０６の処理はスキップされる。
【０１４６】
続いて、シーケンスプログラム実行部１５０は、共有メモリ２０に保持される実行中断変数がセットされているか否かを判断する（ステップＳ１０８）。共有メモリ２０に保持される実行中断変数がセットされていれば（ステップＳ１０８においてＹＥＳ）、シーケンスプログラム実行部１５０は、ＮＣプログラム３４の制御対象に関連付けて予め規定された部分のプログラムを実行して、今回の制御周期における指令値を算出する（ステップＳ１１０）。
【０１４７】
続いて、ＮＣプログラム３４の制御対象に関連付けて予め規定された部分のプログラムの実行が完了していれば（ステップＳ１１２においてＹＥＳ）、シーケンスプログラム実行部１５０は、実行中断変数をリセットする（ステップＳ１１４）。ＮＣプログラム３４の制御対象に関連付けて予め規定された部分のプログラムの実行が完了していなければ（ステップＳ１１２においてＮＯ）、ステップＳ１１４の処理はスキップされる。
【０１４８】
また、共有メモリ２０に保持される実行中断変数がセットされていなければ（ステップＳ１０８においてＮＯ）、ステップＳ１１０〜Ｓ１１４の処理全体がスキップされる。
【０１４９】
シーケンスプログラム実行部１５０は、シーケンスプログラム３０のステップＳ１１０において実行される部分以外を実行して、今回の制御周期における指令値を算出する（ステップＳ１１６）。
【０１５０】
数値制御プログラム実行部１６０のＣＮＣ指令値演算部１６８は、指令値を算出するために必要な中間コードが有効に読込まれているか否かを判断する（ステップＳ１１８）。中間コードが有効に読込まれていなければ（ステップＳ１１８においてＮＯ）、ＣＮＣ指令値演算部１６８は、中間コードバッファ１６４から中間コードを読込む（ステップＳ１２０）。中間コードが有効に読込まれていれば（ステップＳ１１８においてＹＥＳ）、ステップＳ１２０の処理はスキップされる。
【０１５１】
数値制御プログラム実行部１６０のＣＮＣ指令値演算部１６８は、中間コードに従って、今回の制御周期における指令値を算出する（ステップＳ１２２）。
【０１５２】
シーケンスプログラム実行部１５０のシーケンス命令処理部１５２は、シーケンスプログラム３０に含まれるモーション命令に従って、今回の制御周期における指令値を算出する（ステップＳ１２４）。
【０１５３】
なお、ステップＳ１０８〜Ｓ１１４の処理は、ステップＳ１１６におけるシーケンスプログラム３０の実行途中に割込み実行されることもある。
【０１５４】
以上の処理により、今回の制御周期における指令値が演算される。そして、ステップＳ１００以下の処理が繰返される。すなわち、次の制御周期が到来すると、ステップＳ１１０，Ｓ１１６，Ｓ１２２，Ｓ１２４において算出される指令値がフィードへ出力される。なお、ステップＳ１２４の後、次の制御周期が到来するまでの期間は、低優先タスクが実行されることになる。
【０１５５】
一方、低優先タスクに関して、アプリケーション周期Ｔ２が到来する（ステップＳ２００においてＹＥＳ）と、ＮＣプログラム実行部１６０のインタプリタ１６２は、ＮＣプログラム３４のうち、今回のアプリケーション周期内において実行可能な範囲のコードを読込む（ステップＳ２０２）。インタプリタ１６２は、読込んだ内容に実行の中断を指示する特殊コードが含まれているか否かを判断する（ステップＳ２０４）。読込んだ内容に実行の中断を指示する特殊コードが含まれていれば（ステップＳ２０４においてＹＥＳ）、インタプリタ１６２は、実行中断変数をセットする（ステップＳ２０６）。そして、インタプリタ１６２は、実行中断変数がリセットされるまで待つ（ステップＳ２０８）。
【０１５６】
読込んだ内容に実行の中断を指示する特殊コードが含まれていなければ（ステップＳ２０４においてＮＯ）、ステップＳ２０６およびＳ２０８の処理はスキップされる。
【０１５７】
そして、低優先タスクに対してプログラムの実行時間が割当てられている期間において、インタプリタ１６２は、ステップＳ２０２において読込んだコードを解釈し（ステップＳ２１０）、何らかの中間コードが生成されると（ステップＳ２１２においてＹＥＳ）、生成された中間コードを中間コードバッファ１６４に格納する（ステップＳ２１４）。そして、ステップＳ２００以下の処理が繰返される。
【０１５８】
＜Ｉ．変形例＞
上述の説明においては、シーケンスプログラム３０とＮＣプログラム３４とを実行する制御装置１００について説明したが、インタプリタ方式で記述されたプログラムであれば、どのようなアプリケーションプログラムについても同様に適用できる。
【０１５９】
＜Ｊ．付記＞
上述したような本実施の形態は、以下のような技術思想を含む。
［構成１］
シーケンスプログラム（３０）を第１の制御周期（Ｔ１）毎に実行して第１の指令値を算出する第１のプログラム実行部（１０；１５０）と、
逐次解釈されるコードで記述されたアプリケーションプログラム（３２；３４）を実行して前記第１の制御周期毎に第２の指令値を算出する第２のプログラム実行部（２０；１６０）と、
前記第１のプログラム実行部および前記第２のプログラム実行部のいずれもからアクセス可能に構成された共有メモリ（２０）とを備え、
前記第１のプログラム実行部は、前記シーケンスプログラムに含まれる命令に従って、前記第１の指令値（１４）およびプログラム実行過程において用いられる第１の共有変数値（１８）を前記共有メモリに書込み、
前記第２のプログラム実行部は、前記アプリケーションプログラムに記述されるコードに従って、前記共有メモリに保持される前記第１の共有変数値を参照しつつ前記アプリケーションプログラムを実行する、制御装置。
［構成２］
前記第２のプログラム実行部は、
前記第１の制御周期の整数倍である第２の制御周期（Ｔ２）毎に前記アプリケーションプログラムを逐次解釈して中間コードを生成するインタプリタ（１６２）と、
前記インタプリタにより生成される中間コードに従って前記第１の制御周期毎に前記第２の指令値を算出する指令値演算部（１６８）とを含み、
前記インタプリタの処理完了に対応して、前記第２の制御周期毎に、前記第１のプログラム実行部および前記第２のプログラム実行部と前記共有メモリとの間でデータ同期処理（１８８）が実行される、構成１に記載の制御装置。
［構成３］
前記データ同期処理は、前記インタプリタの処理完了後、次に到来する第１の制御周期内で実行される、構成２に記載の制御装置。
［構成４］
前記第１のプログラム実行部は、前記共有メモリに保持される値を参照しつつ前記シーケンスプログラムを実行する、構成３に記載の制御装置。
［構成５］
前記インタプリタは、前記アプリケーションプログラムに記述されるコードに従って、プログラム実行過程において参照される第２の共有変数値を前記共有メモリに書込み、
前記アプリケーションプログラムに記述されるコードは、前記第２の共有変数値を更新した後に、前記第１のプログラム実行部により前記第２の共有変数値の更新を待つための特殊コード（３４２）を含む、構成３または４に記載の制御装置。
［構成６］
前記特殊コードは、前記アプリケーションプログラムを記述するための言語形式に沿って予め定義される、構成５に記載の制御装置。
［構成７］
前記インタプリタは、前記第１のプログラム実行部および前記指令値演算部のいずれもが処理を実行していない期間に処理を実行する、構成２〜６のいずれか１項に記載の制御装置。
［構成８］
前記アプリケーションプログラムは、予め定められた言語に従って記述された数値制御プログラムである、構成１〜７のいずれか１項に記載の制御装置。
［構成９］
制御装置による制御方法であって、
シーケンスプログラムを第１の制御周期毎に実行して第１の指令値を算出するステップ（Ｓ１００〜Ｓ１２０）と、
逐次解釈されるコードで記述されたアプリケーションプログラムを実行して前記第１の制御周期毎に第２の指令値を算出するステップ（Ｓ２００〜Ｓ２１６）とを備え、
前記制御装置は、前記シーケンスプログラムの実行主体および前記アプリケーションプログラムの実行主体のいずれもからアクセス可能に構成された共有メモリ（２０）を備え、
前記第１の指令値を算出するステップは、前記シーケンスプログラムに含まれる命令に従って、プログラム実行過程において用いられる第１の共有変数値を前記共有メモリに書込むステップ（Ｓ１１０）を含み、
前記第２の指令値を算出するステップは、前記アプリケーションプログラムに記述されるコードに従って、前記共有メモリに保持される前記第１の共有変数値を参照しつつ前記アプリケーションプログラムを実行するステップ（Ｓ２０６〜Ｓ２１０）を含む、制御方法。
【０１６０】
＜Ｋ．利点＞
従来技術において、工作機械などを制御する場合には、ＰＬＣなどの制御装置とＣＮＣコントローラとを組み合わせたようなシステムが採用されていた。このようなシステムにおいては、コントローラ間の通信またはワイヤ接続などにより連携した動作を実現していた。しかしながら、ＰＬＣおよびＣＮＣコントローラでは、それぞれ独自の周期でプログラムを実行しており、かつ、コントローラ間の通信またはワイヤ接続などにより相互のプログラム間で同期をとっているため、プログラム間で通信の処理待ちなど無駄な待ち時間が発生し、冗長なインターロック措置などが必要であった。
【０１６１】
これに対して、本実施の形態においては、シーケンスプログラムとアプリケーションプログラムとを単一の制御装置で並列的に実行させることができるとともに、プログラム間で共有メモリを利用して任意の値を相互に遣り取りできる。このような構成を採用することで、冗長なインターロック措置などは不要となり、かつ、直接的に値を遣り取りできるため、プログラム間の待ち時間を最小化できる。
【０１６２】
また、本実施の形態に係る制御装置においては、アプリケーションプログラムの特徴的な記述（例えば、上述したような特殊コード）を用いて、アプリケーションのタスクを任意の位置で中断できる。
【０１６３】
また。本実施の形態に係る制御装置においては、シーケンスプログラムの実行周期（制御周期）でアプリケーションプログラムの振舞いを制御できるため、より高精度な連携実行を実現できる。
【０１６４】
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は、上記した説明ではなく、特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【符号の説明】
【０１６５】
１  制御システム、２  フィールドネットワーク、６  上位ネットワーク、１０  第１のプログラム実行部、１２  第２のプログラム実行部、１４  第１の指令値、１６  第２の指令値、１８  第１の共有変数値、２０  共有メモリ、３０  シーケンスプログラム、３２  アプリケーションプログラム、３４  ＮＣプログラム、３６  システムプログラム、１００  制御装置、１０２  プロセッサ、１０４  チップセット、１０６  主メモリ、１０８  ストレージ、１１０  上位ネットワークコントローラ、１１２  ＵＳＢコントローラ、１１４  メモリカードインターフェイス、１１６  メモリカード、１２０  内部バスコントローラ、１２２  Ｉ／Ｏユニット、１３０  フィールドネットワークコントローラ、１４２  シーケンス指令値、１４４  モーション指令値、１５０  シーケンスプログラム実行部、１５２  シーケンス命令処理部、１５４  モーション指令値演算部、１６０  ＮＣプログラム実行部（数値制御プログラム実行部）、１６２  インタプリタ、１６４  中間コードバッファ、１６６  中間コード、１６８  ＣＮＣ指令値演算部、１７０  ＣＮＣ指令値、１８０  入出力リフレッシュ処理、１８２，１８４，１８６  共有変数、１８８  データ同期処理、２００  サポート装置、３００  サーバ装置、３４２  特殊コード、４００  表示装置、５００  フィールドデバイス、５１０  リモートＩ／Ｏ装置、５２０＿１，５２０＿２，５２０＿３，５３０  サーボドライバ、５２２＿１，５２２＿２，５２２＿３  サーボモータ、５４０  工作機械、５５０  搬送装置、５５４  作業台、Ｔ１  制御周期、Ｔ２  アプリケーション周期、Ｗ  ワーク。
【図１】
2019053459.tif 000003
【図２】
2019053459.tif 000004
【図３】
2019053459.tif 000005
【図４】
2019053459.tif 000006
【図５】
2019053459.tif 000007
【図６】
2019053459.tif 000008
【図７】
2019053459.tif 000009
【図８】
2019053459.tif 000010
【図９】
2019053459.tif 000011