以下に、本発明の実施の形態にかかるコンパイラおよびプログラミング支援装置を図面に基づいて詳細に説明する。なお、これらの実施の形態によりこの発明が限定されるものではない。
実施の形態1.
図1は、本発明の実施の形態1にかかるプログラミング装置の構成を示すブロック図である。プログラミング支援装置であるプログラミング装置10Xは、シーケンスプログラム群35Xに含まれるシーケンスプログラムの作成を支援するコンピュータである。プログラミング装置10Xは、コンパイラ11Xを用いて、シーケンスプログラム群35Xに含まれるシーケンスプログラムをコンパイルする。
プログラミング装置10Xは、制御装置であるPLC20に接続されている。プログラミング装置10Xは、シーケンスプログラム群35Xおよびグローバル変数群36Xを作成する機能と、シーケンスプログラム群35Xに含まれるシーケンスプログラムを編集する機能と、グローバル変数群36Xに含まれるグローバル変数の宣言を編集する機能とを有している。また、プログラミング装置10Xは、シーケンスプログラム群35Xおよびグローバル変数群36XをコンパイルすることによってPLC20で実行可能な実行プログラム31を生成する機能を有している。なお、本実施の形態におけるグローバル変数の編集は、グローバル変数の値を変更する処理ではなく、グローバル変数の宣言の編集である。グローバル変数を宣言する情報には、後述するデータ型または属性などが含まれている。
プログラミング装置10Xは、コンパイラ11Xと、編集装置30と、通信部32と、プログラム格納部310とを備えている。編集装置30は、ユーザからの指示に従って、シーケンスプログラム群35Xおよびグローバル変数群36Xを作成し、ユーザからの指示に従って、シーケンスプログラム群35Xおよびグローバル変数群36Xを編集する。編集装置30は、作成または編集された、シーケンスプログラム群35Xおよびグローバル変数群36Xを記憶しておく。なお、編集装置30は、プログラミング装置10Xから独立した構成としてもよい。この場合、編集装置30は、プログラミング装置10Xに接続される。
シーケンスプログラム群35Xには、シーケンスプログラムP,Qのように複数のシーケンスプログラムが含まれている。また、グローバル変数群36Xは、シーケンスプログラム群35Xで使用されるグローバル変数の集合である。グローバル変数群36Xには、後述するgVar1〜gVar4のように複数のグローバル変数が含まれている。グローバル変数群36X内の各グローバル変数は、大域的なスコープを持つ変数であり、シーケンスプログラム群35X内の複数のシーケンスプログラムによって参照可能となっている。したがって、グローバル変数群36X内の各グローバル変数は、PLC20内に書き込まれた複数の実行プログラム31から参照可能である。
シーケンスプログラム群35Xのプログラミング言語仕様は、例えば、国際電気標準会議によりIEC(International Electrotechnical Commission)61131-3として規格化されており、シーケンスプログラム群35Xは、データを保持する変数を使用することが可能である。シーケンスプログラム群35Xを記述するプログラミング言語としては、例えばIEC61131-3規格では、インストラクションリスト、ストラクチャードテキスト、ラダーダイアグラム、ファンクションブロックダイアグラム、シーケンシャルファンクションチャートが規定されているが、本実施の形態においてはこれらに限定されない。
コンパイラ11Xは、PLC20で実行可能な実行プログラム31を生成するプログラムである。コンパイラ11Xは、シーケンスプログラム群35Xおよびグローバル変数群36Xをコンパイルすることによって、シーケンスプログラム群35Xおよびグローバル変数群36Xを実行プログラム31に変換する。コンパイラ11Xは、シーケンスプログラム群35Xに含まれる一部のシーケンスプログラムのみを、コンパイルすることもできる。
コンパイラ11Xは、参照関係管理部12と、メモリ割付部14と、プログラム選択部17と、実行プログラム生成部16とを備えている。参照関係管理部12は、シーケンスプログラムとグローバル変数との参照関係を管理する。参照関係管理部12は、シーケンスプログラムとグローバル変数との参照関係を示す参照関係情報13を作成する。具体的には、参照関係管理部12は、シーケンスプログラム群35Xに含まれる全てのシーケンスプログラムと、グローバル変数群36Xに含まれる全てのグローバル変数との間の参照関係を参照関係情報13に登録する。
参照関係管理部12は、シーケンスプログラム群35Xまたはグローバル変数群36Xが編集されて、シーケンスプログラム群35Xに含まれるシーケンスプログラムとグローバル変数群36Xに含まれるグローバル変数との参照関係が変更された場合には、参照関係情報13を更新する。
参照関係情報13には、何れのシーケンスプログラムおよびグローバル変数が変更または追加されたことを示す変更有無情報が付加されている。また、参照関係情報13には、シーケンスプログラムおよびグローバル変数の変更内容を示す変更内容情報が付加されている。変更内容情報は、例えば、グローバル変数と、グローバル変数の変更後の属性とが対応付けされた情報である。属性に関しては後述する。参照関係管理部12は、コンパイルの完了したシーケンスプログラムおよびグローバル変数に対しては、参照関係情報13内から変更有無情報および変更内容情報を削除する。
メモリ割付部14は、グローバル変数群36Xに含まれている全てのグローバル変数に対し、参照関係情報13に基づいて、PLC20のデータメモリ24または不揮発性データメモリ25への割付けを実行し、割付けの結果であるメモリ割付情報15を作成する。割付けの結果は、データメモリ24または不揮発性データメモリ25のメモリアドレスである。したがって、メモリ割付部14は、データメモリ24または不揮発性データメモリ25のメモリアドレスをメモリ割付情報15に登録する。このように、メモリ割付部14は、グローバル変数にメモリアドレスを設定してメモリ割付情報15に登録する。
メモリ割付部14は、グローバル変数群36Xが編集されて、グローバル変数に割付けられるメモリアドレスが変化した場合には、参照関係情報13に基づいてメモリ割付情報15を更新する。メモリ割付部14は、例えば、グローバル変数の属性に許容されるメモリアドレスを設定する。
プログラム選択部17は、参照関係情報13に付加されている変更有無情報に基づいて、シーケンスプログラム群35X内からコンパイル対象とするシーケンスプログラムを選択する。なお、コンパイル対象とするシーケンスプログラムは、編集装置30がユーザからの指示に従って選択してもよい。
プログラム選択部17は、シーケンスプログラム群35Xが最初に作成された際には、シーケンスプログラム群35Xに含まれる全てのシーケンスプログラムをコンパイル対象として選択する。
実行プログラム生成部16は、メモリ割付情報15と、プログラム選択部17によってシーケンスプログラム群35X内から選択されたシーケンスプログラムとを用いて、PLC20にて動作させる実行プログラム31を生成する。実行プログラム31は、PLC20が解釈および実行可能な命令列である実行コードによって構成される。なお、実行プログラム31の命令列は、PLC20のアーキテクチャに応じたものであれば、何れの形式の命令列であってもよい。
実行プログラム生成部16は、作成した実行プログラム31をプログラム格納部310に格納する。プログラム格納部310は、実行プログラム31を記憶するメモリである。通信部32は、実行プログラム生成部16が生成した実行プログラム31を、PLC20に送信する。
PLC20は、プログラミング装置10Xで生成された実行プログラム31を用いてシーケンス制御を実行する。PLC20は、プログラムメモリ21と、通信部22と、プログラム実行部23と、データメモリ24と、不揮発性データメモリ25とを備えている。データメモリ24および不揮発性データメモリ25は、グローバル変数を含む実行プログラム31が参照する変数を記憶するメモリである。データメモリ24は、揮発性のメモリであり、不揮発性データメモリ25は、不揮発性のメモリである。
通信部22は、プログラミング装置10Xの通信部32から送信されてきた実行プログラム31を受信し、プログラムメモリ21に格納する。プログラムメモリ21は、実行プログラム31を記憶するメモリである。
プログラム実行部23は、プログラムメモリ21から実行プログラム31を読み出し、実行プログラム31を構成する命令を実行する。データメモリ24は、シーケンスプログラム群35Xで使用されるグローバル変数のうち、停電保持属性のないものが割付けられるメモリである。不揮発性データメモリ25は、シーケンスプログラム群35Xで使用されるグローバル変数のうち、停電保持属性のあるものが割付けられる不揮発性のメモリである。停電保持属性は、停電が発生した際にも消えることなくデータを保持させることを指定するための属性である。したがって、停電保持属性が設定されているグローバル変数は、停電が発生した際にも消えることなくデータを保持するグローバル変数である。停電保持属性があるグローバル変数とは、例えばIEC61131-3規格におけるRETAIN属性を持つグローバル変数であるが、停電保持属性の表現はRETAIN属性に限定されるものではない。
ここで、実行プログラム31に含まれる、データメモリ24および不揮発性データメモリ25を参照するためのメモリアクセス命令を、以下のように表現することとする。
write(X,Ax):「X」の値を、メモリアドレスAxの領域に書き込む。
read(Ay,Y):メモリアドレスAyの領域の値を読み出して「Y」の領域に書き込む。
このように、「X」は、writeの命令(書き込み命令)によってメモリアドレスAxの領域に書き込まれる値を示し、「Y」は、readの命令(読み出し命令)によってメモリアドレスAyの領域から読み出された値が書き込まれる領域を示す。ここで、「X」および「Y」は、PLC20のアーキテクチャに応じたものであれば、何れの形式で示される値であってもよい。
データメモリ24への参照は、メモリアドレスAxまたはメモリアドレスAyがデータメモリ24のメモリアドレス範囲である場合のwrite命令または、read命令の実行によって実現される。また、不揮発性データメモリ25への参照は、メモリアドレスAxまたはメモリアドレスAyが不揮発性データメモリ25のメモリアドレス範囲である場合のwrite命令またはread命令の実行によって実現される。ここで、メモリアドレスAxおよびメモリアドレスAyは、PLC20のアーキテクチャに応じたものであれば、何れの形式のメモリアドレスであってもよい。
つぎに、プログラミング装置10Xの動作手順について説明する。図2は、実施の形態1にかかるプログラミング装置の動作手順の概略を示すフローチャートである。プログラミング装置10Xでは、ユーザからの指示に従って、編集装置30がシーケンスプログラム群35Xおよびグローバル変数群36Xを作成する(ステップS10)。コンパイラ11Xでは、参照関係管理部12がシーケンスプログラム群35X内のシーケンスプログラムとグローバル変数群36X内のグローバル変数との参照関係を示す参照関係情報13を作成する。また、メモリ割付部14が、グローバル変数群36Xのグローバル変数にメモリアドレスを割付ける。さらに、メモリ割付部14が、グローバル変数に割付けたメモリアドレスと、参照関係情報13とに基づいて、メモリ割付情報15を作成する(ステップS20)。
実行プログラム生成部16は、シーケンスプログラム群35Xに含まれる全てのシーケンスプログラムに対して実行プログラム31を生成する(ステップS30)。具体的には、実行プログラム生成部16は、作成されたシーケンスプログラム群35Xおよびグローバル変数群36Xを用いて、実行プログラム31を生成する。そして、通信部32が、生成された実行プログラム31をPLC20に送信する(ステップS40)。これにより、PLC20は、実行プログラム31を実行することが可能となる。
この後、プログラミング装置10Xでは、ユーザからの指示に従って、編集装置30がグローバル変数群36Xの一部およびシーケンスプログラム群35Xの一部を編集する。すなわち、編集装置30は、ユーザからの指示に従って、シーケンスプログラムおよびグローバル変数の宣言の編集を行う(ステップS50)。ここでは、グローバル変数群36Xのうちの一部のグローバル変数が編集されて、データメモリ24または不揮発性データメモリ25へのメモリアドレスの割付先が変更される場合について説明する。本実施の形態では、グローバル変数が、gVar1、gVar2、gVar3、gVar4を含んでおり、これらのうちのgVar1の属性などが編集によって変更され、gVar2、gVar3、gVar4は変更されないものとする。また、本実施の形態では、シーケンスプログラム群35XがシーケンスプログラムP,Qであり、gVar1の編集と同時にシーケンスプログラムPが編集されてgVar1の書き込み先および読出し元のメモリアドレスが変更され、シーケンスプログラムQは変更されないものとする。
gVar1およびシーケンスプログラムPが編集された後、参照関係管理部12は、参照関係情報13を更新し、メモリ割付部14は、メモリ割付情報15を更新する(ステップS60)。具体的には、参照関係管理部12は、参照関係情報13内の変更有無情報および変更内容情報を更新する。また、メモリ割付部14は、参照関係情報13に基づいて、メモリ割付情報15内のシーケンスプログラムPのgVar1に対し、参照先のメモリアドレスを新たに割付ける。
プログラム選択部17は、参照関係情報13に基づいて、シーケンスプログラム群35X内からコンパイル対象とするシーケンスプログラムPを選択する。プログラム選択部17が選択するシーケンスプログラムPは、割付先のメモリアドレスが変更されたグローバル変数を参照するシーケンスプログラムである。したがって、実行プログラム生成部16は、割付先のメモリアドレスが変更されたグローバル変数を参照するシーケンスプログラムに対して、実行プログラムを生成する(ステップS70)。以下では、シーケンスプログラムPを用いて生成された実行プログラムを実行プログラムEPという。このように、本実施の形態の実行プログラム生成部16は、複数のシーケンスプログラムP,Qを含んだシーケンスプログラム群35Xのうち、参照するグローバル変数の割付先のメモリアドレスが変更されたシーケンスプログラムPに対してのみコンパイルを行う。そして、通信部32が、生成された実行プログラムEPをPLC20に送信する(ステップS80)。これにより、PLC20は、実行プログラムEPに対応する古い実行プログラム31を、受信した実行プログラムEPで置き換える。
つぎに、プログラミング装置10Xが実行する具体的な処理について説明する。図3は、実施の形態1にかかるグローバル変数の宣言を説明するための図である。図3では、IEC61131-3規格におけるグローバル変数の宣言方法に従ったグローバル変数の宣言例を示している。グローバル変数宣言361は、プログラミング装置10Xにおけるグローバル変数群36Xに相当する。ここでは、INT型のグローバル変数としてgVar1が宣言され、初期値が10.0のREAL型のグローバル変数としてgVar2が宣言され、停電保持属性を持つINT型のグローバル変数としてgVar3が宣言され、停電保持属性を持つWORD型のグローバル変数としてgVar4が宣言されている場合を示している。データ型である、INT型、REAL型、WORD型は、例えば、グローバル変数のデータサイズ等の意味を示す。本実施の形態では、編集前のグローバル変数と、編集後のグローバル変数とで、データ型が同じであり、グローバル変数に設定可能なデータサイズが編集前後で同じである場合について説明する。なお、本実施の形態におけるグローバル変数の宣言方法は、図3の形式に限定されるものではない。
図4は、図3のグローバル変数を参照するシーケンスプログラムの例を示す図である。図4では、IEC61131-3規格におけるストラクチャードテキストで規定されたシーケンスプログラムの例を示している。図4に示すシーケンスプログラム群35Xは、シーケンスプログラム111P,111Qを含んでいる。シーケンスプログラム111Pは、変更前のシーケンスプログラムPの例であり、図4に示すシーケンスプログラム111Qは、変更前のシーケンスプログラムQの例である。
シーケンスプログラム111Pでは、グローバル変数のgVar1に「P1」を書き込み、その後グローバル変数のgVar1の値を「P2」に読み出している。同様に、シーケンスプログラム111Qは、グローバル変数のgVar1に「Q1」を書き込み、その後グローバル変数のgVar1の値を「Q2」に読み出している。なお、図4では、gVar1以外のグローバル変数への参照は省略している。なお、グローバル変数への参照は図4の形式に限定されるものではない。
グローバル変数宣言361内で宣言されているグローバル変数は、メモリ割付部14によってデータメモリ24または不揮発性データメモリ25のメモリアドレスに割付けられ、コンパイルによって実行プログラム31が生成されると、実行プログラム31の実行時に、割付先のメモリアドレスが参照される。ここでは、メモリ割付部14が、グローバル変数宣言361に基づいて、データメモリ24にgVar1およびgVar2を割付け、不揮発性データメモリ25にgVar3およびgVar4を割付ける。
図5は、実施の形態1にかかるメモリ割付情報の更新前の構成を示す図である。図5では、メモリ割付部14が、グローバル変数宣言361に基づいて作成したメモリ割付情報151の構成例を示している。メモリ割付情報151は、メモリ割付情報15の一例である。メモリ割付情報151は、データメモリ24または不揮発性データメモリ25に割付けられたメモリアドレスを保持している。
メモリ割付情報151は、グローバル変数群36X内のグローバル変数と、グローバル変数の割付先のメモリアドレスと、このメモリアドレスを参照するシーケンスプログラムと、の対応関係を示す情報である。
メモリ割付情報151には、グローバル変数の変数名としてgVar1、gVar2、gVar3、gVar4が登録されている。また、メモリ割付情報151では、各グローバル変数に対して、データ型、種類、属性、初期値、メモリアドレス、参照プログラムが対応付けされている。
データ型は、INT型、REAL型、WORD型などのグローバル変数のデータの型を示し、種類は、変数のスコープまたは使用方法を示し、属性は、変数の停電保持または定数といった性質を示す。ここでは、各グローバル変数に、グローバル変数を示すVAR_GLOBALが登録され、停電保持属性を有するグローバル変数に、RETAINが登録されている。初期値は、グローバル変数の初期値である。
メモリアドレスは、グローバル変数に割付けられるメモリアドレスを示し、参照プログラムは、メモリアドレスを参照するシーケンスプログラムを示している。ここでは、メモリアドレスにメモリアドレスAa,Ab,Ac,Adを示す「Aa」、「Ab」、「Ac」、「Ad」が登録されている場合を示している。また、参照プログラムにおける「P」は、シーケンスプログラムPを示し、「Q」は、シーケンスプログラムQを示している。ここでの参照プログラムは、シーケンスプログラム111Pと、シーケンスプログラム111Qである。
ここでは、gVar1は、データメモリ24のメモリアドレスAaに割付けられ、gVar2はデータメモリ24のメモリアドレスAbに割付けられ、gVar3は不揮発性データメモリ25のメモリアドレスAcに割付けられ、gVar4は不揮発性データメモリ25のメモリアドレスAdに割付けられたことを示している。なお、メモリ割付情報15の形式は、図5に示した形式に限定されるものではない。
参照関係情報13では、gVar1、gVar2、gVar3、gVar4が、それぞれシーケンスプログラム111P,111Qから参照されることが示されているものとする。この場合、参照関係情報13を用いて作成されるメモリ割付情報151でも、gVar1、gVar2、gVar3、gVar4が、シーケンスプログラム111Pおよびシーケンスプログラム111Qに参照されていることを示す。
ここで、シーケンスプログラム111P,111Qから生成された実行プログラムと、これらの実行プログラムによって参照されるメモリアドレスとの関係について説明する。図6は、グローバル変数が編集される前の、実施の形態1にかかる、実行プログラムと参照先のメモリアドレスとの関係を示す図である。図6では、編集前のグローバル変数が、データメモリ24または不揮発性データメモリ25に割付けられているイメージを示している。
ここでは、シーケンスプログラム111Pがコンパイルされて生成された実行プログラムEP51と、シーケンスプログラム111Qがコンパイルされて生成された実行プログラムEQ51と、データメモリ24と、不揮発性データメモリ25との関係を示している。
実行プログラムEP51のwriteは、gVar1が割付けられたメモリアドレスAaへの「P1」の書き込みを実行させる命令であり、readは、gVar1が割付けられたメモリアドレスAaの値を読み出して「P2」への書き込みを実行させる命令である。これらは、それぞれ実行プログラムEP51のソースプログラムであるシーケンスプログラム111Pにおける、gVar1への「P1」の書き込みと、gVar1から読み出した値の「P2」への書き込みとを意味している。
同様に、実行プログラムEQ51のwriteは、gVar1が割付けられたメモリアドレスAaへ「Q1」の書き込みを実行させる命令であり、readは、gVar1が割付けられたメモリアドレスAaの値を読み出して「Q2」への書き込みを実行させる命令である。これらは、それぞれ実行プログラムEQ51のソースプログラムであるシーケンスプログラム111Qにおける、gVar1への「Q1」への書き込みと、gVar1から読み出した値の「Q2」への書き込みとを意味している。なお、図6では、gVar1以外のグローバル変数の参照は省略している。
図7は、図3に示したグローバル変数が編集された後の、実施の形態1にかかるグローバル変数宣言の例を説明するための図である。ここでは、図3に示したグローバル変数宣言361に対して、gVar1が停電保持属性を持つよう変更された場合のグローバル変数宣言362を示している。グローバル変数宣言362では、図3にて宣言されていたgVar1が、コメントとして扱われることによって削除され、停電保持属性を持つグローバル変数としてgVar1が宣言されている。
図8は、図4に示したシーケンスプログラムが編集された後のシーケンスプログラムの例を説明するための図である。図8に示すシーケンスプログラム群35Xは、シーケンスプログラム112P,111Qを含んでいる。図8に示すシーケンスプログラム112Pは、変更後のシーケンスプログラムPの例である。
前述のgVar1の編集とともに、図4に示したシーケンスプログラム111Pが、図8に示すシーケンスプログラム112Pに変更されたものとする。すなわち、gVar1に書き込まれる値が「P1」から「P3」に変更され、gVar1の値を読み出して書き込む領域が「P2」から「P4」に変更されたものとする。なお、図8に示すシーケンスプログラム111Qは変更されていない。
図9は、実施の形態1にかかるメモリ割付情報の更新後の構成を示す図である。図9では、メモリ割付部14が、グローバル変数宣言362に基づいて作成したメモリ割付情報152の構成例を示している。メモリ割付情報152は、メモリ割付情報15の一例である。メモリ割付情報152は、グローバル変数宣言361がグローバル変数宣言362に変更されるとともにシーケンスプログラム111Pがシーケンスプログラム112Pに変更された場合に、メモリ割付部14がメモリ割付情報151を更新することによって作成される。したがって、ここでの参照プログラムは、シーケンスプログラム112Pと、シーケンスプログラム111Qである。メモリ割付情報152は、メモリ割付情報151と同様に、データメモリ24または不揮発性データメモリ25に割付けられたメモリアドレスを保持している。
グローバル変数宣言362およびシーケンスプログラム112Pでは、gVar1の箇所が編集されているので、メモリ割付情報152では、メモリ割付情報151と比較して、gVar1に対応する項目が更新されている。ここでは、メモリ割付部14が、gVar1に対して新たにメモリアドレスAeを割り付ける場合について説明する。
gVar1に対応する項目のうち、割付先のメモリアドレスの項目は、gVar1を編集する前のメモリアドレスとgVar1を編集した後のメモリアドレスとが登録されている。具体的には、gVar1に対応するメモリアドレスの箇所には、gVar1を編集する前のメモリアドレスであるメモリアドレスAaと、gVar1を編集した後のメモリアドレスであるメモリアドレスAeとが登録されている。そして、gVar1の参照プログラムの箇所には、gVar1を編集する前のメモリアドレスAaに対応付けされた第1のプログラムであるシーケンスプログラムQと、gVar1を編集した後のメモリアドレスAeに対応付けされた第2のプログラムであるシーケンスプログラムPとが登録されている。
また、メモリ割付情報152では、gVar1においてシーケンスプログラムQに参照されるメモリアドレスAaは、メモリアドレスAeに変更されたことを示す情報が登録される。この情報は、メモリアドレスAaの値とメモリアドレスAeの値とが同期される必要があることを示している。
つぎに、プログラミング装置10Xによる、グローバル変数の割付処理手順について説明する。図10は、実施の形態1にかかるプログラミング装置によるグローバル変数の割付処理手順を示すフローチャートである。
ここでは、メモリ割付部14の動作手順について説明する。メモリ割付部14は、編集後のグローバル変数群36Xにおいてグローバル変数が存在するか否かを判定する(ステップS100)。換言すると、メモリ割付部14は、グローバル変数が宣言されているか否かを判定する。
グローバル変数が存在する場合(ステップS100、Yes)、メモリ割付部14は、メモリアドレスの割付対象となるグローバル変数を取得する(ステップS110)。この処理は、グローバル変数群36Xから、割付対象となるグローバル変数、すなわちコンパイル前に編集されたグローバル変数を取得する処理である。具体的には、メモリ割付部14は、グローバル変数群36Xの中から、編集によってメモリアドレスの新たな割付けが必要となったグローバル変数を取得する。
続いて、メモリ割付部14は、取得したグローバル変数に割付先のメモリアドレスが設定されているか否かを判定する(ステップS120)。メモリアドレスが設定されている場合(ステップS120、Yes)、このメモリアドレスが設定されているグローバル変数は、既存のものである。メモリアドレスの割付対象となるグローバル変数は、既存のグローバル変数に編集が行われたグローバル変数である。このため、メモリ割付部14は、既存の割付先のメモリアドレスを維持したまま新規にメモリアドレスを割付けるため、新規のメモリアドレスを登録するための登録先である登録領域をメモリ割付情報152に作成する(ステップS130)。なお、メモリ割付情報15における登録領域は、メモリ割付情報15に応じたものであれば何れの領域であってもよい。
メモリ割付部14は、新規に作成した登録領域に対して、参照プログラムを登録する(ステップS140)。ここでのメモリ割付部14は、参照関係情報13を参照することで参照プログラムを特定し、特定した参照プログラムをメモリ割付情報152に登録する。
さらに、メモリ割付部14は、コンパイル対象であるグローバル変数の割付先のメモリアドレスを決定し、作成済みの登録領域に対して登録する(ステップS150)。
一方、ステップS120において、メモリアドレスが設定されていない場合(ステップS120、No)、メモリ割付部14が取得したグローバル変数は、初めてメモリアドレスの割付対象となるグローバル変数である。この場合、メモリ割付部14は、割付先のメモリアドレスを決定し、メモリ割付情報152に登録する(ステップS150)。なお、割付先のメモリアドレスの決定方法は、PLC20のアーキテクチャに応じた方法であれば、何れの方法が適用されてもよい。
この後、メモリ割付部14は、グローバル変数群36Xにおいてグローバル変数が残っているか否か、すなわち、割付処理が必要なグローバル変数が存在するか否かを判定する(ステップS100)。
グローバル変数が存在する場合(ステップS100、Yes)、上述したステップS110からS150およびステップS100の処理を繰り返す。一方、グローバル変数が存在しない場合(ステップS100、No)、メモリ割付部14は、割付処理を終了する。すなわち、メモリアドレスの割付が全てのグローバル変数に対して完了した場合、メモリ割付部14は、割付処理を終了する。上述したグローバル変数の割付処理によって、全てのグローバル変数に対して、割付先のメモリアドレスを設定することができる。また、編集が行われたグローバル変数に対しては、割付先となる複数のメモリアドレスを設定することが可能となる。
この図10で説明した処理により、本実施の形態では、メモリ割付情報152のgVar1に対して、メモリアドレスAeと参照プログラムであるシーケンスプログラムPとが登録される。この後、実行プログラム生成部16は、シーケンスプログラム111Pから編集されたシーケンスプログラム112Pに対してメモリ割付情報152を用いて実行プログラムEPを作成する。
ここで、シーケンスプログラム群35Xおよびグローバル変数群36Xが編集された後に生成された実行プログラムと、これらの実行プログラムによって参照されるメモリアドレスとの関係について説明する。図11は、グローバル変数が編集された後の、実施の形態1にかかる、実行プログラムと参照先のメモリアドレスとの関係を示す図である。図11では、編集後のグローバル変数がデータメモリ24または不揮発性データメモリ25に割付けられているイメージを示している。ここでは、シーケンスプログラム112Pがコンパイルされて生成された実行プログラムEP52と、作成済みの実行プログラムEQ51と、データメモリ24と、不揮発性データメモリ25との関係を示している。なお、図11では、gVar1以外のグローバル変数の参照は省略している。
本実施の形態では、シーケンスプログラム111Pが編集されてシーケンスプログラム112Pが作成されているが、シーケンスプログラム111Qは編集されていない。したがって、コンパイルされるのは、シーケンスプログラム112Pであり、シーケンスプログラム111Qはコンパイルする必要がない。
図11において、実行プログラムEP52のwriteは、gVar1が割付けられたメモリアドレスAeへの「P3」の書き込みを実行させる命令であり、readは、gVar1が割付けられたメモリアドレスAeの値を読み出して「P4」への書き込みを実行させる命令である。これらは、それぞれ実行プログラムEP52のソースプログラムであるシーケンスプログラム112Pにおける、gVar1への「P3」の書き込みと、gVar1から読み出した値の「P4」への書き込みとを意味している。実行プログラムEQ51は、編集されていないので、図6で説明したものと同様のものである。
図11に示すように、編集によって更新された実行プログラムEP52が参照するgVar1は、不揮発性データメモリ25内のメモリアドレスAeに割付けられ、編集されていない実行プログラムEQ51が参照するgVar1は、データメモリ24内のメモリアドレスAaへの割付けが維持される。このように、編集前のグローバル変数の割付先を維持したまま、編集後のグローバル変数の割付けが実行される。
コンパイル対象となるシーケンスプログラム112PのgVar1の参照は、gVar1に新規に割付けられる不揮発性データメモリ25内のメモリアドレスAeへの参照として実現される。すなわち、実行プログラムEP52では、gVar1への書き込みはメモリアドレスAeへのwriteとして、gVar1からの読み出しはメモリアドレスAeへのreadとして実行コードが付与される。
また、本実施の形態の実行プログラム生成部16は、新規に割付けられたグローバル変数を参照する命令に対して、変更前のメモリアドレスAaに格納される値と、変更後のメモリアドレスAeに格納される値とを同期させるための命令を挿入する。具体的には、実行プログラム生成部16は、writeの直後およびreadの直前に、copy(Bc,Bd)の命令(コピー命令)を挿入する。
copy(Bc,Bd):メモリアドレスBcの値を、メモリアドレスBdの領域に書き込む。
図11では、BcおよびBdの一方が、Aeであり他方がAaである場合を示している。なお、ここで挿入されるcopyは、直前のwrite、または直後のreadと不可分に動作する命令とする。図11の実行プログラムEP52において、copy(Ae,Aa)の命令は、write(P3,Ae)の直後に挿入される。このcopy(Ae,Aa)が実行されると、不揮発性データメモリ25のメモリアドレスAeに割付けられたgVar1の値がコピーされて、データメモリ24のメモリアドレスAaに割付けられたgVar1に書きまれる(s1)。
同様に、図11の実行プログラムEP52において、copy(Aa,Ae)の命令は、read(Ae,P4)の直前に挿入される。このcopy(Aa,Ae)が実行されると、データメモリ24のメモリアドレスAaに割付けられたgVar1の値がコピーされて、不揮発性データメモリ25のメモリアドレスAeに割付けられたgVar1に書きまれる(s2)。
これにより、シーケンスプログラム112Pで参照されるgVar1の値と、シーケンスプログラム111Qで参照されるgVar1の値とが同じ値となる。この結果、gVar1への編集があった場合でも、編集後の実行プログラムEP52と編集前の実行プログラムEQ51とで同じ値のgVar1を参照することが可能となる。
ここで、実行プログラムEP52の生成処理手順について説明する。図12は、実施の形態1にかかるプログラミング装置による実行プログラムの生成処理手順を示すフローチャートである。
ここでは、実行プログラム生成部16がシーケンスプログラム112Pから実行プログラムEP52を生成する処理について説明する。実行プログラム生成部16は、コンパイル対象のシーケンスプログラム112Pに対し、特定単位毎にステップS200からS280の処理を実行する。ここで、シーケンスプログラム112Pの特定単位は、シーケンスプログラム112Pを記述するプログラミング言語に応じたものであれば、何れの単位であってもよい。特定単位の例は、シーケンスプログラム112Pの1行である。
実行プログラム生成部16は、シーケンスプログラム112Pの特定単位に対して、PLC20で実行可能な実行コードを生成する(ステップS200)。この実行コードを生成する際にグローバル変数が現れた場合、実行プログラム生成部16は、割付先であるメモリアドレスを任意の値にしておく。
続いて、実行プログラム生成部16は、コンパイル対象の特定単位がグローバル変数を含むか否かを判定する(ステップS210)。具体的には、実行プログラム生成部16は、ステップS200で用いられた特定単位がグローバル変数を含むか否かを判定する。
コンパイル対象がグローバル変数を含む場合(ステップS210、Yes)、実行プログラム生成部16は、コンパイル対象の参照プログラムに合致するメモリアドレスを取得して実行コードを決定する(ステップS220)。ここでの、実行プログラム生成部16は、メモリ割付情報152に基づいて、コンパイル対象となるgVar1の割付先のメモリアドレスAa,Aeのうち、コンパイル対象となるシーケンスプログラムPに対応付けされているメモリアドレスAeを取得する。換言すると、実行プログラム生成部16は、コンパイル対象となるグローバル変数に割付けられたメモリアドレスの中から、コンパイル対象となる参照プログラムが対応付けされているものを取得する。そして、実行プログラム生成部16は、ステップS200で任意の値としていたグローバル変数の割付先のメモリアドレスを、取得したメモリアドレスに置き換えるとともに、置き換えたメモリアドレスに対応する実行コードを決定する。これにより、グローバル変数が複数のメモリアドレスに割付けられていた場合であっても、コンパイル対象のシーケンスプログラムが参照するメモリアドレスを設定できる。
続いて、実行プログラム生成部16は、コンパイル対象のグローバル変数に、複数のメモリアドレスが割付けられているか否かを判定する(ステップS230)。メモリアドレスAa,Aeのように複数のメモリアドレスが割付けられている場合(ステップS230、Yes)、メモリアドレスAa,Ae間で同じ値を格納するために、実行プログラム生成部16は、実行プログラムEP52内にcopyの命令を作成する。
実行プログラム生成部16は、実行プログラムEP52内に生成済みの命令がwriteであるか否かを判定する(ステップS240)。実行プログラムEP52内に生成済みの命令がwriteの場合(ステップS240、Yes)、実行プログラム生成部16は、writeの直後にcopyを挿入する(ステップS250)。ここで、実行プログラム生成部16は、copyによる値の取得元のメモリアドレスをステップS220で取得したメモリアドレスAeとし、copyによる値の書き込み先のメモリアドレスをメモリ割付情報152に基づいて設定する。このとき、実行プログラム生成部16は、ステップS230で複数のメモリアドレスが割付けられていると判定されたメモリアドレスAa,Aeのうち、ステップS220で取得されたメモリアドレスAe以外のメモリアドレスAaを、copyによる値の書き込み先に設定する。このようにメモリアドレスが複数存在する場合、実行プログラム生成部16は、メモリアドレスの数だけ実行プログラムEP52内にcopyを挿入する。
実行プログラムEP52内に生成済みの命令がwriteでない場合(ステップS240、No)、実行プログラム生成部16は、実行プログラムEP52内に生成済みの命令がreadであるか否かを判定する(ステップS260)。実行プログラムEP52内に生成済みの命令がreadの場合(ステップS260、Yes)、実行プログラム生成部16は、readの直前にcopyを挿入する(ステップS270)。
ここで、実行プログラム生成部16は、ステップS250と同様の方法によって、copyによる値の取得元のメモリアドレスAaと、copyによる値の書き込み先のメモリアドレスAeとを設定する。実行プログラム生成部16は、ステップS250またはステップS270の処理の後にステップS280の処理を行う。
また、ステップS260において、実行プログラムEP52内に生成済みの命令がreadでない場合(ステップS260、No)、copyの命令は必要がない。この場合、実行プログラム生成部16は、copyの命令を挿入することなく、ステップS280の処理を行う。
また、ステップS230において、複数のメモリアドレスが割付けられていない場合(ステップS230、No)、コンパイル対象のグローバル変数は唯一のメモリアドレスに割り付けられているので、copyの命令は必要がない。この場合、実行プログラム生成部16は、copyの命令を挿入することなく、ステップS280の処理を行う。
また、ステップS210において、コンパイル対象がグローバル変数を含まない場合(ステップS210、No)、実行プログラム生成部16は、copyの命令を挿入することなく、ステップS280の処理を行う。
ステップS250の後、ステップS270の後、ステップS260でNoの場合、ステップS230でNoの場合、またはステップS210でNoの場合、実行プログラム生成部16は、コンパイル対象が残っているか否かを判定する(ステップS280)。実行プログラム生成部16は、シーケンスプログラム112Pの特定単位毎にステップS200からS280の処理を繰り返すので、コンパイル対象となる特定単位がシーケンスプログラム112P内に残っているか否かを判定する。すなわち、実行プログラム生成部16は、コンパイル対象のうち、ステップS200からS280の処理を行っていない特定単位が存在するか否かを判定する。
コンパイル対象が残っている場合(ステップS280、Yes)、実行プログラム生成部16は、残っているコンパイル対象の中の特定単位に対してステップS200からS280の処理を繰り返す。コンパイル対象が残っていない場合(ステップS280、No)、実行プログラム生成部16は、実行プログラムEP52の生成処理を終了する。
このように、実行プログラム生成部16は、複数のメモリアドレスにて保持される値をcopyによってメモリアドレス間で同期させるので、複数のシーケンスプログラム112P,111Qが参照するグローバル変数の値を唯一の値とすることができる。
複数のメモリアドレスにて保持される値をcopyによってメモリアドレス間で同期させない場合、グローバル変数が更新されると、グローバル変数が割付けられるメモリアドレスが変更されるので、グローバル変数を参照しているシーケンスプログラムの全てをコンパイルする必要がある。
特に、シーケンスプログラムの個数が多い大規模システムでは、特定のグローバル変数が編集された場合、コンパイルの対象およびPLCへの書き込み対象は、グローバル変数を参照している全てのシーケンスプログラムとなる。このため、大規模システムでは、コンパイルおよびPLCへの書き込みに要する時間が長くなる。
また、シーケンスプログラムを用いるシステムにおいては、PLCによって制御される装置を立ち上げる際の動作調整またはデバッグのため、コンパイルおよびPLCへの書き込みが頻繁に繰り返される。このため、デバッグまたは調整の際にもコンパイルおよびPLCへの書き込み時間が長くなる。
これに対し、本実施の形態のプログラミング装置10Xは、コンパイル対象を、割付先のメモリアドレスが変更されたシーケンスプログラム112Pに限定することができる。なお、本実施の形態では、copyをwriteの直後に挿入することによって複数の命令でグローバル変数の同期を行う場合について説明したが、copyおよびwriteの代わりに、copyおよびwriteを実行させるための単一の命令を挿入してもよい。同様に、本実施の形態では、copyをreadの直前に挿入することによって複数の命令でグローバル変数の同期を行う場合について説明したが、readおよびcopyの代わりに、readおよびcopyを実行させるための単一の命令を挿入してもよい。このように、プログラミング装置10Xは、実行コードを単一の命令で構成してもよいし、複数の命令で構成してもよい。
このように、実施の形態1では、グローバル変数の宣言の編集前後で、グローバル変数に割付けられるメモリアドレスが変化した場合、編集前からの割付先であるメモリアドレスAaで保持する値と、編集後の割付先であるメモリアドレスAeで保持する値とを、copyの命令にて同期させている。これにより、グローバル変数が編集される前のメモリアドレスAaへ割付けられている未編集のシーケンスプログラム111Qをコンパイル対象から除外できる。したがって、シーケンスプログラムのコンパイルの処理時間を抑制することができる。
また、PLC20は、未編集のシーケンスプログラム111Qに対応する実行プログラムEQ51をそのまま用いてシーケンス制御を実行することができる。したがって、実行プログラムEP52をPLC20に書き込む際に、実行プログラムEQ51のPLC20への書き込みを省略することができる。
実施の形態2.
つぎに、図13から図15を用いてこの発明の実施の形態2について説明する。実施の形態2では、ユーザによって設定されたコンパイル方法で、シーケンスプログラムをコンパイルする。また、特定のコンパイル方法が選択された場合には、編集の前後でグローバル変数に設定可能なデータサイズが異なる場合であっても、データ型変換を実行する命令を用いて、実施の形態1のようにグローバル変数を複数のメモリアドレスに割付ける。
図13は、実施の形態2にかかるプログラミング装置の構成を示すブロック図である。図13の各構成要素のうち図1に示す実施の形態1のプログラミング装置10Xと同一機能を達成する構成要素については同一符号を付しており、重複する説明は省略する。
プログラミング支援装置であるプログラミング装置10Yは、プログラミング装置10Xと比較して、コンパイルオプション41に基づいて、コンパイル方法を選択するコンパイルオプション判定部18を備える点が異なる。具体的には、プログラミング装置10Yは、コンパイラ11Yと、編集装置30と、通信部32と、プログラム格納部310とを備えている。コンパイラ11Yは、コンパイラ11Xの構成要素に加えて、コンパイルオプション判定部18を備えている。
コンパイルオプション41は、コンパイルの方法を選択するための情報である。コンパイルオプション41では、第1のオプションと第2のオプションとの何れかが設定されている。第1のオプションは、各グローバル変数に唯一のメモリアドレスを割付けるコンパイル方法を示す値で示され、第2のオプションは、各グローバル変数に複数のメモリアドレスを割付けるコンパイル方法を示す値で示される。したがって、コンパイルオプション41には、予めユーザが第1のオプションを示す値または第2のオプションを示す値を格納しておく。
第1のオプションによるコンパイルでは、各グローバル変数に唯一のメモリアドレスが割付けられるので、割付先のメモリアドレスが変更された全てのシーケンスプログラムがコンパイル対象となる。
第2のオプションによるコンパイルでは、実施の形態1と同様に、グローバル変数を複数のメモリアドレスに割付可能とし、コンパイル対象となるシーケンスプログラムを限定する。なお、複数のメモリアドレスに割付けられているグローバル変数の値は、これを参照するシーケンスプログラム間で一致しない場合があるものとする。
コンパイルオプション判定部18は、コンパイルオプション41に基づいて、第1のオプションで指定された方法でコンパイルを実行するか、第2のオプションで指定された方法でコンパイルを実行するかを判定する。コンパイルオプション判定部18は、判定結果として、第1のオプションを指定した第1の指示情報または第2のオプションを指定した第2の指示情報を、メモリ割付部14、プログラム選択部17、および実行プログラム生成部16に送信する。
メモリ割付部14、プログラム選択部17、および実行プログラム生成部16は、コンパイルオプション判定部18からの第1の指示情報または第2の指示情報に従って処理を実行する。具体的には、メモリ割付部14は、コンパイルオプション判定部18から第1の指示情報を受信すると、各グローバル変数に唯一のメモリアドレスを割付ける。また、メモリ割付部14は、コンパイルオプション判定部18から第2の指示情報を受信すると、実施の形態1と同様の方法によってグローバル変数にメモリアドレスを割付ける。
また、プログラム選択部17は、コンパイルオプション判定部18から第1の指示情報を受信すると、割付先のメモリアドレスが変更されたグローバル変数を参照する全てのシーケンスプログラムを選択する。また、プログラム選択部17は、コンパイルオプション判定部18から第2の指示情報を受信すると、実施の形態1と同様の方法によってシーケンスプログラムを選択する。
また、実行プログラム生成部16は、コンパイルオプション判定部18から第1の指示情報を受信すると、割付先のメモリアドレスが変更されたグローバル変数を参照する全てのシーケンスプログラムにコンパイルを実行する。
また、実行プログラム生成部16は、コンパイルオプション判定部18から第2の指示情報を受信すると、実施の形態1と同様の方法によってシーケンスプログラムをコンパイルする。
実行プログラム生成部16は、第1のオプションの場合、実施の形態1におけるcopyを挿入しない実行プログラムを生成し、第2のオプションの場合、実施の形態1で生成したcopyの命令の代わりに、データ型変換を実行させる命令を生成する。
図14は、図3に示したグローバル変数が編集された後の、実施の形態2にかかるグローバル変数宣言の例を説明するための図である。ここでは、図3に示したグローバル変数宣言361に対し、gVar1のデータ型が変更された場合のグローバル変数宣言363を示している。グローバル変数宣言363では、図3にて宣言されていたgVar1が、コメントとして扱われることによって命令としては削除され、データ型がREAL型であるグローバル変数としてgVar1が宣言されたものとする。IEC61131-3規格では、INT型は16ビット符号付き整数であり、REAL型は32ビット単精度浮動小数点数である。なお、ここで示したデータ型は、一例であり、他のデータ型が適用されてもよい。
各データ型が要求するデータサイズは、IEC61131-3規格のINT型およびREAL型のように、データ型によって異なるので、グローバル変数に割付けるメモリ量はデータ型ごとに異なる。このため、本実施の形態において、グローバル変数がデータ型の編集によって複数の割付先を持つこととなる場合、それぞれの割付先のデータサイズが異なる場合がある。
この場合、実施の形態1で説明したコピーに相当する処理は、適合するデータ型の値を同期することができる処理でなければならない。しかしながら、異なるデータサイズであるデータ型における値のコピーでは、コピー元の値とコピー先の値とは必ずしも一致しない場合がある。例えば、データサイズの大きいデータ型の値をデータサイズの小さいデータ型にコピーする場合、データサイズの小さいデータ型で取りうる範囲の値を越えたものは、データサイズの小さいデータ型に正しくコピーできない。このため、本実施の形態では、第1のオプションを示す値と、第2のオプションを示す値との何れかをコンパイルオプション41に格納しておくことで、ユーザが所望するコンパイル方法でコンパイルを実行する。
ここで、第2のオプションについて詳細に説明する。前述したように、データサイズが異なるデータ型同士では、値のコピーを実行しても必ずしもその値は一致しない場合がある。しかしながら、特定の種類のデータ型、例えば数値を表すデータ型においては、異なるデータ型であっても特定の範囲においては同じ値を表現することができる。本実施の形態では、この点に着目し、グローバル変数がシーケンスプログラム毎に同じ値となることを保証しないことで、実施の形態1と同様に、未編集のシーケンスプログラムをコンパイル対象としないこととする。
図14に示したようにgVar1のデータ型がINT型からREAL型に編集された場合、実行プログラム生成部16は、図11で示した実行プログラムEP52において、writeの直後のcopyの代わりに、REAL型をINT型に変換する以下のREAL2INT(Cc,Cd)の命令を挿入する。
REAL2INT(Cc,Cd):メモリアドレスCcのREAL型の値を、メモリアドレスCdの領域にINT型として書き込む。
同様に、実行プログラム生成部16は、図11で示した実行プログラムEP52において、readの直前のcopyの代わりに、INT型をREAL型に変換する以下のINT2REAL(Cc,Cd)の命令を挿入する。
INT2REAL(Cc,Cd):メモリアドレスCcのINT型の値を、メモリアドレスCdの領域にREAL型として書き込む。
このように、実行プログラム生成部16は、データ型を変換したうえで値を書き込む命令を用いて、編集前からの割付先であるメモリアドレスで保持する値と、編集後の割付先であるメモリアドレスで保持する値とを同期させる。
上述のREAL2INTおよびINT2REALは、PLC20のアーキテクチャに従って、単一の命令または複数の命令から構成された命令群の何れかで実現される。ただし、これらの命令は、REAL2INTの直前のwrite、またはINT2REALの直後のreadと不可分に実行されるものとする。
図15は、グローバル変数が編集された後の、実施の形態2にかかる、実行プログラムと参照先のメモリアドレスとの関係を示す図である。図15では、グローバル変数が、第2のオプションによって、データメモリ24または不揮発性データメモリ25に割付けられているイメージを示している。
本実施の形態も実施の形態1と同様に、シーケンスプログラム111Pが編集されてシーケンスプログラム112Pが作成され、シーケンスプログラム111Qは編集されていないものとする。第2のオプションが用いられる場合、コンパイルされるのは、シーケンスプログラム112Pであり、シーケンスプログラム111Qはコンパイルする必要がない。
図15に示すように、編集によって更新された実行プログラムEP53のgVar1は、データメモリ24内のメモリアドレスAeに割付けられ、編集されていない実行プログラムEQ51のgVar1は、データメモリ24内のメモリアドレスAaへの割付けが維持される。このように、本実施の形態でも実施の形態1と同様に、編集前のグローバル変数の割付先を維持したまま、編集後のグローバル変数の割付けが実行される。
実施の形態1における図11のwriteの直後のcopyは、本実施の形態では、REAL2INTになり、実施の形態1における図11のreadの直前のcopyは、本実施の形態では、INT2REALとなる。
REAL2INTにより、実行プログラムEP53が参照するメモリアドレスAeにwriteにてREAL型として書き込まれる値は、実行プログラムEQ51が参照するメモリアドレスAaにINT型として同期される(s3)。すなわち、REAL2INTにより、メモリアドレスAeの値がコピーされたうえでデータ型が変換されてメモリアドレスAaに書き込まれる。
また、INT2REALにより、実行プログラムEQ51が参照するメモリアドレスAaにreadにてINT型として読み出される値は、実行プログラムEP53が参照するメモリアドレスAeにREAL型として同期される(s4)。すなわち、INT2REALにより、メモリアドレスAaの値がコピーされたうえでデータ型が変換されてメモリアドレスAeに書き込まれる。
なお、本実施の形態で例示した、データ型変換を実行する命令である、REAL2INTおよびINT2REALは、シーケンスプログラムで使用可能なデータ型およびPLC20のアーキテクチャに応じたものであれば、何れの命令であってもよい。
このように、実施の形態2では、ユーザがコンパイルオプション41によって第1のオプションと第2のオプションとを選択することができる。また、第2のオプションでコンパイルが実行される場合、編集前からの割付先であるメモリアドレスAaで保持する値と、編集後の割付先であるメモリアドレスAeで保持する値とを、データ型変換を実行する命令にて同期させている。これにより、編集の前後でデータ型のデータサイズが異なる場合であっても、編集されていないシーケンスプログラム111Qをコンパイル対象から除外できる。したがって、シーケンスプログラムのコンパイルの処理時間を抑制することができる。
実施の形態3.
つぎに、図16を用いてこの発明の実施の形態3について説明する。実施の形態3では、複数のプログラミング装置がPLC20に接続されている場合に、特定のプログラミング装置が特定のシーケンスプログラムにコンパイルを実行する。
図16は、実施の形態3にかかるプログラミングシステムの構成を示すブロック図である。図16の各構成要素のうち図1に示す実施の形態1のプログラミング装置10Xと同一機能を達成する構成要素については同一符号を付しており、重複する説明は省略する。
プログラミング支援システムであるプログラミングシステム1は、プログラミング装置10A,10Bと、PLC20とを備えている。プログラミング装置10A,10Bは、プログラミング装置10Xと同様の機能を有している。なお、プログラミング装置10A,10Bの少なくとも一方は、プログラミング装置10Yと同様の機能を有した装置であってもよい。プログラミング装置10A,10Bは、PLC20に接続されており、これによりプログラミング装置10A,10BはPLC20を介した情報の送受信を行うことができる。なお、プログラミング装置10A,10Bは、直接接続されてもよいし、PLC20以外の装置を介して接続されてもよい。
プログラミングシステム1では、プログラミング装置10Aが作成したグローバル変数群36Xと、メモリ割付情報15とを、以下の(1−a)または(1−b)の方法でプログラミング装置10Bにコピーする。プログラミング装置10Aからプログラミング装置10Bにコピーされるグローバル変数群36Xの例は、グローバル変数宣言361である。また、プログラミング装置10Aからプログラミング装置10Bにコピーされるメモリ割付情報15には、割付先のメモリアドレスと、参照プログラムを示す情報とが含まれている。また、プログラミング装置10Aは、メモリ割付情報15内に、図5で説明した項目に加えて、メモリ割付情報15がプログラミング装置10Aで作成されたことを示す情報をグローバル変数に対応付けして格納しておく。
(1−a)
プログラミング装置10Aが、グローバル変数群36Xおよびメモリ割付情報15を格納したファイルを、プログラミング装置10Bに送信する。プログラミング装置10Bでは、取得部である通信部32がプログラミング装置10Aからのファイルを受信する。このとき、プログラミング装置10A,10Bは、ネットワーク上でのコピー、メールでの送付等、何れの方法でグローバル変数群36Xおよびメモリ割付情報15を送受信してもよい。
(1−b)
プログラミング装置10Aが、グローバル変数群36Xおよびメモリ割付情報15をPLC20に書き込む。プログラミング装置10Bでは、取得部である通信部32が、プログラミング装置10AによってPLC20に書き込まれたグローバル変数群36Xおよびメモリ割付情報15をPLC20から読み出す。この場合、PLC20は、書き込まれたグローバル変数群36Xおよびメモリ割付情報15がプログラミング装置10Bに読み出された後もグローバル変数群36Xおよびメモリ割付情報15を記憶しておく。
プログラミング装置10Bは、上述の(1−a)または(1−b)の方法によってコピーしたグローバル変数群36Xを用いて、以下の(2−a)または(2−b)の方法でシーケンスプログラムを作成するとともに、グローバル変数宣言361を変更する。
(2−a)
プログラミング装置10Bは、プログラミング装置10Aによって作成されたシーケンスプログラム群35Xの少なくとも一部を編集装置30で更新することによってシーケンスプログラムを作成する。この場合、プログラミング装置10A,10Bは、上述の(1−a)または(1−b)と同様の方法によって、プログラミング装置10Aで作成されたシーケンスプログラム群35Xを、プログラミング装置10Bにコピーする。
(2−b)
プログラミング装置10Bは、編集装置30で新たにシーケンスプログラムを作成する。
プログラミング装置10Bの編集装置30は、(2−a)または(2−b)の方法によって作成したシーケンスプログラムに基づいて、グローバル変数宣言361を変更する。プログラミング装置10Bの実行プログラム生成部16は、(2−a)または(2−b)の方法で作成したシーケンスプログラム、および変更したグローバル変数をコンパイルする。このとき、プログラミング装置10Bの実行プログラム生成部16は、既存のグローバル変数の割付先となっているメモリアドレスに変更があれば、実施の形態1または実施の形態2と同様の方法によってコンパイルを実行する。すなわち、プログラミング装置10Bの実行プログラム生成部16は、元々のメモリアドレスを保持しつつ、新規のメモリアドレスとの間でグローバル変数の値の同期を行う命令を挿入して、実行プログラムEPを生成する。このとき、プログラミング装置10Bのメモリ割付部14は、メモリ割付情報15の更新を行っておく。
プログラミングシステム1では、上述した処理が実行されることにより、プログラミング装置10Aに影響を与えることなく、プログラミング装置10Bによる処理を実行することができる。具体的には、プログラミング装置10Bは、プログラミング装置10Aに影響を与えることなく、シーケンスプログラムの変更または作成などの処理を実行することができる。これにより、プログラミング装置10Aにおいてコンパイルが不要となるので、プログラミングシステム1は、コンパイルの処理時間を抑制することができる。例えば、プログラミング装置10Aおよびプログラミング装置10Bでコンパイルが実行される場合と比べて、プログラミング装置10Bのみでコンパイルが実行される方が、コンパイルの合計時間が短くなる。
プログラミングシステム1の動作例について説明する。図3に示したグローバル変数宣言361が、プログラミング装置10A,10Bの両方にあり、図4に示したシーケンスプログラム111Pがプログラミング装置10Bのみにあり、図4に示したシーケンスプログラム111Qがプログラミング装置10Aのみにある状態を想定する。この状態で、プログラミング装置10Bのみが、グローバル変数宣言361を図7に示したグローバル変数宣言362に変更するとともにシーケンスプログラム111Pを図8に示したシーケンスプログラム112Pに変更する場合がある。この場合において、プログラミング装置10BのみでコンパイルおよびPLC20への書込みを実行し、プログラミング装置10AではコンパイルおよびPLC20への書込みを実行しないことで、PLC20内の状態が、図11のようになる。
このように、実施の形態3では、プログラミング装置10Bは、プログラミング装置10Aに影響を与えることなく、シーケンスプログラムの変更または作成などの処理を実行するので、プログラミング装置10Aでのコンパイルが不要となる。この結果、プログラミングシステム1は、コンパイルの処理時間を抑制することができる。
ここで、プログラミング装置10X,10Yのハードウェア構成について説明する。なお、プログラミング装置10X,10Yは同様のハードウェア構成を有しているので、ここではプログラミング装置10Xのハードウェア構成について説明する。
図17は、実施の形態1から3にかかるプログラミング装置のハードウェア構成例を示す図である。プログラミング装置10Xは、図17に示した制御回路300、すなわちプロセッサ301、メモリ302、通信装置304および入力装置303により実現することができる。
プロセッサ301の例は、CPU(Central Processing Unit、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサ、DSPともいう)またはシステムLSI(Large Scale Integration)である。メモリ302の例は、RAM(Random Access Memory)、またはROM(Read Only Memory)である。入力装置303の例は、キーボード、マウス、またはタッチパネルである。通信装置304は、通信部32の機能を実現する。
プログラミング装置10Xは、プロセッサ301が、メモリ302から、コンパイラ11Xと、編集装置30の動作を実行するための編集プログラムを読み出して実行することにより実現される。コンパイルプログラムであるコンパイラ11Xは、参照関係管理部12、メモリ割付部14、プログラム選択部17、および実行プログラム生成部16の手順または方法をコンピュータに実行させるものであるともいえる。また、編集プログラムは、編集装置30の手順または方法をコンピュータに実行させるものであるともいえる。メモリ302は、プロセッサ301が各種処理を実行する際の一時メモリにも使用される。
プロセッサ301が実行するコンパイラ11Xは、コンパイラ11Xが格納された記録媒体であるコンピュータプログラムプロダクトで実現されてもよい。この場合の記録媒体の例は、コンパイラ11Xが格納された非一時的な(non-transitory)コンピュータ可読媒体である。また、プロセッサ301が実行する編集プログラムは、編集プログラムが格納された記録媒体であるコンピュータプログラムプロダクトで実現されてもよい。この場合の記録媒体の例は、編集プログラムが格納された非一時的なコンピュータ可読媒体である。
なお、プログラミング装置10Xの機能について、一部を専用のハードウェアで実現し、一部をソフトウェアまたはファームウェアで実現するようにしてもよい。
以上の実施の形態に示した構成は、本発明の内容の一例を示すものであり、別の公知の技術と組み合わせることも可能であるし、本発明の要旨を逸脱しない範囲で、構成の一部を省略、変更することも可能である。