(57)【要約】【課題】変更箇所に応じた機械語オブジェクトのみを生成してＰＬＣのプログラム更新を実現する。【解決手段】ソースコード２１が修正版である場合、フロントエンドコンパイラ１３によって修正箇所（修正回路）だけを中間言語２２に変換し、これをバックエンドコンパイラ１４によって機械語オブジェクト２４に変換する共に、回路位置表２５等に基づいて変更情報管理表２３を生成する。そして、修正版の機械語オブジェクト２４を変更情報管理表２３と共にＰＬＣ３０に転送する。ＰＬＣ３０は、既存の機械語オブジェクト４１を、修正版の機械語オブジェクト２４と変更情報管理表２３を用いて更新する。【選択図】図１
2016151973.tif 000002
【特許請求の範囲】
【請求項１】
制御装置と、該制御装置用のプログラムのソースコードをコンパイルして機械語オブジェクトに変換する開発支援装置を有する制御システムであって、
前記開発支援装置は、
複数の回路から構成される前記ソースコードを該回路毎に機械語オブジェクトに変換して前記制御装置に送信すると共に、該各機械語オブジェクトの格納位置とサイズ情報を回路位置表に登録するコンパイル手段を有し、
前記制御装置は、前記送信されてくる機械語オブジェクトをプログラム記憶手段に記憶し、
前記コンパイル手段は、前記ソースコードが修正版である場合、修正があった前記回路のみを機械語オブジェクトに変換して成る修正版の機械語オブジェクトを、前記制御装置に送信すると共に、該修正版の機械語オブジェクトのサイズと、前記回路位置表から得られた修正前の機械語オブジェクトの格納位置とサイズ情報とを、修正情報として前記制御装置に送信し、
前記制御装置は、前記修正情報に基づいて、前記プログラム記憶手段に記憶されている既存の各機械語オブジェクトのなかで前記修正があった回路に対応する機械語オブジェクトを、前記修正版の機械語オブジェクトに置き替えることを特徴とする制御コントロールシステム。
【請求項２】
前記制御装置は、
前記修正情報における前記修正前の機械語オブジェクトの格納位置に基づいて、前記プログラム記憶手段の先頭から該格納位置直前までの領域の機械語オブジェクトを、別記憶領域にコピーし、
該別領域における該コピーの直後に前記修正版の機械語オブジェクトを格納することを特徴とする請求項１記載の制御コントロールシステム。
【請求項３】
前記制御装置は、
前記修正情報における前記修正前の機械語オブジェクトの格納位置とサイズに基づいて、前記プログラム記憶手段に記憶されている残りの既存の機械語オブジェクトを、前記別領域における修正版の機械語オブジェクトの直後にコピーすることで、機械語オブジェクトを更新することを特徴とする請求項２記載の制御コントロールシステム。
【請求項４】
前記コンパイル手段は、前記ソースコードを一旦中間コードに変換してから該中間コードを前記機械語オブジェクトに変換することを特徴とする請求項１〜３の何れかに記載の制御コントロールシステム。
【請求項５】
制御装置と、該制御装置用のプログラムのソースコードをコンパイルして機械語オブジェクトに変換する開発支援装置を有する制御システムにおける該開発支援装置であって、
複数の回路から構成される前記ソースコードを、該回路毎に機械語オブジェクトに変換して前記制御装置に送信すると共に、該各機械語オブジェクトの格納位置とサイズ情報を回路位置表に登録するコンパイル手段を有し、
前記コンパイル手段は、前記ソースコードが修正版である場合、修正があった前記回路のみを機械語オブジェクトに変換して成る修正版の機械語オブジェクトを、前記制御装置に送信すると共に、該修正版の機械語オブジェクトのサイズと、前記回路位置表から得られた修正前の機械語オブジェクトの格納位置とサイズ情報とを、修正情報として前記制御装置に送信することを特徴とする制御コントロールシステムの開発支援装置。
【請求項６】
制御装置と、該制御装置用のプログラムのソースコードをコンパイルして機械語オブジェクトに変換する開発支援装置を有する制御システムにおける該制御装置であって、
前記開発支援装置から送信されてくる機械語オブジェクトをプログラム記憶手段に記憶し、
前記開発支援装置から修正版の機械語オブジェクトと修正情報が送信されてきた場合には、該修正情報に基づいて、前記プログラム記憶手段に記憶されている既存の各機械語オブジェクトのなかで修正部分に対応する機械語オブジェクトを、前記修正版の機械語オブジェクトに差し替えることを特徴とする制御コントロールシステムの制御装置。
【請求項７】
前記修正情報に含まれる修正前の機械語オブジェクトの格納位置に基づいて、前記プログラム記憶手段の先頭から該格納位置直前までの領域の機械語オブジェクトを、別記憶領域にコピーし、
該別領域における該コピーの直後に前記修正版の機械語オブジェクトを格納することを特徴とする請求項６記載の制御コントロールシステムの制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、制御装置用プログラムの更新処理に関する。
【背景技術】
【０００２】
ＰＬＣソフトウエア開発は、「ソースコードの編集→コンパイル→ＰＬＣへ転送→デバッグ」を繰り返し実施する。デバッグ作業中に、ソースコード上に不具合が存在すると、ソースコードを修正して、「修正版のコンパイル→ＰＬＣへ転送→デバッグ」を実施する。これは、ＰＬＣ等のターゲットのプログラム修正（変更／更新）を、オンラインで行うものであり、オンライン更新等と呼ぶものである。
【０００３】
上記作業の大部分は、局部的な修正で対応可能であるが、一部の変更であってもそのソースコードファイル全体をコンパイルして転送していた。そのためコンパイル処理や転送に時間がかかり、ユーザのソフトウエア開発がスムーズに実施できない課題がある。
【０００４】
また、例えば、特許文献１の従来技術が知られている。
特許文献１には、ソースコードを、まず、フロントエンドコンパイラによって中間コードに変換し、この中間コードをバックエンドコンパイラによって機械語オブジェクトに変換する従来技術が、開示されている。
【０００５】
特許文献１の発明では、フロントエンドコンパイラはソースコードと中間コードの対応情報である第１の対応表を、バックエンドコンパイラは中間コードと機械語オブジェクトの対応情報である第２の対応表を作成し、ソースコードの部分的な変更が生じた場合は第１、第２の対応表に基づいて該当部分の機械語オブジェクトを生成する。
【０００６】
これによって、プログラマブルコントローラのソフトウェア開発における、コーディング・コンパイル・転送・デバッグの一連の作業を繰り返す過程において、ソースコードの変更量に見合った機械語オブジェクトの転送を実施することにより作業者の待ち時間を短縮させ、デバッグ効率を向上させることができる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００７−１８８３６６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
デバッグ中の変更作業は、局部的な変更が大部分であるが、従来の方法では、変更後のソースコード全体をコンパイルして機械語オブジェクトを生成して、ターゲットに転送し更新していた。機械語オブジェクトの大部分は、変更前と変更後で同じであるにもかかわらず、全体をターゲットに転送して更新していた。
【０００９】
本発明の課題は、変更箇所を含む一部だけをコンパイルして成る必要最低限の機械語オブジェクトを生成して、これをターゲットに送信してターゲットにおけるプログラムを更新させることで、オンライン更新に係る時間を短縮することができる制御コントロールシステム、その開発支援装置、制御装置等を提供することである。
【課題を解決するための手段】
【００１０】
本発明の制御コントロールシステムは、制御装置と、該制御装置用のプログラムのソースコードをコンパイルして機械語オブジェクトに変換する開発支援装置を有する制御コントロールシステムであって、下記の構成を有する。
【００１１】
前記開発支援装置は、複数の回路から構成される前記ソースコードを該回路毎に機械語オブジェクトに変換して前記制御装置に送信すると共に、該各機械語オブジェクトの格納位置とサイズ情報を回路位置表に登録するコンパイル手段を有する。
【００１２】
前記制御装置は、前記送信されてくる機械語オブジェクトをプログラム記憶手段に記憶する。
そして、前記コンパイル手段は、前記ソースコードが修正版である場合、修正があった前記回路のみを機械語オブジェクトに変換して成る修正版の機械語オブジェクトを、前記制御装置に送信すると共に、該修正版の機械語オブジェクトのサイズと、前記回路位置表から得られた修正前の機械語オブジェクトの格納位置とサイズ情報とを、修正情報として前記制御装置に送信する。
【００１３】
この場合、前記制御装置は、前記修正情報に基づいて、前記プログラム記憶手段に記憶されている既存の各機械語オブジェクトのなかで前記修正があった回路に対応する機械語オブジェクトを、前記修正版の機械語オブジェクトに置き替える。
【発明の効果】
【００１４】
本発明の制御コントロールシステム、その開発支援装置、制御装置等によれば、変更箇所を含む一部だけをコンパイルして成る必要最低限の機械語オブジェクトを生成して、これをターゲットに送信してターゲットにおけるプログラムを更新させることで、オンライン更新に係る時間を短縮することができる。
【図面の簡単な説明】
【００１５】
【図１】本例の制御コントロールシステムの構成図である。
【図２】ソースコードの具体例である。
【図３】図２のソースコードを中間言語に変換した結果を示す図である。
【図４】図３の中間言語の一部を機械語オブジェクトに変換した結果を示す図である。
【図５】フロントエンドコンパイラの処理フローチャート図である。
【図６】（ａ）〜（ｃ）は、回路位置表の生成プロセスを示す図（その１）である。
【図７】バックエンドコンパイラの処理フローチャート図である。
【図８】（ａ）〜（ｂ）は、回路位置表の生成プロセスを示す図（その２）である。
【図９】生成された中間言語と機械語オブジェクトの相互の関係を示す図である。
【図１０】変更後のソースコードの具体例を示す図である。
【図１１】処理対象のソースコードが、更新版である場合のコンパイル処理のフローチャート図（１／２）である。
【図１２】処理対象のソースコードが、更新版である場合のコンパイル処理のフローチャート図（２／２）である。
【図１３】（ａ）は更新前後の中間言語の具体例、（ｂ）は更新後の回路位置表の具体例である。
【図１４】変更情報管理表の具体例である。
【図１５】ダウンロード情報を受信したＰＬＣ側の処理の具体例を示す図（１／３）である。
【図１６】ダウンロード情報を受信したＰＬＣ側の処理の具体例を示す図（２／３）である。
【図１７】ダウンロード情報を受信したＰＬＣ側の処理の具体例を示す図（３／３）である。
【発明を実施するための形態】
【００１６】
以下、図面を参照して本発明の実施の形態について説明する。
図１は、本例の制御コントロールシステムの構成図である。
本システムは、開発支援装置（ローダ）１０、ＰＬＣ（プログラマブルコントローラ）３０などを有する。尚、ここでは、制御装置の一例としてＰＬＣを示すが、この例に限らず、例えばＤＣＳ（分散制御システム；Distributed Control System）等であってもよい。本システムは、ＰＬＣ、ＤＣＳ等の制御装置のプログラムを、管理するものである。
【００１７】
開発支援装置（ローダ）１０は、まず、任意のＰＬＣ用プログラムのソースコード２１をユーザに作成させるインターフェース機能部１１（エディタ機能も含む）を有する。このインターフェース機能部１１は、よく知られた既存の機能であり、ここでは特に説明しない。尚、上記ＰＬＣ用プログラムは、ＰＬＣ３０で実行させる制御プログラム等である。
【００１８】
開発支援装置（ローダ）１０は、また、上記ユーザが作成したソースコード２１を、ターゲット（ＰＬＣ３０）上で動作する機械語オブジェクト２４に変換するコンパイラ機能部（フロントエンドコンパイラ１３、バックエンドコンパイラ１４）を有する。これは、一旦、中間言語２２（中間コード）に変換した後に機械語オブジェクト２４に変換するものである。中間コードについては、例えば上記特許文献１等に記載の既存のものであり、ここでは特に説明しない。
【００１９】
まず、フロントエンドコンパイラ１３が、上記ソースコード２１を解析して中間言語２２に変換する。続いて、バックエンドコンパイラ１４が、この中間言語２２をＰＬＣ３０で動作する機械語オブジェクト２４に変換する。この様な中間言語２２、機械語オブジェクト２４への変換機能自体は、よく知られた既存機能であるので、ここでは特に説明しない。
【００２０】
ここで、本例のコンパイラ機能部（フロントエンドコンパイラ１３、バックエンドコンパイラ１４）は、上記変換処理に伴って図示の変更情報管理表２３、回路位置表２５を生成する。これについては、後に具体例を参照して詳細に説明するものとする。
【００２１】
そして、開発支援装置（ローダ）１０は、通信機能部１２を有する。通信機能部１２によって、不図示の通信線などを介して、例えばＰＬＣ３０との通信を行うことができる。例えば、上記コンパイル処理によって生成された機械語オブジェクト２４等を、通信機能部１２によって、ＰＬＣ３０にダウンロードする。
【００２２】
ＰＬＣ３０は、その通信機能部３１によって開発支援装置（ローダ）１０と通信することができ、以って上記ダウンロードされる機械語オブジェクト２４等を受信する。そして、受信した機械語オブジェクト２４を図示の機械語オブジェクト４１として自己の不図示のメモリ等の所定の記憶領域に記憶する。ＰＬＣ３０は、プログラム実行管理機能部３２を有しており、プログラム実行管理機能部３２が上記機械語オブジェクト４１を実行することで、たとえば不図示の制御対象機器を制御する。
【００２３】
尚、開発支援装置１０は、例えばパソコン等の汎用のコンピュータ上で実現されるものであり、ハードウェア的にはパソコン等の一般的な構成を有している。つまり、特に図示しないが、例えばＣＰＵ、ハードディスクやメモリ等の記憶装置等を有しており、更に図示の画面（ディスプレイ）１５、入力装置１６（キーボード、マウス等）を備えている。
【００２４】
上記記憶装置には予め所定のアプリケーションプログラムが記憶されている。上記ＣＰＵが、このアプリケーションプログラムを実行することで、上記インタフェース機能部１１、コンパイラ機能部（フロントエンドコンパイラ１３、バックエンドコンパイラ１４）、通信機能部１２等の各種機能部が実現される。
【００２５】
また、上記ソースコード２１、中間言語２２、変更情報管理表２３、回路位置表２５、機械語オブジェクト２４等は、上記記憶装置に記憶される。
同様に、ＰＬＣ３０も、特に図示しないＣＰＵ／ＭＰＵ等の演算プロセッサやメモリ等を有しており、メモリには予め所定のアプリケーションプログラムが記憶されている。演算プロセッサが、このアプリケーションプログラムを実行することで、通信機能部３１やプログラム実行管理機能部３２等の各種機能部が実現される。また、上記機械語オブジェクト４１は、上記メモリ等に記憶される。
【００２６】
ここで、開発支援装置（ローダ）１０は、コンパイル対象のソースコード２１が、既存の任意のソースコードの更新版（バージョンアップなど）であった場合には、ソースコード２１全体をコンパイルするのではなく、その一部だけをコンパイルしてなる機械語オブジェクト２４を生成する。この様な機械語オブジェクト２４を機械語オブジェクト２４（一部）と記すものとする。また、これに伴って変更情報管理表２３を生成する。そして、通信機能部１２によって、これら機械語オブジェクト２４（一部）と変更情報管理表２３とを、ＰＬＣ３０にダウンロードする。
【００２７】
これらダウンロードデータを受信したＰＬＣ３０は、変更情報管理表２３に基づいて、上記メモリ等に記憶されている既存の機械語オブジェクト４１の一部を、機械語オブジェクト２４（一部）と入れ替える操作を行う。更に、既存の機械語オブジェクト４１の別の一部の格納位置を変更する。このようにすることで、機械語オブジェクト４１の更新を実現する。これによって、更新版の機械語オブジェクトへの変換処理負荷を軽減すると共に、生成される上記機械語オブジェクト２４（一部）のデータ容量は少なくて済む。
【００２８】
以下、上記開発支援装置（ローダ）１０、ＰＬＣ（プログラマブルコントローラ）３０の処理機能について、具体例も用いて、更に詳細に説明する。
まず、図２に、ソースコード２１の具体例を示す。
【００２９】
図２に示すように、ＰＬＣ用のプログラムは、あるまとまった命令の組み合わせ（回路）を、１つの単位として記述される。つまり、回路単位で記述される。例えば、図２の場合、プログラム言語はラダー言語であり、ラダー言語の場合、左母線から開始し右母線で終了する命令の集合が、１つの回路となる。図２に示す例のプログラムは。３つの回路から成ることになる。
【００３０】
また、各回路に対して、ユニークな識別番号（回路管理番号）が割当てられる。図２に示す例では、上記３つの回路に対してそれぞれ、回路管理番号‘0001’、‘0002’、‘0003’が割当てられている。これは、例えば、上記インターフェース機能部１１のエディタ機能が、各回路に対して任意の回路管理番号を自動的に割当てて、該回路管理番号により各回路を管理するものであるが、この例に限らない。
【００３１】
図３には、図２のソースコード２１をフロントエンドコンパイラ１３でコンパイルした結果（中間言語２２；中間コード）を示す。
図示のように、例えば図２の回路管理番号＝‘0001’の回路は、以下の中間コードに変換される。
【００３２】
ＬＤ          Ｃ００１
ＡＮＤ        Ｃ００２
ＳＴ          Ｃ００３
上記中間コードが、更に、上記バックエンドコンパイラ１４によって機械語オブジェクト２４に変換される。ここでは一例として上記「ＬＤ     Ｃ００１」が機械語オブジェクト２４に変換された例を、図４に示す。
【００３３】
図４に示すように、例えば、図３の中間言語の「LD C001」は、４つの機械語命令に変換される。この例の場合、仮に機械語１命令が４バイトであるとしたならば、機械語オブジェクトのサイズは、４×４＝１６バイトとなる。尚、機械語オブジェクトとは、ＰＬＣ上で動作する機械語命令の集合である。機械語命令は、ＰＬＣが直接解釈／実行できる最小単位である。
【００３４】
フロントエンドコンパイラ１３、バックエンドコンパイラ１４は、上記変換処理に伴って、上記回路位置表２５を生成する。フロントエンドコンパイラ１３、バックエンドコンパイラ１４の処理フローチャートを図５、図７に示すと共に、これに伴う回路位置表２５の生成例を、図６、図８に示す。尚、図６と図８（ａ）は生成途中の状態であり、図８（ｂ）が回路位置表２５を生成完了した状態を示す。
【００３５】
図５は、フロントエンドコンパイラ１３の処理フローチャート図である。この処理に伴う回路位置表２５の生成の様子を、図６（ａ）〜（ｃ）に示す。
フロントエンドコンパイラ１３は、ソースコード２１を回路単位でコンパイルし、これに伴って図６（ａ）〜（ｃ）に示すように回路位置表２５にデータを登録していく。
【００３６】
図５の処理において、まず、処理開始時には回路位置表２５は、例えば図６（ａ）に示すように、何もデータは登録されていない状態である。回路位置表２５のフォーマットは、図示のように、大別して、回路管理番号５１、中間言語情報５２、機械語オブジェクト情報５３の各データ項目より成る。更に、中間言語情報５２は、開始命令位置５２ａ、終了命令位置５２ｂの各データ項目から成る。機械語オブジェクト情報５３は、開始位置５３ａ、サイズ５３ｂの各データ項目から成る。
【００３７】
図５の処理では、まず、上記図６（ａ）に示す状態の回路位置表２５に対して、処理対象位置の初期位置を設定する（ステップＳ１１）。これは、例えば、ポインタを先頭レコードに設定する。更に、任意の変数である中間命令開始位置αに、初期値‘１’を設定する（ステップＳ１２）。
【００３８】
そして、変換処理対象のソースコード２１（本例ではラダー回路）における処理対象の回路の回路管理番号を、獲得するが（ステップＳ１３）、獲得できなかった場合には（ステップＳ１４，ＮＯ）、本処理が完了したものと見做して（ステップＳ２２）本処理を終了する。最初は、処理対象が図２における一番上の回路であるので、その回路管理番号（＝0001）を、獲得することになり、以ってステップＳ１４の判定はＹＥＳとなり、ステップＳ１５へ移行することになる。
【００３９】
尚、処理対象の回路は、順次更新されていき、全ての回路を処理対象とした後は、上記ステップＳ１４の判定がＮＯとなることになる。
ステップＳ１５の処理では、上記ステップＳ１３で獲得した回路管理番号に対応する回路（ラダー命令の塊）を、ソースコード２１から取得して、これを中間コードに変換する。最初は回路管理番号＝‘0001’の回路を変換するので、その結果として得られる中間コードは、既に述べたことから以下の通りとなる。
【００４０】
ＬＤ          Ｃ００１
ＡＮＤ        Ｃ００２
ＳＴ          Ｃ００３
尚、上記の通り、この変換処理自体は、既存機能であり、ここでは特に説明しない。
【００４１】
但し、もし、中間コードへの変換に失敗した場合には（ステップＳ１６、ＮＯ）、コンパイルエラーを表示して本処理を終了する（ステップＳ２３）。中間コードへの変換に成功したならば（ステップＳ１６，ＹＥＳ）、ステップＳ１７へ移行する。
【００４２】
ステップＳ１７では、上記変換によって得られた中間コードの命令数をカウントする。上記具体例では命令数＝‘３’となる。
続いて、回路位置表２５における中間言語情報５２の開始命令位置５２ａの欄に、現在の中間命令開始位置αの値を設定する（ステップＳ１８）。最初は上記の通り中間命令開始位置αは初期値（＝１）となっているので、開始命令位置５２ａには‘１’が設定される。
【００４３】
続いて、「中間命令開始位置α＋命令数−１」を算出して、この算出値を中間言語情報５２の終了命令位置５２ｂの欄に設定する（ステップＳ１９）。ここでは、上記の通り、α＝１、命令数＝３であるので、「１＋３−１」＝３が算出されて、これが終了命令位置５２ｂの欄に設定されることになる。
【００４４】
最初の処理対象に関する以上の処理によって、回路位置表２５の内容は図６（ｂ）に示す状態になる。
そして、回路位置表２５における処理対象位置を、現在の次の位置とする（ステップＳ２０）。ここでは、現在は先頭レコードであったので、次は２番目のレコードが処理対象位置となる。更に、中間命令開始位置αの値を、以下の式により更新する（ステップＳ２１）。
【００４５】
α＝α＋命令数
ここでは、上記のように、α＝１、命令数＝３であるので、新たなαは‘４’となる。
ステップＳ２１では、更に、ソースコード２１において次の処理対象の回路の回路管理番号を、獲得する。そして、ステップＳ１４に戻る。
【００４６】
これより、今度は、回路管理番号＝‘0002’の回路を処理対象として、上記ステップＳ１４〜Ｓ１９の処理によって、中間コードへの変換と、これに伴う回路位置表２５の２番目のレコードの中間言語情報５２の登録が、行われることになる。
【００４７】
更に、その後、今度は、回路管理番号＝‘0003’の回路を処理対象として、上記ステップＳ１４〜Ｓ１９の処理によって、中間コードへの変換と、これに伴う回路位置表２５の３番目のレコードの中間言語情報５２の登録が、行われることになる。
【００４８】
これによって、回路位置表２５は、図６（ｃ）に示す状態となる。
以上の処理により、フロントエンドコンパイラ１３は、任意の処理対象のソースコード２１を中間言語に変換して例えば図３に示す内容の中間言語２２を生成すると共に、これに伴って回路位置表２５を途中まで（図６（ｃ））生成する。つまり、機械語オブジェクト情報５３は未だ登録されておらず、以って、回路位置表２５は未完成の状態となっている。そして、以下に説明する図７の処理によって、回路位置表２５は完成することになる。
【００４９】
図７は、バックエンドコンパイラ１４の処理フローチャート図である。
図７の処理では、まず、上記図６（ｃ）に示す状態の回路位置表２５に対して、処理対象位置の初期位置を設定する（ステップＳ３１）。これは、例えば、ポインタを先頭レコードに設定する。更に、任意の変数である機械語オブジェクト開始位置βに、初期値‘０’を設定する（ステップＳ３２）。
【００５０】
そして、回路位置表２５から、現在の処理対象位置（処理対象レコード）における中間言語情報５２を獲得するが（ステップＳ３３）、獲得できなかった場合には（ステップＳ３３，ＮＯ）、本処理は完了したものと見做して（ステップＳ４１）本処理を終了する。一方、現在の処理対象位置（処理対象レコード）における中間言語情報５２（開始命令位置５２ａ、終了命令位置５２ｂ）を獲得したら（ステップＳ３３，ＹＥＳ）、ステップＳ３４に移行する。
【００５１】
ステップＳ３４では、上記フロントエンドコンパイラ１３によって生成されている中間言語２２から、上記ステップＳ３３で獲得した中間言語情報５２に基づいて該当する中間コード群を獲得して、これを機械語オブジェクトに変換する。最初は、開始命令位置５２ａ＝‘１’、終了命令位置５２ｂ＝‘３’であるので、図３に示す中間言語２２における１行目〜３行目の中間コードが、該当する中間コード群であり、これらが獲得されて機械語オブジェクトに変換されることになる。つまり、下記の中間コード群が、獲得されて、機械語オブジェクトに変換されることになる。
【００５２】
ＬＤ          Ｃ００１
ＡＮＤ        Ｃ００２
ＳＴ          Ｃ００３
機械語オブジェクトへの変換に失敗した場合には（ステップＳ３５，ＮＯ）、コンパイルエラーを表示して（ステップＳ４２）、本処理を終了する。
【００５３】
機械語オブジェクトへの変換に成功した場合には（ステップＳ３５，ＹＥＳ）、まず、変換結果としての機械語オブジェクトのサイズを算出する（ステップＳ３６）。ここでは、仮に、中間言語のＬＤ命令が１６バイトの機械語オブジェクトに変換され、ＡＮＤ命令が１６バイトの機械語オブジェクトに変換され、ＳＴ命令が２４バイトの機械語オブジェクトに変換されるものとする。この場合、上記具体例では、機械語オブジェクトのサイズ＝１６＋１６＋２４＝５６となる。
【００５４】
続いて、回路位置表２５における現在の処理対象位置（処理対象レコード）の開始位置５３ａの欄に、現在の機械語オブジェクト開始位置βの値を設定する（ステップＳ３７）。ここでは、β＝初期値‘０’であるので、開始位置５３ａの欄には‘０’が設定されることになる。更に、回路位置表２５における現在の処理対象位置（処理対象レコード）のサイズ５３ｂの欄に、上記ステップＳ３６の処理で得られたサイズを設定する（ステップＳ３８）。ここでは、上記‘５６’が、サイズ５３ｂの欄に設定されることになる。
【００５５】
以上で、最初の処理対象に係わる処理が完了することになり、回路位置表２５は、図８（ａ）に示す状態となる。
続いて、回路位置表２５における処理対象位置を、現在の次の位置とする（ステップＳ３９）。ここでは、現在は先頭レコードであったので、次は２番目のレコードが処理対象位置となる。更に、機械語オブジェクト開始位置βの値を、以下の式により更新する（ステップＳ４０）。
【００５６】
β＝β＋サイズ
ここでは、上記のように、β＝０、サイズ＝５６であるので、新たなβの値は‘５６’となる。
【００５７】
そして、ステップＳ３３に戻る。
これより、今度は、回路位置表２５の２番目のレコードの中間言語情報５２（開始命令位置５２ａ、終了命令位置５２ｂ）を用いて、ステップＳ３３〜Ｓ３８の処理によって、該当する中間コードを機械語オブジェクトに変換すると共に、これに伴う回路位置表２５の２番目のレコードの機械語オブジェクト情報５３の登録が、行われることになる。
【００５８】
更に、その後、今度は、回路位置表２５の３番目のレコードの中間言語情報５２（開始命令位置５２ａ、終了命令位置５２ｂ）を用いて、ステップＳ３３〜Ｓ３８の処理によって、該当する中間コードを機械語オブジェクトに変換すると共に、これに伴う回路位置表２５の３番目のレコードの機械語オブジェクト情報５３の登録が、行われることになる。
【００５９】
これによって、回路位置表２５は、図８（ｂ）に示す状態となる。つまり、回路位置表２５が完成したことになる。
以上で、新規作成されたソースコード２１に係わるコンパイル処理が完了して、機械語オブジェクト２４と回路位置表２５が生成されることになる。そして、生成された機械語オブジェクト２４は、ＰＬＣ３０にダウンロードされることになる。尚、このときには変更情報管理表２３は生成されない。後に、上記ソースコード２１が更新（バージョンアップ等）されたときに、そのコンパイル処理に伴って変更情報管理表２３が生成されて、ＰＬＣ３０にダウンロードされることになる。
【００６０】
また、図９には、上記具体例について上述した処理により生成された中間言語２２と機械語オブジェクト２４の具体例を示すと共に、これら相互の関係を示す。
また、図９には、機械語オブジェクト２４のＰＬＣ３０側でのメモリ格納例を示す。すなわち、回路管理番号＝‘0001’の回路単位に応じた機械語オブジェクトは、図示のアドレス‘０’〜‘５５’の領域に格納される。回路管理番号＝‘0002’の回路単位に応じた機械語オブジェクトは、図示のアドレス‘５６’〜‘１５１’の領域に格納される。回路管理番号＝‘0003’の回路単位に応じた機械語オブジェクトは、図示のアドレス‘１５２’〜‘３０４’の領域に格納される。
【００６１】
尚、上記‘０’、‘５５’、‘５６’、‘１５１’等の各アドレスは、例えばＰＬＣ３０のメモリにおける機械語オブジェクト格納領域の先頭からの相対アドレスであると見做しても構わない。なお、機械語オブジェクト格納領域は、予め決められている。
【００６２】
その後、任意のときに、上記ソースコード２１が変更（バージョンアップ等）されたものとする。尚、開発支援装置１０のインターフェース機能部１１の機能の１つである、ソースコード２１を編集するエディタ機能によって、ユーザはソースコード２１を編集する。エディタ機能によるソースコードの編集支援は、一般的な技術であり、ここでは特に説明しない。
【００６３】
図１０に、変更後のソースコード２１の具体例を示す。
この例では、図２に示すソースコード２１における管理番号＝‘0002’の回路に対して、図示の接点（C014）が追加されるという修正が行われている。
【００６４】
尚、図１０は、変更後のソースコード２１の表示例であり、管理番号‘0002’の表示位置に＊が追加表示されている。これは、管理番号＝‘0002’の回路に対して、修正が行われたことを示すものである。尚、開発支援装置１０は、既存機能（エディタ機能）によって、どの回路に対して修正が行われたのかを認識することができる。これによって、上記＊の表示も行えるものである。
【００６５】
図１１、図１２に、処理対象のソースコード２１が、更新版（バージョンアップ版など）である場合のコンパイル処理のフローチャート図を示す。尚、図１１、図１２は、１つの処理フローチャートを２つの図面に分けて示しているものである。よって、特に区別せずに図１１等と記す場合もあるものとする。また、ここでは、フロントエンドコンパイラ１３の処理と、バックエンドコンパイラ１４の処理とを、特に区別せずに示すが、一例としては、ステップＳ５７までの処理がフロントエンドコンパイラ１３の処理であり、ステップＳ５９以降の処理がバックエンドコンパイラ１４の処理と見做しても構わない。
【００６６】
また、上記の通り、処理対象のソースコード２１が修正ありか否かを認識できるので、何等かの修正がある場合には図１１等の処理を行い、修正が無い場合には新規であると見做して上記図５、図７の処理を行う。
【００６７】
図１１等の処理では、まず、上記図８（ｂ）に示す状態の回路位置表２５に対して、処理対象位置の初期位置を設定する（ステップＳ５１）。これは、例えば、ポインタを先頭レコードに設定する。更に、上記エディタ機能から、修正があった回路の回路管理番号（修正回路管理番号と呼ぶものとする）を獲得する（ステップＳ５２）。
【００６８】
ここで、エディタ機能は、例えば、任意のソースコード２１の編集作業が開始される際に、編集前の状態のソースコード２１を別記憶領域に退避させておく。そして、編集された（修正された）ソースコード２１を、退避されたソースコード２１と照合して、不一致を検出する。例えば、回路単位で照合して、一致／不一致を判定する。これによって、不一致と判定された回路の回路管理番号を記憶しておく。上記ステップＳ５２では、例えば、当該記憶されている回路管理番号を取得する。
【００６９】
続いて、まず、上記処理対象位置（ポインタ位置）を、上記修正があった回路の回路管理番号に対応するレコードの位置まで移動させる為の処理として、図示のステップＳ５３，Ｓ５４，Ｓ５５の処理を実行する。すなわち、現在の処理対象位置（ポインタ位置）における回路管理番号５１を獲得して（ステップＳ５３，ＹＥＳ）、これが上記修正回路管理番号と同じであるか否かを判定する（ステップＳ５４）。両者が同一ではない場合には（ステップＳ５４，ＮＯ）、上記ポインタ位置を次のレコードに移動させて（ステップＳ５５）、ステップＳ５３に戻る。この処理を、ステップＳ５４の判定がＹＥＳとなるまで繰り返す。尚、次のレコードが無く、以って回路管理番号５１を獲得出来なかった場合には（ステップＳ５３，ＮＯ）、本処理を終了する（ステップＳ７１）。
【００７０】
ステップＳ５４の判定がＹＥＳとなったら、修正回路管理番号の回路（修正があった回路）のみを、中間言語に変換する（ステップＳ５６）。何等かのエラーにより中間言語に変換できなかった場合には（ステップＳ５７，ＮＯ）、コンパイルエラーを表示して（ステップＳ５８）、本処理を終了する。
【００７１】
中間言語に変換できた場合には（ステップＳ５７，ＹＥＳ）、この中間言語（中間コード）の命令数をカウントする（ステップＳ５９）。上記図１０の例の場合、修正があった回路管理番号＝‘２’の回路が変換されるので、変換結果としての中間言語は例えば図１３（ａ）において右側に示すものとなる。尚、図１３（ａ）の左側には、比較の為に、修正前の回路管理番号＝‘２’の回路の変換結果を示している。
【００７２】
図１３（ａ）の右側に示すように、変換結果の中間コードの命令数は６個であるので、ステップＳ５９では命令数‘６’が得られることになる。
そして、現在の処理対象位置（ポインタ位置）のレコードの開始命令位置５２ａと終了命令位置５２ｂとから、修正前の回路に応じた中間コードの命令数を、以下の式により算出する（ステップＳ６０）。
【００７３】
命令数＝終了命令位置５２ｂ−開始命令位置５２ａ＋１
図８（ｂ）の例の場合、ポインタ位置は２番目のレコードになるので、命令数＝８−４＋１＝５となる。
【００７４】
そして、上記ステップＳ５６で得られた中間コードを、機械語オブジェクトに変換する（ステップＳ６１）。但し、何等かのエラーにより変換できなかった場合には（ステップＳ６１，ＮＯ）、コンパイルエラーを表示して（ステップＳ６２）本処理を終了する。
【００７５】
機械語オブジェクトに変換出来た場合には（ステップＳ６１，ＹＥＳ）、まず、この機械語オブジェクトのサイズを算出する（ステップＳ６３）。算出方法はステップＳ３６と同様であり、図１３（ａ）の右側に示す例の場合にはサイズ＝１１２となる。そして、このサイズ算出値（‘１１２’）と、現在の処理対象位置（ポインタ位置）のレコードのサイズ５３ｂとに基づいて、機械語オブジェクトに係わる変更前後のサイズの差分を、下記のように算出する（ステップＳ６４）。
【００７６】
機械語サイズ差分＝サイズ算出値−サイズ５３ｂ
上記具体例の場合、サイズ算出値＝１１２、サイズ５３ｂ＝９６であるので、
機械語サイズ差分＝１１２−９６＝１６
となる。尚、算出した機械語サイズ差分は、保持しておき、後述するステップＳ７０の処理で使用する。
【００７７】
そして、変更情報管理表２３にデータを登録すると共に、回路位置表２５の変更を行う（ステップＳ６５）。
図１４に、上記具体例に応じた変更情報管理表２３の具体例を示す。
【００７８】
まず、変更情報管理表２３は、回路管理番号６１、変更前６２の開始位置６２ａとサイズ６２ｂ、変更後６３のサイズ６３ａの各データ項目から成る。
ステップＳ６５の処理では、上記ステップＳ５２で獲得した上記修正回路管理番号を回路管理番号６１の欄に設定し、上記ステップＳ６４で獲得した上記ポインタ位置のサイズ５３ｂを変更前６２のサイズ６２ｂの欄に設定し、上記ステップＳ６３で算出したサイズを上記変更後６３のサイズ６３ａの欄に設定する。更に、ポインタ位置のレコードの開始位置５３ａを取得して、これを上記変更前６２の開始位置６２ａの欄に設定する。
【００７９】
上記処理によって、変更情報管理表２３は、図１４に示すデータが格納された状態となる。
更に、回路位置表２５において、現在のポインタ位置（本例では２番目のレコード）におけるサイズ５３ｂを、上記変更後６３のサイズ６３ａの値（１１２）に変更する。更に、上記ステップＳ５９，Ｓ６０で得た修正前後の中間言語の命令数から「命令数の差分＝修正後の命令数−修正前の命令数」を求めて、この“命令数の差分”を現在のポインタ位置における終了命令位置５２ｂの値に加算することで、終了命令位置５２ｂの値を更新する。具体例では、命令数の差分＝６−５＝１となり、終了命令位置５２ｂの値は８であるので、終了命令位置５２ｂの値は‘９’（＝８＋１）に更新される。
【００８０】
その後、ステップＳ６６〜Ｓ７０の処理を実行することで、回路位置表２５における他の箇所の変更も行って、以って回路位置表２５の変更が完了することになり（ステップＳ７２）、本処理を終了する。
【００８１】
まず、処理対象位置（ポインタ位置）を、現在位置の次の位置へと移動させる（ステップＳ６６）。本例では、このときのポインタ位置が２番目のレコードであるので、３番目のレコードに移動させることになる。
【００８２】
そして、まず、現在のポインタ位置のレコードの回路管理番号５１を獲得する（ステップＳ６７）。但し、ポインタ位置のレコードのデータが無く、以って回路管理番号５１を獲得できない場合には（ステップＳ６７，ＮＯ）、本処理は完了したものと見做して（ステップＳ７２）処理終了する。
【００８３】
回路管理番号５１を獲得出来た場合には（ステップＳ６７，ＹＥＳ）、まず、上記“命令数の差分”を現在のポインタ位置における開始命令位置５２ａの値に加算することで、開始命令位置５２ａの値を更新する（ステップＳ６８）。上記のように具体例では“命令数の差分”＝１であり、開始命令位置５２ａの値は９であるので、開始命令位置５２ａの値は‘１０’（＝９＋１）に更新される。
【００８４】
続いて、上記“命令数の差分”を現在のポインタ位置における終了命令位置５２ｂの値に加算することで、終了命令位置５２ｂの値を更新する（ステップＳ６９）。上記のように具体例では“命令数の差分”＝１であり、終了命令位置５２ｂの値は１６であるので、終了命令位置５２ｂの値は‘１７’（＝１６＋１）に更新される。
【００８５】
更に、上記ステップＳ６４で求めた機械語サイズ差分を、現在のポインタ位置における開始位置５３ａの値に加算することで、開始位置５３ａの値を更新する（ステップＳ７０）。上記具体例では機械語サイズ差分＝１６であり、開始位置５３ａの値は１５２であるので、１５２＋１６＝１６８が、開始位置５３ａに設定されることになる。
【００８６】
そして、ステップＳ６６に戻り、処理対象を次のレコードとするが、上記具体例では４番目のレコードはないので、ステップＳ６７がＮＯとなり、処理終了となる。このとき、回路位置表２５は、図１３（ｂ）に示す状態となっている。これは、回路位置表２５の更新が完了したものと言える。
【００８７】
以上で、更新版（バージョンアップ版など）に係わるコンパイル処理が完了することになり、コンパイル結果をＰＬＣ３０にダウンロードするが、この場合にダウンロードするのは、上記生成された変更情報管理表２３と、ステップＳ６１で得られた機械語オブジェクトである。上記具体例では、ステップＳ６１で得られる機械語オブジェクト、すなわち修正があった回路の機械語オブジェクトは、回路管理番号＝‘２’の回路に係わる機械語オブジェクトであり、また、変更情報管理表２３は図１４に示す内容のものとなる。
【００８８】
上記ダウンロード情報を受信したＰＬＣ３０側の処理については、上記具体例を用いて、図１５、図１６、図１７に示す。
ＰＬＣ３０側では、既存の機械語オブジェクト４１が、例えば図１５の左側に示すように、メモリ上の所定の記憶領域に記憶された状態である。そして、上記ダウンロード情報を不図示の一時記憶領域に一時的に記憶するものとする。また、本手法では、プログラム更新の為に、メモリ上に上記所定の記憶領域とは別の記憶領域を用意している。
【００８９】
そして、上記ダウンロードされた変更情報管理表２３を参照して、まず、既存の機械語オブジェクト４１のうち、先頭から修正があった回路の機械語オブジェクトの直前までの部分を、上記別の記憶領域にコピーする。これは、変更情報管理表２３の開始位置６２ａに基づいて、上記所定の記憶領域の先頭からアドレス“開始位置６２ａ−１”までの領域の機械語オブジェクトを、上記別の記憶領域にコピーする。図示の例では、上記所定の記憶領域における先頭‘０’からアドレス‘５５’までの領域に記憶されているプログラム、すなわち回路管理番号００１の機械語オブジェクトのみが、上記別の記憶領域にコピーされることになる。
【００９０】
続いて、図１６に示すように、上記ダウンロードされた機械語オブジェクト（更新版の機械語オブジェクト）を、上記別の記憶領域において上記コピーした機械語オブジェクトの直後に、格納する。具体例では、上記回路管理番号００１の機械語オブジェクトの直後に連結（マージ）する形で、上記ダウンロードされた回路管理番号００２の更新版の機械語オブジェクトを、上記別の記憶領域に記憶する。これは、例えば、別の記憶領域における開始位置６２ａ（本例では‘５６’）のアドレス位置から、当該更新版の機械語オブジェクトを記憶させるものである。
【００９１】
最後に、既存の機械語オブジェクト４１の残りを、別の記憶領域にコピーするが、但し、更新があった回路の機械語オブジェクトはコピーしない。具体例では、回路管理番号００２の既存の機械語オブジェクトは、コピーしないようにする必要がある。その為に、変更情報管理表２３の開始位置６２ａとサイズ６２ｂを用いて、上記所定の記憶領域における「開始位置６２ａ＋サイズ６２ｂ」のアドレス位置から最後までを、上記別の記憶領域にコピーする。この場合も、既に記憶されている回路管理番号００２の更新版の機械語オブジェクトの直後に、連結（マージ）するようにして、格納する。これは、例えば、別の記憶領域における「開始位置６２ａ＋サイズ６３ａ」（本例では‘５６’＋‘１１２’＝‘１６８’）のアドレス位置から、上記既存の機械語オブジェクト４１の残りを記憶させるものである。
【００９２】
以上の処理によって、ＰＬＣ３０側における機械語オブジェクト４１の更新処理が完了することになる。尚、その後、上記所定の記憶領域における機械語オブジェクトを消去して、上記別の記憶領域に作成された機械語オブジェクト全体を、上記所定の記憶領域にコピーするようにしてもよい。これが更新版の上記機械語オブジェクト４１となり、プログラム実行管理機能部３２はこの更新版の上記機械語オブジェクト４１を実行して制御を行うことになる。
【００９３】
尚、図示の５６、１５２、１６８等の数値は、各記憶領域における先頭からの相対アドレスを意味する。また、ここでは、アドレスは１バイト単位であるものとする。
尚、上記説明は一例であり、この例に限らない。例えば、変更情報管理表２３を生成することなく、回路位置表２５をＰＬＣ３０に送信するようにしてもよい。これは、例えば、回路位置表２５を更新する毎に、そのときの更新前の回路位置表２５と更新後の回路位置表２５とを、ＰＬＣ３０に送信する。勿論、この方法を用いる場合には、回路位置表２５を更新する際に、更新前の回路位置表２５を退避領域等に一時的に保存しておく必要がある。上記一例の場合、図８（ｂ）に示す回路位置表２５、図１３（ｂ）に示す回路位置表２５が、ＰＬＣ３０に送信されることになる。ＰＬＣ３０側では、前回受信した回路位置表２５と今回受信した回路位置表２５とを比較することで、変更点を検出することができ、これは上記変更情報管理表２３と同様の情報である。
【００９４】
尚、上記記変更情報管理表２３や回路位置表２５を、まとめて修正情報と呼ぶものとする。
尚、上記図１５〜図１７等のようなＰＬＣ３０側の処理は、上記プログラム実行管理機能部３２が実行してもよいし、不図示の他の処理機能部（例えば、プログラム更新部等と呼ぶ）が実行するものであっても構わない。
【００９５】
また、尚、ソースコードを一旦中間コードに変換してから機械語オブジェクトに変換することは、一例であり、本手法の対象は必ずしもこの例に限らない。
上記のように、ソースコードの変更／更新作業では、局部的な変更が大部分であるが、従来では更新版のソースコード全部をコンパイルして機械語オブジェクトを生成していた、この機械語オブジェクトの大部分は、変更前と変更後で同じであるにも係わらず、上記生成とＰＬＣへの転送を行っていた。この為、コンパイル処理負荷が掛かり、またデータ転送量も多かった。
【００９６】
これに対して、上述した本手法では、回路単位での変更箇所だけの置き換えが可能になり、ソースコード変更に関連するユーザの作業時間の短縮化や処理負荷軽減を実現でき、ユーザのソフトウエア開発効率が向上する効果がある。
【００９７】
ユーザが任意に作成するソースコードを開発支援装置のエディタ機能が回路単位で管理し、当該エディタ機能がユーザの変更した回路を記録する。そして、コンパイラ機能部が、上記変更した回路のみをコンパイルして機械語オブジェクトを生成し、更に上記変更情報管理表を生成して、当該生成した機械語オブジェクトと変更情報管理表をＰＬＣにダウンロードする。ＰＬＣは、変更情報管理表等を用いて、受信した機械語オブジェクトを既存の機械語オブジェクトにマージすることにより、プログラムを更新する。
【符号の説明】
【００９８】
１０  開発支援装置（ローダ）
１１  インターフェース機能部
１２  通信機能部
１３  フロントエンドコンパイラ
１４  バックエンドコンパイラ
２１  ソースコード
２２  中間言語
２３  変更情報管理表
２４  機械語オブジェクト
２５  回路位置表
３０  ＰＬＣ
３１  通信機能部
３２  プログラム実行管理機能部
４１  機械語オブジェクト
５１  回路管理番号
５２  中間言語情報
５２ａ  開始命令位置
５２ｂ  終了命令位置
５３  機械語オブジェクト情報
５３開ａ  位置
５３ｂ  サイズ
６１  回路管理番号
６２  変更前
６２ａ  開始位置
６２ｂ  サイズ
６３  変更後
６３ａ  サイズ
【図１】
2016151973.tif 000003
【図３】
2016151973.tif 000004
【図４】
2016151973.tif 000005
【図５】
2016151973.tif 000006
【図６】
2016151973.tif 000007
【図７】
2016151973.tif 000008
【図８】
2016151973.tif 000009
【図９】
2016151973.tif 000010
【図１１】
2016151973.tif 000011
【図１３】
2016151973.tif 000012
【図１４】
2016151973.tif 000013
【図１５】
2016151973.tif 000014
【図１６】
2016151973.tif 000015
【図１７】
2016151973.tif 000016
【図２】
2016151973.tif 000017
【図１０】
2016151973.tif 000018
【図１２】
2016151973.tif 000019