(57)【要約】【課題】異なるプログラムからの二重書き込みの有無を検査する。【解決手段】開発支援装置１０は、プログラム（ソースコード２１）をコンパイルして機械語オブジェクト２４に変換する処理に伴って、プログラム中の特定の命令を検出して、この特定命令を示す情報を監視対象コード表２５に登録する。ターゲット装置３０は、この監視対象コード表２５に基づいて、機械語オブジェクト２４を実行中、現在実行する命令が上記特定命令であるか否かを判定し、特定命令実行タイミングで特定のレジスタ（ＡＸレジスタ等）の格納データを、取得して記録する。【選択図】図１
2017130068.tif 000002
【特許請求の範囲】
【請求項１】
１以上のプログラムのソースコードを機械語オブジェクトに変換するコンパイル処理を行う開発支援装置と、ターゲット装置を有するプログラマブルコントローラシステムであって、
前記開発支援装置は、
前記各プログラムの前記コンパイル処理の際に、特定の命令を検出する特定命令検出手段と、
該検出した特定命令に係わる情報である特定情報を生成する特定情報生成手段と、
該特定情報を前記ターゲット装置に転送する転送手段とを有し、
前記ターゲット装置は、前記各プログラムの機械語オブジェクトの実行中に、前記特定情報に基づいて、前記特定命令の実行時のアクセス先のメモリアドレスを、実行中のプログラムに対応付けて記録する実アクセス先記録手段を有することを特徴とするプログラマブルコントローラシステム。
【請求項２】
前記特定命令は、特定のレジスタ経由で書き込む命令であり、
前記実アクセス先記録手段は、前記特定命令の実行時の該特定のレジスタの格納データを前記アクセス先のメモリアドレスとして取得することを特徴とする請求項１記載のプログラマブルコントローラシステム。
【請求項３】
前記特定情報は、前記特定命令の前記プログラム上の位置を示す情報であり、
前記実アクセス先記録手段は、前記機械語オブジェクト実行中に、現在のプログラム実行位置が、前記特定情報が示す位置と一致する場合に、前記特定命令の実行時と見做して、前記アクセス先のメモリアドレスを、実行中のプログラムに対応付けて記録することを特徴とする請求項１または２記載のプログラマブルコントローラシステム。
【請求項４】
前記特定情報生成手段による前記特定情報の生成は、前記機械語オブジェクト上の前記特定命令に、所定のマークを付すことであり、
前記転送手段による前記特定情報の転送は、該所定のマークが付された前記機械語オブジェクトを転送するものであり、
前記実アクセス先記録手段は、前記機械語オブジェクト実行中に該マークを検出すると、前記特定命令の実行時と見做して、前記アクセス先のメモリアドレスを、実行中のプログラムに対応付けて記録することを特徴とする請求項１または２記載のプログラマブルコントローラシステム。
【請求項５】
前記特定情報生成手段による前記特定情報の生成は、前記機械語オブジェクトにおける前記特定命令の前または後に、前記アクセス先のメモリアドレスを、実行中のプログラムに対応付けて記録する処理を実現する所定の命令を、挿入するものであり、
前記転送手段による前記特定情報の転送は、該所定の命令が含まれる前記機械語オブジェクトを転送するものであり、
前記実アクセス先記録手段は、該機械語オブジェクトを実行することで、前記特定命令の実行時のアクセス先のメモリアドレスを、実行中のプログラムに対応付けて記録することを特徴とする請求項１または２記載のプログラマブルコントローラシステム。
【請求項６】
前記特定命令の前記プログラム上の位置を示す情報は、該特定命令の機械語命令番号であり、
前記実アクセス先記録手段は、プログラムカウンタの値が前記特定命令の機械語命令番号と一致するときに、前記特定命令の実行時と見做すことを特徴とする請求項３記載のプログラマブルコントローラシステム。
【請求項７】
前記ターゲット装置または前記開発支援装置は、前記記録したメモリアドレスに基づいて、複数のプログラムで同一のメモリアドレスにアクセスするか否かをチェックするチェック手段を更に有することを特徴とする請求項１または２記載のプログラマブルコントローラシステム。
【請求項８】
前記特定命令は、“アクセスするメモリアドレスがその都度決定／変更される処理”に係わる命令であることを特徴とする請求項１または２記載のプログラマブルコントローラシステム。
【請求項９】
前記ターゲット装置は、制御装置または該制御装置のシミュレータであることを特徴とする請求項１または２記載のプログラマブルコントローラシステム。
【請求項１０】
機械語オブジェクトを実行するターゲット装置に通信可能に構成され、１以上のプログラムのソースコードを前記機械語オブジェクトに変換するコンパイル処理を行う開発支援装置であって、
前記プログラムのコンパイル処理の際に、前記ターゲット装置における特定のレジスタ経由で書き込む命令である特定命令を検出する特定命令検出手段と、
該検出した特定命令に係わる情報である特定情報を生成する特定情報生成手段と、
該特定情報を前記機械語オブジェクトと共に前記ターゲット装置に転送して前記ターゲット装置の記憶手段に前記特定情報を記憶させる転送手段とを有することを特徴とする開発支援装置。
【請求項１１】
１以上のプログラムのソースコードを機械語オブジェクトに変換するコンパイル処理を行う開発支援装置と通信可能なターゲット装置であって、
前記プログラムの機械語オブジェクトの実行中に、前記開発支援装置が前記コンパイル処理の際に生成した前記ターゲット装置における特定のレジスタ経由で書き込む特定の命令に係わる特定情報に基づいて、前記特定命令の実行時のアクセス先のメモリアドレスを、実行中のプログラムに対応付けて記録する実アクセス先記録手段を有することを特徴とするターゲット装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラのプログラムのデバッグに関する。
【背景技術】
【０００２】
プログラマブルロジックコントローラ（ＰＬＣ）のプログラムは、任意の制御対象の制御用プログラム等である。このプログラムのソースコード（ソースプログラム）を開発支援装置上でユーザが任意に作成する。作成されたソースコードは、開発支援装置のコンパイラによってコンパイルされて、ＰＬＣにおける実行形式（機械語オブジェクト）に変換される。これに伴って、ソースコード中の各変数に対して、ＰＬＣの任意のメモリ領域が割り当てられる。
【０００３】
プログラマブルロジックコントローラ（ＰＬＣ）のエンジニアリングでは、入出力機器や上位の監視画面と連携するために、上記変数のメモリアドレス割り付けをユーザが手動で実施している場合がある。変数のメモリ割付は、コンパイラが自動で割り付ける場合が多いが、何らかの事情により、人間が所望のメモリアドレスを手動で割り付ける場合もある。この手動メモリ割付に関して、例えば、配列Ａ[ｉ]（ｉは変数／インデックス）のようにｉが取り得る値に応じた複数の要素を持った配列Ａに関して、メモリアドレスを割り当てる場合に、要素数に応じたアドレス範囲を指定する場合などがある。尚、この様な配列Ａも、変数の一種であると見做せる。
【０００４】
尚、上記配列Ａ[ｉ]（ｉは変数／インデックス）によって、“アクセスするメモリアドレスが動作中に（そのときの変数ｉの値に応じて）随時決定／変更される”ことになる場合がある。
【０００５】
複数のプログラムに関して、それぞれ、上記アドレス範囲の割当てが行われることもあり、この複数のアドレス範囲同士が一部重複するように割り当てられる場合もある。これは、誤って重複してしまう場合もあれば、意図的に重複させる場合もある。意図的に重複させる場合、そのユーザは、重複があってもシステムの動作に問題が生じないと判断している場合もある。
【０００６】
上記ユーザの手動によるメモリ割付けが行われる場合、ユーザがメモリ割付けを誤ると、プログラムをＰＬＣで実行中に、異なるプログラムから同じメモリ領域に対して重複してアクセス（書き込み等）する事態が生じ得ることになり、これよりシステムの動作が不安定になるという問題が生じる。
【０００７】
上記問題に対する対策として、一般的に、ユーザが作成したプログラム（ソースコード）を静的に解析して、上記「異なるプログラムから同じメモリに対して重複してアクセスする（書き込む等）という異常」の有無を検査する、静的解析が行われている。しかしながら、この静的解析では、例えば配列、ポインタなどに係わる“アクセスするメモリアドレスが動作中に随時決定／変更される”処理が含まれる場合には、検査できない、等という課題がある。
【０００８】
静的解析関連の従来技術として、例えば特許文献１が知られているが、特許文献１には動的に検査することについては記載が無い。また、上記配列Ａ[ｉ]等に係わる上記手動による上記アドレス範囲の指定に関して、複数のアドレス範囲が相互に重複しているか否かについては、静的解析で検出することは可能である。しかしながら、実際の動作において、アドレス範囲内の全アドレスにアクセスするとは限らない。従って、複数のアドレス範囲が相互に重複している場合であっても、異なるプログラムから同じメモリ領域に対して重複してアクセスする事態（二重書き込みなど）が生じるか否かは、分からない。これは、実際にプログラムを動作させなければ分からないことである。
【０００９】
動的に異常を検出する従来技術として、例えば特許文献２に記載の“コントローラでプログラムを実行させ、異常を検出してトレースデータを記録する”技術が知られている。
しかしながら、特許文献２の技術では、上述した“アクセスするメモリアドレスが動作中に随時決定／変更される”場合に係わる二重書き込みは、検出できない。
【００１０】
また、例えば、特許文献３の従来技術が知られている。
特許文献３には、ソースコードを、まず、フロントエンドコンパイラによって中間コードに変換し、この中間コードをバックエンドコンパイラによって機械語オブジェクトに変換する従来技術が、開示されている。
【００１１】
特許文献１の発明では、フロントエンドコンパイラはソースコードと中間コードの対応情報である第１の対応表を、バックエンドコンパイラは中間コードと機械語オブジェクトの対応情報である第２の対応表を作成する。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開２００４−１７１０６４号公報
【特許文献２】特開平９−３２５９００号公報
【特許文献３】特開２００７−１８８３６６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
上述したように、従来では、ＰＬＣのプログラムにおいて、例えば配列、ポインタなどに係わる“アクセスするメモリアドレスが動作中に随時決定／変更される”処理に関しては、上記「異なるプログラムから同じメモリに対して重複してアクセスする（書き込む等）という異常」の有無を検査することは、出来なかった。
【００１４】
本発明の課題は、コントローラのプログラムに“アクセスするメモリアドレスが動作中に随時決定／変更される”処理が含まれる場合でも、異なるプログラムからの重複アクセスの有無を検査できるプログラマブルコントローラシステム、その開発支援装置と、ターゲット装置等を、提供することである。
【課題を解決するための手段】
【００１５】
本発明のプログラマブルコントローラシステムは、１以上のプログラムのソースコードを機械語オブジェクトに変換するコンパイル処理を行う開発支援装置と、ターゲット装置を有するプログラマブルコントローラシステムであって、下記の構成を有する。
【００１６】
前記開発支援装置は、下記の各手段を有する。
・前記各プログラムのコンパイル処理の際に、特定の命令を検出する特定命令検出手段；
・該検出した特定命令に係わる情報である特定情報を生成する特定情報生成手段；
・該特定情報を前記ターゲット装置に転送する転送手段。
【００１７】
前記ターゲット装置は、前記機械語オブジェクトの各プログラムの実行に伴って、前記特定情報に基づいて、前記特定命令の実行時のアクセス先のメモリアドレスを、実行したプログラムに対応付けて記録する実アクセス先記録手段を有する。
【発明の効果】
【００１８】
本発明のプログラマブルコントローラシステム、その開発支援装置と、ターゲット装置等によれば、コントローラのプログラムに“アクセスするメモリアドレスが動作中に随時決定／変更される”処理が含まれる場合でも、異なるプログラムからの重複アクセスの有無を検査できる。
【図面の簡単な説明】
【００１９】
【図１】本例のプログラマブルコントローラシステムの構成図である。
【図２】開発支援装置上に表示されるプログラム記述用の画面例を示す図である。
【図３】ユーザが記述したソースコードをコンパイルして生成した中間言語（中間コード）の一例である。
【図４】図３の中間コードへのコンパイルに係わるメモリ割り付け例である。
【図５】（ａ）、（ｂ）は、監視対象コード表の生成過程の具体例を示す図である。
【図６】“書き込みアドレス記録表（雛形）”２３の具体例である。
【図７】（ａ）、（ｂ）は、書き込みアドレス記録表４２の具体例である。
【図８】ターゲット装置のプログラム実行管理機能を示す図である。
【発明を実施するための形態】
【００２０】
以下、図面を参照して、本発明の実施の形態について説明する。
図１は、本例のプログラマブルコントローラシステムの構成図である。
尚、本説明では、プログラマブルコントローラを、単にコントローラと記す場合やＰＬＣ等と記す場合もあるものとする。尚、ここでは、制御装置（コントローラ）の一例としてＰＬＣを示すが、この例に限らず、例えばＤＣＳ（分散制御システム；Distributed Control System）等であってもよい。本システムは、ＰＬＣ、ＤＣＳ等の制御装置のプログラムを、管理するものである。
【００２１】
図１に示す例のプログラマブルコントローラシステムは、開発支援装置１０、“シミュレータ又はＰＬＣ”３０等を有する。開発支援装置１０は、“シミュレータ又はＰＬＣ”３０におけるＰＬＣのプログラム（制御用プログラム等）を生成して、これをＰＬＣに転送する。ＰＬＣがこのプログラムを実行することで、運用（何らかの制御対象の制御実行）が行われることになる。
【００２２】
但し、本手法は、運用前に行う上記プログラムのチェックに係わるものであり、このチェック処理は、ＰＬＣで行ってもよいし、ＰＬＣの機能・動作を模擬するコンピュータ装置であるシミュレータで行ってもよい。これより、上記の通り、“シミュレータ又はＰＬＣ”としている。そして、本手法のチェック処理では、コントローラのプログラムに“アクセスするメモリアドレスが動作中に随時決定／変更される”処理が含まれる場合でも、異なるプログラムからの重複アクセスの有無を検出することが可能となる。
【００２３】
尚、“シミュレータ又はＰＬＣ”３０を、ターゲット装置３０と呼ぶ場合もあるものとする。換言すれば、ターゲット装置３０は、シミュレータ又はＰＬＣであると言える。また、“シミュレータ又はＰＬＣ”３０のなかで特にＰＬＣを指したい場合には、ＰＬＣ３０と記す場合があるものとする。同様に、“シミュレータ又はＰＬＣ”３０のなかで特にシミュレータを指したい場合には、シミュレータ３０と記す場合があるものとする。
【００２４】
また、上記のことから、ＰＬＣ（プログラマブルコントローラ）の代わりに、上記ＤＣＳにおけるコントローラを用いても構わないのであり、両者を特に区別せずにまとめて制御装置と呼んでもよいものとする。つまり、プログラマブルコントローラは、制御装置の一例である。また、これより、ターゲット装置３０は、“シミュレータ又は制御装置”であると言うこともできる。
【００２５】
開発支援装置（ローダ）１０は、まず、任意のＰＬＣ用プログラムのソースコード２１をユーザに作成させるインタフェース機能部１１（エディタ機能も含む）を有する。このインタフェース機能部１１は、よく知られた既存の機能であり、ここでは特に説明しない。
【００２６】
尚、上記ＰＬＣ用プログラムは、ＰＬＣ３０で実行させることで任意の制御対象の制御を行わせる制御プログラム等である。これは、複数のプログラム（ＰＯＵ等）が作成されて、各プログラムが各々の定周期で繰り返し実行される場合が多い。繰り返し実行されるので、あるプログラムが任意のメモリ領域に何度も繰り返しアクセスすることは、問題とはならない（むしろ、当然の動作である）。しかしながら、別のプログラムがこのメモリ領域にアクセスすると、問題と成り得る。この為、この様な重複アクセス（二重書き込みなど）は、上記チェック処理で検出しなければならない。重複アクセスが検出されたら、例えばプログラム（ソースコード）の修正などが行われることになる。
【００２７】
開発支援装置（ローダ）１０は、また、上記ユーザが作成したソースコード２１を、ターゲット装置３０上で動作する機械語オブジェクト２４に変換するコンパイラ機能部（フロントエンドコンパイラ１２、バックエンドコンパイラ１３）を有する。これは、ソースコード２１を、中間言語２２（中間コード）に変換してから、機械語オブジェクト２４に変換するものである。中間コードについては、例えば上記特許文献３等に記載の既存のものであり、ここでは特に説明しない。
【００２８】
まず、フロントエンドコンパイラ１２が、上記ソースコード２１を解析して中間言語２２に変換する。続いて、バックエンドコンパイラ１３が、この中間言語２２をターゲット装置３０上で動作する機械語オブジェクト２４に変換する。この様な中間言語２２、機械語オブジェクト２４への変換機能自体は、よく知られた既存機能であるので、ここでは特に説明しない。
【００２９】
上記のように、開発支援装置１０は、ユーザが任意の制御プログラムのソースコード２１を作成するのを支援する支援機能や、このソースコード２１をコンパイルしてＰＬＣ３０で実行可能な形式（機械語オブジェクト２４）に変換する機能などを有する。
【００３０】
また、従来より、コンパイラ機能部は、上記コンパイル処理に伴って、ソースコード２１に記述される各変数に対して任意のメモリアドレスを割り当てている。このメモリアドレスは、ターゲット装置３０（特にＰＬＣ３０）に備えられる不図示のメモリの任意のアドレスである。
【００３１】
ここで、本例のコンパイラ機能部（特にバックエンドコンパイラ１３）は、上記機械語オブジェクト２４の生成処理に伴って、後述する特定の命令を検出して、これに基づいて一例としては図示の監視対象コード表２５を生成する処理等も実行する。尚、更に図示の“書き込みアドレス記録表（雛形）”２３も生成してもよいが、これは生成しなくても構わない。
【００３２】
この監視対象コード表２５の生成等については、後に詳しく説明するが、概略的には、コンパイル処理の際に、プログラム中に存在する特定の命令（監視対象命令）を検出して、この監視対象命令を示す情報を、監視対象コード表２５に登録するものである。本例では後述するように、監視対象命令は例えば“（特定の）レジスタ経由で（データを）書き込む命令”（“間接アドレス指定により書き込む命令”等とも言える）などであり、一例としては、検出した監視対象命令を示す情報として監視対象命令の命令番号を登録するが、この例に限らない。
【００３３】
尚、上記のことから、本例のコンパイラ機能部（特に、バックエンドコンパイラ１３）は、後述する不図示の特定命令検出機能部（不図示）、特定情報生成機能部（不図示）、転送機能部（不図示）等も備えるものと見做してもよい。但し、これは一例であり、これら不図示の機能部は、コンパイラ機能部とは別に備えられるものであっても構わない。
【００３４】
また、開発支援装置（ローダ）１０は、通信機能部１４を有する。通信機能部１４によって、不図示の通信線などを介して、例えばターゲット装置３０との通信を行うことができる。これより、例えば、コンパイラ機能部（特に、バックエンドコンパイラ１３）は、上記コンパイル処理によって生成された機械語オブジェクト２４や監視対象コード表２５等を、通信機能部１２を介して、ターゲット装置３０にダウンロードする。尚、更に“書き込みアドレス記録表（雛形）”２３もターゲット装置３０にダウンロードしてもよいが、この例に限らない（ダウンロードしなくてもよい）。
【００３５】
ターゲット装置３０は、その通信機能部３１によって開発支援装置（ローダ）１０と通信することができ、以って上記ダウンロードされる機械語オブジェクト２４等を受信する。そして、受信した機械語オブジェクト２４や監視対象コード表２５等を図示の機械語オブジェクト４１や監視対象コード表４３として記憶する。これは、自装置内の不図示のメモリ等の所定の記憶領域に記憶する。
【００３６】
尚、上記のことから実質的に、機械語オブジェクト２４＝機械語オブジェクト４１と見做してよいし、監視対象コード表２５＝監視対象コード表４３と見做してよいので、符号について特に区別せずに記す場合もあるものとする。つまり、例えば、機械語オブジェクト２４と記した場合に、それが機械語オブジェクト２４を意味するものであっても機械語オブジェクト４１を意味するものであってもよいものとする。これは、監視対象コード表についても同様である。
【００３７】
ターゲット装置３０は、プログラム実行管理機能部３２を有しており、ターゲット装置３０がＰＬＣである場合には、運用中にはプログラム実行管理機能部３２が機械語オブジェクト４１を実行することで、不図示の制御対象機器の制御が行われることになる。
【００３８】
但し、本手法は、運用開始前に係わるものであり、ＰＬＣ３０におけるプログラム実行管理機能部３２は、通常モードでは上記の通り機械語オブジェクト４１を実行することで不図示の制御対象機器の制御を行うが、特定のモード（チェックモードと呼ぶものとする）の場合には、プログラム実行管理機能部３２は、以下に説明するようにプログラム異常等を検出するためのチェック処理を実行する。尚、例えばユーザが、通常モード、チェックモードの何れかのモードを指定できる。また、尚、シミュレータ３０の場合には、通常モードはなく、常にチェックモードで動作するものとしてもよい。
【００３９】
本例では、プログラム実行管理機能部３２は、チェックモードにおいては、上記チェック処理を行うものとする。このチェック処理について、詳しくは後述するが、概略的には、機械語オブジェクト４１を実行しつつ、上記監視対象コード表４３を用いることで、書き込みアドレス記録表４２を生成するものである。これは、例えば、機械語オブジェクト４１の実行中に、随時、現在実行する命令が監視対象命令であるか否かを判定して、監視対象命令の実行時にアクセスするメモリアドレスを、書き込みアドレス記録表４２に記録する。監視対象命令は、監視対象コード表４３を参照することで判断できる。複数の各プログラムの各機械語オブジェクト４１について、それぞれ上記チェック処理を行うことで、書き込みアドレス記録表４２が生成（完成）される。
【００４０】
尚、書き込みアドレス記録表４２は、上記“書き込みアドレス記録表（雛形）”２３に基づいて生成してもよいが、この例に限らない。
プログラム実行管理機能部３２は、更に、上記生成した書き込みアドレス記録表４２に基づいて、異なるプログラムからの重複アクセス（二重書き込み等）があるか否かを判別してもよい。これは、特に、配列、ポインタなどに係わる“アクセスするメモリアドレスが動作中に随時決定／変更される”処理に関して、重複アクセスの有無を判別可能となる。但し、この例に限らず、この様な判別を行わずに、単に、上記生成した書き込みアドレス記録表４２を、ディスプレイに表示して、異常があるか否かをユーザに判断させるようにしてもよい。
【００４１】
尚、開発支援装置１０は、例えばパソコン等の汎用のコンピュータ上で実現されるものであり、ハードウェア的にはパソコン等の一般的な構成を有している。つまり、特に図示しないが、例えばＣＰＵ、ハードディスクやメモリ等の記憶装置等を有しており、更に図示の画面（ディスプレイ）１５、入力装置１６（キーボード、マウス等）を備えている。
【００４２】
上記記憶装置には予め所定のアプリケーションプログラムが記憶されている。上記ＣＰＵが、このアプリケーションプログラムを実行することで、上記インタフェース機能部１１、コンパイラ機能部（フロントエンドコンパイラ１２、バックエンドコンパイラ１３）、通信機能部１４等の各種機能部や後述する不図示の各種処理機能部が実現される。
【００４３】
また、上記コンパイラ機能部は、ここでは上記フロントエンドコンパイラ１２、バックエンドコンパイラ１３の２つに分けて示しているが、中間言語２２（中間コード２２）を経て機械語オブジェクト２４に変換する１つのコンパイラであってもよい。この場合、中間コード２２を出力する（そして一時的に保持する）ことは、必要ない。
【００４４】
また、特に図示しないが、上記コンパイラ機能部は、上記コンパイル処理に伴って、中間コード２２の各命令（中間言語命令と呼ぶものとする）と、機械語オブジェクトの各命令（機械語命令と呼ぶものとする）とを対応付けた中間−機械対応付けテーブル（不図示）を、生成してもよい。
【００４５】
これは、例えば、各中間言語命令毎に、それぞれ、その中間言語命令に、当該中間言語命令を変換して成る機械語命令群を対応付けた中間−機械対応付けテーブル（不図示）を生成する。対応付け方法としては、各命令のプログラム上の位置を示す情報（命令番号など）を用いるものとする。例えば、後述する図３に示す中間言語２２の具体例における５行目の中間言語命令が、不図示の機械語オブジェクトにおける１５行〜１７行目の機械語命令群に変換されたとした場合、‘５’と‘１５〜１７’とが、対応付けられることになる。
【００４６】
尚、ここでは、例えば後述する図３における各行（１行分）を、１つの中間言語命令と見做すものとする。これは、機械語オブジェクト（機械語命令群）についても同様であり、不図示の機械語命令群の各行を、それぞれ、１つの機械語命令と見做すものとする。また、通常、１つの中間言語命令は、複数の機械語命令（すなわち機械語命令群）に変換される場合が多い。
【００４７】
また、“シミュレータ又はＰＬＣ”３０も、特に図示しないＣＰＵ／ＭＰＵ等の演算プロセッサやメモリ等を有しており、メモリには予め所定のアプリケーションプログラムが記憶されている。演算プロセッサが、このアプリケーションプログラムを実行することで、通信機能部３１やプログラム実行管理機能部３２等の各種機能部や後述する不図示の各種処理機能部が実現される。
【００４８】
ユーザは、開発支援装置１０上で任意のプログラムのソースコード２１を記述する。
図２に、プログラム記述例を示す。
図２は、開発支援装置１０上に表示されるプログラム記述用の画面例を示す。
【００４９】
図示の例では、ＩＮＴ型であって５つの要素をもった配列変数が宣言されており、更に配列Ａ[i]（ｉ＝０，１，２，３，４）に所定の数値‘１０’を代入するプログラムが示されている。尚、Ａ[i]におけるｉは、変数であり、配列に付けられたインデックス等と呼ばれる。上記のように、ｉは、０，１，２，３，４の何れかの値を取り得る変数となる。
【００５０】
そして、プログラム実行中にそのときの変数ｉの値によってアクセスするメモリアドレスが決定／変更されるので、従来技術ではアクセスするメモリ位置が特定できない。
尚、上記のように従来より、変数のメモリアドレス割り付けをユーザが手動で実施している場合があり、ここでも特に図示しないが、上記配列Ａ[i]に対してユーザが例えば「6154〜6158」のアドレス範囲を指定しているものとする。コンパイラ機能部は、この様な指定に応じて、例えば図３に示す中間言語を生成する。また、特に図示しないが、変数ｉの値の決定／変更に係わる処理も、プログラム中に記述されているものとする。
【００５１】
図３は、フロントエンドコンパイラ１２が、上記ユーザが記述したソースコード２１をコンパイルして生成した中間言語（中間コード）の一例である。
図４は、図３の中間コードへのコンパイルに係わるメモリ割り付け例である。
【００５２】
尚、上記中間言語生成やメモリ割付の仕組みは、一般的なコンパイラで実現している技術であり、よって詳細な説明は行わないものとする。
以下、図３の各中間言語命令について簡単に説明する。
【００５３】
尚、ここでは、変数ｉに対してメモリアドレス6159が割り当てられたものとする。また、上記アドレス範囲「6154〜6158」の指定により、配列Ａの先頭アドレスとしてメモリアドレス6154が割り当てられるものとする。また、尚、図３に示す各中間言語命令の左側に示す１，２，３、４，５は、各中間言語命令のプログラム先頭からの順番を示す番号（命令番号と呼ぶ）である。
・「LD  １０」は、定数‘１０’をアキュムレータに読み込む。
・「PLD  M,WI,6159」は、アキュムレータの値（＝１０）をスタックに積み、メモリアドレス6159の格納データの値（変数ｉの値）を、アキュムレータに読み込む。
【００５４】
尚、不図示の他の処理によって、メモリアドレス6159の格納データ（変数ｉの値）が更新される処理が行われているものとする。上記具体例の場合、アキュムレータに読み込まれる値は、０，１，２，３，４のうちの何れかということになるはずである。
・「LEAAX  M,DU,6154」は、ＡＸレジスタにメモリアドレス6154（配列Ａの先頭アドレス）を設定する。
・「AXADDP  DU」は、ＡＸレジスタの値にアキュムレータの値を足した値（6154＋ｉ）を、ＡＸレジスタに格納し、スタックに積んである値（＝１０）をアキュムレータに取り込む。
・「ST  AX」は、ＡＸレジスタに格納されているデータによって示されるアドレス‘6154＋ｉ’に、アキュムレータの値（＝１０）を書き込む。つまり、この時のＡＸレジスタの格納データが、書き込み対象（アクセス先）のメモリアドレスになる。例えば、ｉ＝２の場合には、ＡＸレジスタが示しているアドレスは、6154＋2＝6156番地となる。
【００５５】
このように「ST  AX」命令実行の際のＡＸレジスタの値が、アクセス先メモリアドレスを示すので、本手法では、プログラム実行中に、随時、現在実行する命令が特定の命令（「ST  AX」命令など）であるか否かをチェックして、特定の命令（「ST  AX」命令など）である場合には、そのときのＡＸレジスタの値（＝6156）を記録する。
【００５６】
この記録方法は、様々であってよく、単にそのときのＡＸレジスタの値（＝6156）を、書き込みアドレス記録表４２に追加格納（蓄積）するものであってもよいが、本例では後述する図６〜図７のような方法を示す。つまり、予め作成してある上記“書き込みアドレス記録表（雛形）”２３に対して、該当箇所にチェックを入れる方法である。これについては、後に、図６、図７を参照して説明する。
【００５７】
尚、上記のことから、上記「ST  AX」命令は、“（特定の）レジスタ経由で（データを）書き込む命令”（間接アドレス指定命令）の一例であると言うこともできる。特定のレジスタは、上記一例ではＡＸレジスタであるが、この例に限らない。上記の通り、ＡＸレジスタにはアクセス先のアドレスが格納されているので、上記「ST  AX」命令は、ＡＸレジスタからアクセス先のアドレスを取得することでアクセス先にデータを書き込む命令であり、これは“ＡＸレジスタ経由で（データを）書き込む命令”と言うことができる。
【００５８】
上記「ST  AX」命令等のような“特定のレジスタ経由で（データを）書き込む命令”は、例えば上記図３のような処理に係わる命令群に含まれる。図３のような処理とは、配列Ａ[ｉ]に係わり変数ｉの値によってアクセス先が決まる処理であり、これは“アクセスするメモリアドレスが動作中に随時決定／変更される処理”や“アクセス先が可変の処理”の一例である等と言うこともできる。上述したように、従来では、この様な処理に係わる複数プログラムからの二重書き込みは、検査できない。
【００５９】
これに対して、本手法では、ターゲット装置３０において、プログラム実行中に、現在実行する命令が、上記特定の命令（監視対象命令）であるか否か、すなわち例えば“特定のレジスタ経由で（データを）書き込む命令”であるか否かを判別でき、“特定のレジスタ経由で（データを）書き込む命令”である場合には、現在の“特定のレジスタ”（ＡＸレジスタ等）の格納データ（その状況でのアクセス先アドレス）を、記録する。これを、複数のプログラムそれぞれについて実行することで、各プログラム毎の実際のアクセス先アドレス群が、記録されることになる。よって、この記録に基づいて、複数のプログラムで重複するアクセス先アドレスがあるか否かを判別できる。
【００６０】
尚、上記“現在実行する”とは、実行直前、実行中、実行直後の何れを意味するものであってもよい。
尚、上記のように「ST  AX」命令は、上記特定の命令の一例であるが、「ST  AX」命令を機械語に変換して成る機械語命令群（特に具体例は示さない）も、上記特定の命令の一例であるものとする。つまり、特定の命令とは、中間言語命令であるか機械語命令であるかは関係ない。上記一例では、「ST  AX」命令も、「ST  AX」命令に相当する機械語命令群（特に具体例は示さない）も、どちらも、特定の命令であると見做してよい。
【００６１】
ターゲット装置３０において上記のように現在実行する命令が特定の命令であるか否かを判別できるようにする為に、開発支援装置１０において、プログラム（ソースコード２１）のコンパイルの際に、このプログラムの各命令の中から特定の命令を検出して、検出した特定命令に係わる情報である特定情報を生成して、この特定情報をターゲット装置３０に渡す。この特定情報の一例が監視対象コード表であるが、この例に限らない。特定情報の他の例としては、後述する“プログラム中の所定の位置に付される所定の印”や、“プログラム中に挿入される所定の命令”等が挙げられるが、これらの例に限るものでもない。
【００６２】
上記図３に示す中間コードの場合、その生成に伴うコンパイラによるメモリ割付けは、例えば図４に示すものとなる。図３の例では、配列Ａの先頭アドレスが上記の通り‘6154’であり、要素は０〜４であるので、配列Ａに対しては図４に示すようにアドレス‘6154’、6155’、6156’、6157’、6158’が、割り当てられる。また、ここでは変数ｉに対しては上記の通りアドレス‘6159’が割り当てられている。
【００６３】
尚、後述する“書き込みアドレス記録表（雛形）”２３の作成の際には、図４の配列Ａへのメモリ割当結果（アドレス‘6154’、6155’、6156’、6157’、6158’）を用いればよい。
【００６４】
図５は、監視対象コード表２５の生成過程の具体例を示す図である。
図５（ａ）は、監視対象コード表２５の初期状態を示す図であり、図５（ｂ）はこの初期状態から上記図２、図３のプログラム例に応じてデータが格納された状態を示す。
【００６５】
監視対象コード表２５には、開発支援装置１０における任意のプログラムのコンパイル処理に伴って、監視対象命令のオフセット位置が登録される。
図５に示す例では、監視対象コード表２５は、管理番号５１、プログラム名５２、監視命令オフセット位置５３の各データ項目よりなる。
【００６６】
管理番号５１は、内部で表を管理するための一意の番号である。プログラム名５２には、コンパイル対象のプログラム名が登録される。
監視命令オフセット位置５３には、監視対象命令のオフセット位置（命令番号など）が登録される。
【００６７】
ここで、監視対象命令の検出方法について説明する。まず、監視対象命令は、例えば“特定のレジスタ経由で書き込む命令”等である。“特定のレジスタ経由で書き込む命令”は、例えば、“アクセスするメモリアドレスが動作中に随時決定／変更される”処理に係わる命令群に含まれる。
【００６８】
“特定のレジスタ経由で書き込む命令”は、本例の場合、「ST  AX」で始まる命令である。これより、中間言語２２を検索して、「ST  AX」で始まる命令を全て検出して、それらのオフセット位置を監視命令オフセット位置５３に登録する。
【００６９】
尚、上記“特定のレジスタ経由で書き込む命令”における“特定のレジスタ”は、上記一例では上記ＡＸレジスタであるが、この例に限らない。“特定のレジスタ経由で書き込む命令”は、上記一例では、ＡＸレジスタの格納データ（アドレス）が指すメモリ領域に、所定のデータ（上記具体例では‘１０’）を書き込む命令である。
【００７０】
図３の例の場合、５行目（命令番号＝‘５’）の「ST  AX,WI」命令のみが監視対象命令になるので、監視命令オフセット位置５３には、図５（ｂ）に示すように‘５’のみが格納される。
【００７１】
但し、この例に限らず、例えば、監視対象命令としての中間言語命令に対応する機械語命令のオフセット位置を、上記中間−機械対応付けテーブルを参照して求めて、これを監視命令オフセット位置５３に登録するようにしてもよい。上述した仮の具体例では、図３の５行目の中間言語命令に対応する機械語命令群のオフセット位置は‘１５〜１７行目’であるとしているので、例えばその先頭である‘１５’が、図示のように監視命令オフセット位置５３に登録されてもよい。
【００７２】
図６は、“書き込みアドレス記録表（雛形）”２３の具体例である。尚、図６は、書き込みアドレス記録表４２の初期状態を示すものと見做すこともできるので、以下、これに基づいて説明する。
【００７３】
書き込みアドレス記録表４２（その雛形２３）は、メモリアドレス６１、プログラム名６２の各データ項目より成る。
開発支援装置１０は、メモリアドレス６１の欄に、対象となるメモリアドレスを登録する。これは、上記具体例の場合、図４に示す配列Ａへのメモリ割付け結果（配列Ａに対応するアドレス）を、メモリアドレス６１の欄に登録する。これより、図６に示すように、‘6154’、6155’、6156’、6157’、6158’が、メモリアドレス６１の欄に登録される。
【００７４】
また、プログラム名６２の欄に、ターゲット装置３０で実行させるプログラムの名称等を登録する。つまり、コンパイルした各プログラムの名称等を登録する。名称は、プログラムのソースコード２１中に記述されている。図示の例では、ＰＧ１，ＰＧ２の２つのプログラム名が登録される。これによって、例えば図６に示すような書き込みアドレス記録表４２の初期状態（雛形２３）が作成される。
【００７５】
その後、この雛形２３が、コンパイル結果である機械語オブジェクト２４と共に、ターゲット装置３０にダウンロードされ、ターゲット装置３０において、書き込みアドレス記録表４２（その初期状態）として記憶される。
【００７６】
その後、ターゲット装置３０において、上記チェック処理が実行されると、ダウンロードされた各プログラム（機械語オブジェクト）が実行される。ＰＬＣ３０で実行する場合、運用としての実行ではなく、チェックモードで実行するので、制御対象機器への指令出力等は行われない。
【００７７】
そして、上記各プログラム実行中に特定の命令を実行する際に実際にアクセスするメモリアドレスを検出して、検出したメモリアドレスを書き込みアドレス記録表４２に記録することを繰り返すことで、書き込みアドレス記録表４２を完成させる。この記録処理は、本例の場合には、検出したメモリアドレスと一致するメモリアドレス６１がある場合、該当箇所に図７に示すようにチェックを付ける。
【００７８】
図７（ａ）は、上記チェック処理中における書き込みアドレス記録表４２の具体例であり、図７（ｂ）は書き込みアドレス記録表４２が完成した状態の具体例である。
図７（ａ）の例は、プログラムＰＧ１を実行中に“特定の命令（監視対象命令）を実行する際に実際にアクセスするメモリアドレス”として‘6156’が検出され、これより図示のように該当箇所にチェックが付けられた状態を示している。尚、基本的には、検出されたメモリアドレス（ここでは‘6156’）を記録するものであり、当該記録する方法の一例が上記「該当箇所にチェックが付ける」ものであり、この例に限るものではない。
【００７９】
本例の場合、実行中のプログラムに対応する監視命令オフセット位置５３に基づいて、現在実行する命令が上記監視対象命令であるか否かを判別する。上記の通り、監視命令オフセット位置５３には、監視対象命令に相当する中間言語命令の位置（中間言語における命令番号など；中間言語命令番号と呼ぶ）が格納されてもよいし、監視対象命令に相当する機械語命令の位置（機械語における命令番号など；機械語命令番号と呼ぶ）が格納されてもよい。上記具体例の場合、中間言語命令番号は‘５’であり、機械語命令番号は‘１５’であることになる。何れにしても、監視命令オフセット位置５３には、特定の命令を示す情報の一例である、特定の命令の位置（監視対象命令の位置）の情報が格納されているものと言える。
【００８０】
そして、現在実行する命令の位置が、監視対象命令の位置と一致する場合には、現在実行する命令は、監視対象命令であると判別する。ターゲット装置３０におけるプログラム実行は、機械語オブジェクト（機械語命令群）を実行するものであるので、現在実行する命令の位置は、現在実行する命令の機械語命令番号等によって示されるものであり、これは例えば後述するプログラムカウンタ（ＰＣ）の現在値である。監視命令オフセット位置５３に監視対象命令に対応する機械語命令番号が格納されている場合には、プログラムカウンタ（ＰＣ）の現在値が、監視命令オフセット位置５３と一致するか否かを判定すればよい。一方、監視命令オフセット位置５３に監視対象命令に対応する中間言語命令番号が格納されている場合には、まず、この中間言語命令番号を対応する機械語命令番号に変換する必要がある。この変換には例えば上記中間−機械対応付けテーブルを用いればよい。
【００８１】
尚、上記具体例では、中間言語命令番号は‘５’、機械語命令番号は‘１５’となり、これらの何れか一方がプログラムＰＧ１に対応する監視命令オフセット位置５３に格納されていることになる。
【００８２】
また、尚、上記判別に用いる監視命令オフセット位置５３は、現在実行中のプログラムのプログラム名と同一のプログラム名５２に対応する監視命令オフセット位置５３である。
【００８３】
上記特定の命令（監視対象命令）は、上記一例では“特定のレジスタ経由で（データを）書き込む命令”である。また、特定の命令は、一例としては、“アクセスするメモリアドレスが処理中に随時決定／変更される処理”に係わる命令であるとも言える。
【００８４】
図８は、ターゲット装置３０のプログラム実行管理機能を示す図である。
ユーザが記述したソースコード２１は、開発支援装置１０のコンパイル機能で、ターゲット装置３０で動作する機械語オブジェクト２４に変換され、この機械語オブジェクト２４がターゲット装置３０に転送されて機械語オブジェクト４１として格納される。従って、「機械語オブジェクト２４＝機械語オブジェクト４１」と見做してよい。
【００８５】
ターゲット装置３０のプログラム実行管理機能部３２は、例えば上記チェックモードでは、各プログラムの機械語オブジェクト４１（上記ＰＧ１やＰＧ２等）を順次実行しつつ、上記監視対象命令を実行する際に実際にアクセスするメモリアドレスを検出して記録する処理を実行する。
【００８６】
尚、各プログラムの実行動作自体は、運用中におけるプログラム実行動作と同様であってよく、つまり既存の一般的な動作であってよく、特に詳細には説明しないが、図示のＰＧ実行リストに従って、図示のプログラム用メモリに格納された各プログラム（機械語オブジェクト４１；本例ではＰＧ１，ＰＧ２）を、順次、実行する処理となる。
【００８７】
ターゲット装置３０のプログラム実行管理機能部３２には、一般にプログラムカウンタ（PC）と呼ばれる、プログラムの実行位置を示すポインタがある。プログラム実行管理機能部３２による機械語オブジェクト４１実行の際には、随時、そのときにPCが示す位置のデータ（命令）を取り込み、取り込んだ命令を命令実行機能によって実行し、その後PCを次の命令の位置に移動する（例えばＰＣの値を＋１インクリメントする）。命令の実行に応じてメモリに対して読み書きを実施する。
【００８８】
以上が、一般的なプログラム実行動作であるが、本例のプログラム実行管理機能部３２は、このプログラム実行動作に伴って、監視対象命令を実行する際に実際にアクセスするメモリアドレスを検出して「書き込みアドレス記録表」４２に記録する処理を行う。
【００８９】
上記プログラム実行に伴って「書き込みアドレス記録表」４２にデータを記録する処理の流れを、以下に記載する。
ＰＣ（プログラムカウンタ）は、実行する機械語命令の位置（相対アドレス等）を示すので、各機械語命令を実行する際に、そのときのＰＣの値を、監視対象コード表４３の監視命令オフセット位置５３の値と比較して、一致した場合は、現在実行する機械語命令が上記特定の命令に相当すると判定する。但し、この処理は、監視命令オフセット位置５３に、機械語命令のオフセット位置（上記具体例の場合、‘１５’）が、登録される形態の場合の処理である。
【００９０】
監視命令オフセット位置５３に、上記監視対象命令に相当する中間言語命令のオフセット位置（上記具体例の場合、‘５’）が登録される形態の場合には、上記中間−機械対応付けテーブルを参照することで、上記中間言語命令に対応する機械語命令のオフセット位置を、求める処理が必要となる。そして、上記ＰＣの値が、この機械語命令のオフセット位置と一致する場合には、現在実行する命令が特定の命令に相当すると判定することになる。尚、勿論、この処理を実現する為に、予め、上記中間−機械対応付けテーブル（不図示）を、ターゲット装置３０にダウンロードしておく必要がある。
【００９１】
上記何れの形態であっても、監視対象コード表４３の監視命令オフセット位置５３を参照することで、そのとき実行する機械語命令が、特定の命令（監視対象命令）に係わるものであるか否かを判定できる点では、同じことである。
【００９２】
上述した本例の場合、特定の命令の実行時には、ＡＸレジスタにはアクセス先のメモリアドレスが格納されているので、このときのＡＸレジスタの格納データを、実行しているプログラム（その名称等）に対応付けて、書き込みアドレス記録表４２に記録する。この処理は、本例の場合には、上記図７で説明したように、書き込みアドレス記録表４２のメモリアドレス６１の欄を検索して、上記ＡＸレジスタの格納データ（アクセス先メモリアドレス）と一致するアドレスがあるか否かを判定する。そして、ある場合には、該当個所に特定の印（チェック）をつける。該当箇所とは、書き込みアドレス記録表４２において、プログラム名６２が現在実行しているプログラムのプログラム名である列において、上記“一致するアドレス”に対応するセルである。
【００９３】
上述した具体例の場合、仮に上記プログラムＰＧ１を実行中の場合、例えばｉの値が２の場合、ＡＸレジスタの値は、6156（＝6154＋2）なので、図７（ａ）に示すようにPG1の6156にチェックをつける。
【００９４】
この動作をプログラムＰＧ２の実行の際にも行い、書き込みアドレス記録表４２の該当箇所にチェックをつけることで、「書き込みアドレス記録表」４２は最終的には図７（ｂ）に示す状態になったものとする。つまり、「書き込みアドレス記録表」４２が完成したことになる。
【００９５】
尚、本例では、複数のプログラムとしてプログラムＰＧ１，ＰＧ２の２つを示すが、この例に限らず、３つ以上あってもよい。基本的には、全てのプログラムについて、その実行の際に上記の動作を行って、特定の命令がある場合にはその実行時の上記ＡＸレジスタの現在値と一致するアドレスに対応して印（チェック）を付ける。
【００９６】
例えば図７（ｂ）の完成した「書き込みアドレス記録表」４２を用いて、異なるプログラムからの重複アクセス（二重書き込み等）があるアドレスを判別できる。これは、例えば、図７（ｂ）の完成した「書き込みアドレス記録表」４２を、ディスプレイに表示する。このディスプレイ表示は、ターゲット装置３０で行ってもよいし、開発支援装置１０で行ってもよい。
【００９７】
ユーザは、このディスプレイ表示を参照することで、実際の動作において複数のプログラムから重複してアクセスされるアドレスを、判断することができる。どのプログラムとどのプログラムから重複してアクセスされるのかを判断することができる。例えば、図７（ｂ）の例の場合には、アドレス‘6156’が、プログラムＰＧ１とプログラムＰＧ２とから重複してアクセスされるものであると判断することができる。
【００９８】
また、重複アクセスされるアドレスがある場合に、更に、この重複アクセスが問題となるものであるか否かを、ユーザが判断するものであってもよい。
複数のプログラムから重複してアクセスされるアドレスがあっても、それがユーザが意図したものであれば特に問題はないが、ユーザが意図しないものであれば問題となる。この様な判断は、ユーザが行うしかないので、上記ディスプレイ表示を行って、ユーザに判断させる。
【００９９】
この例に限らず、例えば、完成した「書き込みアドレス記録表」４２に基づいて、複数のプログラムから重複してアクセスされるアドレスを抽出して、これをディスプレイ表示するようにしてもよい。これは、完成した書き込みアドレス記録表４２を検索して、２つ以上のチェックが存在するメモリのアドレスを抽出する。これにより、二重書き込みされるアドレスを検出して表示することができる。
【０１００】
尚、「監視対象コード表」により、監視対象命令の位置が特定できるので、この位置から対応するソースコードも表示することが可能であり、不具合の修正が容易に実施できる。
【０１０１】
上述した一実施例の場合、ターゲット装置３０において、プログラム実行に伴って、監視対象コード表２５に対してＰＣの値と一致するアドレスの検索を実施しているが、テーブルの検索処理はオーバーヘッドがあり、プログラムの実行性能を劣化させる。
【０１０２】
そこで、監視対象コード表２５を用いない形態（変形例）を提案する。この変形例は、監視対象コード表２５を生成する代わりに、以下に説明するような、“プログラム中の所定の位置に付される所定の印”や、“プログラム中に挿入される所定の命令”等の情報を、生成するものである。
【０１０３】
変形例では、例えば、開発支援装置１０においてコンパイルの際に上記のように監視対象命令を検出すると、この監視対象命令を変換してなる機械語命令に対して、予め決められている所定の印等を付しておく。これによって、生成される機械語オブジェクト２４において、特定の位置に上記所定の印が付された状態になっている。
【０１０４】
ターゲット装置３０は、機械語オブジェクトの実行に伴ってその各機械語命令の実行時、上記所定の印が付されているか否かをチェックして、印が付されている場合には、そのときのＡＸレジスタの値を書き込みアドレス記録表４２に記録する。
【０１０５】
あるいは、上記所定の印を付す代わりに、所定の命令を挿入するようにしてもよい。つまり、開発支援装置１０においてコンパイルの際に上記のように監視対象命令を検出すると、この監視対象命令を変換してなる機械語命令の前または後等に、予め決められている所定の命令を挿入しておく。
【０１０６】
これより、ターゲット装置３０において機械語オブジェクト実行すると、上記監視対象命令に相当する機械語命令を実行する際に（その直前／直後のタイミングで）、上記所定の命令が実行されることになる。所定の命令とは、上述した“そのときのＡＸレジスタの格納データを、「書き込みアドレス記録表」４２に記録する”処理を行うものである。
【０１０７】
この様にすることで、テーブル検索による性能劣化を防止することも可能である。
尚、上記プログラムＰＧ１、ＰＧ２は、それぞれが、例えばＩＥＣ６１１３１−３の１個のＰＯＵ（Program Organization Unit）に相当すると考えてもよいが、この例に限らない。ＰＬＣでは、通常、複数のＰＯＵが、それぞれ、自己に割り当てられた所定の周期で、定周期動作する。あるＰＯＵを実行する際にアクセスするメモリ（アドレス）に、別のＰＯＵを実行する際にもアクセスされる場合、問題が生じる場合がある。但し、必ず問題が生じるわけではないので、開発者が意図的に複数のＰＯＵが同一アドレスにアクセスするようにプログラミングするケースも有り得る。
【０１０８】
従来は、ユーザが作成したプログラム（ソースコード）に関して、特に、“アクセスするメモリアドレスが動作中に随時決定／変更される”処理が含まる場合、（更に、変数のメモリアドレス割り付けをユーザが手動で実施している場合）、ユーザが意図しない二重書き込みでシステムに障害が発生する可能性があったが、プログラム中のこの様な問題箇所を検出することは困難であった。この為、ユーザは、膨大なプログラムとメモリマップを確認しながら、不具合箇所を絞り込んでいた。
【０１０９】
これに対して、本手法を用いることにより、ユーザが意図しない二重書き込みを事前に検出でき、システムの安定稼働や、意図しない二重書き込みが原因の不具合調査、対策のための時間が不要になり、ユーザのソフトウエア開発効率、品質が向上する効果がある。
【０１１０】
本手法では、ユーザが作成したプログラム（ソースコード）を開発支援装置がコンパイルする際に、プログラム中から監視対象命令を検出して当該監視対象命令を示す情報を「監視対象コード表」に記録する。
【０１１１】
ターゲット装置（コントローラまたはシミュレータ）が上記プログラム（機械語）を実行する時、上記「監視対象コード表」に基づいて、現在実行する命令が上記監視対象命令であるか否かを判別できる。現在実行する命令が上記監視対象命令である場合、そのときの特定のレジスタの格納データを、「書き込みアドレス記録表」に記録する。この処理を、複数のプログラムについて実行する。そして、「書き込みアドレス記録表」の記録内容から、複数のプログラムから重複してアクセスされるアドレスを検出して、ユーザに通知する。
【０１１２】
本発明によれば、動的にメモリアクセスする場合でも、異なるプログラムからの二重書き込みを検出することができる。これによる、ユーザの意図しないメモリの書き込みが検出可能となり、プログラムの品質向上を実現する。
【０１１３】
尚、特に図示しないが、開発支援装置（ローダ）１０やターゲット装置３０は、以下に説明する各種処理機能部を有するものと言うこともできる。
開発支援装置１０は、プログラマブルコントローラ用の各プログラムのソースコードを、機械語オブジェクトに変換するコンパイル処理を装置である。
【０１１４】
開発支援装置１０は、上記各プログラムのコンパイル処理の際に、特定の命令を検出する特定命令検出機能部（不図示）、該検出した特定命令に係わる情報である特定情報を生成する特定情報生成機能部（不図示）、該特定情報をターゲット装置３０に転送する転送機能部（不図示）等を有する。
【０１１５】
ターゲット装置３０は、上記各プログラムの機械語オブジェクトの実行中に、上記特定情報に基づいて、上記特定命令の実行時のアクセス先のメモリアドレスを、実行中のプログラムに対応付けて記録する実アクセス先記録機能部（不図示）を有する。
【０１１６】
上記特定命令（特定の命令）や特定情報については、具体例について既に説明しており、ここでは簡単に説明するものとする。
すなわち、上記特定命令は、“（特定の）レジスタ経由で書き込む命令”であり、上記特定命令の実行時の該特定のレジスタの格納データが、上記特定命令の実行時のアクセス先のメモリアドレスとなる。これより、上記実アクセス先記録機能部（不図示）は、上記特定命令の実行時の該特定のレジスタの格納データを上記アクセス先のメモリアドレスとして取得する。特定のレジスタは、上記具体例ではＡＸレジスタであるが、この例に限らない。
【０１１７】
例えば、上記特定情報は、一例としては、上記特定命令の上記プログラム上の位置を示す情報（例えば、命令番号など；上記中間言語命令番号であってよいし、上記機械語命令番号であってもよい）である。
【０１１８】
この例において、上記実アクセス先記録機能部（不図示）は、上記機械語オブジェクト実行中に、現在のプログラム実行位置が、上記特定情報が示す位置と一致する場合に、上記特定命令の実行時と見做して、上記アクセス先のメモリアドレスを、実行中のプログラムに対応付けて記録する。
【０１１９】
この処理の一例が、上述したプログラムカウンタと監視命令オフセット位置５３を用いた処理である。この例の場合、上記特定命令の上記プログラム上の位置を示す情報は、該特定命令の命令番号であり、上実アクセス先記録機能部（不図示）は、プログラムカウンタの値が上記特定命令の命令番号と一致するときに、上記特定命令の実行時と見做すことになる。
【０１２０】
尚、上記「特定情報が示す位置」は、特定情報が例えば上記中間言語命令番号である場合には、これを対応する機械語命令番号に変換したものとなる（その際、例えば上記中間−機械対応付けテーブル（不図示）を用いる）。
【０１２１】
また、例えば、上記特定情報生成機能部（不図示）による上記特定情報の生成は、一例としては、上記機械語オブジェクト上の上記特定命令に、所定のマークを付すことである。この例の場合、上記転送機能部（不図示）による上記特定情報の転送は、該所定のマークが付された機械語オブジェクトを転送することを意味することになる。
【０１２２】
そして、この例において、上記実アクセス先記録機能部（不図示）は、上記機械語オブジェクト実行中に該マークを検出すると、上記特定命令の実行時と見做して、上記アクセス先のメモリアドレスを、実行中のプログラムに対応付けて記録する。
【０１２３】
また、例えば、上記特定情報生成機能部（不図示）による上記特定情報の生成は、一例としては、上記記機械語オブジェクトにおける上記特定命令の前または後に、上記アクセス先のメモリアドレスを、実行したプログラムに対応付けて記録する処理を実現する所定の命令を、挿入するものである。この例の場合、上記転送機能部（不図示）による上記特定情報の転送は、該所定の命令が含まれる上記機械語オブジェクトを転送することを意味することになる。
【０１２４】
そして、この例の場合、上記実アクセス先記録機能部（不図示）は、単にこの機械語オブジェクトを実行することで、上述した“特定命令の実行時のアクセス先のメモリアドレスを、実行中のプログラムに対応付けて記録する”処理を、実現させることになる。
【０１２５】
ターゲット装置３０は、例えば、上記記録したメモリアドレスに基づいて、上記複数のプログラムで同一のメモリアドレスにアクセスするか否かをチェックするチェック機能部（不図示）を、更に有するものであっても構わない。
【０１２６】
また、上記特定命令は、例えば、“アクセスするメモリアドレスがその都度決定／変更される処理”に係わる命令であるが、この例に限らない。
また、本説明において、“／”は、基本的には（数式等は除く）、“または”や“あるいは”を意味するものとする。これより、例えば、“または／及び”は、“または、あるいは、及び”を意味するものとなる。
【符号の説明】
【０１２７】
１０  開発支援装置（ローダ）
１１  インタフェース機能部
１２  フロントエンドコンパイラ
１３  バックエンドコンパイラ
１４  通信機能部
１５  画面（ディスプレイ）
１６  入力装置
２１  ソースコード
２２  中間言語
２３  “書き込みアドレス記録表（雛形）”
２４  機械語オブジェクト
２５  監視対象コード表
３０  ターゲット装置
３１  通信機能部
３２  プログラム実行管理機能部
４１  機械語オブジェクト
４２  書き込みアドレス記録表
４３  監視対象コード表
５１  管理番号
５２  プログラム名
５３  監視命令オフセット位置
６１  メモリアドレス
６２  プログラム名
【図１】
2017130068.tif 000003
【図２】
2017130068.tif 000004
【図３】
2017130068.tif 000005
【図４】
2017130068.tif 000006
【図５】
2017130068.tif 000007
【図６】
2017130068.tif 000008
【図７】
2017130068.tif 000009
【図８】
2017130068.tif 000010