(57)【要約】【課題】メモリの使用効率を低下させることなく、プログラムの実行を継続しながらプログラムの変更を可能とするプログラミングシステムを得ること。【解決手段】プログラマブルコントローラ６０とプログラミング装置１とからなるプログラミングシステムにおいて、プログラマブルコントローラ６０は、ＰＯＵ毎のメモリブロックを続けて記憶する領域と、新たに追加されるＰＯＵ毎のメモリブロックを続けて記憶するための空き領域とからなるデータメモリ部６２を有し、プログラミング装置１は、追加のローカル変数を含むメモリブロックを空き領域に割り付けるデータインスタンス割付部２１と、追加のローカル変数を含むＰＯＵのメモリブロックと同一のデータメモリ部６２内で記憶するＰＯＵのメモリブロックを対応付けするデータメモリアクセス部３１と、を備える。【選択図】        図１
2005301520.tif 000002
【特許請求の範囲】
【請求項１】
プログラム構成要素によるモジュール単位で記述されたソースプログラムから生成された目的プログラムを実行するプログラマブルコントローラと、前記目的プログラムを前記プログラマブルコントローラに送るプログラミング装置とからなるプログラミングシステムにおいて、
前記プログラマブルコントローラは、
目的プログラムの実行によって処理されるデータを前記プログラム構成要素毎のデータ変数を含むブロック毎に続けて記憶する領域と、プログラムの変更時に新たに追加される追加データを前記プログラム構成要素毎のデータ変数を含むブロック毎に続けて記憶するための空き領域とからなる記憶部を有し、
プログラミング装置は、
前記プログラマブルコントローラへの目的プログラムを変更する際、前記追加データのデータ変数を抽出して、該追加データのデータ変数を含むブロックを前記空き領域に割り付けるデータ割付部と、
前記空き領域に割付けた追加データのデータ変数を含むブロックを、前記記憶部内で記憶する前記追加データのデータ変数を含むブロックを前記空き領域に割り付ける前のデータ変数のブロックであって前記追加データのデータ変数を含むプログラム構成要素と同一のプログラム構成要素のブロックに対応付け処理するデータアクセス設定部と、
を備え、
プログラミング装置は前記データアクセス設定部が前記対応付け処理をした後、前記目的プログラムを前記プログラマブルコントローラに送ることを特徴とするプログラミングシステム。
【請求項２】
前記データ変数を含むブロックは、前記データ変数を格納するデータ格納領域と前記ブロックの先頭領域で前記ブロック間の対応付けをするためのアドレス領域とからなり、
前記データアクセス設定部は、前記目的プログラムの変更前の前記アドレス領域に前記追加データのデータ変数を含むブロックと対応付けするための対応付情報を設定することによって前記対応付け処理を行うことを特徴とする請求項１に記載のプログラミングシステム。
【請求項３】
プログラミング装置は、前記対応付情報を記憶する対応付情報管理部をさらに備えることを特徴とする請求項２に記載のプログラミングシステム。
【請求項４】
前記対応付情報は、前記記憶部内における前記追加データのデータ変数を含むブロックのアドレス領域の先頭メモリアドレスであることを特徴とする請求項２または３に記載のプログラミングシステム。
【請求項５】
プログラミング装置は、
前記データ変数を、前記データ変数を含むブロック毎に識別するためのインデックス情報および前記データ変数の各ブロック内での相対アドレスを記憶するデータ変数管理部と、
前記対応付情報、前記インデックス情報および前記相対アドレスに基づいて前記目的プログラムの生成を行うプログラム生成部と、
をさらに備えることを特徴とする請求項２〜４のいずれか１つに記載のプログラミングシステム。
【請求項６】
プログラミング装置は、
前記プログラマブルコントローラに送られた目的プログラムに対応するデータ変数と前記追加データのデータ変数とを識別するための識別情報を記憶するデータ変数記憶部をさらに備え、
前記データ割付部は、前記データ変数管理部が記憶する識別情報に基づいて、前記追加データのデータ変数を抽出することを特徴とする請求項１〜５のいずれか１つに記載のプログラミングシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラに対してプログラムの変更を行うプログラミングシステムに関するものである。
【背景技術】
【０００２】
プログラマブルコントローラのプログラミング装置によって大規模アプリケーションを開発する際、生産性や保守性の向上のため構造化プログラミングが行われている。例えば、国際電気標準会議によるＩＥＣ６１１３１−３規格では、ローカル変数と処理ロジックをモジュール化したソフトウェア部品としてプログラム構成要素（ＰＯＵ（Program Organization Unit）を定義し、このＰＯＵを組み合わせてユーザアプリケーションを構築するプログラム言語を規定している。
【０００３】
ＰＯＵの処理ロジックは別のＰＯＵの実行呼び出しを用いて記述する。ここでプログラムとファンクションブロックのＰＯＵは、別のＰＯＵを直接呼び出すのではなく、インスタンスと呼ばれるコピーを用意して呼び出す。同じＰＯＵのコピーとなるインスタンスの場合、処理ロジックは同じでもローカル変数の値はインスタンスごとに独立して保持している。
【０００４】
このようにインスタンス化して用いられるＰＯＵの振舞いを実行環境であるプログラマブルコントローラで実現するため、プログラマブルコントローラのデータメモリ上にはＰＯＵインスタンスごとの固有のデータをデータインスタンスで記憶し、プログラマブルコントローラのコードメモリ上にはＰＯＵインスタンスの実行で呼び出される実行可能なコードをコードインスタンスで記憶している。
【０００５】
プログラムの実行を継続させつつ、プログラムの変更を行うにはプログラムの変更前後において、既存変数のデータメモリ上の割付先アドレスの値を正しく引き継がせることが必要になる。既存変数のデータメモリ上の割付先アドレスをプログラム変更前後で変えないため、前回コンパイル時の変数のデータメモリ上の割付先アドレスを記憶保持し、今回のコンパイル時に流用する技術がある。
【０００６】
特許文献１に記載の制御装置では、各メモリブロックを格納するデータメモリ（ＤＭ）中にメモリブロック毎の余裕領域を確保している。そして、オンラインエディットによってプログラム変更時に追加されたローカル変数をこの余裕領域の中に割り付けている。これにより、プログラムの変更前後において、既存変数のデータメモリ上の割付先アドレスが変化することを回避している。
【０００７】
【特許文献１】特開２０００−２０２９７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、上記従来の技術ではメモリブロック毎に余裕領域を確保しているため、初期のコンパイル時点では各メモリブロックに将来どれだけのローカル変数の追加が必要になるかが明確でなく、余裕領域の見積もりが困難である。余裕領域のメモリ量を大きくすると、使用されない無駄に確保されたメモリ領域が大きくなりメモリの使用効率が悪くなるといった問題があった。
【０００９】
本発明は、上記に鑑みてなされたものであって、プログラマブルコントローラのメモリの使用効率を低下させることなく、プログラマブルコントローラのプログラムの実行を継続しながらプログラムの変更を可能とするプログラミングシステムを得ることを目的とする。
【課題を解決するための手段】
【００１０】
上述した課題を解決し、目的を達成するために、本発明は、プログラム構成要素によるモジュール単位で記述されたソースプログラムから生成された目的プログラムを実行するプログラマブルコントローラと、前記目的プログラムを前記プログラマブルコントローラに送るプログラミング装置とからなるプログラミングシステムにおいて、前記プログラマブルコントローラは、目的プログラムの実行によって処理されるデータを前記プログラム構成要素毎のデータ変数を含むブロック毎に続けて記憶する領域と、プログラムの変更時に新たに追加される追加データを前記プログラム構成要素毎のデータ変数を含むブロック毎に続けて記憶するための空き領域とからなる記憶部を有し、プログラミング装置は、前記プログラマブルコントローラへの目的プログラムを変更する際、前記追加データのデータ変数を抽出して、該追加データのデータ変数を含むブロックを前記空き領域に割り付けるデータ割付部と、前記空き領域に割付けた追加データのデータ変数を含むブロックを、前記記憶部内で記憶する前記追加データのデータ変数を含むブロックを前記空き領域に割り付ける前のデータ変数のブロックであって前記追加データのデータ変数を含むプログラム構成要素と同一のプログラム構成要素のブロックに対応付け処理するデータアクセス設定部と、を備え、プログラミング装置は前記データアクセス設定部が前記対応付け処理をした後、前記目的プログラムを前記プログラマブルコントローラに送ることを特徴とする。
【００１１】
この発明によれば、プログラマブルコントローラの記憶部が、プログラム構成要素毎のブロックを続けて記憶する領域と、プログラムの変更時に新たに追加されるプログラム構成要素毎のブロックを続けて記憶するための空き領域を有し、プログラミング装置が、空き領域に割付けた追加データのブロックを、空き領域に割り付ける前のブロックに対応付け処理しているので、プログラマブルコントローラへの目的プログラムを変更する際、空き領域に割り付ける前のブロックのデータ変数を変化させることなくプログラマブルコントローラの目的プログラムを変更することができる。
【発明の効果】
【００１２】
この発明によれば、プログラマブルコントローラへの目的プログラムを変更する際、新たに追加されるデータ変数を含むブロックは、空き領域に続けて割付けることができるとともに、空き領域に割り付けられた各ブロックは記憶部に既に割り付けられているデータ変数のブロックと対応付けられるので、記憶部の使用効率を低下させることなく、プログラマブルコントローラにおけるプログラムの実行を継続しながらプログラマブルコントローラへの目的プログラムの変更を行うことが可能になるという効果を奏する。
【発明を実施するための最良の形態】
【００１３】
以下に添付図面を参照して、この発明にかかるプログラミング装置の好適な実施の形態を詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。
【００１４】
実施の形態
図１は、本発明の実施の形態にかかるプログラミングシステムの構成を示す図である。プログラミングシステムはプログラミング装置１、プログラマブルコントローラ（ＰＬＣProgrammable Logic Controller））６０、入力装置５１、出力装置５２からなる。
【００１５】
プログラミング装置１は、ソースプログラムを編集してプログラマブルコントローラ６０のプログラムを変更させる装置であり、入力装置５１、出力装置５２、プログラマブルコントローラ６０と接続されている。プログラミング装置１は、編集部１０、変換部２０、転送部３０、記憶部４０からなる。
【００１６】
編集部１０は、ソースプログラムをプログラム構成要素（後述するＰＯＵ（Program Organization Unit））によるモジュール単位で編集する。編集部１０は、入力装置５１、出力装置５２と接続され、入力装置５１から編集部１０へ入力する情報に基づいてソースプログラムの編集を行う。また、編集部１０によって編集されるソースプログラムは出力装置５２を介してプログラミング装置１の使用者が確認できるよう構成されている。
【００１７】
変換部２０は、編集部１０によって編集されたソースプログラムをプログラマブルコントローラ６０で実行可能な目的プログラムにコンパイル（変換生成）する。変換部２０は、データインスタンス割付部（データ割付部）２１とコードインスタンス展開部２２を備えている。
【００１８】
データインスタンス割付部２１は、ＰＯＵのインスタンスごとにデータメモリ上（後述するデータメモリ部６２）にデータインスタンスの割付を行う。データインスタンスとは、データメモリ上においてＰＯＵインスタンスごとの固有のデータを記憶する箇所である。
【００１９】
コードインスタンス展開部２２は、ソースプログラムに記述されたＰＯＵ処理ロジックからコードインスタンスを形成する。コードインスタンスは、ＰＯＵの型ごとに共通のサブルーチンとしてコードメモリ上（後述するコードメモリ部６１）に配置される。コードインスタンスとは、コードメモリ上においてＰＯＵを実行するための各コードが記憶する箇所である。ＰＯＵインスタンスの実行は、データインスタンスの内容を、ＰＯＵの共通サブルーチン化されたコードインスタンスに引き渡して呼び出すことで実現する。
【００２０】
転送部３０は、プログラマブルコントローラ６０と接続されており、プログラマブルコントローラ６０で実行可能な目的プログラムとその実行に必要な初期値をプログラマブルコントローラ６０に転送する。転送部３０は、データメモリアクセス部（データアクセス設定部）３１とオンラインコード変更部３２を備えている。
【００２１】
データメモリアクセス部３１は、プログラマブルコントローラ６０のデータメモリ部６２上のデータの変更を行う。オンラインコード変更部３２は、プログラマブルコントローラ６０が実行する目的プログラムのコードを格納するコードメモリをプログラムの実行を停止させることなく変更させる。
【００２２】
記憶部４０は、変換部２０において作成、参照、更新されるメモリブロック（ブロック）を管理するための情報（後述するデータインスタンス割付情報７０）およびデータインスタンス中の変数であるローカル変数（データ変数）に関する定義情報（後述するローカル変数定義情報８０）やソースプログラム、目的プログラムを格納する。
【００２３】
入力装置５１は、キーボード、マウス等を備えて構成され、プログラミング装置１の編集部１０と接続されている。入力装置５１は、ソースプログラムの編集を行う際の指示情報等を入力し、編集部１０に送信する。
【００２４】
出力装置５２は、液晶パネル等の表示装置を備えて構成され、プログラミング装置１の編集部１０と接続されている。出力装置５２は、ソースプログラムの編集を行う際のソースプログラム等を表示する。
【００２５】
プログラマブルコントローラ６０は、プログラミング装置１からの目的プログラムに基づいて動作するコントローラであり、コードメモリ部６１とデータメモリ部６２を備える。コードメモリ部６１は、プログラマブルコントローラ６０で実行可能な目的プログラムのコードを記憶する。なお、データメモリ部６２が特許請求の範囲に記載の記憶部に対応する。
【００２６】
データメモリ部６２は、コードメモリ部６１上の目的プログラムの実行によって処理されるデータを格納する。データメモリ部６２は、目的プログラムの実行によって処理されるデータをＰＯＵのメモリブロック毎に記憶しておく領域と、プログラムの変更時に新たに追加されるローカル変数を含むメモリブロックをメモリブロック毎に記憶する空き領域（余裕領域）からなる。データメモリ部６２においては予め所定容量の空き領域が確保されており、プログラム変更時に追加されたローカル変数はこの空き領域の中に割り付けられる。目的プログラムの実行によって処理されるデータをＰＯＵのメモリブロック毎に記憶しておく領域は、ＰＯＵの各メモリブロックを上位領域から続けて記憶する。空き領域は、プログラムの変更時に新たに追加されるローカル変数を含む各メモリブロックを上位領域から続けて記憶する。
【００２７】
本実施の形態においては、ソースプログラムの内部変数であるローカル変数とソースプログラムの処理ロジックをモジュール化したソフトウェア部品を、ＰＯＵ（プログラム構成要素）として定義する。そして、このＰＯＵを組み合わることによってユーザアプリケーションを構築するプログラマブルコントローラ６０のプログラム言語を規定する。このプログラム言語は、国際電気標準会議によるＩＥＣ（以下、ＩＥＣ（International Electrotechnical Commission）という）６１１３１−３等によって規格化されている。
【００２８】
ＰＯＵには、プログラム、ファンクションブロック（以下、ＦＢ（Function Block）という）、ファンクションがあり、ＰＯＵの処理ロジックは別のＰＯＵの実行呼び出しを用いて記述される。プログラムとＦＢのＰＯＵは、このＰＯＵを直接呼び出すのではなく、インスタンスと呼ばれるコピーを用意して呼び出す。同じＰＯＵのコピーとなるインスタンスの場合、処理ロジックが同じ場合であってもローカル変数の値はインスタンスごとに独立して保持しておく。ファンクションはインスタンス化せず処理ロジックの実行を直接呼び出せるＰＯＵであり、ローカル変数の値は実行中以外は保持されない。
【００２９】
つぎに、プログラミング装置の処理手順について説明する。図２は、プログラミング装置のコンパイル処理の手順を示すフローチャートである。プログラミング装置１の編集部１０は、入力装置５１から編集部１０へ入力する指示情報に基づいてソースプログラムの編集（変更）を行い、編集されたソースプログラムを記憶部４０で記憶する。
【００３０】
ここで、ローカル変数の追加を伴うソースプログラムの変更について説明する。図３はプログラミング装置が変更処理を行うプログラムの構成の一例を示す図であり、図４はプログラムの実行手順の一例を示すシーケンス図であり、図５はプログラム変更の一例を説明するための図であり、図６はデータメモリ構造の変更を説明するための図である。
【００３１】
図３に示すプログラムは例えばＩＥＣ６１１３１−３規格準拠プログラミング言語によって記述されている。ここでは、ＰＯＵ１の処理ロジックがＰＯＵ２型ＦＢのデータインスタンス「Ｐｏｕ２＿Ｉｎｓｔ１」とＰＯＵ３型ＦＢのデータインスタンス「Ｐｏｕ３＿Ｉｎｓｔ２」の実行を呼び出している。また、ＰＯＵ２型ＦＢの処理ロジックではＰＯＵ３型ＦＢのデータインスタンス「Ｐｏｕ３＿Ｉｎｓｔ１」の実行を呼び出している。「Ｐｏｕ３＿Ｉｎｓｔ１」と「Ｐｏｕ３＿Ｉｎｓｔ２」の２つのデータインスタンスは共にＰＯＵ３型ＦＢであるため同じ処理ロジック（ＰＯＵ３の処理ロジック）を実行するが、それぞれ異なるデータインスタンスであるため処理ロジックで参照されるローカル変数の値は互いに独立した値となる。
【００３２】
図４のシーケンス図は、図３のプログラムをプログラマブルコントローラ６０で実行する場合の概略手順を示している。ＰＯＵインスタンスの実行は、ＰＯＵのデータインスタンスの内容を、ＰＯＵの共通サブルーチン化されたコードインスタンスに引き渡して呼び出すことで実現する。
【００３３】
ＰＯＵ１のコードインスタンス「Ｐｏｕ１＿Ｃｏｄｅ」では、ＰＯＵ２のデータインスタンス「Ｐｏｕ２＿Ｉｎｓｔ１」を引数としてＰＯＵ２のコードインスタンス「Ｐｏｕ２＿Ｃｏｄｅ」のサブルーチンを呼び出すＣＡＬＬ命令を実行し、その後ＰＯＵ３のデータインスタンス「Ｐｏｕ３＿Ｉｎｓｔ２」を引数としてＰＯＵ３のコードインスタンス「Ｐｏｕ３＿Ｃｏｄｅ」のサブルーチンを呼び出すＣＡＬＬ命令を実行する。
【００３４】
ＰＯＵ１のコードインスタンス「Ｐｏｕ１＿Ｃｏｄｅ」から呼び出されたＰＯＵ２のコードインスタンス「Ｐｏｕ２＿Ｃｏｄｅ」では、さらにＰＯＵ３のデータインスタンス「Ｐｏｕ３＿Ｉｎｓｔ１」を引数としてＰＯＵ３のコードインスタンス「Ｐｏｕ３＿Ｃｏｄｅ」のサブルーチンを呼び出すＣＡＬＬ命令を実行する。このようにＩＥＣ言語でのＰＯＵインスタンスは、データインスタンスとコードインスタンスを一体にして呼び出している。
【００３５】
図５は、図３のＩＥＣ言語のプログラムにおけるＰＯＵ３の定義が記述されたソースプログラムの変更例を示している。プログラマブルコントローラ６０にプログラムの実行を継続させつつ、プログラムの変更を行うには、プログラムの変更前後において、既存変数（ローカル変数等）の値が正しく引き継がれること必要である。変更後のプログラムではローカル変数Ｙ１，Ｙ２が新規に追加され、この追加されたローカル変数を用いて処理ロジックの一部も変更されている。一方、ローカル変数Ｘ１、Ｘ２、Ｘ３は既存変数であるため、例えば変更前プログラムの処理ロジックで使用されているローカル変数Ｘ２の値は、変更後プログラムの処理ロジックでも同じ値が継続して使用されている。
【００３６】
一般に、プログラマブルコントローラのように限られたメモリしかもたない実行環境の場合、コードインスタンスはＰＯＵの型ごとに共通のサブルーチンとしてコードメモリ上に配置し、データインスタンスはＰＯＵのインスタンスごとにデータメモリ上に確保し割り付けるのがメモリ使用効率の点で望ましい。
【００３７】
そこで本実施の形態では、図６に示すメモリ構造でデータメモリ上にデータインスタンスを配置する。メモリ構造はメモリブロックの先頭にある１つのアドレス格納領域と、このアドレス格納領域に続くローカル変数のデータ格納領域からなるメモリブロックを１つの要素とするメモリブロックのリスト構造となっている。
【００３８】
アドレス格納領域は、次の要素となるメモリブロックが割り付けられたデータメモリ部６２の記憶領域上の先頭アドレスを保持する領域である。このアドレス格納領域の値を参照することで、データインスタンスは最初のメモリブロックから順番に次のメモリブロックを辿ることが可能とる。
【００３９】
コンパイル時のプログラムの変更によって追加されたローカル変数のデータ格納領域をデータインスタンスに保有させる必要がある場合、リスト構造の要素となるメモリブロックを新規の要素としてデータメモリ部６２の空き領域に格納する。ここではプログラム変更によってＰＯＵ３に新たに追加されたローカル変数Ｙ１，Ｙ２のデータ領域を含む一つのメモリブロックを、データインスタンスのメモリブロックリストの最後の要素として加えている。
【００４０】
つぎに、変換部２０のデータインスタンス割付部２１は、変更を施したプログラムのコンパイルを開始し、記憶部４０に記憶している既存のデータインスタンス割付情報７０とローカル変数定義情報８０の内容を変更する。ここで、データインスタンス割付情報７０とローカル変数定義情報８０について説明する。
【００４１】
図７は、データインスタンス割付情報の構成の一例を示す図である。データインスタンス割付情報７０は、メモリブロックリスト構造の各要素となるメモリブロックを管理するための情報テーブルである。
【００４２】
データインスタンス割付情報７０には、データメモリ部６２上で割付けられるメモリブロック毎の情報が含まれる。各メモリブロックの情報には、メモリブロック内のＰＯＵのインスタンスを示す「ＰＯＵインスタンス名」、メモリブロック内のＰＯＵの型名を示す「ＰＯＵ型」、メモリブロックのリスト構造内での索引を示す「リストインデックス」（リスト構造の先頭要素から始まるインデックス）、メモリブロックの先頭のアドレスを示すブロック「先頭アドレス」、メモリブロックのサイズを示す「ブロックサイズ」、変更されたプログラムのコンパイルによって新たにデータメモリ部６２から領域を確保して割り付けが必要なメモリブロックであるか否かを示す「新規割付フラグ」が含まれる。
【００４３】
「新規割付フラグ」が「Ｙｅｓ」の場合は、変更されたプログラムのコンパイルによって新たにデータメモリ部６２から領域を確保して割り付けが必要なメモリブロックであることを示す。一方、「新規割付フラグ」が「Ｎｏ」の場合は、変更されたプログラムのコンパイルによって新たにデータメモリ部６２から領域を確保して割り付けが必要なメモリブロックではないことを示す。
【００４４】
図８は、ローカル変数定義情報の構成の一例を示す図である。ローカル変数定義情報８０は、ＰＯＵ毎のローカル変数に関する定義情報を管理するための情報テーブルである。ローカル変数定義情報８０には、ローカル変数毎の情報が含まれ、各ローカル変数の情報には、ローカル変数を含むＰＯＵの「ＰＯＵ型」、ローカル変数の「変数名」、ローカル変数が有するデータの「データ型」、ローカル変数の「データサイズ」、ローカル変数がデータインスタンスのメモリブロックリスト構造のどのメモリブロックに配置されているかを表す「リストインデックス」、ローカル変数が配置されたメモリブロック内での「相対アドレス」（メモリブロックの先頭アドレスからのオフセット）、プログラム変更によって前回のコンパイル時から新たに追加されたローカル変数であるか否かを示す「新規追加フラグ」（識別情報）が含まれる。
【００４５】
「新規追加フラグ」が「Ｙｅｓ」の場合は、プログラム変更によって前回のコンパイル時から新たに追加されたローカル変数であることを示す。一方、「新規追加フラグ」が「Ｎｏ」の場合は、プログラム変更によって前回のコンパイル時から新たに追加されたローカル変数でないことを示す。
【００４６】
「リストインデックス」は、ローカル変数がデータインスタンスのメモリブロックリスト構造のどのメモリブロックに配置されているかを表す。また、「リストインデックス」によって、既存のローカル変数を含むメモリブロックと新たに追加されるローカル変数を含むメモリブロックを識別することが可能となる。
【００４７】
つぎに、データインスタンス割付部２１は、記憶部４０に記憶しているデータインスタンス割付情報７０の「新規割付フラグ」を全て「Ｎｏ」に設定し、ローカル変数定義情報８０の「新規追加フラグ」を全て「Ｎｏ」に設定する（ステップＳ１００）。ここでは、記憶部４０が特許請求の範囲に記載のデータ変数管理部、対応付情報管理部、データ変数記憶部に対応する。
【００４８】
データインスタンス割付部２１は、記憶部４０に記憶しているソースプログラムとローカル変数定義情報８０の内容を比較し、ＰＯＵのソースプログラムで新たに追加されたローカル変数を抽出する。そして、新たに追加されたローカル変数がある場合は、新たに追加されたローカル変数に対してのみ、「新規追加フラグ」の項目を「Ｙｅｓ」にしてローカル変数定義情報８０に追加登録する（ステップＳ１１０）。
【００４９】
このとき、ソースプログラムが例えば図５に示したソースプログラムである場合、ＰＯＵ３に新たに追加されるローカル変数はローカル変数Ｙ１，Ｙ２であり、ここでは図８のローカル変数定義情報８０にＰＯＵ３のローカル変数Ｙ１，Ｙ２を追加登録している。そして、この追加登録の際に「リストインデックス」に記録する値は、同じＰＯＵ３の既存のローカル変数Ｘ１、Ｘ２、Ｘ３の「リストインデックス」の最大値「０」に１を加算した値「１」を用いている。
【００５０】
また、「相対アドレス」に記録する値は、変更するプログラムが図６に示したプログラムの場合、「次ブロックへのアドレス」の格納領域のアドレスに対する相対アドレス
（「次ブロックへのアドレス」の格納領域の次の位置から前詰めにして割り付けた場合の相対アドレス）を用いる。ここでは、「次ブロックへのアドレス」の格納領域を「０」としてローカル変数Ｙ１の相対アドレスが「＋２」であり、ローカル変数Ｙ２の相対アドレスが「＋４」である場合を示している。記憶部４０は、ローカル変数が追加された新たなローカル変数定義情報８０を記憶する。
【００５１】
データインスタンス割付部２１はローカル変数定義情報８０に「新規追加フラグ」の項目が「Ｙｅｓ」となっているローカル変数があるか否かを確認する（ステップＳ１２０）。
【００５２】
データインスタンス割付部２１がローカル変数定義情報８０に「新規追加フラグ」の項目が「Ｙｅｓ」となっているローカル変数があると判断した場合（ステップＳ１２０、ＹＥＳ）、データインスタンス割付部２１は「新規追加フラグ」の項目が「Ｙｅｓ」のローカル変数からＰＯＵ型ごとのメモリブロックのサイズを算出する（ステップＳ１３０）。ここでのメモリブロックのサイズは、データインスタンスのリスト構造に新しい要素として追加されるメモリブロックのサイズであり、ＰＯＵ型ごとに新規追加フラグが「Ｙｅｓ」のローカル変数のデータサイズの合計値とアドレス格納領域（次ブロックへのアドレス）のサイズを加算することによって算出する。
【００５３】
データインスタンス割付部２１は、算出した新規割り付けするメモリブロックのサイズに応じて、インスタンスごとに現在のデータメモリ部６２の空き領域に新しいメモリブロックを割り付ける。インスタンスが複数ある場合は、各インスタンスに対応するメモリブロックを連続して順番に空き領域に割り付ける。
【００５４】
データインスタンス割付部２１は、データインスタンス割付情報７０に、新たにデータメモリ部６２の記憶領域に割り付けられたメモリブロックを追加登録するとともに、このメモリブロックのデータインスタンスの「新規割付フラグ」の項目を「Ｙｅｓ」にする（ステップＳ１４０）。
【００５５】
例えば、図７に示すデータインスタンス割付情報７０の場合、ＰＯＵ３型のデータインスタンス「Ｐｏｕ３＿Ｉｎｓｔ１」、「Ｐｏｕ３＿Ｉｎｓｔ２」に対して、「リストインデックス」が「１」となる新規のメモリブロックの割付情報を追加登録している。そして、新規のメモリブロックの割付情報が追加登録された新たなデータインスタンス割付情報７０を、記憶部４０において記憶する。データインスタンス割付情報７０によって、データメモリ部６２上に配置されたメモリブロックの割付情報を管理することが可能となる。
【００５６】
図９は、データメモリ部上のデータインスタンスの変更の概念を説明するための図である。図９に示すようにデータメモリは、図６に示したメモリブロックリスト構造を用いて割り付けられている。ここでは、図５に示したプログラムの変更（ローカル変数の追加）の場合を示している。
【００５７】
変更前のプログラムは各メモリブロック（データインスタンス）がデータメモリの上から順番にリスト構造で配置されている。そして、このメモリブロックが配置されている下のエリアが空き領域となっている。一方、変更後のプログラムにおいて新たに追加されるメモリブロックは、データメモリ部６２の空き領域上に割り付けられる。このとき、新規の各メモリブロックは空き領域の上から順番にリスト構造で配置されていく。
【００５８】
データインスタンス割付部２１によるメモリブロックの割付処理の後、コードインスタンス展開部２２は、ソースコードに記述された処理ロジックからコードインスタンスを展開し、プログラマブルコントローラ６０で実行可能な目的プログラムを生成する（ステップＳ１５０）。
【００５９】
コードインスタンス展開部２２は、コードインスタンスをデータインスタンスのメモリブロックリストの最初の要素（メモリブロック先頭アドレス）を引数とするサブルーチンとして展開する。
【００６０】
データインスタンス割付部２１が、ローカル変数定義情報８０に「新規追加フラグ」の項目が「Ｙｅｓ」となっているローカル変数がないと判断した場合（ステップＳ１２０、ＮＯ）、新たにローカル変数のデータ格納領域を確保して割り付ける必要がないため、前回コンパイル時の変数割り付けの状態をそのまま再利用する。この場合も、コードインスタンス展開部２２は、ソースコードに記述された処理ロジックからコードインスタンスを展開し、プログラマブルコントローラ６０で実行可能な目的プログラムを生成する（ステップＳ１５０）。
【００６１】
図１０は、コードインスタンス展開部によって展開されるコードインスタンスの一例を示す図である。ここでは、図３に示すプログラム変更がされた場合のコードインスタンスの展開をＣ言語表記で示している。
【００６２】
コードインスタンスの展開における「（ｂｌｏｃｋ０＿ｔｏｐ＿ａｄｒ）」変数は、コードインスタンスの引数として渡される最初のメモリブロックの先頭アドレス値を表す。
コードインスタンス展開部２２は、ＰＯＵのローカル変数にアクセスする処理ロジック部分を展開する場合、ローカル変数定義情報８０から「リストインデックス」と「相対アドレス」を取得する。そして、引数として渡されたアドレス値「（ｂｌｏｃｋ０＿ｔｏｐ＿ａｄｒ）」の値に「リストインデックス」の回数分だけ間接参照（Ｃ言語の＊単項演算子の適用）を繰り返した値に「相対アドレス」を付加した値をアドレスとするデータメモリ位置をアクセスするコードに展開する。コードインスタンスを展開して生成された目的プログラムは、記憶部４０において記憶される。
【００６３】
つぎに、プログラムの変更処理の手順について説明する。図１１は、プログラムの変更処理手順を示すフローチャートである。データメモリアクセス部３１は、データインスタンス割付情報７０の「新規割付フラグ」が「Ｙｅｓ」のメモリブロック（以下、新規メモリブロックという）のデータインスタンスの割付情報があるか否かを判断する（ステップＳ２００）。
【００６４】
データメモリアクセス部３１がデータインスタンス割付情報７０に新規メモリブロックの割付情報がないと判断した場合は（ステップＳ２００、ＮＯ）、オンラインコード変更部３２は、プログラムの実行を停止することなく、記憶部４０に記憶している目的プログラムをプログラマブルコントローラ６０のコードメモリ部６１上に書き込む（ステップＳ２３０）。
【００６５】
一方、データメモリアクセス部３１が新規メモリブロックの割付情報があると判断した場合（ステップＳ２００、ＹＥＳ）、データメモリアクセス部３１はこの新規メモリブロックの先頭アドレスの値を、データメモリ部６２上に形成されるデータインスタンスのメモリブロックリストに書き込む（対応付情報の設定）。このとき、新規メモリブロックの「リストインデックス」よりも「リストインデックス」が１つ前のメモリブロックの先頭アドレスの位置に、新規メモリブロックの先頭アドレスの値を書き込む（ステップＳ２１０）。
【００６６】
例えば、図９に示したプログラムの場合、「Ｐｏｕ３＿Ｉｎｓｔ１」の「リストインデックス」が「１」である新規メモリブロックの先頭アドレスの値（１０１９）を、「Ｐｏｕ３＿Ｉｎｓｔ１」の「リストインデックス」が「０」のメモリブロックの先頭アドレスの位置（アドレス１００７番地）に書き込む。
【００６７】
また、「Ｐｏｕ３＿Ｉｎｓｔ２」の「リストインデックス」が「１」である新規メモリブロックの先頭アドレスの値（１０２４）を、「Ｐｏｕ３＿Ｉｎｓｔ２」の「リストインデックス」が「０」のメモリブロックの先頭アドレスの位置（アドレス１０１３番地）に書き込む。
【００６８】
これにより、プログラマブルコントローラ６０のデータメモリ部６２上に形成されるデータインスタンスのメモリブロックリストに対して、新しく割り付けられたメモリブロックへの前方参照のリンクが形成される。
【００６９】
データメモリ部６２上に新しく割り付けられたメモリブロックの領域は現時点（コードメモリの変更前の時点）では空き領域であり、不定値が格納されている場合がある。このため、コードメモリの変更後にアクセスが行われる新規に追加されたローカル変数のデータ格納領域を初期化しておく必要がある。したがって、データメモリアクセス部３１はデータメモリ部６２の新しく割り付けられたメモリブロック内に配置されるローカル変数のデータ格納領域に対して所定の初期値を書き込む（ステップＳ２２０）。
【００７０】
オンラインコード変更部３２は、プログラムの実行を停止することなく、記憶部４０に記憶している目的プログラムをプログラマブルコントローラ６０のコードメモリ部６１上に書き込む（ステップＳ２３０）。コードメモリ部６１は、修正前のコードメモリのファイルと、修正後のコードメモリのファイルを記憶しておく。
【００７１】
ステップＳ２１０およびステップＳ２２０においてデータメモリ部６２への書き込みアクセスを行っている領域は、コードメモリ部６１においてコードメモリの変更前のプログラムが使用していない空き領域であるため、データメモリ部６２への書き込みアクセスを行ってもコードメモリ部６１のコードメモリを変更する前のプログラムの実行には影響しない。これにより、データメモリ部６２上の余裕領域を効率よく使用して新たなメモリブロックの追加が可能となる。
【００７２】
このように、データメモリの空き領域がメモリブロック毎に分割されていないのでプログラムの変更時に新たに追加されるローカル変数を含むメモリブロックは、空き領域に続けて割付けることができる。また、空き領域に割付けた新規のメモリブロックを、空き領域に割り付ける前のメモリブロックに対応付け処理しているので、プログラマブルコントローラへの目的プログラムを変更する際、空き領域に割り付ける前のメモリブロックの既存変数を変化させることなくプログラマブルコントローラの目的プログラムを変更することができる。したがって、既存変数の値をプログラムの変更前後で変更する必要がないためプログラムの実行を長時間停止させず瞬時に目的プログラムを変更することが可能となる。
【００７３】
なお、データインスタンスのメモリブロック構造に対するメモリブロックの追加は、データメモリ部６２の空き領域からメモリブロックを追加するための領域を確保できれば、メモリブロックの追加回数は何度でも行える。
【００７４】
なお、本実施の形態においては、プログラミング装置１が編集部１０、変換部２０、転送部３０、記憶部４０を備える構成としたが、編集部１０、変換部２０、転送部３０、記憶部４０がそれぞれ独立した構成としてもよい。
【００７５】
このように実施の形態によれば、プログラマブルコントローラ６０への目的プログラムを変更する際、新たに追加されるローカル変数を含むメモリブロックは、空き領域に続けて割付けることができるとともに、空き領域に割り付けられた追加されるメモリブロックはデータメモリ部６２に既に割り付けられているメモリブロックと対応付けられるので、データメモリ部６２の使用効率を低下させることなく、プログラマブルコントローラ６０におけるプログラムの実行を継続しながらプログラマブルコントローラ６０への目的プログラムの変更を行うことが可能となる。
【産業上の利用可能性】
【００７６】
以上のように、本発明にかかるプログラミングシステムは、プログラマブルコントローラに対してプログラムの実行を継続しながらプログラムの変更を行うプログラミング装置とプログラマブルコントローラからなるプログラミングシステムに適している。
【図面の簡単な説明】
【００７７】
【図１】本発明のプログラミングシステムの構成を示す図である。
【図２】プログラミング装置のコンパイル処理手順を示すフローチャートである。
【図３】変更処理を行うプログラムの構成の一例を示す図である。
【図４】プログラムの実行手順の一例を示すシーケンス図である。
【図５】プログラム変更の一例を説明するための図である。
【図６】データメモリ構造の変更を説明するための図である。
【図７】データインスタンス割付情報の構成を示す図である。
【図８】ローカル変数定義情報の構成を示す図である。
【図９】データメモリ部上のデータインスタンスの変更の概念を説明するための図である。
【図１０】コードインスタンスの展開の一例を示す図である。
【図１１】プログラム変更の処理手順を示すフローチャートである。
【符号の説明】
【００７８】
１  プログラミング装置
１０  編集部
２０  変換部
２１  データインスタンス割付部
２２  コードインスタンス展開部
３０  転送部
３１  データメモリアクセス部
３２  オンラインコード変更部
４０  記憶部
５１  入力装置
５２  出力装置
６０  プログラマブルコントローラ
６１  コードメモリ部
６２  データメモリ部
７０  データインスタンス割付情報
８０  ローカル変数定義情報
【図１】
2005301520.tif 000003
【図２】
2005301520.tif 000004
【図３】
2005301520.tif 000005
【図４】
2005301520.tif 000006
【図５】
2005301520.tif 000007
【図６】
2005301520.tif 000008
【図７】
2005301520.tif 000009
【図８】
2005301520.tif 000010
【図９】
2005301520.tif 000011
【図１０】
2005301520.tif 000012
【図１１】
2005301520.tif 000013