(57)【要約】      （修正有）【課題】モーション制御でのマルチタスクプログラミングにおいて、ユーザ作成の複数プログラムから同一の関数を呼出す可能性に起因する誤動作を防止でき、ユーザが変数の有効範囲を気にせずプログラミングできる、ソフトウェアのバグ低減可能なモーション制御構造を提供する。【解決手段】モーション制御構造１０は、ユーザがプログラムを作成、保存、実行可能な自立型であり、マルチタスクプログラミング可能なユーザプログラム作成部２と、作成されたソースプログラムＡを目的コードＢに翻訳するコンパイラ５を備える。ユーザプログラム作成部は定義されたタスクでのみ有効なタスク関数と、全てのタスク間で有効なグローバル関数とに拡張された仕様によりユーザが各関数を定義可能に形成される。コンパイラは各関数を仕分け可能に形成される。グローバル関数は一つのタスクから呼び出された場合に他のタスクからの呼び出しが禁止される排他制御がなされる。【選択図】図１
2017045157.tif 000002
【特許請求の範囲】
【請求項１】
ユーザがプログラムを作成、内部に保存し、かつ実行可能な自立型のモーション制御構造であって、該モーション制御構造は、マルチタスクプログラミングの可能なユーザプログラム作成部と、該ユーザプログラム作成部で作成されたソースプログラムを目的コードに翻訳するコンパイラとを備えており、該ユーザプログラム作成部は、定義されたタスクでのみ有効な関数（以下、「タスク関数」）と、全てのタスク間で有効な関数（以下、「グローバル関数」）とに拡張された仕様によりユーザがこれらの関数を定義可能に形成され、該コンパイラは、各関数を仕分け可能に形成されていることを特徴とする、モーション制御構造。
【請求項２】
前記グローバル関数は一つのタスクから呼び出された場合に他のタスクからの呼び出しが禁止される排他制御がなされることを特徴とする、請求項１に記載のモーション制御構造。
【請求項３】
前記ユーザプログラム作成部は、宣言されたタスクでのみ有効なグローバル変数（以下、「グローバルタスク変数」）と、全てのタスク間で有効なグローバル変数（以下、「グローバルグローバル変数」）とに拡張された仕様によりユーザがこれらのグローバル変数を定義可能に形成され、前記コンパイラは、各グローバル変数を仕分け可能に形成されていることを特徴とする、請求項１または２に記載のモーション制御構造。
【請求項４】
ユーザは、本モーション制御構造が保有する変数領域の範囲内で前記グローバル変数を定義可能であることを特徴とする、請求項３に記載のモーション制御構造。
【請求項５】
前記コンパイラは、グローバルタスク変数が宣言されたタスク以外のタスクにて該グローバルタスク変数が使用された場合に、エラーを発報するよう形成されていることを特徴とする、請求項３または４に記載のモーション制御構造。
【請求項６】
前記グローバル変数のスコープ（有効範囲）が前記タスク単位の範囲に拡張されていることを特徴とする、請求項３ないし５のいずれかに記載のモーション制御構造。
【請求項７】
請求項１ないし６のいずれかに記載のモーション制御構造を備えた、モーションコントローラ。
【請求項８】
請求項１ないし６のいずれかに記載のモーション制御構造を備えた、モータ制御装置。
【請求項９】
ユーザがプログラムを作成、内部に保存し、かつ実行可能な自立型のモーション制御構造が用いられるマルチタスクプログラミング方法であって、定義されたタスクでのみ有効な関数（タスク関数）と、全てのタスク間で有効な関数（グローバル関数）とに拡張された関数仕様を備えたユーザプログラム作成部でプログラムが作成されるプログラム作成処理と、該プログラムをコンパイラが目的コードに翻訳する過程で各関数が仕分けされるコンパイル処理とを備えてなることを特徴とする、マルチタスクプログラミング方法。
【請求項１０】
前記グローバル関数が一つのタスクから呼び出された場合に他のタスクからの呼び出しが禁止される排他制御がなされることを特徴とする、請求項９に記載のマルチタスクプログラミング方法。
【請求項１１】
前記プログラム作成処理では、宣言されたタスクでのみ有効なもの（グローバルタスク変数）と全てのタスク間で有効なもの（グローバルグローバル変数）とに拡張されたグローバル変数仕様をも備えたユーザプログラム作成部でプログラムが作成され、前記コンパイル処理では、前記グローバルタスク変数も仕分けされることを特徴とする、請求項９または１０に記載のマルチタスクプログラミング方法。
【請求項１２】
前記プログラム作成処理では、前記モーション制御構造が保有する変数領域の範囲内で前記グローバル変数が定義されることを特徴とする、請求項１１に記載のマルチタスクプログラミング方法。
【請求項１３】
前記コンパイル処理では、グローバルタスク変数が宣言されたタスク以外のタスクにて前記グローバルタスク変数が使用された場合に、前記コンパイラがエラーを発報することを特徴とする、請求項１１または１２に記載のマルチタスクプログラミング方法。
【請求項１４】
作成されるプログラムにおいて、前記グローバル変数のスコープ（有効範囲）が前記タスク単位の範囲であることを特徴とする、請求項１１ないし１３のいずれかに記載のマルチタスクプログラミング方法。
【請求項１５】
請求項９ないし１４のいずれかに記載のマルチタスクプログラミング方法により作成され、タスク間における関数の抵触がないことを特徴とする、マルチタスクプログラム。
【請求項１６】
モーション制御構造を機能させるためのマルチタスク構造を備えたプログラムであって、関数として、定義されたタスクでのみ有効な関数（タスク関数）、および全てのタスク間で有効な関数（グローバル関数）のいずれもが記述されていることを特徴とする、マルチタスクプログラム。
【請求項１７】
グローバル変数として、宣言されたタスクでのみ有効なグローバル変数（グローバルタスク変数）、および全てのタスク間で有効なグローバル変数（グローバルグローバル変数）のいずれもが記述されていることを特徴とする、請求項１６に記載のマルチタスクプログラム。
【請求項１８】
前記グローバル変数のスコープ（有効範囲）が前記タスク単位の範囲であることを特徴とする、請求項１５ないし１７のいずれかに記載のマルチタスクプログラム。
【請求項１９】
モーションコントローラ用のシーケンス、またはモータ制御装置用のモータ制御プログラムであることを特徴とする、請求項１５ないし１８のいずれかに記載のマルチタスクプログラム。
【請求項２０】
ユーザがプログラムを作成、内部に保存し、かつ実行可能な自立型のモーション制御構造によって構成されるマルチタスクプログラム構造であって、定義されたタスクでのみ有効な関数（タスク関数）と全てのタスク間で有効な関数（グローバル関数）とに拡張された関数仕様を備えたユーザプログラム作成部で作成されたプログラムにおける該関数が、コンパイラによる目的コードへの翻訳過程で仕分けされていることを特徴とする、マルチタスクプログラム構造。
【請求項２１】
宣言されたタスクでのみ有効なもの（グローバルタスク変数）と全てのタスク間で有効なもの（グローバルグローバル変数）とに拡張されたグローバル変数仕様を備えたユーザプログラム作成部で作成されたプログラムにおける該グローバル変数がコンパイラによる目的コードへの翻訳過程で仕分けされていることを特徴とする、請求項２０に記載のマルチタスクプログラム構造。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はモーション制御構造、モーションコントローラ、モータ制御装置、マルチタスクプログラミング方法、マルチタスクプログラム、およびマルチタスクプログラム構造に係り、特に、ユーザが作成したプログラムがマルチタスク構造（複数のプログラムが同時に実行される構造）の場合の、複数プログラムから同一のサブルーチン（関数）を呼び出す可能性に起因する誤動作を防止することができ、また、ユーザが変数の有効範囲を気にすることなくプログラミングすることが可能となり、ソフトウェアのバグの低減が可能な、モーション制御構造等に関するものである。
【背景技術】
【０００２】
内部にプログラムを保存・実行可能な自立型モーションコントローラやモータ制御装置では、プログラム実行部にマルチタスクの構造を持たせることができる。マルチタスクは異なる仕事を並列に実行できる便利な機能であり、プログラムを簡単に作成するために必須の機能であるといってもよい。
【０００３】
Ｃ言語で使われる変数の種類には、グローバル変数とローカル変数があり、関数間で共通に使用したい変数はグローバル変数として定義し、関数内で一時的に使用したい変数は、ローカル変数として定義するのが一般的である。従来、ユーザがシーケンスやモータ制御プログラムのプログラミングを行う場合には、メーカーが予め割り当てた（予約された）グローバル変数（グローバルレジスタ）が使用されている。
【０００４】
さて、モーション制御におけるマルチタスク機能については、多数の技術的提案がなされている。たとえば後掲特許文献１には、コントローラを増設することなく制御対象である動作単位を容易に増設できる自動機制御装置として、異なる動作にそれぞれ対応した複数の動作制御タスクを並列的に切り換えて動作シーケンスプログラムを解釈する上位制御部と、受け持つ被駆動素子を制御する複数の下位制御部と、上位制御部から発せられた動作命令実行のための共有メモリと、共有メモリに接続するバスとを有し、上位制御部は動作シーケンスプログラムを解釈した際に被駆動素子の動作実行に必要な情報を共有メモリに記憶させ、その後、実行する動作制御タスクを切り換えてこれに対応する動作部が有する被駆動素子が動作中と判断されたときにはさらに動作制御タスクを切り換え、下位制御部は上位制御部から動作実行を指示された際に共有メモリから情報を入力して動作実行する、という構成が開示されている。
【０００５】
また、特許文献２には、変数に対して複数のタスクがアクセスする場合にも一貫性のある演算が可能な制御装置として、各タスクに応じた周期で複数のタスクを並列実行するタスク実行部と、更新タスクにより更新・参照されるグローバル変数ならびにこれに対応し参照タスクにより参照される参照用データを記憶するＲＡＭと、複数のタスクが実行されているときにグローバル変数および参照用データを収集する収集部とを備えたＣＰＵユニットの構成が開示されている。つまりこれは、プログラムの並列処理時のグローバル変数への内部操作に関する技術である。
【０００６】
また、特許文献３には、汎用コンピュータによりモータ制御を行う装置においてプリエンティブな（実行するタスクが一定時間ごとに切り替わる）マルチタスクを実現するために、画像処理に関するアプリケーションタスク、モータ駆動の命令信号を生成するアプリケーションタスク、および命令信号の送受信タスクを強制的に切替えるタスク切替管理部を備えた装置とし、アプリケーションタスクでデータ作成が完了した時点でセットされるフラグによりデータ完成有無を判断し、完成ならば送受信タスクにスレッドを割り当て、サーボアンプへ命令信号を送信する構成が開示されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特許第２８１７８４２号公報「自動機の制御装置」
【特許文献２】特許第５２１８５８５号公報「制御装置およびシステムプログラム」
【特許文献３】特開２０００−２０７２２８号公報「モータ制御装置」
【発明の概要】
【発明が解決しようとする課題】
【０００８】
従来の自立型モーションコントローラ・モータ制御装置用のプログラミング言語は、サブルーチン（関数）を作成することができたが、複数のプログラムが同時に実行されるマルチタスク構造に十全に対応するものではなかった。
図６は、従来のマルチタスク構造のプログラムにおける関数へのアクセス例を示す説明図である。図示するように、ユーザの作成したプログラムが、並列に処理される複数のプログラム（タスク１番、２番、３番）、つまりマルチタスク構造である場合、複数のプログラムから同一の関数（Ｄａｔａ１、Ｄａｔａ２、Ｄａｔａ３）を参照・設定する可能性があるため、原因不明の誤動作が発生しやすかった。
【０００９】
また、プログラミングにおいて関数間で共通に使用したい変数については、グローバル変数、関数内で一時的に使用したい変数はローカル変数として、それぞれ定義するのが一般的が、マルチタスクプログラミングの場合にはかかる変数の扱いが問題となる。気づいているか否かに関わらず、共通で使用できるグローバル変数が異なるタスク間で使用された場合、ユーザの意図しないタイミングでデータが書き換えられることがある。そのようなバグは発見が困難で、現象が発生するタイミングもランダムであるため、デバッグが困難なケースが多い。
【００１０】
図６−２は、従来のマルチタスク構造のプログラムにおけるグローバル変数へのアクセス例を示す説明図である。図示するように、ユーザの作成したプログラムが、並列に処理される複数のプログラム（タスク１番、２番、３番）、つまりマルチタスク構造である場合、複数のプログラムから同一のグローバル変数（Ｄａｔａ１、Ｄａｔａ２、Ｄａｔａ３）を参照・設定する可能性があるため、原因不明の誤動作が発生しやすい。つまり、異なるタスク間でグローバル変数が同時に使用されると、複数のプログラムから特定のデータにアクセスすることになり、後から見たときに訳の分からないプログラムになる危険性がある。結局、マルチタスクプログラミングにおいては、グローバル変数とローカル変数のみの定義では、データの十分な堅牢性を得ることができない。
【００１１】
そこで本発明が解決しようとする課題は、これら従来技術の問題点をなくし、モーション制御でのマルチタスクプログラミングにおいて、ユーザが作成した複数プログラムから同一の関数を呼び出す可能性に起因する誤動作を、有効に防止することのできる、モーション制御構造等を提供することである。併せて本発明の課題は、ユーザが変数の有効範囲を気にすることなくプログラミングすることが可能となり、ソフトウェアのバグを有効に低減することのできる、モーション制御構造等を提供することである。
【課題を解決するための手段】
【００１２】
本願発明者は上記課題について検討した結果、まず、関数を定義したタスクでのみ有効な関数）と、全てのタスク間で有効な関数、２種類の関数を持つ構造とし、これらの仕分けはプログラムの翻訳機（コンパイラ）により実現することとし、特に、全てのタスクから呼び出される関数（グローバル関数）は、あるタスクから関数が呼び出された時には他のタスクから呼び出すことを禁止する排他制御を備えることとした。
【００１３】
また、ユーザプログラム作成部において、宣言されたタスクでのみ有効なグローバル変数と、全てのタスク間で有効なグローバル変数、２種のグローバル変数を定義可能な構造とし、これらの変数の仕分けもプログラムの翻訳機（コンパイラ）により実現される構成とした。そして、このようにすることで課題解決できることを見出し、これに基づいて本発明を完成するに至った。すなわち、上記課題を解決するための手段として本願で特許請求される発明、もしくは少なくとも開示される発明は、以下の通りである。
【００１４】
〔１〕  ユーザがプログラムを作成、内部に保存し、かつ実行可能な自立型のモーション制御構造であって、該モーション制御構造は、マルチタスクプログラミングの可能なユーザプログラム作成部と、該ユーザプログラム作成部で作成されたソースプログラムを目的コードに翻訳するコンパイラとを備えており、該ユーザプログラム作成部は、定義されたタスクでのみ有効な関数（以下、「タスク関数」）と、全てのタスク間で有効な関数（以下、「グローバル関数」）とに拡張された仕様によりユーザがこれらの関数を定義可能に形成され、該コンパイラは、各関数を仕分け可能に形成されていることを特徴とする、モーション制御構造。
〔２〕  前記グローバル関数は一つのタスクから呼び出された場合に他のタスクからの呼び出しが禁止される排他制御がなされることを特徴とする、〔１〕に記載のモーション制御構造。
〔３〕  前記ユーザプログラム作成部は、宣言されたタスクでのみ有効なグローバル変数（以下、「グローバルタスク変数」）と、全てのタスク間で有効なグローバル変数（以下、「グローバルグローバル変数」）とに拡張された仕様によりユーザがこれらのグローバル変数を定義可能に形成され、前記コンパイラは、各グローバル変数を仕分け可能に形成されていることを特徴とする、〔１〕または〔２〕に記載のモーション制御構造。
【００１５】
〔４〕  ユーザは、本モーション制御構造が保有する変数領域の範囲内で前記グローバル変数を定義可能であることを特徴とする、〔３〕に記載のモーション制御構造。
〔５〕  前記コンパイラは、グローバルタスク変数が宣言されたタスク以外のタスクにて該グローバルタスク変数が使用された場合に、エラーを発報するよう形成されていることを特徴とする、〔３〕または〔４〕に記載のモーション制御構造。
〔６〕  前記グローバル変数のスコープ（有効範囲）が前記タスク単位の範囲に拡張されていることを特徴とする、〔３〕ないし〔５〕のいずれかに記載のモーション制御構造。
〔７〕  〔１〕ないし〔６〕のいずれかに記載のモーション制御構造を備えた、モーションコントローラ。
〔８〕  〔１〕ないし〔６〕のいずれかに記載のモーション制御構造を備えた、モータ制御装置。
【００１６】
〔９〕  ユーザがプログラムを作成、内部に保存し、かつ実行可能な自立型のモーション制御構造が用いられるマルチタスクプログラミング方法であって、定義されたタスクでのみ有効な関数（タスク関数）と、全てのタスク間で有効な関数（グローバル関数）とに拡張された関数仕様を備えたユーザプログラム作成部でプログラムが作成されるプログラム作成処理と、該プログラムをコンパイラが目的コードに翻訳する過程で各関数が仕分けされるコンパイル処理とを備えてなることを特徴とする、マルチタスクプログラミング方法。
〔１０〕  前記グローバル関数が一つのタスクから呼び出された場合に他のタスクからの呼び出しが禁止される排他制御がなされることを特徴とする、〔９〕に記載のマルチタスクプログラミング方法。
〔１１〕  前記プログラム作成処理では、宣言されたタスクでのみ有効なもの（グローバルタスク変数）と全てのタスク間で有効なもの（グローバルグローバル変数）とに拡張されたグローバル変数仕様をも備えたユーザプログラム作成部でプログラムが作成され、前記コンパイル処理では、前記グローバルタスク変数も仕分けされることを特徴とする、〔９〕または〔１０〕に記載のマルチタスクプログラミング方法。
【００１７】
〔１２〕  前記プログラム作成処理では、前記モーション制御構造が保有する変数領域の範囲内で前記グローバル変数が定義されることを特徴とする、〔１１〕に記載のマルチタスクプログラミング方法。
〔１３〕  前記コンパイル処理では、グローバルタスク変数が宣言されたタスク以外のタスクにて前記グローバルタスク変数が使用された場合に、前記コンパイラがエラーを発報することを特徴とする、〔１１〕または〔１２〕に記載のマルチタスクプログラミング方法。
〔１４〕  作成されるプログラムにおいて、前記グローバル変数のスコープ（有効範囲）が前記タスク単位の範囲であることを特徴とする、〔１１〕ないし〔１３〕のいずれかに記載のマルチタスクプログラミング方法。
【００１８】
〔１５〕  〔９〕ないし〔１４〕のいずれかに記載のマルチタスクプログラミング方法により作成され、タスク間における関数の抵触がないことを特徴とする、マルチタスクプログラム。
〔１５−２〕  タスク間における変数の抵触がないことを特徴とする、〔１５〕に記載のマルチタスクプログラム。
〔１６〕  モーション制御構造を機能させるためのマルチタスク構造を備えたプログラムであって、関数として、定義されたタスクでのみ有効な関数（タスク関数）、および全てのタスク間で有効な関数（グローバル関数）のいずれもが記述されていることを特徴とする、マルチタスクプログラム。
〔１７〕  グローバル変数として、宣言されたタスクでのみ有効なグローバル変数（グローバルタスク変数）、および全てのタスク間で有効なグローバル変数（グローバルグローバル変数）のいずれもが記述されていることを特徴とする、〔１６〕に記載のマルチタスクプログラム。
〔１８〕  前記グローバル変数のスコープ（有効範囲）が前記タスク単位の範囲であることを特徴とする、〔１５〕ないし〔１７〕のいずれかに記載のマルチタスクプログラム。
【００１９】
〔１９〕  モーションコントローラ用のシーケンス、またはモータ制御装置用のモータ制御プログラムであることを特徴とする、〔１５〕ないし〔１８〕のいずれかに記載のマルチタスクプログラム。
〔２０〕  ユーザがプログラムを作成、内部に保存し、かつ実行可能な自立型のモーション制御構造によって構成されるマルチタスクプログラム構造であって、定義されたタスクでのみ有効な関数（タスク関数）と全てのタスク間で有効な関数（グローバル関数）とに拡張された関数仕様を備えたユーザプログラム作成部で作成されたプログラムにおける該関数が、コンパイラによる目的コードへの翻訳過程で仕分けされていることを特徴とする、マルチタスクプログラム構造。
〔２１〕  宣言されたタスクでのみ有効なもの（グローバルタスク変数）と全てのタスク間で有効なもの（グローバルグローバル変数）とに拡張されたグローバル変数仕様を備えたユーザプログラム作成部で作成されたプログラムにおける該グローバル変数がコンパイラによる目的コードへの翻訳過程で仕分けされていることを特徴とする、〔２０〕に記載のマルチタスクプログラム構造。
【発明の効果】
【００２０】
本発明のモーション制御構造、モーションコントローラ、モータ制御装置、マルチタスクプログラミング方法、マルチタスクプログラム、およびマルチタスクプログラム構造は上述のように構成されるため、これらによれば、モーション制御でのマルチタスクプログラミングにおいて、ユーザが関数の有効範囲を気にすることなくプログラミングすることが可能となり、作成した複数プログラムから同一の関数を呼び出す可能性に起因する誤動作を有効に防止することができ、ソフトウェアのバグの低減が可能となる。なお、全てのタスクから呼び出し可能な関数（グローバル関数）は排他制御を有するため、安全に使用することができる。本発明により、複数プログラムから同一の関数を呼び出す可能性に起因する誤動作を防止することができ、ソフトウェア作成効率を向上させることができる。
【００２１】
また、さらにグローバル変数仕様の拡張された本発明モーション制御構造等によれば、ユーザは変数の有効範囲を気にすることなくプログラミングすることができ、ソフトウェアのバグを低減することができる。また、ユーザは処理系（ハードウェア）が保有する変数領域を自由に割り当てることができる。
【００２２】
なお、上記特許文献１はプログラムの並列処理の構造に関する技術であり、本発明とは主旨が異なる。また特許文献２は、プログラムの並列処理時のグローバル変数への内部操作に関する技術であり、グローバル変数の仕様を拡張した本発明とは異なるものである。また、特許文献３開示技術は、マルチタスクプログラムにおけるタスク切替え方法についての発明であり、マルチタスクプログラムのプログラム構造・作成方法に関する本発明とは全く異なるものである。
【図面の簡単な説明】
【００２３】
【図１】本発明のモーション制御構造の概念とマルチタスクプログラミング方法のフローを合わせて示した説明図である。
【図１−２】本発明における関数の構成を示す説明図である。
【図１−３】本発明のマルチタスク構造のプログラムにおけるタスク関数へのアクセス例を示す説明図である。
【図１−４】本発明のマルチタスク構造のプログラムにおけるグローバル関数へのアクセス例を示す説明図である。
【図２】本発明におけるグローバル変数の構成を示す説明図である。
【図３】本発明におけるグローバル変数の定義方法例を示す説明図である。
【図４】本発明における作成プログラムの例を示す説明図である。
【図５】本発明のマルチタスク構造のプログラムにおけるグローバル変数へのアクセス例を示す説明図である。
【図６】従来のマルチタスク構造のプログラムにおける関数へのアクセス例を示す説明図である。
【図６−２】従来のマルチタスク構造のプログラムにおけるグローバル変数へのアクセス例を示す説明図である。
【発明を実施するための形態】
【００２４】
以下、図面により本発明を詳細に説明する。
図１は、本発明のモーション制御構造の概念とマルチタスクプログラミング方法のフローを合わせて示した説明図である。また、
図１−２は本発明における関数の構成を示す説明図である。これらに図示するように本モーション制御構造１０は、ユーザがプログラムを作成、内部に保存し、かつ実行可能な自立型のモーション制御構造であって、マルチタスクプログラミングの可能なユーザプログラム作成部２と、ここで作成されたソースプログラムＡを目的コードＢに翻訳するコンパイラ５とを備えている。
【００２５】
そしてユーザプログラム作成部２は、図１−２に示すように、定義されたタスクでのみ有効な関数、すなわちタスク関数と、全てのタスク間で有効な関数、すなわちグローバル関数とに拡張された仕様によりユーザがこれらの関数を定義可能に形成されており、また、コンパイラ５は各関数を仕分け可能に形成されていることを、主たる構成とする。さらに、グローバル関数は一つのタスクから呼び出された場合に他のタスクからの呼び出しが禁止される排他制御がなされる構成とする。
【００２６】
本発明モーション制御構造１０はかかる構成であるため、ユーザプログラム作成部２において、定義されたタスクでのみ有効な関数、すなわちタスク関数と、全てのタスク間で有効な関数、すなわちグローバル関数とに拡張された仕様によりこれらの関数が定義されてマルチタスクプログラミングがなされ、このようにして作成されたソースプログラムＡは、コンパイラ５において、タスク関数とグローバル関数とが仕分けされつつ、目的コードＢへの翻訳がなされる。
【００２７】
複数のタスクが、排他制御されずに、グローバル関数領域を同時またはそれに近いタイミングで実行した場合、グローバル関数内で使用しているローカル変数やスタックのデータは破壊され、期待した結果が得られない。しかし本発明では排他制御がなされるため、一つのタスクからグローバル関数が呼び出された場合に他のタスクからグローバル関数を呼び出すようなプログラムは禁止され、したがって作成した複数プログラムから同一の関数を呼び出すことに起因する誤動作の心配が全くなく、ユーザは安心してプログラミングすることができ、ソフトウェアのバグが低減される。
【００２８】
本発明モーション制御構造１０においてこれらの作用が十分になされるために、プログラミング言語としては、関数をユーザが任意の名称で定義可能な言語が採用される。このようなプログラミング言語としては、たとえばＣ言語が好適である。全てのタスク間で有効なグローバル関数と、各タスクで有効なタスク関数とは、プログラミング言語に予約された識別子によって、コンパイラ５で仕分けされる。
【００２９】
なお、排他制御は、セマフォ命令によってなされるものとすることができる。セマフォ命令は、既に実行済みのプログラムがあった場合、他のタスクが処理を実行できないようにする、排他区間を確保する命令である。具体的には、本発明モーション制御構造１０のコンパイラ５は、グローバル関数の先頭と最後に自動的にセマフォ命令を付加するように形成され、そのように機能する。
【００３０】
前出図１を用いて、本発明のマルチタスクプログラミング方法について説明する。本マルチタスクプログラミング方法は、ユーザがプログラムを作成、内部に保存し、かつ実行可能な自立型のモーション制御構造１０を用いて行うことができるが、まず、定義されたタスクでのみ有効なタスク関数と、全てのタスク間で有効なグローバル関数とに拡張された関数仕様を備えたユーザプログラム作成部２において、ソースプログラムＡが作成され（プログラム作成過程Ｐ２）、ついで、コンパイラ５により、各関数が仕分けされつつプログラムＡが目的コードＢに翻訳される（コンパイル過程Ｐ５）。このようにしてマルチタスクプログラムが作成される。
【００３１】
なお、本発明のマルチタスクプログラミング方法においては、グローバル関数が一つのタスクから呼び出された場合に他のタスクからの呼び出しが禁止される排他制御が付加される。排他制御の付加は、コンパイル過程Ｐ５においてなされるものとすることができる。上述のとおり、コンパイル過程Ｐ５においてグローバル関数の先頭と最後に自動的にセマフォ命令を付加することで、排他制御の付加とすることができる。
【００３２】
かかるマルチタスクプログラミング方法により作成されたマルチタスクプログラムもまた本発明の範囲内であり、タスク間における関数の抵触がないという特徴を有する。別言すれば、本発明のマルチタスクプログラムは、関数として、定義されたタスクでのみ有効なタスク関数、および全てのタスク間で有効なグローバル関数のいずれもが記述されていて、モーション制御構造を機能させることのできる、マルチタスク構造を備えたプログラムである。
【００３３】
本発明のマルチタスクプログラム構造は、タスク関数とグローバル関数とに拡張された関数仕様を備えたユーザプログラム作成部で作成されたプログラムにおける関数がコンパイラによる目的コードへの翻訳過程で仕分けされている構造である。
図１−３は、本発明のマルチタスク構造のプログラムにおけるタスク関数へのアクセス例を示す説明図である。図示するように本マルチタスクプログラムでは、タスク１関数Ｄａｔａ１、タスク２関数Ｄａｔａ２、タスク３関数Ｄａｔａ３はそれぞれ、定義されたタスク１番、タスク２番、タスク３番においてのみ有効であって、ユーザの作成した各タスクプログラムは並列に処理される。
【００３４】
図１−４は、本発明のマルチタスク構造のプログラムにおけるグローバル関数へのアクセス例を示す説明図である。図示するように、一方グローバル関数については、タスク１番、タスク２番、タスク３番のいずれも、グローバル関数Ｄａｔａ１は有効なのだが、排他制御がなされるために、タスク１番がグローバル関数Ｄａｔａ１にアクセス実行済みである場合には、並列に処理されるタスク２番、タスク３番はグローバル関数Ｄａｔａ１にはアクセスできない。つまり、これらタスク２番、タスク３番からのグローバル関数Ｄａｔａ１呼び出しは禁止される。
【００３５】
これにより、本発明のマルチタスクプログラムでは、複数のプログラムから同一のグローバル関数Ｄａｔａ１を呼び出す可能性がなく、原因不明の誤動作が発生しない。すなわち、異なるタスク間で同一のグローバル関数が同時に使用されることがないため、複数のプログラムから特定のデータにアクセスすることがなく、後から見た時に訳の分からないプログラムが作成されるという問題が、有効に予防される。
【００３６】
図２は本発明におけるグローバル変数の構成を示す説明図である。本発明のモーション制御構造は以上述べた関数仕様による各構成に加え、以下の構成をも備えたものとすることができる。すなわち、ユーザプログラム作成部２は、宣言された（定義された）タスクでのみ有効なグローバル変数、すなわちグローバルタスク変数と、全てのタスク間で有効（使用可能）なグローバル変数、すなわちグローバルグローバル変数とに拡張された仕様によりユーザがこれらのグローバル変数を定義可能に形成されており、また、コンパイラ５は各グローバル変数を仕分け可能に形成されている、という構成である。
【００３７】
本発明モーション制御構造１０はかかる構成とすることができるため、関数仕様について述べた作用効果に加え、下記の作用効果が得られる。すなわち、ユーザプログラム作成部２において、宣言されたタスクでのみ有効であるグローバルタスク変数と、全てのタスク間で有効であるグローバルグローバル変数とに拡張された仕様によりグローバル変数が定義されてマルチタスクプログラミングがなされ、このようにして作成されたソースプログラムＡは、コンパイラ５において、グローバルタスク変数とグローバルグローバル変数とが仕分けされつつ、目的コードＢへの翻訳がなされる。
【００３８】
したがって、ユーザは変数の有効範囲を気にすることなくプログラミングすることができ、ソフトウェアのバグが低減される。また、ユーザは処理系（ハードウェア）が保有する変数領域を自由に割り当てることができる。つまり、本モーション制御構造１０が保有する変数領域の範囲内で、各グローバル変数を定義することができる。
【００３９】
本発明モーション制御構造１０においてこれらの作用が十分になされるために、プログラミング言語としては、グローバル変数をユーザが任意の名称で定義可能な言語が採用される。このようなプログラミング言語としては、たとえばＣ言語が好適である。全ての変数で有効な変数（グローバルグローバル変数）と、各タスクで有効な変数（グローバルタスク変数）とは、プログラミング言語に予約された識別子によって、コンパイラ５で仕分けされる。
【００４０】
図３は、本発明モーション制御構造等におけるグローバル変数の定義方法例を示す説明図である。図に例示するように、グローバル変数を定義するためには、プリプロセス命令の  #pragma  を使用し、main、task1・・・taskn、global  を指定するという方法を採ることができる。これにより、それぞれの宣言によるスコープ（有効範囲）が決定される。たとえば、#pragma task1  の宣言以下に定義された変数はグローバルタスク１変数となり、すなわちスコープがタスク１のみとなり、他のタスクで使用することはできない。
【００４１】
本モーション制御構造１０では、もし、スコープを超えてグローバルタスク変数が宣言されたタスク以外のタスクにてグローバルタスク変数が使用された場合には、コンパイラ５がエラーを警告する構成とすることができる。かかる構成とすることによって、変数使用を誤ったプログラム作成を回避することができるため、ユーザは変数の有効範囲を気にすることなく、ハードウェアが保有する変数領域を自由に用いてマルチタスクプログラミングを行うことができ、ソフトウェアのバグ低減作用が担保される。
【００４２】
上述の通り本発明ではＣ言語が好適に使用されるが、従来のＣ言語の標準仕様では、グローバル変数のスコープはextern宣言しない限り１ファイル単位かつ定義以降というごく限定されたものだった。しかし本発明のモーション制御構造１０においては、グローバル変数のスコープ（有効範囲）がタスク単位の範囲に拡張された構成とすることができる。つまり、グローバル変数の有効範囲をタスク毎とし、従来のようなファイル単位と定義以降という制限を解除する構成である。
【００４３】
図４は、本発明における作成プログラムの例を示す説明図である。なお、本例は、グローバル変数のスコープ（有効範囲）の拡張仕様例である。以下、図中の記述について説明する。
#pragma  ***  
この記述は、タスクの何番目かを指定するものである。たとえば、
#pragma task_main （グローバルメインタスク変数）以下に記述されているグローバルタスク変数であるところの、
int tm1;  は、
#pragma task1 （グローバルタスク１変数）以下に記述されているグローバルタスク関数であるところの、
void t1_main(void)  には使用できない。
【００４４】
すなわち、
#pragma ***  以下で指定されたプログラムの記述部分は、同じ名称で指定されたプログラムでしか使用できない。しかし、
#pragma global  以下の記述部分は全てのプログラムで使用可能である。つまり、グローバルグローバル変数ｇは適用範囲Ｒ１において、グローバルメインタスク変数ｔｍ１は適用範囲Ｒ２において、グローバルタスク１変数ｔｌ１は適用範囲Ｒ３において、それぞれ使用可能である。
【００４５】
なお、図示するようにグローバルメインタスク変数ｔｍ２の適用範囲は本来、グローバルメインタスク変数ｔｍ１は適用範囲Ｒ２内の、
void func ( int a.  int.b )  以下に限定されるが、ここでは、スコープ（有効範囲）がタスク単位にまで拡張されている（拡張範囲Ｓ２）。
【００４６】
なおまた、以上説明した本モーション制御構造を備えた、モーションコントローラやモータ制御装置もまた、本発明の範囲内である。
【００４７】
前出図１を用い、新規な関数仕様に加え新規なグローバル変数仕様をも備えた本発明のマルチタスクプログラミング方法について、さらに説明する。本マルチタスクプログラミング方法は、ユーザがプログラムを作成、内部に保存し、かつ実行可能な自立型のモーション制御構造１０を用いて行うことができるが、まず、宣言されたタスクでのみ有効なグローバルタスク変数と、全てのタスク間で有効なグローバルグローバル変数とに拡張されたグローバル変数仕様を備えたユーザプログラム作成部２において、ソースプログラムＡが作成され（プログラム作成過程Ｐ２）、ついで、コンパイラ５により、グローバルタスク変数が仕分けされつつプログラムＡが目的コードＢに翻訳される（コンパイル過程Ｐ５）。このようにしてマルチタスクプログラムが作成される。
【００４８】
本発明のマルチタスクプログラミング方法においては、プログラム作成過程Ｐ２では、モーション制御構造１０が保有する変数領域の範囲内でグローバル変数が定義され、またコンパイル処理Ｐ５では、グローバルタスク変数が宣言されたタスク以外のタスクにてグローバルタスク変数が使用された場合にコンパイラ５がエラーを発報する構成が可能である。また、作成されるプログラムにおいて、グローバル変数のスコープ（有効範囲）を、ファイル単位や定義以降という限定された範囲ではなく、タスク単位の範囲に拡張できることも、既に述べたモーション制御構造と同様である。
【００４９】
図５は、本発明のマルチタスク構造のプログラムにおけるグローバル変数へのアクセス例を示す説明図である。図示するように、上記マルチタスクプログラミング方法により作成されるマルチタスクプログラムでは、タスク間における変数の抵触が発生しない。つまり、ユーザの作成したプログラムが並列に処理される複数のプログラム（タスク１番、２番、３番）というマルチタスク構造である場合、タスク１番からはグローバルタスク１変数Ｄａｔａ１にアクセスできても、他のグローバルタスク２変数Ｄａｔａ２、グローバルタスク３変数Ｄａｔａ３にはアクセスできない。
【００５０】
これにより、本発明のマルチタスクプログラムでは、複数のプログラムから同一のグローバル変数（Ｄａｔａ１、Ｄａｔａ２、Ｄａｔａ３）を参照・設定する可能性がなく、原因不明の誤動作が発生しない。すなわち、異なるタスク間で同一のグローバル変数が同時に使用されることがないため、複数のプログラムから特定のデータにアクセスすることがなく、後から見た時に訳の分からないプログラムが作成されるという問題が、有効に予防される。
【００５１】
このように作成される、モーション制御構造を機能させるための本発明マルチタスクプログラムは、関数として、定義されたタスクでのみ有効なタスク関数、および全てのタスク間で有効なグローバル関数のいずれもが記述されているとともに、グローバル変数として、宣言されたタスクでのみ有効なグローバルタスク変数、および全てのタスク間で有効なグローバルグローバル変数のいずれもが記述されたものとなる。
【００５２】
また、本発明マルチタスクプログラムは、これに加えて、グローバル変数のスコープ（有効範囲）がファイル単位や定義以降という限定された範囲ではなく、タスク単位の範囲に拡張されたマルチタスクプログラムとすることもできる。
【００５３】
本発明のマルチタスクプログラムは特に、モーションコントローラ用のシーケンスや、モータ制御装置用のモータ制御プログラムとして、最適な構成である。なおまた、上記関数仕様に加えて、グローバルタスク変数とグローバルグローバル変数とに拡張されたグローバル変数仕様を備えて作成されたプログラムにおいて、グローバル変数がコンパイラによる目的コードへの翻訳過程で仕分けされていることを特徴とするマルチタスクプログラム構造も、本発明の範囲内である。
【産業上の利用可能性】
【００５４】
本発明のモーション制御構造、マルチタスクプログラム等によれば、モーション制御でのマルチタスクプログラミングにおいて、ユーザが作成した複数プログラムから同一の関数を呼び出す可能性に起因する誤動作を、有効に防止することができるとともに、ユーザが変数の有効範囲を気にすることなくプログラミングすることができ、ソフトウェアのバグを有効に低減することができる。したがって、モータ制御分野および関連する全分野において、産業上利用性が高い発明である。
【符号の説明】
【００５５】
２…ユーザプログラム作成部
５…コンパイラ
１０…モーション制御構造
Ａ…ソースプログラム
Ｂ…目的コード
Ｐ２…プログラム作成過程
Ｐ５…コンパイル過程
Ｒ１…グローバルグローバル変数ｇの適用範囲
Ｒ２…グローバルメインタスク変数ｔｍ１の適用範囲
Ｒ３…グローバルタスク１変数ｔｌ１の適用範囲
Ｓ２…グローバルメインタスク変数ｔｍ２の拡張範囲
【図１】
2017045157.tif 000003
【図１−２】
2017045157.tif 000004
【図１−３】
2017045157.tif 000005
【図１−４】
2017045157.tif 000006
【図２】
2017045157.tif 000007
【図３】
2017045157.tif 000008
【図４】
2017045157.tif 000009
【図５】
2017045157.tif 000010
【図６】
2017045157.tif 000011
【図６−２】
2017045157.tif 000012