(57)【特許請求の範囲】
【請求項１】
プログラミング装置とプログラマブルコントローラとを有するＰＬＣシステムであって、
前記プログラミング装置は、
任意の図形言語プログラムのソースコードを、該ソースコードを構成する各図形要素の展開順序を決定しつつ該展開順序に従ってコンパイルして第一の機械語オブジェクトを生成すると共に、少なくとも前記各図形要素の展開順序を記憶手段に記憶する第一のコンパイラ手段と、
前記ソースコードを、前記記憶手段に記憶された前記各図形要素の展開順序を参照して、該展開順序に従ってコンパイルして第二の機械語オブジェクトを生成する第二のコンパイラ手段と、
前記第一の機械語オブジェクトと前記第二の機械語オブジェクトとを、前記プログラマブルコントローラにダウンロードするダウンロード手段とを有し、
前記第一の機械語オブジェクトと前記第二の機械語オブジェクトの何れか一方は、通常のコンパイル処理によって生成される、デバッグ可能な機械語オブジェクトである非最適化機械語オブジェクトであり、他方は最適化コンパイル処理によって生成される、最適化された機械語オブジェクトである最適化機械語オブジェクトであることを特徴とするＰＬＣシステム。
【請求項２】
前記プログラマブルコントローラは、
通常時は前記最適化機械語オブジェクトを実行し、デバッグ時には前記非最適化機械語オブジェクトに切り替えて実行するプログラム実行手段を有することを特徴とする請求項１記載のＰＬＣシステム。
【請求項３】
前記第一のコンパイラ手段は、前記第一の機械語オブジェクト生成の際に、前記ソースコードから一旦中間言語を生成した後に該中間言語から前記第一の機械語オブジェクトを生成するものであって、該中間言語生成の際に前記各図形要素を展開順序の決定と前記記憶手段への記憶を行い、
前記第二のコンパイラ手段は、前記第二の機械語オブジェクト生成の際に、前記ソースコードから一旦中間言語を生成した後に該中間言語から前記第二の機械語オブジェクトを生成するものであって、該中間言語生成の際に前記記憶手段に記憶された前記各図形要素の展開順序を参照して該中間言語の生成を行うことを特徴とする請求項１または２に記載のＰＬＣシステム。
【請求項４】
前記第一のコンパイラ手段は、更に、前記コンパイルの際にソースコードの各変数に割当てたメモリアドレスの情報を前記記憶手段に記憶し、
前記第二のコンパイラ手段は、前記コンパイルの際に更に、該記憶されたメモリアドレス情報を参照することで、前記各変数に前記第一のコンパイラ手段と同じメモリアドレスを割当てることを特徴とする請求項１〜３の何れかに記載のＰＬＣシステム。
【請求項５】
前記プログラマブルコントローラは、
前記最適化機械語オブジェクトを保持する第一の記憶領域と、
前記非最適化機械語オブジェクトを保持する第二の記憶領域と、
前記最適化機械語オブジェクトの格納アドレスまたは前記非最適化機械語オブジェクトの格納アドレスを登録するアドレステーブルと、
該アドレステーブルに登録されている格納アドレスに応じて、前記最適化機械語オブジェクトと前記非最適化機械語オブジェクトの何れか一方を実行する前記プログラム実行手段と、
前記アドレステーブルに前記最適化機械語オブジェクトの格納アドレスを登録することで、前記プログラム実行手段に前記最適化機械語オブジェクトを実行させる最適化機械語オブジェクト実行手段と、
前記プログラミング装置からのデバッグ指示に応じて前記アドレステーブルに前記非最適化機械語オブジェクトの格納アドレスを登録することで、前記プログラム実行手段に前記非最適化機械語オブジェクトを実行させるデバッグ制御手段と、
を更に有することを特徴とする請求項１〜４の何れかに記載のＰＬＣシステム。
【請求項６】
前記プログラマブルコントローラは、
前記プログラミング装置から前記最適化機械語オブジェクト、前記非最適化機械語オブジェクトがダウンロードされると、受信した最適化機械語オブジェクトは前記第一の記憶領域内に格納すると共に該格納アドレスを前記アドレステーブルに登録し、受信した非最適化機械語オブジェクトは前記第二の記憶領域内に格納するオブジェクト転送手段を更に有することを特徴とする請求項５記載のＰＬＣシステム。
【請求項７】
前記プログラミング装置は、前記デバッグ指示を前記プログラマブルコントローラへ送信すると共に、これに伴って、任意に設定された前記非最適化機械語オブジェクトの実行の停止位置を示すブレーク位置情報も前記プログラマブルコントローラへ送信するデバッグ指示手段を更に有し、
前記プログラマブルコントローラにおいて、
前記デバッグ制御手段は、前記デバッグ指示と共に前記ブレーク位置情報を受信すると、前記非最適化機械語オブジェクトにおいて、該ブレーク位置情報に応じた所定位置に、機械語オブジェクトの実行を停止するためのブレーク命令を挿入し、
前記プログラム実行手段は、前記非最適化機械語オブジェクトの実行中には、前記ブレーク命令の実行に伴い、該非最適化機械語オブジェクトの実行を停止すると共に該停止状態を前記プログラミング装置へ送信することを特徴とする請求項５または６記載のＰＬＣシステム。
【請求項８】
前記最適化機械語オブジェクトは、ＰＯＵ単位で前記第一の記憶領域に保持され、
前記非最適化機械語オブジェクトも、ＰＯＵ単位で前記第二の記憶領域に保持され、
前記プログラム実行手段は、前記デバッグ時に、任意のＰＯＵに関してのみ前記非最適化機械語オブジェクトに切り替えて実行することを特徴とする請求項５〜７の何れかに記載のＰＬＣシステム。
【請求項９】
プログラミング装置とプログラマブルコントローラとを有するＰＬＣシステムにおける前記プログラミング装置であって、
任意の図形言語プログラムのソースコードを、該ソースコードを構成する各図形要素を展開順序を決定しつつ該展開順序に従ってコンパイルして第一の機械語オブジェクトを生成すると共に、少なくとも前記各図形要素の展開順序を記憶手段に記憶する第一のコンパイラ手段と、
前記ソースコードを、前記記憶手段に記憶された前記各図形要素の展開順序を参照して、該展開順序に従ってコンパイルして第二の機械語オブジェクトを生成する第二のコンパイラ手段と、
前記第一の機械語オブジェクトと前記第二の機械語オブジェクトとを、前記プログラマブルコントローラにダウンロードするダウンロード手段とを有し、
前記第一の機械語オブジェクトと前記第二の機械語オブジェクトの何れか一方は、通常のコンパイル処理によって生成される、デバッグ可能な機械語オブジェクトである非最適化機械語オブジェクトであり、他方は最適化コンパイル処理によって生成される、最適化された機械語オブジェクトである最適化機械語オブジェクトであることを特徴とするＰＬＣシステムのプログラミング装置。
【請求項１０】
プログラミング装置とプログラマブルコントローラとを有するＰＬＣシステムにおける前記プログラミング装置のコンピュータを、
任意の図形言語プログラムのソースコードを、該ソースコードを構成する各図形要素を展開順序を決定しつつ該展開順序に従ってコンパイルして第一の機械語オブジェクトを生成すると共に、少なくとも前記各図形要素の展開順序を記憶手段に記憶する第一のコンパイラ手段と、
前記ソースコードを、前記記憶手段に記憶された前記各図形要素の展開順序を参照して、該展開順序に従ってコンパイルして第二の機械語オブジェクトを生成する第二のコンパイラ手段と、
前記第一の機械語オブジェクトと前記第二の機械語オブジェクトの何れか一方は、通常のコンパイル処理によって生成される、デバッグ可能な機械語オブジェクトである非最適化機械語オブジェクトであり、他方は最適化コンパイル処理によって生成される、最適化された機械語オブジェクトである最適化機械語オブジェクトであり、該非最適化機械語オブジェクトと該最適化機械語オブジェクトとを、前記プログラマブルコントローラにダウンロードするダウンロード手段、
として機能させるためのプログラム。
【請求項１１】
プログラミング装置とプログラマブルコントローラとを有するＰＬＣシステムの前記プログラミング装置におけるデバッグ方法であって、
任意の図形言語プログラムのソースコードを、該ソースコードを構成する各図形要素を展開順序を決定しつつ該展開順序に従ってコンパイルして第一の機械語オブジェクトを生成すると共に、少なくとも前記各図形要素の展開順序を記憶手段に記憶し、
前記ソースコードを、前記記憶手段に記憶された前記各図形要素の展開順序を参照して、該展開順序に従ってコンパイルして第二の機械語オブジェクトを生成し、
前記第一の機械語オブジェクトと前記第二の機械語オブジェクトの何れか一方は、通常のコンパイル処理によって生成される、デバッグ可能な機械語オブジェクトである非最適化機械語オブジェクトであり、他方は最適化コンパイル処理によって生成される、最適化された機械語オブジェクトである最適化機械語オブジェクトであることを特徴とするデバッグ方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラシステムに係わり、特にプログラムのデバッグ方法に関する。
【背景技術】
【０００２】
従来、プログラマブルコントローラ（ＰＬＣ）に係るシステムとして、例えば、プログラマブルコントローラ本体（ＰＬＣ本体と記す）と、このＰＬＣ本体で実行するプログラム（特に各種制御対象機器の制御プログラム等；以下、ＰＬＣプログラムと記す）をユーザが任意に作成できるように支援する支援装置等から成るプログラマブルコントローラシステムが知られている。
【０００３】
この様な支援装置（プログラミング装置）において、ユーザは、例えばニーモニック言語、あるいはラダー言語、ＦＢＤ言語等の図形言語プログラムを用いて、任意のＰＬＣプログラムを作成する。そして、作成されたＰＬＣプログラムは、支援装置内でコンパイルされて機械語オブジェクトが生成される。支援装置は、この機械語オブジェクトを、ＰＬＣ本体にダウンロードする。ＰＬＣ本体は、ダウンロードされた機械語オブジェクトを記憶する。
【０００４】
その後、ＰＬＣ本体は、この機械語オブジェクトを実行して各種制御対象機器の制御等を行う。あるいは、ＰＬＣ本体側で機械語オブジェクトを実行しつつ支援装置側でこれをモニタする形式のデバッグ（実機デバッグ等という）が行われる場合もある。
【０００５】
上記ＰＬＣ本体における制御処理等の高速化を図るため、上記支援装置におけるＰＬＣプログラムのコンパイル時に最適化を行なう方法が提案されている。しかし、最適化された機械語オブジェクト（以降、最適化機械語オブジェクトと記す）は、最適化の際にプログラムの実行順序の変更や不要な変数など（ブレークポイント等も含まれる）の削除等が行われて成るものである為、ソースコード上でデバッグすることが困難となる。
【０００６】
ここで、以下、上記最適化について説明しておく。
最近では、プログラムサイズの肥大化、システムの複雑化に伴い、ユーザアプリケーションの高速化が望まれており、ハードウェアだけでなくソフトウェア（コンパイラ）による高速化が実現されている。
【０００７】
この様な最適化コンパイルの具体例を以下に示す。
例えば、まず「Ｃ＝Ａ＋Ｂ」が実行され、続いて「Ｆ＝（Ａ＋Ｂ）×Ｄ」が実行されるソースコードがあった場合、これをコンパイルすると、まず「Ｃ＝Ａ＋Ｂ」に関しては最適化困難なため通常のコンパイルが行われ、下記の機械語オブジェクトが生成される。
【０００８】
ＬＤ    Ａ
ＡＤＤ  Ｂ
ＳＴ    Ｃ
次に、「Ｆ＝（Ａ＋Ｂ）×Ｄ」関しては、最適化コンパイルが可能であり、コンパイルの結果、例えば（Ａ＋Ｂ）の部分が「ＬＤ    Ｃ」となる。例えばこの様にして、不要な変数や演算の削除が行われる。この様にして作成された機械語オブジェクト（最適化機械語オブジェクト）は、その実行の際に、Ａ＋Ｂに係る演算を行う必要がなく、変数Ｃの値のロードを行えば済むので、処理の高速化が図れる。
【０００９】
また、最適化コンパイルでは、ソースコードにブレークポイントが設定されている場合、これを削除する場合がある。
ここで、上記のように最適化機械語オブジェクトではソースコード上でデバッグすること（所謂“ソースコードレベルデバッグ／ソースコードデバッグ”）が困難となる問題に対して、例えば下記の従来技術が知られている。
【００１０】
すなわち、従来、上記最適化機械語オブジェクトを入力し、この最適化機械語オブジェクトを逆コンパイルしてソースコードでデバッグするためのデバッグ用ソースコードを生成し、このデバッグ用ソースコードとシンボル情報などを用いてソースコード上でデバッグするようにしたソースコードレベルデバッグ装置が提案されている（例えば特許文献１参照）。
【００１１】
また、特許文献２に記載の従来技術が知られている。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開平６−２４２９４２号公報
【特許文献２】特開２００２−９９３１２号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
しかしながら、上記特許文献１に記載の従来例にあっては、デバッグの都度、最適化機械語オブジェクトを逆コンパイルしてデバッグ用のソースコードを生成する必要があり、このため作業が煩雑になり、デバッグの効率がよくないという問題がある。
【００１４】
また、上記ニーモニック言語の場合は問題ないが、上記ラダー言語、ＦＢＤ言語等の図形言語プログラムの場合、コンパイルの際に各図形要素をどの順番でコンパイルするのかをコンパイラが決定するが、必ずしもユーザが意図した通りの順番で図形要素が展開されてコンパイルされるとは限らない。
【００１５】
本発明の課題は、任意のソースコードに対して２つのコンパイラによって通常の機械語オブジェクトと最適化機械語オブジェクトの両方を生成すると共に、その際にこれら２つのコンパイラで図形要素の展開順番を一致させることで、デバッグ時に逆コンパイル等を行う必要なく且つシステム動作を不安定にすることなく、ソースコードレベルデバッグを行えるようにするプログラマブルコントローラシステム、そのプログラミング装置、プログラマブルコントローラ等を提供することである。
【課題を解決するための手段】
【００１６】
本発明のＰＬＣシステムは、プログラミング装置とプログラマブルコントローラとを有するＰＬＣシステムであって、前記プログラミング装置は、任意の図形言語プログラムのソースコードを、該ソースコードを構成する各図形要素の展開順序を決定しつつ該展開順序に従ってコンパイルして第一の機械語オブジェクトを生成すると共に、少なくとも前記各図形要素の展開順序を記憶手段に記憶する第一のコンパイラ手段と、前記ソースコードを、前記記憶手段に記憶された前記各図形要素の展開順序を参照して、該展開順序に従ってコンパイルして第二の機械語オブジェクトを生成する第二のコンパイラ手段と、前記第一の機械語オブジェクトと前記第二の機械語オブジェクトとを、前記プログラマブルコントローラにダウンロードするダウンロード手段とを有する。
【００１７】
上記構成のＰＬＣシステムにおいて、例えば、前記第一の機械語オブジェクトと前記第二の機械語オブジェクトの何れか一方は、通常のコンパイル処理によって生成される、デバッグ可能な機械語オブジェクトである非最適化機械語オブジェクトであり、他方は最適化コンパイル処理によって生成される、最適化された機械語オブジェクトである最適化機械語オブジェクトである。
【００１８】
任意の図形言語プログラムのソースコードに対して、２種類のコンパイラ手段によって２種類の機械語オブジェクトを生成すると共に、その際の各図形要素の展開順序が同じくなるようにする。生成した２種類の機械語オブジェクトは、プログラマブルコントローラにダウンロードする。
【００１９】
プログラマブルコントローラ側では、例えば通常時は上記最適化機械語オブジェクトを実行し、デバッグ時には上記非最適化機械語オブジェクトに切り替えて実行する。上記のように、コンパイルの際に各図形要素の展開順序が同じくなるようにしているので、２種類の機械語オブジェクトで相互に演算結果が異なるような事態にはならず、非最適化機械語オブジェクトに切り替えても問題なく動作する。
【発明の効果】
【００２０】
本発明のプログラマブルコントローラシステム、その支援装置、プログラマブルコントローラ等によれば、任意のソースコードに対して２つのコンパイラによって通常の機械語オブジェクトと最適化機械語オブジェクトの両方を生成すると共に、その際にこれら２つのコンパイラで図形要素の展開順番を一致させることで、デバッグ時に逆コンパイル等を行う必要なく且つシステム動作を不安定にすることなく、ソースコードレベルデバッグを行えるようになる。
【図面の簡単な説明】
【００２１】
【図１】プログラマブルコントローラシステムの構成例であって特にプログラミング装置の構成例である。
【図２】プログラマブルコントローラシステムの構成例であって特にプログラマブルコントローラの構成図である。
【図３】プログラマブルコントローラシステムの機能構成図である。
【図４】プログラミング装置における支援処理の一例を示すフローチャート図である。
【図５】メニュー画面の一例である。
【図６】プログラマブルコントローラにおけるオブジェクト展開処理の一例を示すフローチャート図である。
【図７】プログラマブルコントローラにおけるデバッグ制御処理の一例を示すフローチャート図である。
【図８】送信される機械語オブジェクトの構成例である。
【図９】デバッグ時に送信されるデバッグ情報の一例である。
【図１０】機械語オブジェクトとアドレステーブルの展開を説明するための図である。
【図１１】デバッグ時のアドレステーブルの展開状態を示す図である。
【図１２】実施例２のプログラマブルコントローラシステムの機能構成例である。
【図１３】実施例２のコンパイラの処理動作の一例を示す図である。
【図１４】展開順番対応表の具体例を示す図である。
【図１５】（ａ）〜（ｃ）は、図形言語プログラムの具体例を示す図である。
【図１６】（ａ）は通常時、（ｂ）はデバッグ時のアドレステーブルの展開状態を示す図である。
【発明を実施するための形態】
【００２２】
以下、図面を参照して、本発明の実施の形態について説明する。
図１、図２は、本例のプログラマブルコントローラシステムの構成例である。特に図１はプログラミング装置の詳細構成例を示し、図２はプログラマブルコントローラの詳細構成例を示すものである。
【００２３】
図１、図２に示すように、本例のプログラマブルコントローラシステムは、任意の制御機器３００を制御するものであって、プログラミング装置１００、プログラマブルコントローラ（以下、ＰＬＣ（プログラマブル・ロジック・コントローラ）という）２００等を有する。プログラミング装置１００とＰＬＣ２００とは信号線４００により接続されている。ＰＬＣ２００は、制御対象となる各種機器である制御機器３００に接続されている。ＰＬＣ２００は、シーケンス制御プログラム等を実行して制御機器３００を制御する。
【００２４】
プログラミング装置１００は、概略的には、ユーザが任意のシーケンス制御プログラム（そのソースコード）を作成するのを支援する機能や、作成されたソースコードをコンパイルして機械語オブジェクトを生成する機能や、生成した機械語オブジェクトを信号線４００を介してＰＬＣ２００にダウンロードする機能等を有する。
【００２５】
上記ユーザが作成するシーケンス制御プログラム（ソースコード）は、通常、例えばニーモニック言語、あるいはラダー言語、ＦＢＤ言語等の図形言語プログラムを用いて作成される。プログラミング装置１００の機能については、詳しくは後述するものとする。
【００２６】
プログラミング装置１００のハードウェア構成例は、例えば図１に示すように、中央演算処理装置（ＣＰＵ）１０１、内部メモリ１０４、記憶装置１０５、マウスやキーボード等である入力装置１０２、ディスプレイ等である表示器１０３、入出力インタフェース（Ｉ／Ｏ）１０６などから構成され、これらが共通バス１０７に接続されている。
【００２７】
記憶装置１０５には、各種のデータが記憶されている。入力装置１０２は、オペレータによって外部から操作されるマウスやキーボード等からの入力イベントを、ＣＰＵ１０１に通知する。また、記憶装置１０５には、予め、所定のアプリケーションプログラムが記憶されている。記憶装置１０５は、例えばハードディスク装置等である。
【００２８】
表示器１０３は、例えば液晶ディスプレイ等からなり、例えば入力イベント等に応じて、各種データや画像を表示する。Ｉ／Ｏ１０６は、信号線４００と接続している。ＣＰＵ１０１は、Ｉ／Ｏ１０６、信号線４００を介して、ＰＬＣ２００との通信（データの送受信）を行う。
【００２９】
ＣＰＵ１０１は、記憶装置１０５に記憶されている上記アプリケーションプログラムを、例えば内部メモリ１０４に読出し・実行することにより、各種処理機能（例えば後述する図３のユーザインタフェース部１１やコンパイラ１２の処理機能；あるいは例えば後述する図１２のインタフェース機能部６１やコンパイラ６２の処理機能等）を実現する。これらについては、後に、図３や図１２を参照して詳細に説明するが、ユーザインタフェース部１１やインタフェース機能部６１は、基本的には既存の処理機能であってよく、ユーザが任意のシーケンス制御プログラム（ソースプログラム）を作成するのを支援する処理機能である。このソースプログラムは、本例では上記の通り、例えばニーモニック言語、あるいはラダー言語、ＦＢＤ言語等の図形言語を用いて作成されるものである。
【００３０】
また、ＣＰＵ１０１は、上記ユーザによってプログラミングされたシーケンス制御プログラム（ソースプログラム）をコンパイルして、ＰＬＣ２００側（後述する図２のＣＰＵ２１１）が直接実行可能な実行コード（機械語オブジェクト）に変換する処理機能も有する。この処理機能自体は、既存の処理であってよいが、コンパイラ１２やコンパイラ６２では、更に、後述する処理機能も有する。詳しくは後述する。
【００３１】
また、ＣＰＵ１０１は、ＰＬＣ２００に対する動作指示（コマンド／データ等；パラメータ等も含む場合もある）を、Ｉ／Ｏ１０６を介してＰＬＣ２００に送信したり、ＰＬＣ２００で実行させる上記シーケンス制御プログラム（機械語オブジェクト）を、Ｉ／Ｏ１０６を介してＰＬＣ２００にダウンロードする処理機能等も有する。
【００３２】
尚、各種処理は、例えば記憶装置１０５から各種データを読み出しながら、あるいは記憶装置１０５に各種のデータを書き込みながら、実行されるものである場合もある。
上記シーケンス制御プログラムの実行コード（機械語オブジェクト）が、Ｉ／Ｏ１０６を介してＰＬＣ２００にダウンロードされることにより、ＰＬＣ２００側の図２に示すＣＰＵモジュール２１０は、ユーザプログラムメモリ２１３などに保持されていたシーケンス制御プログラムの実行コード（旧バージョン等）を、ダウンロードされた実行コード（新バージョン等）に更新することができる。
【００３３】
ＰＬＣ２００のハードウェア構成例は、例えば図２に示すように、ＣＰＵモジュール２１０、入出力モジュール２２２等を有するものである。
このＣＰＵモジュール２１０は、図２に示す例では、ＣＰＵ２１１、システムプログラムメモリ（ＦＬＡＳＨ）２１２、ユーザプログラムメモリ（ＲＡＭ）２１３、ＰＬＣ固有バスインタフェース２１４、ユーザデータメモリ（ＲＡＭ）２１５、システムワークメモリ（ＲＡＭ）２１６、ドライバ／レシーバ２１７等を有し、これらがバス２１８に接続されている。
【００３４】
また、ＣＰＵモジュール２１０は、ＰＬＣ固有バスインタフェース２１４を介して、入出力モジュール２２２と接続される。入出力モジュール２２２は、制御機器３００に接続されている。ＣＰＵ２１１は、ＰＬＣ固有バスインタフェース２１４、入出力モジュール２２２等を介して、制御機器３００との通信（データ入出力）を行える。また、ＣＰＵ２１１は、ドライバ／レシーバ２１７等を介して、プログラミング装置１００との通信を行える。
【００３５】
また、ＰＬＣ２００は、パワーオンまたはリセットスタート後、システムの初期化を経て、ユーザプログラムメモリ２１３に保持された上記シーケンス制御プログラム（実行コード；機械語オブジェクト）を、サイクリックに実行して、所定の制御周期で制御機器３００の制御を行うように構成されている。
【００３６】
図２に示す構成自体は、既存のＰＬＣの一般的な構成であるので、これ以上詳細には説明しないが、例えばユーザプログラムメモリ２１３には、予め所定のアプリケーションプログラムが記憶されており、ＣＰＵ２１１がこのアプリケーションプログラムを読出し・実行することにより、例えば図３に示す各種機能部（オブジェクト展開部２５、デバッグ制御部２６、プログラム実行部２７など）の処理が実現される。また、図３のアドレステーブル２４は、例えばユーザデータメモリ２１５に記憶されるものであるが、この例に限らない。
【００３７】
図３は、上記プログラマブルコントローラシステムの機能構成図である。
プログラミング装置１００（プログラミングローダ）は、上記の通り、ユーザによって任意のプログラム・ソースコード（上記シーケンス制御プログラムのソースプログラム等）を作成させる支援機能（図示のユーザインタフェース部１１）や、このソースコードを機械語オブジェクトに変換するコンパイル機能（図示のコンパイラ１２）を備える。
【００３８】
プログラミング装置１００によってコンパイルされて生成される上記機械語オブジェクト（実行コード）は、ＰＬＣ２００などのターゲットにダウンロードされる（不図示のダウンロード機能によるものとする）。
【００３９】
ユーザは、ユーザインタフェース部１１によって、ニーモニック言語、あるいはラダー言語、ＦＢＤ言語等の図形言語で、任意のシーケンス制御プログラム（ソースコード）を記述・作成する。ユーザインタフェース部１１は、作成されたソースコードをコンパイラ１２に渡す。
【００４０】
コンパイラ１２は、渡されたソースコードをコンパイルして２種類の機械語オブジェクトを生成して記憶する。すなわち、コンパイラ１２は、渡されたソースコードをコンパイルして、最適化機械語オブジェクト１３を生成・出力すると共に、非最適化機械語オブジェクト１５も生成・出力し、これらを不図示の記憶領域に格納する。その後、これら最適化機械語オブジェクト１３および非最適化機械語オブジェクト１５は、それぞれ通信部１４を介してＰＬＣ２００へダウンロードされる。
【００４１】
最適化機械語オブジェクト１３は、上記背景技術で説明した通りであり、最適化の際にプログラムの実行順序の変更や不要な変数の削除等が行われて成るものである。一方、非最適化機械語オブジェクト１５は、最適化が行われない、通常のコンパイルによって生成される機械語オブジェクトであり、従って上記実機デバッグによるソースコードレベルデバッグが可能となるものである。
【００４２】
ＰＬＣ２００にダウンロードされるデータパケット（機械語オブジェクト含む）は、図８に示すように、識別番号４１、種別４２、機械語オブジェクト（機械語オブジェクト本体）４３で構成される。
【００４３】
識別番号４１は、例えばコンパイラ１２が、上記生成した機械語オブジェクト（最適化機械語オブジェクト１３および非最適化機械語オブジェクト１５）に付与する任意の番号（例えばシリアル番号等であってよい）であり、ソースコードに対して一意に識別するための識別子である。これは、例えば、同一のソースコードから生成された最適化機械語オブジェクト１３と非最適化機械語オブジェクト１５は、その識別番号が同一となるようにする。あるいは、識別番号は、各ソースコード（特にＰＯＵ）毎に固有のユニークなＩＤであり、これより、任意のソースコードから生成される機械語オブジェクトには（それが最適化であっても非最適化であっても）生成元のソースコードの識別番号が付与されるものと考えても良い。これによって、例えば後に図１０、図１１で説明する例のようになる（詳しくは後述する）。
【００４４】
機械語オブジェクト４３は、上記コンパイラ１２によって生成された機械語オブジェクトそのものであり、最適化機械語オブジェクト１３または非最適化機械語オブジェクト１５である。
【００４５】
種別４２は、機械語オブジェクト４３が上記最適化機械語オブジェクト１３と非最適化機械語オブジェクト１５のどちらであるのかを示す種別コードである。ここでは、機械語オブジェクト４３は、種別４２＝‘１’の場合には最適化機械語オブジェクト１３であり、種別４２＝‘２’の場合には非最適化機械語オブジェクト１５であるものとする。
【００４６】
尚、後に図１０、図１１に示すように、上記データパケットには基本的に、同一のソースコードから生成された最適化機械語オブジェクト１３と非最適化機械語オブジェクト１５の両方が格納されるものである。
【００４７】
尚、プログラミング装置１００−ＰＬＣ２００間の通信は、図示の通信部１４、通信部２１を介して行われる。
一方、ＰＬＣ２００は、図３に示すオブジェクト展開部２５、デバッグ制御部２６、プログラム実行部２７等の各種機能部を有する。
【００４８】
上記オブジェクト展開部２５は、プログラミング装置１００が送信した上記データパケットを通信部２１により受信すると、このデータパケットの種別４２が‘１’である場合には、その機械語オブジェクト４３を最適化機械語オブジェクト２２としてユーザプログラムメモリ２１３に格納する。一方、受信した上記データパケットの種別４２が‘２’である場合には、その機械語オブジェクト４３を非最適化機械語オブジェクト２３としてユーザプログラムメモリ２１３に格納する。また、オブジェクト展開部２５は、上記最適化機械語オブジェクト２２のユーザプログラムメモリ２１３上での格納アドレス（格納領域の先頭アドレスなど）を、アドレステーブル２４に書き込む（詳細は後述する）。
【００４９】
また、ＰＬＣ２００は、機械語オブジェクトを順次実行するプログラム実行部２７を有し、このプログラム実行部２７は、アドレステーブル２４に保持されたアドレスデータ（通常は上記最適化機械語オブジェクト２２の格納アドレス）を参照して、該アドレスデータを間接アドレス指定して、そのアドレス先に保持された機械語オブジェクトを実行するように構成されている。
【００５０】
プログラム実行部２７は、たとえば不図示のプログラム実行管理部によって所定の周期毎に呼び出されることで（コールされて）、前述のようにサイクリックに制御を実行するが、この例に限らない。上記の通り、通常時（ＰＬＣ運用時）には、アドレステーブル２４には最適化機械語オブジェクト２２の格納アドレスが書き込まれているため、プログラム実行部２７は最適化機械語オブジェクト２２を実行することになる。
【００５１】
一方、デバッグ時には、プログラミング装置１００からデバッグ開始通知が送信されてくる。このデバッグ開始通知を受信したＰＬＣ２００は、デバッグ制御部２６によって、アドレステーブル２４のアドレスデータを、非最適化機械語オブジェクト２３の格納アドレス（格納領域の先頭アドレスなど）に書き換える。よって、デバッグ時には、プログラム実行部２７が、上記のようにアドレステーブル２４のアドレスデータを参照して機械語オブジェクトを実行すると、非最適化機械語オブジェクト２３を実行することになる。
【００５２】
その後、デバッグの終了時には、プログラミング装置１００からデバッグ完了通知が送信されてくる。このデバッグ完了通知を受信したＰＬＣ２００は、デバッグ制御部２６によって、アドレステーブル２４のアドレスデータを、最適化機械語オブジェクト２２の格納アドレスに書き換える。つまり、通常時の状態（最適化機械語オブジェクト２２が実行される状態）に戻すものである。
【００５３】
このようにして、ＰＬＣ２００は、通常時とデバッグ時とで、実行する機械語オブジェクトとを切り替えている。つまり、通常時には最適化された機械語オブジェクトを実行し、デバッグ時には最適化されない（デバッグ可能な）機械語オブジェクトを実行する。
【００５４】
すなわち、通常時は最適化機械語オブジェクト２２の格納アドレスをアドレステーブル２４に登録し、デバッグ時には非最適化機械語オブジェクト２３の格納アドレスをアドレステーブル２４に登録することにより、通常時とデバッグ時とで機械語オブジェクトを切り替えて実行することができる。これによって、通常時は最適化機械語オブジェクトを実行するＰＬＣ２００のデバッグ作業が極めて容易になる。詳しくは後述する。
【００５５】
ここで、プログラミング装置１００の具体的な処理例について説明する。
図４は、プログラミング装置における支援処理の一例を示すフローチャート図である。
尚、図４の処理は、プログラミング装置１００において図３には示していない不図示の全体制御部が行うものとして説明する。
【００５６】
図４に示す処理例では、上記全体制御部は、まず、所定の処理メニューを表示する（ステップＳ１）。これは、任意のソースコードが作成される毎に表示してもよいし、ユーザの指示に応じて表示してもよい。
【００５７】
図５は、この処理メニューの一例である。
図５の例の処理メニュー画面上には、少なくとも、コンパイル開始ボタン３１、デバッグ開始ボタン３２、終了ボタン３３、デバッグ終了ボタン３４の各種コマンドボタンが配置されている。ユーザがマウス、キーボード等の入力装置１０２を操作して、これらボタン３１〜３４のうちの任意のボタンを選択することで、所望のコマンドを選択・指定することができる。
【００５８】
そして、上記全体制御部は、コンパイル開始ボタン３１が選択されたか否かを判定する（ステップＳ２）。もし、コンパイル開始ボタン３１が選択されていない場合には（ステップＳ２，ＮＯ）、続いて、デバッグ開始ボタン３２が選択されたか否かを判定する（ステップＳ６）。
【００５９】
コンパイル開始ボタン３１が選択された場合には（ステップＳ２，ＹＥＳ）、ステップＳ３〜Ｓ５の処理を実行する。すなわち、まず、ソースコードを最適化コンパイルして最適化機械語オブジェクト１３を生成する（ステップＳ３）。また、ソースコードを最適化せずにコンパイルして（通常のコンパイルを行って；非最適化コンパイルと言う場合もあるものとする）、通常の（デバッグ可能な）機械語オブジェクトとしての非最適化機械語オブジェクト１５を生成する（ステップＳ４）。そして、生成した最適化機械語オブジェクト１３及び非最適化機械語オブジェクト１５を、通信部１４を介してＰＬＣ２００にダウンロードする（ステップＳ５）。そして、ステップＳ６へ移行する。
【００６０】
ここで、プログラミング装置１００における上記コンパイラ１２は、例えば、最適化用のコンパイラと非最適化用のコンパイラの２つのコンパイラから成るものと見做してもよい。この例の場合、上記ステップＳ３では最適化用のコンパイラが動作し、上記ステップＳ４では非最適化用のコンパイラが動作することになる。
【００６１】
あるいは、上記コンパイラ１２は、例えば、上記ステップＳ３の最適化コンパイル機能と、上記ステップＳ４の非最適化コンパイル機能の２つの機能を有するものと見做してもよい。この例では、当然、コンパイラ１２は、最適化する機能によってステップＳ３の処理を行って最適化機械語オブジェクト１３を生成し、最適化しない機能によってステップＳ４の処理を行って非最適化機械語オブジェクト１５を生成することになる。但し、本質的には、この様な２つの機能を有するものは、上記２つのコンパイラから成るものと同じであると見做すことができる。
【００６２】
尚、上記２つの機能の例の場合、上記全体制御部は、例えばコンパイラ１２に対して所定のパラメータを与えることで、上記２つの機能（モード）を切り替えさせるようにしてもよい。つまり、例えば、最適化モードのパラメータをコンパイラ１２に与えることでステップＳ３の処理を実行させ、非最適化モードのパラメータをコンパイラ１２に与えることでステップＳ４の処理を実行させる。
【００６３】
上述したように、２つのコンパイラによって、あるいは１つのコンパイラをモードを切り替えて使用することで、最適化機械語オブジェクト１３及び非最適化機械語オブジェクト１５が、生成されることになる。
【００６４】
尚、最適化機械語オブジェクト１３及び非最適化機械語オブジェクト１５には、ソースコードに対して一意に識別するための上記識別番号が付与され、この識別番号とソースコードとの対応が容易に管理されるように、所定に対応表（不図示）が、上記コンパイル時に作成されるようにしてもよい。
【００６５】
次に、ステップＳ６以降の処理について説明する。
まず、上記の通り、ステップＳ６では、デバッグ開始ボタン３２が選択されたか否かを判定する。
【００６６】
そして、デバッグ開始ボタン３２が選択されたものではない場合には（ステップＳ６，ＮＯ）、ステップＳ１３に移行して、本処理（支援処理）を終了するか否かを判定する。この判定は、例えば、上記図５の処理メニューの終了ボタン３３が選択されたか否かを判定するものであり、もしユーザが終了ボタン３３を選択操作したならば（ステップＳ１３，ＹＥＳ）、本処理は終了する。一方、未だ終了ボタン３３が操作されないならば（ステップＳ１３，ＮＯ）ステップＳ１に戻る。
【００６７】
一方、ユーザによってデバッグ開始ボタン３２が選択されたならば（ステップＳ６，ＹＥＳ）、ステップＳ７〜Ｓ１２の処理を実行する。
すなわち、まず、デバッグ時にＰＬＣの処理を停止させるべき箇所（ユーザが任意に決める；通常、複数個所となる）に、それぞれ、“ブレークポイント”を設定させる（ステップＳ７）。これは、例えば不図示のブレークポイント設定画面を表示する等して、この画面上でユーザに所望の“ブレークポイント”箇所を設定させる。
【００６８】
尚、“ブレークポイント”の設定については後述するが、“ブレークポイント”とは、ソースコードにおける任意の位置に相当する箇所でプログラム実行を一時中止（一旦停止）させるための一種のマーカー（識別子）であり、その実現方法はどの様な形式であっても構わない。以降の説明では、一例として、ブレークポイント処理コード（ブレーク命令）を挿入する方法を用いるものとする。
【００６９】
続いて、ＰＬＣ２００に対してデバッグ開始通知を送信する（ステップＳ８）。尚、このデバッグ開始通知には、例えば後述する図９のデバッグ情報（デバッグ対象となる機械語オブジェクトと“ブレークポイント”箇所の情報）が付加される。
【００７０】
そして、このデバッグ開始通知に対してＰＬＣ２００から処理完了通知が返信されてくるまで待機し、この処理完了通知を受信したら（ステップＳ９、ＹＥＳ）ステップＳ１０へ移行する。尚、上記処理完了通知は、ＰＬＣ２００側でブレークポイント処理コードの挿入処理（後述する）が完了したこと（ＰＬＣ２００側で準備完了したこと）を意味する通知である。
【００７１】
ステップＳ１０の処理は、“実機デバッグ”の為の既存の処理であり、ここでは特に詳細には説明しないが、例えばＰＬＣ２００の状態を表示して（例えばＰＬＣ２００がブレークしたときのステータス表示等）デバッグを行うための処理である。ユーザは、例えば各ブレークポイント毎のステータス表示を参照しながら所定のデバッグ作業を行い、デバッグ作業が完了したならば、図５のデバッグ終了ボタン３４を操作する。これにより、デバッグ処理終了と判定し（ステップＳ１１，ＹＥＳ）、ステップＳ１２の処理へ移行する。
【００７２】
ステップＳ１２の処理では、デバッグ完了通知を通信部１４を介してＰＬＣ２００へ送信する。そして、上記ステップＳ１３の判定処理を行う。
一方、ＰＬＣ２００は、例えば図６や図７に示す処理を実行する。
【００７３】
図６は、プログラマブルコントローラにおけるオブジェクト展開処理の一例を示すフローチャート図である。
図７は、プログラマブルコントローラにおけるデバッグ制御処理の一例を示すフローチャート図である。
【００７４】
まず、図６の処理について説明する。尚、図６の処理は、上記オブジェクト展開部２５の処理であると見做してもよい。上記ステップＳ５の処理によってプログラミング装置１００側から機械語オブジェクトがダウンロードされると、図６の処理が実行される。
【００７５】
すなわち、まず、受信した機械語オブジェクトが、最適化されたものであるか否かを判定する（ステップＳ２０）。これは既に述べたように、受信パケットの種別４２を参照して判定する。つまり、種別４２が‘１’である場合には最適化されたものであると判定して（ステップＳ２０，ＹＥＳ）ステップＳ２１へ移行する。種別４２が‘２’である場合には最適化されたものではないと判定して（ステップＳ２０，ＮＯ）ステップＳ２３へ移行する。
【００７６】
ステップＳ２１では、受信パケットの機械語オブジェクト４３を最適化機械語オブジェクト２２としてユーザプログラムメモリ２１３に格納する。これは、例えば、受信した機械語オブジェクト４３を、ユーザプログラムメモリ２１３内の不図示の最適化機械語オブジェクト保存領域（予め決められている；保存領域αとする）内の任意の格納領域に転送・格納するものである。更に、受信パケットの識別番号４１と上記機械語オブジェクト４３の転送先アドレス（格納アドレス；保存領域α内の格納領域の先頭アドレス等）とを対応付けて、不図示のバックアップ領域に記憶するようにしてもよい。
【００７７】
上記ステップＳ２１の処理に続いて、最適化機械語オブジェクトである上記機械語オブジェクト４３の転送先アドレス（格納アドレス；上記保存領域α内の格納領域の先頭アドレス等）を、アドレステーブル２４に書き込む（ステップＳ２２）ことで、本処理を終了する。
【００７８】
一方、上記のようにステップＳ２０の判定がＮＯの場合にはステップＳ２３を実行する。ステップＳ２３では、受信パケットの機械語オブジェクト４３を非最適化機械語オブジェクト２３としてユーザプログラムメモリ２１３に格納する。これは、例えば、機械語オブジェクト４３を、ユーザプログラムメモリ２１３内の不図示の非最適化機械語オブジェクト保存領域（予め決められている；保存領域βとする）内の任意の格納領域に転送・格納するものである。更に、受信パケットの識別番号４１と上記機械語オブジェクト４３の転送先アドレス（格納アドレス；保存領域β内の格納領域の先頭アドレス等）とを対応付けて、不図示のバックアップ領域に記憶するようにしてもよい。
【００７９】
次に、以下、図７のデバッグ制御処理について説明する。尚、図７の処理は、上記デバッグ制御部２６の処理であると見做してもよい。
図７の処理は、上記ステップＳ７やＳ８の処理に伴ってプログラミング装置１００側から送られてくるデバッグ開始通知（上記の通り、デバッグ情報（一例を図９に示す）が付加されている）を受信することで開始する。図９に示す例では、デバッグ情報は、識別番号５１とブレーク位置５２から成る。識別番号５１は、上記識別番号４１と同様であるが、ここでは特にデバッグ対象のソースコードに対応する機械語オブジェクトを示すＩＤを意味する。ブレーク位置５２は、例えば上記ステップＳ７で設定されたブレークポイントの位置を示す情報であり、複数あってもよい。
【００８０】
デバッグ制御部２６は、上記受信したデバッグ情報に基づいて、まず、上記不図示のバックアップ領域を参照することで、上記識別番号５１に対応する非最適化機械語オブジェクト２３の格納アドレス（保存領域β内の格納領域の先頭アドレス等）を取得する。そして、この格納アドレスをアドレステーブル２４に上書きする（ステップＳ３０）。これによって、プログラム実行部２７が最適化機械語オブジェクト２２を実行する状態から、非最適化機械語オブジェクト２３を実行する状態へと切り換わる。
【００８１】
続いて、上記ブレーク位置５２を参照してブレークポイントの位置を認識し、認識した位置にブレークポイント処理コード（ブレーク命令）を挿入する（ステップＳ３１）。そして、挿入処理が終了したか否かを判定する（ステップＳ３２）。つまり、ブレーク位置５２は複数あってもよいので、未処理のブレーク位置５２がある場合には挿入処理は未終了と判定して（ステップＳ３２，ＮＯ）ステップＳ３１に戻り、未処理のブレーク位置５２に関して上記ブレークポイント処理コードを挿入する処理を行う。
【００８２】
そして、全てのブレーク位置５２に関して挿入処理が終了したならば（ステップＳ３２，ＹＥＳ）、上記“処理完了通知”を通信部２１を介してプログラミング装置１００に送信する（ステップＳ３３）。
【００８３】
その後は、特に図示・説明は行わないが、ＰＬＣ２００において、上記ステップＳ１０のデバッグ処理に係る既存の処理（プログラム実行部２７による非最適化機械語オブジェクト２３の実行とブレークポイントにおける停止およびそのときの状態をプログラミング装置１００へ送信するなど）が実行される。
【００８４】
一方、デバッグ制御部２６自体は、プログラミング装置１００から上記デバッグ完了通知が送られてくるまで待機する（ステップＳ３４）。そして、プログラミング装置１００からの上記デバッグ完了通知を受信したならば（ステップＳ３４，ＹＥＳ）、アドレステーブル２４の格納内容を、最適化機械語オブジェクト２２の格納アドレスに変更して、本処理を終了する。
【００８５】
上記本例のプログラマブルコントローラシステムについて、以下、具体例を用いて更に詳細に説明する。
プログラミング装置１００を使用してＰＬＣ２００に機械語オブジェクトをダウンロードする為には、ユーザは、まず、プログラミング装置１００のユーザインタフェース部１１の上記機能によって、ニーモニック言語、あるいはラダー言語、ＦＢＤ言語等の図形言語で記述した、制御プログラムのソースコードを作成する。次に、ユーザは、作成したソースコードをコンパイルさせて機械語オブジェクトを生成させる。これは、例えば、プログラミング装置１００の表示器１０３に上記図５の処理メニュー画面を表示させて、上記コンパイル開始ボタン３１を選択・指示することで実現させる。この指示に応じて、コンパイラ１２は、上記ソースコードをコンパイルして上記最適化機械語オブジェクト１３を生成し、これを不図示の記憶領域に格納する。
【００８６】
最適化機械語オブジェクト１３は、例えばソースコードの実行順序の変更、レジスタの有効活用等が行われてコードサイズが縮小された（すなわち、最適化された）機械語オブジェクトである。最適化機械語オブジェクト１３は、例えばＰＯＵ（Program Organization Unit）毎に生成される。ＰＯＵとは、プログラム構成単位であり、ＰＬＣ２００の言語要素である。尚、ＰＯＵの種類は、アプリケーションプログラム、ファンクションブロック等があり、Ｃ言語における関数に相当するものである。
【００８７】
また、コンパイラ１２は、上記コンパイルの際、更に非最適化機械語オブジェクト１５も生成し、これを不図示の記憶領域に格納する。非最適化機械語オブジェクト１５は、上記のような最適化が行われていない機械語オブジェクトである（つまり、通常のコンパイル処理によって生成される通常の機械語オブジェクトであり、当然、ソースコードレベルの実機デバッグが可能となるものである）。非最適化機械語オブジェクト１５も、ＰＯＵ毎に生成される。
【００８８】
プログラミング装置１００は、上述したコンパイル処理が終了すると、上記生成した２種類の機械語オブジェクト（最適化機械語オブジェクト１３と非最適化機械語オブジェクト１５）を、通信部１４を介してＰＬＣ２００へダウンロードする。
【００８９】
このとき、既に述べたように例えば図８に示すように、各ＰＯＵ毎の機械語オブジェクトは、それぞれ、その機械語オブジェクト（本体）４３に、上記識別番号４１及び種別４２が付加されて、ＰＬＣ２００へダウンロードされる。
【００９０】
識別番号４１及び種別４２に関しては既に述べた通りであり、識別番号はソースコード毎に与えられるものと見做してよいが、ここではソースコードはＰＯＵ単位で扱うものとする。従って、ここでは識別番号は各ＰＯＵに固有の識別用ＩＤであると見做してもよい。これより、本例では、任意の１つのＰＯＵについて生成された２つの機械語オブジェクト（最適化機械語オブジェクト１３と非最適化機械語オブジェクト１５）には、同一の識別番号（そのＰＯＵの識別番号）が与えられる。
【００９１】
ＰＬＣ２００は、プログラミング装置１００からのデータパケット（上記機械語オブジェクト（本体）４３に、上記識別番号４１及び種別４２が付加されたパケット）を受信すると、その機械語オブジェクト４３をユーザプログラムメモリ２１３に格納すると共に、それが最適化された機械語オブジェクトである場合には、その格納アドレスをアドレステーブル２４に登録する。
【００９２】
ここで、例えば図１０に示すように、受信したデータパケット５５が、４つの機械語オブジェクト（５５ａ，５５ｂ，５５ｃ，５５ｄ）を含むものであったとする。図１０に示すように、これら４つの機械語オブジェクト（５５ａ，５５ｂ，５５ｃ，５５ｄ）それぞに、上記識別番号４１及び種別４２が付加されている。
【００９３】
ここでは仮に図１０に示すように、機械語オブジェクト５５ａ、５５ｂは、種別４２＝‘１’（つまり最適化機械語オブジェクト）であり、機械語オブジェクト５５ｃ、５５ｄは、種別４２＝‘２’（つまり非最適化機械語オブジェクト）であるものとする。また、機械語オブジェクト５５ａと５５ｃとが同じＰＯＵから生成されたものであり、同一の識別番号（識別番号１）が与えられている。同様に、機械語オブジェクト５５ｂと５５ｄとが同じＰＯＵから生成されたものであり、同一の識別番号（識別番号２）が与えられている。
【００９４】
また、ここでは、ユーザプログラムメモリ２１３における上記最適化機械語オブジェクト保存領域（保存領域α）は、０番地〜７ＦＦＦ番地であり、非最適化機械語オブジェクト保存領域（保存領域β）は、８０００番地以降であるものとする。
【００９５】
以上の具体例の場合、上記データパケット５５を受信したＰＬＣ２００は、まず、上記の通り機械語オブジェクト５５ａ、５５ｂは最適化機械語オブジェクトであると判別するので、これらを上記最適化機械語オブジェクト保存領域（保存領域α）に転送・格納する。これは、例えば識別番号４１を参照して識別番号順に（例えば番号が若い順に）格納するが、この例に限らない。また、本例では１０００番地区切りで管理するものとする。これより例えば図１０に示すように、機械語オブジェクト５５ａは先頭アドレス＝０番地の領域に格納され、機械語オブジェクト５５ｂは先頭アドレス＝１０００番地の領域に格納される（そして、通常は空き領域が生じることになる）。
【００９６】
更に、これら各格納領域の先頭アドレス（０番地と１０００番地）を、図示のように、アドレステーブル２４に登録する。すなわち、アドレステーブル２４の識別番号１用のアドレス欄には「００００」番地が格納され、識別番号２用のアドレス欄には「１０００」番地が格納される。また、これら各格納領域の先頭アドレス（０番地と１０００番地）は、その格納領域に格納された機械語オブジェクトの識別番号と対応付けされて、不図示のバックアップ領域に記憶される。
【００９７】
一方、上記の通り機械語オブジェクト５５ｃ、５５ｄは非最適化機械語オブジェクトであると判別されるので、これらを上記非最適化機械語オブジェクト保存領域（保存領域β）に転送・格納する。これも、例えば識別番号４１を参照して識別番号順に（例えば番号が若い順に）格納するが、この例に限らない。これより例えば図１０に示すように、機械語オブジェクト５５ｃは先頭アドレス＝８０００番地の領域に格納され、機械語オブジェクト５５ｄは先頭アドレス＝９０００番地の領域に格納される。
【００９８】
また、これら各格納領域の先頭アドレス（８０００番地と９０００番地）は、その格納領域に格納された機械語オブジェクトの識別番号と対応付けされて、不図示のバックアップ領域に記憶される。但し、これらは非最適化機械語オブジェクトであるので、上記アドレステーブル２４への登録は行われない（後に、デバッグ処理の際に一時的に登録される）。
【００９９】
尚、図示のように、機械語オブジェクト５５ａと５５ｃは両方とも識別番号が‘１’である。これは、同一のＰＯＵについて最適化コンパイルしたことで機械語オブジェクト５５ａが生成され、非最適化コンパイルしたことで機械語オブジェクト５５ｃが生成されたことを意味する。これは機械語オブジェクト５５ｂと５５ｄ（両方とも識別番号が‘２’）についても同様である。
【０１００】
上述したように、ＰＬＣ２００は、受信した複数の機械語オブジェクトを、最適化機械語オブジェクトと非最適化機械語オブジェクトとに分類したうえで、それぞれの保存領域（α、β）に例えば識別番号順に格納する。
【０１０１】
その後、ＰＬＣ２００は、アドレステーブル２４を参照して制御プログラム（機械語オブジェクト）を実行する。すなわち、アドレステーブル２４を参照して、該アドレステーブル２４のアドレスデータを間接アドレス指定して、機械語オブジェクトを実行する。通常時は、アドレステーブル２４には上記のように最適化機械語オブジェクト２２の格納アドレス（格納領域の先頭アドレス）が登録されているので、ＰＬＣ２００は最適化機械語オブジェクト２２を実行することになり、高速化が図られている。
【０１０２】
一方、ユーザは、デバッグを行う場合には、上記のようにプログラミング装置１００のメニュー画面上でデバッグ開始ボタン３２を選択・指定することで、デバッグ処理を開始させる。ユーザは、まず、所望のソースコードにブレークポイントを設定する。つまり、所望のソースコードをオープンして、任意の箇所（行など）にブレークポイントを設定する（複数個所に設定してもよい）。但し、このソースコードは、新規のものではなく、既にコンパイル済みでありその機械語オブジェクトをＰＬＣ２００へダウンロード済みであるプログラムのソースコードである。
【０１０３】
尚、上記識別番号は、ソースコードの識別用ＩＤであるものとする例に限らず、例えばソースコードをコンパイルして機械語オブジェクトを生成したときに、この機械語オブジェクトに対して生成・付与するものとしてもよい。但し、この場合でも既に述べた通り、同じソースコードから複数の（２つの）機械語オブジェクトが生成される場合には、この複数の（２つの）機械語オブジェクトには同一の識別番号が付与されることになる。
【０１０４】
ここで、プログラミング装置１００は、上記ソースコードをコンパイルした際に、そのファイル名（ソースコード名）と、これをコンパイルして得た機械語オブジェクトの識別番号とを対応付けるテーブル（不図示；ソースコード識別番号対応テーブルというものとする）を、不図示の記憶領域に保持している。これより、ユーザによって開かれているソースコードのソースコード名に対応する機械語オブジェクトの識別番号を、このソースコード識別番号対応テーブルを参照することで獲得できる。
【０１０５】
そして、獲得した識別番号と上記ユーザによるブレークポイント設定内容に基づいて、上記図９に示すデバッグ情報を生成する。すなわち、プログラミング装置１００は、上記ユーザによって指定されたブレークポイントの位置（行など）を認識して、これを図９のデバッグ情報のブレーク位置５２とすると共に、上記獲得した識別番号を識別番号５１とするデバッグ情報を生成する。そして、このデバッグ情報をＰＬＣ２００へ送信する。
【０１０６】
但し、上述したことは一例であり、識別番号は予め各ＰＯＵ毎に付与されているものであってもよい。
図１１に示す例では、上記デバッグ情報は、識別番号５１＝‘２’であり、ブレーク位置５２＝‘２’となっている。
【０１０７】
ここで、従来からある既存技術として、コンパイラは、例えばソースコードがニーモニック言語等である場合（換言すれば、図形言語プログラムではない場合）、ソースコードをコンパイルすることで、ソースコードの各行が、機械語オブジェクトのどの位置（どの行；但し、１対１の関係とは限らない）に変換されたのかを記録している。つまり、ソースコードの各行と、機械語オブジェクトの各位置（各行）との関連付けが可能となっている。
【０１０８】
これより、プログラミング装置１００において、ソースコードにおける上記ユーザによるブレークポイント設定位置（行）に対応する機械語オブジェクト上の位置（行）が分かるので、これを上記ブレーク位置５２とすることになる。よって、上記図１１の例のように、ブレーク位置５２＝‘２’となっている場合、これはソースコード上におけるブレークポイント設定位置に対応する機械語オブジェクト上の位置が、２行目であることを意味している(尚、ソースコード上におけるブレークポイント設定位置は、図１１だけを見ても分からない。例えば１行目かもしれないし２行目かもしれない)。
【０１０９】
また、上記のことは、ソースコードがニーモニック言語等である場合に限らず、図形言語プログラムである場合も、略同様である。すなわち、プログラミング装置１００は、ユーザが任意の図形言語プログラム（ソースコード）上の任意の位置（図形）にブレークポイントを設定すると、この位置（図形）に対応する機械語オブジェクト上の位置（行）が分かるので、これを上記ブレーク位置５２とすることになる。これは、例えば、任意の図形言語プログラム（ソースコード）を、一旦、中間コードに変換するが、その際、図形はある一定の規則で中間コードに変換できるので、図形の位置と、その図形が変換された中間コードの位置（行）とをコンパイラ１２が記録できる。よって、この図形言語プログラム（ソースコード）上にブレークポイント設定されていた場合、ソースコード上におけるブレークポイント設定位置（図形）に対応する中間コード上の位置（行）も、分かることになる。
【０１１０】
よって、この様な中間コード上のブレークポイント位置（行）を記録しておけば、後は、この中間コードを機械語オブジェクトに変換する際に、上記ニーモニック言語等の場合と略同様にして、機械語オブジェクト上でのブレークポイント位置（行）が分かるので、これを上記ブレーク位置５２とすることになる。
【０１１１】
ＰＬＣ２００は、この例のようなデバッグ情報を受信した場合、まず、その識別番号５１＝‘２’に応じて、アドレステーブル２４における識別番号‘２’用アドレス欄に保持されたアドレス「１０００」を、識別番号＝‘２’の非最適化機械語オブジェクトである非最適化機械語オブジェクト５５ｄが格納されたアドレスを指すように更新する（つまり、「９０００」に更新する）。尚、このアドレス「９０００」は、上記不図示のバックアップ領域を参照することで取得できる。上記の通り、上記ダウンロードされた非最適化機械語オブジェクトを保存領域βに転送・格納する際に、上記不図示のバックアップ領域に各非最適化機械語オブジェクトに関してその識別番号に対応付けてその格納アドレスが記憶されているので、これを参照することで、識別番号＝‘２’に対応する格納アドレス（ここでは「９０００」）が取得できる。
【０１１２】
ＰＬＣ２００は、このようにしてアドレステーブル２４における識別番号‘２’用アドレス欄を更新したら、続いて、上記識別番号‘２’の非最適化機械語オブジェクト５５ｄにおいて、上記デバッグ情報のブレーク位置５２によって示される箇所（行）に、ブレークポイント処理コード（ブレーク命令）を挿入する。図１１に示す例ではデバッグ情報のブレーク位置５２は‘２’であるので、非最適化機械語オブジェクト５５ｄの２行目にブレークポイント処理コードを挿入する。但し、ブレーク位置５２は１つとは限らず、複数個所あってもよく、それぞれについて該当する箇所（行）にブレークポイント処理コードを挿入する。
【０１１３】
そして、全ての該当箇所にブレークポイント処理コードを挿入したら、上記処理完了通知をプログラミング装置１００へ送信する。
その後、ＰＬＣ２００のプログラム実行部２７は、識別番号‘２’のＰＯＵに関しては、非最適化機械語オブジェクト２３（ここでは５５ｄ）を実行することになる。そして、このオブジェクト５５ｄを実行中に、ブレークポイント処理コード（上記例では２行目に挿入されている）を実行した時点で、当該オブジェクト５５ｄの実行を停止し、待機状態となる。そして、例えば、プログラムをブレーク（停止）したこと、及び所定のデータ（たとえばＣＰＵ２１１のレジスタ値や入出力モジュール２２２の入出力データなど）を、プログラミング装置１００へ送信する。
【０１１４】
尚、上記の通り、非最適化機械語オブジェクト２３を実行するのは識別番号‘２’のＰＯＵに関するものだけであり、それ以外のＰＯＵに関しては引き続き最適化機械語オブジェクト２２を実行することになる。
【０１１５】
プログラミング装置１００は、ＰＬＣ２００からの上記処理完了通知を受信した後は、例えば、ＰＬＣ２００から上記ブレーク時に送信される上記所定のデータ等の受信待ち状態となり、上記所定のデータ等を受信する毎に、このデータ（上記レジスタ値や入出力データなど）を表示器１０３に表示することで、ユーザにブレーク状態を通知する（デバッグ処理）。そして、ユーザは、デバッグ作業終了の際には上記デバッグ終了ボタン３４を選択・操作するので、これに応じてプログラミング装置１００は上記デバッグ完了通知をＰＬＣ２００へ送信する。
【０１１６】
上記デバッグ完了通知を受信したＰＬＣ２００は、アドレステーブル２４の格納内容を、デバッグ時用から通常用へ切り替える。すなわち、アドレステーブル２４における識別番号‘２’用アドレス欄に保持されている上記アドレス「９０００」を、元のアドレス「１０００」に戻す。これによって、識別番号‘２’のＰＯＵに関して、最適化機械語オブジェクト２２（５５ｂ）が実行される状態に戻る。ＰＬＣ２００は、更に、識別番号‘２’の非最適化機械語オブジェクト２３（５５ｄ）に挿入されたブレークポイント処理コードを削除する。上記の例では、非最適化機械語オブジェクト５５ｄの２行目に挿入されていたブレークポイント処理コードを削除する。このようにして、ＰＬＣ２００は、デバッグ状態から運用状態（通常時）に復帰する。これは、本例では、識別番号‘２’のＰＯＵに関しては最適化機械語オブジェクト２２の実行を再開し、それ以外のＰＯＵに関しては引き続き最適化機械語オブジェクト２２を実行することになる。
【０１１７】
尚、ＰＬＣ２００には、通常、複数のＰＯＵに対応する機械語オブジェクトが実装され、これら複数の機械語オブジェクトが連携して動作することで所定の制御処理が実行されるように構成されているため、運用状態からデバッグ状態への切り替えの際のアドレステーブル２４へのアドレスデータの登録や、デバッグ状態から運用状態に復帰する際のアドレステーブル２４へのアドレスデータの登録は、ＰＬＣ２００が制御機器３００を制御するための制御周期に同期して実行することが望ましい。
【０１１８】
以上説明した実施の形態を、実施例１とする。
ここで、上記実施例１のようにプログラミング装置側で１つのソースコードに対して２つのコンパイラによって最適化と非最適化の２種類の機械語オブジェクトを生成してＰＬＣ側にダウンロードし、ＰＬＣ側でこれら２種類の機械語オブジェクトの両方を実行する（実行時期は異なる）構成の場合、この２種類の機械語オブジェクトの実行論理（演算結果）が同一となることが必要となる。もし同一ソースコードに係わる２種類の機械語オブジェクトの演算結果が異なると、これら２種類の機械語オブジェクトを切り替えて実行した場合、システムの動作が不安定となり、ユーザに存在を与える可能性がある。
【０１１９】
しかしながら、ソースコードがニーモニック言語で記述される場合はともかく、ラダー言語、ＦＢＤ言語等の図形言語を用いてＰＬＣプログラム（複数の図形要素を任意の位置に配置して成るプログラム）を作成した場合、上記のように２つのコンパイラを用いる構成の場合、同一ソースコードに係わる２種類の機械語オブジェクトの演算結果が異なる可能性がある。つまり、コンパイルの際の図形要素の展開順番が演算結果に影響する（図形要素の展開順番が異なれば演算結果が異なる）可能性がある。
【０１２０】
この様になる原因は、図形言語の場合、図形要素の展開順番の基本的な規則は、上から下、左から右であるが、ユーザがフリーで自由に記述できるため、図形要素を様々な大きさと位置に配置でき、図形要素間の接続の組み合わせも自由にできるため、基本的な規則だけでは展開順番を一義的に確定させることができず、このため現実上、各コンパイラ独自の展開方法が存在するからである。
【０１２１】
このように、同一ソースコードを２つのコンパイラで別々にコンパイルして生成した２種類の機械語オブジェクトが、図形要素の展開順番が相互に異なることを主な原因として、その演算結果が異なることになる可能性がある。実施例２では、上記実施例１の構成においてこの様な問題が生じるのを防止するものである。
【０１２２】
以下、実施例２について詳細に説明する。
図１２は、実施例２のプログラマブルコントローラシステムの機能構成例である。
図示のプログラマブルコントローラシステムは、開発支援装置（ローダ）６０、ＰＬＣ（ターゲット）８０等から成る。
【０１２３】
開発支援装置６０は、上記プログラミング装置１００と略同様の機能を有すると共に、更に実施例２における機能（上記問題を解消するための機能）を有する。
開発支援装置６０は、インタフェース機能部６１、コンパイラ６２、通信機能部６３等の各種機能部を有する。尚、開発支援装置６０は、画面（ディスプレイ）６４、入力装置６５等も有する。
【０１２４】
インタフェース機能部６１と通信機能部６３は、図１のユーザインタフェース部１１、通信部１４と同じであってよく、これらの説明は省略するが、ユーザはユーザインタフェース部１１の機能によって、所望の制御プログラムのソースコード６６を作成することになる。
【０１２５】
コンパイラ６２も、基本的な機能は図１のコンパイラ１２と同じであってよい。すなわち、コンパイラ６２は、例えば２つのコンパイラから成り、任意のソースコード６６を入力して、２つのコンパイラそれぞれで、このソースコード６６に対応する機械語オブジェクトを生成する。これより、コンパイラ６２は、２種類の機械語オブジェクト（最適化機械語オブジェクト６７、デバッグ可能機械語オブジェクト６８）を生成する。
【０１２６】
最適化機械語オブジェクト６７、デバッグ可能機械語オブジェクト６８は、基本的には、上記図１の最適化機械語オブジェクト１３、非最適化機械語オブジェクト１５と略同様であってよい。すなわち、最適化機械語オブジェクト６７は、上記最適化機械語オブジェクト１３と同様、ソースコードを最適化コンパイルして生成されたものである。デバッグ可能機械語オブジェクト６８は、上記非最適化機械語オブジェクト１５と同様、ソースコードに対して通常のコンパイルを行って生成されたものである。
【０１２７】
但し、上記のことから最適化機械語オブジェクト１３と非最適化機械語オブジェクト１５とでは演算結果が異なる（その生成の際の図形要素の展開順番が異なる）場合があり得るが、最適化機械語オブジェクト６７とデバッグ可能機械語オブジェクト６８とでは常に演算結果は同じであり（その生成の際の図形要素の展開順番が同一である）、演算結果が異なる可能性はない。
【０１２８】
これを実現する為に、コンパイラ６２は、例えば最適化機械語オブジェクト６７生成の際に、その図形要素展開順番を示す展開順番対応表６９を生成しておく。そして、デバッグ可能機械語オブジェクト６８の生成の為のコンパイル処理の際に、この展開順番対応表６９を参照することで、最適化機械語オブジェクト６７の場合と同じ展開順番でコンパイル処理を実行できる。
【０１２９】
また、コンパイラ６２は、最適化機械語オブジェクト６７生成の際に、当然、各変数のメモリアドレス割付け処理（一般的な処理であり説明は省略する）も行うが、この様に各変数に割り付けたアドレス情報を、変数アドレス対応表７０に記憶するようにしてもよい。この場合、コンパイラ６２は、デバッグ可能機械語オブジェクト６８の生成の為のコンパイル処理の際に、この変数アドレス対応表７０を参照することで、各変数に対して最適化機械語オブジェクト６７の場合と同じメモリアドレスを割り付けることができる。
【０１３０】
尚、図示のソースコード識別番号対応表７１は、上記実施例１において説明した「ソースコード識別番号対応テーブル」と同じものと見做してよく、ここでは特に説明しないが、実施例１で説明したように、例えば、ソースコードのファイル名と、このソースコードの識別番号（または、このソースコードから生成された機械語オブジェクトに付与される識別番号）とを対応付けて記憶したものである。
【０１３１】
上記生成された２種類の機械語オブジェクト（最適化機械語オブジェクト６７、デバッグ可能機械語オブジェクト６８）は、ＰＬＣ８０にダウンロードされる。尚、ダウンロードの際のデータパケット構成は、実施例１と同じであってよい（図８に示す）。
【０１３２】
ここで、図示のＰＬＣ８０の機能は、上記ＰＬＣ２００と同じであってよい（多少、名称や形式が変わっていても、実質的には同じと考えてよい）。
すなわち、ＰＬＣ８０は、プログラム実行管理機能部８１、アドレステーブル８２、通信機能部８３等の処理機能部を有する。アドレステーブル８２、通信機能部８３は、図１のアドレステーブル２４、通信部２１と同じであると見做してよく、ここでの説明は省略する。プログラム実行管理機能部８１は、図１のオブジェクト展開部２５、デバッグ制御部２６、プログラム実行部２７のすべての機能を含むものと見做してもよい。従って、ＰＬＣ８０の処理機能については、ここでは説明を省略するが、ＰＬＣ８０は、上記ダウンロードされる最適化機械語オブジェクト６７、デバッグ可能機械語オブジェクト６８を、図示の最適化機械語オブジェクト８４、デバッグ可能機械語オブジェクト８５として記憶する。
【０１３３】
図１３に、上記コンパイラ６２の処理動作の一例を示す。
尚、図１３に示す例では、コンパイル処理の際に、ソースコードから一旦、中間コード（中間言語）を生成して、その後、中間コードから機械語オブジェクトを生成する例であるが、この例に限るものではない。中間コードを生成することなく、ソースコードから直接的に機械語オブジェクトを生成するものであってよい。尚、中間コード（中間言語）は、例えばＣ言語であるが、この例に限らない。
【０１３４】
尚、上記特許文献２には、インストラクションリスト等のシーケンス処理用の言語で記述された制御プログラム（ソースファイル）を、Ｃ言語等の高級プログラミング言語に変換して、このＣ言語表現のプログラムファイルをコンパイルしてオブジェクトファイルを生成することにより実行コードが得られる旨の開示がある。この様に、Ｃ言語等の中間言語を介することは、既存技術であり、ここではこれ以上説明しない。
【０１３５】
図１３に示す例では、上記コンパイラ６２は、２つのコンパイラ（コンパイラ６２ａ，６２ｂ）から成るものとする。これら２つのコンパイラは、上記の通り、一旦、中間コードを生成するタイプであるものとする。
【０１３６】
コンパイラ６２ａは、通常のコンパイル処理を行って上記デバッグ可能機械語オブジェクト６８を生成する。コンパイラ６２ｂは、最適化コンパイル処理を行って上記最適化機械語オブジェクト６７を生成する。本例では、コンパイラ６２ａ，６２ｂはそれぞれ、まずフロントエンド処理で中間コード（中間コード１、中間コード２）を生成し、その後、バックエンド処理で機械語オブジェクト（６８，６７）を生成する。
【０１３７】
従来であれば中間コード１と中間コード２とでは、その生成の際の図形要素の展開順番等が異なる可能性がある。既に説明した通り、展開順番が異なると、ＰＬＣ８０側で上記最適化機械語オブジェクト８４を実行したときとデバッグ可能機械語オブジェクト８５を実行したときとで、演算結果が異なるため問題となる。
【０１３８】
これに対して、本例のコンパイラ６２では、まず、コンパイラ６２ａは、ソースコード６６をコンパイル（フロントエンド処理）して中間コード１を生成する際に、例えばコンパイラ６２ｂとは異なる独自の規則により図形要素の展開順番を決定するかもしれないが、この展開順番を展開順番対応表６９に記憶しておく。
【０１３９】
尚、コンパイラ６２ｂにおける最適化の処理は、例えばバックエンド処理において実現してもよい。これは例えば、コンパイラ６２ｂは、例えばＣ言語コンパイラ（不図示）を有し、このＣ言語コンパイラがコンパイラ６２ｂのバックエンド処理を実行する。Ｃ言語コンパイラは、Ｃ言語プログラムをコンパイルして機械語を生成する機能を有する、Ｃ言語用の既存の一般的なコンパイラであり、上記最適化のための処理機能も備えている。図１３に示す構成例では、特に上記中間言語をＣ言語とした場合、この様な既存のＣ言語コンパイラの最適化機能を利用して、最適化を実現できるというメリットがある。
【０１４０】
図１４に、展開順番対応表６９の具体例を示す。
図示の例では、展開順番対応表６９は、各図形要素の識別用ＩＤである図形ＩＤ９１に対応付けて、各図形要素の展開順番を示す実行順番（展開順番）９２が登録される。図示の例では、図形ＩＤ９１＝‘１’、‘２’、‘３’の３つの図形要素の展開順番（実行順番）は、‘１’→‘３’→‘２’の順となる。
【０１４１】
そして、コンパイラ６２ａにおいてコンパイル処理が完了してデバッグ可能機械語オブジェクト６８が生成された後、コンパイラ６２ｂのコンパイル処理を開始する（あるいは、中間コード１が生成された後であっても構わない。換言すれば、展開順番対応表６９の作成が完了した後であればよい）。尚、コンパイラ６２ａが、例えば自己のコンパイル処理が完了したら、ソースコード６６をコンパイラ６２ｂに渡すことで、コンパイラ６２ｂがコンパイル処理を開始できるようにしてもよい。あるいは、コンパイラ６２ａが処理完了をコンパイラ６２ｂに通知すると、コンパイラ６２ｂがソースコード６６を取得してコンパイル処理を開始するようにしてもよい。
【０１４２】
そして、コンパイラ６２ｂは、展開順番対応表６９を参照しながら、コンパイル処理を実行する。これより、コンパイラ６２ｂにおいても、図形要素の展開順番はコンパイラ６２ａと同じとなる。例えば図１４の例であればコンパイラ６２ａにおける図形要素の展開順番は‘１’→‘３’→‘２’の順であったことになり、コンパイラ６２ｂにおいても同じ展開順番でコンパイル処理を行って中間コード２を生成することになる。
【０１４３】
従来であれば、コンパイラ６２ｂは、独自の規則（図形要素コード生成規則）に従って展開順番を決めていたので、図形要素の展開順番が例えば‘１’→‘２’→‘３’の順となる可能性もあったが、本手法ではこの様な問題は起こらない。
【０１４４】
また、よく知られているように、ＰＬＣの制御プログラムのコンパイル処理では、各変数に任意のメモリアドレスを割当てる処理（既存の処理）も行われるが、本手法では、コンパイラ６２ａが、例えば中間コード１生成の際に各変数に割当てたアドレス情報を、変数アドレス対応表７０に記憶するようにしてもよい。この場合には、コンパイラ６２ｂは、更に変数アドレス対応表７０も参照することで、各変数へのメモリアドレス割当てを、コンパイラ６２ａと同じとすることができる。
【０１４５】
変数アドレス対応表７０の具体例は、特に示さないが、例えば各変数の識別用ＩＤに対応付けて、その変数に割り付けたメモリアドレスが格納されるものである。
この様に、本手法では、２つのコンパイラ６２ａ、６２ｂで、図形要素の展開順番および各変数へのメモリアドレス割当て内容を、同一にすることができる。尚、変数アドレス対応表７０の具体例は、特に示さないが、例えば各変数の識別用ＩＤに対応付けて、その変数に割当てたアドレスの情報（例えば割当てたメモリ領域の先頭アドレスとサイズ等）が登録される。
【０１４６】
コンパイラ６２ａは、中間コード１をバックエンド処理で機械語オブジェクトに変換してデバッグ可能機械語オブジェクト６８を生成する。コンパイラ６２ｂは、中間コード２をバックエンド処理で機械語オブジェクトに変換して最適化機械語オブジェクト６７を生成する。ここで、上述したように、中間コード１と中間コード２は、その生成の際の図形要素の展開順番が同じとなる。従って、これら中間コード１、中間コード２の機械語オブジェクト（デバッグ可能機械語オブジェクト、最適化機械語オブジェクト）をＰＬＣ８０側で実行した場合、上述した問題は起こらない。すなわち、同一のソースコードに係る２種類の機械語オブジェクトの演算結果が、相互に異なるという事態が生じ、それによってシステム動作が不安定になる等という問題が生じる心配はない。
【０１４７】
尚、言うまでもないが、上記デバッグ可能機械語オブジェクト６８と最適化機械語オブジェクト６７を、ＰＬＣ８０側へダウンロードして上記デバッグ可能機械語オブジェクト８５、最適化機械語オブジェクト８４として記憶させることになる。そして、ＰＬＣ８０では、通常時は最適化機械語オブジェクト８４を実行し、デバッグ時にはデバッグ可能機械語オブジェクト８５に切り替えて実行することになるが、実施例２では、この切り替え後に、切り替え前とは演算結果が異なる等というような事態が生じることはなく、システム動作が不安定になるようなことはない。
【０１４８】
尚、図１３は一例を示すものであり、この例に限らない。例えば、コンパイラ６２ｂを先に実行し、その後にコンパイラ６２ａを実行するようにしてもよい。勿論、この場合には、コンパイラ６２ｂが上記展開順番対応表６９、変数アドレス対応表７０を生成することになり、その後、コンパイラ６２ａが、これらの対応表６９、７０を参照しながらコンパイル処理を実行することで、図形要素の展開順番がコンパイラ６２ｂと同じとなると共に、各変数へ割当てるメモリアドレスもコンパイラ６２ｂと同じとなる。
【０１４９】
この様に、２つのコンパイラ６２ａ、６２ｂのうち何れか一方（基本的には先に処理実行する方）が上記展開順番対応表６９、変数アドレス対応表７０を生成し、他方がこれらの対応表６９、７０を参照しながらコンパイル処理を実行することで、同一のソースコードに係るデバッグ可能機械語オブジェクト６８（８５）と最適化機械語オブジェクト６７（８４）とで、演算結果が異なる事態となることは回避される。
【０１５０】
あるいは、図１３では、一旦、中間コードを生成するタイプのコンパイラに本手法を適用した場合を示したが、勿論、この様な例に限らず、中間コードを生成することなくソースコードからダイレクトに機械語オブジェクトを生成するコンパイラにも、本手法は問題なく適用できる。
【０１５１】
図１５に、図形言語プログラムの具体例を示す。
図１５（ａ）には、ラダー図やファンクションブロック図等の図形言語プログラムの図形要素を示す。
【０１５２】
図１５（ｂ）、（ｃ）には、ファンクションブロック図によるプログラム記述の具体例を示す。
図１５（ａ），（ｂ）の例については特に説明しないが、図１５（ｂ）の例では３つの図形要素が任意の位置に配置されていることになる。
【０１５３】
以下、図１５（ｃ）の例について説明する。
この例では、Ｃ＝Ａ＋Ｂを演算する図形要素９５と、Ｆ＝Ｃ＋Ｄを演算する図形要素９６を示している。これら図形要素９５、９６の処理のどちらを先に実行するかによって、演算結果が異なる場合が有り得る。しかしながら、図１５（ｃ）に示す例では、図形要素９５と図形要素９６のどちらを先に実行するか明確ではない。
【０１５４】
すなわち、上記の通り、左から右、上から下の順番が基本規則であるが、図１５（ｃ）の場合、“左から右”ルールの方を優先させると図形要素９５が先に実行されるが、“上から下”ルールの方を優先させると図形要素９６が先に実行される可能性がある。あるいは、図１５（ｃ）の場合、“上から下”ルールに関して、図形要素９５、９６のどちらが上であるのか不明瞭である。
【０１５５】
そして、例えば、各変数Ａ，Ｂ，Ｃ，Ｄ，Ｆに係る現在のメモリ保持値が、Ａ＝１、Ｂ＝２、Ｃ＝１００、Ｄ＝１０、Ｆ＝０であったとする。
この例の場合、仮に図形要素９５→図形要素９６の順に実行されると、まず、Ｃ＝Ａ＋Ｂ＝１＋２＝３となってＣの値が上記１００から３へと更新された後、Ｆ＝Ｃ＋Ｄ＝３＋１０＝１３となる。よって、演算結果（上記演算後の各変数Ａ，Ｂ，Ｃ，Ｄ，Ｆに係るメモリ保持値）は、Ａ＝１、Ｂ＝２、Ｃ＝３、Ｄ＝１０、Ｆ＝１３となる。
【０１５６】
一方、上記の例で図形要素９６→図形要素９５の順に実行された場合には、まず、Ｆ＝Ｃ＋Ｄ＝１００＋１０＝１１０となってＦの値が上記０から１１０へと更新された後、Ｃ＝Ａ＋Ｂ＝１＋２＝３となる。よって、演算結果（上記演算後の各変数Ａ，Ｂ，Ｃ，Ｄ，Ｆに係るメモリ保持値）は、Ａ＝１、Ｂ＝２、Ｃ＝３、Ｄ＝１０、Ｆ＝１１０となる。このように、図形要素９５→図形要素９６の順に実行された場合と、図形要素９６→図形要素９５の順に実行された場合とでは、演算結果が異なることになる。
【０１５７】
また、図１６（ａ）は通常時、図１６（ｂ）はデバッグ時のアドレステーブル８２の展開状態の具体例を示す図である。図示の通り、これらは内容的には図１０、図１１に示したものと略同様であり、図１２において名称が図３とは異なるもの（非最適化機械語オブジェクト→デバッグ可能機械語オブジェクト）が存在することから、例えば図１６（ａ）,（ｂ）に示すようになる。
【０１５８】
よって、ここでは図１６（ａ）、（ｂ）については特にこれ以上詳細には説明しないが、実施例１の場合と同様に実施例２においてもＰＯＵ単位で２種類の機械語オブジェクトを生成・ダウンロードすると共に、ＰＯＵ単位でデバッグの実行（デバッグ可能機械語オブジェクトの実行）を指示できる。よって、例えば、制御プログラム全体のなかで、その都度、ユーザが必要とする部分（ＰＯＵ）についてのみデバッグ可能機械語オブジェクトに切り替えて実行させることができ、デバッグ作業時間の短縮化、作業負担の軽減を図ることができる。
【０１５９】
尚、実施例２の開発支援装置６０、ＰＬＣ８０のハードウェア構成例は、上記実施例１のプログラミング装置１００、ＰＬＣ２００と同じであってよい。すなわち、開発支援装置６０のハードウェア構成例は図１に示す通りであり、ＰＬＣ８０のハードウェア構成例は図２に示す通りであると考えてよい。但し、この例に限るものではない。
【０１６０】
また、図１２に示す開発支援装置６０の処理機能（符号６１、６２等）は、上記プログラミング装置１００の場合と同様、例えば記憶装置１０５に予め記憶されているアプリケーションプログラムを、ＣＰＵ１０１が実行することにより実現される。同様に、図１２に示すＰＬＣ８０の処理機能（符号８１等）は、上記ＰＬＣ２００の場合と同様、例えばユーザプログラムメモリ２１３に予め記憶されているアプリケーションプログラムを、ＣＰＵ２１１が実行することにより実現される。また、上記デバッグ可能機械語オブジェクト８５、最適化機械語オブジェクト８４は、ユーザプログラムメモリ２１３に格納される。
【０１６１】
実施例２は、基本的に、上記実施例１における図４〜図９の具体例において、ステップＳ３、Ｓ４の処理が多少変わるものであると見做しても構わない。すなわち、ステップＳ３の処理の際に、上記展開順番対応表６９、変数アドレス対応表７０を生成する処理が加わる。また、ステップＳ４の処理では、例えば独自の規定によって図形要素の展開順番を決定する代わりに、展開順番対応表６９を参照することで、ステップＳ３の処理における図形要素の展開順番と同じ順番で、図形要素の展開を行ってコンパイル処理を実現するものとなる。また、ステップＳ４の処理では、更に、変数アドレス対応表７０を参照することで、ソースコードの各変数に割り付けるメモリアドレスを、ステップＳ３の処理の場合と同じにする。これら以外は、実施例１と略同様であって構わないので、ここでは特に説明しない。
【０１６２】
以上のことから、特に図示しないが、上記実施例２の開発支援装置６０（プログラミング装置）、ＰＬＣ８０（プログラマブルコントローラ）は、例えば下記の処理機能を有するものと考えても良い。
【０１６３】
まず、上記プログラミング装置（開発支援装置６０）は、第一のコンパイラと第二のコンパイラとダウンロード部とを有するものと見做してもよい。
第一のコンパイラは、任意の図形言語プログラムのソースコードを、該ソースコードを構成する各図形要素の展開順序を決定しつつ該展開順序に従ってコンパイルして第一の機械語オブジェクトを生成すると共に、少なくとも上記各図形要素の展開順序を所定の記憶領域（記憶部）に記憶する。
【０１６４】
第二のコンパイラは、上記ソースコードを、上記記憶部に記憶された各図形要素の展開順序を参照して、該展開順序に従ってコンパイルして第二の機械語オブジェクトを生成する。
【０１６５】
ダウンロード部は、上記第一の機械語オブジェクトと上記第二の機械語オブジェクトとを、プログラマブルコントローラにダウンロードする。
そして、例えば、上記第一の機械語オブジェクトと上記第二の機械語オブジェクトの何れか一方は、通常のコンパイル処理によって生成される、デバッグ可能な機械語オブジェクトである非最適化機械語オブジェクトであり、他方は最適化コンパイル処理によって生成される、最適化された機械語オブジェクトである最適化機械語オブジェクトである。
【０１６６】
一方、上記プログラマブルコントローラ（ＰＬＣ８０）は、通常時は上記最適化機械語オブジェクトを実行し、デバッグ時には上記非最適化機械語オブジェクトに切り替えて実行するプログラム実行部を有する。
【０１６７】
また、例えば、上記第一のコンパイラは、上記第一の機械語オブジェクト生成の際に、上記ソースコードから一旦中間言語を生成した後に該中間言語から上記第一の機械語オブジェクトを生成するものであって、該中間言語生成の際に上記各図形要素を展開順序の決定と上記記憶部への記憶を行う。
【０１６８】
また、例えば、上記第二のコンパイラは、上記第二の機械語オブジェクト生成の際に、上記ソースコードから一旦中間言語を生成した後に該中間言語から上記第二の機械語オブジェクトを生成するものであって、該中間言語生成の際に上記記憶部に記憶された上記各図形要素の展開順序を参照して該中間言語の生成を行う。
【０１６９】
また、例えば、上記第一のコンパイラは、更に、上記コンパイルの際にソースコードの各変数に割当てたメモリアドレスの情報を上記記憶部に記憶する。一方、上記第二のコンパイラは、上記コンパイルの際に更に、該記憶されたメモリアドレス情報を参照することで、上記各変数に上記第一のコンパイラと同じメモリアドレスを割当てる。
【０１７０】
また、例えば、上記プログラマブルコントローラは、更に下記の構成を有するものであってよい。
すなわち、上記プログラマブルコントローラは、
上記最適化機械語オブジェクトを保持する第一の記憶領域と、上記非最適化機械語オブジェクトを保持する第二の記憶領域と、上記最適化機械語オブジェクトの格納アドレスまたは上記非最適化機械語オブジェクトの格納アドレスを登録するアドレステーブルとを有する。
【０１７１】
そして、上記プログラム実行部は、例えば、該アドレステーブルに登録されている格納アドレスに応じて、上記最適化機械語オブジェクトと上記非最適化機械語オブジェクトの何れか一方を実行する。
【０１７２】
また、上記プログラマブルコントローラは、例えば、上記アドレステーブルに上記最適化機械語オブジェクトの格納アドレスを登録することで、上記プログラム実行部に上記最適化機械語オブジェクトを実行させる最適化機械語オブジェクト実行部と、上記プログラミング装置からのデバッグ指示に応じて上記アドレステーブルに上記非最適化機械語オブジェクトの格納アドレスを登録することで、上記プログラム実行部に上記非最適化機械語オブジェクトを実行させるデバッグ制御部とを更に有する。
【０１７３】
また、上記プログラマブルコントローラは、上記プログラミング装置から上記最適化機械語オブジェクト、上記非最適化機械語オブジェクトがダウンロードされると、受信した最適化機械語オブジェクトは上記第一の記憶領域内に格納すると共に該格納領域の先頭アドレスを上記テーブルに登録すると共に、受信した非最適化機械語オブジェクトは上記第二の記憶領域内に格納するオブジェクト転送部を更に有する。
【０１７４】
また、例えば、上記プログラミング装置は、上記デバッグ指示を上記プログラマブルコントローラへ送信すると共に、これに伴って、任意に設定された上記非最適化機械語オブジェクトの実行の停止位置を示すブレーク位置情報も上記プログラマブルコントローラへ送信するデバッグ指示部を更に有する。
【０１７５】
また、上記プログラマブルコントローラにおいて、例えば、上記デバッグ制御部は、上記デバッグ指示と共に上記ブレーク位置情報を受信すると、上記非最適化機械語オブジェクトにおいて、該ブレーク位置情報に応じた所定位置に、機械語オブジェクトの実行を停止するためのブレーク命令を挿入する。
【０１７６】
また、上記プログラム実行部は、上記非最適化機械語オブジェクトの実行中には、上記ブレーク命令の実行に伴い、該非最適化機械語オブジェクトの実行を停止すると共に該停止状態を上記プログラミング装置へ送信する。
【０１７７】
あるいは、上最適化機械語オブジェクトは、ＰＯＵ単位で前記第一の記憶領域に保持され、上記非最適化機械語オブジェクトも、ＰＯＵ単位で前記第二の記憶領域に保持され、上記プログラム実行部は、デバッグ時に、任意のＰＯＵに関してのみ非最適化機械語オブジェクトに切り替えて実行する。これは、例えば、プログラミング装置側においてユーザが指定したＰＯＵに関してのみ、その識別番号を含む上記図９のデバッグ情報がＰＬＣ側に送られることで、ＰＬＣ側ではこのＰＯＵに関してのみ、非最適化機械語オブジェクトに切り替えて実行する。
【０１７８】
以上説明したように、実施例２のプログラマブルコントローラシステムでは、プログラミング装置（開発支援装置；ローダ）において、２つのコンパイラによって通常の機械語オブジェクトと最適化機械語オブジェクトの両方を生成すると共に、その際にこれら２つのコンパイラで図形要素の展開順番を一致させることで、デバッグ時に逆コンパイル等を行なうことなく且つシステム動作を不安定にすることなく、ソースコードレベルデバッグを行えることになる。
【符号の説明】
【０１７９】
１１  ユーザインタフェース部
１２  コンパイラ
１３  最適化機械語オブジェクト
１４  通信部
１５  非最適化機械語オブジェクト
２１  通信部
２２  最適化機械語オブジェクト
２３  非最適化機械語オブジェクト
２４  アドレステーブル
２５  オブジェクト展開部
２６  デバッグ制御部
２７  プログラム実行部
３１  コンパイル開始ボタン
３２  デバッグ開始ボタン
３３  終了ボタン
３４  デバッグ終了ボタン
４１  識別番号
４２  種別
４３  機械語オブジェクト（機械語オブジェクト本体）
５１  識別番号
５２  ブレーク位置
５５  データパケット
５５ａ，５５ｂ，５５ｃ，５５ｄ  機械語オブジェクト
６０  開発支援装置（ローダ）
６１  インタフェース機能部
６２  コンパイラ
６２ａ  コンパイラ（通常）
６２ｂ  コンパイラ（最適化）
６３  通信機能部
６４  画面（ディスプレイ）
６５  入力装置
６６  ソースコード
６７  最適化機械語オブジェクト
６８  デバッグ可能機械語オブジェクト
６９  展開順番対応表
７０  変数アドレス対応表
７１  ソースコード識別番号対応表
８０  ＰＬＣ
８１  プログラム実行管理機能部
８２  アドレステーブル
８３  通信機能部
８４  最適化機械語オブジェクト
８５  デバッグ可能機械語オブジェクト
９１  図形ＩＤ
９２  実行順番
９５，９６  図形要素
１００  プログラミング装置
１０１  中央演算処理装置（ＣＰＵ）
１０２  入力装置
１０３  表示器
１０４  内部メモリ
１０５  記憶装置
１０６  入出力インタフェース（Ｉ／Ｏ）
１０７  共通バス
２００  プログラマブルコントローラ（ＰＬＣ）
２１０  ＣＰＵモジュール
２１１  ＣＰＵ
２１２  システムプログラムメモリ（ＦＬＡＳＨ）
２１３  ユーザプログラムメモリ（ＲＡＭ）
２１４  ＰＬＣ固有バスインタフェース
２１５  ユーザデータメモリ（ＲＡＭ）
２１６  システムワークメモリ（ＲＡＭ）
２１７  ドライバ／レシーバ
２１８  バス
２２２  入出力モジュール
３００  制御機器
４００  信号線
【図１】
0005849592.tif 000002
【図２】
0005849592.tif 000003
【図３】
0005849592.tif 000004
【図４】
0005849592.tif 000005
【図５】
0005849592.tif 000006
【図６】
0005849592.tif 000007
【図７】
0005849592.tif 000008
【図８】
0005849592.tif 000009
【図９】
0005849592.tif 000010
【図１０】
0005849592.tif 000011
【図１１】
0005849592.tif 000012
【図１２】
0005849592.tif 000013
【図１３】
0005849592.tif 000014
【図１４】
0005849592.tif 000015
【図１６】
0005849592.tif 000016
【図１５】
0005849592.tif 000017