(57)【要約】【課題】ユーザＦＢの内部変数のメモリ割当てに関して、不揮発性メモリには保持属性の変数のみが割り当てられるようにできる。【解決手段】コンパイラ２１は、ユーザアプリケーション２２のコンパイルの際、各ＦＢ毎に保持属性か否かに係らず全内部変数をまとめて揮発性メモリ１２に割り当てると共に、保持属性変数については更に不揮発性メモリ１１に割り当てる。更に、各保持属性変数に関して、揮発性メモリ１２の割当アドレスと不揮発性メモリ１１の割当アドレスとの対応関係を記録したインスタンス初期値情報２４を生成する。更に、保持属性変数に関しては揮発性メモリ１２の割当領域を介して不揮発性メモリ１１の割当領域にアクセスする実行コードを生成する。【選択図】図１
2014099066.tif 000002
【特許請求の範囲】
【請求項１】
少なくともファンクションブロックを用いて記述される任意のプログラムの作成支援機能と、該プログラムをコンパイルして実行コードを生成するコンパイラとを有する支援装置と、前記実行コードを実行するプログラマブルコントローラとが接続されたプログラマブルコントローラシステムであって、
前記コンパイラは、
前記コンパイルの際の各変数のメモリ割当てを行う手段であって、前記ファンクションブロックの内部変数に係わるメモリ割当ては、各ファンクションブロック毎に、保持属性／非保持属性に係らず纏めて揮発性メモリへの割当てを行うと共に保持属性の内部変数に関しては更に不揮発性メモリへの割当てを行うメモリ割当手段と、
前記保持属性の内部変数に係わる前記揮発性メモリ上の割当領域と前記不揮発性メモリ上の割当領域とを対応付けて記録したインスタンス初期値情報を生成するインスタンス初期値情報生成手段と、
前記保持属性の内部変数に関しては、前記揮発性メモリ上の割当領域を介して前記不揮発性メモリ上の割当領域へのアクセスを行う前記実行コードを生成する実行コード生成手段とを有し、
前記プログラマブルコントローラは、
電源投入時の初期化処理の際に、前記インスタンス初期値情報に基づいて、前記保持属性の内部変数に係る前記揮発性メモリ上の割当領域に、前記不揮発性メモリ上の割当領域のアドレス情報を格納する初期化手段、
を有することを特徴とするプログラマブルコントローラシステム。
【請求項２】
前記プログラマブルコントローラは、
前記実行コードを実行する手段であって、前記保持属性の内部変数に関しては、前記揮発性メモリ上の割当領域にアクセスすることで前記アドレス情報を取得し、該アドレス情報を用いて前記不揮発性メモリ上の割当領域にアクセスするプログラム実行手段を更に有することを特徴とする請求項１記載のプログラマブルコントローラシステム。
【請求項３】
前記支援装置は、更に、前記コンパイラによって生成された前記実行コードと前記インスタンス初期値情報とを前記プログラマブルコントローラにダウンロードして記憶させるダウンロード手段を有することを特徴とする請求項１または２記載のプログラマブルコントローラシステム。
【請求項４】
前記支援装置は、更に、前記ファンクションブロックの各内部変数の前記保持属性／非保持属性を、任意に設定させる設定手段を有することを特徴とする請求項１〜３の何れかに記載のプログラマブルコントローラシステム。
【請求項５】
少なくともファンクションブロックを用いて記述される任意のプログラムの作成支援機能と、該プログラムをコンパイルして実行コードを生成するコンパイラとを有する支援装置と、前記実行コードを実行するプログラマブルコントローラとが接続されたプログラマブルコントローラシステムの前記支援装置であって、
前記コンパイラは、
前記コンパイルの際の各変数のメモリ割当てを行う手段であって、前記ファンクションブロックの内部変数に係わるメモリ割当ては、各ファンクションブロック毎に、保持属性／非保持属性に係らず纏めて揮発性メモリへの割当てを行うと共に保持属性の内部変数に関しては更に不揮発性メモリへの割当てを行うメモリ割当手段と、
前記保持属性の内部変数に係わる前記揮発性メモリ上の割当領域と前記不揮発性メモリ上の割当領域とを対応付けて記録したインスタンス初期値情報を生成するインスタンス初期値情報生成手段と、
前記保持属性の内部変数に関しては、前記揮発性メモリ上の割当領域を介して前記不揮発性メモリ上の割当領域へのアクセスを行う前記実行コードを生成する実行コード生成手段と、
を有することを特徴とするプログラマブルコントローラの支援装置。
【請求項６】
少なくともファンクションブロックを用いて記述される任意のプログラムの作成支援機能と、該プログラムをコンパイルして実行コードを生成するコンパイラとを有する支援装置と、前記実行コードを実行するプログラマブルコントローラとが接続されたプログラマブルコントローラシステムの前記プログラマブルコントローラであって、
電源投入時の初期化処理の際に、予め前記支援装置側で生成されて該プログラマブルコントローラ側に記憶された、保持属性の内部変数に係る揮発性メモリ上の割当領域と不揮発性メモリ上の割当領域とを対応付けて記録したインスタンス初期値情報に基づいて、前記保持属性の内部変数に係る前記揮発性メモリ上の割当領域に、前記不揮発性メモリ上の割当領域のアドレス情報を格納する初期化手段と、
運用中、予め前記支援装置側で生成されて該プログラマブルコントローラ側に記憶された前記実行コードを実行する手段であって、前記保持属性の内部変数に関しては前記揮発性メモリ上の割当領域に格納された前記アドレス情報を用いて前記不揮発性メモリ上の割当領域へのアクセスを行う前記実行コードを実行する実行手段と、
を有することを特徴とするプログラマブルコントローラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラのプログラムの変数に係るメモリ割当方式に関する。
【背景技術】
【０００２】
図６に、従来のプログラマブルコントローラシステムの一例を示す。
従来より、プログラマブルコントローラ（ＰＬＣ）に係るシステムの一例として、図６に示すような、プログラマブルコントローラ本体（ＰＬＣ１００）と支援装置１１０とが通信線等を介して接続された構成が知られている。
【０００３】
支援装置１１０は、ＰＬＣ１００が実行する制御プログラム等をユーザが任意に作成できるように支援する機能（不図示）を有する。ユーザは、この支援機能を利用して任意の制御プログラムのソースコード（ユーザアプリケーション１１２）を作成する。
【０００４】
このユーザアプリケーション１１２の作成に使用するプログラム言語は、様々であるが、通常は、ＩＥＣ６１１３１−３規格の５種類のプログラム言語（以下、ＩＥＣ言語と記す場合もあるものとする）のうちの何れかを使用することになる。
【０００５】
上記５種類のプログラム言語は、例えばラダー図、ＦＢ（ファンクションブロック）等である。ここでは、ユーザアプリケーション１１２は、例えば図示のＰＧ（プログラム）、ＦＢ（ファンクションブロック）、ＦＣＴ（ファンクション）の３つのＰＯＵ要素により記述される。
【０００６】
図７に、ＦＢ（ファンクションブロック）の一例を示す。
この例のＦＢ（ファンクションブロック）に係る変数として、図示の外部変数１，２、３と、内部変数１，２がある。外部変数は、外部からのＦＢに対する入力や、ＦＢから外部への出力に用いられる変数である。内部変数は、ＦＢ内部で保持／使用される変数であり、図示の例に限らず、更に他の内部変数が存在する場合も有り得る。
【０００７】
支援装置１１０は、例えば上記ＦＢ等を用いて記述されたユーザアプリケーション１１２を、コンパイルして機械語等の実行コード群（実行オブジェクト１１３）に変換するコンパイラ１１１も有している。そして、支援装置１１０は、コンパイラ１１１が生成した実行オブジェクト１１３を、通信線等を介してＰＬＣ１００にダウンロードする機能も有する。
【０００８】
また、ユーザアプリケーション１１２の実行オブジェクト１１３をＰＬＣ１００で動作させるためには、各変数をＰＬＣ１００内のメモリに割当てる必要があり、従来より、コンパイラ機能が変数のメモリ割当てを実施している。すなわち、コンパイラ１１１は、上記コンパイル実行の際に、上記ＦＢ等の各変数等に対してメモリアドレス割当てを行う。この変数のメモリアドレス割当ては、ＰＬＣ１００内のメモリに対して行われる。
【０００９】
また、ユーザが作成した各ＦＢ（以下、ユーザＦＢと記す）は、各々、プログラムコードは１つであるが（通常は）複数個インスタンス化される。このため、プログラムコードでは、変数を絶対番地でのアクセスではなく、相対番地でのアクセスとするコードになり、各ユーザＦＢのインスタンス毎に、ある基準を示すレジスタ（インデックスレジスタやベースレジスタやベースポインタ等と呼ばれる；インスタンス領域の先頭アドレスを示すポインタ等と見做してよい）を使用して、この基準アドレスからの相対アドレスによって、ユーザＦＢに係る内部変数にアクセスしていた。
【００１０】
内部変数に係わるメモリアドレス割当てに関しては、各ＦＢインスタンス毎に、１つのインデックスレジスタが割り当てられると共に、このインデックスレジスタを先頭とする所定の記憶領域（例えば内部変数の数に応じた記憶容量）が、そのＦＢインスタンスに割り当てられる記憶領域（インスタンス領域）として確保される。これは、換言すれば、各ＦＢインスタンス毎に、その各ＦＢインスタンスに係る全内部変数の割当領域が、纏めて確保されることになる。
【００１１】
ここで、支援装置１１０は、例えば上記ユーザＦＢに関して、上記変数のうち特に上記外部変数としての各変数の保持属性／非保持属性をユーザが任意に指定できる機能も有する場合がある。保持属性の変数は、ＰＬＣ１００側で運用中にたとえＰＬＣ１００が電源オフしても消去されずに残されることが必要となる変数である（よって、不揮発性メモリに格納させるべき変数である）。非保持属性の変数は、この様な場合は消去されても構わない変数である（よって、揮発性メモリに格納してもよいが、不揮発性メモリに格納しても構わない変数である）。これら各外部変数の保持属性／非保持属性は、ユーザが任意に判断して設定する。
【００１２】
一方、従来では、内部変数の保持属性／非保持属性をユーザが任意に設定することは、行われていない。これは技術的には容易に実現可能であるが、あまり意味がないので、行っていないものである。つまり、上記のように内部変数に関しては、ＦＢインスタンス単位で纏めてメモリアドレス割当てが行われるが、１つでも保持属性の内部変数があれば揮発性メモリに割り当てるわけにはいかない為、従来では常に纏めて不揮発性メモリへの割当てを行っていた。
【００１３】
ＰＬＣ１００は、不図示の制御対象機器や不図示のプログラマブル表示器等にも接続されている。ＰＬＣ１００は、上記ダウンロードされた実行オブジェクト１１３を記憶してこれを実行することで、上記制御対象機器等の制御を行う。この実行中、上記各変数に係る処理に関するデータが、ＰＬＣ１００内のメモリの割当領域に対してリード／ライトされることになる。
【００１４】
ここで、ＰＬＣ１００は、不図示のフラッシュメモリ、ＳＲＡＭ（バッテリーバックアップ付）、ＤＲＡＭ等を有している。フラッシュメモリやＳＲＡＭ（バッテリーバックアップ付）は不揮発性メモリ、ＤＲＡＭは揮発性メモリである。
【００１５】
上記ダウンロードされた実行オブジェクト１１３は、通常、不図示のフラッシュメモリに記憶される。また、保持属性の変数のメモリアドレス割当ては、揮発性メモリ（不図示）に行うべきではなく、従来の一例では不揮発性メモリ１０１（例えばＳＲＡＭ（バッテリーバックアップ付等）に割当てられていた。一方、非保持属性の変数のメモリアドレス割当ては、揮発性メモリに行ってもよいし、不揮発性メモリ１０１に行ってもよい。
【００１６】
ここで、上記コンパイラ１１１による変数メモリ割当ては、特に上記内部変数に関しては、既に述べたように、各変数単位ではなく、ＦＢインスタンス単位で行われていた。そして、各ＦＢインスタンス毎に、その全内部変数のメモリ割当領域をまとめて不揮発性メモリ１０１に割り当てていた。
【００１７】
また、特許文献１の従来技術が知られている。
特許文献１の発明は、ファンクションブロックを含むシーケンスプログラムを編集するシーケンスプログラム編集装置において、修正したファンクションブロック定義を指定（入力）するだけで、既にシーケンスプログラムの中で使用しているファンクションブロックインスタンスを「検索」、「削除」すると共に、「修正したファンクションブロック定義の再インスタンス化」を自動的に行い情報の再入力を省略することができる。
【００１８】
また、特許文献１の図２には、ファンクションブロック定義の構成要素として内部変数等が示されている。
【先行技術文献】
【特許文献】
【００１９】
【特許文献１】特開２００９−９４６２号公報
【発明の概要】
【発明が解決しようとする課題】
【００２０】
不揮発性メモリ（特にＳＲＡＭ等）は、揮発性メモリ（ＤＲＡＭ等）に比べて、高価、容量が小さい上に、単一のデータアクセスでは揮発性メモリに比べて速いものの、１回のアクセスで128バイトアクセスできるバースト転送や、キャッシュを用いた高速化ができないため、トータルのアクセス性能は劣ってしまうという特徴がある。
【００２１】
上記従来技術では、上述したように、不揮発性メモリ１０１のインスタンス領域にユーザＦＢの内部変数全てを纏めて割当てる必要があり、上記特徴が要因となりユーザアプリケーションの実行速度の低下等を招いている。これは、特に近年、ＰＬＣのプログラミングが大規模になり、構造化設計を実施すると、ユーザＦＢを多用するプログラミングになり、インスタンスサイズも大きくなる傾向であるので、問題の影響が大きくなっている。
【００２２】
本発明の課題は、ユーザＦＢの内部変数のメモリ割当てに関して、ＦＢ単位でまとめてメモリ割当てを行う場合であっても、不揮発性メモリには保持属性の変数のみが割り当てられるようにでき、不揮発性メモリの割当領域を削減でき、ＰＬＣ運用中の動作時に不揮発性メモリへのアクセス頻度を減少させることができるプログラマブルコントローラシステム等を提供することである。
【課題を解決するための手段】
【００２３】
本発明のプログラマブルコントローラシステムは、少なくともファンクションブロックを用いて記述される任意のプログラムの作成支援機能と、該プログラムをコンパイルして実行コードを生成するコンパイラとを有する支援装置と、前記実行コードを実行するプログラマブルコントローラとが接続されたプログラマブルコントローラシステムであって、下記の構成を有する。
【００２４】
すなわち、まず、前記コンパイラは、下記の各手段を有する。
・前記コンパイルの際の各変数のメモリ割当てを行う手段であって、前記ファンクションブロックの内部変数に係わるメモリ割当ては、各ファンクションブロック毎に、保持属性／非保持属性に係らず纏めて揮発性メモリへの割当てを行うと共に保持属性の内部変数に関しては更に不揮発性メモリへの割当てを行うメモリ割当手段；
・前記保持属性の内部変数に係わる前記揮発性メモリ上の割当領域と前記不揮発性メモリ上の割当領域とを対応付けて記録したインスタンス初期値情報を生成するインスタンス初期値情報生成手段；
・前記保持属性の内部変数に関しては、前記揮発性メモリ上の割当領域を介して前記不揮発性メモリ上の割当領域へのアクセスを行う前記実行コードを生成する実行コード生成手段；
また、前記プログラマブルコントローラは、電源投入時の初期化処理の際に、前記インスタンス初期値情報に基づいて、前記保持属性の内部変数に係る前記揮発性メモリ上の割当領域に、前記不揮発性メモリ上の割当領域のアドレス情報を格納する初期化手段を有する。
【発明の効果】
【００２５】
本発明のプログラマブルコントローラシステム等によれば、ユーザＦＢの内部変数のメモリ割当てに関して、ＦＢ単位でまとめてメモリ割当てを行う場合であっても、不揮発性メモリには保持属性の変数のみが割り当てられるようにでき、不揮発性メモリの割当領域を削減でき、ＰＬＣ運用中の動作時に不揮発性メモリへのアクセス頻度を減少させることができる。
【図面の簡単な説明】
【００２６】
【図１】本例のプログラマブルコントローラシステムの構成図である。
【図２】（ａ）にはＦＢインスタンスの具体例、（ｂ）は保持属性／非保持属性設定画面例である。
【図３】ＰＬＣにおける変数のメモリ割当内容の具体例を示す図である。
【図４】（ａ）は変数のメモリ割当例、（ｂ）はプログラムの実行コード生成例である。
【図５】インスタンス初期値情報の具体例である。
【図６】従来のプログラマブルコントローラシステムの構成図である。
【図７】ファンクションブロックの一例である。
【発明を実施するための形態】
【００２７】
以下、図面を参照して本発明の実施の形態について説明する。
図１は、本例のプログラマブルコントローラシステムの構成図である。
本例のプログラマブルコントローラシステムも、概略的には上記従来と略同様に、プログラマブルコントローラ本体（ＰＬＣ１０）と支援装置２０とが通信線等を介して接続された構成となっている。但し、これらＰＬＣ１０、支援装置２０が備える処理機能は、上記従来のＰＬＣ１００、支援装置１１０の処理機能とは異なる点がある。尚、ここでも特に図示しないが上記従来と同様、ＰＬＣ１０は更に不図示の制御対象機器等と接続している。
【００２８】
ＰＬＣ１０は、不揮発性メモリ１１（バックアップ付ＳＲＡＭ等）、揮発性メモリ１２（ＤＲＡＭ等）を有する。これらのメモリは、例えば、運用中の制御プログラム（実行オブジェクト２３）実行による各種処理に伴って生じる各種データ（上記変数に係わるデータ等）を格納するものである。
【００２９】
ＰＬＣ１０は、支援装置２０が生成してダウンロードしてくる後述する実行オブジェクト２３を、従来と同様に自己の不図示のフラッシュメモリ等に記憶する。実行オブジェクト２３に係わる各変数であって特にＦＢの各内部変数に関しては、上記従来と同様に任意のメモリアドレスが割り当てられている。但し、従来では不揮発性メモリ１１にのみ割り当てられているのに対して、本手法では揮発性メモリ１２に割り当てられると共に、保持属性変数については更に不揮発性メモリ１１にも割り当てられている。つまり、不揮発性メモリ１１への変数メモリ割当てが従来よりも少なくて済む。これについて、詳しくは後述する。
【００３０】
また、ＰＬＣ１０は、支援装置２０が生成してダウンロードしてくる後述するインスタンス初期値情報２４も、上記フラッシュメモリ等に記憶する。そして、ＰＬＣ１０は、そのシステム処理部１３が、このインスタンス初期値情報２４に基づいて後述するインスタンス初期値展開処理を実行する。これについても詳しくは後述する。
【００３１】
支援装置２０は、従来と同様、ＰＬＣ１０が実行する制御プログラム等をユーザが任意に作成できるように支援する機能（不図示）を有する。ユーザは、この支援機能を利用して任意の制御プログラムのソースコード（ユーザアプリケーション２２）を作成する。このユーザアプリケーション２２は、例えば図示のＰＧ（プログラム）、ＦＢ（ファンクションブロック）、ＦＣＴ（ファンクション）の３つのＰＯＵ要素により記述される。ユーザアプリケーション２２自体は、従来のユーザアプリケーション１１２と同じであっても構わない。
【００３２】
支援装置２０は、コンパイラ２１を有する。このコンパイラ２１の処理機能は、従来のコンパイラ１１１とは異なる。すなわち、コンパイラ２１は、実行オブジェクト生成機能部２１ａ、ＦＢインスタンスマッピング処理部２１ｂの各処理機能部を有する。
【００３３】
実行オブジェクト生成機能部２１ａは、上記ユーザアプリケーション２２をコンパイルして機械語等の実行コード群（実行オブジェクト２３）を生成する。その際、ＦＢ等に係わる各変数に対するメモリアドレス割当てを行うが、このメモリ割当方法とそれに伴って生成される実行コード等が従来とは異なる。これについて詳しくは後に図４の具体例を参照して説明するものとし、ここでは概略的に説明する。
【００３４】
すなわち、実行オブジェクト生成機能部２１ａの上記メモリ割当方法は、例えば、まず、ＦＢ単位でそのＦＢの全ての内部変数をまとめて揮発性メモリ１２（ＤＲＡＭ等）における任意の記憶領域に割り当てる。上記のようにＦＢ単位でまとめて内部変数のメモリ割当を行うという制約がある為、この点では従来と同じであるが、従来では不揮発性メモリ１１（バックアップ付ＳＲＡＭ等）にまとめて割り当てていたのに対して、本手法では上記のように揮発性メモリ１２にまとめて割り当てる。
【００３５】
但し、このままでは上述した保持属性の変数については問題があるので、実行オブジェクト生成機能部２１ａは、保持属性の内部変数に関しては更に不揮発性メモリ１１（バックアップ付ＳＲＡＭ等）の記憶領域を割り当てると共に、この割当領域に上記揮発性メモリ１２（ＤＲＡＭ等）の割当領域を介してアクセスできるようにする実行コードを生成する。
【００３６】
ＦＢインスタンスマッピング処理部２１ｂは、上記実行オブジェクト生成機能部２１ａによる変数のメモリアドレス割当結果に基づいて、インスタンス初期値情報２４を生成する。
【００３７】
ＦＢインスタンスマッピング処理部２１ｂは、上記保持属性の各内部変数毎に、その変数に関する不揮発性メモリ１１上の割当領域と揮発性メモリ１２上の割当領域との対応関係を記録したインスタンス初期値情報２４を生成する。これについては、インスタンス初期値情報２４の具体例を図５に示して後に更に詳細に説明するものとする。
【００３８】
支援装置２０は、上記コンパイラ２１によって生成された上記実行オブジェクト２３とインスタンス初期値情報２４とを、ＰＬＣ１０にダウンロードする。ＰＬＣ１０は、ダウンロードされた実行オブジェクト２３とインスタンス初期値情報２４を、自己の例えば上記フラッシュメモリ等に記憶する。
【００３９】
その後、ＰＬＣ１０は、例えばシステム処理部１３が、電源投入後の初期化処理の度に、上記保持属性の各内部変数については、インスタンス初期値情報２４に基づいて、その変数の揮発性メモリ１２上の割当領域に、不揮発性メモリ１１上の割当領域のアドレス情報を格納する処理（インスタンス初期値展開処理と呼ぶものとする）を行う。これによって、上記実行オブジェクト２３を実行すると、上記保持属性の内部変数に関しては、上記揮発性メモリ１２を介して不揮発性メモリ１１上の割当領域にアクセスできるようになる。詳しくは後述する。
【００４０】
尚、上記支援装置２０、ＰＬＣ１０は、特に図示等しないが下記の処理機能を有するものと見做すこともできる。
すなわち、ＰＬＣ２０は、不図示のメモリ割当部、インスタンス初期値情報生成部、実行コード生成部等の各種処理機能部を有するものと見做してもよい。また、これらの処理機能部は、全て、コンパイラ２１が有する機能であると見做してもよいが、この例に限らない。
【００４１】
メモリ割当部は、コンパイルの際の各変数のメモリ割当てを行う機能部であって、ファンクションブロックの内部変数に係わるメモリ割当ては、各ファンクションブロック毎に、保持属性／非保持属性に係らず纏めて揮発性メモリへの割当てを行うと共に保持属性の内部変数に関しては更に不揮発性メモリへの割当てを行う。
【００４２】
インスタンス初期値情報生成部は、保持属性の内部変数に係わる揮発性メモリ上の割当領域と不揮発性メモリ上の割当領域とを対応付けて記録したインスタンス初期値情報を生成する。尚、インスタンス初期値情報生成部は、上記ＦＢインスタンスマッピング処理部２１ｂに相当するものと見做してもよい。
【００４３】
実行コード生成部は、保持属性の内部変数に関しては、揮発性メモリ上の割当領域を介して不揮発性メモリ上の割当領域へのアクセスを行う実行コードを生成する。
尚、メモリ割当部及び実行コード生成部が、上記実行オブジェクト生成機能部２１ａに相当するものと見做してもよい。
【００４４】
また、ＰＬＣ１０は、上述したインスタンス初期値展開処理を実行する不図示の初期化部を有するものと見做してもよい。
尚、支援装置２０は、例えば汎用のパソコン等により実現されるものであり、ハードウェア的には汎用のパソコンの一般的な構成であってよい。すなわち、支援装置２０は、例えばＣＰＵ、記憶装置（ハードディスク等）、メモリ、通信機能部、表示部（ディスプレイ等）、入力操作部（キーボード、マウス等）等を備えるものである。また、上記記憶装置には予め所定のアプリケーションプログラムが記憶されており、上記ＣＰＵがこのアプリケーションプログラムを実行することで、例えばコンパイラ２１の上記各種処理機能等の支援装置２０の各種処理機能が実現される。
【００４５】
また、ＰＬＣ１０は、不図示のＣＰＵや各種メモリ（不図示のフラッシュメモリや、不揮発性メモリ１１、揮発性メモリ１２等）、各種制御対象機器との入出力インタフェース、通信機能部等を有している。上記ダウンロードされる実行オブジェクト２３とインスタンス初期値情報２４は、例えば上記フラッシュメモリに記憶される。また、フラッシュメモリには、他にも所定のアプリケーションプログラムが予め記憶されている。上記ＣＰＵが、このアプリケーションプログラムを実行することにより、例えば上記システム処理部１３の処理機能等が実現される。
【００４６】
以下、図２〜図５に示す具体例を参照しながら、上述したプログラマブルコントローラシステムの動作について、更に詳細に説明する。
図２（ａ）には、ＦＢインスタンスの具体例を示す。
【００４７】
ここでは、ＦＢ１をインスタンス化した２つのＦＢインスタンスＦＢ１＿１、ＦＢ１＿２と、ＦＢ２をインスタンス化した１つのＦＢインスタンスＦＢ２＿１を示す。例えば、ＦＢインスタンスＦＢ１＿１やＦＢ１＿２を例にすると、図示のPin_0、Pout_0や、Pin_1、Pout_1等が、上述した外部変数である。また、図示のINPUT_1、OUTPUT_1や不図示のVER_1、VER_2等が、上述した内部変数である。
【００４８】
尚、従来通り、ファンクションブロックのロジックは１つでも、ユーザは複数利用することができ、複数利用する場合はコンパイラ機能により複数のインスタンス化を実施する。これより、例えば上記のように、１つのＦＢ１から２つのＦＢインスタンスＦＢ１＿１、ＦＢ１＿２が生成される場合もあることになる。尚、本手法では、上記のように、コンパイラ２１は、ファンクションブロック（ＦＢ）をインスタンス化する場合、不揮発性メモリ１１と揮発性メモリ１２の両方にインスタンス領域を持たせる。これについて詳しくは後述する。
【００４９】
また、本例では、ユーザＦＢの内部変数に関しても、ユーザが任意に保持属性／非保持属性を指定することができる。但し、これは、上記のように従来でも実現可能であったので、以下、簡単に説明するものとする。
【００５０】
図２（ｂ）に、ＦＢの内部変数に関してユーザが任意に保持属性／非保持属性を指定する為の画面例を示す。
図２（ｂ）には、各ユーザＦＢ毎の保持属性／非保持属性設定画面を示すものであり、図上上側にＦＢ１の設定画面、図上下側にＦＢ２の設定画面を示す。
【００５１】
図上上側にＦＢ１の設定画面を例にするならば、ＦＢ１に係る上記内部変数一覧（ここではINPUT_1、OUTPUT_1、VER_1、VER_2とする）が表示されると共に（例えば、各ＦＢ毎にそのＦＢに係る内部変数に関する情報等が、予め登録されている）、これら各内部変数毎に保持属性変数であるか否かを設定するための入力欄（図示の「保持形」の欄）が表示される。
【００５２】
ユーザは、この表示内容を参照して、保持属性変数とする内部変数を判断する。そして、保持属性変数とする内部変数に対応する上記入力欄（「保持形」）にチェック（レ）を入れる。図示の例では、VER_1に対応する入力欄（「保持形」）にだけチェック（レ）が入っているので、VER_1だけが保持属性指定されたことになる（他の内部変数INPUT_1、OUTPUT_1、VER_2は、全て、非保持属性指定されたものと見做される）。
【００５３】
この設定は、ＦＢ１のインスタンス全てに適用される。よって、この設定例の場合、後に図３で説明するように、上記２つのＦＢインスタンスＦＢ１＿１、ＦＢ１＿２はどちらも、VER_1だけが保持属性となっている。
【００５４】
尚、図示等しないが、勿論、上記図２（ｂ）の例のような設定画面上での設定内容は、記憶されることになる。つまり、各ＦＢ毎に、そのＦＢに係る各内部変数の変数名等に対応付けて、この内部変数の保持属性／非保持属性が登録されたファイル情報等（内部変数属性情報と呼ぶものとする）が、支援装置２０の不図示の記憶装置等に記憶される。
【００５５】
図２（ｂ）に示す例のように設定された場合、ＰＬＣ１０における内部変数のメモリ割当て内容は、例えば図３に示すようになる。
すなわち、上記従来と同様にＦＢインスタンス単位でまとめて内部変数のアドレス割当てを行うが、従来では内部変数全てをまとめて不揮発性メモリ１１に割り当てたのに対して、本手法では図３に示すように、まず、内部変数全てをまとめて揮発性メモリ１２に割り当てたうえで、更に上記保持属性指定された内部変数については不揮発性メモリ１１に割当領域を確保する。その際に、上記インスタンス初期値情報２４の作成も行うようにしてもよい。
【００５６】
すなわち、まず、図３の図上左側に示すようにＦＢインスタンスＦＢ１＿１、ＦＢ１＿２、ＦＢ２−１の順に各ＦＢインスタンス単位の揮発性メモリ１２へのメモリアドレス割当てを実行する（インスタンス領域を確保する）。その際、上記内部変数属性情報に基づいて当該メモリ割当を行った各変数のなかから保持属性の変数（該当変数というものとする）を見つけ出す毎に、この該当変数については更に不揮発性メモリ１１にもメモリ割当てを行う。
【００５７】
これは、例えば、不揮発性メモリ１１の空き領域の先頭（ここではデフォルトでは１０００番地とする）から順次割り当てていく（尚、この例より、以下の説明では逐一記載がなくても、１０００番地台のアドレスは、不揮発性メモリ１１のアドレスを意味するものとする）。そして、これら各該当変数に関する揮発性メモリ１２上の割当アドレスと不揮発性メモリ１１上の割当アドレスとを対応付けて記憶していく。これによって、例えば図５に示すインスタンス初期値情報２４が作成される。
【００５８】
例えば、図３の図上左側に示す例では、まずＦＢインスタンスＦＢ１＿１のVER_1は該当変数であるので、図上右側に示すように、不揮発性メモリ１１の１０００番地を割り当てると共に、図５に示すインスタンス初期値情報２４の例のように、この該当変数（ＦＢ１＿１のVER_1）に関する揮発性メモリ１２の割当アドレス（‘１’番地）と上記１０００番地とを対応付けて記憶する。
【００５９】
同様に、次の該当変数はＦＢインスタンスＦＢ１＿２のVER_1であるので、図上右側に示すように、不揮発性メモリ１１の次の番地（１００１番地；この時点での空き領域の先頭）を割り当てると共に、図５に示すように、この該当変数（ＦＢ１＿２のVER_1）に関する揮発性メモリ１２の割当アドレス（‘５’番地）と上記１００１番地とを対応付けて記憶する。
【００６０】
同様に、次の該当変数はＦＢインスタンスＦＢ２＿１のVER_1であるので、図上右側に示すように、不揮発性メモリ１１の次の番地（１００２番地；この時点での空き領域の先頭）を割り当てると共に、図５に示すように、この該当変数（ＦＢ２＿１のVER_1）に関する揮発性メモリ１２の割当アドレス（‘１０’番地）と上記１００２番地とを対応付けて記憶する。
【００６１】
同様に、次の該当変数はＦＢインスタンスＦＢ２＿１のVER_2であるので、図上右側に示すように、不揮発性メモリ１１の次の番地（１００３番地；この時点での空き領域の先頭）を割り当てると共に、図５に示すように、この該当変数（ＦＢ２＿１のVER_2）に関する揮発性メモリ１２の割当アドレス（‘１１’番地）と上記１００３番地とを対応付けて記憶する。
【００６２】
また、コンパイラ２１は、上記図３の図上左側に示すような揮発性メモリ１２の割当アドレスを用いて、ユーザアプリケーション２２から実行オブジェクト２３（各実行コード等）を生成する。その際、上記保持属性の変数に関しては、非保持属性の変数とは異なる実行コードを生成する。これについて以下、図４の例を参照して説明する。
【００６３】
図４（ａ）には、上記ＦＢインスタンスＦＢ１＿１の変数のメモリ割当てを示すが、ここでは説明の都合上、揮発性メモリ１２に関しては、上記アドレス０番地〜３番地の代わりに、図示の“IX＋０”番地、“IX＋１”番地（例えば上記１番地に相当する）、“IX＋２”番地、“IX＋３”番地が割り当てられたものとする。尚、IXはインデックスレジスタを意味し、この例の場合はＦＢインスタンスＦＢ１＿１に係わるインデックスレジスタを意味することになる。従来で説明した通り、このインデックスレジスタを基準にした相対アドレス（＋０、＋１、＋２、＋３）によって、各内部変数へのメモリアドレス割当てが行われることになる。
【００６４】
また、これより、保持属性である変数VER_1に関する上記インスタンス初期値情報２４は、“IX＋１”番地と１０００番地とが対応付けられることになる。但し、コンパイル処理による実行コード生成の際には、不揮発性メモリ１１上の番地（１０００番地）は考慮されない。図４（ｂ）に示すように、保持属性であるか否かに関係なく、揮発性メモリ１２上の割当アドレスのみを用いて実行コード生成される。但し、保持属性の変数の場合、非保持属性の変数とは異なる実行コードが生成される。
【００６５】
すなわち、ユーザアプリケーション２２のプログラムが、例えば図４（ｂ）の図上左側に示すものであった場合、これをコンパイルすると、まず、１行目の「VER_2:=INPUT_１；」は、これら２つの変数の両方とも非保持属性であるので、単にこれら各変数の揮発性メモリ１２上の割当アドレスを用いた下記の実行コードへと変換される。
【００６６】
＊（IX＋２）  ←  ＊（IX＋０）  ・・・図示の（β）
尚、これは、アドレス“IX＋０”の格納データを取得してアドレス“IX＋２”に格納する処理を意味する。
【００６７】
これに対して、２行目の「VER_2:=VER_１；」は、両方とも揮発性メモリ１２上の割当アドレスを用いて実行コードへの変換を行う点では上記１行目と同じであるが、VER_１は保持属性変数であるので、下記の実行コードへと変換される。
【００６８】
＊（IX＋２）  ←  ＊｛＊（IX＋１）｝  ・・・図示の（α）
尚、これは、アドレス“IX＋１”の格納データをアクセス先アドレスと見做して、このアクセス先アドレスの格納データを取得してアドレス“IX＋２”に格納する処理を意味する。ＰＬＣ１０の運用中には、後述するシステム制御部１３の“インスタンス初期値展開処理”によってアドレス“IX＋１”の格納データは“１０００番地”となっているはずであるので、１０００番地の格納データを取得してアドレス“IX＋２”に格納する処理を行うことになる。
【００６９】
ＰＬＣ１０は、そのシステム制御部１３が、例えば初期処理の際に、上記ダウンロードされたインスタンス初期値情報２４に基づいて、保持属性変数に関しては、その不揮発性メモリ１１上の割当領域のアドレス情報を、その揮発性メモリ１２上の割当領域に格納する処理である“インスタンス初期値展開処理”を行う。つまり、「揮発性メモリのインスタンスアドレス」３１のデータ（アドレス）が示す記憶領域に、「不揮発性メモリのインスタンスアドレス」３２のデータ（アドレス）を格納する処理を行う。
【００７０】
例えば、図５に示す例では、揮発性メモリ１２上の1番地の記憶領域に“１０００”番地が格納される。同様、揮発性メモリ１２上の５番地の記憶領域に“１００１”番地が格納される。他も略同様である。これによって、例えば、上記アドレス“IX＋１”の格納データは“１０００”番地となっていることから（不揮発性メモリ１１の）１０００番地にアクセスしてその格納データを取得することになる（あるいはデータの書込み等）。
【００７１】
尚、上記インスタンス初期値情報２４の生成は、上述した一例に限らず、例えば図４（ｂ）の図上右側に示すような実行コード群を生成後に、この実行コード群に基づいて生成するようにしてもよい。例えば、実行コード群において「＊｛＊」を検索して、「＊｛＊」を検出する毎にその直後の（）内のアドレスを、「揮発性メモリのインスタンスアドレス」３１に格納すると共に、これに対応する不揮発性メモリ１２上の割当アドレスを新たに任意に決定して（例えば上記のようにその時点の空き領域の先頭とする）、これを「不揮発性メモリのインスタンスアドレス」３２に格納する。
【００７２】
上記図４等について説明したように、本例のコンパイラ２１は、ＦＢの内部変数に関しては、変数属性が保持属性であるか非保持属性であるかによって、生成する実行コードが異なる。すなわち、内部変数が保持属性であった場合、コンパイラ２１はユーザプログラムを図４（ｂ）に示す（α）のような実行オブジェクトに解釈する。これは、揮発性メモリインスタンス領域にあるVER_1 の割当アドレス情報（“IX＋１”）を元に、VER_1の実態（１０００番地の格納データ）へアクセスするコードを生成するものである。
【００７３】
内部変数が非保持属性であった場合、コンパイラ２１はユーザプログラムを図４（ｂ）に示す（β）のような実行オブジェクトに解釈する。これは、揮発性メモリ１２上の割当領域のデータにアクセスするコードを生成するものである。
【００７４】
これによってＰＬＣ１０は、各ＦＢインスタンス毎の一つのインデックスレジスタによって、揮発性メモリ１２にアクセスする場合もあれば（非保持属性変数の場合）、揮発性メモリ１２を介して不揮発性メモリ１１にアクセスする場合もある（保持属性変数の場合）。
【００７５】
以上説明したように、コンパイラ２１は、保持属性変数に関して、例えば図５に示す例のようなインスタンス初期値情報２４を作成することで、不揮発性メモリ１１上の割当アドレスと揮発性メモリ１２上の割当アドレスとを紐付ける。そして、このインスタンス初期値情報２４を、実行オブジェクト２３と共にＰＬＣ１０にダウンロードして記憶させる。ＰＬＣ１０は、ユーザアプリケーション起動時、インスタンス初期値情報２４を参照することで、保持属性変数に関しては、揮発性メモリ１２上の割当領域に、不揮発性メモリ１１上の割当領域へのポインタ情報を書き込む。
【００７６】
以上説明したように、本手法の上記支援装置２０のコンパイラ２１は、ＩＥＣ言語で記述されたプログラム（ユーザアプリケーション２２）をプログラマブルコントローラ（ＰＬＣ１０）で動作する実行オブジェクト２３へ変換するコンパイラであって、特に保持属性変数と非保持属性変数とが混在するファンクションブロック（ＦＢ）を含むプログラムをコンパイルするコンパイラであって、以下の処理機能を有する。
【００７７】
すなわち、まず、上記ＦＢインスタンス単位での変数のメモリ割当て処理について、各ＦＢインスタンス毎にその各内部変数をまとめて揮発性メモリ１２上に割り当てる。そのうえで保持属性変数については、更に不揮発性メモリ１１上での任意の記憶領域を割り当てると共に、この記憶領域のアドレスを上記揮発性メモリ１２上の割当アドレスと対応付けて記憶する（すなわち、上記インスタンス初期値情報２４を作成する）。保持属性関数に関しては、揮発性メモリ１２上の割当領域は、不揮発性メモリ１１上のマッピングアドレスが格納される領域として使用することになる（つまり、揮発性メモリ１２を介して不揮発性メモリ１１上の割当領域にアクセスするように構成する）。
【００７８】
上記のように、コンパイラ２１は、非保持属性変数の場合には揮発性メモリ１２のインスタンス領域にアドレスマッピングを行う。一方、保持属性変数の場合には、不揮発性メモリ１１のインスタンス領域にアドレスマッピングを行うと共に、揮発性メモリ１２のインスタンス領域に不揮発性メモリ１１上のマッピングアドレスが格納される領域を確保する。
【００７９】
尚、各変数が保持属性であるか否かについては、上記ユーザ設定情報を参照することで判定できる。また、尚、ユーザアプリケーション２２の各変数のうち、どの変数がＦＢの内部変数であるかを示す情報も（特に図示・説明しないが）、予め作成されて記憶されている。
【００８０】
更に、ＦＢの実行オブジェクト（実行コード）生成の際には、変数をアクセスする命令をコンパイルする場合に、非保持属性変数の場合には揮発性メモリ１２上の割当アドレスにアクセスする実行オブジェクト（図４（ｂ）の（β）等）を生成し、保持属性変数の場合には揮発性メモリ１２上の割当アドレスを元に不揮発性メモリ１１上の割当アドレスに間接アクセスする実行オブジェクト（図４（ｂ）の（α）等）を生成する。
【００８１】
以上のコンパイラ２１の処理によって生成された上記実行オブジェクトと上記インスタンス初期値情報２４は、ＰＬＣ１０にダウンロードされる。
ＰＬＣ１０は、ダウンロードされた実行オブジェクト２３とインスタンス初期値情報２４を、自己の記憶装置（フラッシュメモリ等）に記憶する。ＰＬＣ１０は、例えばアプリケーション／電源起動時等に、上記インスタンス初期値情報２４に従い、保持属性変数に関しては、不揮発性メモリ１１上の割当アドレス情報を、揮発性メモリ１２上の割当領域に展開（格納）する機能を有する。
【００８２】
上述したことは、換言すれば、例えば下記のようになる。
コンパイラ２１は、ユーザアプリケーション２２の各ＦＢをインスタンス化する際に、非保持属性の変数は揮発性メモリ１２に割当て、保持属性の変数に関しては不揮発性メモリ１１にその実態を割当て、割当てられた実態へのアクセスポインタを揮発性メモリ１２に配置されたＦＢインスタンスにまとめて割当てておく。
【００８３】
ＦＢインスタンス領域を、基本的に揮発性メモリ１２に配置するが、保持属性変数に関しては実質的に不揮発性メモリ１１に配置する。これによって、ＰＬＣ１０側での動作時に、保持属性変数の場合のみ不揮発性メモリ１１にアクセスし、非保持属性変数の場合には不揮発性メモリ１１にアクセスせずに済むので、ユーザアプリケーションの実行速度向上を実現することができる。
【００８４】
上述した本手法によれば、ＦＢ変数アドレス割当は、例えば図３に示すようになる。これは、全体的な変数割当領域は従来より多くなるかもしれないが、不揮発性メモリ１１における変数割当領域は、従来より大幅に減少させることができる。つまり、従来では、図３の図上左側に示す内容が不揮発性メモリ１１における変数割当結果と見做せる。つまり、全変数が不揮発性メモリ１１に割り当てられることになる。これに対して本手法では、図３の図上右側に示すように、不揮発性メモリ１１へのメモリ割当が行われるのは保持属性変数のみとなる。よって、不揮発性メモリ１１において必要な記憶容量が少なくて済むと共に、不揮発性メモリ１１へのアクセス頻度が大幅に減少する（保持属性変数に係るアクセスのみとなる）。
【００８５】
上記効果に関しては、特に構造化設計を用いた大規模ＰＬＣプログラム等のようなユーザＦＢを多用するプログラミングの場合には、特に顕著な効果を奏する。すなわち、インスタンスサイズが大きくなっても、揮発性メモリに比べてデータのアクセス速度が遅い不揮発性メモリへアクセスする回数（頻度）が従来より少なくなり、ユーザアプリケーションの実行速度を速くし、使い勝手の向上を図ることができるとともにコストをかけずに大容量の領域を提供できる。
【符号の説明】
【００８６】
１０  ＰＬＣ
１１  不揮発性メモリ
１２  揮発性メモリ
１３  システム処理部
２０  支援装置
２１  コンパイラ
２１ａ  実行オブジェクト生成機能部
２１ｂ  ＦＢインスタンスマッピング処理部
２２  ユーザアプリケーション
２３  実行オブジェクト
２４  インスタンス初期値情報
３１  揮発性メモリのインスタンスアドレス
３２  不揮発性メモリのインスタンスアドレス
【図１】
2014099066.tif 000003
【図２】
2014099066.tif 000004
【図３】
2014099066.tif 000005
【図４】
2014099066.tif 000006
【図５】
2014099066.tif 000007
【図６】
2014099066.tif 000008
【図７】
2014099066.tif 000009